summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/cmstats/ReportingServiceManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/settings/cmstats/ReportingServiceManager.java')
-rw-r--r--src/com/android/settings/cmstats/ReportingServiceManager.java51
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) {