diff options
author | Android (Google) Code Review <android-gerrit@google.com> | 2009-07-06 18:26:42 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-07-06 18:26:42 -0700 |
commit | 48f7d85d7b6be25f17f269adc7794e53121bbe2c (patch) | |
tree | e3665809e1af17187b1c9e8a59a6a6ce5d0972c0 | |
parent | 4185da518961962b7a59d744827c3f5fdd1d654c (diff) | |
parent | dbee95cacff9d2faf30638e64abe26fbeb128787 (diff) | |
download | frameworks_base-48f7d85d7b6be25f17f269adc7794e53121bbe2c.zip frameworks_base-48f7d85d7b6be25f17f269adc7794e53121bbe2c.tar.gz frameworks_base-48f7d85d7b6be25f17f269adc7794e53121bbe2c.tar.bz2 |
am dbee95ca: Merge change 6317 into donut
Merge commit 'dbee95cacff9d2faf30638e64abe26fbeb128787'
* commit 'dbee95cacff9d2faf30638e64abe26fbeb128787':
Make enable/provisioning of the backup service a two-step process
-rw-r--r-- | core/java/android/backup/IBackupManager.aidl | 7 | ||||
-rw-r--r-- | core/java/android/provider/Settings.java | 9 | ||||
-rw-r--r-- | services/java/com/android/server/BackupManagerService.java | 49 |
3 files changed, 58 insertions, 7 deletions
diff --git a/core/java/android/backup/IBackupManager.aidl b/core/java/android/backup/IBackupManager.aidl index d4933ac..9d181be 100644 --- a/core/java/android/backup/IBackupManager.aidl +++ b/core/java/android/backup/IBackupManager.aidl @@ -73,6 +73,13 @@ interface IBackupManager { void setBackupEnabled(boolean isEnabled); /** + * Indicate that any necessary one-time provisioning has occurred. + * + * <p>Callers must hold the android.permission.BACKUP permission to use this method. + */ + void setBackupProvisioned(boolean isProvisioned); + + /** * Report whether the backup mechanism is currently enabled. * * <p>Callers must hold the android.permission.BACKUP permission to use this method. diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index e053ea4..fca318e 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -2291,13 +2291,20 @@ public final class Settings { public static final String USE_LOCATION_FOR_SERVICES = "use_location"; /** - * Controls whether data backup is enabled. + * Controls whether settings backup is enabled. * Type: int ( 0 = disabled, 1 = enabled ) * @hide */ public static final String BACKUP_ENABLED = "backup_enabled"; /** + * Indicates whether settings backup has been fully provisioned. + * Type: int ( 0 = unprovisioned, 1 = fully provisioned ) + * @hide + */ + public static final String BACKUP_PROVISIONED = "backup_provisioned"; + + /** * Component of the transport to use for backup/restore. * @hide */ diff --git a/services/java/com/android/server/BackupManagerService.java b/services/java/com/android/server/BackupManagerService.java index 4b5c3df..2ae9fc5 100644 --- a/services/java/com/android/server/BackupManagerService.java +++ b/services/java/com/android/server/BackupManagerService.java @@ -81,6 +81,10 @@ class BackupManagerService extends IBackupManager.Stub { // trigger an immediate pass. private static final long BACKUP_INTERVAL = AlarmManager.INTERVAL_HOUR; + // The amount of time between the initial provisioning of the device and + // the first backup pass. + private static final long FIRST_BACKUP_INTERVAL = 12 * AlarmManager.INTERVAL_HOUR; + private static final String RUN_BACKUP_ACTION = "_backup_run_"; private static final int MSG_RUN_BACKUP = 1; private static final int MSG_RUN_FULL_BACKUP = 2; @@ -97,6 +101,7 @@ class BackupManagerService extends IBackupManager.Stub { private AlarmManager mAlarmManager; private boolean mEnabled; // access to this is synchronized on 'this' + private boolean mProvisioned; private PowerManager.WakeLock mWakelock; private final BackupHandler mBackupHandler = new BackupHandler(); private PendingIntent mRunBackupIntent; @@ -188,6 +193,9 @@ class BackupManagerService extends IBackupManager.Stub { // Set up our bookkeeping boolean areEnabled = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.BACKUP_ENABLED, 0) != 0; + // !!! TODO: mProvisioned needs to default to 0, not 1. + mProvisioned = Settings.Secure.getInt(context.getContentResolver(), + Settings.Secure.BACKUP_PROVISIONED, 1) != 0; mBaseStateDir = new File(Environment.getDataDirectory(), "backup"); mDataDir = Environment.getDownloadCacheDirectory(); @@ -1301,7 +1309,7 @@ class BackupManagerService extends IBackupManager.Stub { } } - // Enable/disable the backup transport + // Enable/disable the backup service public void setBackupEnabled(boolean enable) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "setBackupEnabled"); @@ -1314,11 +1322,9 @@ class BackupManagerService extends IBackupManager.Stub { } synchronized (mQueueLock) { - if (enable && !wasEnabled) { + if (enable && !wasEnabled && mProvisioned) { // if we've just been enabled, start scheduling backup passes - long when = System.currentTimeMillis() + BACKUP_INTERVAL; - mAlarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, when, - BACKUP_INTERVAL, mRunBackupIntent); + startBackupAlarmsLocked(BACKUP_INTERVAL); } else if (!enable) { // No longer enabled, so stop running backups mAlarmManager.cancel(mRunBackupIntent); @@ -1326,6 +1332,36 @@ class BackupManagerService extends IBackupManager.Stub { } } + // Mark the backup service as having been provisioned + public void setBackupProvisioned(boolean available) { + mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, + "setBackupProvisioned"); + + boolean wasProvisioned = mProvisioned; + synchronized (this) { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.BACKUP_PROVISIONED, available ? 1 : 0); + mProvisioned = available; + } + + synchronized (mQueueLock) { + if (available && !wasProvisioned && mEnabled) { + // we're now good to go, so start the backup alarms + startBackupAlarmsLocked(FIRST_BACKUP_INTERVAL); + } else if (!available) { + // No longer enabled, so stop running backups + Log.w(TAG, "Backup service no longer provisioned"); + mAlarmManager.cancel(mRunBackupIntent); + } + } + } + + private void startBackupAlarmsLocked(long delayBeforeFirstBackup) { + long when = System.currentTimeMillis() + delayBeforeFirstBackup; + mAlarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, when, + BACKUP_INTERVAL, mRunBackupIntent); + } + // Report whether the backup mechanism is currently enabled public boolean isBackupEnabled() { mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "isBackupEnabled"); @@ -1506,7 +1542,8 @@ class BackupManagerService extends IBackupManager.Stub { synchronized (mQueueLock) { long oldId = Binder.clearCallingIdentity(); - pw.println("Backup Manager is " + (mEnabled ? "enabled" : "disabled")); + pw.println("Backup Manager is " + (mEnabled ? "enabled" : "disabled") + + " / " + (!mProvisioned ? "not " : "") + "provisioned"); pw.println("Available transports:"); for (String t : listAllTransports()) { String pad = (t.equals(mCurrentTransport)) ? " * " : " "; |