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

Unverified Commit 1fecb4c6 authored by Danesh M's avatar Danesh M Committed by Michael Bestas
Browse files

Add high touch sensitivity and hovering to InputService



Co-authored-by: default avatarOliver Scott <olivercscott@gmail.com>
Change-Id: I5a6af73129acefa6530ceb3f73cc4cd83a19a676
parent 7f81aae9
Loading
Loading
Loading
Loading
+92 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ import android.app.ActivityManagerInternal;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
@@ -85,6 +86,7 @@ import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.graphics.Region;
import android.hardware.display.DisplayManagerInternal;
import android.hardware.input.InputManager;
@@ -196,6 +198,9 @@ import com.android.server.statusbar.StatusBarManagerInternal;
import com.android.server.utils.PriorityDump;
import com.android.server.wm.WindowManagerInternal;

import lineageos.hardware.LineageHardwareManager;
import lineageos.providers.LineageSettings;

import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
@@ -205,6 +210,7 @@ import java.lang.annotation.Target;
import java.security.InvalidParameterException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
@@ -424,6 +430,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
    @SharedByAllUsersField
    private final UserDataRepository mUserDataRepository;

    @MultiUserUnawareField
    final SettingsObserver mSettingsObserver;
    final WindowManagerInternal mWindowManagerInternal;
    private final ActivityManagerInternal mActivityManagerInternal;
    final PackageManagerInternal mPackageManagerInternal;
@@ -471,6 +479,55 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
    @SharedByAllUsersField
    private IntArray mStylusIds;

    private LineageHardwareManager mLineageHardware;

    class SettingsObserver extends ContentObserver {
        /**
         * <em>This constructor must be called within the lock.</em>
         */
        SettingsObserver(Handler handler) {
            super(handler);
        }

        void registerContentObserverForAllUsers() {
            ContentResolver resolver = mContext.getContentResolver();
            if (mLineageHardware.isSupported(
                    LineageHardwareManager.FEATURE_HIGH_TOUCH_SENSITIVITY)) {
                resolver.registerContentObserverAsUser(LineageSettings.System.getUriFor(
                        LineageSettings.System.HIGH_TOUCH_SENSITIVITY_ENABLE),
                        false, this, UserHandle.ALL);
            }
            if (mLineageHardware.isSupported(LineageHardwareManager.FEATURE_TOUCH_HOVERING)) {
                resolver.registerContentObserverAsUser(LineageSettings.Secure.getUriFor(
                        LineageSettings.Secure.FEATURE_TOUCH_HOVERING),
                        false, this, UserHandle.ALL);
            }
        }

        @Override
        public void onChange(boolean selfChange, @NonNull Collection<Uri> uris, int flags,
                @UserIdInt int userId) {
            uris.forEach(uri -> onChangeInternal(uri, userId));
        }

        private void onChangeInternal(@NonNull Uri uri, @UserIdInt int userId) {
            final Uri touchSensitivityUri = LineageSettings.System.getUriFor(
                    LineageSettings.System.HIGH_TOUCH_SENSITIVITY_ENABLE);
            final Uri touchHoveringUri = LineageSettings.Secure.getUriFor(
                    LineageSettings.Secure.FEATURE_TOUCH_HOVERING);
            synchronized (ImfLock.class) {
                if (!mConcurrentMultiUserModeEnabled && mCurrentImeUserId != userId) {
                    return;
                }
                if (touchSensitivityUri.equals(uri)) {
                    updateTouchSensitivity();
                } else if (touchHoveringUri.equals(uri)) {
                    updateTouchHovering();
                }
            }
        }
    }

    private final ImeTracing.ServiceDumper mDumper = new ImeTracing.ServiceDumper() {
        /**
         * {@inheritDoc}
@@ -1259,6 +1316,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            mIoHandler = ioHandler;
            SystemLocaleWrapper.onStart(context, this::onActionLocaleChanged, mIoHandler);
            mImeTrackerService = new ImeTrackerService(mHandler);
            // Note: SettingsObserver doesn't register observers in its constructor.
            mSettingsObserver = new SettingsObserver(mHandler);
            mWindowManagerInternal = LocalServices.getService(WindowManagerInternal.class);
            mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class);
            mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
@@ -1430,6 +1489,9 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                    newSettings.getEnabledInputMethodList());
        }

        updateTouchSensitivity();
        updateTouchHovering();

        ProtoLog.v(IMMS_DEBUG, "Switching user stage 3/3. newUserId=%s selectedIme=%s", newUserId,
                newSettings.getSelectedInputMethod());

@@ -1484,6 +1546,13 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
            if (!mSystemReady) {
                mSystemReady = true;
                final int currentImeUserId = mCurrentImeUserId;

                // Must happen before registerContentObserverLocked
                mLineageHardware = LineageHardwareManager.getInstance(mContext);

                updateTouchSensitivity();
                updateTouchHovering();

                mStatusBarManagerInternal =
                        LocalServices.getService(StatusBarManagerInternal.class);
                hideStatusBarIconLocked(currentImeUserId);
@@ -1500,6 +1569,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
                }

                mMyPackageMonitor.register(mContext, UserHandle.ALL, mIoHandler);
                mSettingsObserver.registerContentObserverForAllUsers();
                SecureSettingsChangeCallback.register(mHandler, mContext.getContentResolver(),
                        new String[] {
                                Settings.Secure.ACCESSIBILITY_SOFT_KEYBOARD_MODE,
@@ -3008,6 +3078,28 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl.
        sendOnNavButtonFlagsChangedLocked(userData);
    }

    private void updateTouchSensitivity() {
        if (!mLineageHardware.isSupported(LineageHardwareManager.FEATURE_HIGH_TOUCH_SENSITIVITY)) {
            return;
        }
        // If user is a profile, use preference of its parent profile.
        final int profileParentUserId = mUserManagerInternal.getProfileParentId(mCurrentImeUserId);
        final boolean enabled = LineageSettings.System.getIntForUser(mContext.getContentResolver(),
                LineageSettings.System.HIGH_TOUCH_SENSITIVITY_ENABLE, 0, profileParentUserId) == 1;
        mLineageHardware.set(LineageHardwareManager.FEATURE_HIGH_TOUCH_SENSITIVITY, enabled);
    }

    private void updateTouchHovering() {
        if (!mLineageHardware.isSupported(LineageHardwareManager.FEATURE_TOUCH_HOVERING)) {
            return;
        }
        // If user is a profile, use preference of its parent profile.
        final int profileParentUserId = mUserManagerInternal.getProfileParentId(mCurrentImeUserId);
        final boolean enabled = LineageSettings.Secure.getIntForUser(mContext.getContentResolver(),
                LineageSettings.Secure.FEATURE_TOUCH_HOVERING, 0, profileParentUserId) == 1;
        mLineageHardware.set(LineageHardwareManager.FEATURE_TOUCH_HOVERING, enabled);
    }

    @GuardedBy("ImfLock.class")
    private void notifyInputMethodSubtypeChangedLocked(@UserIdInt int userId,
            @NonNull InputMethodInfo imi, @Nullable InputMethodSubtype subtype) {