diff options
3 files changed, 28 insertions, 10 deletions
diff --git a/services/backup/java/com/android/server/backup/BackupManagerConstants.java b/services/backup/java/com/android/server/backup/BackupManagerConstants.java index 4bd987a17447..b753d01562ca 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerConstants.java +++ b/services/backup/java/com/android/server/backup/BackupManagerConstants.java @@ -72,6 +72,9 @@ public class BackupManagerConstants extends KeyValueSettingObserver { public static final String BACKUP_FINISHED_NOTIFICATION_RECEIVERS = "backup_finished_notification_receivers"; + @VisibleForTesting + public static final String WAKELOCK_TIMEOUT_MILLIS = "wakelock_timeout_millis"; + // Hard coded default values. @VisibleForTesting public static final long DEFAULT_KEY_VALUE_BACKUP_INTERVAL_MILLISECONDS = @@ -97,6 +100,9 @@ public class BackupManagerConstants extends KeyValueSettingObserver { @VisibleForTesting public static final String DEFAULT_BACKUP_FINISHED_NOTIFICATION_RECEIVERS = ""; + @VisibleForTesting + public static final long DEFAULT_WAKELOCK_TIMEOUT_MILLIS = 30 * 60 * 1000; // 30 minutes + // Backup manager constants. private long mKeyValueBackupIntervalMilliseconds; private long mKeyValueBackupFuzzMilliseconds; @@ -106,6 +112,7 @@ public class BackupManagerConstants extends KeyValueSettingObserver { private boolean mFullBackupRequireCharging; private int mFullBackupRequiredNetworkType; private String[] mBackupFinishedNotificationReceivers; + private long mWakelockTimeoutMillis; public BackupManagerConstants(Handler handler, ContentResolver resolver) { super(handler, resolver, Settings.Secure.getUriFor(SETTING)); @@ -152,6 +159,8 @@ public class BackupManagerConstants extends KeyValueSettingObserver { } else { mBackupFinishedNotificationReceivers = backupFinishedNotificationReceivers.split(":"); } + mWakelockTimeoutMillis = parser.getLong(WAKELOCK_TIMEOUT_MILLIS, + DEFAULT_WAKELOCK_TIMEOUT_MILLIS); } // The following are access methods for the individual parameters. @@ -235,4 +244,9 @@ public class BackupManagerConstants extends KeyValueSettingObserver { } return mBackupFinishedNotificationReceivers; } + + public synchronized long getWakelockTimeoutMillis() { + Slog.v(TAG, "wakelock timeout: " + mWakelockTimeoutMillis); + return mWakelockTimeoutMillis; + } } diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index 549f8fa77b53..ac1f50f85d64 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -181,11 +181,14 @@ public class UserBackupManagerService { public static class BackupWakeLock { private final PowerManager.WakeLock mPowerManagerWakeLock; private boolean mHasQuit = false; - private int mUserId; + private final int mUserId; + private final BackupManagerConstants mBackupManagerConstants; - public BackupWakeLock(PowerManager.WakeLock powerManagerWakeLock, int userId) { + public BackupWakeLock(PowerManager.WakeLock powerManagerWakeLock, int userId, + BackupManagerConstants backupManagerConstants) { mPowerManagerWakeLock = powerManagerWakeLock; mUserId = userId; + mBackupManagerConstants = backupManagerConstants; } /** Acquires the {@link PowerManager.WakeLock} if hasn't been quit. */ @@ -199,7 +202,9 @@ public class UserBackupManagerService { + mPowerManagerWakeLock.getTag())); return; } - mPowerManagerWakeLock.acquire(); + // Set a timeout for the wakelock. Otherwise if we fail internally and never call + // release(), the device might stay awake and drain battery indefinitely. + mPowerManagerWakeLock.acquire(mBackupManagerConstants.getWakelockTimeoutMillis()); Slog.v( TAG, addUserIdToLogMessage( @@ -674,10 +679,8 @@ public class UserBackupManagerService { mBackupPreferences = new UserBackupPreferences(mContext, mBaseStateDir); // Power management - mWakelock = new BackupWakeLock( - mPowerManager.newWakeLock( - PowerManager.PARTIAL_WAKE_LOCK, - "*backup*-" + userId + "-" + userBackupThread.getThreadId()), userId); + mWakelock = new BackupWakeLock(mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, + "*backup*-" + userId + "-" + userBackupThread.getThreadId()), userId, mConstants); // Set up the various sorts of package tracking we do mFullBackupScheduleFile = new File(mBaseStateDir, "fb-schedule"); diff --git a/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java b/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java index fc3ec7b44f4f..4d04c8b76fc7 100644 --- a/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java +++ b/services/robotests/backup/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java @@ -37,6 +37,7 @@ import android.os.Process; import android.util.Log; import com.android.server.backup.BackupAgentTimeoutParameters; +import com.android.server.backup.BackupManagerConstants; import com.android.server.backup.BackupManagerService; import com.android.server.backup.TransportManager; import com.android.server.backup.UserBackupManagerService; @@ -162,10 +163,10 @@ public class BackupManagerServiceTestUtils { public static UserBackupManagerService.BackupWakeLock createBackupWakeLock( Application application) { - PowerManager powerManager = - (PowerManager) application.getSystemService(Context.POWER_SERVICE); + PowerManager powerManager = application.getSystemService(PowerManager.class); return new UserBackupManagerService.BackupWakeLock( - powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*"), 0); + powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*"), 0, + new BackupManagerConstants(Handler.getMain(), application.getContentResolver())); } /** |