Loading privacymoduletrackers/build.gradle +2 −2 Original line number Diff line number Diff line Loading @@ -10,7 +10,7 @@ android { targetSdkVersion 30 versionCode 1 versionName "0.6.1" versionName "0.7.0" } buildTypes { Loading @@ -26,7 +26,7 @@ android { } } dependencies{ implementation 'foundation.e:privacymodule.api:1.0.0' implementation 'foundation.e:privacymodule.api:1.1.0' } publishing { Loading privacymoduletrackers/src/main/java/foundation/e/privacymodules/trackers/api/TrackTrackersPrivacyModule.java +17 −0 Original line number Diff line number Diff line Loading @@ -115,6 +115,23 @@ public class TrackTrackersPrivacyModule implements ITrackTrackersPrivacyModule { return statsRepository.getActiveTrackersByPeriod(12, ChronoUnit.MONTHS); } @Override public int getPastDayMostLeakedApp() { return statsRepository.getMostLeakedApp(24, ChronoUnit.HOURS); } @NonNull @Override public Map<Integer, Pair<Integer, Integer>> getPastDayTrackersCallsByApps() { return statsRepository.getCallsByApps(24, ChronoUnit.HOURS); } @NonNull @Override public Pair<Integer, Integer> getPastDayTrackersCallsForApp(int appUid) { return statsRepository.getCalls(appUid, 24, ChronoUnit.HOURS); } @Override public void addListener(ITrackTrackersPrivacyModule.Listener listener) { mListeners.add(listener); Loading privacymoduletrackers/src/main/java/foundation/e/privacymodules/trackers/data/StatsDatabase.java +125 −20 Original line number Diff line number Diff line Loading @@ -86,6 +86,11 @@ public class StatsDatabase extends SQLiteOpenHelper { AppTrackerEntry.COLUMN_NAME_NUMBER_CONTACTED + " INTEGER," + AppTrackerEntry.COLUMN_NAME_NUMBER_BLOCKED + " INTEGER)"; private static final String PROJECTION_NAME_PERIOD = "period"; private static final String PROJECTION_NAME_CONTACTED_SUM = "contactedsum"; private static final String PROJECTION_NAME_BLOCKED_SUM = "blockedsum"; private static final String PROJECTION_NAME_LEAKED_SUM = "leakedsum"; private static final String PROJECTION_NAME_TRACKERS_COUNT = "trackerscount"; private HashMap<String, Pair<Integer, Integer>> getCallsByPeriod( int periodsCount, Loading @@ -95,32 +100,28 @@ public class StatsDatabase extends SQLiteOpenHelper { synchronized (lock) { long minTimestamp = getPeriodStartTs(periodsCount, periodUnit); String projectionNamePeriod = "period"; String projectionNameContactedSum = "contactedsum"; String projectionNameBlockedSum = "blockedsum"; SQLiteDatabase db = getReadableDatabase(); String selection = AppTrackerEntry.COLUMN_NAME_TIMESTAMP + " >= ?"; String[] selectionArg = new String[]{"" + minTimestamp}; String projection = AppTrackerEntry.COLUMN_NAME_TIMESTAMP + ", " + "STRFTIME('" + sqlitePeriodFormat + "', DATETIME(" + AppTrackerEntry.COLUMN_NAME_TIMESTAMP + ", 'unixepoch', 'localtime')) " + projectionNamePeriod + "," + "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_CONTACTED + ") " + projectionNameContactedSum + "," + "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_BLOCKED + ") " + projectionNameBlockedSum; "STRFTIME('" + sqlitePeriodFormat + "', DATETIME(" + AppTrackerEntry.COLUMN_NAME_TIMESTAMP + ", 'unixepoch', 'localtime')) " + PROJECTION_NAME_PERIOD + "," + "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_CONTACTED + ") " + PROJECTION_NAME_CONTACTED_SUM + "," + "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_BLOCKED + ") " + PROJECTION_NAME_BLOCKED_SUM; Cursor cursor = db.rawQuery("SELECT " + projection + " FROM " + AppTrackerEntry.TABLE_NAME + " WHERE " + selection + " GROUP BY " + projectionNamePeriod + " GROUP BY " + PROJECTION_NAME_PERIOD + " ORDER BY " + AppTrackerEntry.COLUMN_NAME_TIMESTAMP + " DESC" + " LIMIT " + periodsCount, selectionArg); HashMap<String, Pair<Integer, Integer>> callsByPeriod = new HashMap<>(); while (cursor.moveToNext()) { int contacted = cursor.getInt(cursor.getColumnIndex(projectionNameContactedSum)); int blocked = cursor.getInt(cursor.getColumnIndex(projectionNameBlockedSum)); int contacted = cursor.getInt(cursor.getColumnIndex(PROJECTION_NAME_CONTACTED_SUM)); int blocked = cursor.getInt(cursor.getColumnIndex(PROJECTION_NAME_BLOCKED_SUM)); callsByPeriod.put( cursor.getString(cursor.getColumnIndex(projectionNamePeriod)), cursor.getString(cursor.getColumnIndex(PROJECTION_NAME_PERIOD)), new Pair(blocked, contacted - blocked) ); } Loading Loading @@ -176,7 +177,6 @@ public class StatsDatabase extends SQLiteOpenHelper { synchronized (lock) { long minTimestamp = getPeriodStartTs(periodsCount, periodUnit); String projectionNameTrackersCount = "trackerscount"; SQLiteDatabase db = getWritableDatabase(); Loading @@ -184,7 +184,7 @@ public class StatsDatabase extends SQLiteOpenHelper { AppTrackerEntry.COLUMN_NAME_NUMBER_CONTACTED + " > " + AppTrackerEntry.COLUMN_NAME_NUMBER_BLOCKED; String[] selectionArg = new String[]{"" + minTimestamp}; String projection = "COUNT(DISTINCT " + AppTrackerEntry.COLUMN_NAME_TRACKER + ") " + projectionNameTrackersCount; "COUNT(DISTINCT " + AppTrackerEntry.COLUMN_NAME_TRACKER + ") " + PROJECTION_NAME_TRACKERS_COUNT; Cursor cursor = db.rawQuery("SELECT " + projection + " FROM " + AppTrackerEntry.TABLE_NAME + " WHERE " + selection, selectionArg); Loading @@ -204,11 +204,9 @@ public class StatsDatabase extends SQLiteOpenHelper { public int getContactedTrackersCount() { synchronized (lock) { String projectionNameTrackersCount = "trackerscount"; SQLiteDatabase db = getReadableDatabase(); String projection = "COUNT(DISTINCT " + AppTrackerEntry.COLUMN_NAME_TRACKER + ") " + projectionNameTrackersCount; "COUNT(DISTINCT " + AppTrackerEntry.COLUMN_NAME_TRACKER + ") " + PROJECTION_NAME_TRACKERS_COUNT; Cursor cursor = db.rawQuery( "SELECT " + projection + " FROM " + AppTrackerEntry.TABLE_NAME, Loading @@ -230,12 +228,10 @@ public class StatsDatabase extends SQLiteOpenHelper { public Map<Integer, Integer> getContactedTrackersCountByApp() { synchronized (lock) { String projectionNameTrackersCount = "trackerscount"; SQLiteDatabase db = getReadableDatabase(); String projection = AppTrackerEntry.COLUMN_NAME_APP_UID + ", " + "COUNT(DISTINCT " + AppTrackerEntry.COLUMN_NAME_TRACKER + ") " + projectionNameTrackersCount; "COUNT(DISTINCT " + AppTrackerEntry.COLUMN_NAME_TRACKER + ") " + PROJECTION_NAME_TRACKERS_COUNT; Cursor cursor = db.rawQuery( "SELECT " + projection + " FROM " + AppTrackerEntry.TABLE_NAME + Loading @@ -247,7 +243,7 @@ public class StatsDatabase extends SQLiteOpenHelper { while (cursor.moveToNext()) { countByApp.put( cursor.getInt(cursor.getColumnIndex(AppTrackerEntry.COLUMN_NAME_APP_UID)), cursor.getInt(cursor.getColumnIndex(projectionNameTrackersCount)) cursor.getInt(cursor.getColumnIndex(PROJECTION_NAME_TRACKERS_COUNT)) ); } Loading @@ -258,6 +254,115 @@ public class StatsDatabase extends SQLiteOpenHelper { } } public Map<Integer, Pair<Integer, Integer>> getCallsByApps(int periodCount, TemporalUnit periodUnit) { synchronized (lock) { long minTimestamp = getPeriodStartTs(periodCount, periodUnit); SQLiteDatabase db = getReadableDatabase(); String selection = AppTrackerEntry.COLUMN_NAME_TIMESTAMP + " >= ?"; String[] selectionArg = new String[]{"" + minTimestamp}; String projection = AppTrackerEntry.COLUMN_NAME_APP_UID + ", " + "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_CONTACTED + ") " + PROJECTION_NAME_CONTACTED_SUM + "," + "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_BLOCKED + ") " + PROJECTION_NAME_BLOCKED_SUM; Cursor cursor = db.rawQuery( "SELECT " + projection + " FROM " + AppTrackerEntry.TABLE_NAME + " WHERE " + selection + " GROUP BY " + AppTrackerEntry.COLUMN_NAME_APP_UID, selectionArg); HashMap<Integer, Pair<Integer, Integer>> callsByApp = new HashMap<>(); while (cursor.moveToNext()) { int contacted = cursor.getInt(cursor.getColumnIndex(PROJECTION_NAME_CONTACTED_SUM)); int blocked = cursor.getInt(cursor.getColumnIndex(PROJECTION_NAME_BLOCKED_SUM)); callsByApp.put( cursor.getInt(cursor.getColumnIndex(AppTrackerEntry.COLUMN_NAME_APP_UID)), new Pair(blocked, contacted - blocked) ); } cursor.close(); db.close(); return callsByApp; } } public Pair<Integer, Integer> getCalls(int appUid, int periodCount, TemporalUnit periodUnit) { synchronized (lock) { long minTimestamp = getPeriodStartTs(periodCount, periodUnit); SQLiteDatabase db = getReadableDatabase(); String selection = AppTrackerEntry.COLUMN_NAME_APP_UID + " = ? AND " + AppTrackerEntry.COLUMN_NAME_TIMESTAMP + " >= ?"; String[] selectionArg = new String[]{ "" + appUid, "" + minTimestamp }; String projection = "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_CONTACTED + ") " + PROJECTION_NAME_CONTACTED_SUM + "," + "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_BLOCKED + ") " + PROJECTION_NAME_BLOCKED_SUM; Cursor cursor = db.rawQuery( "SELECT " + projection + " FROM " + AppTrackerEntry.TABLE_NAME + " WHERE " + selection, selectionArg); HashMap<Integer, Pair<Integer, Integer>> callsByApp = new HashMap<>(); Pair<Integer, Integer> calls = new Pair(0, 0); if (cursor.moveToNext()) { int contacted = cursor.getInt(cursor.getColumnIndex(PROJECTION_NAME_CONTACTED_SUM)); int blocked = cursor.getInt(cursor.getColumnIndex(PROJECTION_NAME_BLOCKED_SUM)); calls = new Pair(blocked, contacted - blocked); } cursor.close(); db.close(); return calls; } } public int getMostLeakedApp(int periodCount, TemporalUnit periodUnit) { synchronized (lock) { long minTimestamp = getPeriodStartTs(periodCount, periodUnit); SQLiteDatabase db = getReadableDatabase(); String selection = AppTrackerEntry.COLUMN_NAME_TIMESTAMP + " >= ?"; String[] selectionArg = new String[]{"" + minTimestamp}; String projection = AppTrackerEntry.COLUMN_NAME_APP_UID + ", " + "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_CONTACTED + " - " + AppTrackerEntry.COLUMN_NAME_NUMBER_BLOCKED + ") " + PROJECTION_NAME_LEAKED_SUM; Cursor cursor = db.rawQuery( "SELECT " + projection + " FROM " + AppTrackerEntry.TABLE_NAME + " WHERE " + selection + " GROUP BY " + AppTrackerEntry.COLUMN_NAME_APP_UID + " ORDER BY " + PROJECTION_NAME_LEAKED_SUM + " DESC LIMIT 1", selectionArg); int appUid = 0; if (cursor.moveToNext()) { appUid = cursor.getInt(cursor.getColumnIndex(AppTrackerEntry.COLUMN_NAME_APP_UID)); } cursor.close(); db.close(); return appUid; } } private long getCurrentHourTs() { long hourInMs = TimeUnit.HOURS.toMillis(1L); Loading privacymoduletrackers/src/main/java/foundation/e/privacymodules/trackers/data/StatsRepository.java +15 −0 Original line number Diff line number Diff line Loading @@ -2,9 +2,11 @@ package foundation.e.privacymodules.trackers.data; import android.content.Context; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalUnit; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import foundation.e.privacymodules.trackers.Tracker; Loading Loading @@ -58,4 +60,17 @@ public class StatsRepository { public List<Tracker> getAllTrackersOfApp(int app_uid) { return database.getAllTrackersOfApp(app_uid); } public Map<Integer, Pair<Integer, Integer>> getCallsByApps(int periodCount, TemporalUnit periodUnit) { return database.getCallsByApps(periodCount, periodUnit); } public Pair<Integer, Integer> getCalls(int appUid, int periodCount, TemporalUnit periodUnit) { return database.getCalls(appUid, periodCount, periodUnit); } public int getMostLeakedApp(int periodCount, TemporalUnit periodUnit) { return database.getMostLeakedApp(periodCount, periodUnit); } } No newline at end of file Loading
privacymoduletrackers/build.gradle +2 −2 Original line number Diff line number Diff line Loading @@ -10,7 +10,7 @@ android { targetSdkVersion 30 versionCode 1 versionName "0.6.1" versionName "0.7.0" } buildTypes { Loading @@ -26,7 +26,7 @@ android { } } dependencies{ implementation 'foundation.e:privacymodule.api:1.0.0' implementation 'foundation.e:privacymodule.api:1.1.0' } publishing { Loading
privacymoduletrackers/src/main/java/foundation/e/privacymodules/trackers/api/TrackTrackersPrivacyModule.java +17 −0 Original line number Diff line number Diff line Loading @@ -115,6 +115,23 @@ public class TrackTrackersPrivacyModule implements ITrackTrackersPrivacyModule { return statsRepository.getActiveTrackersByPeriod(12, ChronoUnit.MONTHS); } @Override public int getPastDayMostLeakedApp() { return statsRepository.getMostLeakedApp(24, ChronoUnit.HOURS); } @NonNull @Override public Map<Integer, Pair<Integer, Integer>> getPastDayTrackersCallsByApps() { return statsRepository.getCallsByApps(24, ChronoUnit.HOURS); } @NonNull @Override public Pair<Integer, Integer> getPastDayTrackersCallsForApp(int appUid) { return statsRepository.getCalls(appUid, 24, ChronoUnit.HOURS); } @Override public void addListener(ITrackTrackersPrivacyModule.Listener listener) { mListeners.add(listener); Loading
privacymoduletrackers/src/main/java/foundation/e/privacymodules/trackers/data/StatsDatabase.java +125 −20 Original line number Diff line number Diff line Loading @@ -86,6 +86,11 @@ public class StatsDatabase extends SQLiteOpenHelper { AppTrackerEntry.COLUMN_NAME_NUMBER_CONTACTED + " INTEGER," + AppTrackerEntry.COLUMN_NAME_NUMBER_BLOCKED + " INTEGER)"; private static final String PROJECTION_NAME_PERIOD = "period"; private static final String PROJECTION_NAME_CONTACTED_SUM = "contactedsum"; private static final String PROJECTION_NAME_BLOCKED_SUM = "blockedsum"; private static final String PROJECTION_NAME_LEAKED_SUM = "leakedsum"; private static final String PROJECTION_NAME_TRACKERS_COUNT = "trackerscount"; private HashMap<String, Pair<Integer, Integer>> getCallsByPeriod( int periodsCount, Loading @@ -95,32 +100,28 @@ public class StatsDatabase extends SQLiteOpenHelper { synchronized (lock) { long minTimestamp = getPeriodStartTs(periodsCount, periodUnit); String projectionNamePeriod = "period"; String projectionNameContactedSum = "contactedsum"; String projectionNameBlockedSum = "blockedsum"; SQLiteDatabase db = getReadableDatabase(); String selection = AppTrackerEntry.COLUMN_NAME_TIMESTAMP + " >= ?"; String[] selectionArg = new String[]{"" + minTimestamp}; String projection = AppTrackerEntry.COLUMN_NAME_TIMESTAMP + ", " + "STRFTIME('" + sqlitePeriodFormat + "', DATETIME(" + AppTrackerEntry.COLUMN_NAME_TIMESTAMP + ", 'unixepoch', 'localtime')) " + projectionNamePeriod + "," + "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_CONTACTED + ") " + projectionNameContactedSum + "," + "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_BLOCKED + ") " + projectionNameBlockedSum; "STRFTIME('" + sqlitePeriodFormat + "', DATETIME(" + AppTrackerEntry.COLUMN_NAME_TIMESTAMP + ", 'unixepoch', 'localtime')) " + PROJECTION_NAME_PERIOD + "," + "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_CONTACTED + ") " + PROJECTION_NAME_CONTACTED_SUM + "," + "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_BLOCKED + ") " + PROJECTION_NAME_BLOCKED_SUM; Cursor cursor = db.rawQuery("SELECT " + projection + " FROM " + AppTrackerEntry.TABLE_NAME + " WHERE " + selection + " GROUP BY " + projectionNamePeriod + " GROUP BY " + PROJECTION_NAME_PERIOD + " ORDER BY " + AppTrackerEntry.COLUMN_NAME_TIMESTAMP + " DESC" + " LIMIT " + periodsCount, selectionArg); HashMap<String, Pair<Integer, Integer>> callsByPeriod = new HashMap<>(); while (cursor.moveToNext()) { int contacted = cursor.getInt(cursor.getColumnIndex(projectionNameContactedSum)); int blocked = cursor.getInt(cursor.getColumnIndex(projectionNameBlockedSum)); int contacted = cursor.getInt(cursor.getColumnIndex(PROJECTION_NAME_CONTACTED_SUM)); int blocked = cursor.getInt(cursor.getColumnIndex(PROJECTION_NAME_BLOCKED_SUM)); callsByPeriod.put( cursor.getString(cursor.getColumnIndex(projectionNamePeriod)), cursor.getString(cursor.getColumnIndex(PROJECTION_NAME_PERIOD)), new Pair(blocked, contacted - blocked) ); } Loading Loading @@ -176,7 +177,6 @@ public class StatsDatabase extends SQLiteOpenHelper { synchronized (lock) { long minTimestamp = getPeriodStartTs(periodsCount, periodUnit); String projectionNameTrackersCount = "trackerscount"; SQLiteDatabase db = getWritableDatabase(); Loading @@ -184,7 +184,7 @@ public class StatsDatabase extends SQLiteOpenHelper { AppTrackerEntry.COLUMN_NAME_NUMBER_CONTACTED + " > " + AppTrackerEntry.COLUMN_NAME_NUMBER_BLOCKED; String[] selectionArg = new String[]{"" + minTimestamp}; String projection = "COUNT(DISTINCT " + AppTrackerEntry.COLUMN_NAME_TRACKER + ") " + projectionNameTrackersCount; "COUNT(DISTINCT " + AppTrackerEntry.COLUMN_NAME_TRACKER + ") " + PROJECTION_NAME_TRACKERS_COUNT; Cursor cursor = db.rawQuery("SELECT " + projection + " FROM " + AppTrackerEntry.TABLE_NAME + " WHERE " + selection, selectionArg); Loading @@ -204,11 +204,9 @@ public class StatsDatabase extends SQLiteOpenHelper { public int getContactedTrackersCount() { synchronized (lock) { String projectionNameTrackersCount = "trackerscount"; SQLiteDatabase db = getReadableDatabase(); String projection = "COUNT(DISTINCT " + AppTrackerEntry.COLUMN_NAME_TRACKER + ") " + projectionNameTrackersCount; "COUNT(DISTINCT " + AppTrackerEntry.COLUMN_NAME_TRACKER + ") " + PROJECTION_NAME_TRACKERS_COUNT; Cursor cursor = db.rawQuery( "SELECT " + projection + " FROM " + AppTrackerEntry.TABLE_NAME, Loading @@ -230,12 +228,10 @@ public class StatsDatabase extends SQLiteOpenHelper { public Map<Integer, Integer> getContactedTrackersCountByApp() { synchronized (lock) { String projectionNameTrackersCount = "trackerscount"; SQLiteDatabase db = getReadableDatabase(); String projection = AppTrackerEntry.COLUMN_NAME_APP_UID + ", " + "COUNT(DISTINCT " + AppTrackerEntry.COLUMN_NAME_TRACKER + ") " + projectionNameTrackersCount; "COUNT(DISTINCT " + AppTrackerEntry.COLUMN_NAME_TRACKER + ") " + PROJECTION_NAME_TRACKERS_COUNT; Cursor cursor = db.rawQuery( "SELECT " + projection + " FROM " + AppTrackerEntry.TABLE_NAME + Loading @@ -247,7 +243,7 @@ public class StatsDatabase extends SQLiteOpenHelper { while (cursor.moveToNext()) { countByApp.put( cursor.getInt(cursor.getColumnIndex(AppTrackerEntry.COLUMN_NAME_APP_UID)), cursor.getInt(cursor.getColumnIndex(projectionNameTrackersCount)) cursor.getInt(cursor.getColumnIndex(PROJECTION_NAME_TRACKERS_COUNT)) ); } Loading @@ -258,6 +254,115 @@ public class StatsDatabase extends SQLiteOpenHelper { } } public Map<Integer, Pair<Integer, Integer>> getCallsByApps(int periodCount, TemporalUnit periodUnit) { synchronized (lock) { long minTimestamp = getPeriodStartTs(periodCount, periodUnit); SQLiteDatabase db = getReadableDatabase(); String selection = AppTrackerEntry.COLUMN_NAME_TIMESTAMP + " >= ?"; String[] selectionArg = new String[]{"" + minTimestamp}; String projection = AppTrackerEntry.COLUMN_NAME_APP_UID + ", " + "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_CONTACTED + ") " + PROJECTION_NAME_CONTACTED_SUM + "," + "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_BLOCKED + ") " + PROJECTION_NAME_BLOCKED_SUM; Cursor cursor = db.rawQuery( "SELECT " + projection + " FROM " + AppTrackerEntry.TABLE_NAME + " WHERE " + selection + " GROUP BY " + AppTrackerEntry.COLUMN_NAME_APP_UID, selectionArg); HashMap<Integer, Pair<Integer, Integer>> callsByApp = new HashMap<>(); while (cursor.moveToNext()) { int contacted = cursor.getInt(cursor.getColumnIndex(PROJECTION_NAME_CONTACTED_SUM)); int blocked = cursor.getInt(cursor.getColumnIndex(PROJECTION_NAME_BLOCKED_SUM)); callsByApp.put( cursor.getInt(cursor.getColumnIndex(AppTrackerEntry.COLUMN_NAME_APP_UID)), new Pair(blocked, contacted - blocked) ); } cursor.close(); db.close(); return callsByApp; } } public Pair<Integer, Integer> getCalls(int appUid, int periodCount, TemporalUnit periodUnit) { synchronized (lock) { long minTimestamp = getPeriodStartTs(periodCount, periodUnit); SQLiteDatabase db = getReadableDatabase(); String selection = AppTrackerEntry.COLUMN_NAME_APP_UID + " = ? AND " + AppTrackerEntry.COLUMN_NAME_TIMESTAMP + " >= ?"; String[] selectionArg = new String[]{ "" + appUid, "" + minTimestamp }; String projection = "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_CONTACTED + ") " + PROJECTION_NAME_CONTACTED_SUM + "," + "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_BLOCKED + ") " + PROJECTION_NAME_BLOCKED_SUM; Cursor cursor = db.rawQuery( "SELECT " + projection + " FROM " + AppTrackerEntry.TABLE_NAME + " WHERE " + selection, selectionArg); HashMap<Integer, Pair<Integer, Integer>> callsByApp = new HashMap<>(); Pair<Integer, Integer> calls = new Pair(0, 0); if (cursor.moveToNext()) { int contacted = cursor.getInt(cursor.getColumnIndex(PROJECTION_NAME_CONTACTED_SUM)); int blocked = cursor.getInt(cursor.getColumnIndex(PROJECTION_NAME_BLOCKED_SUM)); calls = new Pair(blocked, contacted - blocked); } cursor.close(); db.close(); return calls; } } public int getMostLeakedApp(int periodCount, TemporalUnit periodUnit) { synchronized (lock) { long minTimestamp = getPeriodStartTs(periodCount, periodUnit); SQLiteDatabase db = getReadableDatabase(); String selection = AppTrackerEntry.COLUMN_NAME_TIMESTAMP + " >= ?"; String[] selectionArg = new String[]{"" + minTimestamp}; String projection = AppTrackerEntry.COLUMN_NAME_APP_UID + ", " + "SUM(" + AppTrackerEntry.COLUMN_NAME_NUMBER_CONTACTED + " - " + AppTrackerEntry.COLUMN_NAME_NUMBER_BLOCKED + ") " + PROJECTION_NAME_LEAKED_SUM; Cursor cursor = db.rawQuery( "SELECT " + projection + " FROM " + AppTrackerEntry.TABLE_NAME + " WHERE " + selection + " GROUP BY " + AppTrackerEntry.COLUMN_NAME_APP_UID + " ORDER BY " + PROJECTION_NAME_LEAKED_SUM + " DESC LIMIT 1", selectionArg); int appUid = 0; if (cursor.moveToNext()) { appUid = cursor.getInt(cursor.getColumnIndex(AppTrackerEntry.COLUMN_NAME_APP_UID)); } cursor.close(); db.close(); return appUid; } } private long getCurrentHourTs() { long hourInMs = TimeUnit.HOURS.toMillis(1L); Loading
privacymoduletrackers/src/main/java/foundation/e/privacymodules/trackers/data/StatsRepository.java +15 −0 Original line number Diff line number Diff line Loading @@ -2,9 +2,11 @@ package foundation.e.privacymodules.trackers.data; import android.content.Context; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalUnit; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import foundation.e.privacymodules.trackers.Tracker; Loading Loading @@ -58,4 +60,17 @@ public class StatsRepository { public List<Tracker> getAllTrackersOfApp(int app_uid) { return database.getAllTrackersOfApp(app_uid); } public Map<Integer, Pair<Integer, Integer>> getCallsByApps(int periodCount, TemporalUnit periodUnit) { return database.getCallsByApps(periodCount, periodUnit); } public Pair<Integer, Integer> getCalls(int appUid, int periodCount, TemporalUnit periodUnit) { return database.getCalls(appUid, periodCount, periodUnit); } public int getMostLeakedApp(int periodCount, TemporalUnit periodUnit) { return database.getMostLeakedApp(periodCount, periodUnit); } } No newline at end of file