Create tooltip for notifying auto-adding the font scaling tile
1. Add string for the content of tooltip. 2. Show the tooltip if needed: the tooltip will only be shown once when users change the font size from the Settings page for the first time. 3. Since the layout shown on the screen will be recreated after font size changes, we need to save the state of the tooltip popup window to check if we need to reshow it in displayPreference. Bug: 269679768 Test: Manually - attach videos to the bug Test: make RunSettingsRoboTests ROBOTEST_FILTER=PreviewSizeSeekBarControllerTest Change-Id: I1b6c5fdbd74c7a868cf42bd21d2cdb1052c0bbe6
This commit is contained in:
@@ -16,29 +16,45 @@
|
||||
|
||||
package com.android.settings.accessibility;
|
||||
|
||||
import static com.android.internal.accessibility.AccessibilityShortcutController.FONT_SIZE_COMPONENT_NAME;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.anyString;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.widget.PopupWindow;
|
||||
import android.widget.SeekBar;
|
||||
|
||||
import androidx.preference.PreferenceManager;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
import androidx.preference.PreferenceViewHolder;
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsPreferenceFragment;
|
||||
import com.android.settings.testutils.shadow.ShadowFragment;
|
||||
import com.android.settings.testutils.shadow.ShadowInteractionJankMonitor;
|
||||
import com.android.settings.widget.LabeledSeekBarPreference;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Answers;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.mockito.Spy;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.annotation.Config;
|
||||
import org.robolectric.shadow.api.Shadow;
|
||||
import org.robolectric.shadows.ShadowApplication;
|
||||
|
||||
/**
|
||||
* Tests for {@link PreviewSizeSeekBarController}.
|
||||
@@ -47,30 +63,67 @@ import org.robolectric.annotation.Config;
|
||||
@Config(shadows = {ShadowInteractionJankMonitor.class})
|
||||
public class PreviewSizeSeekBarControllerTest {
|
||||
private static final String FONT_SIZE_KEY = "font_size";
|
||||
private static final String KEY_SAVED_QS_TOOLTIP_RESHOW = "qs_tooltip_reshow";
|
||||
@Spy
|
||||
private final Context mContext = ApplicationProvider.getApplicationContext();
|
||||
private PreviewSizeSeekBarController mSeekBarController;
|
||||
private FontSizeData mFontSizeData;
|
||||
private LabeledSeekBarPreference mSeekBarPreference;
|
||||
|
||||
@Mock
|
||||
private PreferenceScreen mPreferenceScreen;
|
||||
private TestFragment mFragment;
|
||||
private PreferenceViewHolder mHolder;
|
||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
||||
private PreferenceManager mPreferenceManager;
|
||||
|
||||
@Mock
|
||||
private PreviewSizeSeekBarController.ProgressInteractionListener mInteractionListener;
|
||||
|
||||
private static PopupWindow getLatestPopupWindow() {
|
||||
final ShadowApplication shadowApplication =
|
||||
Shadow.extract(ApplicationProvider.getApplicationContext());
|
||||
return shadowApplication.getLatestPopupWindow();
|
||||
}
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
|
||||
mFontSizeData = new FontSizeData(mContext);
|
||||
|
||||
mSeekBarController =
|
||||
new PreviewSizeSeekBarController(mContext, FONT_SIZE_KEY, mFontSizeData);
|
||||
|
||||
mContext.setTheme(R.style.Theme_AppCompat);
|
||||
mFragment = spy(new TestFragment());
|
||||
when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager);
|
||||
when(mFragment.getPreferenceManager().getContext()).thenReturn(mContext);
|
||||
when(mFragment.getContext()).thenReturn(mContext);
|
||||
mPreferenceScreen = spy(new PreferenceScreen(mContext, /* attrs= */ null));
|
||||
when(mPreferenceScreen.getPreferenceManager()).thenReturn(mPreferenceManager);
|
||||
doReturn(mPreferenceScreen).when(mFragment).getPreferenceScreen();
|
||||
mSeekBarPreference = spy(new LabeledSeekBarPreference(mContext, /* attrs= */ null));
|
||||
mSeekBarPreference.setKey(FONT_SIZE_KEY);
|
||||
|
||||
LayoutInflater inflater = LayoutInflater.from(mContext);
|
||||
mHolder = PreferenceViewHolder.createInstanceForTests(inflater.inflate(
|
||||
R.layout.preference_labeled_slider, null));
|
||||
mSeekBarPreference.onBindViewHolder(mHolder);
|
||||
|
||||
when(mPreferenceScreen.findPreference(anyString())).thenReturn(mSeekBarPreference);
|
||||
|
||||
mFontSizeData = new FontSizeData(mContext);
|
||||
mSeekBarController =
|
||||
new PreviewSizeSeekBarController(mContext, FONT_SIZE_KEY, mFontSizeData) {
|
||||
@Override
|
||||
ComponentName getTileComponentName() {
|
||||
return FONT_SIZE_COMPONENT_NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
CharSequence getTileTooltipContent() {
|
||||
return mContext.getText(
|
||||
R.string.accessibility_font_scaling_auto_added_qs_tooltip_content);
|
||||
}
|
||||
};
|
||||
mSeekBarController.setInteractionListener(mInteractionListener);
|
||||
when(mPreferenceScreen.findPreference(mSeekBarController.getPreferenceKey())).thenReturn(
|
||||
mSeekBarPreference);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -123,4 +176,64 @@ public class PreviewSizeSeekBarControllerTest {
|
||||
|
||||
verify(mInteractionListener).notifyPreferenceChanged();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onProgressChanged_showTooltipView() {
|
||||
mSeekBarController.displayPreference(mPreferenceScreen);
|
||||
|
||||
// Simulate changing the progress for the first time
|
||||
int newProgress = (mSeekBarPreference.getProgress() != 0) ? 0 : mSeekBarPreference.getMax();
|
||||
mSeekBarPreference.setProgress(newProgress);
|
||||
mSeekBarPreference.onProgressChanged(new SeekBar(mContext),
|
||||
newProgress,
|
||||
/* fromUser= */ false);
|
||||
|
||||
assertThat(getLatestPopupWindow().isShowing()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onProgressChanged_tooltipViewHasBeenShown_notShowTooltipView() {
|
||||
mSeekBarController.displayPreference(mPreferenceScreen);
|
||||
// Simulate changing the progress for the first time
|
||||
int newProgress = (mSeekBarPreference.getProgress() != 0) ? 0 : mSeekBarPreference.getMax();
|
||||
mSeekBarPreference.setProgress(newProgress);
|
||||
mSeekBarPreference.onProgressChanged(new SeekBar(mContext),
|
||||
newProgress,
|
||||
/* fromUser= */ false);
|
||||
getLatestPopupWindow().dismiss();
|
||||
|
||||
// Simulate progress changing for the second time
|
||||
newProgress = (mSeekBarPreference.getProgress() != 0) ? 0 : mSeekBarPreference.getMax();
|
||||
mSeekBarPreference.setProgress(newProgress);
|
||||
mSeekBarPreference.onProgressChanged(new SeekBar(mContext),
|
||||
newProgress,
|
||||
/* fromUser= */ false);
|
||||
|
||||
assertThat(getLatestPopupWindow().isShowing()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
@Config(shadows = ShadowFragment.class)
|
||||
public void restoreValueFromSavedInstanceState_showTooltipView() {
|
||||
final Bundle savedInstanceState = new Bundle();
|
||||
savedInstanceState.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, /* value= */ true);
|
||||
mSeekBarController.onCreate(savedInstanceState);
|
||||
|
||||
mSeekBarController.displayPreference(mPreferenceScreen);
|
||||
|
||||
assertThat(getLatestPopupWindow().isShowing()).isTrue();
|
||||
}
|
||||
|
||||
private static class TestFragment extends SettingsPreferenceFragment {
|
||||
|
||||
@Override
|
||||
protected boolean shouldSkipForInitialSUW() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMetricsCategory() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user