Clean up warnings and fix improper locking in InputManagerService.

Fix up a bunch of warnings from the IDE and errorprone within
InputManagerService. As part of this, fix a number of sensor-related
methods that were holding the wrong lock when accessing
mSensorEventListeners.

Bug: 217923092
Test: errorprone build
Change-Id: I4befdd6682d03406f05b10697a2cda14ac490931
This commit is contained in:
Michael Wright
2022-02-04 23:32:33 +00:00
parent 0f654a9fe2
commit 4edacf6de1

View File

@@ -41,7 +41,6 @@ import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
import android.database.ContentObserver;
import android.graphics.PointF;
import android.graphics.Rect;
import android.hardware.display.DisplayManager;
import android.hardware.display.DisplayViewport;
import android.hardware.input.IInputDevicesChangedListener;
@@ -198,8 +197,9 @@ public class InputManagerService extends IInputManager.Stub
private final Object mTabletModeLock = new Object();
// List of currently registered tablet mode changed listeners by process id
@GuardedBy("mTabletModeLock")
private final SparseArray<TabletModeChangedListenerRecord> mTabletModeChangedListeners =
new SparseArray<>(); // guarded by mTabletModeLock
new SparseArray<>();
private final List<TabletModeChangedListenerRecord> mTempTabletModeChangedListenersToNotify =
new ArrayList<>();
@@ -217,40 +217,39 @@ public class InputManagerService extends IInputManager.Stub
private final PersistentDataStore mDataStore = new PersistentDataStore();
// List of currently registered input devices changed listeners by process id.
private Object mInputDevicesLock = new Object();
private final Object mInputDevicesLock = new Object();
@GuardedBy("mInputDevicesLock")
private boolean mInputDevicesChangedPending; // guarded by mInputDevicesLock
private boolean mInputDevicesChangedPending;
@GuardedBy("mInputDevicesLock")
private InputDevice[] mInputDevices = new InputDevice[0];
@GuardedBy("mInputDevicesLock")
private final SparseArray<InputDevicesChangedListenerRecord> mInputDevicesChangedListeners =
new SparseArray<InputDevicesChangedListenerRecord>(); // guarded by mInputDevicesLock
new SparseArray<>();
private final ArrayList<InputDevicesChangedListenerRecord>
mTempInputDevicesChangedListenersToNotify =
new ArrayList<InputDevicesChangedListenerRecord>(); // handler thread only
private final ArrayList<InputDevice>
mTempFullKeyboards = new ArrayList<InputDevice>(); // handler thread only
mTempInputDevicesChangedListenersToNotify = new ArrayList<>(); // handler thread only
private final ArrayList<InputDevice> mTempFullKeyboards =
new ArrayList<>(); // handler thread only
private boolean mKeyboardLayoutNotificationShown;
private Toast mSwitchedKeyboardLayoutToast;
// State for vibrator tokens.
private Object mVibratorLock = new Object();
private Map<IBinder, VibratorToken> mVibratorTokens = new ArrayMap<IBinder, VibratorToken>();
private final Object mVibratorLock = new Object();
private final Map<IBinder, VibratorToken> mVibratorTokens = new ArrayMap<>();
private int mNextVibratorTokenValue;
// List of currently registered vibrator state changed listeners by device id.
@GuardedBy("mVibratorLock")
private final SparseArray<RemoteCallbackList<IVibratorStateListener>> mVibratorStateListeners =
new SparseArray<RemoteCallbackList<IVibratorStateListener>>();
new SparseArray<>();
// List of vibrator states by device id.
@GuardedBy("mVibratorLock")
private final SparseBooleanArray mIsVibrating = new SparseBooleanArray();
private Object mLightLock = new Object();
private final Object mLightLock = new Object();
// State for light tokens. A light token marks a lights manager session, it is generated
// by light session open() and deleted in session close().
// When lights session requests light states, the token will be used to find the light session.
@GuardedBy("mLightLock")
private final ArrayMap<IBinder, LightSession> mLightSessions =
new ArrayMap<IBinder, LightSession>();
private final ArrayMap<IBinder, LightSession> mLightSessions = new ArrayMap<>();
// State for lid switch
// Lock for the lid switch state. Held when triggering callbacks to guarantee lid switch events
@@ -259,19 +258,21 @@ public class InputManagerService extends IInputManager.Stub
// events that occur at the same time are delivered after the callback has returned.
private final Object mLidSwitchLock = new Object();
@GuardedBy("mLidSwitchLock")
private List<LidSwitchCallback> mLidSwitchCallbacks = new ArrayList<>();
private final List<LidSwitchCallback> mLidSwitchCallbacks = new ArrayList<>();
// State for the currently installed input filter.
final Object mInputFilterLock = new Object();
IInputFilter mInputFilter; // guarded by mInputFilterLock
InputFilterHost mInputFilterHost; // guarded by mInputFilterLock
@GuardedBy("mInputFilterLock")
IInputFilter mInputFilter;
@GuardedBy("mInputFilterLock")
InputFilterHost mInputFilterHost;
// The associations of input devices to displays by port. Maps from input device port (String)
// to display id (int). Currently only accessed by InputReader.
private final Map<String, Integer> mStaticAssociations;
private final Object mAssociationsLock = new Object();
@GuardedBy("mAssociationLock")
private final Map<String, Integer> mRuntimeAssociations = new ArrayMap<String, Integer>();
private final Map<String, Integer> mRuntimeAssociations = new ArrayMap<>();
@GuardedBy("mAssociationLock")
private final Map<String, String> mUniqueIdAssociations = new ArrayMap<>();
private final Object mPointerDisplayIdLock = new Object();
@@ -582,32 +583,6 @@ public class InputManagerService extends IInputManager.Stub
nativeReloadDeviceAliases(mPtr);
}
/** Rotates CCW by `delta` 90-degree increments. */
private static void rotateBounds(Rect inOutBounds, int parentW, int parentH, int delta) {
int rdelta = ((delta % 4) + 4) % 4;
int origLeft = inOutBounds.left;
switch (rdelta) {
case 0:
return;
case 1:
inOutBounds.left = inOutBounds.top;
inOutBounds.top = parentW - inOutBounds.right;
inOutBounds.right = inOutBounds.bottom;
inOutBounds.bottom = parentW - origLeft;
return;
case 2:
inOutBounds.left = parentW - inOutBounds.right;
inOutBounds.right = parentW - origLeft;
return;
case 3:
inOutBounds.left = parentH - inOutBounds.bottom;
inOutBounds.bottom = inOutBounds.right;
inOutBounds.right = parentH - inOutBounds.top;
inOutBounds.top = origLeft;
return;
}
}
private void setDisplayViewportsInternal(List<DisplayViewport> viewports) {
final DisplayViewport[] vArray = new DisplayViewport[viewports.size()];
for (int i = viewports.size() - 1; i >= 0; --i) {
@@ -934,9 +909,7 @@ public class InputManagerService extends IInputManager.Stub
@Override // Binder call
public InputDevice getInputDevice(int deviceId) {
synchronized (mInputDevicesLock) {
final int count = mInputDevices.length;
for (int i = 0; i < count; i++) {
final InputDevice inputDevice = mInputDevices[i];
for (final InputDevice inputDevice : mInputDevices) {
if (inputDevice.getId() == deviceId) {
return inputDevice;
}
@@ -1119,23 +1092,19 @@ public class InputManagerService extends IInputManager.Stub
return null;
}
final List<KeyboardLayout> layouts = new ArrayList<>();
visitAllKeyboardLayouts(new KeyboardLayoutVisitor() {
@Override
public void visitKeyboardLayout(Resources resources,
int keyboardLayoutResId, KeyboardLayout layout) {
// Only select a default when we know the layout is appropriate. For now, this
// means its a custom layout for a specific keyboard.
if (layout.getVendorId() != d.getVendorId()
|| layout.getProductId() != d.getProductId()) {
return;
}
final LocaleList locales = layout.getLocales();
final int numLocales = locales.size();
for (int localeIndex = 0; localeIndex < numLocales; ++localeIndex) {
if (isCompatibleLocale(systemLocale, locales.get(localeIndex))) {
layouts.add(layout);
break;
}
visitAllKeyboardLayouts((resources, keyboardLayoutResId, layout) -> {
// Only select a default when we know the layout is appropriate. For now, this
// means it's a custom layout for a specific keyboard.
if (layout.getVendorId() != d.getVendorId()
|| layout.getProductId() != d.getProductId()) {
return;
}
final LocaleList locales = layout.getLocales();
final int numLocales = locales.size();
for (int localeIndex = 0; localeIndex < numLocales; ++localeIndex) {
if (isCompatibleLocale(systemLocale, locales.get(localeIndex))) {
layouts.add(layout);
break;
}
}
});
@@ -1335,13 +1304,8 @@ public class InputManagerService extends IInputManager.Stub
private void updateKeyboardLayouts() {
// Scan all input devices state for keyboard layouts that have been uninstalled.
final HashSet<String> availableKeyboardLayouts = new HashSet<String>();
visitAllKeyboardLayouts(new KeyboardLayoutVisitor() {
@Override
public void visitKeyboardLayout(Resources resources,
int keyboardLayoutResId, KeyboardLayout layout) {
availableKeyboardLayouts.add(layout.getDescriptor());
}
});
visitAllKeyboardLayouts((resources, keyboardLayoutResId, layout) ->
availableKeyboardLayouts.add(layout.getDescriptor()));
synchronized (mDataStore) {
try {
mDataStore.removeUninstalledKeyboardLayouts(availableKeyboardLayouts);
@@ -1368,14 +1332,8 @@ public class InputManagerService extends IInputManager.Stub
@Override // Binder call
public KeyboardLayout[] getKeyboardLayouts() {
final ArrayList<KeyboardLayout> list = new ArrayList<KeyboardLayout>();
visitAllKeyboardLayouts(new KeyboardLayoutVisitor() {
@Override
public void visitKeyboardLayout(Resources resources,
int keyboardLayoutResId, KeyboardLayout layout) {
list.add(layout);
}
});
final ArrayList<KeyboardLayout> list = new ArrayList<>();
visitAllKeyboardLayouts((resources, keyboardLayoutResId, layout) -> list.add(layout));
return list.toArray(new KeyboardLayout[list.size()]);
}
@@ -1383,10 +1341,10 @@ public class InputManagerService extends IInputManager.Stub
public KeyboardLayout[] getKeyboardLayoutsForInputDevice(
final InputDeviceIdentifier identifier) {
final String[] enabledLayoutDescriptors =
getEnabledKeyboardLayoutsForInputDevice(identifier);
getEnabledKeyboardLayoutsForInputDevice(identifier);
final ArrayList<KeyboardLayout> enabledLayouts =
new ArrayList<KeyboardLayout>(enabledLayoutDescriptors.length);
final ArrayList<KeyboardLayout> potentialLayouts = new ArrayList<KeyboardLayout>();
new ArrayList<>(enabledLayoutDescriptors.length);
final ArrayList<KeyboardLayout> potentialLayouts = new ArrayList<>();
visitAllKeyboardLayouts(new KeyboardLayoutVisitor() {
boolean mHasSeenDeviceSpecificLayout;
@@ -1434,13 +1392,8 @@ public class InputManagerService extends IInputManager.Stub
"keyboardLayoutDescriptor must not be null");
final KeyboardLayout[] result = new KeyboardLayout[1];
visitKeyboardLayout(keyboardLayoutDescriptor, new KeyboardLayoutVisitor() {
@Override
public void visitKeyboardLayout(Resources resources,
int keyboardLayoutResId, KeyboardLayout layout) {
result[0] = layout;
}
});
visitKeyboardLayout(keyboardLayoutDescriptor,
(resources, keyboardLayoutResId, layout) -> result[0] = layout);
if (result[0] == null) {
Slog.w(TAG, "Could not get keyboard layout with descriptor '"
+ keyboardLayoutDescriptor + "'.");
@@ -1472,7 +1425,7 @@ public class InputManagerService extends IInputManager.Stub
| PackageManager.MATCH_DIRECT_BOOT_AWARE
| PackageManager.MATCH_DIRECT_BOOT_UNAWARE);
visitKeyboardLayoutsInPackage(pm, receiver, d.keyboardLayoutName, 0, visitor);
} catch (NameNotFoundException ex) {
} catch (NameNotFoundException ignored) {
}
}
}
@@ -1502,11 +1455,10 @@ public class InputManagerService extends IInputManager.Stub
try {
Resources resources = pm.getResourcesForApplication(receiver.applicationInfo);
XmlResourceParser parser = resources.getXml(configResId);
try {
try (XmlResourceParser parser = resources.getXml(configResId)) {
XmlUtils.beginDocument(parser, "keyboard-layouts");
for (;;) {
while (true) {
XmlUtils.nextElement(parser);
String element = parser.getName();
if (element == null) {
@@ -1514,22 +1466,22 @@ public class InputManagerService extends IInputManager.Stub
}
if (element.equals("keyboard-layout")) {
TypedArray a = resources.obtainAttributes(
parser, com.android.internal.R.styleable.KeyboardLayout);
parser, R.styleable.KeyboardLayout);
try {
String name = a.getString(
com.android.internal.R.styleable.KeyboardLayout_name);
R.styleable.KeyboardLayout_name);
String label = a.getString(
com.android.internal.R.styleable.KeyboardLayout_label);
R.styleable.KeyboardLayout_label);
int keyboardLayoutResId = a.getResourceId(
com.android.internal.R.styleable.KeyboardLayout_keyboardLayout,
R.styleable.KeyboardLayout_keyboardLayout,
0);
String languageTags = a.getString(
com.android.internal.R.styleable.KeyboardLayout_locale);
R.styleable.KeyboardLayout_locale);
LocaleList locales = getLocalesFromLanguageTags(languageTags);
int vid = a.getInt(
com.android.internal.R.styleable.KeyboardLayout_vendorId, -1);
R.styleable.KeyboardLayout_vendorId, -1);
int pid = a.getInt(
com.android.internal.R.styleable.KeyboardLayout_productId, -1);
R.styleable.KeyboardLayout_productId, -1);
if (name == null || label == null || keyboardLayoutResId == 0) {
Slog.w(TAG, "Missing required 'name', 'label' or 'keyboardLayout' "
@@ -1556,8 +1508,6 @@ public class InputManagerService extends IInputManager.Stub
+ receiver.packageName + "/" + receiver.name);
}
}
} finally {
parser.close();
}
} catch (Exception ex) {
Slog.w(TAG, "Could not parse keyboard layout resource from receiver "
@@ -1584,10 +1534,7 @@ public class InputManagerService extends IInputManager.Stub
if (identifier.getVendorId() == 0 && identifier.getProductId() == 0) {
return identifier.getDescriptor();
}
StringBuilder bob = new StringBuilder();
bob.append("vendor:").append(identifier.getVendorId());
bob.append(",product:").append(identifier.getProductId());
return bob.toString();
return "vendor:" + identifier.getVendorId() + ",product:" + identifier.getProductId();
}
@Override // Binder call
@@ -1595,7 +1542,7 @@ public class InputManagerService extends IInputManager.Stub
String key = getLayoutDescriptor(identifier);
synchronized (mDataStore) {
String layout = null;
String layout;
// try loading it using the layout descriptor if we have it
layout = mDataStore.getCurrentKeyboardLayout(key);
if (layout == null && !key.equals(identifier.getDescriptor())) {
@@ -1870,7 +1817,7 @@ public class InputManagerService extends IInputManager.Stub
try {
speed = Settings.System.getIntForUser(mContext.getContentResolver(),
Settings.System.POINTER_SPEED, UserHandle.USER_CURRENT);
} catch (SettingNotFoundException snfe) {
} catch (SettingNotFoundException ignored) {
}
return speed;
}
@@ -2134,7 +2081,7 @@ public class InputManagerService extends IInputManager.Stub
SparseArray<VibrationEffect> effects = stereo.getEffects();
long[] pattern = new long[0];
int repeat = Integer.MIN_VALUE;
SparseArray<int[]> amplitudes = new SparseArray<int[]>(effects.size());
SparseArray<int[]> amplitudes = new SparseArray<>(effects.size());
for (int i = 0; i < effects.size(); i++) {
VibrationInfo info = new VibrationInfo(effects.valueAt(i));
// Pattern of all effects should be same
@@ -2184,6 +2131,7 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback.
@SuppressWarnings("unused")
private void notifyVibratorState(int deviceId, boolean isOn) {
if (DEBUG) {
Slog.d(TAG, "notifyVibratorState: deviceId=" + deviceId + " isOn=" + isOn);
@@ -2225,7 +2173,7 @@ public class InputManagerService extends IInputManager.Stub
@Override // Binder call
public boolean registerVibratorStateListener(int deviceId, IVibratorStateListener listener) {
Preconditions.checkNotNull(listener, "listener must not be null");
Objects.requireNonNull(listener, "listener must not be null");
RemoteCallbackList<IVibratorStateListener> listeners;
synchronized (mVibratorLock) {
@@ -2383,7 +2331,7 @@ public class InputManagerService extends IInputManager.Stub
}
Objects.requireNonNull(listener, "listener must not be null");
synchronized (mInputDevicesLock) {
synchronized (mSensorEventLock) {
int callingPid = Binder.getCallingPid();
if (mSensorEventListeners.get(callingPid) != null) {
Slog.e(TAG, "The calling process " + callingPid + " has already "
@@ -2415,7 +2363,7 @@ public class InputManagerService extends IInputManager.Stub
Objects.requireNonNull(listener, "listener must not be null");
synchronized (mInputDevicesLock) {
synchronized (mSensorEventLock) {
int callingPid = Binder.getCallingPid();
if (mSensorEventListeners.get(callingPid) != null) {
SensorEventListenerRecord record = mSensorEventListeners.get(callingPid);
@@ -2429,7 +2377,7 @@ public class InputManagerService extends IInputManager.Stub
@Override // Binder call
public boolean flushSensor(int deviceId, int sensorType) {
synchronized (mInputDevicesLock) {
synchronized (mSensorEventLock) {
int callingPid = Binder.getCallingPid();
SensorEventListenerRecord listener = mSensorEventListeners.get(callingPid);
if (listener != null) {
@@ -2497,7 +2445,7 @@ public class InputManagerService extends IInputManager.Stub
* Set specified light state with for a specific input device.
*/
private void setLightStateInternal(int deviceId, Light light, LightState lightState) {
Preconditions.checkNotNull(light, "light does not exist");
Objects.requireNonNull(light, "light does not exist");
if (DEBUG) {
Slog.d(TAG, "setLightStateInternal device " + deviceId + " light " + light
+ "lightState " + lightState);
@@ -2560,7 +2508,7 @@ public class InputManagerService extends IInputManager.Stub
@Override
public void openLightSession(int deviceId, String opPkg, IBinder token) {
Preconditions.checkNotNull(token);
Objects.requireNonNull(token);
synchronized (mLightLock) {
Preconditions.checkState(mLightSessions.get(token) == null, "already registered");
LightSession lightSession = new LightSession(deviceId, opPkg, token);
@@ -2579,7 +2527,7 @@ public class InputManagerService extends IInputManager.Stub
@Override
public void closeLightSession(int deviceId, IBinder token) {
Preconditions.checkNotNull(token);
Objects.requireNonNull(token);
synchronized (mLightLock) {
LightSession lightSession = mLightSessions.get(token);
Preconditions.checkState(lightSession != null, "not registered");
@@ -2689,11 +2637,13 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback.
@SuppressWarnings("unused")
private void notifyConfigurationChanged(long whenNanos) {
mWindowManagerCallbacks.notifyConfigurationChanged();
}
// Native callback.
@SuppressWarnings("unused")
private void notifyInputDevicesChanged(InputDevice[] inputDevices) {
synchronized (mInputDevicesLock) {
if (!mInputDevicesChangedPending) {
@@ -2707,6 +2657,7 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback.
@SuppressWarnings("unused")
private void notifySwitch(long whenNanos, int switchValues, int switchMask) {
if (DEBUG) {
Slog.d(TAG, "notifySwitch: values=" + Integer.toHexString(switchValues)
@@ -2739,7 +2690,7 @@ public class InputManagerService extends IInputManager.Stub
SomeArgs args = SomeArgs.obtain();
args.argi1 = (int) (whenNanos & 0xFFFFFFFF);
args.argi2 = (int) (whenNanos >> 32);
args.arg1 = Boolean.valueOf((switchValues & SW_TABLET_MODE_BIT) != 0);
args.arg1 = (switchValues & SW_TABLET_MODE_BIT) != 0;
mHandler.obtainMessage(MSG_DELIVER_TABLET_MODE_CHANGED,
args).sendToTarget();
}
@@ -2752,6 +2703,7 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback.
@SuppressWarnings("unused")
private void notifyInputChannelBroken(IBinder token) {
synchronized (mInputMonitors) {
if (mInputMonitors.containsKey(token)) {
@@ -2762,16 +2714,19 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback
@SuppressWarnings("unused")
private void notifyFocusChanged(IBinder oldToken, IBinder newToken) {
mWindowManagerCallbacks.notifyFocusChanged(oldToken, newToken);
}
// Native callback
@SuppressWarnings("unused")
private void notifyDropWindow(IBinder token, float x, float y) {
mWindowManagerCallbacks.notifyDropWindow(token, x, y);
}
// Native callback
@SuppressWarnings("unused")
private void notifyUntrustedTouch(String packageName) {
// TODO(b/169067926): Remove toast after gathering feedback on dogfood.
if (!UNTRUSTED_TOUCHES_TOAST || ArrayUtils.contains(
@@ -2787,11 +2742,13 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback.
@SuppressWarnings("unused")
private void notifyNoFocusedWindowAnr(InputApplicationHandle inputApplicationHandle) {
mWindowManagerCallbacks.notifyNoFocusedWindowAnr(inputApplicationHandle);
}
// Native callback
@SuppressWarnings("unused")
private void notifyWindowUnresponsive(IBinder token, String reason) {
int gestureMonitorPid = -1;
synchronized (mInputMonitors) {
@@ -2808,11 +2765,13 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback
@SuppressWarnings("unused")
private void notifyMonitorUnresponsive(int pid, String reason) {
mWindowManagerCallbacks.notifyGestureMonitorUnresponsive(pid, reason);
}
// Native callback
@SuppressWarnings("unused")
private void notifyWindowResponsive(IBinder token) {
int gestureMonitorPid = -1;
synchronized (mInputMonitors) {
@@ -2829,11 +2788,13 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback
@SuppressWarnings("unused")
private void notifyMonitorResponsive(int pid) {
mWindowManagerCallbacks.notifyGestureMonitorResponsive(pid);
}
// Native callback.
@SuppressWarnings("unused")
private void notifySensorEvent(int deviceId, int sensorType, int accuracy, long timestamp,
float[] values) {
if (DEBUG) {
@@ -2857,6 +2818,7 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback.
@SuppressWarnings("unused")
private void notifySensorAccuracy(int deviceId, int sensorType, int accuracy) {
mSensorAccuracyListenersToNotify.clear();
final int numListeners;
@@ -2874,6 +2836,7 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback.
@SuppressWarnings("unused")
final boolean filterInputEvent(InputEvent event, int policyFlags) {
synchronized (mInputFilterLock) {
if (mInputFilter != null) {
@@ -2890,11 +2853,13 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback.
@SuppressWarnings("unused")
private int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
return mWindowManagerCallbacks.interceptKeyBeforeQueueing(event, policyFlags);
}
// Native callback.
@SuppressWarnings("unused")
private int interceptMotionBeforeQueueingNonInteractive(int displayId,
long whenNanos, int policyFlags) {
return mWindowManagerCallbacks.interceptMotionBeforeQueueingNonInteractive(
@@ -2902,33 +2867,39 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback.
@SuppressWarnings("unused")
private long interceptKeyBeforeDispatching(IBinder focus, KeyEvent event, int policyFlags) {
return mWindowManagerCallbacks.interceptKeyBeforeDispatching(focus, event, policyFlags);
}
// Native callback.
@SuppressWarnings("unused")
private KeyEvent dispatchUnhandledKey(IBinder focus, KeyEvent event, int policyFlags) {
return mWindowManagerCallbacks.dispatchUnhandledKey(focus, event, policyFlags);
}
// Native callback.
@SuppressWarnings("unused")
private boolean checkInjectEventsPermission(int injectorPid, int injectorUid) {
return mContext.checkPermission(android.Manifest.permission.INJECT_EVENTS,
injectorPid, injectorUid) == PackageManager.PERMISSION_GRANTED;
}
// Native callback.
@SuppressWarnings("unused")
private void onPointerDownOutsideFocus(IBinder touchedToken) {
mWindowManagerCallbacks.onPointerDownOutsideFocus(touchedToken);
}
// Native callback.
@SuppressWarnings("unused")
private int getVirtualKeyQuietTimeMillis() {
return mContext.getResources().getInteger(
com.android.internal.R.integer.config_virtualKeyQuietTimeMillis);
}
// Native callback.
@SuppressWarnings("unused")
private static String[] getExcludedDeviceNames() {
List<String> names = new ArrayList<>();
// Read partner-provided list of excluded input devices
@@ -2984,6 +2955,7 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback
@SuppressWarnings("unused")
private String[] getInputPortAssociations() {
final Map<String, Integer> associations = new HashMap<>(mStaticAssociations);
@@ -2996,6 +2968,7 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback
@SuppressWarnings("unused")
private String[] getInputUniqueIdAssociations() {
final Map<String, String> associations;
synchronized (mAssociationsLock) {
@@ -3016,46 +2989,55 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback.
@SuppressWarnings("unused")
private int getKeyRepeatTimeout() {
return ViewConfiguration.getKeyRepeatTimeout();
}
// Native callback.
@SuppressWarnings("unused")
private int getKeyRepeatDelay() {
return ViewConfiguration.getKeyRepeatDelay();
}
// Native callback.
@SuppressWarnings("unused")
private int getHoverTapTimeout() {
return ViewConfiguration.getHoverTapTimeout();
}
// Native callback.
@SuppressWarnings("unused")
private int getHoverTapSlop() {
return ViewConfiguration.getHoverTapSlop();
}
// Native callback.
@SuppressWarnings("unused")
private int getDoubleTapTimeout() {
return ViewConfiguration.getDoubleTapTimeout();
}
// Native callback.
@SuppressWarnings("unused")
private int getLongPressTimeout() {
return ViewConfiguration.getLongPressTimeout();
}
// Native callback.
@SuppressWarnings("unused")
private int getPointerLayer() {
return mWindowManagerCallbacks.getPointerLayer();
}
// Native callback.
@SuppressWarnings("unused")
private PointerIcon getPointerIcon(int displayId) {
return PointerIcon.getDefaultIcon(getContextForPointerIcon(displayId));
}
// Native callback.
@SuppressWarnings("unused")
private long getParentSurfaceForPointers(int displayId) {
final SurfaceControl sc = mWindowManagerCallbacks.getParentSurfaceForPointers(displayId);
if (sc == null) {
@@ -3101,6 +3083,7 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback.
@SuppressWarnings("unused")
private int getPointerDisplayId() {
synchronized (mPointerDisplayIdLock) {
// Prefer the override to all other displays.
@@ -3112,6 +3095,7 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback.
@SuppressWarnings("unused")
private String[] getKeyboardLayoutOverlay(InputDeviceIdentifier identifier) {
if (!mSystemReady) {
return null;
@@ -3123,19 +3107,15 @@ public class InputManagerService extends IInputManager.Stub
}
final String[] result = new String[2];
visitKeyboardLayout(keyboardLayoutDescriptor, new KeyboardLayoutVisitor() {
@Override
public void visitKeyboardLayout(Resources resources,
int keyboardLayoutResId, KeyboardLayout layout) {
try (final InputStreamReader stream = new InputStreamReader(
resources.openRawResource(keyboardLayoutResId))) {
result[0] = layout.getDescriptor();
result[1] = Streams.readFully(stream);
} catch (IOException ex) {
} catch (NotFoundException ex) {
}
}
});
visitKeyboardLayout(keyboardLayoutDescriptor,
(resources, keyboardLayoutResId, layout) -> {
try (InputStreamReader stream = new InputStreamReader(
resources.openRawResource(keyboardLayoutResId))) {
result[0] = layout.getDescriptor();
result[1] = Streams.readFully(stream);
} catch (IOException | NotFoundException ignored) {
}
});
if (result[0] == null) {
Slog.w(TAG, "Could not get keyboard layout with descriptor '"
+ keyboardLayoutDescriptor + "'.");
@@ -3145,6 +3125,7 @@ public class InputManagerService extends IInputManager.Stub
}
// Native callback.
@SuppressWarnings("unused")
private String getDeviceAlias(String uniqueId) {
if (BluetoothAdapter.checkBluetoothAddress(uniqueId)) {
// TODO(BT) mBluetoothService.getRemoteAlias(uniqueId)
@@ -3294,8 +3275,18 @@ public class InputManagerService extends IInputManager.Stub
* Callback interface implemented by WiredAccessoryObserver.
*/
public interface WiredAccessoryCallbacks {
public void notifyWiredAccessoryChanged(long whenNanos, int switchValues, int switchMask);
public void systemReady();
/**
* Notifies WiredAccessoryObserver that input state for wired accessories has changed
* @param whenNanos When the wired accessories changed
* @param switchValues The state of the switches
* @param switchMask The mask of switches that changed
*/
void notifyWiredAccessoryChanged(long whenNanos, int switchValues, int switchMask);
/**
* Notifies WiredAccessoryObserver that the system is now ready.
*/
void systemReady();
}
/**
@@ -3326,7 +3317,7 @@ public class InputManagerService extends IInputManager.Stub
break;
case MSG_DELIVER_TABLET_MODE_CHANGED:
SomeArgs args = (SomeArgs) msg.obj;
long whenNanos = (args.argi1 & 0xFFFFFFFFl) | ((long) args.argi2 << 32);
long whenNanos = (args.argi1 & 0xFFFFFFFFL) | ((long) args.argi2 << 32);
boolean inTabletMode = (boolean) args.arg1;
deliverTabletModeChanged(whenNanos, inTabletMode);
break;
@@ -3338,8 +3329,10 @@ public class InputManagerService extends IInputManager.Stub
* Hosting interface for input filters to call back into the input manager.
*/
private final class InputFilterHost extends IInputFilterHost.Stub {
@GuardedBy("mInputFilterLock")
private boolean mDisconnected;
@GuardedBy("mInputFilterLock")
public void disconnectLocked() {
mDisconnected = true;
}