Allow exiting the player only after installing apks

Bug: 30280710
Bug: 30415696
Change-Id: Ida9ebd49370ee2fcda0a1fa9a84f3132e8e92b05
diff --git a/src/com/android/retaildemo/DemoPlayer.java b/src/com/android/retaildemo/DemoPlayer.java
index c7e10b6..3ebdfc8 100644
--- a/src/com/android/retaildemo/DemoPlayer.java
+++ b/src/com/android/retaildemo/DemoPlayer.java
@@ -18,16 +18,21 @@
 
 import android.app.Activity;
 import android.content.ComponentName;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
+import android.database.ContentObserver;
 import android.media.MediaPlayer;
+import android.net.Uri;
 import android.os.Bundle;
 import android.os.Environment;
+import android.os.Handler;
 import android.os.PowerManager;
 import android.os.SystemClock;
 import android.os.UserManager;
+import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.MotionEvent;
@@ -62,11 +67,20 @@
      */
     private static final long REAL_ELAPSED_TIME_OFFSET_MS = 60 * 1000; // 1 min
 
+    /**
+     * Maximum amount of time to wait for demo user to set up.
+     * After it the user can tap the screen to exit
+     */
+    private static final long READY_TO_TAP_MAX_DELAY_MS = 60 * 1000; // 1 min
+
     private PowerManager mPowerManager;
 
     private VideoView mVideoView;
     private String mDownloadPath;
     private boolean mUsingDownloadedVideo;
+    private Handler mHandler;
+    private boolean mReadyToTap;
+    private SettingsObserver mSettingsObserver;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -79,7 +93,7 @@
         setContentView(R.layout.retail_video);
 
         mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
-
+        mHandler = new Handler();
         mDownloadPath = getObbDir().getPath() + File.separator + VIDEO_FILE_NAME;
         mVideoView = (VideoView) findViewById(R.id.video_content);
 
@@ -110,6 +124,17 @@
             }
         });
 
+        mReadyToTap = isUserSetupComplete();
+        if (!mReadyToTap) {
+            // Wait for setup to finish
+            mSettingsObserver = new SettingsObserver();
+            mSettingsObserver.register();
+            // Allow user to exit the demo player if setup takes too long
+            mHandler.postDelayed(() -> {
+                mReadyToTap = true;
+            }, READY_TO_TAP_MAX_DELAY_MS);
+        }
+
         loadVideo();
     }
 
@@ -189,7 +214,7 @@
 
     @Override
     public boolean dispatchTouchEvent(MotionEvent ev) {
-        if (getSystemService(UserManager.class).isDemoUser()) {
+        if (mReadyToTap && getSystemService(UserManager.class).isDemoUser()) {
             disableSelf();
         }
         return true;
@@ -242,6 +267,15 @@
     }
 
     @Override
+    protected void onDestroy() {
+        if (mSettingsObserver != null) {
+            mSettingsObserver.unregister();
+            mSettingsObserver = null;
+        }
+        super.onDestroy();
+    }
+
+    @Override
     public void onWindowFocusChanged(boolean hasFocus) {
         if (hasFocus) {
             // Make view fullscreen.
@@ -276,4 +310,34 @@
         // Device woken up, release the wake-lock
         wakeLock.release();
     }
+
+    private class SettingsObserver extends ContentObserver {
+        private final Uri mDemoModeSetupComplete = Settings.Secure.getUriFor(
+                Settings.Secure.DEMO_USER_SETUP_COMPLETE);
+
+        SettingsObserver() {
+            super(mHandler);
+        }
+
+        void register() {
+            ContentResolver cr = getContentResolver();
+            cr.registerContentObserver(mDemoModeSetupComplete, false, this);
+        }
+
+        void unregister() {
+            getContentResolver().unregisterContentObserver(this);
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            if (mDemoModeSetupComplete.equals(uri)) {
+                mReadyToTap = true;
+            }
+        }
+    }
+
+    private boolean isUserSetupComplete() {
+        return "1".equals(Settings.Secure.getString(getContentResolver(),
+                Settings.Secure.DEMO_USER_SETUP_COMPLETE));
+    }
 }