diff options
Diffstat (limited to 'src/com/android/settings/cmstats/ReportingServiceManager.java')
-rw-r--r-- | src/com/android/settings/cmstats/ReportingServiceManager.java | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/src/com/android/settings/cmstats/ReportingServiceManager.java b/src/com/android/settings/cmstats/ReportingServiceManager.java index e7ca159..bce1372 100644 --- a/src/com/android/settings/cmstats/ReportingServiceManager.java +++ b/src/com/android/settings/cmstats/ReportingServiceManager.java @@ -18,17 +18,22 @@ package com.android.settings.cmstats; import android.app.AlarmManager; import android.app.PendingIntent; +import android.app.job.JobScheduler; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.os.UserHandle; import android.util.Log; +import cyanogenmod.providers.CMSettings; public class ReportingServiceManager extends BroadcastReceiver { private static final long MILLIS_PER_HOUR = 60L * 60L * 1000L; private static final long MILLIS_PER_DAY = 24L * MILLIS_PER_HOUR; private static final long UPDATE_INTERVAL = 1L * MILLIS_PER_DAY; + private static final String TAG = ReportingServiceManager.class.getSimpleName(); + public static final String ACTION_LAUNCH_SERVICE = "com.android.settings.action.TRIGGER_REPORT_METRICS"; public static final String EXTRA_FORCE = "force"; @@ -36,33 +41,41 @@ public class ReportingServiceManager extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) { - setAlarm(context, 0); + setAlarm(context); } else if (intent.getAction().equals(ACTION_LAUNCH_SERVICE)){ launchService(context, intent.getBooleanExtra(EXTRA_FORCE, false)); } } - public static void setAlarm(Context context, long millisFromNow) { + /** + * opt out if we haven't yet + */ + public static void initiateOptOut(Context context) { + final boolean optOutReported = CMSettings.Secure.getIntForUser(context.getContentResolver(), + CMSettings.Secure.STATS_COLLECTION_REPORTED, 0, UserHandle.USER_OWNER) == 1; + if (!optOutReported) { + Intent intent = new Intent(); + intent.setClass(context, ReportingService.class); + intent.putExtra(ReportingService.EXTRA_OPTING_OUT, true); + context.startServiceAsUser(intent, UserHandle.OWNER); + } + } + + public static void setAlarm(Context context) { SharedPreferences prefs = AnonymousStats.getPreferences(context); if (prefs.contains(AnonymousStats.ANONYMOUS_OPT_IN)) { migrate(context, prefs); } if (!Utilities.isStatsCollectionEnabled(context)) { + initiateOptOut(context); return; } - - if (millisFromNow <= 0) { - long lastSynced = prefs.getLong(AnonymousStats.ANONYMOUS_LAST_CHECKED, 0); - if (lastSynced == 0) { - // never synced, so let's fake out that the last sync was just now. - // this will allow the user tFrame time to opt out before it will start - // sending up anonymous stats. - lastSynced = System.currentTimeMillis(); - prefs.edit().putLong(AnonymousStats.ANONYMOUS_LAST_CHECKED, lastSynced).apply(); - Log.d(ReportingService.TAG, "Set alarm for first sync."); - } - millisFromNow = (lastSynced + UPDATE_INTERVAL) - System.currentTimeMillis(); + long lastSynced = prefs.getLong(AnonymousStats.ANONYMOUS_LAST_CHECKED, 0); + if (lastSynced == 0) { + launchService(context, true); // service will reschedule the next alarm + return; } + long millisFromNow = (lastSynced + UPDATE_INTERVAL) - System.currentTimeMillis(); Intent intent = new Intent(ACTION_LAUNCH_SERVICE); intent.setClass(context, ReportingServiceManager.class); @@ -70,8 +83,8 @@ public class ReportingServiceManager extends BroadcastReceiver { AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + millisFromNow, PendingIntent.getBroadcast(context, 0, intent, 0)); - Log.d(ReportingService.TAG, "Next sync attempt in : " - + millisFromNow / MILLIS_PER_HOUR + " hours"); + Log.d(TAG, "Next sync attempt in : " + + (millisFromNow / MILLIS_PER_HOUR) + " hours"); } public static void launchService(Context context, boolean force) { @@ -84,13 +97,13 @@ public class ReportingServiceManager extends BroadcastReceiver { if (!force) { long lastSynced = prefs.getLong(AnonymousStats.ANONYMOUS_LAST_CHECKED, 0); if (lastSynced == 0) { - setAlarm(context, 0); + setAlarm(context); return; } long timeElapsed = System.currentTimeMillis() - lastSynced; if (timeElapsed < UPDATE_INTERVAL) { long timeLeft = UPDATE_INTERVAL - timeElapsed; - Log.d(ReportingService.TAG, "Waiting for next sync : " + Log.d(TAG, "Waiting for next sync : " + timeLeft / MILLIS_PER_HOUR + " hours"); return; } @@ -98,7 +111,7 @@ public class ReportingServiceManager extends BroadcastReceiver { Intent intent = new Intent(); intent.setClass(context, ReportingService.class); - context.startService(intent); + context.startServiceAsUser(intent, UserHandle.OWNER); } private static void migrate(Context context, SharedPreferences prefs) { |