diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java index 9fc0c786ef424..9662be3bbe195 100644 --- a/core/java/android/hardware/input/InputManager.java +++ b/core/java/android/hardware/input/InputManager.java @@ -44,8 +44,6 @@ import android.os.Handler; import android.os.IBinder; import android.os.IVibratorStateListener; import android.os.InputEventInjectionSync; -import android.os.Looper; -import android.os.Message; import android.os.Process; import android.os.RemoteException; import android.os.SystemClock; @@ -68,7 +66,6 @@ import android.view.inputmethod.InputMethodSubtype; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.os.SomeArgs; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -108,12 +105,6 @@ public final class InputManager { @Nullable private Boolean mIsStylusPointerIconEnabled = null; - // Guarded by mTabletModeLock - private final Object mTabletModeLock = new Object(); - @SuppressWarnings({"FieldCanBeLocal", "UnusedDeclaration"}) - private TabletModeChangedListener mTabletModeChangedListener; - private ArrayList mOnTabletModeChangedListeners; - private final Object mBatteryListenersLock = new Object(); // Maps a deviceId whose battery is currently being monitored to an entry containing the // registered listeners for that device. @@ -521,20 +512,7 @@ public final class InputManager { */ public void registerOnTabletModeChangedListener( OnTabletModeChangedListener listener, Handler handler) { - if (listener == null) { - 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); - } - } + mGlobal.registerOnTabletModeChangedListener(listener, handler); } /** @@ -544,37 +522,7 @@ public final class InputManager { * @hide */ public void unregisterOnTabletModeChangedListener(OnTabletModeChangedListener listener) { - if (listener == null) { - 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; + mGlobal.unregisterOnTabletModeChangedListener(listener); } /** @@ -1449,21 +1397,6 @@ public final class InputManager { 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. * @@ -1997,43 +1930,6 @@ public final class InputManager { 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 // state via the InputDevice#getBatteryState() and InputDeviceBatteryListener interfaces. private static final class LocalBatteryState extends BatteryState { diff --git a/core/java/android/hardware/input/InputManagerGlobal.java b/core/java/android/hardware/input/InputManagerGlobal.java index 8d6404206faf5..28699e0af18f6 100644 --- a/core/java/android/hardware/input/InputManagerGlobal.java +++ b/core/java/android/hardware/input/InputManagerGlobal.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; import android.hardware.input.InputManager.InputDeviceListener; +import android.hardware.input.InputManager.OnTabletModeChangedListener; import android.os.Handler; import android.os.IBinder; import android.os.Looper; @@ -32,6 +33,7 @@ import android.view.Display; import android.view.InputDevice; import com.android.internal.annotations.GuardedBy; +import com.android.internal.os.SomeArgs; import java.util.ArrayList; import java.util.Objects; @@ -48,10 +50,6 @@ public final class InputManagerGlobal { // (requires restart) 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") @Nullable private SparseArray mInputDevices; @GuardedBy("mInputDeviceListeners") @@ -59,6 +57,10 @@ public final class InputManagerGlobal { @GuardedBy("mInputDeviceListeners") private final ArrayList mInputDeviceListeners = new ArrayList<>(); + @GuardedBy("mOnTabletModeChangedListeners") + private final ArrayList mOnTabletModeChangedListeners = + new ArrayList<>(); + private static InputManagerGlobal sInstance; private final IInputManager mIm; @@ -186,7 +188,8 @@ public final class InputManagerGlobal { Log.d(TAG, "Device removed: " + deviceId); } 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); } mInputDevices.setValueAt(index, null); - sendMessageToInputDeviceListenersLocked(MSG_DEVICE_CHANGED, deviceId); + sendMessageToInputDeviceListenersLocked( + InputDeviceListenerDelegate.MSG_DEVICE_CHANGED, deviceId); } } } else { @@ -210,7 +214,8 @@ public final class InputManagerGlobal { Log.d(TAG, "Device added: " + deviceId); } 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 { 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) { super(handler != null ? handler.getLooper() : Looper.myLooper()); @@ -261,7 +269,7 @@ public final class InputManagerGlobal { /** * @see InputManager#registerInputDeviceListener */ - public void registerInputDeviceListener(InputDeviceListener listener, Handler handler) { + void registerInputDeviceListener(InputDeviceListener listener, Handler handler) { if (listener == null) { throw new IllegalArgumentException("listener must not be null"); } @@ -278,7 +286,7 @@ public final class InputManagerGlobal { /** * @see InputManager#unregisterInputDeviceListener */ - public void unregisterInputDeviceListener(InputDeviceListener listener) { + void unregisterInputDeviceListener(InputDeviceListener listener) { if (listener == null) { throw new IllegalArgumentException("listener must not be null"); } @@ -385,4 +393,114 @@ public final class InputManagerGlobal { 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; + } }