Loading services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +23 −36 Original line number Diff line number Diff line Loading @@ -377,11 +377,6 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. @SharedByAllUsersField private final SparseArray<String> mVirtualDeviceMethodMap = new SparseArray<>(); // TODO: Instantiate mSwitchingController for each user. @NonNull @MultiUserUnawareField private InputMethodSubtypeSwitchingController mSwitchingController; @Nullable private StatusBarManagerInternal mStatusBarManagerInternal; @SharedByAllUsersField Loading Loading @@ -1287,7 +1282,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. @SuppressWarnings("GuardedBy") final IntFunction<InputMethodBindingController> bindingControllerFactory = userId -> new InputMethodBindingController(userId, InputMethodManagerService.this); mUserDataRepository = new UserDataRepository(mHandler, mUserManagerInternal, mUserDataRepository = new UserDataRepository(mContext, mHandler, mUserManagerInternal, bindingControllerForTesting != null ? bindingControllerForTesting : bindingControllerFactory); for (int id : mUserManagerInternal.getUserIds()) { Loading @@ -1295,9 +1290,9 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. } final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId); mSwitchingController = new InputMethodSubtypeSwitchingController(context, settings); getUserData(mCurrentUserId).mHardwareKeyboardShortcutController.update(settings); final var userData = getUserData(mCurrentUserId); userData.mSwitchingController.resetCircularListLocked(settings); userData.mHardwareKeyboardShortcutController.update(settings); mMenuController = new InputMethodMenuController(this); mVisibilityStateComputer = new ImeVisibilityStateComputer(this); mVisibilityApplier = new DefaultImeVisibilityApplier(this); Loading Loading @@ -2928,7 +2923,6 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. * {@link PackageManager#COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED} is not updated. * </li> * <li>{@link InputMethodBindingController#getDeviceIdToShowIme()} is ignored.</li> * <li>{@link #mSwitchingController} is ignored.</li> * <li>{@link #mPreventImeStartupUnlessTextEditor} is ignored.</li> * <li>and so on.</li> * </ul> Loading Loading @@ -2963,6 +2957,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. } final var userData = getUserData(userId); userData.mSwitchingController.resetCircularListLocked(settings); userData.mHardwareKeyboardShortcutController.update(settings); } Loading Loading @@ -3039,13 +3034,9 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. resetCurrentMethodAndClientLocked(UnbindReason.NO_IME); } // TODO: Instantiate mSwitchingController for each user. if (userId == mSwitchingController.getUserId()) { mSwitchingController.resetCircularListLocked(settings); } else { mSwitchingController = new InputMethodSubtypeSwitchingController(mContext, settings); } getUserData(userId).mHardwareKeyboardShortcutController.update(settings); final var userData = getUserData(userId); userData.mSwitchingController.resetCircularListLocked(settings); userData.mHardwareKeyboardShortcutController.update(settings); sendOnNavButtonFlagsChangedLocked(); } Loading Loading @@ -4188,8 +4179,9 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. final int userId = mCurrentUserId; final var bindingController = getInputMethodBindingController(userId); final var currentImi = bindingController.getSelectedMethod(); final ImeSubtypeListItem nextSubtype = mSwitchingController.getNextInputMethodLocked( onlyCurrentIme, currentImi, bindingController.getCurrentSubtype()); final ImeSubtypeListItem nextSubtype = getUserData(userId).mSwitchingController .getNextInputMethodLocked(onlyCurrentIme, currentImi, bindingController.getCurrentSubtype()); if (nextSubtype == null) { return false; } Loading @@ -4207,8 +4199,9 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. final int userId = mCurrentUserId; final var bindingController = getInputMethodBindingController(userId); final var currentImi = bindingController.getSelectedMethod(); final ImeSubtypeListItem nextSubtype = mSwitchingController.getNextInputMethodLocked( false /* onlyCurrentIme */, currentImi, bindingController.getCurrentSubtype()); final ImeSubtypeListItem nextSubtype = getUserData(userId).mSwitchingController .getNextInputMethodLocked(false /* onlyCurrentIme */, currentImi, bindingController.getCurrentSubtype()); return nextSubtype != null; } } Loading Loading @@ -4641,13 +4634,11 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. return; } final int userId = mCurrentUserId; if (userId != mSwitchingController.getUserId()) { return; } final var imi = getInputMethodBindingController(userId).getSelectedMethod(); final var bindingController = getInputMethodBindingController(userId); final InputMethodInfo imi = bindingController.getSelectedMethod(); if (imi != null) { mSwitchingController.onUserActionLocked(imi, getInputMethodBindingController(userId).getCurrentSubtype()); getUserData(userId).mSwitchingController.onUserActionLocked(imi, bindingController.getCurrentSubtype()); } } } Loading Loading @@ -5308,13 +5299,9 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. updateDefaultVoiceImeIfNeededLocked(); // TODO: Instantiate mSwitchingController for each user. if (userId == mSwitchingController.getUserId()) { mSwitchingController.resetCircularListLocked(settings); } else { mSwitchingController = new InputMethodSubtypeSwitchingController(mContext, settings); } getUserData(userId).mHardwareKeyboardShortcutController.update(settings); final var userData = getUserData(userId); userData.mSwitchingController.resetCircularListLocked(settings); userData.mHardwareKeyboardShortcutController.update(settings); sendOnNavButtonFlagsChangedLocked(); Loading Loading @@ -6115,6 +6102,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. p.println(" hasMainConnection=" + u.mBindingController.hasMainConnection()); p.println(" isVisibleBound=" + u.mBindingController.isVisibleBound()); p.println(" mSwitchingController:"); u.mSwitchingController.dump(p, " "); }; mUserDataRepository.forAllUserData(userDataDump); Loading @@ -6135,8 +6124,6 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. p.println(" mSettingsObserver=" + mSettingsObserver); p.println(" mStylusIds=" + (mStylusIds != null ? Arrays.toString(mStylusIds.toArray()) : "")); p.println(" mSwitchingController:"); mSwitchingController.dump(p, " "); p.println(" mStartInputHistory:"); mStartInputHistory.dump(pw, " "); Loading services/core/java/com/android/server/inputmethod/UserDataRepository.java +17 −4 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.inputmethod; import android.annotation.NonNull; import android.annotation.UserIdInt; import android.content.Context; import android.content.pm.UserInfo; import android.os.Handler; import android.util.SparseArray; Loading @@ -35,12 +36,15 @@ final class UserDataRepository { private final IntFunction<InputMethodBindingController> mBindingControllerFactory; @NonNull private final Context mContext; @GuardedBy("ImfLock.class") @NonNull UserData getOrCreate(@UserIdInt int userId) { UserData userData = mUserData.get(userId); if (userData == null) { userData = new UserData(userId, mBindingControllerFactory.apply(userId)); userData = new UserData(userId, mBindingControllerFactory.apply(userId), mContext); mUserData.put(userId, userData); } return userData; Loading @@ -53,8 +57,11 @@ final class UserDataRepository { } } UserDataRepository(@NonNull Handler handler, @NonNull UserManagerInternal userManagerInternal, UserDataRepository( @NonNull Context context, @NonNull Handler handler, @NonNull UserManagerInternal userManagerInternal, @NonNull IntFunction<InputMethodBindingController> bindingControllerFactory) { mContext = context; mBindingControllerFactory = bindingControllerFactory; userManagerInternal.addUserLifecycleListener( new UserManagerInternal.UserLifecycleListener() { Loading Loading @@ -88,6 +95,9 @@ final class UserDataRepository { @NonNull final InputMethodBindingController mBindingController; @NonNull final InputMethodSubtypeSwitchingController mSwitchingController; @NonNull final HardwareKeyboardShortcutController mHardwareKeyboardShortcutController; Loading @@ -95,11 +105,14 @@ final class UserDataRepository { * Intended to be instantiated only from this file. */ private UserData(@UserIdInt int userId, @NonNull InputMethodBindingController bindingController) { @NonNull InputMethodBindingController bindingController, @NonNull Context context) { mUserId = userId; mBindingController = bindingController; final var emptySettings = InputMethodSettings.createEmptyMap(userId); mSwitchingController = new InputMethodSubtypeSwitchingController(context, emptySettings); mHardwareKeyboardShortcutController = new HardwareKeyboardShortcutController( InputMethodSettings.createEmptyMap(userId)); emptySettings); } @Override Loading services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java +1 −0 Original line number Diff line number Diff line Loading @@ -181,6 +181,7 @@ public class InputMethodManagerServiceTestBase { // InputMethodManagerService. doNothing().when(mContext).enforceCallingPermission(anyString(), anyString()); doNothing().when(mContext).sendBroadcastAsUser(any(), any()); doReturn(mContext).when(mContext).createContextAsUser(any(), anyInt()); doReturn(null).when(mContext).registerReceiver(any(), any()); doReturn(null) .when(mContext) Loading services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/UserDataRepositoryTest.java +17 −5 Original line number Diff line number Diff line Loading @@ -18,16 +18,22 @@ package com.android.server.inputmethod; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.content.Context; import android.content.pm.UserInfo; import android.os.ConditionVariable; import android.os.Handler; import android.os.Looper; import android.platform.test.ravenwood.RavenwoodRule; import androidx.test.platform.app.InstrumentationRegistry; import com.android.server.pm.UserManagerInternal; import org.junit.After; Loading Loading @@ -61,10 +67,15 @@ public final class UserDataRepositoryTest { private IntFunction<InputMethodBindingController> mBindingControllerFactory; private Context mMockedContext; @Before public void setUp() { MockitoAnnotations.initMocks(this); SecureSettingsWrapper.startTestMode(); mMockedContext = spy(InstrumentationRegistry.getInstrumentation().getTargetContext()); doReturn(mMockedContext).when(mMockedContext).createContextAsUser(any(), anyInt()); mHandler = new Handler(Looper.getMainLooper()); mBindingControllerFactory = new IntFunction<InputMethodBindingController>() { Loading @@ -85,8 +96,8 @@ public final class UserDataRepositoryTest { // Create UserDataRepository and capture the user lifecycle listener final var captor = ArgumentCaptor.forClass(UserManagerInternal.UserLifecycleListener.class); final var bindingControllerFactorySpy = spy(mBindingControllerFactory); final var repository = new UserDataRepository(mHandler, mMockUserManagerInternal, bindingControllerFactorySpy); final var repository = new UserDataRepository(mMockedContext, mHandler, mMockUserManagerInternal, bindingControllerFactorySpy); verify(mMockUserManagerInternal, times(1)).addUserLifecycleListener(captor.capture()); final var listener = captor.getValue(); Loading @@ -112,7 +123,8 @@ public final class UserDataRepositoryTest { public void testUserDataRepository_removesUserInfoOnUserRemovedEvent() { // Create UserDataRepository and capture the user lifecycle listener final var captor = ArgumentCaptor.forClass(UserManagerInternal.UserLifecycleListener.class); final var repository = new UserDataRepository(mHandler, mMockUserManagerInternal, final var repository = new UserDataRepository(mMockedContext, mHandler, mMockUserManagerInternal, userId -> new InputMethodBindingController(userId, mMockInputMethodManagerService)); verify(mMockUserManagerInternal, times(1)).addUserLifecycleListener(captor.capture()); Loading @@ -134,8 +146,8 @@ public final class UserDataRepositoryTest { @Test public void testGetOrCreate() { final var repository = new UserDataRepository(mHandler, mMockUserManagerInternal, mBindingControllerFactory); final var repository = new UserDataRepository(mMockedContext, mHandler, mMockUserManagerInternal, mBindingControllerFactory); synchronized (ImfLock.class) { final var userData = repository.getOrCreate(ANY_USER_ID); Loading Loading
services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +23 −36 Original line number Diff line number Diff line Loading @@ -377,11 +377,6 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. @SharedByAllUsersField private final SparseArray<String> mVirtualDeviceMethodMap = new SparseArray<>(); // TODO: Instantiate mSwitchingController for each user. @NonNull @MultiUserUnawareField private InputMethodSubtypeSwitchingController mSwitchingController; @Nullable private StatusBarManagerInternal mStatusBarManagerInternal; @SharedByAllUsersField Loading Loading @@ -1287,7 +1282,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. @SuppressWarnings("GuardedBy") final IntFunction<InputMethodBindingController> bindingControllerFactory = userId -> new InputMethodBindingController(userId, InputMethodManagerService.this); mUserDataRepository = new UserDataRepository(mHandler, mUserManagerInternal, mUserDataRepository = new UserDataRepository(mContext, mHandler, mUserManagerInternal, bindingControllerForTesting != null ? bindingControllerForTesting : bindingControllerFactory); for (int id : mUserManagerInternal.getUserIds()) { Loading @@ -1295,9 +1290,9 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. } final InputMethodSettings settings = InputMethodSettingsRepository.get(mCurrentUserId); mSwitchingController = new InputMethodSubtypeSwitchingController(context, settings); getUserData(mCurrentUserId).mHardwareKeyboardShortcutController.update(settings); final var userData = getUserData(mCurrentUserId); userData.mSwitchingController.resetCircularListLocked(settings); userData.mHardwareKeyboardShortcutController.update(settings); mMenuController = new InputMethodMenuController(this); mVisibilityStateComputer = new ImeVisibilityStateComputer(this); mVisibilityApplier = new DefaultImeVisibilityApplier(this); Loading Loading @@ -2928,7 +2923,6 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. * {@link PackageManager#COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED} is not updated. * </li> * <li>{@link InputMethodBindingController#getDeviceIdToShowIme()} is ignored.</li> * <li>{@link #mSwitchingController} is ignored.</li> * <li>{@link #mPreventImeStartupUnlessTextEditor} is ignored.</li> * <li>and so on.</li> * </ul> Loading Loading @@ -2963,6 +2957,7 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. } final var userData = getUserData(userId); userData.mSwitchingController.resetCircularListLocked(settings); userData.mHardwareKeyboardShortcutController.update(settings); } Loading Loading @@ -3039,13 +3034,9 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. resetCurrentMethodAndClientLocked(UnbindReason.NO_IME); } // TODO: Instantiate mSwitchingController for each user. if (userId == mSwitchingController.getUserId()) { mSwitchingController.resetCircularListLocked(settings); } else { mSwitchingController = new InputMethodSubtypeSwitchingController(mContext, settings); } getUserData(userId).mHardwareKeyboardShortcutController.update(settings); final var userData = getUserData(userId); userData.mSwitchingController.resetCircularListLocked(settings); userData.mHardwareKeyboardShortcutController.update(settings); sendOnNavButtonFlagsChangedLocked(); } Loading Loading @@ -4188,8 +4179,9 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. final int userId = mCurrentUserId; final var bindingController = getInputMethodBindingController(userId); final var currentImi = bindingController.getSelectedMethod(); final ImeSubtypeListItem nextSubtype = mSwitchingController.getNextInputMethodLocked( onlyCurrentIme, currentImi, bindingController.getCurrentSubtype()); final ImeSubtypeListItem nextSubtype = getUserData(userId).mSwitchingController .getNextInputMethodLocked(onlyCurrentIme, currentImi, bindingController.getCurrentSubtype()); if (nextSubtype == null) { return false; } Loading @@ -4207,8 +4199,9 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. final int userId = mCurrentUserId; final var bindingController = getInputMethodBindingController(userId); final var currentImi = bindingController.getSelectedMethod(); final ImeSubtypeListItem nextSubtype = mSwitchingController.getNextInputMethodLocked( false /* onlyCurrentIme */, currentImi, bindingController.getCurrentSubtype()); final ImeSubtypeListItem nextSubtype = getUserData(userId).mSwitchingController .getNextInputMethodLocked(false /* onlyCurrentIme */, currentImi, bindingController.getCurrentSubtype()); return nextSubtype != null; } } Loading Loading @@ -4641,13 +4634,11 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. return; } final int userId = mCurrentUserId; if (userId != mSwitchingController.getUserId()) { return; } final var imi = getInputMethodBindingController(userId).getSelectedMethod(); final var bindingController = getInputMethodBindingController(userId); final InputMethodInfo imi = bindingController.getSelectedMethod(); if (imi != null) { mSwitchingController.onUserActionLocked(imi, getInputMethodBindingController(userId).getCurrentSubtype()); getUserData(userId).mSwitchingController.onUserActionLocked(imi, bindingController.getCurrentSubtype()); } } } Loading Loading @@ -5308,13 +5299,9 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. updateDefaultVoiceImeIfNeededLocked(); // TODO: Instantiate mSwitchingController for each user. if (userId == mSwitchingController.getUserId()) { mSwitchingController.resetCircularListLocked(settings); } else { mSwitchingController = new InputMethodSubtypeSwitchingController(mContext, settings); } getUserData(userId).mHardwareKeyboardShortcutController.update(settings); final var userData = getUserData(userId); userData.mSwitchingController.resetCircularListLocked(settings); userData.mHardwareKeyboardShortcutController.update(settings); sendOnNavButtonFlagsChangedLocked(); Loading Loading @@ -6115,6 +6102,8 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. p.println(" hasMainConnection=" + u.mBindingController.hasMainConnection()); p.println(" isVisibleBound=" + u.mBindingController.isVisibleBound()); p.println(" mSwitchingController:"); u.mSwitchingController.dump(p, " "); }; mUserDataRepository.forAllUserData(userDataDump); Loading @@ -6135,8 +6124,6 @@ public final class InputMethodManagerService implements IInputMethodManagerImpl. p.println(" mSettingsObserver=" + mSettingsObserver); p.println(" mStylusIds=" + (mStylusIds != null ? Arrays.toString(mStylusIds.toArray()) : "")); p.println(" mSwitchingController:"); mSwitchingController.dump(p, " "); p.println(" mStartInputHistory:"); mStartInputHistory.dump(pw, " "); Loading
services/core/java/com/android/server/inputmethod/UserDataRepository.java +17 −4 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.inputmethod; import android.annotation.NonNull; import android.annotation.UserIdInt; import android.content.Context; import android.content.pm.UserInfo; import android.os.Handler; import android.util.SparseArray; Loading @@ -35,12 +36,15 @@ final class UserDataRepository { private final IntFunction<InputMethodBindingController> mBindingControllerFactory; @NonNull private final Context mContext; @GuardedBy("ImfLock.class") @NonNull UserData getOrCreate(@UserIdInt int userId) { UserData userData = mUserData.get(userId); if (userData == null) { userData = new UserData(userId, mBindingControllerFactory.apply(userId)); userData = new UserData(userId, mBindingControllerFactory.apply(userId), mContext); mUserData.put(userId, userData); } return userData; Loading @@ -53,8 +57,11 @@ final class UserDataRepository { } } UserDataRepository(@NonNull Handler handler, @NonNull UserManagerInternal userManagerInternal, UserDataRepository( @NonNull Context context, @NonNull Handler handler, @NonNull UserManagerInternal userManagerInternal, @NonNull IntFunction<InputMethodBindingController> bindingControllerFactory) { mContext = context; mBindingControllerFactory = bindingControllerFactory; userManagerInternal.addUserLifecycleListener( new UserManagerInternal.UserLifecycleListener() { Loading Loading @@ -88,6 +95,9 @@ final class UserDataRepository { @NonNull final InputMethodBindingController mBindingController; @NonNull final InputMethodSubtypeSwitchingController mSwitchingController; @NonNull final HardwareKeyboardShortcutController mHardwareKeyboardShortcutController; Loading @@ -95,11 +105,14 @@ final class UserDataRepository { * Intended to be instantiated only from this file. */ private UserData(@UserIdInt int userId, @NonNull InputMethodBindingController bindingController) { @NonNull InputMethodBindingController bindingController, @NonNull Context context) { mUserId = userId; mBindingController = bindingController; final var emptySettings = InputMethodSettings.createEmptyMap(userId); mSwitchingController = new InputMethodSubtypeSwitchingController(context, emptySettings); mHardwareKeyboardShortcutController = new HardwareKeyboardShortcutController( InputMethodSettings.createEmptyMap(userId)); emptySettings); } @Override Loading
services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/InputMethodManagerServiceTestBase.java +1 −0 Original line number Diff line number Diff line Loading @@ -181,6 +181,7 @@ public class InputMethodManagerServiceTestBase { // InputMethodManagerService. doNothing().when(mContext).enforceCallingPermission(anyString(), anyString()); doNothing().when(mContext).sendBroadcastAsUser(any(), any()); doReturn(mContext).when(mContext).createContextAsUser(any(), anyInt()); doReturn(null).when(mContext).registerReceiver(any(), any()); doReturn(null) .when(mContext) Loading
services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/UserDataRepositoryTest.java +17 −5 Original line number Diff line number Diff line Loading @@ -18,16 +18,22 @@ package com.android.server.inputmethod; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.content.Context; import android.content.pm.UserInfo; import android.os.ConditionVariable; import android.os.Handler; import android.os.Looper; import android.platform.test.ravenwood.RavenwoodRule; import androidx.test.platform.app.InstrumentationRegistry; import com.android.server.pm.UserManagerInternal; import org.junit.After; Loading Loading @@ -61,10 +67,15 @@ public final class UserDataRepositoryTest { private IntFunction<InputMethodBindingController> mBindingControllerFactory; private Context mMockedContext; @Before public void setUp() { MockitoAnnotations.initMocks(this); SecureSettingsWrapper.startTestMode(); mMockedContext = spy(InstrumentationRegistry.getInstrumentation().getTargetContext()); doReturn(mMockedContext).when(mMockedContext).createContextAsUser(any(), anyInt()); mHandler = new Handler(Looper.getMainLooper()); mBindingControllerFactory = new IntFunction<InputMethodBindingController>() { Loading @@ -85,8 +96,8 @@ public final class UserDataRepositoryTest { // Create UserDataRepository and capture the user lifecycle listener final var captor = ArgumentCaptor.forClass(UserManagerInternal.UserLifecycleListener.class); final var bindingControllerFactorySpy = spy(mBindingControllerFactory); final var repository = new UserDataRepository(mHandler, mMockUserManagerInternal, bindingControllerFactorySpy); final var repository = new UserDataRepository(mMockedContext, mHandler, mMockUserManagerInternal, bindingControllerFactorySpy); verify(mMockUserManagerInternal, times(1)).addUserLifecycleListener(captor.capture()); final var listener = captor.getValue(); Loading @@ -112,7 +123,8 @@ public final class UserDataRepositoryTest { public void testUserDataRepository_removesUserInfoOnUserRemovedEvent() { // Create UserDataRepository and capture the user lifecycle listener final var captor = ArgumentCaptor.forClass(UserManagerInternal.UserLifecycleListener.class); final var repository = new UserDataRepository(mHandler, mMockUserManagerInternal, final var repository = new UserDataRepository(mMockedContext, mHandler, mMockUserManagerInternal, userId -> new InputMethodBindingController(userId, mMockInputMethodManagerService)); verify(mMockUserManagerInternal, times(1)).addUserLifecycleListener(captor.capture()); Loading @@ -134,8 +146,8 @@ public final class UserDataRepositoryTest { @Test public void testGetOrCreate() { final var repository = new UserDataRepository(mHandler, mMockUserManagerInternal, mBindingControllerFactory); final var repository = new UserDataRepository(mMockedContext, mHandler, mMockUserManagerInternal, mBindingControllerFactory); synchronized (ImfLock.class) { final var userData = repository.getOrCreate(ANY_USER_ID); Loading