Snap for 6582636 from 423dcce338c06091d786851d3307f7afdb84c3ad to rvc-release

Change-Id: Iec29d72a6a38e70c28e4a84680243318c6de9cbb
diff --git a/library/main/src/com/android/car/setupwizardlib/BaseSetupWizardActivity.java b/library/main/src/com/android/car/setupwizardlib/BaseSetupWizardActivity.java
index 27da4fd..3da7df6 100644
--- a/library/main/src/com/android/car/setupwizardlib/BaseSetupWizardActivity.java
+++ b/library/main/src/com/android/car/setupwizardlib/BaseSetupWizardActivity.java
@@ -28,6 +28,8 @@
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
 
+import com.android.car.setupwizardlib.partner.PartnerConfig;
+import com.android.car.setupwizardlib.partner.PartnerConfigHelper;
 import com.android.car.setupwizardlib.util.CarDrivingStateMonitor;
 import com.android.car.setupwizardlib.util.CarSetupWizardUiUtils;
 import com.android.car.setupwizardlib.util.CarWizardManagerHelper;
@@ -111,7 +113,9 @@
     protected void onStart() {
         super.onStart();
         // Must be done here so that the SystemUI is hidden when back button is clicked
-        CarSetupWizardUiUtils.hideSystemUI(this);
+        CarSetupWizardUiUtils.setWindowImmersiveMode(this.getWindow(),
+                PartnerConfigHelper.get(this).getString(
+                        this, PartnerConfig.CONFIG_IMMERSIVE_MODE));
         // Fragment commits are not allowed once the Activity's state has been saved. Once
         // onStart() has been called, the FragmentManager should now allow commits.
         mAllowFragmentCommits = true;
@@ -156,7 +160,9 @@
     public void onWindowFocusChanged(boolean hasFocus) {
         super.onWindowFocusChanged(hasFocus);
         if (hasFocus) {
-            CarSetupWizardUiUtils.hideSystemUI(this);
+            CarSetupWizardUiUtils.setWindowImmersiveMode(this.getWindow(),
+                    PartnerConfigHelper.get(this).getString(
+                            this, PartnerConfig.CONFIG_IMMERSIVE_MODE));
         }
     }
 
diff --git a/library/main/src/com/android/car/setupwizardlib/partner/PartnerConfig.java b/library/main/src/com/android/car/setupwizardlib/partner/PartnerConfig.java
index 8946b7a..00c0ea3 100644
--- a/library/main/src/com/android/car/setupwizardlib/partner/PartnerConfig.java
+++ b/library/main/src/com/android/car/setupwizardlib/partner/PartnerConfig.java
@@ -19,6 +19,9 @@
 /** Resources that can be customized by partner overlay APK. */
 public enum PartnerConfig {
 
+    CONFIG_IMMERSIVE_MODE(
+        PartnerConfigKey.KEY_IMMERSIVE_MODE, ResourceType.STRING),
+
     CONFIG_TOOLBAR_BG_COLOR(
             PartnerConfigKey.KEY_TOOLBAR_BG_COLOR, ResourceType.COLOR),
 
diff --git a/library/main/src/com/android/car/setupwizardlib/partner/PartnerConfigKey.java b/library/main/src/com/android/car/setupwizardlib/partner/PartnerConfigKey.java
index de4aa9e..32caceb 100644
--- a/library/main/src/com/android/car/setupwizardlib/partner/PartnerConfigKey.java
+++ b/library/main/src/com/android/car/setupwizardlib/partner/PartnerConfigKey.java
@@ -23,6 +23,7 @@
 
 @Retention(RetentionPolicy.SOURCE)
 @StringDef({
+        PartnerConfigKey.KEY_IMMERSIVE_MODE,
         PartnerConfigKey.KEY_TOOLBAR_BG_COLOR,
         PartnerConfigKey.KEY_TOOLBAR_BUTTON_ICON_BACK,
         PartnerConfigKey.KEY_TOOLBAR_BUTTON_FONT_FAMILY,
@@ -47,6 +48,8 @@
 /** Resource names that can be customized by partner overlay APK. */
 public @interface PartnerConfigKey {
 
+    String KEY_IMMERSIVE_MODE = "suw_compat_immersive_mode";
+
     String KEY_TOOLBAR_BG_COLOR = "suw_compat_toolbar_bg_color";
 
     String KEY_TOOLBAR_BUTTON_ICON_BACK = "suw_compat_toolbar_button_icon_back";
diff --git a/library/main/src/com/android/car/setupwizardlib/util/CarSetupWizardUiUtils.java b/library/main/src/com/android/car/setupwizardlib/util/CarSetupWizardUiUtils.java
index 5ff5929..3611931 100644
--- a/library/main/src/com/android/car/setupwizardlib/util/CarSetupWizardUiUtils.java
+++ b/library/main/src/com/android/car/setupwizardlib/util/CarSetupWizardUiUtils.java
@@ -31,6 +31,9 @@
 public final class CarSetupWizardUiUtils {
     private static final String TAG = CarSetupWizardUiUtils.class.getSimpleName();
 
+    /** Key for immersive mode value pased to 1P apps */
+    public static final String IMMERSIVE_MODE_TYPE = "immersiveModeType";
+
     /** Hide system UI */
     public static void hideSystemUI(Activity activity) {
         maybeHideSystemUI(activity);
@@ -45,10 +48,49 @@
     }
 
     /**
+    * Set the appropriate immersive mode according to immersiveModeValue
+    */
+    public static void setWindowImmersiveMode(Window window, String immersiveModeValue) {
+        Preconditions.checkNotNull(window);
+        ImmersiveModeTypes immersiveModeType;
+        try {
+            immersiveModeType = ImmersiveModeTypes.valueOf(immersiveModeValue);
+        } catch (IllegalArgumentException | NullPointerException e) {
+            Log.w(TAG, "Immersive Mode value: " + immersiveModeValue
+                    + " not valid, using IMMERSIVE");
+            immersiveModeType = ImmersiveModeTypes.IMMERSIVE;
+        }
+        Log.v(TAG, "Enable " + immersiveModeType + " mode");
+        switch (immersiveModeType) {
+            case IMMERSIVE:
+                enableImmersiveMode(window);
+                window.getDecorView().setOnSystemUiVisibilityChangeListener(
+                        visibility -> enableImmersiveMode(window));
+                break;
+            case IMMERSIVE_WITH_STATUS:
+                enableImmersiveModeWithStatus(window);
+                window.getDecorView().setOnSystemUiVisibilityChangeListener(
+                        visibility -> enableImmersiveModeWithStatus(window));
+                break;
+            case NON_IMMERSIVE:
+                disableImmersiveMode(window);
+                window.getDecorView().setOnSystemUiVisibilityChangeListener(
+                        visibility -> disableImmersiveMode(window));
+                break;
+            case SYSTEM_DEFAULT:
+                //SUW won't change the current immersive mode.
+                break;
+        }
+    }
+
+    /**
      * Enables immersive mode hiding system UI.
      *
      * @param window to apply immersive mode.
+     *
+     * @deprecated Use {@code setWindowImmersiveMode}
      */
+    @Deprecated
     public static void enableImmersiveMode(Window window) {
         if (Log.isLoggable(TAG, Log.INFO)) {
             Log.i(TAG, "enableImmersiveMode");
@@ -61,7 +103,7 @@
         // For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
         // Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
         window.getDecorView().setSystemUiVisibility(
-                View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
+                View.SYSTEM_UI_FLAG_IMMERSIVE
                         // Set the content to appear under the system bars so that the
                         // content doesn't resize when the system bars hide and show.
                         | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
@@ -73,10 +115,36 @@
     }
 
     /**
+     * Enables immersive mode hiding only navigation bar.
+     *
+     * @param window to apply immersive mode.
+     */
+    private static void enableImmersiveModeWithStatus(Window window) {
+        if (Log.isLoggable(TAG, Log.INFO)) {
+            Log.i(TAG, "enableImmersiveModeWithStatus");
+        }
+
+        Preconditions.checkNotNull(window);
+
+        // See https://developer.android.com/training/system-ui/immersive#EnableFullscreen
+        // Enables regular immersive mode.
+        window.getDecorView().setSystemUiVisibility(
+                View.SYSTEM_UI_FLAG_IMMERSIVE
+                        // Set the content to appear under the system bars so that the
+                        // content doesn't resize when the system bars hide and show.
+                        | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+                        // Hide the nav bar
+                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
+    }
+
+    /**
      * Disables immersive mode hiding system UI and restores the previous colors.
      *
      * @param window the current window instance.
+     *
+     * @deprecated Use {@code setWindowImmersiveMode}
      */
+    @Deprecated
     public static void disableImmersiveMode(Window window) {
         if (Log.isLoggable(TAG, Log.INFO)) {
             Log.i(TAG, "disableImmersiveMode");
@@ -111,6 +179,14 @@
         typedArray.recycle();
     }
 
+    /** Types of Immersive Mode supported by SUW */
+    public enum ImmersiveModeTypes {
+        IMMERSIVE,
+        IMMERSIVE_WITH_STATUS,
+        NON_IMMERSIVE,
+        SYSTEM_DEFAULT
+    }
+
     private CarSetupWizardUiUtils() {
     }
 }
diff --git a/library/main/tests/robotests/src/com/android/car/setupwizardlib/util/CarSetupWizardUiUtilsTest.java b/library/main/tests/robotests/src/com/android/car/setupwizardlib/util/CarSetupWizardUiUtilsTest.java
index f931670..5933bd4 100644
--- a/library/main/tests/robotests/src/com/android/car/setupwizardlib/util/CarSetupWizardUiUtilsTest.java
+++ b/library/main/tests/robotests/src/com/android/car/setupwizardlib/util/CarSetupWizardUiUtilsTest.java
@@ -35,7 +35,7 @@
 public class CarSetupWizardUiUtilsTest {
 
     private static final int IMMERSIVE_MODE_FLAGS =
-            View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
+            View.SYSTEM_UI_FLAG_IMMERSIVE
                     | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                     | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                     | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
@@ -45,6 +45,11 @@
     private static final int NON_IMMERSIVE_MODE_FLAGS =
             View.SYSTEM_UI_FLAG_VISIBLE;
 
+    private static final int IMMERSIVE_WITH_STATUS_MODE_FLAGS =
+            View.SYSTEM_UI_FLAG_IMMERSIVE
+                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
+
     private static final int[] RES_ID_NAV_AND_STATUS_BARS = new int[]{
             android.R.attr.statusBarColor,
             android.R.attr.navigationBarColor};
@@ -96,4 +101,30 @@
         assertThat(mWindow.getStatusBarColor())
                 .isEqualTo(EXPECTED_COLOR_STATUS_BAR);
     }
+
+    @Test
+    public void setWindow_Immersive() {
+        CarSetupWizardUiUtils.setWindowImmersiveMode(mWindow,
+                CarSetupWizardUiUtils.ImmersiveModeTypes.IMMERSIVE.toString());
+        assertThat(mWindow.getDecorView().getSystemUiVisibility())
+                .isEqualTo(IMMERSIVE_MODE_FLAGS);
+    }
+
+    @Test
+    public void setWindow_ImmersiveWithStatus() {
+        CarSetupWizardUiUtils.setWindowImmersiveMode(mWindow,
+                CarSetupWizardUiUtils.ImmersiveModeTypes.IMMERSIVE_WITH_STATUS.toString());
+        assertThat(mWindow.getDecorView().getSystemUiVisibility())
+                .isEqualTo(IMMERSIVE_WITH_STATUS_MODE_FLAGS);
+    }
+
+
+    @Test
+    public void setWindow_NonImmersive() {
+        CarSetupWizardUiUtils.setWindowImmersiveMode(mWindow,
+                CarSetupWizardUiUtils.ImmersiveModeTypes.NON_IMMERSIVE.toString());
+        assertThat(mWindow.getDecorView().getSystemUiVisibility())
+                .isEqualTo(NON_IMMERSIVE_MODE_FLAGS);
+    }
+
 }