Write system property persist.sys.provisioned

When the device is provisioned, write a system property
to indicate device provisioned.

Test: manual
Bug: 131702833
Change-Id: I7ade97770658b3aa67d642446dd66c410ec4c5a3
diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp
index 8e7277c..16af071 100644
--- a/cmds/bootanimation/BootAnimation.cpp
+++ b/cmds/bootanimation/BootAnimation.cpp
@@ -66,6 +66,7 @@
 namespace android {
 
 static const char OEM_BOOTANIMATION_FILE[] = "/oem/media/bootanimation.zip";
+static const char PRODUCT_BOOTANIMATION_DARK_FILE[] = "/product/media/bootanimation-dark.zip";
 static const char PRODUCT_BOOTANIMATION_FILE[] = "/product/media/bootanimation.zip";
 static const char SYSTEM_BOOTANIMATION_FILE[] = "/system/media/bootanimation.zip";
 static const char PRODUCT_ENCRYPTED_BOOTANIMATION_FILE[] = "/product/media/bootanimation-encrypted.zip";
@@ -141,7 +142,6 @@
     return mSession;
 }
 
-
 void BootAnimation::binderDied(const wp<IBinder>&)
 {
     // woah, surfaceflinger died!
@@ -355,8 +355,11 @@
             }
         }
     }
+
+    const bool playDarkAnim = android::base::GetIntProperty("ro.boot.theme", 0) == 1;
     static const char* bootFiles[] =
-        {PRODUCT_BOOTANIMATION_FILE, OEM_BOOTANIMATION_FILE, SYSTEM_BOOTANIMATION_FILE};
+        {playDarkAnim ? PRODUCT_BOOTANIMATION_DARK_FILE : PRODUCT_BOOTANIMATION_FILE,
+         OEM_BOOTANIMATION_FILE, SYSTEM_BOOTANIMATION_FILE};
     static const char* shutdownFiles[] =
         {PRODUCT_SHUTDOWNANIMATION_FILE, OEM_SHUTDOWNANIMATION_FILE, SYSTEM_SHUTDOWNANIMATION_FILE};
 
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index ea71a3b..2d38bcf 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -406,6 +406,9 @@
      */
     public static final int TOP_APP_PRIORITY_BOOST = -10;
 
+    private static final String SYSTEM_PROPERTY_DEVICE_PROVISIONED =
+            "persist.sys.device_provisioned";
+
     static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityManagerService" : TAG_AM;
     static final String TAG_BACKUP = TAG + POSTFIX_BACKUP;
     private static final String TAG_BROADCAST = TAG + POSTFIX_BROADCAST;
@@ -8893,6 +8896,8 @@
 
         mAtmInternal.updateTopComponentForFactoryTest();
 
+        watchDeviceProvisioning(mContext);
+
         retrieveSettings();
         mUgmInternal.onSystemReady();
 
@@ -9008,6 +9013,32 @@
         }
     }
 
+    private void watchDeviceProvisioning(Context context) {
+        // setting system property based on whether device is provisioned
+
+        if (isDeviceProvisioned(context)) {
+            SystemProperties.set(SYSTEM_PROPERTY_DEVICE_PROVISIONED, "1");
+        } else {
+            // watch for device provisioning change
+            context.getContentResolver().registerContentObserver(
+                    Settings.Global.getUriFor(Settings.Global.DEVICE_PROVISIONED), false,
+                    new ContentObserver(new Handler(Looper.getMainLooper())) {
+                        @Override
+                        public void onChange(boolean selfChange) {
+                            if (isDeviceProvisioned(context)) {
+                                SystemProperties.set(SYSTEM_PROPERTY_DEVICE_PROVISIONED, "1");
+                                context.getContentResolver().unregisterContentObserver(this);
+                            }
+                        }
+                    });
+        }
+    }
+
+    private boolean isDeviceProvisioned(Context context) {
+        return Settings.Global.getInt(context.getContentResolver(),
+                Settings.Global.DEVICE_PROVISIONED, 0) != 0;
+    }
+
     private void startBroadcastObservers() {
         for (BroadcastQueue queue : mBroadcastQueues) {
             queue.start(mContext.getContentResolver());