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 @@
+
+