From 9d6bf1b7842f1ae7b267a4f8ae790f605bbbadf7 Mon Sep 17 00:00:00 2001 From: Chun-Ku Lin Date: Tue, 5 Dec 2023 23:09:04 +0000 Subject: [PATCH] Apply Setup styles to the a11y edit shortcut full screen. Bug: 300302098 Test: atest AccessibilitySetupWizardUtilsTest Test: atest EditShortcutsPreferenceFragmentTest (Unable to make Robolectric inflate the view of the edit shortcut fragment with the Setup wizard theme) Test: manual (Launch the setup wizard and check the screen) Change-Id: I2995e914d622e9865101ef16e3b280c65371a252 --- .../AccessibilitySetupWizardUtils.java | 21 +++++++-- .../EditShortcutsPreferenceFragment.java | 46 +++++++++++++++++++ .../AccessibilitySetupWizardUtilsTest.java | 12 +++++ .../EditShortcutsPreferenceFragmentTest.java | 2 +- 4 files changed, 75 insertions(+), 6 deletions(-) diff --git a/src/com/android/settings/accessibility/AccessibilitySetupWizardUtils.java b/src/com/android/settings/accessibility/AccessibilitySetupWizardUtils.java index 6f1ed8f1843..9140fdf49a0 100644 --- a/src/com/android/settings/accessibility/AccessibilitySetupWizardUtils.java +++ b/src/com/android/settings/accessibility/AccessibilitySetupWizardUtils.java @@ -17,8 +17,10 @@ package com.android.settings.accessibility; import android.content.Context; import android.graphics.drawable.Drawable; +import android.text.TextUtils; import android.widget.LinearLayout; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; import com.google.android.setupcompat.template.FooterBarMixin; @@ -29,7 +31,7 @@ import com.google.android.setupdesign.R; import com.google.android.setupdesign.util.ThemeHelper; /** Provides utility methods to accessibility settings for Setup Wizard only. */ -class AccessibilitySetupWizardUtils { +public class AccessibilitySetupWizardUtils { private AccessibilitySetupWizardUtils(){} @@ -45,10 +47,19 @@ class AccessibilitySetupWizardUtils { * @param icon The icon to be set */ public static void updateGlifPreferenceLayout(Context context, GlifPreferenceLayout layout, - CharSequence title, CharSequence description, Drawable icon) { - layout.setHeaderText(title); - layout.setDescriptionText(description); - layout.setIcon(icon); + @Nullable CharSequence title, @Nullable CharSequence description, + @Nullable Drawable icon) { + if (!TextUtils.isEmpty(title)) { + layout.setHeaderText(title); + } + + if (!TextUtils.isEmpty(description)) { + layout.setDescriptionText(description); + } + + if (icon != null) { + layout.setIcon(icon); + } layout.setDividerInsets(Integer.MAX_VALUE, 0); if (ThemeHelper.shouldApplyMaterialYouStyle(context)) { diff --git a/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragment.java b/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragment.java index 70b3148a2a2..6666554bca6 100644 --- a/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragment.java +++ b/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragment.java @@ -16,6 +16,7 @@ package com.android.settings.accessibility.shortcuts; +import static android.app.Activity.RESULT_CANCELED; import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE; import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS; import static android.provider.Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_ENABLED; @@ -24,6 +25,7 @@ import static android.provider.Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SER import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_CONTROLLER_NAME; +import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE; import android.app.settings.SettingsEnums; import android.content.ComponentName; @@ -35,19 +37,27 @@ import android.os.Bundle; import android.os.Handler; import android.provider.Settings; import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import android.view.accessibility.AccessibilityManager; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.preference.Preference; +import androidx.recyclerview.widget.RecyclerView; import com.android.settings.R; import com.android.settings.SetupWizardUtils; +import com.android.settings.accessibility.AccessibilitySetupWizardUtils; import com.android.settings.core.SubSettingLauncher; import com.android.settings.dashboard.DashboardFragment; import com.android.settingslib.core.AbstractPreferenceController; +import com.google.android.setupcompat.template.FooterBarMixin; import com.google.android.setupcompat.util.WizardManagerHelper; +import com.google.android.setupdesign.GlifPreferenceLayout; import java.util.Collection; import java.util.Set; @@ -157,6 +167,42 @@ public class EditShortcutsPreferenceFragment extends DashboardFragment { registerSettingsObserver(); } + @NonNull + @Override + public RecyclerView onCreateRecyclerView( + @NonNull LayoutInflater inflater, @NonNull ViewGroup parent, + @Nullable Bundle savedInstanceState) { + if (parent instanceof GlifPreferenceLayout layout) { + // Usually for setup wizard + return layout.onCreateRecyclerView(inflater, parent, savedInstanceState); + } else { + return super.onCreateRecyclerView(inflater, parent, savedInstanceState); + } + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + if (view instanceof GlifPreferenceLayout layout) { + // Usually for setup wizard + String title = null; + Intent intent = getIntent(); + if (intent != null) { + title = intent.getStringExtra(EXTRA_SHOW_FRAGMENT_TITLE); + } + AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(getContext(), layout, title, + /* description= */ null, /* icon= */ null); + + FooterBarMixin mixin = layout.getMixin(FooterBarMixin.class); + AccessibilitySetupWizardUtils.setPrimaryButton(getContext(), mixin, R.string.done, + () -> { + setResult(RESULT_CANCELED); + finish(); + }); + } + } + @Override public void onResume() { super.onResume(); diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySetupWizardUtilsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySetupWizardUtilsTest.java index e79b12231c9..fcc8d8123f4 100644 --- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySetupWizardUtilsTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySetupWizardUtilsTest.java @@ -15,7 +15,9 @@ */ package com.android.settings.accessibility; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.content.Context; @@ -50,4 +52,14 @@ public class AccessibilitySetupWizardUtilsTest { verify(layout).setIcon(icon); verify(layout).setHeaderText(title); } + + @Test + public void setupGlifPreferenceLayout_descriptionIsNull_doesNotCallSetDescriptionText() { + GlifPreferenceLayout layout = mock(GlifPreferenceLayout.class); + + AccessibilitySetupWizardUtils.updateGlifPreferenceLayout(mContext, layout, "title", + /* description= */ null, /* icon= */ null); + + verify(layout, times(0)).setDescriptionText(any()); + } } diff --git a/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java index d535f1581ee..53a87ba9457 100644 --- a/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/shortcuts/EditShortcutsPreferenceFragmentTest.java @@ -16,7 +16,6 @@ package com.android.settings.accessibility.shortcuts; - import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static com.android.internal.accessibility.AccessibilityShortcutController.MAGNIFICATION_COMPONENT_NAME; @@ -416,6 +415,7 @@ public class EditShortcutsPreferenceFragmentTest { /* themeResId= */ 0, Lifecycle.State.INITIALIZED); scenario.onFragment(fragment -> { Intent intent = fragment.requireActivity().getIntent(); + intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, SCREEN_TITLE); fragment.requireActivity().setIntent(createSuwIntent(intent, isInSuw)); // Since the fragment is attached before we have a chance // to modify the activity's intent; initialize controllers again