Add Settings page for three finger tap customization

Test: TouchpadThreeFingerTapFragmentTest
Test: TouchpadThreeFingerTapPreferenceControllerTest
Flag: com.android.hardware.input.touchpad_three_finger_tap_shortcut
Bug: 376249366
Change-Id: I63a9a1cbe5f5ed644c39e1a30aa724ea9e5088cb
This commit is contained in:
Pat Manning
2024-10-29 18:05:25 +00:00
parent 05b9d038de
commit 00ec5248cb
9 changed files with 525 additions and 0 deletions

View File

@@ -0,0 +1,82 @@
<?xml version="1.0" encoding="utf-8"?><!--
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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeightSmall"
android:orientation="vertical"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:paddingStart="?android:attr/listPreferredItemPaddingStart">
<RadioGroup
android:id="@+id/button_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginTop="@dimen/radio_group_style_padding"
android:layout_marginBottom="@dimen/radio_group_style_padding"
tools:ignore="UselessParent">
<RadioButton android:id="@+id/middle_click"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/radio_group_style_padding"
android:paddingStart="@dimen/radio_group_style_text_padding"
android:paddingEnd="@dimen/radio_group_style_text_padding"
android:text="@string/three_finger_tap_middle_click"
android:textSize="20sp"
android:textAppearance="?android:attr/textAppearanceListItem" />
<RadioButton android:id="@+id/launch_gemini"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/radio_group_style_padding"
android:paddingStart="@dimen/radio_group_style_text_padding"
android:paddingEnd="@dimen/radio_group_style_text_padding"
android:text="@string/three_finger_tap_launch_gemini"
android:textSize="20sp"
android:textAppearance="?android:attr/textAppearanceListItem" />
<RadioButton android:id="@+id/go_home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/radio_group_style_padding"
android:paddingStart="@dimen/radio_group_style_text_padding"
android:paddingEnd="@dimen/radio_group_style_text_padding"
android:text="@string/three_finger_tap_go_home"
android:textSize="20sp"
android:textAppearance="?android:attr/textAppearanceListItem" />
<RadioButton android:id="@+id/go_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/radio_group_style_padding"
android:paddingStart="@dimen/radio_group_style_text_padding"
android:paddingEnd="@dimen/radio_group_style_text_padding"
android:text="@string/three_finger_tap_go_back"
android:textSize="20sp"
android:textAppearance="?android:attr/textAppearanceListItem" />
<RadioButton android:id="@+id/recent_apps"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/radio_group_style_padding"
android:paddingStart="@dimen/radio_group_style_text_padding"
android:paddingEnd="@dimen/radio_group_style_text_padding"
android:text="@string/three_finger_tap_recent_apps"
android:textSize="20sp"
android:textAppearance="?android:attr/textAppearanceListItem" />
</RadioGroup>
</LinearLayout>

View File

@@ -200,6 +200,8 @@
<dimen name="pointer_scale_padding">8dp</dimen>
<item name="pointer_scale_size_start" format="float" type="dimen">1.0</item>
<item name="pointer_scale_size_end" format="float" type="dimen">2.5</item>
<dimen name="radio_group_style_padding">8dp</dimen>
<dimen name="radio_group_style_text_padding">21dp</dimen>
<!-- RemoteAuth-->
<dimen name="remoteauth_fragment_padding_horizontal">40dp</dimen>

View File

@@ -4649,6 +4649,8 @@
<string name="trackpad_bottom_right_tap_summary">Click in the bottom right corner of the touchpad for more options</string>
<!-- Title text for 'Pointer speed'. [CHAR LIMIT=35] -->
<string name="trackpad_pointer_speed">Pointer speed</string>
<!-- Title text for 'Three finger tap' touchpad preference. This preference allows the user to select an action that will trigger when they tap three fingers on a touchpad. [CHAR LIMIT=60] -->
<string name="three_finger_tap_preference_title">Use three finger tap</string>
<!-- Title text for mouse pointer color. [CHAR LIMIT=35] -->
<string name="pointer_fill_style">Pointer color</string>
<!-- Content description for black pointer fill style. [CHAR LIMIT=60] -->
@@ -4677,6 +4679,16 @@
<string name="keywords_touchpad">trackpad, track pad, mouse, cursor, scroll, swipe, right click, click, pointer</string>
<!-- Search keywords for 'Bottom-right tap', the name of the touchpad setting that allows the user to click the bottom right corner of the touchpad for more options. -->
<string name="keywords_trackpad_bottom_right_tap">right click, tap</string>
<!-- Radio button text for 'middle click' action. This is one of multiple actions the user can select from the three finger tap customization radio group. The action if selected will act as a middle-click when a three-finger tap is performed on a touchpad. [CHAR LIMIT=35] -->
<string name="three_finger_tap_middle_click">Middle click</string>
<!-- Radio button text for 'launch gemini' action. This is one of multiple actions the user can select from the three finger tap customization radio group. The action if selected will launch Gemini when a three-finger tap is performed on a touchpad. [CHAR LIMIT=35] -->
<string name="three_finger_tap_launch_gemini">Launch Gemini</string>
<!-- Radio button text for 'Go home' action. This is one of multiple actions the user can select from the three finger tap customization radio group. The action if selected will take the user home when a three-finger tap is performed on a touchpad. [CHAR LIMIT=35] -->
<string name="three_finger_tap_go_home">Go home</string>
<!-- Radio button text for 'Go back' action. This is one of multiple actions the user can select from the three finger tap customization radio group. The action if selected will initiate a back gesture when a three-finger tap is performed on a touchpad. [CHAR LIMIT=35] -->
<string name="three_finger_tap_go_back">Go back</string>
<!-- Radio button text for 'View recent apps' action. This is one of multiple actions the user can select from the three finger tap customization radio group. The action if selected will show the recent apps when a three-finger tap is performed on a touchpad. [CHAR LIMIT=35] -->
<string name="three_finger_tap_recent_apps">View recent apps</string>
<!-- Title text for 'Go home' gesture education [CHAR LIMIT=35] -->
<string name="gesture_title_go_home">Go home</string>

View File

@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 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.
-->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="input_touchpad_three_finger_tap"
android:persistent="false"
android:title="@string/three_finger_tap_preference_title">
<com.android.settings.inputmethod.TouchpadThreeFingerTapSelector
android:key="input_touchpad_three_finger_tap_preference"
android:title="@string/three_finger_tap_preference_title"/>
</PreferenceScreen>

View File

@@ -55,6 +55,13 @@
settings:controller="com.android.settings.inputmethod.TrackpadTapDraggingPreferenceController"
android:order="35"/>
<Preference
android:fragment="com.android.settings.inputmethod.TouchpadThreeFingerTapFragment"
android:key="three_finger_tap"
android:title="@string/three_finger_tap_preference_title"
settings:controller="com.android.settings.inputmethod.TouchpadThreeFingerTapPreferenceController"
android:order="37"/>
<com.android.settings.widget.SeekBarPreference
android:key="trackpad_pointer_speed"
android:title="@string/trackpad_pointer_speed"

View File

@@ -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 static com.android.settings.inputmethod.NewKeyboardSettingsUtils.isTouchpad;
import android.app.settings.SettingsEnums;
import android.content.Context;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.search.SearchIndexable;
/** Input settings for touchpad three finger tap. */
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
public class TouchpadThreeFingerTapFragment extends DashboardFragment {
private static final String TAG = "TouchpadThreeFingerTapFragment";
@Override
public int getMetricsCategory() {
return SettingsEnums.TOUCHPAD_THREE_FINGER_TAP;
}
@Override
protected int getPreferenceScreenResId() {
return R.xml.input_touchpad_three_finger_tap_customization;
}
@Override
protected String getLogTag() {
return TAG;
}
public static final BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
new BaseSearchIndexProvider(R.xml.input_touchpad_three_finger_tap_customization) {
@Override
protected boolean isPageSearchEnabled(Context context) {
return isTouchpad();
}
};
}

View File

@@ -0,0 +1,107 @@
/*
* 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.app.settings.SettingsEnums;
import android.content.Context;
import android.hardware.input.InputSettings;
import android.hardware.input.KeyGestureEvent;
import android.os.UserHandle;
import android.provider.Settings;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleEventObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import java.util.Map;
public class TouchpadThreeFingerTapPreferenceController extends BasePreferenceController
implements LifecycleEventObserver {
private final Map<Integer, String> mKeyGestureTypeNameMap;
private final MetricsFeatureProvider mMetricsFeatureProvider;
private @Nullable Preference mPreference;
public TouchpadThreeFingerTapPreferenceController(@NonNull Context context,
@NonNull String key) {
super(context, key);
mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
mKeyGestureTypeNameMap = Map.ofEntries(
Map.entry(KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_ASSISTANT,
context.getString(R.string.three_finger_tap_launch_gemini)),
Map.entry(KeyGestureEvent.KEY_GESTURE_TYPE_HOME,
context.getString(R.string.three_finger_tap_go_home)),
Map.entry(KeyGestureEvent.KEY_GESTURE_TYPE_BACK,
context.getString(R.string.three_finger_tap_go_back)),
Map.entry(KeyGestureEvent.KEY_GESTURE_TYPE_RECENT_APPS,
context.getString(R.string.three_finger_tap_recent_apps)),
Map.entry(KeyGestureEvent.KEY_GESTURE_TYPE_UNSPECIFIED,
context.getString(R.string.three_finger_tap_middle_click)));
}
@Override
public int getAvailabilityStatus() {
boolean isTouchpad = NewKeyboardSettingsUtils.isTouchpad();
return (InputSettings.isTouchpadThreeFingerTapShortcutFeatureFlagEnabled() && isTouchpad)
? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
}
@Override
public int getSliceHighlightMenuRes() {
return R.string.menu_key_system;
}
@Override
public @Nullable CharSequence getSummary() {
int currentType = Settings.System.getIntForUser(mContext.getContentResolver(),
Settings.System.TOUCHPAD_THREE_FINGER_TAP_CUSTOMIZATION,
KeyGestureEvent.KEY_GESTURE_TYPE_UNSPECIFIED, UserHandle.USER_CURRENT);
return mKeyGestureTypeNameMap.get(currentType);
}
@Override
public void displayPreference(@NonNull PreferenceScreen screen) {
super.displayPreference(screen);
mPreference = screen.findPreference(getPreferenceKey());
refreshSummary(mPreference);
}
@Override
public void onStateChanged(@NonNull LifecycleOwner lifecycleOwner,
@NonNull Lifecycle.Event event) {
refreshSummary(mPreference);
if (event == Lifecycle.Event.ON_PAUSE) {
int currentValue =
Settings.System.getIntForUser(mContext.getContentResolver(),
Settings.System.TOUCHPAD_THREE_FINGER_TAP_CUSTOMIZATION,
KeyGestureEvent.KEY_GESTURE_TYPE_UNSPECIFIED, UserHandle.USER_CURRENT);
mMetricsFeatureProvider.action(mContext,
SettingsEnums.ACTION_TOUCHPAD_THREE_FINGER_TAP_CUSTOMIZATION_CHANGED,
currentValue);
}
}
}

View File

@@ -0,0 +1,98 @@
/*
* 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 android.hardware.input.InputGestureData.TOUCHPAD_GESTURE_TYPE_THREE_FINGER_TAP;
import static android.hardware.input.InputGestureData.createTouchpadTrigger;
import android.content.Context;
import android.hardware.input.InputGestureData;
import android.hardware.input.InputManager;
import android.hardware.input.KeyGestureEvent;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.AttributeSet;
import android.view.PointerIcon;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
import com.android.settings.R;
public class TouchpadThreeFingerTapSelector extends Preference {
private static final InputGestureData.Trigger THREE_FINGER_TAP_TOUCHPAD_TRIGGER =
createTouchpadTrigger(TOUCHPAD_GESTURE_TYPE_THREE_FINGER_TAP);
private final InputManager mInputManager;
public TouchpadThreeFingerTapSelector(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
setLayoutResource(R.layout.touchpad_three_finger_tap_layout);
mInputManager = context.getSystemService(InputManager.class);
}
@Override
public void onBindViewHolder(@NonNull PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
LinearLayout buttonHolder = (LinearLayout) holder.findViewById(R.id.button_holder);
// Intercept hover events so setting row does not highlight when hovering buttons.
buttonHolder.setOnHoverListener((v, e) -> true);
int currentCustomization = Settings.System.getIntForUser(getContext().getContentResolver(),
Settings.System.TOUCHPAD_THREE_FINGER_TAP_CUSTOMIZATION,
KeyGestureEvent.KEY_GESTURE_TYPE_UNSPECIFIED, UserHandle.USER_CURRENT);
initRadioButton(holder, R.id.launch_gemini,
KeyGestureEvent.KEY_GESTURE_TYPE_LAUNCH_ASSISTANT, currentCustomization);
initRadioButton(holder, R.id.go_home, KeyGestureEvent.KEY_GESTURE_TYPE_HOME,
currentCustomization);
initRadioButton(holder, R.id.go_back, KeyGestureEvent.KEY_GESTURE_TYPE_BACK,
currentCustomization);
initRadioButton(holder, R.id.recent_apps, KeyGestureEvent.KEY_GESTURE_TYPE_RECENT_APPS,
currentCustomization);
initRadioButton(holder, R.id.middle_click,
KeyGestureEvent.KEY_GESTURE_TYPE_UNSPECIFIED, currentCustomization);
}
private void initRadioButton(@NonNull PreferenceViewHolder holder, int id,
int customGestureType, int currentCustomization) {
RadioButton radioButton = (RadioButton) holder.findViewById(id);
if (radioButton == null) {
return;
}
boolean isUnspecified = customGestureType == KeyGestureEvent.KEY_GESTURE_TYPE_UNSPECIFIED;
InputGestureData gesture = isUnspecified ? null : new InputGestureData.Builder()
.setTrigger(THREE_FINGER_TAP_TOUCHPAD_TRIGGER)
.setKeyGestureType(customGestureType)
.build();
radioButton.setOnCheckedChangeListener((v, isChecked) -> {
if (isChecked) {
mInputManager.removeAllCustomInputGestures(InputGestureData.Filter.TOUCHPAD);
if (!isUnspecified) {
mInputManager.addCustomInputGesture(gesture);
}
Settings.System.putIntForUser(getContext().getContentResolver(),
Settings.System.TOUCHPAD_THREE_FINGER_TAP_CUSTOMIZATION, customGestureType,
UserHandle.USER_CURRENT);
}
});
radioButton.setChecked(currentCustomization == customGestureType);
radioButton.setPointerIcon(PointerIcon.getSystemIcon(getContext(), PointerIcon.TYPE_ARROW));
}
}

View File

@@ -0,0 +1,131 @@
/*
* 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 android.platform.test.flag.junit.SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT;
import static com.android.settings.core.BasePreferenceController.AVAILABLE;
import static com.android.settings.core.BasePreferenceController.CONDITIONALLY_UNAVAILABLE;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;
import android.app.settings.SettingsEnums;
import android.content.Context;
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 android.view.InputDevice;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.test.core.app.ApplicationProvider;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowInputDevice;
import com.android.settings.testutils.shadow.ShadowSystemSettings;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
/** Tests for {@link TouchpadThreeFingerTapPreferenceController} */
@RunWith(RobolectricTestRunner.class)
@Config(shadows = {
ShadowSystemSettings.class,
ShadowInputDevice.class,
})
public class TouchpadThreeFingerTapPreferenceControllerTest {
@Rule
public MockitoRule mMockitoRule = MockitoJUnit.rule();
@Rule
public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(DEVICE_DEFAULT);
@Mock
LifecycleOwner mLifecycleOwner;
private Context mContext;
private TouchpadThreeFingerTapPreferenceController mController;
private FakeFeatureFactory mFeatureFactory;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
mFeatureFactory = FakeFeatureFactory.setupForTest();
mController = new TouchpadThreeFingerTapPreferenceController(mContext, "three_finger_tap");
ShadowInputDevice.reset();
}
@Test
@EnableFlags(com.android.hardware.input.Flags.FLAG_TOUCHPAD_THREE_FINGER_TAP_SHORTCUT)
public void getAvailabilityStatus_flagEnabledHasTouchPad() {
int deviceId = 1;
ShadowInputDevice.sDeviceIds = new int[]{deviceId};
InputDevice device = ShadowInputDevice.makeInputDevicebyIdWithSources(deviceId,
InputDevice.SOURCE_TOUCHPAD);
ShadowInputDevice.addDevice(deviceId, device);
assertEquals(mController.getAvailabilityStatus(), AVAILABLE);
}
@Test
@EnableFlags(com.android.hardware.input.Flags.FLAG_TOUCHPAD_THREE_FINGER_TAP_SHORTCUT)
public void getAvailabilityStatus_flagEnabledNoTouchPad() {
int deviceId = 1;
ShadowInputDevice.sDeviceIds = new int[]{deviceId};
InputDevice device = ShadowInputDevice.makeInputDevicebyIdWithSources(deviceId,
InputDevice.SOURCE_BLUETOOTH_STYLUS);
ShadowInputDevice.addDevice(deviceId, device);
assertEquals(mController.getAvailabilityStatus(), CONDITIONALLY_UNAVAILABLE);
}
@Test
@DisableFlags(com.android.hardware.input.Flags.FLAG_TOUCHPAD_THREE_FINGER_TAP_SHORTCUT)
public void getAvailabilityStatus_flagDisabled() {
int deviceId = 1;
ShadowInputDevice.sDeviceIds = new int[]{deviceId};
InputDevice device = ShadowInputDevice.makeInputDevicebyIdWithSources(deviceId,
InputDevice.SOURCE_TOUCHPAD);
ShadowInputDevice.addDevice(deviceId, device);
assertEquals(mController.getAvailabilityStatus(), CONDITIONALLY_UNAVAILABLE);
}
@Test
public void onPause_logCurrentFillValue() {
int customizationValue = 1;
Settings.System.putIntForUser(mContext.getContentResolver(),
Settings.System.TOUCHPAD_THREE_FINGER_TAP_CUSTOMIZATION, customizationValue,
UserHandle.USER_CURRENT);
mController.onStateChanged(mLifecycleOwner, Lifecycle.Event.ON_PAUSE);
verify(mFeatureFactory.metricsFeatureProvider).action(
any(), eq(SettingsEnums.ACTION_TOUCHPAD_THREE_FINGER_TAP_CUSTOMIZATION_CHANGED),
eq(customizationValue));
}
}