Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cfd02f52 authored by danielwbhuang's avatar danielwbhuang
Browse files

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
parent ecd670ba
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -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<HardKeyboardDeviceInfo> keyboards =
                PhysicalKeyboardFragment.getHardKeyboards(mContext);
        if (keyboards.isEmpty()) {
+11 −10
Original line number Diff line number Diff line
@@ -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<InputMethodInfo> 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<String> getSuitableImeLabels(Context context, InputMethodManager imm, int userId) {
+3 −1
Original line number Diff line number Diff line
@@ -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() {
+55 −3
Original line number Diff line number Diff line
@@ -17,21 +17,73 @@
package com.android.settings.inputmethod;

import android.content.Context;
import android.hardware.input.InputManager;
import android.util.FeatureFlagUtils;

import androidx.preference.Preference;

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;

public class TrackpadSettingsController extends BasePreferenceController {
    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;
    }
}