diff --git a/src/com/android/settings/inputmethod/MouseScrollingSpeedPreferenceController.java b/src/com/android/settings/inputmethod/MouseScrollingSpeedPreferenceController.java index 0a57085b7d2..a047e5699a7 100644 --- a/src/com/android/settings/inputmethod/MouseScrollingSpeedPreferenceController.java +++ b/src/com/android/settings/inputmethod/MouseScrollingSpeedPreferenceController.java @@ -16,29 +16,55 @@ package com.android.settings.inputmethod; +import android.content.ContentResolver; import android.content.Context; +import android.database.ContentObserver; import android.hardware.input.InputSettings; +import android.os.Handler; +import android.os.Looper; +import android.provider.Settings; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.preference.Preference; 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.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; -public class MouseScrollingSpeedPreferenceController extends SliderPreferenceController { + +public class MouseScrollingSpeedPreferenceController extends SliderPreferenceController implements + Preference.OnPreferenceChangeListener, LifecycleObserver, OnStop, OnStart { + + private final ContentResolver mContentResolver; + private final ContentObserver mContentObserver; + + @Nullable + private SeekBarPreference mPreference; public MouseScrollingSpeedPreferenceController(@NonNull Context context, @NonNull String key) { super(context, key); + + mContentResolver = context.getContentResolver(); + mContentObserver = new ContentObserver(new Handler(Looper.getMainLooper())) { + @Override + public void onChange(boolean selfChange) { + updateAvailabilityStatus(); + } + }; } @Override public void displayPreference(@NonNull PreferenceScreen screen) { super.displayPreference(screen); - SeekBarPreference preference = screen.findPreference(getPreferenceKey()); - preference.setMax(getMax()); - preference.setMin(getMin()); - preference.setProgress(getSliderPosition()); - updateState(preference); + mPreference = screen.findPreference(getPreferenceKey()); + mPreference.setMax(getMax()); + mPreference.setMin(getMin()); + mPreference.setProgress(getSliderPosition()); + updateState(mPreference); } @Override @@ -46,7 +72,7 @@ public class MouseScrollingSpeedPreferenceController extends SliderPreferenceCon if (!InputSettings.isMouseScrollingAccelerationFeatureFlagEnabled()) { return UNSUPPORTED_ON_DEVICE; } - return AVAILABLE; + return shouldEnableSlideBar() ? AVAILABLE : DISABLED_DEPENDENT_SETTING; } @Override @@ -73,4 +99,30 @@ public class MouseScrollingSpeedPreferenceController extends SliderPreferenceCon public int getMax() { return InputSettings.MAX_MOUSE_SCROLLING_SPEED; } + + /** + * Returns whether the mouse scrolling speed slide bar should allow users to customize or not. + */ + public boolean shouldEnableSlideBar() { + return !InputSettings.isMouseScrollingAccelerationEnabled(mContext); + } + + @Override + public void onStart() { + mContentResolver.registerContentObserver( + Settings.System.getUriFor( + Settings.System.MOUSE_SCROLLING_ACCELERATION), + /* notifyForDescendants= */ false, mContentObserver); + } + + @Override + public void onStop() { + mContentResolver.unregisterContentObserver(mContentObserver); + } + + private void updateAvailabilityStatus() { + if (mPreference != null) { + mPreference.setEnabled(shouldEnableSlideBar()); + } + } }