From 0af1dbae4e60eee2ea4a08d1318e1dae9378b7fb Mon Sep 17 00:00:00 2001 From: Angela Wang Date: Thu, 26 Dec 2024 08:37:13 +0000 Subject: [PATCH] Update ShortcutPreference with expressive design To make hearing devices screen meets the expressive design, the shortcut preference need to be updated. Flag: EXEMPT flag by System prop Bug: 349675952 Test: atest ShortcutPreferenceTest Test: manually check the UI, screenshots attached on bug Change-Id: I04a86c0592c5aa0e096b827a9ee65b12cf13ecf5 --- ...ccessibility_shortcut_secondary_action.xml | 100 ------------------ .../accessibility/ShortcutPreference.java | 55 +++++----- .../accessibility/ShortcutPreferenceTest.java | 54 ++++++---- 3 files changed, 64 insertions(+), 145 deletions(-) delete mode 100644 res/layout/accessibility_shortcut_secondary_action.xml diff --git a/res/layout/accessibility_shortcut_secondary_action.xml b/res/layout/accessibility_shortcut_secondary_action.xml deleted file mode 100644 index 80defdb669b..00000000000 --- a/res/layout/accessibility_shortcut_secondary_action.xml +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/com/android/settings/accessibility/ShortcutPreference.java b/src/com/android/settings/accessibility/ShortcutPreference.java index a04f8f45fed..c23bc55fcee 100644 --- a/src/com/android/settings/accessibility/ShortcutPreference.java +++ b/src/com/android/settings/accessibility/ShortcutPreference.java @@ -18,22 +18,23 @@ package com.android.settings.accessibility; import android.content.Context; import android.util.AttributeSet; -import android.util.TypedValue; +import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.widget.CompoundButton; import android.widget.LinearLayout; -import androidx.preference.Preference; import androidx.preference.PreferenceViewHolder; import com.android.settings.R; +import com.android.settingslib.widget.SettingsThemeHelper; +import com.android.settingslib.widget.TwoTargetPreference; /** * Preference that can enable accessibility shortcut and let users choose which shortcut type they * prefer to use. */ -public class ShortcutPreference extends Preference { +public class ShortcutPreference extends TwoTargetPreference { /** * Interface definition for a callback to be invoked when the toggle or settings has been @@ -61,8 +62,6 @@ public class ShortcutPreference extends Preference { ShortcutPreference(Context context, AttributeSet attrs) { super(context, attrs); - setLayoutResource(R.layout.accessibility_shortcut_secondary_action); - setWidgetLayoutResource(androidx.preference.R.layout.preference_widget_switch_compat); setIconSpaceReserved(false); // Treat onSettingsClicked as this preference's click. setOnPreferenceClickListener(preference -> { @@ -71,25 +70,30 @@ public class ShortcutPreference extends Preference { }); } + @Override + protected int getSecondTargetResId() { + return SettingsThemeHelper.isExpressiveTheme(getContext()) + ? com.android.settingslib.widget.theme.R.layout + .settingslib_expressive_preference_switch + : androidx.preference.R.layout.preference_widget_switch_compat; + } + + int getSwitchResId() { + return SettingsThemeHelper.isExpressiveTheme(getContext()) + ? com.android.settingslib.widget.theme.R.id.switchWidget + : androidx.preference.R.id.switchWidget; + } + @Override public void onBindViewHolder(PreferenceViewHolder holder) { super.onBindViewHolder(holder); - final TypedValue outValue = new TypedValue(); - getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, - outValue, true); - - final LinearLayout mainFrame = holder.itemView.findViewById(R.id.main_frame); - if (mainFrame != null) { - mainFrame.setOnClickListener(view -> callOnSettingsClicked()); - mainFrame.setClickable(mSettingsEditable); - mainFrame.setFocusable(mSettingsEditable); - mainFrame.setBackgroundResource( - mSettingsEditable ? outValue.resourceId : /* Remove background */ 0); + final View widgetFrame = holder.findViewById(android.R.id.widget_frame); + if (widgetFrame instanceof LinearLayout linearLayout) { + linearLayout.setGravity(Gravity.END | Gravity.CENTER_VERTICAL); } - CompoundButton switchWidget = - holder.itemView.findViewById(androidx.preference.R.id.switchWidget); + CompoundButton switchWidget = holder.itemView.findViewById(getSwitchResId()); if (switchWidget != null) { // Consumes move events to ignore drag actions. switchWidget.setOnTouchListener((v, event) -> { @@ -101,18 +105,21 @@ public class ShortcutPreference extends Preference { switchWidget.setOnClickListener(view -> callOnToggleClicked()); switchWidget.setClickable(mSettingsEditable); switchWidget.setFocusable(mSettingsEditable); - switchWidget.setBackgroundResource( - mSettingsEditable ? outValue.resourceId : /* Remove background */ 0); } - final View divider = holder.itemView.findViewById(R.id.divider); + final View divider = holder.itemView.findViewById( + com.android.settingslib.widget.preference.twotarget.R.id.two_target_divider); if (divider != null) { divider.setVisibility(mSettingsEditable ? View.VISIBLE : View.GONE); } - holder.itemView.setOnClickListener(view -> callOnToggleClicked()); - holder.itemView.setClickable(!mSettingsEditable); - holder.itemView.setFocusable(!mSettingsEditable); + holder.itemView.setOnClickListener(view -> { + if (mSettingsEditable) { + callOnSettingsClicked(); + } else { + callOnToggleClicked(); + } + }); } /** diff --git a/tests/robotests/src/com/android/settings/accessibility/ShortcutPreferenceTest.java b/tests/robotests/src/com/android/settings/accessibility/ShortcutPreferenceTest.java index ee271fe99b1..1fce5242fa3 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ShortcutPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ShortcutPreferenceTest.java @@ -21,11 +21,13 @@ import static com.google.common.truth.Truth.assertThat; import android.content.Context; import android.view.LayoutInflater; import android.view.View; +import android.widget.CompoundButton; +import android.widget.LinearLayout; import androidx.preference.PreferenceViewHolder; import androidx.test.core.app.ApplicationProvider; -import com.android.settings.R; +import com.android.settingslib.widget.SettingsThemeHelper; import org.junit.Before; import org.junit.Test; @@ -40,10 +42,10 @@ public class ShortcutPreferenceTest { private static final String SETTINGS_CLICKED = "settings_clicked"; private ShortcutPreference mShortcutPreference; - private PreferenceViewHolder mPreferenceViewHolder; + private PreferenceViewHolder mViewHolder; private String mResult; - private ShortcutPreference.OnClickCallback mListener = + private final ShortcutPreference.OnClickCallback mListener = new ShortcutPreference.OnClickCallback() { @Override public void onToggleClicked(ShortcutPreference preference) { @@ -61,30 +63,49 @@ public class ShortcutPreferenceTest { final Context context = ApplicationProvider.getApplicationContext(); mShortcutPreference = new ShortcutPreference(context, null); + int resID = SettingsThemeHelper.isExpressiveTheme(context) + ? com.android.settingslib.widget.preference.twotarget.R.layout + .settingslib_expressive_preference_two_target + : com.android.settingslib.widget.preference.twotarget.R.layout + .preference_two_target; final LayoutInflater inflater = LayoutInflater.from(context); - final View view = - inflater.inflate(R.layout.accessibility_shortcut_secondary_action, null); - mPreferenceViewHolder = PreferenceViewHolder.createInstanceForTests(view); + final View view = inflater.inflate(resID, null); + mViewHolder = PreferenceViewHolder.createInstanceForTests(view); + + final LinearLayout widget = mViewHolder.itemView.findViewById(android.R.id.widget_frame); + inflater.inflate(mShortcutPreference.getSecondTargetResId(), widget, true); } @Test public void clickToggle_toggleClicked() { - mShortcutPreference.onBindViewHolder(mPreferenceViewHolder); + mShortcutPreference.onBindViewHolder(mViewHolder); mShortcutPreference.setOnClickCallback(mListener); - mPreferenceViewHolder.itemView.performClick(); + CompoundButton switchWidget = mViewHolder.itemView.findViewById( + mShortcutPreference.getSwitchResId()); + assert switchWidget != null; + switchWidget.performClick(); assertThat(mResult).isEqualTo(TOGGLE_CLICKED); assertThat(mShortcutPreference.isChecked()).isTrue(); } @Test - public void clickSettings_settingsClicked() { - mShortcutPreference.onBindViewHolder(mPreferenceViewHolder); + public void clickItem_settingsClicked() { + mShortcutPreference.onBindViewHolder(mViewHolder); mShortcutPreference.setOnClickCallback(mListener); - final View settings = mPreferenceViewHolder.itemView.findViewById(R.id.main_frame); - settings.performClick(); + mViewHolder.itemView.performClick(); + + assertThat(mResult).isEqualTo(SETTINGS_CLICKED); + } + + @Test + public void clickPreference_settingsClicked() { + mShortcutPreference.onBindViewHolder(mViewHolder); + mShortcutPreference.setOnClickCallback(mListener); + + mShortcutPreference.performClick(); assertThat(mResult).isEqualTo(SETTINGS_CLICKED); } @@ -95,13 +116,4 @@ public class ShortcutPreferenceTest { assertThat(mShortcutPreference.isChecked()).isEqualTo(true); } - - @Test - public void performClickOnPreference_settingsClicked() { - mShortcutPreference.onBindViewHolder(mPreferenceViewHolder); - mShortcutPreference.setOnClickCallback(mListener); - mShortcutPreference.performClick(); - - assertThat(mResult).isEqualTo(SETTINGS_CLICKED); - } }