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/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java b/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java
index 9cf6392..d9f4adf 100644
--- a/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezone/PackageTrackerTest.java
@@ -31,7 +31,6 @@
import android.support.test.filters.SmallTest;
import java.io.File;
-import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.time.Clock;
@@ -1400,7 +1399,7 @@
/**
* A fake IntentHelper implementation for use in tests.
*/
- private static class FakeIntentHelper implements IntentHelper {
+ private static class FakeIntentHelper implements PackageTrackerIntentHelper {
private PackageTracker mPackageTracker;
private String mUpdateAppPackageName;
diff --git a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
index 1cfae1e..f5969f3 100644
--- a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
@@ -68,6 +68,7 @@
private FakeExecutor mFakeExecutor;
private PermissionHelper mMockPermissionHelper;
+ private RulesManagerIntentHelper mMockIntentHelper;
private PackageTracker mMockPackageTracker;
private TimeZoneDistroInstaller mMockTimeZoneDistroInstaller;
@@ -77,11 +78,13 @@
mMockPackageTracker = mock(PackageTracker.class);
mMockPermissionHelper = mock(PermissionHelper.class);
+ mMockIntentHelper = mock(RulesManagerIntentHelper.class);
mMockTimeZoneDistroInstaller = mock(TimeZoneDistroInstaller.class);
mRulesManagerService = new RulesManagerService(
mMockPermissionHelper,
mFakeExecutor,
+ mMockIntentHelper,
mMockPackageTracker,
mMockTimeZoneDistroInstaller);
}
@@ -329,6 +332,7 @@
mFakeExecutor.assertNothingQueued();
verifyNoInstallerCallsMade();
verifyNoPackageTrackerCallsMade();
+ verifyNoIntentsSent();
}
@Test
@@ -353,6 +357,7 @@
mFakeExecutor.assertNothingQueued();
verifyNoInstallerCallsMade();
verifyNoPackageTrackerCallsMade();
+ verifyNoIntentsSent();
}
@Test
@@ -372,6 +377,7 @@
mFakeExecutor.assertNothingQueued();
verifyNoInstallerCallsMade();
verifyNoPackageTrackerCallsMade();
+ verifyNoIntentsSent();
}
@Test
@@ -394,6 +400,7 @@
mFakeExecutor.assertNothingQueued();
verifyNoInstallerCallsMade();
verifyNoPackageTrackerCallsMade();
+ verifyNoIntentsSent();
}
@Test
@@ -416,6 +423,7 @@
callback.assertNoResultReceived();
verifyNoInstallerCallsMade();
verifyNoPackageTrackerCallsMade();
+ verifyNoIntentsSent();
// Set up the installer.
configureStageInstallExpectation(TimeZoneDistroInstaller.INSTALL_SUCCESS);
@@ -428,6 +436,7 @@
// Verify the expected calls were made to other components.
verifyStageInstallCalled();
verifyPackageTrackerCalled(token, true /* success */);
+ verifyStagedOperationIntentSent();
// Check the callback was called.
callback.assertResultReceived(Callback.SUCCESS);
@@ -450,6 +459,7 @@
// Assert nothing has happened yet.
verifyNoInstallerCallsMade();
callback.assertNoResultReceived();
+ verifyNoIntentsSent();
// Set up the installer.
configureStageInstallExpectation(TimeZoneDistroInstaller.INSTALL_SUCCESS);
@@ -462,6 +472,7 @@
// Verify the expected calls were made to other components.
verifyStageInstallCalled();
verifyPackageTrackerCalled(null /* expectedToken */, true /* success */);
+ verifyStagedOperationIntentSent();
// Check the callback was received.
callback.assertResultReceived(Callback.SUCCESS);
@@ -486,6 +497,7 @@
// Assert nothing has happened yet.
verifyNoInstallerCallsMade();
callback.assertNoResultReceived();
+ verifyNoIntentsSent();
// Set up the installer.
configureStageInstallExpectation(TimeZoneDistroInstaller.INSTALL_FAIL_VALIDATION_ERROR);
@@ -502,6 +514,9 @@
boolean expectedSuccess = true;
verifyPackageTrackerCalled(token, expectedSuccess);
+ // Nothing should be staged, so no intents sent.
+ verifyNoIntentsSent();
+
// Check the callback was received.
callback.assertResultReceived(Callback.ERROR_INSTALL_VALIDATION_ERROR);
}
@@ -529,6 +544,7 @@
mFakeExecutor.assertNothingQueued();
verifyNoInstallerCallsMade();
verifyNoPackageTrackerCallsMade();
+ verifyNoIntentsSent();
}
@Test
@@ -548,6 +564,7 @@
mFakeExecutor.assertNothingQueued();
verifyNoInstallerCallsMade();
verifyNoPackageTrackerCallsMade();
+ verifyNoIntentsSent();
}
@Test
@@ -566,6 +583,7 @@
mFakeExecutor.assertNothingQueued();
verifyNoInstallerCallsMade();
verifyNoPackageTrackerCallsMade();
+ verifyNoIntentsSent();
}
@Test
@@ -585,6 +603,7 @@
callback.assertNoResultReceived();
verifyNoInstallerCallsMade();
verifyNoPackageTrackerCallsMade();
+ verifyNoIntentsSent();
// Set up the installer.
configureStageUninstallExpectation(TimeZoneDistroInstaller.UNINSTALL_SUCCESS);
@@ -595,6 +614,7 @@
// Verify the expected calls were made to other components.
verifyStageUninstallCalled();
verifyPackageTrackerCalled(token, true /* success */);
+ verifyStagedOperationIntentSent();
// Check the callback was called.
callback.assertResultReceived(Callback.SUCCESS);
@@ -617,6 +637,7 @@
callback.assertNoResultReceived();
verifyNoInstallerCallsMade();
verifyNoPackageTrackerCallsMade();
+ verifyNoIntentsSent();
// Set up the installer.
configureStageUninstallExpectation(TimeZoneDistroInstaller.UNINSTALL_NOTHING_INSTALLED);
@@ -627,6 +648,7 @@
// Verify the expected calls were made to other components.
verifyStageUninstallCalled();
verifyPackageTrackerCalled(token, true /* success */);
+ verifyUnstagedOperationIntentSent();
// Check the callback was called.
callback.assertResultReceived(Callback.SUCCESS);
@@ -645,6 +667,7 @@
// Assert nothing has happened yet.
verifyNoInstallerCallsMade();
callback.assertNoResultReceived();
+ verifyNoIntentsSent();
// Set up the installer.
configureStageUninstallExpectation(TimeZoneDistroInstaller.UNINSTALL_SUCCESS);
@@ -655,6 +678,7 @@
// Verify the expected calls were made to other components.
verifyStageUninstallCalled();
verifyPackageTrackerCalled(null /* expectedToken */, true /* success */);
+ verifyStagedOperationIntentSent();
// Check the callback was received.
callback.assertResultReceived(Callback.SUCCESS);
@@ -676,6 +700,7 @@
// Assert nothing has happened yet.
verifyNoInstallerCallsMade();
callback.assertNoResultReceived();
+ verifyNoIntentsSent();
// Set up the installer.
configureStageUninstallExpectation(TimeZoneDistroInstaller.UNINSTALL_FAIL);
@@ -686,6 +711,7 @@
// Verify the expected calls were made to other components.
verifyStageUninstallCalled();
verifyPackageTrackerCalled(token, false /* success */);
+ verifyNoIntentsSent();
// Check the callback was received.
callback.assertResultReceived(Callback.ERROR_UNKNOWN_FAILURE);
@@ -714,6 +740,7 @@
// Verify the expected calls were made to other components.
verifyPackageTrackerCalled(token, true /* success */);
verifyNoInstallerCallsMade();
+ verifyNoIntentsSent();
}
@Test
@@ -734,6 +761,7 @@
// Assert no other calls were made.
verifyNoInstallerCallsMade();
verifyNoPackageTrackerCallsMade();
+ verifyNoIntentsSent();
}
@Test
@@ -749,6 +777,7 @@
// Assert everything required was done.
verifyNoInstallerCallsMade();
verifyPackageTrackerCalled(token, false /* success */);
+ verifyNoIntentsSent();
}
@Test
@@ -761,6 +790,7 @@
// Assert everything required was done.
verifyNoInstallerCallsMade();
verifyPackageTrackerCalled(null /* token */, true /* success */);
+ verifyNoIntentsSent();
}
@Test
@@ -865,6 +895,21 @@
reset(mMockPackageTracker);
}
+ private void verifyNoIntentsSent() {
+ verifyNoMoreInteractions(mMockIntentHelper);
+ reset(mMockIntentHelper);
+ }
+
+ private void verifyStagedOperationIntentSent() {
+ verify(mMockIntentHelper).sendTimeZoneOperationStaged();
+ reset(mMockIntentHelper);
+ }
+
+ private void verifyUnstagedOperationIntentSent() {
+ verify(mMockIntentHelper).sendTimeZoneOperationUnstaged();
+ reset(mMockIntentHelper);
+ }
+
private void configureCallerHasPermission() throws Exception {
doNothing()
.when(mMockPermissionHelper)