Add support for time zone notifications
Add support for time zone notifications to RulesManagerService.
This change adds new intents that are broadcast after
a time zone rules update is staged / unstaged. This will allow
another component on the device to handle notifications telling
the user to restart the device.
Bug: 69443060
Test: atest FrameworksServicesTests
Test: Manual install
Change-Id: I4fc4b5715380d84d87cdb43c05aee2f8f9c5d277
diff --git a/services/core/java/com/android/server/timezone/RulesManagerService.java b/services/core/java/com/android/server/timezone/RulesManagerService.java
index be9b204..872d723 100644
--- a/services/core/java/com/android/server/timezone/RulesManagerService.java
+++ b/services/core/java/com/android/server/timezone/RulesManagerService.java
@@ -99,6 +99,7 @@
private final PermissionHelper mPermissionHelper;
private final PackageTracker mPackageTracker;
private final Executor mExecutor;
+ private final RulesManagerIntentHelper mIntentHelper;
private final TimeZoneDistroInstaller mInstaller;
private static RulesManagerService create(Context context) {
@@ -106,16 +107,19 @@
return new RulesManagerService(
helper /* permissionHelper */,
helper /* executor */,
+ helper /* intentHelper */,
PackageTracker.create(context),
new TimeZoneDistroInstaller(TAG, SYSTEM_TZ_DATA_FILE, TZ_DATA_DIR));
}
// A constructor that can be used by tests to supply mocked / faked dependencies.
- RulesManagerService(PermissionHelper permissionHelper,
- Executor executor, PackageTracker packageTracker,
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+ RulesManagerService(PermissionHelper permissionHelper, Executor executor,
+ RulesManagerIntentHelper intentHelper, PackageTracker packageTracker,
TimeZoneDistroInstaller timeZoneDistroInstaller) {
mPermissionHelper = permissionHelper;
mExecutor = executor;
+ mIntentHelper = intentHelper;
mPackageTracker = packageTracker;
mInstaller = timeZoneDistroInstaller;
}
@@ -271,6 +275,10 @@
TimeZoneDistro distro = new TimeZoneDistro(is);
int installerResult = mInstaller.stageInstallWithErrorCode(distro);
+
+ // Notify interested parties that something is staged.
+ sendInstallNotificationIntentIfRequired(installerResult);
+
int resultCode = mapInstallerResultToApiCode(installerResult);
EventLogTags.writeTimezoneInstallComplete(toStringOrNull(mCheckToken), resultCode);
sendFinishedStatus(mCallback, resultCode);
@@ -291,6 +299,12 @@
}
}
+ private void sendInstallNotificationIntentIfRequired(int installerResult) {
+ if (installerResult == TimeZoneDistroInstaller.INSTALL_SUCCESS) {
+ mIntentHelper.sendTimeZoneOperationStaged();
+ }
+ }
+
private int mapInstallerResultToApiCode(int installerResult) {
switch (installerResult) {
case TimeZoneDistroInstaller.INSTALL_SUCCESS:
@@ -351,6 +365,10 @@
boolean packageTrackerStatus = false;
try {
int uninstallResult = mInstaller.stageUninstall();
+
+ // Notify interested parties that something is staged.
+ sendUninstallNotificationIntentIfRequired(uninstallResult);
+
packageTrackerStatus = (uninstallResult == TimeZoneDistroInstaller.UNINSTALL_SUCCESS
|| uninstallResult == TimeZoneDistroInstaller.UNINSTALL_NOTHING_INSTALLED);
@@ -374,6 +392,20 @@
mOperationInProgress.set(false);
}
}
+
+ private void sendUninstallNotificationIntentIfRequired(int uninstallResult) {
+ switch (uninstallResult) {
+ case TimeZoneDistroInstaller.UNINSTALL_SUCCESS:
+ mIntentHelper.sendTimeZoneOperationStaged();
+ break;
+ case TimeZoneDistroInstaller.UNINSTALL_NOTHING_INSTALLED:
+ mIntentHelper.sendTimeZoneOperationUnstaged();
+ break;
+ case TimeZoneDistroInstaller.UNINSTALL_FAIL:
+ default:
+ // No-op - unknown or nothing to notify about.
+ }
+ }
}
private void sendFinishedStatus(ICallback callback, int resultCode) {