From f9a89f1c77d2c115633b8517c00deba788c3573c Mon Sep 17 00:00:00 2001 From: Michael Checo Date: Wed, 18 Dec 2024 17:36:38 +0000 Subject: [PATCH] Add preference toggle for mouse pointer acceleration setting Bug: 384552392 Test: verified on DUT Flag: com.android.hardware.input.pointer_acceleration Change-Id: I45de5bdd2456cfb4fab6d1398bdc5d8f7b9efddb --- res/values/strings.xml | 4 + res/xml/mouse_settings.xml | 6 + ...interAccelerationPreferenceController.java | 57 ++++++++ ...rAccelerationPreferenceControllerTest.java | 122 ++++++++++++++++++ 4 files changed, 189 insertions(+) create mode 100644 src/com/android/settings/inputmethod/MousePointerAccelerationPreferenceController.java create mode 100644 tests/robotests/src/com/android/settings/inputmethod/MousePointerAccelerationPreferenceControllerTest.java diff --git a/res/values/strings.xml b/res/values/strings.xml index 79db5c87410..95ddb19f083 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4648,6 +4648,10 @@ Swap left and right buttons Use the left mouse button as your right + + Cursor acceleration + + Faster movements with your mouse will move the cursor farther Mouse keys for %s diff --git a/res/xml/mouse_settings.xml b/res/xml/mouse_settings.xml index bb6d1a04f4b..0abfdd0c364 100644 --- a/res/xml/mouse_settings.xml +++ b/res/xml/mouse_settings.xml @@ -31,4 +31,10 @@ android:title="@string/mouse_swap_primary_button" android:summary="@string/mouse_swap_primary_button_summary" settings:controller="com.android.settings.inputmethod.MouseSwapPrimaryButtonPreferenceController" /> + + diff --git a/src/com/android/settings/inputmethod/MousePointerAccelerationPreferenceController.java b/src/com/android/settings/inputmethod/MousePointerAccelerationPreferenceController.java new file mode 100644 index 00000000000..030f2538d0b --- /dev/null +++ b/src/com/android/settings/inputmethod/MousePointerAccelerationPreferenceController.java @@ -0,0 +1,57 @@ +/* + * Copyright 2024 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.inputmethod; + +import android.content.Context; +import android.hardware.input.InputSettings; + +import androidx.annotation.NonNull; + +import com.android.settings.R; +import com.android.settings.core.TogglePreferenceController; + +public class MousePointerAccelerationPreferenceController extends TogglePreferenceController { + + public MousePointerAccelerationPreferenceController( + @NonNull Context context, @NonNull String key) { + super(context, key); + } + + @Override + public boolean isChecked() { + return InputSettings.isMousePointerAccelerationEnabled(mContext); + } + + @Override + public boolean setChecked(boolean isChecked) { + InputSettings.setMouseAccelerationEnabled(mContext, isChecked); + return true; + } + + @Override + public int getAvailabilityStatus() { + if (!InputSettings.isPointerAccelerationFeatureFlagEnabled()) { + return UNSUPPORTED_ON_DEVICE; + } + return AVAILABLE; + } + + @Override + public int getSliceHighlightMenuRes() { + return R.string.menu_key_system; + } +} diff --git a/tests/robotests/src/com/android/settings/inputmethod/MousePointerAccelerationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/MousePointerAccelerationPreferenceControllerTest.java new file mode 100644 index 00000000000..75dd741bdcc --- /dev/null +++ b/tests/robotests/src/com/android/settings/inputmethod/MousePointerAccelerationPreferenceControllerTest.java @@ -0,0 +1,122 @@ +/* + * Copyright 2024 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.inputmethod; + +import static com.google.common.truth.Truth.assertThat; + +import android.content.Context; +import android.hardware.input.InputSettings; +import android.os.UserHandle; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; +import android.provider.Settings; + +import androidx.test.core.app.ApplicationProvider; + +import com.android.hardware.input.Flags; +import com.android.settings.core.BasePreferenceController; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.annotation.Config; + +/** Tests for {@link MousePointerAccelerationPreferenceController} */ +@RunWith(RobolectricTestRunner.class) +@Config(shadows = { + com.android.settings.testutils.shadow.ShadowSystemSettings.class, +}) +public class MousePointerAccelerationPreferenceControllerTest { + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + + private static final String PREFERENCE_KEY = "mouse_pointer_acceleration"; + private static final String SETTING_KEY = Settings.System.MOUSE_POINTER_ACCELERATION_ENABLED; + + private Context mContext; + private MousePointerAccelerationPreferenceController mController; + + @Before + public void setUp() { + mContext = ApplicationProvider.getApplicationContext(); + mController = new MousePointerAccelerationPreferenceController( + mContext, PREFERENCE_KEY); + } + + @Test + @EnableFlags(Flags.FLAG_POINTER_ACCELERATION) + public void getAvailabilityStatus_expected() { + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.AVAILABLE); + } + + @Test + @DisableFlags(Flags.FLAG_POINTER_ACCELERATION) + public void getAvailabilityStatus_flagIsDisabled_notSupport() { + assertThat(mController.getAvailabilityStatus()) + .isEqualTo(BasePreferenceController.UNSUPPORTED_ON_DEVICE); + } + + @Test + @EnableFlags(Flags.FLAG_POINTER_ACCELERATION) + public void setChecked_true_shouldReturnTrue() { + mController.setChecked(true); + + boolean isEnabled = InputSettings.isMousePointerAccelerationEnabled(mContext); + assertThat(isEnabled).isTrue(); + } + + @Test + @EnableFlags(Flags.FLAG_POINTER_ACCELERATION) + public void setChecked_false_shouldReturnFalse() { + mController.setChecked(false); + + boolean isEnabled = InputSettings.isMousePointerAccelerationEnabled(mContext); + assertThat(isEnabled).isFalse(); + } + + @Test + @EnableFlags(Flags.FLAG_POINTER_ACCELERATION) + public void isChecked_providerPutInt1_returnTrue() { + Settings.System.putIntForUser( + mContext.getContentResolver(), + SETTING_KEY, + 1, + UserHandle.USER_CURRENT); + + boolean result = mController.isChecked(); + + assertThat(result).isTrue(); + } + + @Test + @EnableFlags(Flags.FLAG_POINTER_ACCELERATION) + public void isChecked_providerPutInt0_returnFalse() { + Settings.System.putIntForUser( + mContext.getContentResolver(), + SETTING_KEY, + 0, + UserHandle.USER_CURRENT); + + boolean result = mController.isChecked(); + + assertThat(result).isFalse(); + } +}