Merge "Create tooltip for notifying auto-adding the font scaling tile" into udc-dev
This commit is contained in:
@@ -16,14 +16,22 @@
|
||||
|
||||
package com.android.settings.accessibility;
|
||||
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.widget.SeekBar;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.preference.PreferenceScreen;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.core.BasePreferenceController;
|
||||
import com.android.settings.widget.LabeledSeekBarPreference;
|
||||
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
||||
import com.android.settingslib.core.lifecycle.events.OnCreate;
|
||||
import com.android.settingslib.core.lifecycle.events.OnDestroy;
|
||||
import com.android.settingslib.core.lifecycle.events.OnSaveInstanceState;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
@@ -31,12 +39,19 @@ import java.util.Optional;
|
||||
* The controller of {@link LabeledSeekBarPreference} that listens to display size and font size
|
||||
* settings changes and updates preview size threshold smoothly.
|
||||
*/
|
||||
class PreviewSizeSeekBarController extends BasePreferenceController implements
|
||||
TextReadingResetController.ResetStateListener {
|
||||
abstract class PreviewSizeSeekBarController extends BasePreferenceController implements
|
||||
TextReadingResetController.ResetStateListener, LifecycleObserver, OnCreate,
|
||||
OnDestroy, OnSaveInstanceState {
|
||||
private final PreviewSizeData<? extends Number> mSizeData;
|
||||
private static final String KEY_SAVED_QS_TOOLTIP_RESHOW = "qs_tooltip_reshow";
|
||||
private boolean mSeekByTouch;
|
||||
private Optional<ProgressInteractionListener> mInteractionListener = Optional.empty();
|
||||
private LabeledSeekBarPreference mSeekBarPreference;
|
||||
private int mLastProgress;
|
||||
private boolean mNeedsQSTooltipReshow = false;
|
||||
private AccessibilityQuickSettingsTooltipWindow mTooltipWindow;
|
||||
private final Handler mHandler;
|
||||
|
||||
|
||||
private final SeekBar.OnSeekBarChangeListener mSeekBarChangeListener =
|
||||
new SeekBar.OnSeekBarChangeListener() {
|
||||
@@ -54,6 +69,7 @@ class PreviewSizeSeekBarController extends BasePreferenceController implements
|
||||
|
||||
if (!mSeekByTouch) {
|
||||
interactionListener.onProgressChanged();
|
||||
onProgressFinalized();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -67,6 +83,7 @@ class PreviewSizeSeekBarController extends BasePreferenceController implements
|
||||
mSeekByTouch = false;
|
||||
|
||||
mInteractionListener.ifPresent(ProgressInteractionListener::onEndTrackingTouch);
|
||||
onProgressFinalized();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -74,6 +91,30 @@ class PreviewSizeSeekBarController extends BasePreferenceController implements
|
||||
@NonNull PreviewSizeData<? extends Number> sizeData) {
|
||||
super(context, preferenceKey);
|
||||
mSizeData = sizeData;
|
||||
mHandler = new Handler(context.getMainLooper());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
// Restore the tooltip.
|
||||
if (savedInstanceState != null
|
||||
&& savedInstanceState.containsKey(KEY_SAVED_QS_TOOLTIP_RESHOW)) {
|
||||
mNeedsQSTooltipReshow = savedInstanceState.getBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
// remove runnables in the queue.
|
||||
mHandler.removeCallbacksAndMessages(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSaveInstanceState(Bundle outState) {
|
||||
final boolean isTooltipWindowShowing = mTooltipWindow != null && mTooltipWindow.isShowing();
|
||||
if (mNeedsQSTooltipReshow || isTooltipWindowShowing) {
|
||||
outState.putBoolean(KEY_SAVED_QS_TOOLTIP_RESHOW, /* value= */ true);
|
||||
}
|
||||
}
|
||||
|
||||
void setInteractionListener(ProgressInteractionListener interactionListener) {
|
||||
@@ -91,11 +132,15 @@ class PreviewSizeSeekBarController extends BasePreferenceController implements
|
||||
|
||||
final int dataSize = mSizeData.getValues().size();
|
||||
final int initialIndex = mSizeData.getInitialIndex();
|
||||
mLastProgress = initialIndex;
|
||||
mSeekBarPreference = screen.findPreference(getPreferenceKey());
|
||||
mSeekBarPreference.setMax(dataSize - 1);
|
||||
mSeekBarPreference.setProgress(initialIndex);
|
||||
mSeekBarPreference.setContinuousUpdates(true);
|
||||
mSeekBarPreference.setOnSeekBarChangeListener(mSeekBarChangeListener);
|
||||
if (mNeedsQSTooltipReshow) {
|
||||
mHandler.post(this::showQuickSettingsTooltipIfNeeded);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -108,6 +153,44 @@ class PreviewSizeSeekBarController extends BasePreferenceController implements
|
||||
mInteractionListener.ifPresent(ProgressInteractionListener::onProgressChanged);
|
||||
}
|
||||
|
||||
private void onProgressFinalized() {
|
||||
// Using progress in SeekBarPreference since the progresses in
|
||||
// SeekBarPreference and seekbar are not always the same.
|
||||
// See {@link androidx.preference.Preference#callChangeListener(Object)}
|
||||
int seekBarPreferenceProgress = mSeekBarPreference.getProgress();
|
||||
if (seekBarPreferenceProgress != mLastProgress) {
|
||||
showQuickSettingsTooltipIfNeeded();
|
||||
mLastProgress = seekBarPreferenceProgress;
|
||||
}
|
||||
}
|
||||
|
||||
private void showQuickSettingsTooltipIfNeeded() {
|
||||
final ComponentName tileComponentName = getTileComponentName();
|
||||
if (tileComponentName == null) {
|
||||
// Returns if no tile service assigned.
|
||||
return;
|
||||
}
|
||||
|
||||
if (!mNeedsQSTooltipReshow && AccessibilityQuickSettingUtils.hasValueInSharedPreferences(
|
||||
mContext, tileComponentName)) {
|
||||
// Returns if quick settings tooltip only show once.
|
||||
return;
|
||||
}
|
||||
|
||||
mTooltipWindow = new AccessibilityQuickSettingsTooltipWindow(mContext);
|
||||
mTooltipWindow.setup(getTileTooltipContent(),
|
||||
R.drawable.accessibility_auto_added_qs_tooltip_illustration);
|
||||
mTooltipWindow.showAtTopCenter(mSeekBarPreference.getSeekbar());
|
||||
AccessibilityQuickSettingUtils.optInValueToSharedPreferences(mContext, tileComponentName);
|
||||
mNeedsQSTooltipReshow = false;
|
||||
}
|
||||
|
||||
/** Returns the accessibility Quick Settings tile component name. */
|
||||
abstract ComponentName getTileComponentName();
|
||||
|
||||
/** Returns accessibility Quick Settings tile tooltip content. */
|
||||
abstract CharSequence getTileTooltipContent();
|
||||
|
||||
|
||||
/**
|
||||
* Interface for callbacks when users interact with the seek bar.
|
||||
|
@@ -16,11 +16,13 @@
|
||||
|
||||
package com.android.settings.accessibility;
|
||||
|
||||
import static com.android.internal.accessibility.AccessibilityShortcutController.FONT_SIZE_COMPONENT_NAME;
|
||||
import static com.android.settings.accessibility.TextReadingResetController.ResetStateListener;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Dialog;
|
||||
import android.app.settings.SettingsEnums;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.os.Bundle;
|
||||
@@ -156,12 +158,34 @@ public class TextReadingPreferenceFragment extends DashboardFragment {
|
||||
controllers.add(mPreviewController);
|
||||
|
||||
final PreviewSizeSeekBarController fontSizeController = new PreviewSizeSeekBarController(
|
||||
context, FONT_SIZE_KEY, fontSizeData);
|
||||
context, FONT_SIZE_KEY, fontSizeData) {
|
||||
@Override
|
||||
ComponentName getTileComponentName() {
|
||||
return FONT_SIZE_COMPONENT_NAME;
|
||||
}
|
||||
|
||||
@Override
|
||||
CharSequence getTileTooltipContent() {
|
||||
return context.getText(
|
||||
R.string.accessibility_font_scaling_auto_added_qs_tooltip_content);
|
||||
}
|
||||
};
|
||||
fontSizeController.setInteractionListener(mPreviewController);
|
||||
getSettingsLifecycle().addObserver(fontSizeController);
|
||||
controllers.add(fontSizeController);
|
||||
|
||||
final PreviewSizeSeekBarController displaySizeController = new PreviewSizeSeekBarController(
|
||||
context, DISPLAY_SIZE_KEY, displaySizeData);
|
||||
context, DISPLAY_SIZE_KEY, displaySizeData) {
|
||||
@Override
|
||||
ComponentName getTileComponentName() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
CharSequence getTileTooltipContent() {
|
||||
return null;
|
||||
}
|
||||
};
|
||||
displaySizeController.setInteractionListener(mPreviewController);
|
||||
controllers.add(displaySizeController);
|
||||
|
||||
|
@@ -63,6 +63,8 @@ public class LabeledSeekBarPreference extends SeekBarPreference {
|
||||
private OnPreferenceChangeListener mStopListener;
|
||||
private SeekBar.OnSeekBarChangeListener mSeekBarChangeListener;
|
||||
|
||||
private SeekBar mSeekBar;
|
||||
|
||||
public LabeledSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr,
|
||||
int defStyleRes) {
|
||||
|
||||
@@ -104,6 +106,10 @@ public class LabeledSeekBarPreference extends SeekBarPreference {
|
||||
com.android.internal.R.attr.seekBarPreferenceStyle), 0);
|
||||
}
|
||||
|
||||
public SeekBar getSeekbar() {
|
||||
return mSeekBar;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(PreferenceViewHolder holder) {
|
||||
super.onBindViewHolder(holder);
|
||||
@@ -133,19 +139,19 @@ public class LabeledSeekBarPreference extends SeekBarPreference {
|
||||
final boolean isValidTextResIdExist = mTextStartId > 0 || mTextEndId > 0;
|
||||
labelFrame.setVisibility(isValidTextResIdExist ? View.VISIBLE : View.GONE);
|
||||
|
||||
final SeekBar seekBar = (SeekBar) holder.findViewById(com.android.internal.R.id.seekbar);
|
||||
mSeekBar = (SeekBar) holder.findViewById(com.android.internal.R.id.seekbar);
|
||||
if (mTickMarkId != 0) {
|
||||
final Drawable tickMark = getContext().getDrawable(mTickMarkId);
|
||||
seekBar.setTickMark(tickMark);
|
||||
mSeekBar.setTickMark(tickMark);
|
||||
}
|
||||
|
||||
final ViewGroup iconStartFrame = (ViewGroup) holder.findViewById(R.id.icon_start_frame);
|
||||
final ImageView iconStartView = (ImageView) holder.findViewById(R.id.icon_start);
|
||||
updateIconStartIfNeeded(iconStartFrame, iconStartView, seekBar);
|
||||
updateIconStartIfNeeded(iconStartFrame, iconStartView, mSeekBar);
|
||||
|
||||
final ViewGroup iconEndFrame = (ViewGroup) holder.findViewById(R.id.icon_end_frame);
|
||||
final ImageView iconEndView = (ImageView) holder.findViewById(R.id.icon_end);
|
||||
updateIconEndIfNeeded(iconEndFrame, iconEndView, seekBar);
|
||||
updateIconEndIfNeeded(iconEndFrame, iconEndView, mSeekBar);
|
||||
}
|
||||
|
||||
public void setOnPreferenceChangeStopListener(OnPreferenceChangeListener listener) {
|
||||
|
Reference in New Issue
Block a user