summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Asmita Poddar <asmitapoddar@google.com> 2023-04-13 22:17:38 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-04-13 22:17:38 +0000
commitef0421cfeb1a98f011a0f0fa6f3644fd227b65d5 (patch)
tree7116117932640c79d36f750d937923c3d8caa09c
parente7ff09513b1d2925044b9fd4f442015a297aaef5 (diff)
parentfb12466e8120040b02bb9cc77b4e299fe550d8f6 (diff)
Merge "Remove InputManager#getInstance" into udc-dev
-rw-r--r--core/java/android/app/SystemServiceRegistry.java6
-rw-r--r--core/java/android/hardware/input/InputManager.java125
-rw-r--r--core/java/android/hardware/input/InputManagerGlobal.java80
-rw-r--r--core/java/android/view/VelocityTracker.java5
-rw-r--r--core/tests/coretests/src/android/hardware/input/InputDeviceBatteryListenerTest.kt14
-rw-r--r--core/tests/coretests/src/android/hardware/input/InputDeviceLightsManagerTest.java12
-rw-r--r--core/tests/coretests/src/android/hardware/input/InputDeviceSensorManagerTest.java10
-rw-r--r--core/tests/coretests/src/android/hardware/input/InputManagerTest.kt15
-rw-r--r--core/tests/coretests/src/android/hardware/input/KeyboardBacklightListenerTest.kt14
-rw-r--r--services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/companion/virtual/InputManagerMockHelper.java7
-rw-r--r--services/tests/servicestests/src/com/android/server/input/BatteryControllerTests.kt18
-rw-r--r--services/tests/servicestests/src/com/android/server/input/KeyRemapperTests.kt6
-rw-r--r--services/tests/servicestests/src/com/android/server/input/KeyboardBacklightControllerTests.kt6
-rw-r--r--services/tests/servicestests/src/com/android/server/input/KeyboardLayoutManagerTests.kt6
-rw-r--r--services/tests/servicestests/src/com/android/server/vibrator/InputDeviceDelegateTest.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java11
17 files changed, 178 insertions, 170 deletions
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index dbba0c6f5e50..4f5da99d539a 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -506,10 +506,10 @@ public final class SystemServiceRegistry {
// InputManager stores its own static instance for historical purposes.
registerService(Context.INPUT_SERVICE, InputManager.class,
- new ServiceFetcher<InputManager>() {
+ new CachedServiceFetcher<InputManager>() {
@Override
- public InputManager getService(ContextImpl ctx) {
- return InputManager.getInstance(ctx.getOuterContext());
+ public InputManager createService(ContextImpl ctx) {
+ return new InputManager(ctx.getOuterContext());
}});
registerService(Context.DISPLAY_SERVICE, DisplayManager.class,
diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java
index 9cacfff4b33a..2fec02f91e39 100644
--- a/core/java/android/hardware/input/InputManager.java
+++ b/core/java/android/hardware/input/InputManager.java
@@ -53,11 +53,8 @@ import android.view.WindowManager.LayoutParams;
import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodSubtype;
-import com.android.internal.annotations.VisibleForTesting;
-
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -73,20 +70,10 @@ public final class InputManager {
// To enable these logs, run: 'adb shell setprop log.tag.InputManager DEBUG' (requires restart)
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- private static InputManager sInstance;
-
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
private final IInputManager mIm;
/**
- * We hold a weak reference to the context to avoid leaking it indefinitely,
- * since we currently store the input manager instance as a static variable that
- * will outlive any context.
- */
- @Nullable
- private WeakReference<Context> mWeakContext;
-
- /**
* Whether a PointerIcon is shown for stylus pointers.
* Obtain using {@link #isStylusPointerIconEnabled()}.
*/
@@ -255,99 +242,43 @@ public final class InputManager {
*/
public static final int SWITCH_STATE_ON = 1;
- private static String sVelocityTrackerStrategy;
-
- private InputManagerGlobal mGlobal;
+ private final InputManagerGlobal mGlobal;
+ private final Context mContext;
- private InputManager() {
+ /** @hide */
+ public InputManager(Context context) {
mGlobal = InputManagerGlobal.getInstance();
mIm = mGlobal.getInputManagerService();
- try {
- sVelocityTrackerStrategy = mIm.getVelocityTrackerStrategy();
- } catch (RemoteException ex) {
- Log.w(TAG, "Could not get VelocityTracker strategy: " + ex);
- }
+ mContext = context;
}
/**
* Gets an instance of the input manager.
*
- * @return The input manager instance.
+ * Warning: The usage of this method is not supported!
*
- * @hide
- */
- @VisibleForTesting
- public static InputManager resetInstance(IInputManager inputManagerService) {
- synchronized (InputManager.class) {
- InputManagerGlobal.resetInstance(inputManagerService);
- sInstance = new InputManager();
- return sInstance;
- }
- }
-
- /**
- * Clear the instance of the input manager.
+ * @return The input manager instance.
+ * Use {@link Context#getSystemService(Class)}
+ * to obtain the InputManager instance.
*
- * @hide
- */
- @VisibleForTesting
- public static void clearInstance() {
- synchronized (InputManager.class) {
- InputManagerGlobal.clearInstance();
- sInstance = null;
- }
- }
-
- /**
- * Gets an instance of the input manager.
+ * TODO (b/277717573): Soft remove this API in version V.
+ * TODO (b/277039664): Migrate app usage off this API.
*
- * @return The input manager instance.
- * @deprecated Use {@link Context#getSystemService(Class)} or {@link #getInstance(Context)}
- * to obtain the InputManager instance.
* @hide
*/
@Deprecated
@UnsupportedAppUsage
public static InputManager getInstance() {
- return getInstance(ActivityThread.currentApplication());
+ return Objects.requireNonNull(ActivityThread.currentApplication())
+ .getSystemService(InputManager.class);
}
/**
- * Gets an instance of the input manager.
- *
- * @return The input manager instance.
- * @hide
- */
- public static InputManager getInstance(Context context) {
- synchronized (InputManager.class) {
- if (sInstance == null) {
- sInstance = new InputManager();
- }
- if (sInstance.mWeakContext == null || sInstance.mWeakContext.get() == null) {
- sInstance.mWeakContext = new WeakReference(context);
- }
- return sInstance;
- }
- }
-
- @NonNull
- private Context getContext() {
- WeakReference<Context> weakContext = Objects.requireNonNull(mWeakContext,
- "A context is required for InputManager. Get the InputManager instance using "
- + "Context#getSystemService before calling this method.");
- // If we get at this point, an app calling this function could potentially expect a
- // Context that has disappeared due to garbage collection. Holding a weak reference
- // is a temporary solution that should be resolved before the release of a
- // production version. This is being tracked in b/267758905
- return Objects.requireNonNull(weakContext.get(), "missing Context");
- }
-
- /**
- * Get the current VelocityTracker strategy. Only works when the system has fully booted up.
+ * Get the current VelocityTracker strategy.
* @hide
*/
public String getVelocityTrackerStrategy() {
- return sVelocityTrackerStrategy;
+ return mGlobal.getVelocityTrackerStrategy();
}
/**
@@ -584,11 +515,7 @@ public final class InputManager {
@NonNull
public KeyboardLayout[] getKeyboardLayoutsForInputDevice(
@NonNull InputDeviceIdentifier identifier) {
- try {
- return mIm.getKeyboardLayoutsForInputDevice(identifier);
- } catch (RemoteException ex) {
- throw ex.rethrowFromSystemServer();
- }
+ return mGlobal.getKeyboardLayoutsForInputDevice(identifier);
}
/**
@@ -647,19 +574,8 @@ public final class InputManager {
@RequiresPermission(Manifest.permission.SET_KEYBOARD_LAYOUT)
public void setCurrentKeyboardLayoutForInputDevice(@NonNull InputDeviceIdentifier identifier,
@NonNull String keyboardLayoutDescriptor) {
- if (identifier == null) {
- throw new IllegalArgumentException("identifier must not be null");
- }
- if (keyboardLayoutDescriptor == null) {
- throw new IllegalArgumentException("keyboardLayoutDescriptor must not be null");
- }
-
- try {
- mIm.setCurrentKeyboardLayoutForInputDevice(identifier,
- keyboardLayoutDescriptor);
- } catch (RemoteException ex) {
- throw ex.rethrowFromSystemServer();
- }
+ mGlobal.setCurrentKeyboardLayoutForInputDevice(identifier,
+ keyboardLayoutDescriptor);
}
/**
@@ -956,8 +872,7 @@ public final class InputManager {
*/
@FloatRange(from = 0, to = 1)
public float getMaximumObscuringOpacityForTouch() {
- Context context = ActivityThread.currentApplication();
- return InputSettings.getMaximumObscuringOpacityForTouch(context);
+ return InputSettings.getMaximumObscuringOpacityForTouch(mContext);
}
/**
@@ -1123,7 +1038,7 @@ public final class InputManager {
*/
public boolean isStylusPointerIconEnabled() {
if (mIsStylusPointerIconEnabled == null) {
- mIsStylusPointerIconEnabled = getContext().getResources()
+ mIsStylusPointerIconEnabled = mContext.getResources()
.getBoolean(com.android.internal.R.bool.config_enableStylusPointerIcon)
|| InputProperties.force_enable_stylus_pointer_icon().orElse(false);
}
diff --git a/core/java/android/hardware/input/InputManagerGlobal.java b/core/java/android/hardware/input/InputManagerGlobal.java
index 701980d5f6f3..5462171be7e1 100644
--- a/core/java/android/hardware/input/InputManagerGlobal.java
+++ b/core/java/android/hardware/input/InputManagerGlobal.java
@@ -102,17 +102,26 @@ public final class InputManagerGlobal {
private static InputManagerGlobal sInstance;
+ private final String mVelocityTrackerStrategy;
+
private final IInputManager mIm;
public InputManagerGlobal(IInputManager im) {
mIm = im;
+ String strategy = null;
+ try {
+ strategy = mIm.getVelocityTrackerStrategy();
+ } catch (RemoteException ex) {
+ Log.w(TAG, "Could not get VelocityTracker strategy: " + ex);
+ }
+ mVelocityTrackerStrategy = strategy;
}
/**
* Gets an instance of the input manager global singleton.
*
- * @return The display manager instance, may be null early in system startup
- * before the display manager has been fully initialized.
+ * @return The input manager instance, may be null early in system startup
+ * before the input manager has been fully initialized.
*/
public static InputManagerGlobal getInstance() {
synchronized (InputManagerGlobal.class) {
@@ -152,6 +161,14 @@ public final class InputManagerGlobal {
}
/**
+ * Get the current VelocityTracker strategy.
+ * Only works when the system has fully booted up.
+ */
+ public String getVelocityTrackerStrategy() {
+ return mVelocityTrackerStrategy;
+ }
+
+ /**
* @see InputManager#getInputDevice(int)
*/
@Nullable
@@ -309,9 +326,7 @@ public final class InputManagerGlobal {
* @see InputManager#registerInputDeviceListener
*/
public void registerInputDeviceListener(InputDeviceListener listener, Handler handler) {
- if (listener == null) {
- throw new IllegalArgumentException("listener must not be null");
- }
+ Objects.requireNonNull(listener, "listener must not be null");
synchronized (mInputDeviceListeners) {
populateInputDevicesLocked();
@@ -407,9 +422,7 @@ public final class InputManagerGlobal {
* @see InputManager#getInputDeviceByDescriptor
*/
InputDevice getInputDeviceByDescriptor(String descriptor) {
- if (descriptor == null) {
- throw new IllegalArgumentException("descriptor must not be null.");
- }
+ Objects.requireNonNull(descriptor, "descriptor must not be null.");
synchronized (mInputDeviceListeners) {
populateInputDevicesLocked();
@@ -526,9 +539,8 @@ public final class InputManagerGlobal {
*/
void registerOnTabletModeChangedListener(
OnTabletModeChangedListener listener, Handler handler) {
- if (listener == null) {
- throw new IllegalArgumentException("listener must not be null");
- }
+ Objects.requireNonNull(listener, "listener must not be null");
+
synchronized (mOnTabletModeChangedListeners) {
if (mOnTabletModeChangedListeners == null) {
initializeTabletModeListenerLocked();
@@ -546,9 +558,8 @@ public final class InputManagerGlobal {
* @see InputManager#unregisterOnTabletModeChangedListener(OnTabletModeChangedListener)
*/
void unregisterOnTabletModeChangedListener(OnTabletModeChangedListener listener) {
- if (listener == null) {
- throw new IllegalArgumentException("listener must not be null");
- }
+ Objects.requireNonNull(listener, "listener must not be null");
+
synchronized (mOnTabletModeChangedListeners) {
int idx = findOnTabletModeChangedListenerLocked(listener);
if (idx >= 0) {
@@ -603,7 +614,7 @@ public final class InputManagerGlobal {
/**
* @see InputManager#addInputDeviceBatteryListener(int, Executor, InputDeviceBatteryListener)
*/
- void addInputDeviceBatteryListener(int deviceId, @NonNull Executor executor,
+ public void addInputDeviceBatteryListener(int deviceId, @NonNull Executor executor,
@NonNull InputDeviceBatteryListener listener) {
Objects.requireNonNull(executor, "executor should not be null");
Objects.requireNonNull(listener, "listener should not be null");
@@ -714,7 +725,7 @@ public final class InputManagerGlobal {
}
/**
- * @see InputManager#getInputDeviceBatteryState(int, boolean)
+ * @see #getInputDeviceBatteryState(int, boolean)
*/
@NonNull
public BatteryState getInputDeviceBatteryState(int deviceId, boolean hasBattery) {
@@ -877,6 +888,38 @@ public final class InputManagerGlobal {
}
/**
+ * @see InputManager#getKeyboardLayoutsForInputDevice(InputDeviceIdentifier)
+ */
+ @NonNull
+ public KeyboardLayout[] getKeyboardLayoutsForInputDevice(
+ @NonNull InputDeviceIdentifier identifier) {
+ try {
+ return mIm.getKeyboardLayoutsForInputDevice(identifier);
+ } catch (RemoteException ex) {
+ throw ex.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * @see InputManager#setCurrentKeyboardLayoutForInputDevice
+ * (InputDeviceIdentifier, String)
+ */
+ @RequiresPermission(Manifest.permission.SET_KEYBOARD_LAYOUT)
+ public void setCurrentKeyboardLayoutForInputDevice(
+ @NonNull InputDeviceIdentifier identifier,
+ @NonNull String keyboardLayoutDescriptor) {
+ Objects.requireNonNull(identifier, "identifier must not be null");
+ Objects.requireNonNull(keyboardLayoutDescriptor,
+ "keyboardLayoutDescriptor must not be null");
+ try {
+ mIm.setCurrentKeyboardLayoutForInputDevice(identifier,
+ keyboardLayoutDescriptor);
+ } catch (RemoteException ex) {
+ throw ex.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* @see InputDevice#getSensorManager()
*/
@NonNull
@@ -1162,9 +1205,8 @@ public final class InputManagerGlobal {
*/
public boolean injectInputEvent(InputEvent event, int mode, int targetUid) {
- if (event == null) {
- throw new IllegalArgumentException("event must not be null");
- }
+ Objects.requireNonNull(event , "event must not be null");
+
if (mode != InputEventInjectionSync.NONE
&& mode != InputEventInjectionSync.WAIT_FOR_FINISHED
&& mode != InputEventInjectionSync.WAIT_FOR_RESULT) {
diff --git a/core/java/android/view/VelocityTracker.java b/core/java/android/view/VelocityTracker.java
index 4a7ed644f9e2..4464d1918565 100644
--- a/core/java/android/view/VelocityTracker.java
+++ b/core/java/android/view/VelocityTracker.java
@@ -18,7 +18,7 @@ package android.view;
import android.annotation.IntDef;
import android.compat.annotation.UnsupportedAppUsage;
-import android.hardware.input.InputManager;
+import android.hardware.input.InputManagerGlobal;
import android.util.ArrayMap;
import android.util.Pools.SynchronizedPool;
@@ -286,7 +286,8 @@ public final class VelocityTracker {
private VelocityTracker(@VelocityTrackerStrategy int strategy) {
// If user has not selected a specific strategy
if (strategy == VELOCITY_TRACKER_STRATEGY_DEFAULT) {
- final String strategyProperty = InputManager.getInstance().getVelocityTrackerStrategy();
+ final String strategyProperty = InputManagerGlobal.getInstance()
+ .getVelocityTrackerStrategy();
// Check if user specified strategy by overriding system property.
if (strategyProperty == null || strategyProperty.isEmpty()) {
mStrategy = strategy;
diff --git a/core/tests/coretests/src/android/hardware/input/InputDeviceBatteryListenerTest.kt b/core/tests/coretests/src/android/hardware/input/InputDeviceBatteryListenerTest.kt
index 4f27e9997cf6..fdcc7c993ddd 100644
--- a/core/tests/coretests/src/android/hardware/input/InputDeviceBatteryListenerTest.kt
+++ b/core/tests/coretests/src/android/hardware/input/InputDeviceBatteryListenerTest.kt
@@ -15,11 +15,14 @@
*/
package android.hardware.input
+import android.content.Context
+import android.content.ContextWrapper
import android.hardware.BatteryState
import android.os.Handler
import android.os.HandlerExecutor
import android.os.test.TestLooper
import android.platform.test.annotations.Presubmit
+import androidx.test.core.app.ApplicationProvider
import com.android.server.testutils.any
import java.util.concurrent.Executor
import kotlin.test.assertEquals
@@ -32,8 +35,10 @@ import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
+import org.mockito.Mockito
import org.mockito.Mockito.anyInt
import org.mockito.Mockito.doAnswer
+import org.mockito.Mockito.`when`
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoJUnitRunner
@@ -53,6 +58,7 @@ class InputDeviceBatteryListenerTest {
private var registeredListener: IInputDeviceBatteryListener? = null
private val monitoredDevices = mutableListOf<Int>()
private lateinit var executor: Executor
+ private lateinit var context: Context
private lateinit var inputManager: InputManager
@Mock
@@ -60,11 +66,15 @@ class InputDeviceBatteryListenerTest {
@Before
fun setUp() {
+ context = Mockito.spy(ContextWrapper(ApplicationProvider.getApplicationContext()))
testLooper = TestLooper()
executor = HandlerExecutor(Handler(testLooper.looper))
registeredListener = null
monitoredDevices.clear()
- inputManager = InputManager.resetInstance(iInputManagerMock)
+ InputManagerGlobal.resetInstance(iInputManagerMock)
+ inputManager = InputManager(context)
+ `when`(context.getSystemService(Mockito.eq(Context.INPUT_SERVICE)))
+ .thenReturn(inputManager)
// Handle battery listener registration.
doAnswer {
@@ -102,7 +112,7 @@ class InputDeviceBatteryListenerTest {
@After
fun tearDown() {
- InputManager.clearInstance()
+ InputManagerGlobal.clearInstance()
}
private fun notifyBatteryStateChanged(
diff --git a/core/tests/coretests/src/android/hardware/input/InputDeviceLightsManagerTest.java b/core/tests/coretests/src/android/hardware/input/InputDeviceLightsManagerTest.java
index bf65af32e0ac..1e505abbc169 100644
--- a/core/tests/coretests/src/android/hardware/input/InputDeviceLightsManagerTest.java
+++ b/core/tests/coretests/src/android/hardware/input/InputDeviceLightsManagerTest.java
@@ -28,9 +28,12 @@ import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.content.Context;
+import android.content.ContextWrapper;
import android.hardware.lights.Light;
import android.hardware.lights.LightState;
import android.hardware.lights.LightsManager;
@@ -40,6 +43,8 @@ import android.platform.test.annotations.Presubmit;
import android.util.ArrayMap;
import android.view.InputDevice;
+import androidx.test.InstrumentationRegistry;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
@@ -76,12 +81,15 @@ public class InputDeviceLightsManagerTest {
@Before
public void setUp() throws Exception {
+ final Context context = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
when(mIInputManagerMock.getInputDeviceIds()).thenReturn(new int[]{DEVICE_ID});
when(mIInputManagerMock.getInputDevice(eq(DEVICE_ID))).thenReturn(
createInputDevice(DEVICE_ID));
- mInputManager = InputManager.resetInstance(mIInputManagerMock);
+ InputManagerGlobal.resetInstance(mIInputManagerMock);
+ mInputManager = new InputManager(context);
+ when(context.getSystemService(eq(Context.INPUT_SERVICE))).thenReturn(mInputManager);
ArrayMap<Integer, LightState> lightStatesById = new ArrayMap<>();
doAnswer(invocation -> {
@@ -106,7 +114,7 @@ public class InputDeviceLightsManagerTest {
@After
public void tearDown() {
- InputManager.clearInstance();
+ InputManagerGlobal.clearInstance();
}
private InputDevice createInputDevice(int id) {
diff --git a/core/tests/coretests/src/android/hardware/input/InputDeviceSensorManagerTest.java b/core/tests/coretests/src/android/hardware/input/InputDeviceSensorManagerTest.java
index 6cf2314fea45..b33cfdda4a09 100644
--- a/core/tests/coretests/src/android/hardware/input/InputDeviceSensorManagerTest.java
+++ b/core/tests/coretests/src/android/hardware/input/InputDeviceSensorManagerTest.java
@@ -81,9 +81,9 @@ public class InputDeviceSensorManagerTest {
@Before
public void setUp() throws Exception {
final Context context = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
- InputManager inputManager = InputManager.resetInstance(mIInputManagerMock);
-
- when(context.getSystemService(eq(Context.INPUT_SERVICE))).thenReturn(inputManager);
+ InputManagerGlobal.resetInstance(mIInputManagerMock);
+ mInputManager = new InputManager(context);
+ when(context.getSystemService(eq(Context.INPUT_SERVICE))).thenReturn(mInputManager);
when(mIInputManagerMock.getInputDeviceIds()).thenReturn(new int[]{DEVICE_ID});
@@ -98,13 +98,11 @@ public class InputDeviceSensorManagerTest {
.thenReturn(true);
when(mIInputManagerMock.registerSensorListener(any())).thenReturn(true);
-
- mInputManager = context.getSystemService(InputManager.class);
}
@After
public void tearDown() {
- InputManager.clearInstance();
+ InputManagerGlobal.clearInstance();
}
private class InputTestSensorEventListener implements SensorEventListener {
diff --git a/core/tests/coretests/src/android/hardware/input/InputManagerTest.kt b/core/tests/coretests/src/android/hardware/input/InputManagerTest.kt
index ee7a6083a0e2..2ebe362b60f2 100644
--- a/core/tests/coretests/src/android/hardware/input/InputManagerTest.kt
+++ b/core/tests/coretests/src/android/hardware/input/InputManagerTest.kt
@@ -15,11 +15,14 @@
*/
package android.hardware.input
+import android.content.Context
+import android.content.ContextWrapper
import android.content.res.Resources
import android.platform.test.annotations.Presubmit
import android.view.Display
import android.view.DisplayInfo
import android.view.InputDevice
+import androidx.test.core.app.ApplicationProvider
import org.junit.After
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertEquals
@@ -28,6 +31,7 @@ import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
+import org.mockito.Mockito
import org.mockito.Mockito.eq
import org.mockito.Mockito.`when`
import org.mockito.junit.MockitoJUnit
@@ -52,17 +56,20 @@ class InputManagerTest {
@get:Rule
val rule = MockitoJUnit.rule()!!
- private lateinit var inputManager: InputManager
-
private lateinit var devicesChangedListener: IInputDevicesChangedListener
private val deviceGenerationMap = mutableMapOf<Int /*deviceId*/, Int /*generation*/>()
+ private lateinit var context: Context
+ private lateinit var inputManager: InputManager
@Mock
private lateinit var iInputManager: IInputManager
@Before
fun setUp() {
- inputManager = InputManager.resetInstance(iInputManager)
+ context = Mockito.spy(ContextWrapper(ApplicationProvider.getApplicationContext()))
+ InputManagerGlobal.resetInstance(iInputManager)
+ inputManager = InputManager(context)
+ `when`(context.getSystemService(eq(Context.INPUT_SERVICE))).thenReturn(inputManager)
`when`(iInputManager.inputDeviceIds).then {
deviceGenerationMap.keys.toIntArray()
}
@@ -70,7 +77,7 @@ class InputManagerTest {
@After
fun tearDown() {
- InputManager.clearInstance()
+ InputManagerGlobal.clearInstance()
}
private fun notifyDeviceChanged(
diff --git a/core/tests/coretests/src/android/hardware/input/KeyboardBacklightListenerTest.kt b/core/tests/coretests/src/android/hardware/input/KeyboardBacklightListenerTest.kt
index 91d19a19379d..ce816ab98b12 100644
--- a/core/tests/coretests/src/android/hardware/input/KeyboardBacklightListenerTest.kt
+++ b/core/tests/coretests/src/android/hardware/input/KeyboardBacklightListenerTest.kt
@@ -16,10 +16,13 @@
package android.hardware.input
+import android.content.Context
+import android.content.ContextWrapper
import android.os.Handler
import android.os.HandlerExecutor
import android.os.test.TestLooper
import android.platform.test.annotations.Presubmit
+import androidx.test.core.app.ApplicationProvider
import com.android.server.testutils.any
import org.junit.After
import org.junit.Before
@@ -27,7 +30,9 @@ import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
+import org.mockito.Mockito
import org.mockito.Mockito.doAnswer
+import org.mockito.Mockito.`when`
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoJUnitRunner
import java.util.concurrent.Executor
@@ -51,6 +56,7 @@ class KeyboardBacklightListenerTest {
private lateinit var testLooper: TestLooper
private var registeredListener: IKeyboardBacklightListener? = null
private lateinit var executor: Executor
+ private lateinit var context: Context
private lateinit var inputManager: InputManager
@Mock
@@ -58,10 +64,14 @@ class KeyboardBacklightListenerTest {
@Before
fun setUp() {
+ context = Mockito.spy(ContextWrapper(ApplicationProvider.getApplicationContext()))
+ InputManagerGlobal.resetInstance(iInputManagerMock)
testLooper = TestLooper()
executor = HandlerExecutor(Handler(testLooper.looper))
registeredListener = null
- inputManager = InputManager.resetInstance(iInputManagerMock)
+ inputManager = InputManager(context)
+ `when`(context.getSystemService(Mockito.eq(Context.INPUT_SERVICE)))
+ .thenReturn(inputManager)
// Handle keyboard backlight listener registration.
doAnswer {
@@ -89,7 +99,7 @@ class KeyboardBacklightListenerTest {
@After
fun tearDown() {
- InputManager.clearInstance()
+ InputManagerGlobal.clearInstance()
}
private fun notifyKeyboardBacklightChanged(
diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java
index 9829e57c6ef8..bb3a4766d249 100644
--- a/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java
+++ b/services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java
@@ -36,7 +36,7 @@ import android.content.Context;
import android.content.pm.PackageManagerInternal;
import android.hardware.display.DisplayManagerInternal;
import android.hardware.input.IInputManager;
-import android.hardware.input.InputManager;
+import android.hardware.input.InputManagerGlobal;
import android.os.Binder;
import android.os.IBinder;
import android.os.Process;
@@ -178,7 +178,7 @@ public class InputMethodManagerServiceTestBase {
// Injecting and mocked InputMethodBindingController and InputMethod.
mMockInputMethodInvoker = IInputMethodInvoker.create(mMockInputMethod);
- InputManager.resetInstance(mMockIInputManager);
+ InputManagerGlobal.resetInstance(mMockIInputManager);
synchronized (ImfLock.class) {
when(mMockInputMethodBindingController.getCurMethod())
.thenReturn(mMockInputMethodInvoker);
diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/InputManagerMockHelper.java b/services/tests/servicestests/src/com/android/server/companion/virtual/InputManagerMockHelper.java
index 3cc6b0103322..5cadc0a5d036 100644
--- a/services/tests/servicestests/src/com/android/server/companion/virtual/InputManagerMockHelper.java
+++ b/services/tests/servicestests/src/com/android/server/companion/virtual/InputManagerMockHelper.java
@@ -25,7 +25,7 @@ import static org.mockito.Mockito.when;
import android.hardware.input.IInputDevicesChangedListener;
import android.hardware.input.IInputManager;
-import android.hardware.input.InputManager;
+import android.hardware.input.InputManagerGlobal;
import android.os.RemoteException;
import android.testing.TestableLooper;
import android.view.InputDevice;
@@ -38,7 +38,8 @@ import java.util.Objects;
import java.util.stream.IntStream;
/**
- * A test utility class used to share the logic for setting up {@link InputManager}'s callback for
+ * A test utility class used to share the logic for setting up
+ * {@link android.hardware.input.InputManager}'s callback for
* when a virtual input device being added.
*/
class InputManagerMockHelper {
@@ -76,7 +77,7 @@ class InputManagerMockHelper {
// Set a new instance of InputManager for testing that uses the IInputManager mock as the
// interface to the server.
- InputManager.resetInstance(mIInputManagerMock);
+ InputManagerGlobal.resetInstance(mIInputManagerMock);
}
private long handleNativeOpenInputDevice(InvocationOnMock inv) {
diff --git a/services/tests/servicestests/src/com/android/server/input/BatteryControllerTests.kt b/services/tests/servicestests/src/com/android/server/input/BatteryControllerTests.kt
index e1a04ad5ab7d..416b1f49f5d9 100644
--- a/services/tests/servicestests/src/com/android/server/input/BatteryControllerTests.kt
+++ b/services/tests/servicestests/src/com/android/server/input/BatteryControllerTests.kt
@@ -19,8 +19,6 @@ package com.android.server.input
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothDevice
import android.bluetooth.BluetoothManager
-import android.content.Context
-import android.content.ContextWrapper
import android.hardware.BatteryState.STATUS_CHARGING
import android.hardware.BatteryState.STATUS_DISCHARGING
import android.hardware.BatteryState.STATUS_FULL
@@ -31,12 +29,14 @@ import android.hardware.input.IInputDeviceBatteryState
import android.hardware.input.IInputDevicesChangedListener
import android.hardware.input.IInputManager
import android.hardware.input.InputManager
+import android.hardware.input.InputManagerGlobal
import android.os.Binder
import android.os.IBinder
import android.os.test.TestLooper
import android.platform.test.annotations.Presubmit
+import android.testing.TestableContext
import android.view.InputDevice
-import androidx.test.InstrumentationRegistry
+import androidx.test.core.app.ApplicationProvider
import com.android.server.input.BatteryController.BluetoothBatteryManager
import com.android.server.input.BatteryController.BluetoothBatteryManager.BluetoothBatteryListener
import com.android.server.input.BatteryController.POLLING_PERIOD_MILLIS
@@ -66,7 +66,6 @@ import org.mockito.Mockito.clearInvocations
import org.mockito.Mockito.eq
import org.mockito.Mockito.mock
import org.mockito.Mockito.never
-import org.mockito.Mockito.spy
import org.mockito.Mockito.times
import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyNoMoreInteractions
@@ -197,17 +196,18 @@ class BatteryControllerTests {
private lateinit var bluetoothBatteryManager: BluetoothBatteryManager
private lateinit var batteryController: BatteryController
- private lateinit var context: Context
+ private lateinit var context: TestableContext
private lateinit var testLooper: TestLooper
private lateinit var devicesChangedListener: IInputDevicesChangedListener
private val deviceGenerationMap = mutableMapOf<Int /*deviceId*/, Int /*generation*/>()
@Before
fun setup() {
- context = spy(ContextWrapper(InstrumentationRegistry.getContext()))
+ context = TestableContext(ApplicationProvider.getApplicationContext())
testLooper = TestLooper()
- val inputManager = InputManager.resetInstance(iInputManager)
- `when`(context.getSystemService(eq(Context.INPUT_SERVICE))).thenReturn(inputManager)
+ InputManagerGlobal.resetInstance(iInputManager)
+ val inputManager = InputManager(context)
+ context.addMockSystemService(InputManager::class.java, inputManager)
`when`(iInputManager.inputDeviceIds).then {
deviceGenerationMap.keys.toIntArray()
}
@@ -256,7 +256,7 @@ class BatteryControllerTests {
@After
fun tearDown() {
- InputManager.clearInstance()
+ InputManagerGlobal.clearInstance()
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/input/KeyRemapperTests.kt b/services/tests/servicestests/src/com/android/server/input/KeyRemapperTests.kt
index 705a5da9d60f..c10f65195307 100644
--- a/services/tests/servicestests/src/com/android/server/input/KeyRemapperTests.kt
+++ b/services/tests/servicestests/src/com/android/server/input/KeyRemapperTests.kt
@@ -20,6 +20,7 @@ import android.content.Context
import android.content.ContextWrapper
import android.hardware.input.IInputManager
import android.hardware.input.InputManager
+import android.hardware.input.InputManagerGlobal
import android.os.test.TestLooper
import android.platform.test.annotations.Presubmit
import android.provider.Settings
@@ -102,7 +103,8 @@ class KeyRemapperTests {
dataStore,
testLooper.looper
)
- val inputManager = InputManager.resetInstance(iInputManager)
+ InputManagerGlobal.resetInstance(iInputManager)
+ val inputManager = InputManager(context)
Mockito.`when`(context.getSystemService(Mockito.eq(Context.INPUT_SERVICE)))
.thenReturn(inputManager)
Mockito.`when`(iInputManager.inputDeviceIds).thenReturn(intArrayOf(DEVICE_ID))
@@ -110,7 +112,7 @@ class KeyRemapperTests {
@After
fun tearDown() {
- InputManager.clearInstance()
+ InputManagerGlobal.clearInstance()
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/input/KeyboardBacklightControllerTests.kt b/services/tests/servicestests/src/com/android/server/input/KeyboardBacklightControllerTests.kt
index 00eb80d21f47..0f4d4e874a2e 100644
--- a/services/tests/servicestests/src/com/android/server/input/KeyboardBacklightControllerTests.kt
+++ b/services/tests/servicestests/src/com/android/server/input/KeyboardBacklightControllerTests.kt
@@ -23,6 +23,7 @@ import android.hardware.input.IInputManager
import android.hardware.input.IKeyboardBacklightListener
import android.hardware.input.IKeyboardBacklightState
import android.hardware.input.InputManager
+import android.hardware.input.InputManagerGlobal
import android.hardware.lights.Light
import android.os.UEventObserver
import android.os.test.TestLooper
@@ -116,7 +117,8 @@ class KeyboardBacklightControllerTests {
testLooper = TestLooper()
keyboardBacklightController =
KeyboardBacklightController(context, native, dataStore, testLooper.looper)
- val inputManager = InputManager.resetInstance(iInputManager)
+ InputManagerGlobal.resetInstance(iInputManager)
+ val inputManager = InputManager(context)
`when`(context.getSystemService(eq(Context.INPUT_SERVICE))).thenReturn(inputManager)
`when`(iInputManager.inputDeviceIds).thenReturn(intArrayOf(DEVICE_ID))
`when`(native.setLightColor(anyInt(), anyInt(), anyInt())).then {
@@ -131,7 +133,7 @@ class KeyboardBacklightControllerTests {
@After
fun tearDown() {
- InputManager.clearInstance()
+ InputManagerGlobal.clearInstance()
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/input/KeyboardLayoutManagerTests.kt b/services/tests/servicestests/src/com/android/server/input/KeyboardLayoutManagerTests.kt
index 7729fa29667b..ea3f3bca32ff 100644
--- a/services/tests/servicestests/src/com/android/server/input/KeyboardLayoutManagerTests.kt
+++ b/services/tests/servicestests/src/com/android/server/input/KeyboardLayoutManagerTests.kt
@@ -25,6 +25,7 @@ import android.content.pm.ResolveInfo
import android.content.pm.ServiceInfo
import android.hardware.input.IInputManager
import android.hardware.input.InputManager
+import android.hardware.input.InputManagerGlobal
import android.hardware.input.KeyboardLayout
import android.icu.util.ULocale
import android.os.Bundle
@@ -144,7 +145,8 @@ class KeyboardLayoutManagerTests {
}
private fun setupInputDevices() {
- val inputManager = InputManager.resetInstance(iInputManager)
+ InputManagerGlobal.resetInstance(iInputManager)
+ val inputManager = InputManager(context)
Mockito.`when`(context.getSystemService(Mockito.eq(Context.INPUT_SERVICE)))
.thenReturn(inputManager)
@@ -852,4 +854,4 @@ class KeyboardLayoutManagerTests {
)
}
}
-} \ No newline at end of file
+}
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/InputDeviceDelegateTest.java b/services/tests/servicestests/src/com/android/server/vibrator/InputDeviceDelegateTest.java
index 07b434538c7b..2ab79fcdeae7 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/InputDeviceDelegateTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/InputDeviceDelegateTest.java
@@ -77,16 +77,19 @@ public class InputDeviceDelegateTest {
private TestLooper mTestLooper;
private ContextWrapper mContextSpy;
+ private InputManager mInputManager;
private InputDeviceDelegate mInputDeviceDelegate;
private IInputDevicesChangedListener mIInputDevicesChangedListener;
@Before
public void setUp() throws Exception {
mTestLooper = new TestLooper();
- InputManager inputManager = InputManager.resetInstance(mIInputManagerMock);
+ InputManagerGlobal.resetInstance(mIInputManagerMock);
mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
- when(mContextSpy.getSystemService(eq(Context.INPUT_SERVICE))).thenReturn(inputManager);
+ mInputManager = new InputManager(mContextSpy);
+ when(mContextSpy.getSystemService(eq(Context.INPUT_SERVICE)))
+ .thenReturn(mInputManager);
doAnswer(invocation -> mIInputDevicesChangedListener = invocation.getArgument(0))
.when(mIInputManagerMock).registerInputDevicesChangedListener(any());
@@ -97,7 +100,7 @@ public class InputDeviceDelegateTest {
@After
public void tearDown() throws Exception {
- InputManager.clearInstance();
+ InputManagerGlobal.clearInstance();
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
index 6bd280aae11d..f158ce14549f 100644
--- a/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/vibrator/VibratorManagerServiceTest.java
@@ -47,6 +47,7 @@ import android.content.ContextWrapper;
import android.content.pm.PackageManagerInternal;
import android.hardware.input.IInputManager;
import android.hardware.input.InputManager;
+import android.hardware.input.InputManagerGlobal;
import android.hardware.vibrator.IVibrator;
import android.hardware.vibrator.IVibratorManager;
import android.media.AudioAttributes;
@@ -184,11 +185,13 @@ public class VibratorManagerServiceTest {
private VirtualDeviceManagerInternal.AppsOnVirtualDeviceListener
mRegisteredAppsOnVirtualDeviceListener;
+ private InputManager mInputManager;
+
@Before
public void setUp() throws Exception {
mTestLooper = new TestLooper();
mContextSpy = spy(new ContextWrapper(InstrumentationRegistry.getContext()));
- InputManager inputManager = InputManager.resetInstance(mIInputManagerMock);
+ InputManagerGlobal.resetInstance(mIInputManagerMock);
mVibrationConfig = new VibrationConfig(mContextSpy.getResources());
ContentResolver contentResolver = mSettingsProviderRule.mockContentResolver(mContextSpy);
@@ -196,7 +199,10 @@ public class VibratorManagerServiceTest {
mVibrator = new FakeVibrator(mContextSpy);
when(mContextSpy.getSystemService(eq(Context.VIBRATOR_SERVICE))).thenReturn(mVibrator);
- when(mContextSpy.getSystemService(eq(Context.INPUT_SERVICE))).thenReturn(inputManager);
+
+ mInputManager = new InputManager(mContextSpy);
+ when(mContextSpy.getSystemService(eq(Context.INPUT_SERVICE)))
+ .thenReturn(mInputManager);
when(mContextSpy.getSystemService(Context.APP_OPS_SERVICE)).thenReturn(mAppOpsManagerMock);
when(mIInputManagerMock.getInputDeviceIds()).thenReturn(new int[0]);
when(mPackageManagerInternalMock.getSystemUiServiceComponent())
@@ -259,6 +265,7 @@ public class VibratorManagerServiceTest {
LocalServices.removeServiceForTest(PowerManagerInternal.class);
// Ignore potential exceptions about the looper having never dispatched any messages.
mTestLooper.stopAutoDispatchAndIgnoreExceptions();
+ InputManagerGlobal.clearInstance();
}
private VibratorManagerService createSystemReadyService() {