From d6b5bbb5cb4a922bb34357f8acd959aba7fa73d0 Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Mon, 30 Nov 2020 18:07:24 +0800 Subject: [PATCH] Apply SettingsLib SeekBarPreference to Settings Bug: 176818438 Test: robotest Change-Id: I219878716457ce4bb7cad251bccf5d50d93030a5 --- ...tery_saver_schedule_percentage_seekbar.xml | 47 -- res/layout/preference_labeled_slider.xml | 79 ---- res/layout/preference_volume_slider.xml | 19 +- .../preference_widget_seekbar_settings.xml | 63 --- res/values/attrs.xml | 7 - res/values/styles_preference.xml | 5 - res/xml/accessibility_button_settings.xml | 2 +- res/xml/gesture_navigation_settings.xml | 4 +- res/xml/night_display_settings.xml | 2 +- res/xml/reduce_bright_colors_settings.xml | 2 +- res/xml/tts_settings.xml | 4 +- .../settings/RestrictedListPreference.java | 22 +- .../BalanceSeekBarPreference.java | 8 +- ...gMenuTransparencyPreferenceController.java | 2 +- ...htColorsIntensityPreferenceController.java | 2 +- ...eReduceBrightColorsPreferenceFragment.java | 2 +- .../accounts/AccountRestrictionHelper.java | 89 ++-- .../core/SliderPreferenceController.java | 9 +- .../UnrestrictedDataAccessPreference.java | 14 +- ...tDisplayIntensityPreferenceController.java | 2 +- ...BatterySaverScheduleSeekBarController.java | 3 +- .../GestureNavigationSettingsFragment.java | 4 +- ...tVolumeRestrictedPreferenceController.java | 6 +- .../notification/VolumeSeekBarPreference.java | 4 +- .../notification/app/BubblePreference.java | 21 +- .../settings/tts/TextToSpeechSettings.java | 2 +- .../widget/DefaultIndicatorSeekBar.java | 89 ---- .../widget/LabeledSeekBarPreference.java | 94 ---- .../widget/RestrictedAppPreference.java | 24 +- .../settings/widget/SeekBarPreference.java | 436 ------------------ .../res/xml-mcc998/seekbar_preference.xml | 2 +- .../res/xml-mcc999/seekbar_preference.xml | 2 +- ...uTransparencyPreferenceControllerTest.java | 2 +- .../LabeledSeekBarPreferenceTest.java | 72 --- ...umeRestrictedPreferenceControllerTest.java | 25 +- .../RemoteVolumeGroupControllerTest.java | 2 +- .../TrustAgentsPreferenceControllerTest.java | 1 - .../widget/SeekBarPreferenceTest.java | 187 -------- ...ettingsSliderPreferenceControllerTest.java | 2 +- .../widget/DefaultIndicatorSeekBarTest.java | 51 -- 40 files changed, 149 insertions(+), 1264 deletions(-) delete mode 100644 res/layout/battery_saver_schedule_percentage_seekbar.xml delete mode 100644 res/layout/preference_labeled_slider.xml delete mode 100644 res/layout/preference_widget_seekbar_settings.xml delete mode 100644 src/com/android/settings/widget/DefaultIndicatorSeekBar.java delete mode 100644 src/com/android/settings/widget/LabeledSeekBarPreference.java delete mode 100644 src/com/android/settings/widget/SeekBarPreference.java delete mode 100644 tests/robotests/src/com/android/settings/gestures/LabeledSeekBarPreferenceTest.java delete mode 100644 tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java delete mode 100644 tests/unit/src/com/android/settings/widget/DefaultIndicatorSeekBarTest.java diff --git a/res/layout/battery_saver_schedule_percentage_seekbar.xml b/res/layout/battery_saver_schedule_percentage_seekbar.xml deleted file mode 100644 index 78628220cdb..00000000000 --- a/res/layout/battery_saver_schedule_percentage_seekbar.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - diff --git a/res/layout/preference_labeled_slider.xml b/res/layout/preference_labeled_slider.xml deleted file mode 100644 index 42ad988d957..00000000000 --- a/res/layout/preference_labeled_slider.xml +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/res/layout/preference_volume_slider.xml b/res/layout/preference_volume_slider.xml index 7c07d5eeca5..018506f09ed 100644 --- a/res/layout/preference_volume_slider.xml +++ b/res/layout/preference_volume_slider.xml @@ -25,28 +25,13 @@ android:clickable="false" android:orientation="horizontal"> - - - + + android:paddingTop="16dp"> - - - - - - - - - - - - diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 573d906b166..a5611f034bb 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -157,13 +157,6 @@ - - - - - - - diff --git a/res/values/styles_preference.xml b/res/values/styles_preference.xml index 1c8d0153db9..620eec6ec2a 100644 --- a/res/values/styles_preference.xml +++ b/res/values/styles_preference.xml @@ -23,7 +23,6 @@ @style/ApnPreference @style/CardPreference @style/SlicePreference - @style/SettingsSeekBarPreference @style/TwoStateButtonPreference @style/SettingsPreferenceFragmentStyle @@ -44,10 +43,6 @@ @layout/slice_preference_layout - - diff --git a/res/xml/accessibility_button_settings.xml b/res/xml/accessibility_button_settings.xml index 02b1c7d4693..47ea896cdeb 100644 --- a/res/xml/accessibility_button_settings.xml +++ b/res/xml/accessibility_button_settings.xml @@ -53,7 +53,7 @@ android:persistent="false" settings:controller="com.android.settings.accessibility.FloatingMenuFadePreferenceController"/> - - - - - diff --git a/res/xml/tts_settings.xml b/res/xml/tts_settings.xml index bcc9c85f39d..920193830ca 100644 --- a/res/xml/tts_settings.xml +++ b/res/xml/tts_settings.xml @@ -34,14 +34,14 @@ - - mRestrictedItems = new ArrayList<>(); private boolean mRequiresActiveUnlockedProfile = false; @@ -63,6 +67,10 @@ public class RestrictedListPreference extends CustomListPreference { mHelper = new RestrictedPreferenceHelper(context, this, attrs); } + public RestrictedListPreference(Context context) { + this(context, /* attrs= */ null); + } + @Override public void onBindViewHolder(PreferenceViewHolder holder) { super.onBindViewHolder(holder); @@ -107,14 +115,14 @@ public class RestrictedListPreference extends CustomListPreference { super.setEnabled(enabled); } - public void setDisabledByAdmin(EnforcedAdmin admin) { - if (mHelper.setDisabledByAdmin(admin)) { - notifyChanged(); - } + @Override + public RestrictedPreferenceHelper getHelper() { + return mHelper; } - public boolean isDisabledByAdmin() { - return mHelper.isDisabledByAdmin(); + @Override + public void notifyPreferenceChanged() { + notifyChanged(); } public void setRequiresActiveUnlockedProfile(boolean reqState) { diff --git a/src/com/android/settings/accessibility/BalanceSeekBarPreference.java b/src/com/android/settings/accessibility/BalanceSeekBarPreference.java index b03c8abd314..ef779d13bdc 100644 --- a/src/com/android/settings/accessibility/BalanceSeekBarPreference.java +++ b/src/com/android/settings/accessibility/BalanceSeekBarPreference.java @@ -17,23 +17,19 @@ package com.android.settings.accessibility; import android.content.Context; -import android.media.AudioSystem; import android.os.UserHandle; import android.provider.Settings; import android.util.AttributeSet; -import android.view.View; import android.widget.ImageView; -import android.widget.SeekBar; import androidx.core.content.res.TypedArrayUtils; -import androidx.preference.Preference; import androidx.preference.PreferenceViewHolder; import com.android.settings.R; -import com.android.settings.widget.SeekBarPreference; +import com.android.settingslib.RestrictedSeekBarPreference; /** A slider preference that directly controls audio balance **/ -public class BalanceSeekBarPreference extends SeekBarPreference { +public class BalanceSeekBarPreference extends RestrictedSeekBarPreference { private static final int BALANCE_CENTER_VALUE = 100; private static final int BALANCE_MAX_VALUE = 200; diff --git a/src/com/android/settings/accessibility/FloatingMenuTransparencyPreferenceController.java b/src/com/android/settings/accessibility/FloatingMenuTransparencyPreferenceController.java index 894d3aea2d4..e9572d60e42 100644 --- a/src/com/android/settings/accessibility/FloatingMenuTransparencyPreferenceController.java +++ b/src/com/android/settings/accessibility/FloatingMenuTransparencyPreferenceController.java @@ -28,10 +28,10 @@ import androidx.annotation.VisibleForTesting; import androidx.preference.PreferenceScreen; import com.android.settings.core.SliderPreferenceController; -import com.android.settings.widget.SeekBarPreference; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnResume; +import com.android.settingslib.widget.SeekBarPreference; /** Preference controller that controls the transparency seekbar in accessibility button page. */ public class FloatingMenuTransparencyPreferenceController extends SliderPreferenceController diff --git a/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceController.java b/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceController.java index 7e6b42daac3..d1dd50a83d0 100644 --- a/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceController.java +++ b/src/com/android/settings/accessibility/ReduceBrightColorsIntensityPreferenceController.java @@ -23,7 +23,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.core.SliderPreferenceController; -import com.android.settings.widget.SeekBarPreference; +import com.android.settingslib.widget.SeekBarPreference; /** PreferenceController for feature intensity. */ public class ReduceBrightColorsIntensityPreferenceController extends SliderPreferenceController { diff --git a/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java index b629eaa1023..632d4495f95 100644 --- a/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java +++ b/src/com/android/settings/accessibility/ToggleReduceBrightColorsPreferenceFragment.java @@ -34,9 +34,9 @@ import androidx.preference.SwitchPreference; import com.android.internal.accessibility.AccessibilityShortcutController; import com.android.settings.R; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settings.widget.SeekBarPreference; import com.android.settings.widget.SettingsMainSwitchPreference; import com.android.settingslib.search.SearchIndexable; +import com.android.settingslib.widget.SeekBarPreference; import java.util.ArrayList; import java.util.List; diff --git a/src/com/android/settings/accounts/AccountRestrictionHelper.java b/src/com/android/settings/accounts/AccountRestrictionHelper.java index c67f5d1f9f4..8c4d220d6de 100644 --- a/src/com/android/settings/accounts/AccountRestrictionHelper.java +++ b/src/com/android/settings/accounts/AccountRestrictionHelper.java @@ -27,9 +27,11 @@ import android.content.pm.UserInfo; import android.os.UserHandle; import android.os.UserManager; +import androidx.preference.Preference; + import com.android.settings.AccessiblePreferenceCategory; +import com.android.settingslib.Restrictable; import com.android.settingslib.RestrictedLockUtilsInternal; -import com.android.settingslib.RestrictedPreference; import java.util.ArrayList; @@ -42,34 +44,74 @@ public class AccountRestrictionHelper { } /** - * Configure the UI of the preference by checking user restriction. - * @param preference The preference we are configuring. - * @param userRestriction The user restriction related to the preference. - * @param userId The user that we retrieve user restriction of. + * Checks if the account should be shown based on the required authorities for the account type + * + * @param authorities given authority that is passed as activity extra + * @param auths list of authorities for particular account type + * @return true if the activity has the required authority to show the account */ - public void enforceRestrictionOnPreference(RestrictedPreference preference, - String userRestriction, @UserIdInt int userId) { + public static boolean showAccount(String[] authorities, ArrayList auths) { + boolean showAccount = true; + if (authorities != null && auths != null) { + showAccount = false; + for (String requestedAuthority : authorities) { + if (auths.contains(requestedAuthority)) { + return true; + } + } + } + return showAccount; + } + + /** + * Configure the UI of the preference by checking user restriction. + * + * @param preference The preference we are configuring. + * @param userRestriction The user restriction related to the preference. + * @param userId The user that we retrieve user restriction of. + */ + public void enforceRestrictionOnPreference(Preference preference, + String userRestriction, @UserIdInt int userId) { if (preference == null) { return; } + if (!(preference instanceof Restrictable)) { + return; + } + + final Restrictable restrictedPreference = (Restrictable) preference; + if (hasBaseUserRestriction(userRestriction, userId)) { if (userRestriction.equals(DISALLOW_REMOVE_MANAGED_PROFILE) && isOrganizationOwnedDevice()) { - preference.setDisabledByAdmin(getEnforcedAdmin(userRestriction, userId)); + restrictedPreference.setDisabledByAdmin(getEnforcedAdmin(userRestriction, userId)); } else { preference.setEnabled(false); } } else { - preference.checkRestrictionAndSetDisabled(userRestriction, userId); + restrictedPreference.checkRestrictionAndSetDisabled(userRestriction, userId); } } + /** + * Check if the system has set the user restriction. + * @param userRestriction The user restriction. + * @param userId The user that we retrieve user restriction of. + * @return {@code true} if set restriction. + */ public boolean hasBaseUserRestriction(String userRestriction, @UserIdInt int userId) { return RestrictedLockUtilsInternal.hasBaseUserRestriction(mContext, userRestriction, userId); } - private boolean isOrganizationOwnedDevice() { + /** + * Apps can use this method to find out if the device was provisioned as + * organization-owend device. + * + * @return {@code true} if the device was provisioned as organization-owned device, + * {@code false} otherwise. + */ + public boolean isOrganizationOwnedDevice() { final DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService( Context.DEVICE_POLICY_SERVICE); if (dpm == null) { @@ -78,7 +120,13 @@ public class AccountRestrictionHelper { return dpm.isOrganizationOwnedDeviceWithManagedProfile(); } - private EnforcedAdmin getEnforcedAdmin(String userRestriction, int userId) { + /** + * Get the restriction enforced by admin + * @param userRestriction The user restriction. + * @param userId The user that we retrieve user restriction of. + * @return {EnforcedAdmin} + */ + public EnforcedAdmin getEnforcedAdmin(String userRestriction, int userId) { final DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService( Context.DEVICE_POLICY_SERVICE); if (dpm == null) { @@ -107,23 +155,4 @@ public class AccountRestrictionHelper { public AccessiblePreferenceCategory createAccessiblePreferenceCategory(Context context) { return new AccessiblePreferenceCategory(context); } - - /** - * Checks if the account should be shown based on the required authorities for the account type - * @param authorities given authority that is passed as activity extra - * @param auths list of authorities for particular account type - * @return true if the activity has the required authority to show the account - */ - public static boolean showAccount(String[] authorities, ArrayList auths) { - boolean showAccount = true; - if (authorities != null && auths != null) { - showAccount = false; - for (String requestedAuthority : authorities) { - if (auths.contains(requestedAuthority)) { - return true; - } - } - } - return showAccount; - } } diff --git a/src/com/android/settings/core/SliderPreferenceController.java b/src/com/android/settings/core/SliderPreferenceController.java index 0a7ece25d4b..010036ab0f5 100644 --- a/src/com/android/settings/core/SliderPreferenceController.java +++ b/src/com/android/settings/core/SliderPreferenceController.java @@ -19,6 +19,7 @@ import android.content.Context; import androidx.preference.Preference; import com.android.settings.slices.SliceData; +import com.android.settingslib.widget.SeekBarPreference; public abstract class SliderPreferenceController extends BasePreferenceController implements Preference.OnPreferenceChangeListener { @@ -34,12 +35,10 @@ public abstract class SliderPreferenceController extends BasePreferenceControlle @Override public void updateState(Preference preference) { - if (preference instanceof com.android.settings.widget.SeekBarPreference) { - ((com.android.settings.widget.SeekBarPreference) preference) - .setProgress(getSliderPosition()); + if (preference instanceof SeekBarPreference) { + ((SeekBarPreference) preference).setProgress(getSliderPosition()); } else if (preference instanceof androidx.preference.SeekBarPreference) { - ((androidx.preference.SeekBarPreference) preference) - .setValue(getSliderPosition()); + ((androidx.preference.SeekBarPreference) preference).setValue(getSliderPosition()); } } diff --git a/src/com/android/settings/datausage/UnrestrictedDataAccessPreference.java b/src/com/android/settings/datausage/UnrestrictedDataAccessPreference.java index a41b5828b46..74031c464c7 100644 --- a/src/com/android/settings/datausage/UnrestrictedDataAccessPreference.java +++ b/src/com/android/settings/datausage/UnrestrictedDataAccessPreference.java @@ -24,14 +24,14 @@ import androidx.preference.PreferenceViewHolder; import com.android.settings.R; import com.android.settings.applications.appinfo.AppInfoDashboardFragment; import com.android.settings.dashboard.DashboardFragment; -import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin; +import com.android.settingslib.Restrictable; import com.android.settingslib.RestrictedPreferenceHelper; import com.android.settingslib.applications.ApplicationsState; import com.android.settingslib.applications.ApplicationsState.AppEntry; import com.android.settingslib.widget.AppSwitchPreference; public class UnrestrictedDataAccessPreference extends AppSwitchPreference implements - DataSaverBackend.Listener { + DataSaverBackend.Listener, Restrictable { private final ApplicationsState mApplicationsState; private final AppEntry mEntry; @@ -159,12 +159,14 @@ public class UnrestrictedDataAccessPreference extends AppSwitchPreference implem return mEntry; } - public boolean isDisabledByAdmin() { - return mHelper.isDisabledByAdmin(); + @Override + public RestrictedPreferenceHelper getHelper() { + return mHelper; } - public void setDisabledByAdmin(EnforcedAdmin admin) { - mHelper.setDisabledByAdmin(admin); + @Override + public void notifyPreferenceChanged() { + notifyChanged(); } // Sets UI state based on allowlist/denylist status. diff --git a/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java b/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java index 0f8ecc515e1..6b1cdbfad41 100644 --- a/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java +++ b/src/com/android/settings/display/NightDisplayIntensityPreferenceController.java @@ -24,7 +24,7 @@ import androidx.preference.Preference; import androidx.preference.PreferenceScreen; import com.android.settings.core.SliderPreferenceController; -import com.android.settings.widget.SeekBarPreference; +import com.android.settingslib.widget.SeekBarPreference; public class NightDisplayIntensityPreferenceController extends SliderPreferenceController { diff --git a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarController.java b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarController.java index 3e62ea1450d..04ddb048e02 100644 --- a/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarController.java +++ b/src/com/android/settings/fuelgauge/batterysaver/BatterySaverScheduleSeekBarController.java @@ -28,7 +28,7 @@ import androidx.preference.PreferenceScreen; import com.android.internal.annotations.VisibleForTesting; import com.android.settings.R; import com.android.settings.Utils; -import com.android.settings.widget.SeekBarPreference; +import com.android.settingslib.widget.SeekBarPreference; /** * Responds to user actions in the Settings > Battery > Set a Schedule Screen for the seekbar. @@ -55,7 +55,6 @@ public class BatterySaverScheduleSeekBarController implements public BatterySaverScheduleSeekBarController(Context context) { mContext = context; mSeekBarPreference = new SeekBarPreference(context); - mSeekBarPreference.setLayoutResource(R.layout.battery_saver_schedule_percentage_seekbar); mSeekBarPreference.setOnPreferenceChangeListener(this); mSeekBarPreference.setContinuousUpdates(true); mSeekBarPreference.setMax(MAX_SEEKBAR_VALUE); diff --git a/src/com/android/settings/gestures/GestureNavigationSettingsFragment.java b/src/com/android/settings/gestures/GestureNavigationSettingsFragment.java index 546581bd128..9ec7424f332 100644 --- a/src/com/android/settings/gestures/GestureNavigationSettingsFragment.java +++ b/src/com/android/settings/gestures/GestureNavigationSettingsFragment.java @@ -27,9 +27,9 @@ import android.view.WindowManager; import com.android.settings.R; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settings.widget.LabeledSeekBarPreference; -import com.android.settings.widget.SeekBarPreference; import com.android.settingslib.search.SearchIndexable; +import com.android.settingslib.widget.LabeledSeekBarPreference; +import com.android.settingslib.widget.SeekBarPreference; /** * A fragment to include all the settings related to Gesture Navigation mode. diff --git a/src/com/android/settings/notification/AdjustVolumeRestrictedPreferenceController.java b/src/com/android/settings/notification/AdjustVolumeRestrictedPreferenceController.java index f75fd4b8d0f..651df01910a 100644 --- a/src/com/android/settings/notification/AdjustVolumeRestrictedPreferenceController.java +++ b/src/com/android/settings/notification/AdjustVolumeRestrictedPreferenceController.java @@ -27,7 +27,7 @@ import androidx.preference.Preference; import com.android.settings.accounts.AccountRestrictionHelper; import com.android.settings.core.SliderPreferenceController; -import com.android.settingslib.RestrictedPreference; +import com.android.settingslib.Restrictable; /** * Base class for preference controller that handles preference that enforce adjust volume @@ -51,10 +51,10 @@ public abstract class AdjustVolumeRestrictedPreferenceController extends @Override public void updateState(Preference preference) { - if (!(preference instanceof RestrictedPreference)) { + if (!(preference instanceof Restrictable)) { return; } - mHelper.enforceRestrictionOnPreference((RestrictedPreference) preference, + mHelper.enforceRestrictionOnPreference(preference, UserManager.DISALLOW_ADJUST_VOLUME, UserHandle.myUserId()); } diff --git a/src/com/android/settings/notification/VolumeSeekBarPreference.java b/src/com/android/settings/notification/VolumeSeekBarPreference.java index 36a4d8aed06..04ea6b087af 100644 --- a/src/com/android/settings/notification/VolumeSeekBarPreference.java +++ b/src/com/android/settings/notification/VolumeSeekBarPreference.java @@ -32,12 +32,12 @@ import androidx.annotation.VisibleForTesting; import androidx.preference.PreferenceViewHolder; import com.android.settings.R; -import com.android.settings.widget.SeekBarPreference; +import com.android.settingslib.RestrictedSeekBarPreference; import java.util.Objects; /** A slider preference that directly controls an audio stream volume (no dialog) **/ -public class VolumeSeekBarPreference extends SeekBarPreference { +public class VolumeSeekBarPreference extends RestrictedSeekBarPreference { private static final String TAG = "VolumeSeekBarPreference"; protected SeekBar mSeekBar; diff --git a/src/com/android/settings/notification/app/BubblePreference.java b/src/com/android/settings/notification/app/BubblePreference.java index f0046d793d0..2774a8460bc 100644 --- a/src/com/android/settings/notification/app/BubblePreference.java +++ b/src/com/android/settings/notification/app/BubblePreference.java @@ -22,7 +22,6 @@ import static android.app.NotificationManager.BUBBLE_PREFERENCE_SELECTED; import android.content.Context; import android.content.res.ColorStateList; -import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; @@ -33,13 +32,13 @@ import androidx.preference.PreferenceViewHolder; import com.android.settings.Utils; import com.android.settingslib.R; -import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.Restrictable; import com.android.settingslib.RestrictedPreferenceHelper; /** * A tri-state preference allowing a user to specify what gets to bubble. */ -public class BubblePreference extends Preference implements View.OnClickListener { +public class BubblePreference extends Preference implements View.OnClickListener, Restrictable { RestrictedPreferenceHelper mHelper; private int mSelectedPreference; @@ -81,12 +80,6 @@ public class BubblePreference extends Preference implements View.OnClickListener return mSelectedPreference; } - public void setDisabledByAdmin(RestrictedLockUtils.EnforcedAdmin admin) { - if (mHelper.setDisabledByAdmin(admin)) { - notifyChanged(); - } - } - public void setSelectedVisibility(boolean visible) { mSelectedVisible = visible; notifyChanged(); @@ -149,6 +142,16 @@ public class BubblePreference extends Preference implements View.OnClickListener mBubbleNoneButton.setSelected(mContext, selected == BUBBLE_PREFERENCE_NONE); } + @Override + public RestrictedPreferenceHelper getHelper() { + return mHelper; + } + + @Override + public void notifyPreferenceChanged() { + notifyChanged(); + } + private class ButtonViewHolder { private View mView; private ImageView mImageView; diff --git a/src/com/android/settings/tts/TextToSpeechSettings.java b/src/com/android/settings/tts/TextToSpeechSettings.java index 30e99677301..30bc633db2a 100644 --- a/src/com/android/settings/tts/TextToSpeechSettings.java +++ b/src/com/android/settings/tts/TextToSpeechSettings.java @@ -49,9 +49,9 @@ import com.android.settings.Utils; import com.android.settings.overlay.FeatureFactory; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.widget.GearPreference; -import com.android.settings.widget.SeekBarPreference; import com.android.settingslib.search.SearchIndexable; import com.android.settingslib.widget.ActionButtonsPreference; +import com.android.settingslib.widget.SeekBarPreference; import java.text.Collator; import java.util.ArrayList; diff --git a/src/com/android/settings/widget/DefaultIndicatorSeekBar.java b/src/com/android/settings/widget/DefaultIndicatorSeekBar.java deleted file mode 100644 index d8edf030fba..00000000000 --- a/src/com/android/settings/widget/DefaultIndicatorSeekBar.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2017 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.settings.widget; - -import android.content.Context; -import android.graphics.Canvas; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.widget.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/src/com/android/settings/widget/LabeledSeekBarPreference.java b/src/com/android/settings/widget/LabeledSeekBarPreference.java deleted file mode 100644 index 3a9ac18beb0..00000000000 --- a/src/com/android/settings/widget/LabeledSeekBarPreference.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2019 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.settings.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.core.content.res.TypedArrayUtils; -import androidx.preference.PreferenceViewHolder; - -import com.android.settings.R; - -/** 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, TypedArrayUtils.getAttr(context, - androidx.preference.R.attr.seekBarPreferenceStyle, - 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/src/com/android/settings/widget/RestrictedAppPreference.java b/src/com/android/settings/widget/RestrictedAppPreference.java index cd953571ab6..5878fd5293f 100644 --- a/src/com/android/settings/widget/RestrictedAppPreference.java +++ b/src/com/android/settings/widget/RestrictedAppPreference.java @@ -26,7 +26,7 @@ import androidx.preference.PreferenceManager; import androidx.preference.PreferenceViewHolder; import com.android.settings.R; -import com.android.settingslib.RestrictedLockUtils; +import com.android.settingslib.Restrictable; import com.android.settingslib.RestrictedPreferenceHelper; import com.android.settingslib.widget.AppPreference; @@ -35,7 +35,7 @@ import com.android.settingslib.widget.AppPreference; * {@link com.android.settingslib.RestrictedPreferenceHelper}. * Used to show policy transparency on {@link AppPreference}. */ -public class RestrictedAppPreference extends AppPreference { +public class RestrictedAppPreference extends AppPreference implements Restrictable { private RestrictedPreferenceHelper mHelper; private String userRestriction; @@ -85,14 +85,14 @@ public class RestrictedAppPreference extends AppPreference { super.setEnabled(enabled); } - public void setDisabledByAdmin(RestrictedLockUtils.EnforcedAdmin admin) { - if (mHelper.setDisabledByAdmin(admin)) { - notifyChanged(); - } + @Override + public RestrictedPreferenceHelper getHelper() { + return mHelper; } - public boolean isDisabledByAdmin() { - return mHelper.isDisabledByAdmin(); + @Override + public void notifyPreferenceChanged() { + notifyChanged(); } public void useAdminDisabledSummary(boolean useSummary) { @@ -111,12 +111,4 @@ public class RestrictedAppPreference extends AppPreference { } mHelper.checkRestrictionAndSetDisabled(userRestriction, UserHandle.myUserId()); } - - public void checkRestrictionAndSetDisabled(String userRestriction) { - mHelper.checkRestrictionAndSetDisabled(userRestriction, UserHandle.myUserId()); - } - - public void checkRestrictionAndSetDisabled(String userRestriction, int userId) { - mHelper.checkRestrictionAndSetDisabled(userRestriction, userId); - } } diff --git a/src/com/android/settings/widget/SeekBarPreference.java b/src/com/android/settings/widget/SeekBarPreference.java deleted file mode 100644 index 47bb28608d5..00000000000 --- a/src/com/android/settings/widget/SeekBarPreference.java +++ /dev/null @@ -1,436 +0,0 @@ -/* - * Copyright (C) 2011 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.settings.widget; - -import static android.view.HapticFeedbackConstants.CLOCK_TICK; - -import android.content.Context; -import android.content.res.TypedArray; -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.core.content.res.TypedArrayUtils; -import androidx.preference.PreferenceViewHolder; - -import com.android.settingslib.RestrictedPreference; - -/** - * Based on android.preference.SeekBarPreference, but uses support preference as base. - */ -public class SeekBarPreference extends RestrictedPreference - 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; - - private int mProgress; - private int mMax; - private int mMin; - private boolean mTrackingTouch; - - private boolean mContinuousUpdates; - private int mHapticFeedbackMode = HAPTIC_FEEDBACK_MODE_NONE; - private int mDefaultProgress = -1; - - private SeekBar mSeekBar; - 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.SeekBarPreference, defStyleAttr, defStyleRes); - final int layoutResId = a.getResourceId( - com.android.internal.R.styleable.SeekBarPreference_layout, - com.android.internal.R.layout.preference_widget_seekbar); - a.recycle(); - - a = context.obtainStyledAttributes( - attrs, com.android.internal.R.styleable.Preference, defStyleAttr, defStyleRes); - final boolean isSelectable = a.getBoolean( - com.android.settings.R.styleable.Preference_android_selectable, false); - setSelectable(isSelectable); - a.recycle(); - - setLayoutResource(layoutResId); - } - - public SeekBarPreference(Context context, AttributeSet attrs, int defStyleAttr) { - this(context, attrs, defStyleAttr, 0); - } - - public SeekBarPreference(Context context, AttributeSet attrs) { - this(context, attrs, TypedArrayUtils.getAttr(context, - androidx.preference.R.attr.seekBarPreferenceStyle, - com.android.internal.R.attr.seekBarPreferenceStyle)); - } - - public SeekBarPreference(Context context) { - this(context, null); - } - - public void setShouldBlink(boolean shouldBlink) { - mShouldBlink = shouldBlink; - notifyChanged(); - } - - @Override - public boolean isSelectable() { - if(isDisabledByAdmin()) { - return true; - } else { - return super.isSelectable(); - } - } - - @Override - public void onBindViewHolder(PreferenceViewHolder view) { - super.onBindViewHolder(view); - view.itemView.setOnKeyListener(this); - mSeekBar = (SeekBar) view.findViewById( - com.android.internal.R.id.seekbar); - 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)) { - mSeekBar.setStateDescription(mSeekBarStateDescription); - } - if (mSeekBar instanceof DefaultIndicatorSeekBar) { - ((DefaultIndicatorSeekBar) mSeekBar).setDefaultProgress(mDefaultProgress); - } - 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 - 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; - } - - SeekBar seekBar = (SeekBar) v.findViewById(com.android.internal.R.id.seekbar); - if (seekBar == null) { - return false; - } - return seekBar.onKeyDown(keyCode, event); - } - - public void setMax(int max) { - if (max != mMax) { - mMax = max; - notifyChanged(); - } - } - - public void setMin(int min) { - if (min != mMin) { - mMin = min; - notifyChanged(); - } - } - - public int getMax() { - return mMax; - } - - public int getMin() { - return mMin; - } - - public void setProgress(int progress) { - setProgress(progress, true); - } - - /** - * 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); - } - } - } - - /** - * 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; - } - - /** - * 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; - } - - 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 - */ - 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.progress = mProgress; - myState.max = mMax; - myState.min = 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.progress; - mMax = myState.max; - mMin = myState.min; - 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 { - int progress; - int max; - int min; - - public SavedState(Parcel source) { - super(source); - - // Restore the click counter - progress = source.readInt(); - max = source.readInt(); - min = source.readInt(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - - // Save the click counter - dest.writeInt(progress); - dest.writeInt(max); - dest.writeInt(min); - } - - public SavedState(Parcelable superState) { - super(superState); - } - - @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]; - } - }; - } -} diff --git a/tests/robotests/res/xml-mcc998/seekbar_preference.xml b/tests/robotests/res/xml-mcc998/seekbar_preference.xml index e474c1e06bb..3efd3a1eb55 100644 --- a/tests/robotests/res/xml-mcc998/seekbar_preference.xml +++ b/tests/robotests/res/xml-mcc998/seekbar_preference.xml @@ -17,7 +17,7 @@ - diff --git a/tests/robotests/res/xml-mcc999/seekbar_preference.xml b/tests/robotests/res/xml-mcc999/seekbar_preference.xml index 77435e8d198..68cdbdadc1d 100644 --- a/tests/robotests/res/xml-mcc999/seekbar_preference.xml +++ b/tests/robotests/res/xml-mcc999/seekbar_preference.xml @@ -17,7 +17,7 @@ - diff --git a/tests/robotests/src/com/android/settings/accessibility/FloatingMenuTransparencyPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/FloatingMenuTransparencyPreferenceControllerTest.java index 55637cd137d..216368e1a07 100644 --- a/tests/robotests/src/com/android/settings/accessibility/FloatingMenuTransparencyPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/FloatingMenuTransparencyPreferenceControllerTest.java @@ -36,7 +36,7 @@ import android.provider.Settings; import androidx.test.core.app.ApplicationProvider; -import com.android.settings.widget.SeekBarPreference; +import com.android.settingslib.widget.SeekBarPreference; import org.junit.Before; import org.junit.Rule; diff --git a/tests/robotests/src/com/android/settings/gestures/LabeledSeekBarPreferenceTest.java b/tests/robotests/src/com/android/settings/gestures/LabeledSeekBarPreferenceTest.java deleted file mode 100644 index 4fb94f8cad5..00000000000 --- a/tests/robotests/src/com/android/settings/gestures/LabeledSeekBarPreferenceTest.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2019 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.settings.gestures; - -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 com.android.settings.widget.LabeledSeekBarPreference; - -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/tests/robotests/src/com/android/settings/notification/AdjustVolumeRestrictedPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/AdjustVolumeRestrictedPreferenceControllerTest.java index de001896ea9..a43fa013958 100644 --- a/tests/robotests/src/com/android/settings/notification/AdjustVolumeRestrictedPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/AdjustVolumeRestrictedPreferenceControllerTest.java @@ -20,19 +20,20 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.doCallRealMethod; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; +import android.os.UserHandle; import android.os.UserManager; import androidx.preference.Preference; import com.android.settings.accounts.AccountRestrictionHelper; -import com.android.settingslib.RestrictedPreference; +import com.android.settingslib.RestrictedLockUtilsInternal; +import com.android.settingslib.RestrictedSeekBarPreference; import org.junit.Before; import org.junit.Test; @@ -46,9 +47,11 @@ import org.robolectric.RuntimeEnvironment; public class AdjustVolumeRestrictedPreferenceControllerTest { private static final String KEY = "key"; - @Mock private AccountRestrictionHelper mAccountHelper; + @Mock + UserManager mUserManager; + private Context mContext; private AdjustVolumeRestrictedPreferenceControllerTestable mController; @@ -56,15 +59,17 @@ public class AdjustVolumeRestrictedPreferenceControllerTest { public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); + when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager); + mAccountHelper = new AccountRestrictionHelper(mContext); mController = new AdjustVolumeRestrictedPreferenceControllerTestable(mContext, mAccountHelper, KEY); } @Test public void updateState_hasBaseRestriction_shouldDisable() { - RestrictedPreference preference = mock(RestrictedPreference.class); - when(mAccountHelper.hasBaseUserRestriction( - eq(UserManager.DISALLOW_ADJUST_VOLUME), anyInt())).thenReturn(true); + RestrictedSeekBarPreference preference = mock(RestrictedSeekBarPreference.class); + when(RestrictedLockUtilsInternal.hasBaseUserRestriction(mContext, + UserManager.DISALLOW_ADJUST_VOLUME, UserHandle.myUserId())).thenReturn(true); mController.updateState(preference); @@ -73,13 +78,11 @@ public class AdjustVolumeRestrictedPreferenceControllerTest { @Test public void updateState_NoBaseRestriction_shouldCheckRestriction() { - RestrictedPreference preference = spy(new RestrictedPreference(mContext)); + RestrictedSeekBarPreference preference = spy(new RestrictedSeekBarPreference(mContext)); when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn(null); - when(mAccountHelper.hasBaseUserRestriction( - eq(UserManager.DISALLOW_ADJUST_VOLUME), anyInt())).thenReturn(false); - doCallRealMethod().when(mAccountHelper).enforceRestrictionOnPreference( - eq(preference), eq(UserManager.DISALLOW_ADJUST_VOLUME), anyInt()); + when(RestrictedLockUtilsInternal.hasBaseUserRestriction(mContext, + UserManager.DISALLOW_ADJUST_VOLUME, UserHandle.myUserId())).thenReturn(false); mController.updateState(preference); diff --git a/tests/robotests/src/com/android/settings/notification/RemoteVolumeGroupControllerTest.java b/tests/robotests/src/com/android/settings/notification/RemoteVolumeGroupControllerTest.java index 8b46374b684..d24fe16b4c7 100644 --- a/tests/robotests/src/com/android/settings/notification/RemoteVolumeGroupControllerTest.java +++ b/tests/robotests/src/com/android/settings/notification/RemoteVolumeGroupControllerTest.java @@ -43,8 +43,8 @@ import androidx.preference.PreferenceScreen; import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.testutils.shadow.ShadowBluetoothAdapter; -import com.android.settings.widget.SeekBarPreference; import com.android.settingslib.media.LocalMediaManager; +import com.android.settingslib.widget.SeekBarPreference; import org.junit.Before; import org.junit.Test; diff --git a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentsPreferenceControllerTest.java index d7aa42c5737..cd192ef5220 100644 --- a/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentsPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/security/trustagent/TrustAgentsPreferenceControllerTest.java @@ -28,7 +28,6 @@ import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.service.trust.TrustAgentService; -import android.text.TextUtils; import androidx.preference.PreferenceManager; import androidx.preference.PreferenceScreen; diff --git a/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java deleted file mode 100644 index 451b84bd882..00000000000 --- a/tests/robotests/src/com/android/settings/widget/SeekBarPreferenceTest.java +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Copyright (C) 2018 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.settings.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.verify; -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 com.android.settings.testutils.shadow.ShadowRestrictedLockUtilsInternal; - -import org.junit.Before; -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) -@Config(shadows = ShadowRestrictedLockUtilsInternal.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 - public void isSelectable_disabledByAdmin_returnTrue() { - when(mSeekBarPreference.isDisabledByAdmin()).thenReturn(true); - - assertThat(mSeekBarPreference.isSelectable()).isTrue(); - } - - @Test - @Config(qualifiers = "mcc998") - 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") - 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 testSetSeekBarStateDescription() { - mSeekBarPreference.setSeekBarStateDescription("test"); - - verify(mSeekBarPreference).setSeekBarStateDescription("test"); - } - - @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(com.android.settings.R.xml.seekbar_preference); - } - } -} diff --git a/tests/unit/src/com/android/settings/core/SettingsSliderPreferenceControllerTest.java b/tests/unit/src/com/android/settings/core/SettingsSliderPreferenceControllerTest.java index 846ffd753af..982eb3714e0 100644 --- a/tests/unit/src/com/android/settings/core/SettingsSliderPreferenceControllerTest.java +++ b/tests/unit/src/com/android/settings/core/SettingsSliderPreferenceControllerTest.java @@ -23,7 +23,7 @@ import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.android.settings.slices.SliceData; -import com.android.settings.widget.SeekBarPreference; +import com.android.settingslib.widget.SeekBarPreference; import org.junit.Before; import org.junit.Test; diff --git a/tests/unit/src/com/android/settings/widget/DefaultIndicatorSeekBarTest.java b/tests/unit/src/com/android/settings/widget/DefaultIndicatorSeekBarTest.java deleted file mode 100644 index 777d9845cd3..00000000000 --- a/tests/unit/src/com/android/settings/widget/DefaultIndicatorSeekBarTest.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2020 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.settings.widget; - -import static org.junit.Assert.assertEquals; - -import androidx.test.core.app.ApplicationProvider; -import androidx.test.ext.junit.runners.AndroidJUnit4; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(AndroidJUnit4.class) -public class DefaultIndicatorSeekBarTest { - - private DefaultIndicatorSeekBar mDefaultIndicatorSeekBar; - - @Before - public void setUp() { - mDefaultIndicatorSeekBar = new DefaultIndicatorSeekBar( - ApplicationProvider.getApplicationContext()); - mDefaultIndicatorSeekBar.setMax(100); - } - - @After - public void tearDown() { - mDefaultIndicatorSeekBar = null; - } - - @Test - public void defaultProgress_setSucceeds() { - mDefaultIndicatorSeekBar.setDefaultProgress(40); - assertEquals(40, mDefaultIndicatorSeekBar.getDefaultProgress()); - } -}