diff --git a/src/com/android/settings/accessibility/MagnificationModePreferenceController.java b/src/com/android/settings/accessibility/MagnificationModePreferenceController.java index 49e0bdf8651..91eb2e9b402 100644 --- a/src/com/android/settings/accessibility/MagnificationModePreferenceController.java +++ b/src/com/android/settings/accessibility/MagnificationModePreferenceController.java @@ -25,11 +25,13 @@ import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.provider.Settings; +import android.text.method.LinkMovementMethod; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import android.widget.ListView; +import android.widget.TextView; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; @@ -42,6 +44,7 @@ import com.android.settings.DialogCreatable; import com.android.settings.R; import com.android.settings.accessibility.MagnificationCapabilities.MagnificationMode; import com.android.settings.core.BasePreferenceController; +import com.android.settings.utils.AnnotationSpan; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnCreate; import com.android.settingslib.core.lifecycle.events.OnResume; @@ -70,6 +73,7 @@ public class MagnificationModePreferenceController extends BasePreferenceControl @MagnificationMode private int mModeCache = MagnificationMode.NONE; private Preference mModePreference; + private ShortcutPreference mLinkPreference; @VisibleForTesting ListView mMagnificationModesListView; @@ -117,6 +121,8 @@ public class MagnificationModePreferenceController extends BasePreferenceControl public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); mModePreference = screen.findPreference(getPreferenceKey()); + mLinkPreference = screen.findPreference( + ToggleFeaturePreferenceFragment.KEY_SHORTCUT_PREFERENCE); mModePreference.setOnPreferenceClickListener(preference -> { mModeCache = MagnificationCapabilities.getCapabilities(mContext); mDialogHelper.showDialog(DIALOG_MAGNIFICATION_MODE); @@ -248,9 +254,33 @@ public class MagnificationModePreferenceController extends BasePreferenceControl final CharSequence negativeBtnText = mContext.getString( R.string.accessibility_magnification_triple_tap_warning_negative_button); - return AccessibilityDialogUtils.createCustomDialog(mContext, title, contentView, + final Dialog dialog = AccessibilityDialogUtils.createCustomDialog(mContext, title, + contentView, positiveBtnText, this::onMagnificationTripleTapWarningDialogPositiveButtonClicked, negativeBtnText, this::onMagnificationTripleTapWarningDialogNegativeButtonClicked); + + updateLinkInTripleTapWarningDialog(dialog, contentView); + + return dialog; + } + + private void updateLinkInTripleTapWarningDialog(Dialog dialog, View contentView) { + final TextView messageView = contentView.findViewById(R.id.message); + // TODO(b/225682559): Need to remove performClick() after refactoring accessibility dialog. + final View.OnClickListener linkListener = view -> { + mLinkPreference.performClick(); + dialog.dismiss(); + }; + final AnnotationSpan.LinkInfo linkInfo = new AnnotationSpan.LinkInfo( + AnnotationSpan.LinkInfo.DEFAULT_ANNOTATION, linkListener); + final CharSequence textWithLink = AnnotationSpan.linkify(mContext.getText( + R.string.accessibility_magnification_triple_tap_warning_message), linkInfo); + + if (messageView != null) { + messageView.setText(textWithLink); + messageView.setMovementMethod(LinkMovementMethod.getInstance()); + } + dialog.setContentView(contentView); } @VisibleForTesting diff --git a/src/com/android/settings/accessibility/ShortcutPreference.java b/src/com/android/settings/accessibility/ShortcutPreference.java index cff91171abe..ec911a90259 100644 --- a/src/com/android/settings/accessibility/ShortcutPreference.java +++ b/src/com/android/settings/accessibility/ShortcutPreference.java @@ -64,6 +64,11 @@ public class ShortcutPreference extends Preference { setLayoutResource(R.layout.accessibility_shortcut_secondary_action); setWidgetLayoutResource(R.layout.preference_widget_primary_switch); setIconSpaceReserved(false); + // Treat onSettingsClicked as this preference's click. + setOnPreferenceClickListener(preference -> { + callOnSettingsClicked(); + return true; + }); } @Override diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java index fd1937620b7..e123a5387f7 100644 --- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java @@ -102,7 +102,7 @@ public abstract class ToggleFeaturePreferenceFragment extends SettingsPreference protected static final String KEY_USE_SERVICE_PREFERENCE = "use_service"; public static final String KEY_GENERAL_CATEGORY = "general_categories"; protected static final String KEY_HTML_DESCRIPTION_PREFERENCE = "html_description"; - private static final String KEY_SHORTCUT_PREFERENCE = "shortcut_preference"; + public static final String KEY_SHORTCUT_PREFERENCE = "shortcut_preference"; protected static final String KEY_SAVED_USER_SHORTCUT_TYPE = "shortcut_type"; protected static final String KEY_SAVED_QS_TOOLTIP_RESHOW = "qs_tooltip_reshow"; protected static final String KEY_SAVED_QS_TOOLTIP_TYPE = "qs_tooltip_type"; diff --git a/tests/robotests/src/com/android/settings/accessibility/MagnificationModePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/MagnificationModePreferenceControllerTest.java index c5657f477f7..30ba9b6170e 100644 --- a/tests/robotests/src/com/android/settings/accessibility/MagnificationModePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/MagnificationModePreferenceControllerTest.java @@ -30,9 +30,12 @@ import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.provider.Settings; +import android.text.SpannableString; import android.text.TextUtils; +import android.view.View; import android.widget.AdapterView; import android.widget.ListView; +import android.widget.TextView; import androidx.preference.Preference; import androidx.preference.PreferenceManager; @@ -41,6 +44,7 @@ import androidx.test.core.app.ApplicationProvider; import com.android.settings.DialogCreatable; import com.android.settings.R; +import com.android.settings.utils.AnnotationSpan; import org.junit.Before; import org.junit.Rule; @@ -177,6 +181,21 @@ public class MagnificationModePreferenceControllerTest { assertThat(TextUtils.equals(mController.getSummary(), allSummary)).isTrue(); } + @Test + public void checkSpansInTripleTapWarningDialog_existAnnotationSpan() { + mDialogHelper.showDialog( + MagnificationModePreferenceController.DIALOG_MAGNIFICATION_TRIPLE_TAP_WARNING); + final View contentView = mDialogHelper.getDialog().findViewById(android.R.id.content); + final TextView messageView = contentView.findViewById(R.id.message); + final CharSequence textInTripleTapWarningDialog = messageView.getText(); + + final AnnotationSpan[] annotationSpans = + ((SpannableString) textInTripleTapWarningDialog).getSpans(/*queryStart= */ 0, + textInTripleTapWarningDialog.length(), AnnotationSpan.class); + + assertThat(annotationSpans[0]).isNotNull(); + } + @Test public void getSummary_saveWindowScreen_shouldReturnWindowScreenSummary() { MagnificationCapabilities.setCapabilities(mContext, MagnificationMode.WINDOW); diff --git a/tests/robotests/src/com/android/settings/accessibility/ShortcutPreferenceTest.java b/tests/robotests/src/com/android/settings/accessibility/ShortcutPreferenceTest.java index 714ef9a1129..ee271fe99b1 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ShortcutPreferenceTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ShortcutPreferenceTest.java @@ -23,6 +23,7 @@ import android.view.LayoutInflater; import android.view.View; import androidx.preference.PreferenceViewHolder; +import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; @@ -30,7 +31,6 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; /** Tests for {@link ShortcutPreference} */ @RunWith(RobolectricTestRunner.class) @@ -58,7 +58,7 @@ public class ShortcutPreferenceTest { @Before public void setUp() { - final Context context = RuntimeEnvironment.application; + final Context context = ApplicationProvider.getApplicationContext(); mShortcutPreference = new ShortcutPreference(context, null); final LayoutInflater inflater = LayoutInflater.from(context); @@ -95,4 +95,13 @@ 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); + } }