From cfd02f52a64f59f1b670e3ff3f5d2d3fce74a437 Mon Sep 17 00:00:00 2001 From: danielwbhuang Date: Sat, 4 Feb 2023 23:16:16 +0800 Subject: [PATCH] Show touchpad entry when input device is detected as touchpad. 1. Remove the redundant part about active ime. 2. Add a NPE detector to fix bug. 3. Check if input device is detected as touchpad. Bug: 247080509 Bug: 267092726 Test: manual Change-Id: I40640e42abd471efde6d1f9166b8999243499c62 --- .../KeyboardPreferenceController.java | 17 +++--- .../inputmethod/NewKeyboardSettingsUtils.java | 21 +++---- ...uchGesturesButtonPreferenceController.java | 4 +- .../TrackpadSettingsController.java | 60 +++++++++++++++++-- 4 files changed, 80 insertions(+), 22 deletions(-) diff --git a/src/com/android/settings/inputmethod/KeyboardPreferenceController.java b/src/com/android/settings/inputmethod/KeyboardPreferenceController.java index adabec50c8c..26b07d82177 100644 --- a/src/com/android/settings/inputmethod/KeyboardPreferenceController.java +++ b/src/com/android/settings/inputmethod/KeyboardPreferenceController.java @@ -27,13 +27,13 @@ import com.android.settings.core.BasePreferenceController; import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.inputmethod.PhysicalKeyboardFragment.HardKeyboardDeviceInfo; 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.core.lifecycle.events.OnStart; +import com.android.settingslib.core.lifecycle.events.OnStop; import java.util.List; public class KeyboardPreferenceController extends BasePreferenceController - implements PreferenceControllerMixin, LifecycleObserver, OnResume, OnPause, + implements PreferenceControllerMixin, LifecycleObserver, OnStart, OnStop, InputManager.InputDeviceListener { private final InputManager mIm; @@ -61,13 +61,13 @@ public class KeyboardPreferenceController extends BasePreferenceController } @Override - public void onPause() { - mIm.unregisterInputDeviceListener(this); + public void onStart() { + mIm.registerInputDeviceListener(this, null); } @Override - public void onResume() { - mIm.registerInputDeviceListener(this, null); + public void onStop() { + mIm.unregisterInputDeviceListener(this); } @Override @@ -84,6 +84,9 @@ public class KeyboardPreferenceController extends BasePreferenceController } private void updateSummary() { + if (mPreference == null) { + return; + } final List keyboards = PhysicalKeyboardFragment.getHardKeyboards(mContext); if (keyboards.isEmpty()) { diff --git a/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java b/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java index 9a1b2e49e9d..0bd938e2e44 100644 --- a/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java +++ b/src/com/android/settings/inputmethod/NewKeyboardSettingsUtils.java @@ -17,7 +17,7 @@ package com.android.settings.inputmethod; import android.content.Context; -import android.provider.Settings; +import android.view.InputDevice; import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodSubtype; @@ -38,17 +38,18 @@ public class NewKeyboardSettingsUtils { static final String EXTRA_INPUT_METHOD_INFO = "input_method_info"; static final String EXTRA_INPUT_METHOD_SUBTYPE = "input_method_subtype"; - static InputMethodInfo getActiveIme(Context context, InputMethodManager imm) { - InputMethodInfo activeIme = null; - List infoList = imm.getEnabledInputMethodList(); - String imeId = Settings.Secure.getStringForUser(context.getContentResolver(), - Settings.Secure.DEFAULT_INPUT_METHOD, context.getUserId()); - for (InputMethodInfo method : infoList) { - if (method.getId().equals(imeId)) { - activeIme = method; + static boolean isTouchpad() { + for (int deviceId : InputDevice.getDeviceIds()) { + final InputDevice device = InputDevice.getDevice(deviceId); + if (device == null) { + continue; + } + if ((device.getSources() & InputDevice.SOURCE_TOUCHPAD) + == InputDevice.SOURCE_TOUCHPAD) { + return true; } } - return activeIme; + return false; } static List getSuitableImeLabels(Context context, InputMethodManager imm, int userId) { diff --git a/src/com/android/settings/inputmethod/TouchGesturesButtonPreferenceController.java b/src/com/android/settings/inputmethod/TouchGesturesButtonPreferenceController.java index bbe65c11fb8..7efa637188d 100644 --- a/src/com/android/settings/inputmethod/TouchGesturesButtonPreferenceController.java +++ b/src/com/android/settings/inputmethod/TouchGesturesButtonPreferenceController.java @@ -63,7 +63,9 @@ public class TouchGesturesButtonPreferenceController extends BasePreferenceContr @Override public int getAvailabilityStatus() { - return AVAILABLE; + boolean touchGestureDeveloperMode = FeatureFlagUtils + .isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_TRACKPAD_GESTURE); + return touchGestureDeveloperMode ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } private void showTouchpadGestureEducation() { diff --git a/src/com/android/settings/inputmethod/TrackpadSettingsController.java b/src/com/android/settings/inputmethod/TrackpadSettingsController.java index 41be395d0e8..3de58e4f38f 100644 --- a/src/com/android/settings/inputmethod/TrackpadSettingsController.java +++ b/src/com/android/settings/inputmethod/TrackpadSettingsController.java @@ -17,21 +17,73 @@ package com.android.settings.inputmethod; import android.content.Context; +import android.hardware.input.InputManager; import android.util.FeatureFlagUtils; -import com.android.settings.core.BasePreferenceController; +import androidx.preference.Preference; -public class TrackpadSettingsController extends BasePreferenceController { +import com.android.settings.core.BasePreferenceController; +import com.android.settings.core.PreferenceControllerMixin; +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 TrackpadSettingsController extends BasePreferenceController + implements PreferenceControllerMixin, LifecycleObserver, OnStart, OnStop, + InputManager.InputDeviceListener { + + private final InputManager mIm; + + private Preference mPreference; public TrackpadSettingsController(Context context, String key) { super(context, key); + mIm = context.getSystemService(InputManager.class); + } + + @Override + public void onInputDeviceAdded(int deviceId) { + updateEntry(); + } + + @Override + public void onInputDeviceRemoved(int deviceId) { + updateEntry(); + } + + @Override + public void onInputDeviceChanged(int deviceId) { + updateEntry(); + } + + @Override + public void onStart() { + mIm.registerInputDeviceListener(this, null); + } + + @Override + public void onStop() { + mIm.unregisterInputDeviceListener(this); + } + + @Override + public void updateState(Preference preference) { + mPreference = preference; + updateEntry(); + } + + private void updateEntry() { + if (mPreference == null) { + return; + } + mPreference.setVisible(isAvailable()); } @Override public int getAvailabilityStatus() { - // TODO: Need to detect if trackpad is connected with device. boolean isFeatureOn = FeatureFlagUtils .isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_TRACKPAD); - return isFeatureOn ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; + boolean isTouchpad = NewKeyboardSettingsUtils.isTouchpad(); + return (isFeatureOn && isTouchpad) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } }