From c4859863ec3f160b8a0eefba23484f85ad977510 Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Thu, 22 Dec 2022 16:24:41 +0800 Subject: [PATCH] SettingsLib synced by Copybara CollapsingToolbarBaseActivity - Add CollapsingToolbarAppCompatActivity to support AppCompatActivity - Adjust minSDK back to 21 MainSwitchPreference - support iconSpaceReserved before S Test: manual & robotest Change-Id: I184764c476cb0142a7f8c967fb09588d8ff6879d --- .../AndroidManifest.xml | 2 +- .../layout/collapsing_toolbar_base_layout.xml | 6 + .../CollapsingToolbarAppCompatActivity.java | 179 ++++++++++++++++++ .../CollapsingToolbarBaseActivity.java | 20 +- .../CollapsingToolbarDelegate.java | 77 +++++++- .../widget/CollapsingCoordinatorLayout.java | 12 +- .../layout/settingslib_main_switch_bar.xml | 7 +- .../res/values-sw600dp/dmiens.xml | 22 --- .../res/values-sw720dp-land/dmiens.xml | 23 --- .../res/values-sw720dp/dmiens.xml | 23 --- .../res/values/dimens.xml | 2 +- .../settingslib/widget/MainSwitchBar.java | 13 ++ .../widget/MainSwitchPreference.java | 24 ++- .../res/values-v31/style_preference.xml | 6 + .../SettingsTheme/res/values/styles.xml | 6 +- 15 files changed, 330 insertions(+), 92 deletions(-) create mode 100644 packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarAppCompatActivity.java delete mode 100644 packages/SettingsLib/MainSwitchPreference/res/values-sw600dp/dmiens.xml delete mode 100644 packages/SettingsLib/MainSwitchPreference/res/values-sw720dp-land/dmiens.xml delete mode 100644 packages/SettingsLib/MainSwitchPreference/res/values-sw720dp/dmiens.xml diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/AndroidManifest.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/AndroidManifest.xml index 244b367423a47..51fc7ed646602 100644 --- a/packages/SettingsLib/CollapsingToolbarBaseActivity/AndroidManifest.xml +++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/AndroidManifest.xml @@ -18,6 +18,6 @@ - + diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout/collapsing_toolbar_base_layout.xml b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout/collapsing_toolbar_base_layout.xml index c799b99628286..02f69f679a46a 100644 --- a/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout/collapsing_toolbar_base_layout.xml +++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/res/layout/collapsing_toolbar_base_layout.xml @@ -29,6 +29,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="?android:attr/actionBarTheme" /> + 0 && !BuildCompatUtils.isAtLeastS()) { + super.setContentView(mCustomizeLayoutResId); + return; + } + + View view = getToolbarDelegate().onCreateView(getLayoutInflater(), null, this); + super.setContentView(view); + } + + @Override + public void setContentView(int layoutResID) { + final ViewGroup parent = (mToolbardelegate == null) ? findViewById(R.id.content_frame) + : mToolbardelegate.getContentFrameLayout(); + if (parent != null) { + parent.removeAllViews(); + } + LayoutInflater.from(this).inflate(layoutResID, parent); + } + + @Override + public void setContentView(View view) { + final ViewGroup parent = (mToolbardelegate == null) ? findViewById(R.id.content_frame) + : mToolbardelegate.getContentFrameLayout(); + if (parent != null) { + parent.addView(view); + } + } + + @Override + public void setContentView(View view, ViewGroup.LayoutParams params) { + final ViewGroup parent = (mToolbardelegate == null) ? findViewById(R.id.content_frame) + : mToolbardelegate.getContentFrameLayout(); + if (parent != null) { + parent.addView(view, params); + } + } + + /** + * This method allows an activity to replace the default layout with a customize layout. Notice + * that it will no longer apply the features being provided by this class when this method + * gets called. + */ + protected void setCustomizeContentView(int layoutResId) { + mCustomizeLayoutResId = layoutResId; + } + + @Override + public void setTitle(CharSequence title) { + getToolbarDelegate().setTitle(title); + } + + @Override + public void setTitle(int titleId) { + setTitle(getText(titleId)); + } + + @Override + public boolean onSupportNavigateUp() { + if (getSupportFragmentManager().getBackStackEntryCount() > 0) { + getSupportFragmentManager().popBackStackImmediate(); + } + + // Closes the activity if there is no fragment inside the stack. Otherwise the activity will + // has a blank screen since there is no any fragment. + if (getSupportFragmentManager().getBackStackEntryCount() == 0) { + finishAfterTransition(); + } + return true; + } + + @Override + public void onBackPressed() { + super.onBackPressed(); + + // Closes the activity if there is no fragment inside the stack. Otherwise the activity will + // has a blank screen since there is no any fragment. onBackPressed() in Activity.java only + // handles popBackStackImmediate(). This will close activity to avoid a blank screen. + if (getSupportFragmentManager().getBackStackEntryCount() == 0) { + finishAfterTransition(); + } + } + + /** + * Returns an instance of collapsing toolbar. + */ + @Nullable + public CollapsingToolbarLayout getCollapsingToolbarLayout() { + return getToolbarDelegate().getCollapsingToolbarLayout(); + } + + /** + * Return an instance of app bar. + */ + @Nullable + public AppBarLayout getAppBarLayout() { + return getToolbarDelegate().getAppBarLayout(); + } + + private CollapsingToolbarDelegate getToolbarDelegate() { + if (mToolbardelegate == null) { + mToolbardelegate = new CollapsingToolbarDelegate(new DelegateCallback()); + } + return mToolbardelegate; + } +} diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java index 8c8b47875becb..01f92c4fa7b1e 100644 --- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java +++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarBaseActivity.java @@ -117,12 +117,30 @@ public class CollapsingToolbarBaseActivity extends FragmentActivity { @Override public boolean onNavigateUp() { - if (!super.onNavigateUp()) { + if (getSupportFragmentManager().getBackStackEntryCount() > 0) { + getSupportFragmentManager().popBackStackImmediate(); + } + + // Closes the activity if there is no fragment inside the stack. Otherwise the activity will + // has a blank screen since there is no any fragment. + if (getSupportFragmentManager().getBackStackEntryCount() == 0) { finishAfterTransition(); } return true; } + @Override + public void onBackPressed() { + super.onBackPressed(); + + // Closes the activity if there is no fragment inside the stack. Otherwise the activity will + // has a blank screen since there is no any fragment. onBackPressed() in Activity.java only + // handles popBackStackImmediate(). This will close activity to avoid a blank screen. + if (getSupportFragmentManager().getBackStackEntryCount() == 0) { + finishAfterTransition(); + } + } + /** * Returns an instance of collapsing toolbar. */ diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarDelegate.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarDelegate.java index 01698b7937aaa..1c2288acd3585 100644 --- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarDelegate.java +++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/CollapsingToolbarDelegate.java @@ -19,9 +19,11 @@ package com.android.settingslib.collapsingtoolbar; import static android.text.Layout.HYPHENATION_FREQUENCY_NORMAL_FAST; import android.app.ActionBar; +import android.app.Activity; import android.content.res.Configuration; import android.graphics.text.LineBreakConfig; import android.os.Build; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -30,6 +32,7 @@ import android.widget.Toolbar; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; import androidx.coordinatorlayout.widget.CoordinatorLayout; import com.android.settingslib.widget.R; @@ -42,7 +45,7 @@ import com.google.android.material.appbar.CollapsingToolbarLayout; * extend from {@link CollapsingToolbarBaseActivity} or from {@link CollapsingToolbarBaseFragment}. */ public class CollapsingToolbarDelegate { - + private static final String TAG = "CTBdelegate"; /** Interface to be implemented by the host of the Collapsing Toolbar. */ public interface HostCallback { /** @@ -53,6 +56,13 @@ public class CollapsingToolbarDelegate { @Nullable ActionBar setActionBar(Toolbar toolbar); + /** Sets support tool bar and return support action bar, this is for AppCompatActivity. */ + @Nullable + default androidx.appcompat.app.ActionBar setActionBar( + androidx.appcompat.widget.Toolbar toolbar) { + return null; + } + /** Sets a title on the host. */ void setOuterTitle(CharSequence title); } @@ -79,6 +89,13 @@ public class CollapsingToolbarDelegate { /** Method to call that creates the root view of the collapsing toolbar. */ @SuppressWarnings("RestrictTo") public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container) { + return onCreateView(inflater, container, null); + } + + /** Method to call that creates the root view of the collapsing toolbar. */ + @SuppressWarnings("RestrictTo") + View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, + Activity activity) { final View view = inflater.inflate(R.layout.collapsing_toolbar_base_layout, container, false); if (view instanceof CoordinatorLayout) { @@ -99,17 +116,57 @@ public class CollapsingToolbarDelegate { } } autoSetCollapsingToolbarLayoutScrolling(); - mToolbar = view.findViewById(R.id.action_bar); mContentFrameLayout = view.findViewById(R.id.content_frame); - final ActionBar actionBar = mHostCallback.setActionBar(mToolbar); + if (activity instanceof AppCompatActivity) { + Log.d(TAG, "onCreateView: from AppCompatActivity and sub-class."); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + initSupportActionBar(inflater); + } else { + initRSupportActionBar(view); + } + } else { + Log.d(TAG, "onCreateView: from NonAppCompatActivity."); + mToolbar = view.findViewById(R.id.action_bar); + final ActionBar actionBar = mHostCallback.setActionBar(mToolbar); + // Enable title and home button by default + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setHomeButtonEnabled(true); + actionBar.setDisplayShowTitleEnabled(true); + } + } + return view; + } - // Enable title and home button by default + private void initSupportActionBar(@NonNull LayoutInflater inflater) { + if (mCollapsingToolbarLayout == null) { + return; + } + mCollapsingToolbarLayout.removeAllViews(); + inflater.inflate(R.layout.support_toolbar, mCollapsingToolbarLayout); + final androidx.appcompat.widget.Toolbar supportToolbar = + mCollapsingToolbarLayout.findViewById(R.id.support_action_bar); + final androidx.appcompat.app.ActionBar actionBar = + mHostCallback.setActionBar(supportToolbar); + if (actionBar != null) { + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setHomeButtonEnabled(true); + actionBar.setDisplayShowTitleEnabled(true); + } + } + + private void initRSupportActionBar(View view) { + view.findViewById(R.id.action_bar).setVisibility(View.GONE); + final androidx.appcompat.widget.Toolbar supportToolbar = + view.findViewById(R.id.support_action_bar); + supportToolbar.setVisibility(View.VISIBLE); + final androidx.appcompat.app.ActionBar actionBar = + mHostCallback.setActionBar(supportToolbar); if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); actionBar.setDisplayShowTitleEnabled(true); } - return view; } /** Return an instance of CoordinatorLayout. */ @@ -160,9 +217,13 @@ public class CollapsingToolbarDelegate { new AppBarLayout.Behavior.DragCallback() { @Override public boolean canDrag(@NonNull AppBarLayout appBarLayout) { - // Header can be scrolling while device in landscape mode. - return appBarLayout.getResources().getConfiguration().orientation - == Configuration.ORIENTATION_LANDSCAPE; + // Header can be scrolling while device in landscape mode and SDK > 33 + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.TIRAMISU) { + return false; + } else { + return appBarLayout.getResources().getConfiguration().orientation + == Configuration.ORIENTATION_LANDSCAPE; + } } }); params.setBehavior(behavior); diff --git a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/widget/CollapsingCoordinatorLayout.java b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/widget/CollapsingCoordinatorLayout.java index d67ac3b86050e..e4e34f8cae1e6 100644 --- a/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/widget/CollapsingCoordinatorLayout.java +++ b/packages/SettingsLib/CollapsingToolbarBaseActivity/src/com/android/settingslib/collapsingtoolbar/widget/CollapsingCoordinatorLayout.java @@ -49,7 +49,7 @@ import com.google.android.material.appbar.CollapsingToolbarLayout; */ @RequiresApi(Build.VERSION_CODES.S) public class CollapsingCoordinatorLayout extends CoordinatorLayout { - private static final String TAG = "CollapsingCoordinatorLayout"; + private static final String TAG = "CollapsingCoordinator"; private static final float TOOLBAR_LINE_SPACING_MULTIPLIER = 1.1f; private CharSequence mToolbarTitle; @@ -255,9 +255,13 @@ public class CollapsingCoordinatorLayout extends CoordinatorLayout { new AppBarLayout.Behavior.DragCallback() { @Override public boolean canDrag(@NonNull AppBarLayout appBarLayout) { - // Header can be scrolling while device in landscape mode. - return appBarLayout.getResources().getConfiguration().orientation - == Configuration.ORIENTATION_LANDSCAPE; + // Header can be scrolling while device in landscape mode and SDK > 33 + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.TIRAMISU) { + return false; + } else { + return appBarLayout.getResources().getConfiguration().orientation + == Configuration.ORIENTATION_LANDSCAPE; + } } }); params.setBehavior(behavior); diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_bar.xml index 59ae1221ddd35..b39d09f38b624 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_bar.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_bar.xml @@ -18,7 +18,11 @@ + android:layout_width="match_parent" + android:paddingLeft="?android:attr/listPreferredItemPaddingLeft" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingRight="?android:attr/listPreferredItemPaddingRight" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> diff --git a/packages/SettingsLib/MainSwitchPreference/res/values-sw600dp/dmiens.xml b/packages/SettingsLib/MainSwitchPreference/res/values-sw600dp/dmiens.xml deleted file mode 100644 index 55a2589102d3e..0000000000000 --- a/packages/SettingsLib/MainSwitchPreference/res/values-sw600dp/dmiens.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - 80dp - diff --git a/packages/SettingsLib/MainSwitchPreference/res/values-sw720dp-land/dmiens.xml b/packages/SettingsLib/MainSwitchPreference/res/values-sw720dp-land/dmiens.xml deleted file mode 100644 index 53995bcf055b0..0000000000000 --- a/packages/SettingsLib/MainSwitchPreference/res/values-sw720dp-land/dmiens.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - 128dp - 128dp - diff --git a/packages/SettingsLib/MainSwitchPreference/res/values-sw720dp/dmiens.xml b/packages/SettingsLib/MainSwitchPreference/res/values-sw720dp/dmiens.xml deleted file mode 100644 index 9015c581eff51..0000000000000 --- a/packages/SettingsLib/MainSwitchPreference/res/values-sw720dp/dmiens.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - 80dp - 80dp - diff --git a/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml b/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml index 157a54e3573dc..88b2c87284952 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/values/dimens.xml @@ -27,6 +27,6 @@ 24dp - 72dp + 56dp 16dp diff --git a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java index 86fec50d7c218..864a8bb17058e 100644 --- a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java +++ b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchBar.java @@ -160,6 +160,19 @@ public class MainSwitchBar extends LinearLayout implements CompoundButton.OnChec } } + /** + * Set icon space reserved for title + */ + public void setIconSpaceReserved(boolean iconSpaceReserved) { + if (mTextView != null && !BuildCompatUtils.isAtLeastS()) { + LayoutParams params = (LayoutParams) mTextView.getLayoutParams(); + int iconSpace = getContext().getResources().getDimensionPixelSize( + R.dimen.settingslib_switchbar_subsettings_margin_start); + params.setMarginStart(iconSpaceReserved ? iconSpace : 0); + mTextView.setLayoutParams(params); + } + } + /** * Show the MainSwitchBar */ diff --git a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchPreference.java b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchPreference.java index fc0e05f7fb464..53cc268851e78 100644 --- a/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchPreference.java +++ b/packages/SettingsLib/MainSwitchPreference/src/com/android/settingslib/widget/MainSwitchPreference.java @@ -37,7 +37,6 @@ public class MainSwitchPreference extends TwoStatePreference implements OnMainSw private final List mSwitchChangeListeners = new ArrayList<>(); private MainSwitchBar mMainSwitchBar; - private CharSequence mTitle; public MainSwitchPreference(Context context) { super(context); @@ -68,6 +67,10 @@ public class MainSwitchPreference extends TwoStatePreference implements OnMainSw holder.setDividerAllowedBelow(false); mMainSwitchBar = (MainSwitchBar) holder.findViewById(R.id.settingslib_main_switch_bar); + // To support onPreferenceChange callback, it needs to call callChangeListener() when + // MainSwitchBar is clicked. + mMainSwitchBar.setOnClickListener((view) -> callChangeListener(isChecked())); + setIconSpaceReserved(isIconSpaceReserved()); updateStatus(isChecked()); registerListenerToSwitchBar(); } @@ -82,6 +85,10 @@ public class MainSwitchPreference extends TwoStatePreference implements OnMainSw final CharSequence title = a.getText( androidx.preference.R.styleable.Preference_android_title); setTitle(title); + + final boolean bIconSpaceReserved = a.getBoolean( + androidx.preference.R.styleable.Preference_android_iconSpaceReserved, true); + setIconSpaceReserved(bIconSpaceReserved); a.recycle(); } } @@ -96,9 +103,17 @@ public class MainSwitchPreference extends TwoStatePreference implements OnMainSw @Override public void setTitle(CharSequence title) { - mTitle = title; + super.setTitle(title); if (mMainSwitchBar != null) { - mMainSwitchBar.setTitle(mTitle); + mMainSwitchBar.setTitle(title); + } + } + + @Override + public void setIconSpaceReserved(boolean iconSpaceReserved) { + super.setIconSpaceReserved(iconSpaceReserved); + if (mMainSwitchBar != null) { + mMainSwitchBar.setIconSpaceReserved(iconSpaceReserved); } } @@ -113,7 +128,7 @@ public class MainSwitchPreference extends TwoStatePreference implements OnMainSw public void updateStatus(boolean checked) { setChecked(checked); if (mMainSwitchBar != null) { - mMainSwitchBar.setTitle(mTitle); + mMainSwitchBar.setTitle(getTitle()); mMainSwitchBar.show(); } } @@ -125,6 +140,7 @@ public class MainSwitchPreference extends TwoStatePreference implements OnMainSw if (!mSwitchChangeListeners.contains(listener)) { mSwitchChangeListeners.add(listener); } + if (mMainSwitchBar != null) { mMainSwitchBar.addOnSwitchChangeListener(listener); } diff --git a/packages/SettingsLib/SettingsTheme/res/values-v31/style_preference.xml b/packages/SettingsLib/SettingsTheme/res/values-v31/style_preference.xml index bda478e6e4fe8..f1e028b405db1 100644 --- a/packages/SettingsLib/SettingsTheme/res/values-v31/style_preference.xml +++ b/packages/SettingsLib/SettingsTheme/res/values-v31/style_preference.xml @@ -17,6 +17,7 @@ + +