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
This commit is contained in:
danielwbhuang
2023-02-04 23:16:16 +08:00
parent ecd670bac4
commit cfd02f52a6
4 changed files with 80 additions and 22 deletions

View File

@@ -27,13 +27,13 @@ import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.inputmethod.PhysicalKeyboardFragment.HardKeyboardDeviceInfo; import com.android.settings.inputmethod.PhysicalKeyboardFragment.HardKeyboardDeviceInfo;
import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnStart;
import com.android.settingslib.core.lifecycle.events.OnResume; import com.android.settingslib.core.lifecycle.events.OnStop;
import java.util.List; import java.util.List;
public class KeyboardPreferenceController extends BasePreferenceController public class KeyboardPreferenceController extends BasePreferenceController
implements PreferenceControllerMixin, LifecycleObserver, OnResume, OnPause, implements PreferenceControllerMixin, LifecycleObserver, OnStart, OnStop,
InputManager.InputDeviceListener { InputManager.InputDeviceListener {
private final InputManager mIm; private final InputManager mIm;
@@ -61,13 +61,13 @@ public class KeyboardPreferenceController extends BasePreferenceController
} }
@Override @Override
public void onPause() { public void onStart() {
mIm.unregisterInputDeviceListener(this); mIm.registerInputDeviceListener(this, null);
} }
@Override @Override
public void onResume() { public void onStop() {
mIm.registerInputDeviceListener(this, null); mIm.unregisterInputDeviceListener(this);
} }
@Override @Override
@@ -84,6 +84,9 @@ public class KeyboardPreferenceController extends BasePreferenceController
} }
private void updateSummary() { private void updateSummary() {
if (mPreference == null) {
return;
}
final List<HardKeyboardDeviceInfo> keyboards = final List<HardKeyboardDeviceInfo> keyboards =
PhysicalKeyboardFragment.getHardKeyboards(mContext); PhysicalKeyboardFragment.getHardKeyboards(mContext);
if (keyboards.isEmpty()) { if (keyboards.isEmpty()) {

View File

@@ -17,7 +17,7 @@
package com.android.settings.inputmethod; package com.android.settings.inputmethod;
import android.content.Context; import android.content.Context;
import android.provider.Settings; import android.view.InputDevice;
import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.view.inputmethod.InputMethodSubtype; 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_INFO = "input_method_info";
static final String EXTRA_INPUT_METHOD_SUBTYPE = "input_method_subtype"; static final String EXTRA_INPUT_METHOD_SUBTYPE = "input_method_subtype";
static InputMethodInfo getActiveIme(Context context, InputMethodManager imm) { static boolean isTouchpad() {
InputMethodInfo activeIme = null; for (int deviceId : InputDevice.getDeviceIds()) {
List<InputMethodInfo> infoList = imm.getEnabledInputMethodList(); final InputDevice device = InputDevice.getDevice(deviceId);
String imeId = Settings.Secure.getStringForUser(context.getContentResolver(), if (device == null) {
Settings.Secure.DEFAULT_INPUT_METHOD, context.getUserId()); continue;
for (InputMethodInfo method : infoList) { }
if (method.getId().equals(imeId)) { if ((device.getSources() & InputDevice.SOURCE_TOUCHPAD)
activeIme = method; == InputDevice.SOURCE_TOUCHPAD) {
return true;
} }
} }
return activeIme; return false;
} }
static List<String> getSuitableImeLabels(Context context, InputMethodManager imm, int userId) { static List<String> getSuitableImeLabels(Context context, InputMethodManager imm, int userId) {

View File

@@ -63,7 +63,9 @@ public class TouchGesturesButtonPreferenceController extends BasePreferenceContr
@Override @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus() {
return AVAILABLE; boolean touchGestureDeveloperMode = FeatureFlagUtils
.isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_TRACKPAD_GESTURE);
return touchGestureDeveloperMode ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
} }
private void showTouchpadGestureEducation() { private void showTouchpadGestureEducation() {

View File

@@ -17,21 +17,73 @@
package com.android.settings.inputmethod; package com.android.settings.inputmethod;
import android.content.Context; import android.content.Context;
import android.hardware.input.InputManager;
import android.util.FeatureFlagUtils; 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) { public TrackpadSettingsController(Context context, String key) {
super(context, 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 @Override
public int getAvailabilityStatus() { public int getAvailabilityStatus() {
// TODO: Need to detect if trackpad is connected with device.
boolean isFeatureOn = FeatureFlagUtils boolean isFeatureOn = FeatureFlagUtils
.isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_TRACKPAD); .isEnabled(mContext, FeatureFlagUtils.SETTINGS_NEW_KEYBOARD_TRACKPAD);
return isFeatureOn ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; boolean isTouchpad = NewKeyboardSettingsUtils.isTouchpad();
return (isFeatureOn && isTouchpad) ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
} }
} }