aboutsummaryrefslogtreecommitdiff
path: root/src/java/com/android/internal/telephony/analytics/TelephonyAnalyticsUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/java/com/android/internal/telephony/analytics/TelephonyAnalyticsUtil.java')
-rw-r--r--src/java/com/android/internal/telephony/analytics/TelephonyAnalyticsUtil.java187
1 files changed, 187 insertions, 0 deletions
diff --git a/src/java/com/android/internal/telephony/analytics/TelephonyAnalyticsUtil.java b/src/java/com/android/internal/telephony/analytics/TelephonyAnalyticsUtil.java
new file mode 100644
index 0000000000..78b607b279
--- /dev/null
+++ b/src/java/com/android/internal/telephony/analytics/TelephonyAnalyticsUtil.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.telephony.analytics;
+
+import static com.android.internal.telephony.analytics.TelephonyAnalyticsDatabase.DATE_FORMAT;
+
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.SQLException;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.telephony.Rlog;
+
+import java.util.Calendar;
+
+/**
+ * Singleton Utility class to support TelephonyAnalytics Extends SQLiteOpenHelper class. Supports db
+ * related operations which includes creating tables,insertion,updation,deletion. Supports some
+ * generic functionality like getting the Cursor resulting from a query.
+ */
+public class TelephonyAnalyticsUtil extends SQLiteOpenHelper {
+ private static TelephonyAnalyticsUtil sTelephonyAnalyticsUtil;
+ private static final String DATABASE_NAME = "telephony_analytics.db";
+ private static final int DATABASE_VERSION = 10;
+ private static final String TAG = TelephonyAnalyticsUtil.class.getSimpleName();
+ private static final int MAX_ENTRIES_LIMIT = 1000;
+ private static final int CUTOFF_MONTHS = 2;
+
+ private TelephonyAnalyticsUtil(Context context) {
+ super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ }
+
+ /**
+ * Get the instance of the TelephonyAnalyticsUtil class. Instantiates the TelephonyAnalyticsUtil
+ * object sTelephonyAnalyticsUtil only once.
+ *
+ * @return Returns the TelephonyAnalyticsUtil object sTelephonyAnalyticsUtil.
+ */
+ public static synchronized TelephonyAnalyticsUtil getInstance(Context context) {
+ if (sTelephonyAnalyticsUtil == null) {
+ sTelephonyAnalyticsUtil = new TelephonyAnalyticsUtil(context);
+ }
+ return sTelephonyAnalyticsUtil;
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase db) {}
+
+ @Override
+ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
+
+ /**
+ * Uses Util class functionality to create CallTable in db
+ *
+ * @param createTableQuery : CallTable Schema
+ */
+ @VisibleForTesting
+ public synchronized void createTable(String createTableQuery) {
+ try {
+ SQLiteDatabase db = getWritableDatabase();
+ db.execSQL(createTableQuery);
+ } catch (Exception e) {
+ Rlog.e(TAG, "Error during table creation : " + e);
+ }
+ }
+
+ /** Utility function that performs insertion on the given database table */
+ @VisibleForTesting
+ public synchronized void insert(String tableName, ContentValues values) {
+ try {
+ SQLiteDatabase db = getWritableDatabase();
+ db.insert(tableName, null, values);
+ } catch (SQLException e) {
+ Rlog.e(TAG, "error occurred during insertion");
+ }
+ }
+
+ /** Utility function that performs update query on the given database table */
+ @VisibleForTesting
+ public synchronized int update(
+ String table, ContentValues values, String whereClause, String[] whereArgs) {
+ int rowsAffected = -1;
+ try {
+ SQLiteDatabase db = getWritableDatabase();
+ rowsAffected = db.update(table, values, whereClause, whereArgs);
+
+ } catch (SQLException e) {
+ Rlog.e(TAG, "Error during update.");
+ }
+ return rowsAffected;
+ }
+
+ /**
+ * @Return the cursor object obtained from running a query based on given parameters.
+ */
+ @VisibleForTesting
+ public synchronized Cursor getCursor(
+ String tableName,
+ String[] columns,
+ String selection,
+ String[] selectionArgs,
+ String groupBy,
+ String having,
+ String orderBy,
+ String limit) {
+
+ Cursor cursor = null;
+ try {
+ SQLiteDatabase db = getReadableDatabase();
+ cursor =
+ db.query(
+ tableName,
+ columns,
+ selection,
+ selectionArgs,
+ groupBy,
+ having,
+ orderBy,
+ limit);
+ } catch (SQLException e) {
+ Rlog.e(TAG, "Error during querying for getCursor()" + e);
+ }
+ return cursor;
+ }
+
+ /** Returns the count stored in the cursor obtained from query execution. */
+ @VisibleForTesting
+ public synchronized long getCountFromCursor(Cursor cursor) {
+ long count = 0;
+ if (cursor != null && cursor.moveToFirst()) {
+ count = cursor.getInt(0);
+ }
+ return count;
+ }
+
+ /** Deletes Old Data and Overflow data in the db. */
+ @VisibleForTesting
+ public void deleteOverflowAndOldData(
+ String tableName, String overflowWhereClause, String oldDataWhereClause) {
+ deleteOverFlowData(tableName, overflowWhereClause);
+ deleteOldData(tableName, oldDataWhereClause);
+ }
+
+ protected void deleteOverFlowData(String tableName, String whereClause) {
+ String[] whereArgs = {Integer.toString(MAX_ENTRIES_LIMIT)};
+ delete(tableName, whereClause, whereArgs);
+ }
+
+ protected void deleteOldData(String tableName, String whereClause) {
+ String[] whereArgs = {getCutoffDate()};
+ delete(tableName, whereClause, whereArgs);
+ }
+
+ /** Utility function that performs deletion on the database table */
+ @VisibleForTesting
+ public synchronized void delete(String tableName, String whereClause, String[] whereArgs) {
+ try {
+ SQLiteDatabase db = getWritableDatabase();
+ db.delete(tableName, whereClause, whereArgs);
+ } catch (SQLException e) {
+ Rlog.e(TAG, "Sqlite Operation Error during deletion of Overflow data " + e);
+ }
+ }
+
+ private String getCutoffDate() {
+ Calendar cutoffDate = Calendar.getInstance();
+ cutoffDate.add(Calendar.MONTH, -1 * CUTOFF_MONTHS);
+ return DATE_FORMAT.format(cutoffDate.toInstant());
+ }
+}