From 423dcce338c06091d786851d3307f7afdb84c3ad Mon Sep 17 00:00:00 2001 From: Sandra Alfaro Date: Tue, 2 Jun 2020 15:18:09 -0700 Subject: Update SUW Lib with OEM customizable boolean for immersive mode Bug: 154503148 Test: CarSEtupWizardUiUtilsTest Change-Id: I91cb4325268fa037b3b86588c69b9c26056eb7e9 (cherry picked from commit cdb963e0122e53940a3ae5a24b7d6d2418b2dc09) --- .../setupwizardlib/BaseSetupWizardActivity.java | 10 ++- .../car/setupwizardlib/partner/PartnerConfig.java | 3 + .../setupwizardlib/partner/PartnerConfigKey.java | 3 + .../setupwizardlib/util/CarSetupWizardUiUtils.java | 78 +++++++++++++++++++++- .../util/CarSetupWizardUiUtilsTest.java | 33 ++++++++- 5 files changed, 123 insertions(+), 4 deletions(-) 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.annotation.VisibleForTesting; 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 @@ abstract class BaseSetupWizardActivity extends FragmentActivity { 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 @@ abstract class BaseSetupWizardActivity extends FragmentActivity { 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 @@ package com.android.car.setupwizardlib.partner; /** 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 @@ import java.lang.annotation.RetentionPolicy; @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 @@ import java.lang.annotation.RetentionPolicy; /** 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 @@ import androidx.core.util.Preconditions; 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); @@ -44,11 +47,50 @@ public final class CarSetupWizardUiUtils { enableImmersiveMode(activity.getWindow()); } + /** + * 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 @@ public final class CarSetupWizardUiUtils { // 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 @@ -72,11 +114,37 @@ public final class CarSetupWizardUiUtils { | View.SYSTEM_UI_FLAG_FULLSCREEN); } + /** + * 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 @@ public final class CarSetupWizardUiUtils { 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 @@ import org.robolectric.RobolectricTestRunner; 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 @@ public class CarSetupWizardUiUtilsTest { 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 @@ public class CarSetupWizardUiUtilsTest { 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); + } + } -- cgit v1.2.3