diff --git a/packages/SettingsLib/Android.bp b/packages/SettingsLib/Android.bp index 6c691f81d9a67..a65bf41210a1b 100644 --- a/packages/SettingsLib/Android.bp +++ b/packages/SettingsLib/Android.bp @@ -73,7 +73,6 @@ java_defaults { "SettingsLibCollapsingToolbarBaseActivity", "SettingsLibTwoTargetPreference", "SettingsLibSettingsTransition", - "SettingsLibSeekBarPreference", ], } diff --git a/packages/SettingsLib/SeekBarPreference/Android.bp b/packages/SettingsLib/SeekBarPreference/Android.bp deleted file mode 100644 index 98f5d2aaf6320..0000000000000 --- a/packages/SettingsLib/SeekBarPreference/Android.bp +++ /dev/null @@ -1,14 +0,0 @@ -android_library { - name: "SettingsLibSeekBarPreference", - - srcs: ["src/**/*.java"], - resource_dirs: ["res"], - - static_libs: [ - "androidx.annotation_annotation", - "androidx.preference_preference", - "SettingsLibSettingsTheme", - ], - - min_sdk_version: "28", -} diff --git a/packages/SettingsLib/SeekBarPreference/AndroidManifest.xml b/packages/SettingsLib/SeekBarPreference/AndroidManifest.xml deleted file mode 100644 index 73163fca53628..0000000000000 --- a/packages/SettingsLib/SeekBarPreference/AndroidManifest.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - diff --git a/packages/SettingsLib/SeekBarPreference/lint-baseline.xml b/packages/SettingsLib/SeekBarPreference/lint-baseline.xml deleted file mode 100644 index 934b27b72a42d..0000000000000 --- a/packages/SettingsLib/SeekBarPreference/lint-baseline.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - diff --git a/packages/SettingsLib/SeekBarPreference/res/layout/preference_labeled_slider.xml b/packages/SettingsLib/SeekBarPreference/res/layout/preference_labeled_slider.xml deleted file mode 100644 index d9d42bf9ce4e7..0000000000000 --- a/packages/SettingsLib/SeekBarPreference/res/layout/preference_labeled_slider.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/packages/SettingsLib/SeekBarPreference/res/layout/preference_widget_slider.xml b/packages/SettingsLib/SeekBarPreference/res/layout/preference_widget_slider.xml deleted file mode 100644 index f0510a2be29de..0000000000000 --- a/packages/SettingsLib/SeekBarPreference/res/layout/preference_widget_slider.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/packages/SettingsLib/SeekBarPreference/res/values/attrs.xml b/packages/SettingsLib/SeekBarPreference/res/values/attrs.xml deleted file mode 100644 index 1a24a4e84aa2f..0000000000000 --- a/packages/SettingsLib/SeekBarPreference/res/values/attrs.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - diff --git a/packages/SettingsLib/SeekBarPreference/res/values/strings.xml b/packages/SettingsLib/SeekBarPreference/res/values/strings.xml deleted file mode 100644 index 8c398446c37b7..0000000000000 --- a/packages/SettingsLib/SeekBarPreference/res/values/strings.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -   - \ No newline at end of file diff --git a/packages/SettingsLib/SeekBarPreference/src/com/android/settingslib/widget/LabeledSeekBarPreference.java b/packages/SettingsLib/SeekBarPreference/src/com/android/settingslib/widget/LabeledSeekBarPreference.java deleted file mode 100644 index 5d5ebe8ea167f..0000000000000 --- a/packages/SettingsLib/SeekBarPreference/src/com/android/settingslib/widget/LabeledSeekBarPreference.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.widget; - -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.widget.SeekBar; -import android.widget.TextView; - -import androidx.preference.PreferenceViewHolder; - -/** A slider preference with left and right labels **/ -public class LabeledSeekBarPreference extends SeekBarPreference { - - private final int mTextStartId; - private final int mTextEndId; - private final int mTickMarkId; - private OnPreferenceChangeListener mStopListener; - - public LabeledSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr, - int defStyleRes) { - - super(context, attrs, defStyleAttr, defStyleRes); - setLayoutResource(R.layout.preference_labeled_slider); - - final TypedArray styledAttrs = context.obtainStyledAttributes(attrs, - R.styleable.LabeledSeekBarPreference); - mTextStartId = styledAttrs.getResourceId( - R.styleable.LabeledSeekBarPreference_textStart, - R.string.summary_placeholder); - mTextEndId = styledAttrs.getResourceId( - R.styleable.LabeledSeekBarPreference_textEnd, - R.string.summary_placeholder); - mTickMarkId = styledAttrs.getResourceId( - R.styleable.LabeledSeekBarPreference_tickMark, /* defValue= */ 0); - styledAttrs.recycle(); - } - - public LabeledSeekBarPreference(Context context, AttributeSet attrs) { - this(context, attrs, com.android.internal.R.attr.seekBarPreferenceStyle, 0); - } - - @Override - public void onBindViewHolder(PreferenceViewHolder holder) { - super.onBindViewHolder(holder); - - final TextView startText = (TextView) holder.findViewById(android.R.id.text1); - final TextView endText = (TextView) holder.findViewById(android.R.id.text2); - startText.setText(mTextStartId); - endText.setText(mTextEndId); - - if (mTickMarkId != 0) { - final Drawable tickMark = getContext().getDrawable(mTickMarkId); - final SeekBar seekBar = (SeekBar) holder.findViewById( - com.android.internal.R.id.seekbar); - seekBar.setTickMark(tickMark); - } - } - - public void setOnPreferenceChangeStopListener(OnPreferenceChangeListener listener) { - mStopListener = listener; - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - super.onStopTrackingTouch(seekBar); - - if (mStopListener != null) { - mStopListener.onPreferenceChange(this, seekBar.getProgress()); - } - } -} - diff --git a/packages/SettingsLib/SeekBarPreference/src/com/android/settingslib/widget/SeekBarPreference.java b/packages/SettingsLib/SeekBarPreference/src/com/android/settingslib/widget/SeekBarPreference.java deleted file mode 100644 index 6f32618d5266a..0000000000000 --- a/packages/SettingsLib/SeekBarPreference/src/com/android/settingslib/widget/SeekBarPreference.java +++ /dev/null @@ -1,428 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.widget; - -import static android.view.HapticFeedbackConstants.CLOCK_TICK; - -import android.content.Context; -import android.content.res.TypedArray; -import android.os.Build; -import android.os.Parcel; -import android.os.Parcelable; -import android.text.TextUtils; -import android.util.AttributeSet; -import android.view.KeyEvent; -import android.view.View; -import android.view.accessibility.AccessibilityNodeInfo; -import android.widget.SeekBar; -import android.widget.SeekBar.OnSeekBarChangeListener; - -import androidx.annotation.RequiresApi; -import androidx.preference.Preference; -import androidx.preference.PreferenceViewHolder; - -/** - * Based on android.preference.SeekBarPreference, but uses support preference as base. - */ -public class SeekBarPreference extends Preference - implements OnSeekBarChangeListener, View.OnKeyListener { - - public static final int HAPTIC_FEEDBACK_MODE_NONE = 0; - public static final int HAPTIC_FEEDBACK_MODE_ON_TICKS = 1; - public static final int HAPTIC_FEEDBACK_MODE_ON_ENDS = 2; - protected int mDefaultProgress = -1; - protected SeekBar mSeekBar; - private int mProgress; - private int mMax; - private int mMin; - private boolean mTrackingTouch; - private boolean mContinuousUpdates; - private int mHapticFeedbackMode = HAPTIC_FEEDBACK_MODE_NONE; - private boolean mShouldBlink; - private int mAccessibilityRangeInfoType = AccessibilityNodeInfo.RangeInfo.RANGE_TYPE_INT; - private CharSequence mSeekBarContentDescription; - private CharSequence mSeekBarStateDescription; - - public SeekBarPreference( - Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - - TypedArray a = context.obtainStyledAttributes( - attrs, com.android.internal.R.styleable.ProgressBar, defStyleAttr, defStyleRes); - setMax(a.getInt(com.android.internal.R.styleable.ProgressBar_max, mMax)); - setMin(a.getInt(com.android.internal.R.styleable.ProgressBar_min, mMin)); - a.recycle(); - - a = context.obtainStyledAttributes( - attrs, com.android.internal.R.styleable.Preference, defStyleAttr, defStyleRes); - final boolean isSelectable = a.getBoolean( - R.styleable.Preference_android_selectable, false); - setSelectable(isSelectable); - a.recycle(); - - setLayoutResource(R.layout.preference_widget_slider); - } - - public SeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) { - this(context, attrs, defStyleAttr, 0); - } - - public SeekBarPreference(Context context, AttributeSet attrs) { - this(context, attrs, androidx.preference.R.attr.seekBarPreferenceStyle); - } - - public SeekBarPreference(Context context) { - this(context, null); - } - - @Override - public void onBindViewHolder(PreferenceViewHolder view) { - super.onBindViewHolder(view); - view.itemView.setOnKeyListener(this); - mSeekBar = (SeekBar) view.findViewById(com.android.internal.R.id.seekbar); - - if (mSeekBar == null) { - return; - } - - mSeekBar.setOnSeekBarChangeListener(this); - mSeekBar.setMax(mMax); - mSeekBar.setMin(mMin); - mSeekBar.setProgress(mProgress); - mSeekBar.setEnabled(isEnabled()); - final CharSequence title = getTitle(); - if (!TextUtils.isEmpty(mSeekBarContentDescription)) { - mSeekBar.setContentDescription(mSeekBarContentDescription); - } else if (!TextUtils.isEmpty(title)) { - mSeekBar.setContentDescription(title); - } - if (!TextUtils.isEmpty(mSeekBarStateDescription) && (Build.VERSION.SDK_INT - >= Build.VERSION_CODES.R)) { - mSeekBar.setStateDescription(mSeekBarStateDescription); - } - if (mShouldBlink) { - View v = view.itemView; - v.post(() -> { - if (v.getBackground() != null) { - final int centerX = v.getWidth() / 2; - final int centerY = v.getHeight() / 2; - v.getBackground().setHotspot(centerX, centerY); - } - v.setPressed(true); - v.setPressed(false); - mShouldBlink = false; - }); - } - mSeekBar.setAccessibilityDelegate(new View.AccessibilityDelegate() { - @Override - public void onInitializeAccessibilityNodeInfo(View view, AccessibilityNodeInfo info) { - super.onInitializeAccessibilityNodeInfo(view, info); - // Update the range info with the correct type - final AccessibilityNodeInfo.RangeInfo rangeInfo = info.getRangeInfo(); - if (rangeInfo != null) { - info.setRangeInfo(AccessibilityNodeInfo.RangeInfo.obtain( - mAccessibilityRangeInfoType, rangeInfo.getMin(), - rangeInfo.getMax(), rangeInfo.getCurrent())); - } - } - }); - } - - @Override - public CharSequence getSummary() { - return null; - } - - @Override - protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { - setProgress(restoreValue ? getPersistedInt(mProgress) - : (Integer) defaultValue); - } - - @Override - protected Object onGetDefaultValue(TypedArray a, int index) { - return a.getInt(index, 0); - } - - @Override - public boolean onKey(View v, int keyCode, KeyEvent event) { - if (event.getAction() != KeyEvent.ACTION_DOWN) { - return false; - } - - final SeekBar seekBar = v.findViewById(com.android.internal.R.id.seekbar); - if (seekBar == null) { - return false; - } - return seekBar.onKeyDown(keyCode, event); - } - - public int getMax() { - return mMax; - } - - /** - * Sets the upper bound on the {@link SeekBar}. - * - * @param max The upper bound to set - */ - public void setMax(int max) { - if (max != mMax) { - mMax = max; - notifyChanged(); - } - } - - public int getMin() { - return mMin; - } - - /** - * Sets the lower bound on the {@link SeekBar}. - * - * @param min The lower bound to set - */ - public void setMin(int min) { - if (min != mMin) { - mMin = min; - notifyChanged(); - } - } - - /** - * Sets the progress point to draw a single tick mark representing a default value. - */ - public void setDefaultProgress(int defaultProgress) { - if (mDefaultProgress != defaultProgress) { - mDefaultProgress = defaultProgress; - } - } - - /** - * When {@code continuousUpdates} is true, update the persisted setting immediately as the thumb - * is dragged along the SeekBar. Otherwise, only update the value of the setting when the thumb - * is dropped. - */ - public void setContinuousUpdates(boolean continuousUpdates) { - mContinuousUpdates = continuousUpdates; - } - - /** - * Sets the haptic feedback mode. HAPTIC_FEEDBACK_MODE_ON_TICKS means to perform haptic feedback - * as the SeekBar's progress is updated; HAPTIC_FEEDBACK_MODE_ON_ENDS means to perform haptic - * feedback as the SeekBar's progress value is equal to the min/max value. - * - * @param hapticFeedbackMode the haptic feedback mode. - */ - public void setHapticFeedbackMode(int hapticFeedbackMode) { - mHapticFeedbackMode = hapticFeedbackMode; - } - - private void setProgress(int progress, boolean notifyChanged) { - if (progress > mMax) { - progress = mMax; - } - if (progress < mMin) { - progress = mMin; - } - if (progress != mProgress) { - mProgress = progress; - persistInt(progress); - if (notifyChanged) { - notifyChanged(); - } - } - } - - public int getProgress() { - return mProgress; - } - - /** - * Sets the current progress of the {@link SeekBar}. - * - * @param progress The current progress of the {@link SeekBar} - */ - public void setProgress(int progress) { - setProgress(progress, true); - } - - /** - * Persist the seekBar's progress value if callChangeListener - * returns true, otherwise set the seekBar's progress to the stored value - */ - void syncProgress(SeekBar seekBar) { - int progress = seekBar.getProgress(); - if (progress != mProgress) { - if (callChangeListener(progress)) { - setProgress(progress, false); - switch (mHapticFeedbackMode) { - case HAPTIC_FEEDBACK_MODE_ON_TICKS: - seekBar.performHapticFeedback(CLOCK_TICK); - break; - case HAPTIC_FEEDBACK_MODE_ON_ENDS: - if (progress == mMax || progress == mMin) { - seekBar.performHapticFeedback(CLOCK_TICK); - } - break; - } - } else { - seekBar.setProgress(mProgress); - } - } - } - - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { - if (fromUser && (mContinuousUpdates || !mTrackingTouch)) { - syncProgress(seekBar); - } - } - - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - mTrackingTouch = true; - } - - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - mTrackingTouch = false; - if (seekBar.getProgress() != mProgress) { - syncProgress(seekBar); - } - } - - /** - * Specify the type of range this seek bar represents. - * - * @param rangeInfoType The type of range to be shared with accessibility - * @see android.view.accessibility.AccessibilityNodeInfo.RangeInfo - */ - public void setAccessibilityRangeInfoType(int rangeInfoType) { - mAccessibilityRangeInfoType = rangeInfoType; - } - - /** - * Specify the content description for this seek bar represents. - * - * @param contentDescription the content description of seek bar - */ - public void setSeekBarContentDescription(CharSequence contentDescription) { - mSeekBarContentDescription = contentDescription; - if (mSeekBar != null) { - mSeekBar.setContentDescription(contentDescription); - } - } - - /** - * Specify the state description for this seek bar represents. - * - * @param stateDescription the state description of seek bar - */ - @RequiresApi(Build.VERSION_CODES.R) - public void setSeekBarStateDescription(CharSequence stateDescription) { - mSeekBarStateDescription = stateDescription; - if (mSeekBar != null) { - mSeekBar.setStateDescription(stateDescription); - } - } - - @Override - protected Parcelable onSaveInstanceState() { - /* - * Suppose a client uses this preference type without persisting. We - * must save the instance state so it is able to, for example, survive - * orientation changes. - */ - - final Parcelable superState = super.onSaveInstanceState(); - if (isPersistent()) { - // No need to save instance state since it's persistent - return superState; - } - - // Save the instance state - final SavedState myState = new SavedState(superState); - myState.mProgress = mProgress; - myState.mMax = mMax; - myState.mMin = mMin; - return myState; - } - - @Override - protected void onRestoreInstanceState(Parcelable state) { - if (!state.getClass().equals(SavedState.class)) { - // Didn't save state for us in onSaveInstanceState - super.onRestoreInstanceState(state); - return; - } - - // Restore the instance state - SavedState myState = (SavedState) state; - super.onRestoreInstanceState(myState.getSuperState()); - mProgress = myState.mProgress; - mMax = myState.mMax; - mMin = myState.mMin; - notifyChanged(); - } - - /** - * SavedState, a subclass of {@link BaseSavedState}, will store the state - * of MyPreference, a subclass of Preference. - *

- * It is important to always call through to super methods. - */ - private static class SavedState extends BaseSavedState { - @SuppressWarnings("unused") - public static final Parcelable.Creator CREATOR = - new Parcelable.Creator() { - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - int mProgress; - int mMax; - int mMin; - - SavedState(Parcel source) { - super(source); - - // Restore the click counter - mProgress = source.readInt(); - mMax = source.readInt(); - mMin = source.readInt(); - } - - SavedState(Parcelable superState) { - super(superState); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - - // Save the click counter - dest.writeInt(mProgress); - dest.writeInt(mMax); - dest.writeInt(mMin); - } - } -} diff --git a/packages/SettingsLib/src/com/android/settingslib/Restrictable.java b/packages/SettingsLib/src/com/android/settingslib/Restrictable.java deleted file mode 100644 index dfe84233fe839..0000000000000 --- a/packages/SettingsLib/src/com/android/settingslib/Restrictable.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.android.settingslib; -import android.os.UserHandle; -/** - * A collection of API making a Preference "restrictable" - */ -public interface Restrictable { - /** - * Returns RestrictedPreferenceHelper - * @return - */ - RestrictedPreferenceHelper getHelper(); - /** - * call preference notifyChanged() - */ - void notifyPreferenceChanged(); - /** - * Set if show restriction message in Preference summary or not. - * @param useSummary. - */ - default void useAdminDisabledSummary(boolean useSummary) { - getHelper().useAdminDisabledSummary(useSummary); - } - /** - * Set the user restriction and disable this preference. - * - * @param userRestriction constant from {@link android.os.UserManager} - */ - default void checkRestrictionAndSetDisabled(String userRestriction) { - getHelper().checkRestrictionAndSetDisabled(userRestriction, UserHandle.myUserId()); - } - /** - * Set the user restriction and disable this preference for the given user. - * - * @param userRestriction constant from {@link android.os.UserManager} - * @param userId user to check the restriction for. - */ - default void checkRestrictionAndSetDisabled(String userRestriction, int userId) { - getHelper().checkRestrictionAndSetDisabled(userRestriction, userId); - } - /** - * Disable preference based on the enforce admin. - * - * @param admin details of the admin who enforced the restriction. If it is {@code null}, then - * this preference will be enabled. Otherwise, it will be disabled. - */ - default void setDisabledByAdmin(RestrictedLockUtils.EnforcedAdmin admin) { - if (getHelper().setDisabledByAdmin(admin)) { - notifyPreferenceChanged(); - } - } - /** - * Check whether this preference is disabled by admin. - * - * @return true if this preference is disabled by admin. - */ - default boolean isDisabledByAdmin() { - return getHelper().isDisabledByAdmin(); - } -} diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedPreference.java index bd0f33bcb56af..fc8b5879c5fa1 100644 --- a/packages/SettingsLib/src/com/android/settingslib/RestrictedPreference.java +++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedPreference.java @@ -16,7 +16,10 @@ package com.android.settingslib; +import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; + import android.content.Context; +import android.os.UserHandle; import android.util.AttributeSet; import android.view.View; @@ -30,8 +33,8 @@ import com.android.settingslib.widget.TwoTargetPreference; * Preference class that supports being disabled by a user restriction * set by a device admin. */ -public class RestrictedPreference extends TwoTargetPreference implements Restrictable { - private RestrictedPreferenceHelper mHelper; +public class RestrictedPreference extends TwoTargetPreference { + RestrictedPreferenceHelper mHelper; public RestrictedPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { @@ -79,14 +82,8 @@ public class RestrictedPreference extends TwoTargetPreference implements Restric } } - @Override - public RestrictedPreferenceHelper getHelper() { - return mHelper; - } - - @Override - public void notifyPreferenceChanged() { - notifyChanged(); + public void useAdminDisabledSummary(boolean useSummary) { + mHelper.useAdminDisabledSummary(useSummary); } @Override @@ -95,6 +92,14 @@ public class RestrictedPreference extends TwoTargetPreference implements Restric super.onAttachedToHierarchy(preferenceManager); } + public void checkRestrictionAndSetDisabled(String userRestriction) { + mHelper.checkRestrictionAndSetDisabled(userRestriction, UserHandle.myUserId()); + } + + public void checkRestrictionAndSetDisabled(String userRestriction, int userId) { + mHelper.checkRestrictionAndSetDisabled(userRestriction, userId); + } + @Override public void setEnabled(boolean enabled) { if (enabled && isDisabledByAdmin()) { @@ -103,4 +108,14 @@ public class RestrictedPreference extends TwoTargetPreference implements Restric } super.setEnabled(enabled); } + + public void setDisabledByAdmin(EnforcedAdmin admin) { + if (mHelper.setDisabledByAdmin(admin)) { + notifyChanged(); + } + } + + public boolean isDisabledByAdmin() { + return mHelper.isDisabledByAdmin(); + } } diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedSeekBarPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedSeekBarPreference.java deleted file mode 100644 index 486dfef9f7381..0000000000000 --- a/packages/SettingsLib/src/com/android/settingslib/RestrictedSeekBarPreference.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib; - -import android.content.Context; -import android.util.AttributeSet; -import android.view.View; - -import androidx.preference.PreferenceManager; -import androidx.preference.PreferenceViewHolder; - -import com.android.settingslib.widget.DefaultIndicatorSeekBar; -import com.android.settingslib.widget.SeekBarPreference; - -/** - * Based on android.preference.SeekBarPreference, but uses support preference as base. - */ -public class RestrictedSeekBarPreference extends SeekBarPreference implements Restrictable { - - private CharSequence mSeekBarStateDescription; - private RestrictedPreferenceHelper mHelper; - - public RestrictedSeekBarPreference( - Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - - mHelper = new RestrictedPreferenceHelper(context, this, attrs); - - final int secondTargetResId = getSecondTargetResId(); - if (secondTargetResId != 0) { - setWidgetLayoutResource(secondTargetResId); - } - } - - public RestrictedSeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) { - this(context, attrs, defStyleAttr, 0); - } - - public RestrictedSeekBarPreference(Context context, AttributeSet attrs) { - this(context, attrs, androidx.preference.R.attr.seekBarPreferenceStyle); - } - - public RestrictedSeekBarPreference(Context context) { - this(context, null); - } - - @Override - public boolean isSelectable() { - if (isDisabledByAdmin()) { - return true; - } else { - return super.isSelectable(); - } - } - - @Override - public void onBindViewHolder(PreferenceViewHolder holder) { - super.onBindViewHolder(holder); - if (mSeekBar instanceof DefaultIndicatorSeekBar) { - ((DefaultIndicatorSeekBar) mSeekBar).setDefaultProgress(mDefaultProgress); - } - - mHelper.onBindViewHolder(holder); - final View restrictedIcon = holder.findViewById(R.id.restricted_icon); - if (restrictedIcon != null) { - restrictedIcon.setVisibility(isDisabledByAdmin() ? View.VISIBLE : View.GONE); - } - - final View widgetFrame = holder.findViewById(android.R.id.widget_frame); - if (widgetFrame != null) { - widgetFrame.setVisibility(shouldHideSecondTarget() ? View.GONE : View.VISIBLE); - } - } - - @Override - public void performClick() { - if (!mHelper.performClick()) { - super.performClick(); - } - } - - @Override - public void setEnabled(boolean enabled) { - if (enabled && isDisabledByAdmin()) { - mHelper.setDisabledByAdmin(null); - return; - } - super.setEnabled(enabled); - } - - /** - * Sets the progress point to draw a single tick mark representing a default value. - */ - public void setDefaultProgress(int defaultProgress) { - if (mDefaultProgress != defaultProgress) { - mDefaultProgress = defaultProgress; - if (mSeekBar instanceof DefaultIndicatorSeekBar) { - ((DefaultIndicatorSeekBar) mSeekBar).setDefaultProgress(mDefaultProgress); - } - } - } - - @Override - public RestrictedPreferenceHelper getHelper() { - return mHelper; - } - - @Override - public void notifyPreferenceChanged() { - notifyChanged(); - } - - @Override - protected void onAttachedToHierarchy(PreferenceManager preferenceManager) { - mHelper.onAttachedToHierarchy(); - super.onAttachedToHierarchy(preferenceManager); - } - - protected int getSecondTargetResId() { - return R.layout.restricted_icon; - } - - protected boolean shouldHideSecondTarget() { - return !isDisabledByAdmin(); - } -} diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java index cdbeda8125914..5c05a1bd67226 100644 --- a/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java +++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedSwitchPreference.java @@ -16,8 +16,11 @@ package com.android.settingslib; +import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; + import android.content.Context; import android.content.res.TypedArray; +import android.os.UserHandle; import android.util.AttributeSet; import android.util.TypedValue; import android.view.View; @@ -34,10 +37,10 @@ import androidx.preference.SwitchPreference; * Version of SwitchPreference that can be disabled by a device admin * using a user restriction. */ -public class RestrictedSwitchPreference extends SwitchPreference implements Restrictable { - private RestrictedPreferenceHelper mHelper; - private boolean mUseAdditionalSummary = false; - private CharSequence mRestrictedSwitchSummary; +public class RestrictedSwitchPreference extends SwitchPreference { + RestrictedPreferenceHelper mHelper; + boolean mUseAdditionalSummary = false; + CharSequence mRestrictedSwitchSummary; private int mIconSize; public RestrictedSwitchPreference(Context context, AttributeSet attrs, @@ -150,14 +153,8 @@ public class RestrictedSwitchPreference extends SwitchPreference implements Rest } } - @Override - public RestrictedPreferenceHelper getHelper() { - return mHelper; - } - - @Override - public void notifyPreferenceChanged() { - notifyChanged(); + public void useAdminDisabledSummary(boolean useSummary) { + mHelper.useAdminDisabledSummary(useSummary); } @Override @@ -166,6 +163,14 @@ public class RestrictedSwitchPreference extends SwitchPreference implements Rest super.onAttachedToHierarchy(preferenceManager); } + public void checkRestrictionAndSetDisabled(String userRestriction) { + mHelper.checkRestrictionAndSetDisabled(userRestriction, UserHandle.myUserId()); + } + + public void checkRestrictionAndSetDisabled(String userRestriction, int userId) { + mHelper.checkRestrictionAndSetDisabled(userRestriction, userId); + } + @Override public void setEnabled(boolean enabled) { if (enabled && isDisabledByAdmin()) { @@ -174,4 +179,14 @@ public class RestrictedSwitchPreference extends SwitchPreference implements Rest } super.setEnabled(enabled); } + + public void setDisabledByAdmin(EnforcedAdmin admin) { + if (mHelper.setDisabledByAdmin(admin)) { + notifyChanged(); + } + } + + public boolean isDisabledByAdmin() { + return mHelper.isDisabledByAdmin(); + } } diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedTopLevelPreference.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedTopLevelPreference.java index 4da0e5e020d13..0096015aa875f 100644 --- a/packages/SettingsLib/src/com/android/settingslib/RestrictedTopLevelPreference.java +++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedTopLevelPreference.java @@ -16,7 +16,10 @@ package com.android.settingslib; +import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; + import android.content.Context; +import android.os.UserHandle; import android.util.AttributeSet; import androidx.core.content.res.TypedArrayUtils; @@ -25,7 +28,7 @@ import androidx.preference.PreferenceManager; import androidx.preference.PreferenceViewHolder; /** Top level preference that can be disabled by a device admin using a user restriction. */ -public class RestrictedTopLevelPreference extends Preference implements Restrictable { +public class RestrictedTopLevelPreference extends Preference { private RestrictedPreferenceHelper mHelper; public RestrictedTopLevelPreference(Context context, AttributeSet attrs, @@ -66,14 +69,23 @@ public class RestrictedTopLevelPreference extends Preference implements Restrict super.onAttachedToHierarchy(preferenceManager); } - @Override - public RestrictedPreferenceHelper getHelper() { - return mHelper; + /** + * Set the user restriction and disable this preference. + * + * @param userRestriction constant from {@link android.os.UserManager} + */ + public void checkRestrictionAndSetDisabled(String userRestriction) { + mHelper.checkRestrictionAndSetDisabled(userRestriction, UserHandle.myUserId()); } - @Override - public void notifyPreferenceChanged() { - notifyChanged(); + /** + * Set the user restriction and disable this preference for the given user. + * + * @param userRestriction constant from {@link android.os.UserManager} + * @param userId user to check the restriction for. + */ + public void checkRestrictionAndSetDisabled(String userRestriction, int userId) { + mHelper.checkRestrictionAndSetDisabled(userRestriction, userId); } @Override @@ -84,4 +96,25 @@ public class RestrictedTopLevelPreference extends Preference implements Restrict } super.setEnabled(enabled); } + + /** + * Check whether this preference is disabled by admin. + * + * @return true if this preference is disabled by admin. + */ + public boolean isDisabledByAdmin() { + return mHelper.isDisabledByAdmin(); + } + + /** + * Disable preference based on the enforce admin. + * + * @param admin details of the admin who enforced the restriction. If it is {@code null}, then + * this preference will be enabled. Otherwise, it will be disabled. + */ + public void setDisabledByAdmin(EnforcedAdmin admin) { + if (mHelper.setDisabledByAdmin(admin)) { + notifyChanged(); + } + } } diff --git a/packages/SettingsLib/src/com/android/settingslib/widget/DefaultIndicatorSeekBar.java b/packages/SettingsLib/src/com/android/settingslib/widget/DefaultIndicatorSeekBar.java deleted file mode 100644 index 7a639784de2d2..0000000000000 --- a/packages/SettingsLib/src/com/android/settingslib/widget/DefaultIndicatorSeekBar.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.widget; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.widget.SeekBar; - -/** - * Customized default indicator seekbar - */ -public class DefaultIndicatorSeekBar extends SeekBar { - - private int mDefaultProgress = -1; - - public DefaultIndicatorSeekBar(Context context) { - super(context); - } - - public DefaultIndicatorSeekBar(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public DefaultIndicatorSeekBar(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - public DefaultIndicatorSeekBar(Context context, AttributeSet attrs, int defStyleAttr, - int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - } - - /** - * N.B. Only draws the default indicator tick mark, NOT equally spaced tick marks. - */ - @Override - protected void drawTickMarks(Canvas canvas) { - if (isEnabled() && mDefaultProgress <= getMax() && mDefaultProgress >= getMin()) { - final Drawable defaultIndicator = getTickMark(); - - // Adjust the drawable's bounds to center it at the point where it's drawn. - final int w = defaultIndicator.getIntrinsicWidth(); - final int h = defaultIndicator.getIntrinsicHeight(); - final int halfW = w >= 0 ? w / 2 : 1; - final int halfH = h >= 0 ? h / 2 : 1; - defaultIndicator.setBounds(-halfW, -halfH, halfW, halfH); - - // This mimics the computation of the thumb position, to get the true "default." - final int availableWidth = getWidth() - mPaddingLeft - mPaddingRight; - final int range = getMax() - getMin(); - final float scale = range > 0f ? mDefaultProgress / (float) range : 0f; - final int offset = (int) ((scale * availableWidth) + 0.5f); - final int indicatorPosition = isLayoutRtl() && getMirrorForRtl() - ? availableWidth - offset + mPaddingRight : offset + mPaddingLeft; - - final int saveCount = canvas.save(); - canvas.translate(indicatorPosition, getHeight() / 2); - defaultIndicator.draw(canvas); - canvas.restoreToCount(saveCount); - } - } - - /** - * N.B. This sets the default *unadjusted* progress, i.e. in the SeekBar's [0 - max] terms. - */ - public void setDefaultProgress(int defaultProgress) { - if (mDefaultProgress != defaultProgress) { - mDefaultProgress = defaultProgress; - invalidate(); - } - } - - public int getDefaultProgress() { - return mDefaultProgress; - } -} diff --git a/packages/SettingsLib/tests/robotests/res/xml-mcc998/seekbar_preference.xml b/packages/SettingsLib/tests/robotests/res/xml-mcc998/seekbar_preference.xml deleted file mode 100644 index ad5775536bf4e..0000000000000 --- a/packages/SettingsLib/tests/robotests/res/xml-mcc998/seekbar_preference.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - diff --git a/packages/SettingsLib/tests/robotests/res/xml-mcc999/seekbar_preference.xml b/packages/SettingsLib/tests/robotests/res/xml-mcc999/seekbar_preference.xml deleted file mode 100644 index 28527fc90c856..0000000000000 --- a/packages/SettingsLib/tests/robotests/res/xml-mcc999/seekbar_preference.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/DefaultIndicatorSeekBarTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/DefaultIndicatorSeekBarTest.java deleted file mode 100644 index 86625481b1889..0000000000000 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/DefaultIndicatorSeekBarTest.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.widget; - -import static org.junit.Assert.assertEquals; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; - -@RunWith(RobolectricTestRunner.class) -public class DefaultIndicatorSeekBarTest { - - private DefaultIndicatorSeekBar mDefaultIndicatorSeekBar; - - @Before - public void setUp() { - mDefaultIndicatorSeekBar = new DefaultIndicatorSeekBar(RuntimeEnvironment.application); - mDefaultIndicatorSeekBar.setMax(100); - } - - @After - public void tearDown() { - mDefaultIndicatorSeekBar = null; - } - - @Test - public void defaultProgress_setSucceeds() { - mDefaultIndicatorSeekBar.setDefaultProgress(40); - assertEquals(40, mDefaultIndicatorSeekBar.getDefaultProgress()); - } -} diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/LabeledSeekBarPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/LabeledSeekBarPreferenceTest.java deleted file mode 100644 index 6dd72b460f6dd..0000000000000 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/LabeledSeekBarPreferenceTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.widget; - -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -import android.content.Context; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.LinearLayout; -import android.widget.SeekBar; - -import androidx.preference.Preference; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; - -@RunWith(RobolectricTestRunner.class) -public class LabeledSeekBarPreferenceTest { - - private Context mContext; - private SeekBar mSeekBar; - private LabeledSeekBarPreference mSeekBarPreference; - - @Mock - private Preference.OnPreferenceChangeListener mListener; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - - mContext = RuntimeEnvironment.application; - mSeekBarPreference = new LabeledSeekBarPreference(mContext, null); - LayoutInflater inflater = LayoutInflater.from(mContext); - final View view = - inflater.inflate(mSeekBarPreference.getLayoutResource(), - new LinearLayout(mContext), false); - mSeekBar = view.findViewById(com.android.internal.R.id.seekbar); - } - - @Test - public void seekBarPreferenceOnStopTrackingTouch_callsListener() { - mSeekBar.setProgress(2); - - mSeekBarPreference.setOnPreferenceChangeStopListener(mListener); - mSeekBarPreference.onStopTrackingTouch(mSeekBar); - - verify(mListener, times(1)).onPreferenceChange(mSeekBarPreference, 2); - } -} diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/SeekBarPreferenceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/SeekBarPreferenceTest.java deleted file mode 100644 index 19ee3f940aa2b..0000000000000 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/widget/SeekBarPreferenceTest.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (C) 2021 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.settingslib.widget; - -import static android.view.HapticFeedbackConstants.CLOCK_TICK; -import static android.view.HapticFeedbackConstants.CONTEXT_CLICK; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.when; -import static org.robolectric.Shadows.shadowOf; - -import android.content.Context; -import android.os.Bundle; -import android.os.Parcelable; -import android.widget.SeekBar; - -import androidx.preference.PreferenceFragmentCompat; - -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.MockitoAnnotations; -import org.robolectric.RobolectricTestRunner; -import org.robolectric.RuntimeEnvironment; -import org.robolectric.annotation.Config; -import org.robolectric.shadows.androidx.fragment.FragmentController; - -@RunWith(RobolectricTestRunner.class) -public class SeekBarPreferenceTest { - - private static final int MAX = 75; - private static final int MIN = 5; - private static final int PROGRESS = 16; - private static final int NEW_PROGRESS = 17; - - private Context mContext; - private SeekBarPreference mSeekBarPreference; - private SeekBar mSeekBar; - - @Before - public void setUp() { - MockitoAnnotations.initMocks(this); - mContext = RuntimeEnvironment.application; - - mSeekBarPreference = spy(new SeekBarPreference(mContext)); - mSeekBarPreference.setMax(MAX); - mSeekBarPreference.setMin(MIN); - mSeekBarPreference.setProgress(PROGRESS); - mSeekBarPreference.setPersistent(false); - mSeekBarPreference.setHapticFeedbackMode(SeekBarPreference.HAPTIC_FEEDBACK_MODE_NONE); - - mSeekBar = new SeekBar(mContext); - mSeekBar.setMax(MAX); - mSeekBar.setMin(MIN); - } - - @Test - public void testSaveAndRestoreInstanceState() { - final Parcelable parcelable = mSeekBarPreference.onSaveInstanceState(); - - final SeekBarPreference preference = new SeekBarPreference(mContext); - preference.onRestoreInstanceState(parcelable); - - assertThat(preference.getMax()).isEqualTo(MAX); - assertThat(preference.getMin()).isEqualTo(MIN); - assertThat(preference.getProgress()).isEqualTo(PROGRESS); - } - - @Test - @Config(qualifiers = "mcc998") - @Ignore("b/188888268") - public void isSelectable_default_returnFalse() { - final PreferenceFragmentCompat fragment = FragmentController.of(new TestFragment(), - new Bundle()) - .create() - .start() - .resume() - .get(); - - final SeekBarPreference seekBarPreference = fragment.findPreference("seek_bar"); - - assertThat(seekBarPreference.isSelectable()).isFalse(); - } - - @Test - @Config(qualifiers = "mcc999") - @Ignore("b/188888268") - public void isSelectable_selectableInXml_returnTrue() { - final PreferenceFragmentCompat fragment = FragmentController.of(new TestFragment(), - new Bundle()) - .create() - .start() - .resume() - .get(); - - final SeekBarPreference seekBarPreference = fragment.findPreference("seek_bar"); - - assertThat(seekBarPreference.isSelectable()).isTrue(); - } - - @Test - public void onProgressChanged_hapticFeedbackModeNone_clockTickFeedbackNotPerformed() { - mSeekBar.setProgress(NEW_PROGRESS); - when(mSeekBarPreference.callChangeListener(anyInt())).thenReturn(true); - mSeekBar.performHapticFeedback(CONTEXT_CLICK); - - mSeekBarPreference.onProgressChanged(mSeekBar, NEW_PROGRESS, true); - - assertThat(shadowOf(mSeekBar).lastHapticFeedbackPerformed()).isNotEqualTo(CLOCK_TICK); - } - - @Test - public void onProgressChanged_hapticFeedbackModeOnTicks_clockTickFeedbackPerformed() { - mSeekBarPreference.setHapticFeedbackMode(SeekBarPreference.HAPTIC_FEEDBACK_MODE_ON_TICKS); - mSeekBar.setProgress(NEW_PROGRESS); - when(mSeekBarPreference.callChangeListener(anyInt())).thenReturn(true); - mSeekBar.performHapticFeedback(CONTEXT_CLICK); - - mSeekBarPreference.onProgressChanged(mSeekBar, NEW_PROGRESS, true); - - assertThat(shadowOf(mSeekBar).lastHapticFeedbackPerformed()).isEqualTo(CLOCK_TICK); - } - - @Test - public void onProgressChanged_hapticFeedbackModeOnEnds_clockTickFeedbackNotPerformed() { - mSeekBarPreference.setHapticFeedbackMode(SeekBarPreference.HAPTIC_FEEDBACK_MODE_ON_ENDS); - mSeekBar.setProgress(NEW_PROGRESS); - when(mSeekBarPreference.callChangeListener(anyInt())).thenReturn(true); - mSeekBar.performHapticFeedback(CONTEXT_CLICK); - - mSeekBarPreference.onProgressChanged(mSeekBar, NEW_PROGRESS, true); - - assertThat(shadowOf(mSeekBar).lastHapticFeedbackPerformed()).isNotEqualTo(CLOCK_TICK); - } - - @Test - public void onProgressChanged_hapticFeedbackModeOnEndsAndMinValue_clockTickFeedbackPerformed() { - mSeekBarPreference.setHapticFeedbackMode(SeekBarPreference.HAPTIC_FEEDBACK_MODE_ON_ENDS); - mSeekBar.setProgress(MIN); - when(mSeekBarPreference.callChangeListener(anyInt())).thenReturn(true); - mSeekBar.performHapticFeedback(CONTEXT_CLICK); - - mSeekBarPreference.onProgressChanged(mSeekBar, MIN, true); - - assertThat(shadowOf(mSeekBar).lastHapticFeedbackPerformed()).isEqualTo(CLOCK_TICK); - } - - public static class TestFragment extends PreferenceFragmentCompat { - @Override - public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - addPreferencesFromResource(R.xml.seekbar_preference); - } - } -}