From dd2ec775c8bc7e03bfb269cf55e6284b37396ebd Mon Sep 17 00:00:00 2001 From: menghanli Date: Mon, 13 Feb 2023 17:18:40 +0800 Subject: [PATCH] Add a done button to vision setting pages in setup flow Root cause: User feels confused because the particular screen doesn't have a back button but at that moment of the setup flow the regular UI gestures didn't even work. Solution: Add a done button to the vision settings pages for clearer navigation. Bug: 262995569 Test: make RunSettingsRoboTests ROBOTEST_FILTER=FragmentForSetupWizardTest Change-Id: Id3a0d78389e0e6c11b5b5cf016b37673fde7f286 --- .../AccessibilitySettingsForSetupWizard.java | 9 ++++ .../AccessibilitySetupWizardUtils.java | 49 ++++++++++++++++++- ...adingPreferenceFragmentForSetupWizard.java | 29 +++-------- ...ationPreferenceFragmentForSetupWizard.java | 10 ++++ ...eaderPreferenceFragmentForSetupWizard.java | 9 ++++ ...SpeakPreferenceFragmentForSetupWizard.java | 9 ++++ ...cessibilitySettingsForSetupWizardTest.java | 6 +++ ...gPreferenceFragmentForSetupWizardTest.java | 13 +---- ...nPreferenceFragmentForSetupWizardTest.java | 6 +++ ...rPreferenceFragmentForSetupWizardTest.java | 6 +++ ...kPreferenceFragmentForSetupWizardTest.java | 6 +++ 11 files changed, 119 insertions(+), 33 deletions(-) diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java index 6c32edd8178..f4527370121 100644 --- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java +++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizard.java @@ -16,6 +16,8 @@ package com.android.settings.accessibility; +import static android.app.Activity.RESULT_CANCELED; + import static com.android.settings.Utils.getAdaptiveIcon; import static com.android.settingslib.widget.TwoTargetPreference.ICON_SIZE_MEDIUM; @@ -41,6 +43,7 @@ import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settingslib.RestrictedPreference; +import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupdesign.GlifPreferenceLayout; import java.util.List; @@ -90,6 +93,12 @@ public class AccessibilitySettingsForSetupWizard extends DashboardFragment final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility); AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title, description, icon); + + final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class); + AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done, () -> { + setResult(RESULT_CANCELED); + finish(); + }); } @Override diff --git a/src/com/android/settings/accessibility/AccessibilitySetupWizardUtils.java b/src/com/android/settings/accessibility/AccessibilitySetupWizardUtils.java index c5302143182..b7a3439162d 100644 --- a/src/com/android/settings/accessibility/AccessibilitySetupWizardUtils.java +++ b/src/com/android/settings/accessibility/AccessibilitySetupWizardUtils.java @@ -19,8 +19,13 @@ import android.content.Context; import android.graphics.drawable.Drawable; import android.widget.LinearLayout; +import androidx.annotation.StringRes; + import com.android.settings.R; +import com.google.android.setupcompat.template.FooterBarMixin; +import com.google.android.setupcompat.template.FooterButton; +import com.google.android.setupcompat.template.Mixin; import com.google.android.setupdesign.GlifPreferenceLayout; import com.google.android.setupdesign.util.ThemeHelper; @@ -30,7 +35,7 @@ class AccessibilitySetupWizardUtils { private AccessibilitySetupWizardUtils(){} /** - * Update the {@link GlifPreferenceLayout} attributes if they have previously been initialized. + * Updates the {@link GlifPreferenceLayout} attributes if they have previously been initialized. * When the SetupWizard supports the extended partner configs, it means the material layout * would be applied. It should set a different padding/margin in views to align Settings style * for accessibility feature pages. @@ -55,4 +60,46 @@ class AccessibilitySetupWizardUtils { } } } + + /** + * Sets primary button for footer of the {@link GlifPreferenceLayout}. + * + *

This will be the initial by given material theme style. + * + * @param context A {@link Context} + * @param mixin A {@link Mixin} for managing buttons. + * @param text The {@code text} by resource. + * @param runnable The {@link Runnable} to run. + */ + public static void setPrimaryButton(Context context, FooterBarMixin mixin, @StringRes int text, + Runnable runnable) { + mixin.setPrimaryButton( + new FooterButton.Builder(context) + .setText(text) + .setListener(l -> runnable.run()) + .setButtonType(FooterButton.ButtonType.DONE) + .setTheme(R.style.SudGlifButton_Primary) + .build()); + } + + /** + * Sets secondary button for the footer of the {@link GlifPreferenceLayout}. + * + *

This will be the initial by given material theme style. + * + * @param context A {@link Context} + * @param mixin A {@link Mixin} for managing buttons. + * @param text The {@code text} by resource. + * @param runnable The {@link Runnable} to run. + */ + public static void setSecondaryButton(Context context, FooterBarMixin mixin, + @StringRes int text, Runnable runnable) { + mixin.setSecondaryButton( + new FooterButton.Builder(context) + .setText(text) + .setListener(l -> runnable.run()) + .setButtonType(FooterButton.ButtonType.CLEAR) + .setTheme(R.style.SudGlifButton_Secondary) + .build()); + } } diff --git a/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizard.java index cdbfe5f73d8..f2edf8ed323 100644 --- a/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizard.java +++ b/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizard.java @@ -33,7 +33,6 @@ import com.android.settings.R; import com.android.settingslib.Utils; import com.google.android.setupcompat.template.FooterBarMixin; -import com.google.android.setupcompat.template.FooterButton; import com.google.android.setupdesign.GlifPreferenceLayout; /** @@ -55,26 +54,14 @@ public class TextReadingPreferenceFragmentForSetupWizard extends TextReadingPref /* description= */ null, icon); final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class); - mixin.setSecondaryButton( - new FooterButton.Builder(getContext()) - .setText(R.string.accessibility_text_reading_reset_button_title) - .setListener(l -> showDialog(DIALOG_RESET_SETTINGS)) - .setButtonType(FooterButton.ButtonType.CLEAR) - .setTheme(R.style.SudGlifButton_Secondary) - .build()); - - if (isCallingFromAnythingElseEntryPoint()) { - mixin.setPrimaryButton( - new FooterButton.Builder(getContext()) - .setText(R.string.done) - .setListener(l -> { - setResult(RESULT_CANCELED); - finish(); - }) - .setButtonType(FooterButton.ButtonType.DONE) - .setTheme(R.style.SudGlifButton_Primary) - .build()); - } + AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done, () -> { + setResult(RESULT_CANCELED); + finish(); + }); + AccessibilitySetupWizardUtils.setSecondaryButton(getContext(), mixin, + R.string.accessibility_text_reading_reset_button_title, + () -> showDialog(DIALOG_RESET_SETTINGS) + ); } @Override diff --git a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java index 12a988603d8..a726d8131d5 100644 --- a/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java +++ b/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizard.java @@ -16,6 +16,8 @@ package com.android.settings.accessibility; +import static android.app.Activity.RESULT_CANCELED; + import android.app.settings.SettingsEnums; import android.graphics.drawable.Drawable; import android.os.Bundle; @@ -27,6 +29,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.android.settings.R; +import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupdesign.GlifPreferenceLayout; public class ToggleScreenMagnificationPreferenceFragmentForSetupWizard @@ -44,6 +47,13 @@ public class ToggleScreenMagnificationPreferenceFragmentForSetupWizard final Drawable icon = getContext().getDrawable(R.drawable.ic_accessibility_visibility); AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title, description, icon); + + final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class); + AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done, () -> { + setResult(RESULT_CANCELED); + finish(); + }); + hidePreferenceSettingComponents(); } diff --git a/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java index f9a1113c054..89dc4376c53 100644 --- a/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java +++ b/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizard.java @@ -16,6 +16,8 @@ package com.android.settings.accessibility; +import static android.app.Activity.RESULT_CANCELED; + import android.app.settings.SettingsEnums; import android.graphics.drawable.Drawable; import android.os.Bundle; @@ -27,6 +29,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.android.settings.R; +import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupdesign.GlifPreferenceLayout; public class ToggleScreenReaderPreferenceFragmentForSetupWizard @@ -45,6 +48,12 @@ public class ToggleScreenReaderPreferenceFragmentForSetupWizard AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title, description, icon); + final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class); + AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done, () -> { + setResult(RESULT_CANCELED); + finish(); + }); + mToggleSwitchWasInitiallyChecked = mToggleServiceSwitchPreference.isChecked(); if (mTopIntroPreference != null) { mTopIntroPreference.setVisible(false); diff --git a/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java b/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java index a4604191b81..ff9182e7a5c 100644 --- a/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java +++ b/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizard.java @@ -16,6 +16,8 @@ package com.android.settings.accessibility; +import static android.app.Activity.RESULT_CANCELED; + import android.app.settings.SettingsEnums; import android.graphics.drawable.Drawable; import android.os.Bundle; @@ -27,6 +29,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.android.settings.R; +import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupdesign.GlifPreferenceLayout; public class ToggleSelectToSpeakPreferenceFragmentForSetupWizard @@ -45,6 +48,12 @@ public class ToggleSelectToSpeakPreferenceFragmentForSetupWizard AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title, description, icon); + final FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class); + AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done, () -> { + setResult(RESULT_CANCELED); + finish(); + }); + mToggleSwitchWasInitiallyChecked = mToggleServiceSwitchPreference.isChecked(); if (mTopIntroPreference != null) { mTopIntroPreference.setVisible(false); diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardTest.java index 508b2290cb8..e14e27109e0 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardTest.java @@ -23,6 +23,7 @@ import static com.android.settings.accessibility.AccessibilitySettingsForSetupWi import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; @@ -45,6 +46,7 @@ import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; import com.android.settingslib.RestrictedPreference; +import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupdesign.GlifPreferenceLayout; import org.junit.Before; @@ -79,6 +81,8 @@ public class AccessibilitySettingsForSetupWizardTest { private FragmentActivity mActivity; @Mock private GlifPreferenceLayout mGlifLayoutView; + @Mock + private FooterBarMixin mFooterBarMixin; private AccessibilitySettingsForSetupWizard mFragment; @Before @@ -89,6 +93,7 @@ public class AccessibilitySettingsForSetupWizardTest { when(mAccessibilityManager.getInstalledAccessibilityServiceList()).thenReturn( mAccessibilityServices); doReturn(mActivity).when(mFragment).getActivity(); + doReturn(mFooterBarMixin).when(mGlifLayoutView).getMixin(FooterBarMixin.class); } @Test @@ -99,6 +104,7 @@ public class AccessibilitySettingsForSetupWizardTest { mContext.getString(R.string.vision_settings_title)); verify(mGlifLayoutView).setDescriptionText( mContext.getString(R.string.vision_settings_description)); + verify(mFooterBarMixin).setPrimaryButton(any()); } @Test diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizardTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizardTest.java index 7df24f1293d..1cd301f98b9 100644 --- a/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizardTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingPreferenceFragmentForSetupWizardTest.java @@ -100,19 +100,10 @@ public class TextReadingPreferenceFragmentForSetupWizardTest { } @Test - public void onViewCreated_verifySetSecondaryButton() { - mFragment.onViewCreated(mGlifLayoutView, null); - - verify(mFooterBarMixin).setSecondaryButton(any()); - } - - @Test - public void onViewCreated_verifySetPrimaryButton() { - doReturn(mActivity).when(mFragment).getActivity(); - doReturn("setupwizard").when(mActivity).getCallingPackage(); - + public void onViewCreated_verifyAction() { mFragment.onViewCreated(mGlifLayoutView, null); verify(mFooterBarMixin).setPrimaryButton(any()); + verify(mFooterBarMixin).setSecondaryButton(any()); } } diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizardTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizardTest.java index c5978f69a83..84783b21a3a 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizardTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenMagnificationPreferenceFragmentForSetupWizardTest.java @@ -18,6 +18,7 @@ package com.android.settings.accessibility; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -38,6 +39,7 @@ import com.android.settings.testutils.shadow.ShadowSettingsPreferenceFragment; import com.android.settings.widget.SettingsMainSwitchBar; import com.android.settingslib.widget.TopIntroPreference; +import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupdesign.GlifPreferenceLayout; import org.junit.Before; @@ -64,6 +66,8 @@ public class ToggleScreenMagnificationPreferenceFragmentForSetupWizardTest { private GlifPreferenceLayout mGlifLayoutView; @Mock private SettingsMainSwitchBar mSwitchBar; + @Mock + private FooterBarMixin mFooterBarMixin; private ToggleScreenMagnificationPreferenceFragmentForSetupWizard mFragment; @Before @@ -72,6 +76,7 @@ public class ToggleScreenMagnificationPreferenceFragmentForSetupWizardTest { spy(new TestToggleScreenMagnificationPreferenceFragmentForSetupWizard(mContext)); doReturn(mActivity).when(mFragment).getActivity(); when(mActivity.getSwitchBar()).thenReturn(mSwitchBar); + doReturn(mFooterBarMixin).when(mGlifLayoutView).getMixin(FooterBarMixin.class); } @Test @@ -83,6 +88,7 @@ public class ToggleScreenMagnificationPreferenceFragmentForSetupWizardTest { verify(mGlifLayoutView).setDescriptionText( mContext.getString(R.string.accessibility_screen_magnification_intro_text)); verify(mGlifLayoutView).setDividerInsets(Integer.MAX_VALUE, 0); + verify(mFooterBarMixin).setPrimaryButton(any()); assertThat(mFragment.mTopIntroPreference.isVisible()).isFalse(); assertThat(mFragment.mSettingsPreference.isVisible()).isFalse(); assertThat(mFragment.mFollowingTypingSwitchPreference.isVisible()).isFalse(); diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizardTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizardTest.java index 2cbe1ad400e..c604652fd50 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizardTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleScreenReaderPreferenceFragmentForSetupWizardTest.java @@ -18,6 +18,7 @@ package com.android.settings.accessibility; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -37,6 +38,7 @@ import com.android.settings.widget.SettingsMainSwitchBar; import com.android.settings.widget.SettingsMainSwitchPreference; import com.android.settingslib.widget.TopIntroPreference; +import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupdesign.GlifPreferenceLayout; import org.junit.Before; @@ -62,6 +64,8 @@ public class ToggleScreenReaderPreferenceFragmentForSetupWizardTest { private GlifPreferenceLayout mGlifLayoutView; @Mock private SettingsMainSwitchBar mSwitchBar; + @Mock + private FooterBarMixin mFooterBarMixin; private ToggleScreenReaderPreferenceFragmentForSetupWizard mFragment; @Before @@ -69,6 +73,7 @@ public class ToggleScreenReaderPreferenceFragmentForSetupWizardTest { mFragment = spy(new TestToggleScreenReaderPreferenceFragmentForSetupWizard(mContext)); doReturn(mActivity).when(mFragment).getActivity(); when(mActivity.getSwitchBar()).thenReturn(mSwitchBar); + doReturn(mFooterBarMixin).when(mGlifLayoutView).getMixin(FooterBarMixin.class); } @Test @@ -79,6 +84,7 @@ public class ToggleScreenReaderPreferenceFragmentForSetupWizardTest { verify(mGlifLayoutView).setDescriptionText( mContext.getString(R.string.talkback_summary)); verify(mGlifLayoutView).setDividerInsets(Integer.MAX_VALUE, 0); + verify(mFooterBarMixin).setPrimaryButton(any()); assertThat(mFragment.mTopIntroPreference.isVisible()).isFalse(); } diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizardTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizardTest.java index 43440ffe285..78938310d9a 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizardTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleSelectToSpeakPreferenceFragmentForSetupWizardTest.java @@ -18,6 +18,7 @@ package com.android.settings.accessibility; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -37,6 +38,7 @@ import com.android.settings.widget.SettingsMainSwitchBar; import com.android.settings.widget.SettingsMainSwitchPreference; import com.android.settingslib.widget.TopIntroPreference; +import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupdesign.GlifPreferenceLayout; import org.junit.Before; @@ -62,6 +64,8 @@ public class ToggleSelectToSpeakPreferenceFragmentForSetupWizardTest { private GlifPreferenceLayout mGlifLayoutView; @Mock private SettingsMainSwitchBar mSwitchBar; + @Mock + private FooterBarMixin mFooterBarMixin; private ToggleSelectToSpeakPreferenceFragmentForSetupWizard mFragment; @Before @@ -69,6 +73,7 @@ public class ToggleSelectToSpeakPreferenceFragmentForSetupWizardTest { mFragment = spy(new TestToggleSelectToSpeakPreferenceFragmentForSetupWizard(mContext)); doReturn(mActivity).when(mFragment).getActivity(); when(mActivity.getSwitchBar()).thenReturn(mSwitchBar); + doReturn(mFooterBarMixin).when(mGlifLayoutView).getMixin(FooterBarMixin.class); } @Test @@ -79,6 +84,7 @@ public class ToggleSelectToSpeakPreferenceFragmentForSetupWizardTest { verify(mGlifLayoutView).setDescriptionText( mContext.getString(R.string.select_to_speak_summary)); verify(mGlifLayoutView).setDividerInsets(Integer.MAX_VALUE, 0); + verify(mFooterBarMixin).setPrimaryButton(any()); assertThat(mFragment.mTopIntroPreference.isVisible()).isFalse(); }