diff --git a/res/layout/accessibility_text_reading_reset_button.xml b/res/layout/accessibility_text_reading_reset_button.xml index dd9128b4eda..f3691e1f816 100644 --- a/res/layout/accessibility_text_reading_reset_button.xml +++ b/res/layout/accessibility_text_reading_reset_button.xml @@ -27,9 +27,14 @@ android:id="@+id/reset_button" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" - android:paddingHorizontal="24dp" + android:layout_gravity="center|end" android:paddingVertical="14dp" - android:text="@string/accessibility_text_reading_reset_button_title" - style="@style/ActionPrimaryButton"/> + android:background="@null" + android:drawableStart="@drawable/ic_history" + android:drawablePadding="9dp" + android:drawableTint="?android:attr/colorAccent" + android:textColor="?android:attr/colorAccent" + android:textSize="16sp" + android:textAppearance="@android:style/TextAppearance.DeviceDefault.Medium" + android:text="@string/accessibility_text_reading_reset_button_title"/> diff --git a/src/com/android/settings/accessibility/AccessibilityDialogUtils.java b/src/com/android/settings/accessibility/AccessibilityDialogUtils.java index 3d0c1dbe853..a0cc77eafa5 100644 --- a/src/com/android/settings/accessibility/AccessibilityDialogUtils.java +++ b/src/com/android/settings/accessibility/AccessibilityDialogUtils.java @@ -118,6 +118,11 @@ public class AccessibilityDialogUtils { * launch tutorial. */ int LAUNCH_ACCESSIBILITY_TUTORIAL = 1008; + + /** + * OPEN: Settings > Accessibility > Display size and text > Click 'Reset settings' button. + */ + int DIALOG_RESET_SETTINGS = 1009; } /** diff --git a/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java b/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java index 7dd70aff596..da0287677f6 100644 --- a/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java +++ b/src/com/android/settings/accessibility/TextReadingPreferenceFragment.java @@ -18,10 +18,15 @@ package com.android.settings.accessibility; import static com.android.settings.accessibility.TextReadingResetController.ResetStateListener; +import android.app.Dialog; import android.app.settings.SettingsEnums; import android.content.Context; +import android.content.DialogInterface; + +import androidx.appcompat.app.AlertDialog; import com.android.settings.R; +import com.android.settings.accessibility.AccessibilityDialogUtils.DialogEnums; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.core.AbstractPreferenceController; @@ -88,16 +93,54 @@ public class TextReadingPreferenceFragment extends DashboardFragment { new HighTextContrastPreferenceController(context, HIGHT_TEXT_CONTRAST_KEY); controllers.add(highTextContrastController); - final List resetStateListeners = - controllers.stream().filter(c -> c instanceof ResetStateListener).map( - c -> (ResetStateListener) c).collect(Collectors.toList()); final TextReadingResetController resetController = - new TextReadingResetController(context, RESET_KEY, resetStateListeners); + new TextReadingResetController(context, RESET_KEY, + v -> showDialog(DialogEnums.DIALOG_RESET_SETTINGS)); controllers.add(resetController); return controllers; } + @Override + public Dialog onCreateDialog(int dialogId) { + if (dialogId == DialogEnums.DIALOG_RESET_SETTINGS) { + return new AlertDialog.Builder(getPrefContext()) + .setTitle(R.string.accessibility_text_reading_confirm_dialog_title) + .setMessage(R.string.accessibility_text_reading_confirm_dialog_message) + .setPositiveButton( + R.string.accessibility_text_reading_confirm_dialog_reset_button, + this::onPositiveButtonClicked) + .setNegativeButton(R.string.cancel, /* listener= */ null) + .create(); + } + + throw new IllegalArgumentException("Unsupported dialogId " + dialogId); + } + + @Override + public int getDialogMetricsCategory(int dialogId) { + if (dialogId == DialogEnums.DIALOG_RESET_SETTINGS) { + return SettingsEnums.DIALOG_RESET_SETTINGS; + } + + return super.getDialogMetricsCategory(dialogId); + } + + private void onPositiveButtonClicked(DialogInterface dialog, int which) { + // To avoid showing the dialog again, probably the onDetach() of SettingsDialogFragment + // was interrupted by unexpectedly recreating the activity. + removeDialog(DialogEnums.DIALOG_RESET_SETTINGS); + + getResetStateListeners().forEach(ResetStateListener::resetState); + } + + private List getResetStateListeners() { + final List controllers = new ArrayList<>(); + getPreferenceControllers().forEach(controllers::addAll); + return controllers.stream().filter(c -> c instanceof ResetStateListener).map( + c -> (ResetStateListener) c).collect(Collectors.toList()); + } + public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider(R.xml.accessibility_text_reading_options); } diff --git a/src/com/android/settings/accessibility/TextReadingResetController.java b/src/com/android/settings/accessibility/TextReadingResetController.java index f4752cb75fd..152ad5fe4f1 100644 --- a/src/com/android/settings/accessibility/TextReadingResetController.java +++ b/src/com/android/settings/accessibility/TextReadingResetController.java @@ -19,25 +19,23 @@ package com.android.settings.accessibility; import android.content.Context; import android.view.View; -import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; import com.android.settingslib.widget.LayoutPreference; -import java.util.List; - /** * The controller of the reset button in the text and reading options page. */ class TextReadingResetController extends BasePreferenceController { - private final List mListeners; + private final View.OnClickListener mOnResetClickListener; TextReadingResetController(Context context, String preferenceKey, - @NonNull List listeners) { + @Nullable View.OnClickListener listener) { super(context, preferenceKey); - mListeners = listeners; + mOnResetClickListener = listener; } @Override @@ -51,7 +49,11 @@ class TextReadingResetController extends BasePreferenceController { final LayoutPreference layoutPreference = screen.findPreference(getPreferenceKey()); final View view = layoutPreference.findViewById(R.id.reset_button); - view.setOnClickListener(v -> mListeners.forEach(ResetStateListener::resetState)); + view.setOnClickListener(v -> { + if (mOnResetClickListener != null) { + mOnResetClickListener.onClick(v); + } + }); } /** diff --git a/tests/robotests/src/com/android/settings/accessibility/TextReadingResetControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/TextReadingResetControllerTest.java index 2ae8e242a1e..2e4566ceac0 100644 --- a/tests/robotests/src/com/android/settings/accessibility/TextReadingResetControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/TextReadingResetControllerTest.java @@ -16,10 +16,10 @@ package com.android.settings.accessibility; -import static com.android.settings.accessibility.TextReadingResetController.ResetStateListener; - import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; @@ -29,7 +29,6 @@ import androidx.preference.PreferenceScreen; import androidx.test.core.app.ApplicationProvider; import com.android.settings.R; -import com.android.settings.core.BasePreferenceController; import com.android.settingslib.widget.LayoutPreference; import org.junit.Before; @@ -39,21 +38,18 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.RobolectricTestRunner; -import java.util.ArrayList; -import java.util.List; - /** * Tests for {@link TextReadingResetController}. */ @RunWith(RobolectricTestRunner.class) public class TextReadingResetControllerTest { - private static final String TEST_KEY = "test"; private static final String RESET_KEY = "reset"; private final Context mContext = ApplicationProvider.getApplicationContext(); private final View mResetView = new View(mContext); - private final List mListeners = new ArrayList<>(); private TextReadingResetController mResetController; - private TestPreferenceController mPreferenceController; + + @Mock + private View.OnClickListener mOnResetButtonClickListener; @Mock private PreferenceScreen mPreferenceScreen; @@ -64,10 +60,8 @@ public class TextReadingResetControllerTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - - mPreferenceController = new TestPreferenceController(mContext, TEST_KEY); - mListeners.add(mPreferenceController); - mResetController = new TextReadingResetController(mContext, RESET_KEY, mListeners); + mResetController = new TextReadingResetController(mContext, RESET_KEY, + mOnResetButtonClickListener); } @Test @@ -80,40 +74,17 @@ public class TextReadingResetControllerTest { } @Test - public void triggerResetState_success() { + public void clickResetButtonAfterDisplayPreference_verifyClickListener() { setupResetButton(); mResetController.displayPreference(mPreferenceScreen); mResetView.callOnClick(); - assertThat(mPreferenceController.isReset()).isTrue(); + verify(mOnResetButtonClickListener).onClick(any(View.class)); } private void setupResetButton() { when(mPreferenceScreen.findPreference(RESET_KEY)).thenReturn(mLayoutPreference); when(mLayoutPreference.findViewById(R.id.reset_button)).thenReturn(mResetView); } - - private static class TestPreferenceController extends BasePreferenceController implements - ResetStateListener { - private boolean mIsReset = false; - - TestPreferenceController(Context context, String preferenceKey) { - super(context, preferenceKey); - } - - @Override - public void resetState() { - mIsReset = true; - } - - @Override - public int getAvailabilityStatus() { - return AVAILABLE; - } - - boolean isReset() { - return mIsReset; - } - } }