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(); + } +}