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

Commit 9d177c71 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Move TabletModeChangedListener to InputManagerGlobal" into udc-dev

parents af4f6869 3dbb290e
Loading
Loading
Loading
Loading
+2 −106
Original line number Original line Diff line number Diff line
@@ -44,8 +44,6 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder;
import android.os.IVibratorStateListener;
import android.os.IVibratorStateListener;
import android.os.InputEventInjectionSync;
import android.os.InputEventInjectionSync;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.os.Process;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.SystemClock;
@@ -68,7 +66,6 @@ import android.view.inputmethod.InputMethodSubtype;


import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.os.SomeArgs;


import java.lang.annotation.Retention;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.RetentionPolicy;
@@ -108,12 +105,6 @@ public final class InputManager {
    @Nullable
    @Nullable
    private Boolean mIsStylusPointerIconEnabled = null;
    private Boolean mIsStylusPointerIconEnabled = null;


    // Guarded by mTabletModeLock
    private final Object mTabletModeLock = new Object();
    @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"})
    private TabletModeChangedListener mTabletModeChangedListener;
    private ArrayList<OnTabletModeChangedListenerDelegate> mOnTabletModeChangedListeners;

    private final Object mBatteryListenersLock = new Object();
    private final Object mBatteryListenersLock = new Object();
    // Maps a deviceId whose battery is currently being monitored to an entry containing the
    // Maps a deviceId whose battery is currently being monitored to an entry containing the
    // registered listeners for that device.
    // registered listeners for that device.
@@ -521,20 +512,7 @@ public final class InputManager {
     */
     */
    public void registerOnTabletModeChangedListener(
    public void registerOnTabletModeChangedListener(
            OnTabletModeChangedListener listener, Handler handler) {
            OnTabletModeChangedListener listener, Handler handler) {
        if (listener == null) {
        mGlobal.registerOnTabletModeChangedListener(listener, handler);
            throw new IllegalArgumentException("listener must not be null");
        }
        synchronized (mTabletModeLock) {
            if (mOnTabletModeChangedListeners == null) {
                initializeTabletModeListenerLocked();
            }
            int idx = findOnTabletModeChangedListenerLocked(listener);
            if (idx < 0) {
                OnTabletModeChangedListenerDelegate d =
                    new OnTabletModeChangedListenerDelegate(listener, handler);
                mOnTabletModeChangedListeners.add(d);
            }
        }
    }
    }


    /**
    /**
@@ -544,37 +522,7 @@ public final class InputManager {
     * @hide
     * @hide
     */
     */
    public void unregisterOnTabletModeChangedListener(OnTabletModeChangedListener listener) {
    public void unregisterOnTabletModeChangedListener(OnTabletModeChangedListener listener) {
        if (listener == null) {
        mGlobal.unregisterOnTabletModeChangedListener(listener);
            throw new IllegalArgumentException("listener must not be null");
        }
        synchronized (mTabletModeLock) {
            int idx = findOnTabletModeChangedListenerLocked(listener);
            if (idx >= 0) {
                OnTabletModeChangedListenerDelegate d = mOnTabletModeChangedListeners.remove(idx);
                d.removeCallbacksAndMessages(null);
            }
        }
    }

    private void initializeTabletModeListenerLocked() {
        final TabletModeChangedListener listener = new TabletModeChangedListener();
        try {
            mIm.registerTabletModeChangedListener(listener);
        } catch (RemoteException ex) {
            throw ex.rethrowFromSystemServer();
        }
        mTabletModeChangedListener = listener;
        mOnTabletModeChangedListeners = new ArrayList<>();
    }

    private int findOnTabletModeChangedListenerLocked(OnTabletModeChangedListener listener) {
        final int N = mOnTabletModeChangedListeners.size();
        for (int i = 0; i < N; i++) {
            if (mOnTabletModeChangedListeners.get(i).mListener == listener) {
                return i;
            }
        }
        return -1;
    }
    }


    /**
    /**
@@ -1449,21 +1397,6 @@ public final class InputManager {
        return mGlobal.getHostUsiVersion(display);
        return mGlobal.getHostUsiVersion(display);
    }
    }


    private void onTabletModeChanged(long whenNanos, boolean inTabletMode) {
        if (DEBUG) {
            Log.d(TAG, "Received tablet mode changed: "
                    + "whenNanos=" + whenNanos + ", inTabletMode=" + inTabletMode);
        }
        synchronized (mTabletModeLock) {
            final int numListeners = mOnTabletModeChangedListeners.size();
            for (int i = 0; i < numListeners; i++) {
                OnTabletModeChangedListenerDelegate listener =
                        mOnTabletModeChangedListeners.get(i);
                listener.sendTabletModeChanged(whenNanos, inTabletMode);
            }
        }
    }

    /**
    /**
     * Returns the Bluetooth address of this input device, if known.
     * Returns the Bluetooth address of this input device, if known.
     *
     *
@@ -1997,43 +1930,6 @@ public final class InputManager {
                int deviceId, @NonNull KeyboardBacklightState state, boolean isTriggeredByKeyPress);
                int deviceId, @NonNull KeyboardBacklightState state, boolean isTriggeredByKeyPress);
    }
    }


    private final class TabletModeChangedListener extends ITabletModeChangedListener.Stub {
        @Override
        public void onTabletModeChanged(long whenNanos, boolean inTabletMode) {
            InputManager.this.onTabletModeChanged(whenNanos, inTabletMode);
        }
    }

    private static final class OnTabletModeChangedListenerDelegate extends Handler {
        private static final int MSG_TABLET_MODE_CHANGED = 0;

        public final OnTabletModeChangedListener mListener;

        public OnTabletModeChangedListenerDelegate(
                OnTabletModeChangedListener listener, Handler handler) {
            super(handler != null ? handler.getLooper() : Looper.myLooper());
            mListener = listener;
        }

        public void sendTabletModeChanged(long whenNanos, boolean inTabletMode) {
            SomeArgs args = SomeArgs.obtain();
            args.argi1 = (int) whenNanos;
            args.argi2 = (int) (whenNanos >> 32);
            args.arg1 = inTabletMode;
            obtainMessage(MSG_TABLET_MODE_CHANGED, args).sendToTarget();
        }

        @Override
        public void handleMessage(Message msg) {
            if (msg.what == MSG_TABLET_MODE_CHANGED) {
                SomeArgs args = (SomeArgs) msg.obj;
                long whenNanos = (args.argi1 & 0xFFFFFFFFL) | ((long) args.argi2 << 32);
                boolean inTabletMode = (boolean) args.arg1;
                mListener.onTabletModeChanged(whenNanos, inTabletMode);
            }
        }
    }

    // Implementation of the android.hardware.BatteryState interface used to report the battery
    // Implementation of the android.hardware.BatteryState interface used to report the battery
    // state via the InputDevice#getBatteryState() and InputDeviceBatteryListener interfaces.
    // state via the InputDevice#getBatteryState() and InputDeviceBatteryListener interfaces.
    private static final class LocalBatteryState extends BatteryState {
    private static final class LocalBatteryState extends BatteryState {
+127 −9
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Nullable;
import android.content.Context;
import android.content.Context;
import android.hardware.input.InputManager.InputDeviceListener;
import android.hardware.input.InputManager.InputDeviceListener;
import android.hardware.input.InputManager.OnTabletModeChangedListener;
import android.os.Handler;
import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder;
import android.os.Looper;
import android.os.Looper;
@@ -32,6 +33,7 @@ import android.view.Display;
import android.view.InputDevice;
import android.view.InputDevice;


import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.os.SomeArgs;


import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Objects;
import java.util.Objects;
@@ -48,10 +50,6 @@ public final class InputManagerGlobal {
    // (requires restart)
    // (requires restart)
    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);


    private static final int MSG_DEVICE_ADDED = 1;
    private static final int MSG_DEVICE_REMOVED = 2;
    private static final int MSG_DEVICE_CHANGED = 3;

    @GuardedBy("mInputDeviceListeners")
    @GuardedBy("mInputDeviceListeners")
    @Nullable private SparseArray<InputDevice> mInputDevices;
    @Nullable private SparseArray<InputDevice> mInputDevices;
    @GuardedBy("mInputDeviceListeners")
    @GuardedBy("mInputDeviceListeners")
@@ -59,6 +57,10 @@ public final class InputManagerGlobal {
    @GuardedBy("mInputDeviceListeners")
    @GuardedBy("mInputDeviceListeners")
    private final ArrayList<InputDeviceListenerDelegate> mInputDeviceListeners = new ArrayList<>();
    private final ArrayList<InputDeviceListenerDelegate> mInputDeviceListeners = new ArrayList<>();


    @GuardedBy("mOnTabletModeChangedListeners")
    private final ArrayList<OnTabletModeChangedListenerDelegate> mOnTabletModeChangedListeners =
            new ArrayList<>();

    private static InputManagerGlobal sInstance;
    private static InputManagerGlobal sInstance;


    private final IInputManager mIm;
    private final IInputManager mIm;
@@ -186,7 +188,8 @@ public final class InputManagerGlobal {
                        Log.d(TAG, "Device removed: " + deviceId);
                        Log.d(TAG, "Device removed: " + deviceId);
                    }
                    }
                    mInputDevices.removeAt(i);
                    mInputDevices.removeAt(i);
                    sendMessageToInputDeviceListenersLocked(MSG_DEVICE_REMOVED, deviceId);
                    sendMessageToInputDeviceListenersLocked(
                            InputDeviceListenerDelegate.MSG_DEVICE_REMOVED, deviceId);
                }
                }
            }
            }


@@ -202,7 +205,8 @@ public final class InputManagerGlobal {
                                Log.d(TAG, "Device changed: " + deviceId);
                                Log.d(TAG, "Device changed: " + deviceId);
                            }
                            }
                            mInputDevices.setValueAt(index, null);
                            mInputDevices.setValueAt(index, null);
                            sendMessageToInputDeviceListenersLocked(MSG_DEVICE_CHANGED, deviceId);
                            sendMessageToInputDeviceListenersLocked(
                                    InputDeviceListenerDelegate.MSG_DEVICE_CHANGED, deviceId);
                        }
                        }
                    }
                    }
                } else {
                } else {
@@ -210,7 +214,8 @@ public final class InputManagerGlobal {
                        Log.d(TAG, "Device added: " + deviceId);
                        Log.d(TAG, "Device added: " + deviceId);
                    }
                    }
                    mInputDevices.put(deviceId, null);
                    mInputDevices.put(deviceId, null);
                    sendMessageToInputDeviceListenersLocked(MSG_DEVICE_ADDED, deviceId);
                    sendMessageToInputDeviceListenersLocked(
                            InputDeviceListenerDelegate.MSG_DEVICE_ADDED, deviceId);
                }
                }
            }
            }
        }
        }
@@ -218,6 +223,9 @@ public final class InputManagerGlobal {


    private static final class InputDeviceListenerDelegate extends Handler {
    private static final class InputDeviceListenerDelegate extends Handler {
        public final InputDeviceListener mListener;
        public final InputDeviceListener mListener;
        static final int MSG_DEVICE_ADDED = 1;
        static final int MSG_DEVICE_REMOVED = 2;
        static final int MSG_DEVICE_CHANGED = 3;


        InputDeviceListenerDelegate(InputDeviceListener listener, Handler handler) {
        InputDeviceListenerDelegate(InputDeviceListener listener, Handler handler) {
            super(handler != null ? handler.getLooper() : Looper.myLooper());
            super(handler != null ? handler.getLooper() : Looper.myLooper());
@@ -261,7 +269,7 @@ public final class InputManagerGlobal {
    /**
    /**
     * @see InputManager#registerInputDeviceListener
     * @see InputManager#registerInputDeviceListener
     */
     */
    public void registerInputDeviceListener(InputDeviceListener listener, Handler handler) {
    void registerInputDeviceListener(InputDeviceListener listener, Handler handler) {
        if (listener == null) {
        if (listener == null) {
            throw new IllegalArgumentException("listener must not be null");
            throw new IllegalArgumentException("listener must not be null");
        }
        }
@@ -278,7 +286,7 @@ public final class InputManagerGlobal {
    /**
    /**
     * @see InputManager#unregisterInputDeviceListener
     * @see InputManager#unregisterInputDeviceListener
     */
     */
    public void unregisterInputDeviceListener(InputDeviceListener listener) {
    void unregisterInputDeviceListener(InputDeviceListener listener) {
        if (listener == null) {
        if (listener == null) {
            throw new IllegalArgumentException("listener must not be null");
            throw new IllegalArgumentException("listener must not be null");
        }
        }
@@ -385,4 +393,114 @@ public final class InputManagerGlobal {
            throw e.rethrowFromSystemServer();
            throw e.rethrowFromSystemServer();
        }
        }
    }
    }

    private void onTabletModeChanged(long whenNanos, boolean inTabletMode) {
        if (DEBUG) {
            Log.d(TAG, "Received tablet mode changed: "
                    + "whenNanos=" + whenNanos + ", inTabletMode=" + inTabletMode);
        }
        synchronized (mOnTabletModeChangedListeners) {
            final int numListeners = mOnTabletModeChangedListeners.size();
            for (int i = 0; i < numListeners; i++) {
                OnTabletModeChangedListenerDelegate listener =
                        mOnTabletModeChangedListeners.get(i);
                listener.sendTabletModeChanged(whenNanos, inTabletMode);
            }
        }
    }

    private final class TabletModeChangedListener extends ITabletModeChangedListener.Stub {
        @Override
        public void onTabletModeChanged(long whenNanos, boolean inTabletMode) {
            InputManagerGlobal.this.onTabletModeChanged(whenNanos, inTabletMode);
        }
    }

    private static final class OnTabletModeChangedListenerDelegate extends Handler {
        private static final int MSG_TABLET_MODE_CHANGED = 0;

        public final OnTabletModeChangedListener mListener;

        OnTabletModeChangedListenerDelegate(
                OnTabletModeChangedListener listener, Handler handler) {
            super(handler != null ? handler.getLooper() : Looper.myLooper());
            mListener = listener;
        }

        public void sendTabletModeChanged(long whenNanos, boolean inTabletMode) {
            SomeArgs args = SomeArgs.obtain();
            args.argi1 = (int) whenNanos;
            args.argi2 = (int) (whenNanos >> 32);
            args.arg1 = inTabletMode;
            obtainMessage(MSG_TABLET_MODE_CHANGED, args).sendToTarget();
        }

        @Override
        public void handleMessage(Message msg) {
            if (msg.what == MSG_TABLET_MODE_CHANGED) {
                SomeArgs args = (SomeArgs) msg.obj;
                long whenNanos = (args.argi1 & 0xFFFFFFFFL) | ((long) args.argi2 << 32);
                boolean inTabletMode = (boolean) args.arg1;
                mListener.onTabletModeChanged(whenNanos, inTabletMode);
            }
        }
    }

    /**
     * @see InputManager#registerInputDeviceListener(InputDeviceListener, Handler)
     */
    void registerOnTabletModeChangedListener(
            OnTabletModeChangedListener listener, Handler handler) {
        if (listener == null) {
            throw new IllegalArgumentException("listener must not be null");
        }
        synchronized (mOnTabletModeChangedListeners) {
            if (mOnTabletModeChangedListeners == null) {
                initializeTabletModeListenerLocked();
            }
            int idx = findOnTabletModeChangedListenerLocked(listener);
            if (idx < 0) {
                OnTabletModeChangedListenerDelegate d =
                        new OnTabletModeChangedListenerDelegate(listener, handler);
                mOnTabletModeChangedListeners.add(d);
            }
        }
    }

    /**
     * @see InputManager#unregisterOnTabletModeChangedListener(OnTabletModeChangedListener)
     */
    void unregisterOnTabletModeChangedListener(OnTabletModeChangedListener listener) {
        if (listener == null) {
            throw new IllegalArgumentException("listener must not be null");
        }
        synchronized (mOnTabletModeChangedListeners) {
            int idx = findOnTabletModeChangedListenerLocked(listener);
            if (idx >= 0) {
                OnTabletModeChangedListenerDelegate d = mOnTabletModeChangedListeners.remove(idx);
                d.removeCallbacksAndMessages(null);
            }
        }
    }

    @GuardedBy("mOnTabletModeChangedListeners")
    private void initializeTabletModeListenerLocked() {
        final TabletModeChangedListener listener = new TabletModeChangedListener();
        try {
            mIm.registerTabletModeChangedListener(listener);
        } catch (RemoteException ex) {
            throw ex.rethrowFromSystemServer();
        }
    }

    @GuardedBy("mOnTabletModeChangedListeners")
    private int findOnTabletModeChangedListenerLocked(OnTabletModeChangedListener listener) {
        final int n = mOnTabletModeChangedListeners.size();
        for (int i = 0; i < n; i++) {
            if (mOnTabletModeChangedListeners.get(i).mListener == listener) {
                return i;
            }
        }
        return -1;
    }
}
}