Loading services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +49 −0 Original line number Original line Diff line number Diff line Loading @@ -40,6 +40,7 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.HandlerThread; import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.Process; import android.os.SystemClock; import android.provider.DeviceConfig; import android.provider.DeviceConfig; import android.util.IntArray; import android.util.IntArray; import android.util.Log; import android.util.Log; Loading Loading @@ -121,6 +122,13 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { private final RollbackPackageHealthObserver mPackageHealthObserver; private final RollbackPackageHealthObserver mPackageHealthObserver; private final AppDataRollbackHelper mAppDataRollbackHelper; private final AppDataRollbackHelper mAppDataRollbackHelper; // This field stores the difference in Millis between the uptime (millis since device // has booted) and current time (device wall clock) - it's used to update rollback data // timestamps when the time is changed, by the user or by change of timezone. // No need for guarding with lock because value is only accessed in handler thread. private long mRelativeBootTime = calculateRelativeBootTime(); RollbackManagerServiceImpl(Context context) { RollbackManagerServiceImpl(Context context) { mContext = context; mContext = context; // Note that we're calling onStart here because this object is only constructed on // Note that we're calling onStart here because this object is only constructed on Loading Loading @@ -217,6 +225,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } } } } }, enableRollbackFilter, null, getHandler()); }, enableRollbackFilter, null, getHandler()); registerTimeChangeReceiver(); } } @Override @Override Loading Loading @@ -268,6 +278,45 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { callerPackageName, statusReceiver)); callerPackageName, statusReceiver)); } } private void registerTimeChangeReceiver() { final BroadcastReceiver timeChangeIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final long oldRelativeBootTime = mRelativeBootTime; mRelativeBootTime = calculateRelativeBootTime(); final long timeDifference = mRelativeBootTime - oldRelativeBootTime; synchronized (mLock) { ensureRollbackDataLoadedLocked(); Iterator<RollbackData> iter = mAvailableRollbacks.iterator(); while (iter.hasNext()) { RollbackData data = iter.next(); data.timestamp = data.timestamp.plusMillis(timeDifference); try { mRollbackStore.saveAvailableRollback(data); } catch (IOException ioe) { // TODO: figure out the right way to deal with this, especially if // it fails for some data and succeeds for others. Log.e(TAG, "Unable to save rollback info for : " + data.rollbackId, ioe); } } } } }; final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_TIME_CHANGED); mContext.registerReceiver(timeChangeIntentReceiver, filter, null /* broadcastPermission */, getHandler()); } private static long calculateRelativeBootTime() { return System.currentTimeMillis() - SystemClock.elapsedRealtime(); } /** /** * Performs the actual work to commit a rollback. * Performs the actual work to commit a rollback. * The work is done on the current thread. This may be a long running * The work is done on the current thread. This may be a long running Loading Loading
services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +49 −0 Original line number Original line Diff line number Diff line Loading @@ -40,6 +40,7 @@ import android.os.Handler; import android.os.HandlerThread; import android.os.HandlerThread; import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.Process; import android.os.SystemClock; import android.provider.DeviceConfig; import android.provider.DeviceConfig; import android.util.IntArray; import android.util.IntArray; import android.util.Log; import android.util.Log; Loading Loading @@ -121,6 +122,13 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { private final RollbackPackageHealthObserver mPackageHealthObserver; private final RollbackPackageHealthObserver mPackageHealthObserver; private final AppDataRollbackHelper mAppDataRollbackHelper; private final AppDataRollbackHelper mAppDataRollbackHelper; // This field stores the difference in Millis between the uptime (millis since device // has booted) and current time (device wall clock) - it's used to update rollback data // timestamps when the time is changed, by the user or by change of timezone. // No need for guarding with lock because value is only accessed in handler thread. private long mRelativeBootTime = calculateRelativeBootTime(); RollbackManagerServiceImpl(Context context) { RollbackManagerServiceImpl(Context context) { mContext = context; mContext = context; // Note that we're calling onStart here because this object is only constructed on // Note that we're calling onStart here because this object is only constructed on Loading Loading @@ -217,6 +225,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { } } } } }, enableRollbackFilter, null, getHandler()); }, enableRollbackFilter, null, getHandler()); registerTimeChangeReceiver(); } } @Override @Override Loading Loading @@ -268,6 +278,45 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { callerPackageName, statusReceiver)); callerPackageName, statusReceiver)); } } private void registerTimeChangeReceiver() { final BroadcastReceiver timeChangeIntentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { final long oldRelativeBootTime = mRelativeBootTime; mRelativeBootTime = calculateRelativeBootTime(); final long timeDifference = mRelativeBootTime - oldRelativeBootTime; synchronized (mLock) { ensureRollbackDataLoadedLocked(); Iterator<RollbackData> iter = mAvailableRollbacks.iterator(); while (iter.hasNext()) { RollbackData data = iter.next(); data.timestamp = data.timestamp.plusMillis(timeDifference); try { mRollbackStore.saveAvailableRollback(data); } catch (IOException ioe) { // TODO: figure out the right way to deal with this, especially if // it fails for some data and succeeds for others. Log.e(TAG, "Unable to save rollback info for : " + data.rollbackId, ioe); } } } } }; final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_TIME_CHANGED); mContext.registerReceiver(timeChangeIntentReceiver, filter, null /* broadcastPermission */, getHandler()); } private static long calculateRelativeBootTime() { return System.currentTimeMillis() - SystemClock.elapsedRealtime(); } /** /** * Performs the actual work to commit a rollback. * Performs the actual work to commit a rollback. * The work is done on the current thread. This may be a long running * The work is done on the current thread. This may be a long running Loading