Snap for 5691653 from 11d344396b977ae9e699f9d5d5a49e27ac4c0dee to qt-c2f2-release

Change-Id: I7e10432daeb79429f22e5c2f3ab697f5d6a8a874
diff --git a/init-common.rc b/init-common.rc
index 0dcc3f0..f10721d 100644
--- a/init-common.rc
+++ b/init-common.rc
@@ -48,3 +48,28 @@
 
 on property:persist.vendor.charge.start.level=* && property:sys.all.modules.ready=1
     write /sys/module/htc_battery/parameters/charge_start_level ${persist.vendor.charge.start.level}
+
+# Write the dark theme magic (`theme-dark`, or 0x7468656d652d6461726b in hex string) to /misc
+# partition. Offset 12360 (0x3048) in vendor space is effectively offset 14408 (0x3848) in /misc
+# partition.
+service vendor.darkboot /vendor/bin/misc_writer --vendor-space-offset 12360 --hex-string 0x7468656d652d6461726b
+    disabled
+    oneshot
+
+# Clear the 10-byte dark theme magic in /misc partition. Offset 0 in vendor space is effectively
+# offset 2048 in /misc partition.
+service vendor.darkboot_clear /vendor/bin/misc_writer --vendor-space-offset 12360 --hex-string 0x00000000000000000000
+    disabled
+    oneshot
+
+# Set the dark boot flag on dark mode (UiModeManager.MODE_NIGHT_YES == 2).
+on property:persist.sys.theme=2
+    start vendor.darkboot
+
+# Clear the dark theme flag on light mode (UiModeManager.MODE_NIGHT_NO == 1) or auto mode
+# (UiModeManager.MODE_NIGHT_AUTO == 0).
+on property:persist.sys.theme=1
+    start vendor.darkboot_clear
+
+on property:persist.sys.theme=0
+    start vendor.darkboot_clear
diff --git a/recovery/Android.bp b/recovery/Android.bp
new file mode 100644
index 0000000..fffe848
--- /dev/null
+++ b/recovery/Android.bp
@@ -0,0 +1,38 @@
+//
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+cc_library_static {
+    name: "librecovery_ui_walleye",
+    owner: "google",
+    cflags: [
+        "-Wall",
+        "-Wextra",
+        "-Werror",
+        "-pedantic",
+    ],
+    srcs: [
+        "recovery_ui.cpp",
+    ],
+
+    static_libs: [
+        "libbootloader_message",
+    ],
+
+    shared_libs: [
+        "libbase",
+        "librecovery_ui",
+    ],
+}
diff --git a/recovery/recovery_ui.cpp b/recovery/recovery_ui.cpp
new file mode 100644
index 0000000..0ac214f
--- /dev/null
+++ b/recovery/recovery_ui.cpp
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <string>
+
+#include <android-base/logging.h>
+#include <bootloader_message/bootloader_message.h>
+#include <recovery_ui/device.h>
+#include <recovery_ui/screen_ui.h>
+
+// Wipes the provisioned flag as part of data wipe.
+static bool WipeProvisionedFlag() {
+    // Must be consistent with the one in init.hardware.rc (10-byte `theme-dark`). The magic is at
+    // 0x3048 in vendor space, or (0x800 + 0x3048) since the start of /misc.
+    const std::string wipe_str(10, '\x00');
+    constexpr size_t kProvisionedFlagOffsetInVendorSpace = 0x3048;
+    if (std::string err; !WriteMiscPartitionVendorSpace(
+            wipe_str.data(), wipe_str.size(), kProvisionedFlagOffsetInVendorSpace, &err)) {
+        LOG(ERROR) << "Failed to write wipe string: " << err;
+        return false;
+    }
+    LOG(INFO) << "Provisioned flag wiped successful";
+    return true;
+}
+
+class WalleyeDevice : public Device {
+  public:
+    WalleyeDevice(ScreenRecoveryUI* ui) : Device(ui) {}
+
+    // Hook to wipe user data not stored in /data.
+    bool PostWipeData() override {
+        // Try to do everything but report a failure if anything wasn't successful.
+        bool total_success = true;
+        auto ui = GetUI();
+        ui->Print("Wiping provisioned flag...\n");
+        if (!WipeProvisionedFlag()) {
+            total_success = false;
+        }
+        return total_success;
+    }
+};
+
+Device* make_device() {
+    return new WalleyeDevice(new ScreenRecoveryUI);
+}
diff --git a/walleye/BoardConfig.mk b/walleye/BoardConfig.mk
index cf98414..88b4896 100644
--- a/walleye/BoardConfig.mk
+++ b/walleye/BoardConfig.mk
@@ -35,3 +35,8 @@
 BOARD_KERNEL_CMDLINE += androidboot.dtbo_idx=3
 
 BOARD_EXT4_SHARE_DUP_BLOCKS := true
+
+TARGET_RECOVERY_UI_LIB := \
+    librecovery_ui_walleye \
+    libbootloader_message \
+    libfstab