From 8803ae7823e10126c83abdbbf88507b99b67a98a Mon Sep 17 00:00:00 2001 From: Sunny Shao Date: Fri, 29 Mar 2024 08:32:22 +0800 Subject: [PATCH] Fix the action bar shows up problem - Hide the internal action bar. - Refine the Utils.setupEdgeToEdge API. - Rollback the testcases. Bug: 328622648 Fixes: 331308440 Test: atest com.android.settings.UtilsTest SettingsActivityTest Change-Id: I7dfbc93def3e772b57bf06b8276315cee7402a9c --- AndroidManifest.xml | 2 +- src/com/android/settings/Utils.java | 25 +++++++++---------- .../settings/core/SettingsBaseActivity.java | 20 ++++++++++++++- .../settings/SettingsActivityTest.java | 10 -------- .../src/com/android/settings/UtilsTest.java | 15 +++++++++++ 5 files changed, 47 insertions(+), 25 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 194d01706a7..923f5ae5ccf 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -152,7 +152,7 @@ android:name=".SettingsApplication" android:label="@string/settings_label" android:icon="@drawable/ic_launcher_settings" - android:theme="@style/Theme.Settings.NoActionBar" + android:theme="@style/Theme.Settings" android:hardwareAccelerated="true" android:requiredForAllUsers="true" android:supportsRtl="true" diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java index 6a20d75c14e..923c7888487 100644 --- a/src/com/android/settings/Utils.java +++ b/src/com/android/settings/Utils.java @@ -1385,20 +1385,19 @@ public final class Utils extends com.android.settingslib.Utils { * @param activity the Activity need to setup the edge to edge feature. */ public static void setupEdgeToEdge(@NonNull FragmentActivity activity) { - if (com.android.window.flags.Flags.enforceEdgeToEdge()) { - ViewCompat.setOnApplyWindowInsetsListener(activity.findViewById(android.R.id.content), - (v, windowInsets) -> { - Insets insets = windowInsets.getInsets( - WindowInsetsCompat.Type.systemBars() - | WindowInsetsCompat.Type.ime()); - // Apply the insets paddings to the view. - v.setPadding(insets.left, insets.top, insets.right, insets.bottom); + ViewCompat.setOnApplyWindowInsetsListener(activity.findViewById(android.R.id.content), + (v, windowInsets) -> { + Insets insets = windowInsets.getInsets( + WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.ime()); + int statusBarHeight = activity.getWindow().getDecorView().getRootWindowInsets() + .getInsets(WindowInsetsCompat.Type.statusBars()).top; + // Apply the insets paddings to the view. + v.setPadding(insets.left, statusBarHeight, insets.right, insets.bottom); - // Return CONSUMED if you don't want the window insets to keep being - // passed down to descendant views. - return WindowInsetsCompat.CONSUMED; - }); - } + // Return CONSUMED if you don't want the window insets to keep being + // passed down to descendant views. + return WindowInsetsCompat.CONSUMED; + }); } private static FaceManager.RemovalCallback faceManagerRemovalCallback(int userId) { diff --git a/src/com/android/settings/core/SettingsBaseActivity.java b/src/com/android/settings/core/SettingsBaseActivity.java index c282498a6a4..c9530aba850 100644 --- a/src/com/android/settings/core/SettingsBaseActivity.java +++ b/src/com/android/settings/core/SettingsBaseActivity.java @@ -46,6 +46,7 @@ import com.android.settings.Utils; import com.android.settings.core.CategoryMixin.CategoryHandler; import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin; import com.android.settingslib.transition.SettingsTransitionHelper.TransitionType; +import com.android.window.flags.Flags; import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.appbar.CollapsingToolbarLayout; @@ -92,8 +93,11 @@ public class SettingsBaseActivity extends FragmentActivity implements CategoryHa Log.w(TAG, "Devices lock task mode pinned."); finish(); } - Utils.setupEdgeToEdge(this); final long startTime = System.currentTimeMillis(); + if (Flags.enforceEdgeToEdge()) { + Utils.setupEdgeToEdge(this); + hideInternalActionBar(); + } getLifecycle().addObserver(new HideNonSystemOverlayMixin(this)); TextAppearanceConfig.setShouldLoadFontSynchronously(true); @@ -291,4 +295,18 @@ public class SettingsBaseActivity extends FragmentActivity implements CategoryHa } return intent.getIntExtra(EXTRA_PAGE_TRANSITION_TYPE, TransitionType.TRANSITION_NONE); } + + /** + * This internal ActionBar will be appeared automatically when the + * Utils.setupEdgeToEdge is invoked. + * + * @see Utils.setupEdgeToEdge + */ + private void hideInternalActionBar() { + final View actionBarContainer = + findViewById(com.android.internal.R.id.action_bar_container); + if (actionBarContainer != null) { + actionBarContainer.setVisibility(View.GONE); + } + } } diff --git a/tests/robotests/src/com/android/settings/SettingsActivityTest.java b/tests/robotests/src/com/android/settings/SettingsActivityTest.java index a8796952761..89f84496a6e 100644 --- a/tests/robotests/src/com/android/settings/SettingsActivityTest.java +++ b/tests/robotests/src/com/android/settings/SettingsActivityTest.java @@ -27,7 +27,6 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import android.app.ActionBar; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; @@ -115,15 +114,6 @@ public class SettingsActivityTest { assertThat(((ListenerFragment) fragments.get(1)).mOnActivityResultCalled).isTrue(); } - @Test - public void getActionBar_hasNoActionBar() { - final SettingsActivity activity = Robolectric.buildActivity(SettingsActivity.class).get(); - - final ActionBar actionBar = activity.getActionBar(); - - assertThat(actionBar).isNull(); - } - public static class ListenerFragment extends Fragment implements OnActivityResultListener { private boolean mOnActivityResultCalled; diff --git a/tests/robotests/src/com/android/settings/UtilsTest.java b/tests/robotests/src/com/android/settings/UtilsTest.java index a4b0105e218..0c555da2075 100644 --- a/tests/robotests/src/com/android/settings/UtilsTest.java +++ b/tests/robotests/src/com/android/settings/UtilsTest.java @@ -30,6 +30,7 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.app.ActionBar; import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyResourcesManager; import android.content.ComponentName; @@ -55,9 +56,11 @@ import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; import android.util.IconDrawableFactory; import android.widget.EditText; +import android.widget.ScrollView; import android.widget.TextView; import androidx.core.graphics.drawable.IconCompat; +import androidx.fragment.app.FragmentActivity; import com.android.internal.widget.LockPatternUtils; import com.android.settings.testutils.shadow.ShadowLockPatternUtils; @@ -68,6 +71,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; @@ -266,6 +270,17 @@ public class UtilsTest { Utils.setActionBarShadowAnimation(null, null, null); } + @Test + public void setActionBarShadowAnimation_shouldSetElevationToZero() { + final FragmentActivity activity = Robolectric.setupActivity(FragmentActivity.class); + final ActionBar actionBar = activity.getActionBar(); + + Utils.setActionBarShadowAnimation(activity, activity.getLifecycle(), + new ScrollView(mContext)); + + assertThat(actionBar.getElevation()).isEqualTo(0.f); + } + @Test public void isSettingsIntelligence_IsSI_returnTrue() { final String siPackageName = mContext.getString(