Merge "screen_ui: Merge Menu::Start() into its ctor."
diff --git a/updater_sample/res/raw/sample.json b/updater_sample/res/raw/sample.json
index 03335cc..b6f4cdc 100644
--- a/updater_sample/res/raw/sample.json
+++ b/updater_sample/res/raw/sample.json
@@ -1,18 +1,18 @@
 {
     "__name": "name will be visible on UI",
-    "__url": "https:// or file:// uri to update file (zip, xz, ...)",
-    "__type": "NON_STREAMING (from local file) OR STREAMING (on the fly)",
+    "__url": "https:// or file:// uri to update package (zip, xz, ...)",
+    "__type": "NON_STREAMING (from a local file) OR STREAMING (on the fly)",
     "name": "SAMPLE-cake-release BUILD-12345",
-    "url": "file:///data/builds/android-update.zip",
-    "type": "NON_STREAMING",
-    "streaming_metadata": {
+    "url": "http://foo.bar/builds/ota-001.zip",
+    "ab_install_type": "NON_STREAMING",
+    "ab_streaming_metadata": {
         "__": "streaming_metadata is required only for streaming update",
         "__property_files": "name, offset and size of files",
         "property_files": [
             {
-                "__filename": "payload.bin and payload_properties.txt are required",
-                "__offset": "defines beginning of update data in archive",
-                "__size": "size of the update data in archive",
+                "__filename": "name of the file in package",
+                "__offset": "defines beginning of the file in package",
+                "__size": "size of the file in package",
                 "filename": "payload.bin",
                 "offset": 531,
                 "size": 5012323
diff --git a/updater_sample/src/com/example/android/systemupdatersample/ui/MainActivity.java b/updater_sample/src/com/example/android/systemupdatersample/ui/MainActivity.java
index 8507a9e..9f1e5d1 100644
--- a/updater_sample/src/com/example/android/systemupdatersample/ui/MainActivity.java
+++ b/updater_sample/src/com/example/android/systemupdatersample/ui/MainActivity.java
@@ -297,7 +297,7 @@
     }
 
     /**
-     * Helper class to delegate UpdateEngine callbacks to MainActivity
+     * Helper class to delegate {@code update_engine} callbacks to MainActivity
      */
     class UpdateEngineCallbackImpl extends UpdateEngineCallback {
         @Override
diff --git a/updater_sample/src/com/example/android/systemupdatersample/util/PackagePropertyFiles.java b/updater_sample/src/com/example/android/systemupdatersample/util/PackageFiles.java
similarity index 60%
rename from updater_sample/src/com/example/android/systemupdatersample/util/PackagePropertyFiles.java
rename to updater_sample/src/com/example/android/systemupdatersample/util/PackageFiles.java
index 3988b59..b485234 100644
--- a/updater_sample/src/com/example/android/systemupdatersample/util/PackagePropertyFiles.java
+++ b/updater_sample/src/com/example/android/systemupdatersample/util/PackageFiles.java
@@ -16,13 +16,30 @@
 
 package com.example.android.systemupdatersample.util;
 
-/** Utility class for property files in a package. */
-public final class PackagePropertyFiles {
+/** Utility class for an OTA package. */
+public final class PackageFiles {
 
+    /**
+     * Directory used to perform updates.
+     */
+    public static final String OTA_PACKAGE_DIR = "/data/ota_package";
+
+    /**
+     * update payload, it will be passed to {@code UpdateEngine#applyPayload}.
+     */
     public static final String PAYLOAD_BINARY_FILE_NAME = "payload.bin";
 
-    public static final String PAYLOAD_HEADER_FILE_NAME = "payload_header.bin";
-
+    /**
+     * Currently, when calling {@code UpdateEngine#applyPayload} to perform actions
+     * that don't require network access (e.g. change slot), update_engine still
+     * talks to the server to download/verify file.
+     * {@code update_engine} might throw error when rebooting if {@code UpdateEngine#applyPayload}
+     * is not supplied right headers and tokens.
+     * This behavior might change in future android versions.
+     *
+     * To avoid extra network request in {@code update_engine}, this file has to be
+     * downloaded and put in {@code OTA_PACKAGE_DIR}.
+     */
     public static final String PAYLOAD_METADATA_FILE_NAME = "payload_metadata.bin";
 
     public static final String PAYLOAD_PROPERTIES_FILE_NAME = "payload_properties.txt";
@@ -38,5 +55,5 @@
      */
     public static final String COMPATIBILITY_ZIP_FILE_NAME = "compatibility.zip";
 
-    private PackagePropertyFiles() {}
+    private PackageFiles() {}
 }
diff --git a/updater_sample/src/com/example/android/systemupdatersample/util/PayloadSpecs.java b/updater_sample/src/com/example/android/systemupdatersample/util/PayloadSpecs.java
index 43c8d75..4db448a 100644
--- a/updater_sample/src/com/example/android/systemupdatersample/util/PayloadSpecs.java
+++ b/updater_sample/src/com/example/android/systemupdatersample/util/PayloadSpecs.java
@@ -16,9 +16,6 @@
 
 package com.example.android.systemupdatersample.util;
 
-import android.annotation.TargetApi;
-import android.os.Build;
-
 import com.example.android.systemupdatersample.PayloadSpec;
 
 import java.io.BufferedReader;
@@ -26,6 +23,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Enumeration;
@@ -34,7 +32,6 @@
 import java.util.zip.ZipFile;
 
 /** The helper class that creates {@link PayloadSpec}. */
-@TargetApi(Build.VERSION_CODES.N)
 public final class PayloadSpecs {
 
     /**
@@ -68,14 +65,14 @@
                 }
 
                 long length = entry.getCompressedSize();
-                if (PackagePropertyFiles.PAYLOAD_BINARY_FILE_NAME.equals(name)) {
+                if (PackageFiles.PAYLOAD_BINARY_FILE_NAME.equals(name)) {
                     if (entry.getMethod() != ZipEntry.STORED) {
                         throw new IOException("Invalid compression method.");
                     }
                     payloadFound = true;
                     payloadOffset = offset;
                     payloadSize = length;
-                } else if (PackagePropertyFiles.PAYLOAD_PROPERTIES_FILE_NAME.equals(name)) {
+                } else if (PackageFiles.PAYLOAD_PROPERTIES_FILE_NAME.equals(name)) {
                     InputStream inputStream = zip.getInputStream(entry);
                     if (inputStream != null) {
                         BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
@@ -101,6 +98,21 @@
     }
 
     /**
+     * Creates a {@link PayloadSpec} for streaming update.
+     */
+    public static PayloadSpec forStreaming(String updateUrl,
+                                           long offset,
+                                           long size,
+                                           File propertiesFile) throws IOException {
+        return PayloadSpec.newBuilder()
+                .url(updateUrl)
+                .offset(offset)
+                .size(size)
+                .properties(Files.readAllLines(propertiesFile.toPath()))
+                .build();
+    }
+
+    /**
      * Converts an {@link PayloadSpec} to a string.
      */
     public static String toString(PayloadSpec payloadSpec) {
diff --git a/updater_sample/src/com/example/android/systemupdatersample/util/UpdateEngineErrorCodes.java b/updater_sample/src/com/example/android/systemupdatersample/util/UpdateEngineErrorCodes.java
index e63da62..6d319c5 100644
--- a/updater_sample/src/com/example/android/systemupdatersample/util/UpdateEngineErrorCodes.java
+++ b/updater_sample/src/com/example/android/systemupdatersample/util/UpdateEngineErrorCodes.java
@@ -50,6 +50,7 @@
         CODE_TO_NAME_MAP.put(10, "PAYLOAD_HASH_MISMATCH_ERROR");
         CODE_TO_NAME_MAP.put(11, "PAYLOAD_SIZE_MISMATCH_ERROR");
         CODE_TO_NAME_MAP.put(12, "DOWNLOAD_PAYLOAD_VERIFICATION_ERROR");
+        CODE_TO_NAME_MAP.put(15, "NEW_ROOTFS_VERIFICATION_ERROR");
         CODE_TO_NAME_MAP.put(20, "DOWNLOAD_STATE_INITIALIZATION_ERROR");
         CODE_TO_NAME_MAP.put(48, "USER_CANCELLED");
         CODE_TO_NAME_MAP.put(52, "UPDATED_BUT_NOT_ACTIVE");
diff --git a/updater_sample/src/com/example/android/systemupdatersample/util/UpdateEngineStatuses.java b/updater_sample/src/com/example/android/systemupdatersample/util/UpdateEngineStatuses.java
index 6203b20..a96f19d 100644
--- a/updater_sample/src/com/example/android/systemupdatersample/util/UpdateEngineStatuses.java
+++ b/updater_sample/src/com/example/android/systemupdatersample/util/UpdateEngineStatuses.java
@@ -20,7 +20,7 @@
 
 /**
  * Helper class to work with update_engine's error codes.
- * Many error codes are defined in  {@link UpdateEngine.UpdateStatusConstants},
+ * Many error codes are defined in  {@code UpdateEngine.UpdateStatusConstants},
  * but you can find more in system/update_engine/common/error_code.h.
  */
 public final class UpdateEngineStatuses {
diff --git a/updater_sample/tests/res/raw/update_config_stream_001.json b/updater_sample/tests/res/raw/update_config_stream_001.json
index a9afd33..15127cf 100644
--- a/updater_sample/tests/res/raw/update_config_stream_001.json
+++ b/updater_sample/tests/res/raw/update_config_stream_001.json
@@ -6,8 +6,8 @@
         "property_files": [
             {
                 "filename": "payload.bin",
-                "offset": 531,
-                "size": 5012323
+                "offset": 195,
+                "size": 8
             }
         ]
     }
diff --git a/updater_sample/tests/src/com/example/android/systemupdatersample/util/FileDownloaderTest.java b/updater_sample/tests/src/com/example/android/systemupdatersample/util/FileDownloaderTest.java
index df47c8c..dc7ec09 100644
--- a/updater_sample/tests/src/com/example/android/systemupdatersample/util/FileDownloaderTest.java
+++ b/updater_sample/tests/src/com/example/android/systemupdatersample/util/FileDownloaderTest.java
@@ -73,7 +73,7 @@
         FileDownloader downloader = new FileDownloader(url, 160, 8, outFile);
         downloader.download();
         String downloadedContent = String.join("\n", Files.readAllLines(outFile.toPath()));
-        // Look at tools/create_test_ota.py
+        // archive contains text files with uppercase filenames
         assertEquals("CARE_MAP", downloadedContent);
     }
 
diff --git a/updater_sample/tests/src/com/example/android/systemupdatersample/util/PayloadSpecsTest.java b/updater_sample/tests/src/com/example/android/systemupdatersample/util/PayloadSpecsTest.java
index 6f06ca3..c13ba55 100644
--- a/updater_sample/tests/src/com/example/android/systemupdatersample/util/PayloadSpecsTest.java
+++ b/updater_sample/tests/src/com/example/android/systemupdatersample/util/PayloadSpecsTest.java
@@ -16,8 +16,8 @@
 
 package com.example.android.systemupdatersample.util;
 
-import static com.example.android.systemupdatersample.util.PackagePropertyFiles.PAYLOAD_BINARY_FILE_NAME;
-import static com.example.android.systemupdatersample.util.PackagePropertyFiles.PAYLOAD_PROPERTIES_FILE_NAME;
+import static com.example.android.systemupdatersample.util.PackageFiles.PAYLOAD_BINARY_FILE_NAME;
+import static com.example.android.systemupdatersample.util.PackageFiles.PAYLOAD_PROPERTIES_FILE_NAME;
 
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;