Merge "Move TabletModeChangedListener to InputManagerGlobal"

This commit is contained in:
Asmita Poddar
2023-03-09 09:41:36 +00:00
committed by Android (Google) Code Review
2 changed files with 129 additions and 115 deletions

View File

@@ -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<OnTabletModeChangedListenerDelegate> 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 {

View File

@@ -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<InputDevice> mInputDevices;
@GuardedBy("mInputDeviceListeners")
@@ -59,6 +57,10 @@ public final class InputManagerGlobal {
@GuardedBy("mInputDeviceListeners")
private final ArrayList<InputDeviceListenerDelegate> mInputDeviceListeners = new ArrayList<>();
@GuardedBy("mOnTabletModeChangedListeners")
private final ArrayList<OnTabletModeChangedListenerDelegate> 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;
}
}