Track TimeZoneDistroInstaller method changes

The TimeZoneDistroInstaller now takes a TimeZoneDistro object
not bytes, which will help to hide whether the distro is in memory
or in storage. See the associated libcore change for details.

To run tests:
make -j30 FrameworksServicesTests
adb install -r -g
  "out/target/product/angler/data/app/FrameworksServicesTests/FrameworksServicesTests.apk"
adb shell am instrument -e package com.android.server.timezone -w
  com.android.frameworks.servicestests \
  "com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner"

Test: See above.
Bug: 31008728

Change-Id: Ieead1bb87b9ae196abab93342ba5c5747ca45116
diff --git a/services/core/java/com/android/server/timezone/RulesManagerService.java b/services/core/java/com/android/server/timezone/RulesManagerService.java
index bbb7782..58bdeb9 100644
--- a/services/core/java/com/android/server/timezone/RulesManagerService.java
+++ b/services/core/java/com/android/server/timezone/RulesManagerService.java
@@ -20,6 +20,7 @@
 import com.android.server.SystemService;
 import com.android.timezone.distro.DistroException;
 import com.android.timezone.distro.DistroVersion;
+import com.android.timezone.distro.TimeZoneDistro;
 import com.android.timezone.distro.StagedDistroOperation;
 
 import android.app.timezone.Callback;
@@ -224,7 +225,8 @@
             try {
                 byte[] distroBytes =
                         RulesManagerService.this.mFileDescriptorHelper.readFully(mTimeZoneDistro);
-                int installerResult = mInstaller.stageInstallWithErrorCode(distroBytes);
+                TimeZoneDistro distro = new TimeZoneDistro(distroBytes);
+                int installerResult = mInstaller.stageInstallWithErrorCode(distro);
                 int resultCode = mapInstallerResultToApiCode(installerResult);
                 sendFinishedStatus(mCallback, resultCode);
 
diff --git a/services/core/java/com/android/server/updates/TzDataInstallReceiver.java b/services/core/java/com/android/server/updates/TzDataInstallReceiver.java
index 3c73c88..2be69ac 100644
--- a/services/core/java/com/android/server/updates/TzDataInstallReceiver.java
+++ b/services/core/java/com/android/server/updates/TzDataInstallReceiver.java
@@ -16,6 +16,8 @@
 
 package com.android.server.updates;
 
+import com.android.timezone.distro.TimeZoneDistro;
+
 import android.util.Slog;
 
 import java.io.File;
@@ -46,7 +48,8 @@
 
     @Override
     protected void install(byte[] content, int version) throws IOException {
-        boolean valid = installer.install(content);
+        TimeZoneDistro distro = new TimeZoneDistro(content);
+        boolean valid = installer.install(distro);
         Slog.i(TAG, "Timezone data install valid for this device: " + valid);
         // Even if !valid, we call super.install(). Only in the event of an exception should we
         // not. If we didn't do this we could attempt to install repeatedly.
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 b6983fa..86116a9 100644
--- a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
@@ -17,6 +17,7 @@
 package com.android.server.timezone;
 
 import com.android.timezone.distro.DistroVersion;
+import com.android.timezone.distro.TimeZoneDistro;
 import com.android.timezone.distro.StagedDistroOperation;
 
 import org.junit.Before;
@@ -403,14 +404,16 @@
         verifyNoInstallerCallsMade();
         verifyNoPackageTrackerCallsMade();
 
+        TimeZoneDistro expectedDistro = new TimeZoneDistro(expectedContent);
+
         // Set up the installer.
-        configureStageInstallExpectation(expectedContent, TimeZoneDistroInstaller.INSTALL_SUCCESS);
+        configureStageInstallExpectation(expectedDistro, TimeZoneDistroInstaller.INSTALL_SUCCESS);
 
         // Simulate the async execution.
         mFakeExecutor.simulateAsyncExecutionOfLastCommand();
 
         // Verify the expected calls were made to other components.
-        verifyStageInstallCalled(expectedContent);
+        verifyStageInstallCalled(expectedDistro);
         verifyPackageTrackerCalled(token, true /* success */);
 
         // Check the callback was called.
@@ -436,14 +439,16 @@
         verifyNoInstallerCallsMade();
         callback.assertNoResultReceived();
 
+        TimeZoneDistro expectedDistro = new TimeZoneDistro(expectedContent);
+
         // Set up the installer.
-        configureStageInstallExpectation(expectedContent, TimeZoneDistroInstaller.INSTALL_SUCCESS);
+        configureStageInstallExpectation(expectedDistro, TimeZoneDistroInstaller.INSTALL_SUCCESS);
 
         // Simulate the async execution.
         mFakeExecutor.simulateAsyncExecutionOfLastCommand();
 
         // Verify the expected calls were made to other components.
-        verifyStageInstallCalled(expectedContent);
+        verifyStageInstallCalled(expectedDistro);
         verifyPackageTrackerCalled(null /* expectedToken */, true /* success */);
 
         // Check the callback was received.
@@ -471,15 +476,17 @@
         verifyNoInstallerCallsMade();
         callback.assertNoResultReceived();
 
+        TimeZoneDistro expectedDistro = new TimeZoneDistro(expectedContent);
+
         // Set up the installer.
         configureStageInstallExpectation(
-                expectedContent, TimeZoneDistroInstaller.INSTALL_FAIL_VALIDATION_ERROR);
+                expectedDistro, TimeZoneDistroInstaller.INSTALL_FAIL_VALIDATION_ERROR);
 
         // Simulate the async execution.
         mFakeExecutor.simulateAsyncExecutionOfLastCommand();
 
         // Verify the expected calls were made to other components.
-        verifyStageInstallCalled(expectedContent);
+        verifyStageInstallCalled(expectedDistro);
 
         // Validation failure is treated like a successful check: repeating it won't improve things.
         boolean expectedSuccess = true;
@@ -780,9 +787,9 @@
                 .thenThrow(new IOException("Simulated failure"));
     }
 
-    private void configureStageInstallExpectation(byte[] expectedContent, int resultCode)
+    private void configureStageInstallExpectation(TimeZoneDistro expected, int resultCode)
             throws Exception {
-        when(mMockTimeZoneDistroInstaller.stageInstallWithErrorCode(eq(expectedContent)))
+        when(mMockTimeZoneDistroInstaller.stageInstallWithErrorCode(eq(expected)))
                 .thenReturn(resultCode);
     }
 
@@ -790,8 +797,8 @@
         doReturn(success).when(mMockTimeZoneDistroInstaller).stageUninstall();
     }
 
-    private void verifyStageInstallCalled(byte[] expectedContent) throws Exception {
-        verify(mMockTimeZoneDistroInstaller).stageInstallWithErrorCode(eq(expectedContent));
+    private void verifyStageInstallCalled(TimeZoneDistro expected) throws Exception {
+        verify(mMockTimeZoneDistroInstaller).stageInstallWithErrorCode(eq(expected));
         verifyNoMoreInteractions(mMockTimeZoneDistroInstaller);
         reset(mMockTimeZoneDistroInstaller);
     }