Loading core/java/android/view/inputmethod/InputBinding.java +2 −0 Original line number Diff line number Diff line Loading @@ -19,11 +19,13 @@ package android.view.inputmethod; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; import android.ravenwood.annotation.RavenwoodKeepWholeClass; /** * Information given to an {@link InputMethod} about a client connecting * to it. */ @RavenwoodKeepWholeClass public final class InputBinding implements Parcelable { static final String TAG = "InputBinding"; Loading ravenwood/ravenwood-annotation-allowed-classes.txt +1 −0 Original line number Diff line number Diff line Loading @@ -255,6 +255,7 @@ android.view.Display android.view.Display$HdrCapabilities android.view.Display$Mode android.view.DisplayInfo android.view.inputmethod.InputBinding android.hardware.SerialManager android.hardware.SerialManagerInternal Loading services/core/java/com/android/server/inputmethod/IInputMethodClientInvoker.java +13 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,9 @@ import com.android.internal.inputmethod.InputBindResult; * the given {@link Handler} thread if {@link IInputMethodClient} is not a proxy object. Be careful * about its call ordering characteristics.</p> */ // TODO(b/322895594) Mark this class to be host side test compatible once enabling fw/services in // Ravenwood (mark this class with @RavenwoodKeepWholeClass and #create with @RavenwoodReplace, // so Ravenwood can properly swap create method during test execution). final class IInputMethodClientInvoker { private static final String TAG = InputMethodManagerService.TAG; private static final boolean DEBUG = InputMethodManagerService.DEBUG; Loading @@ -64,6 +67,16 @@ final class IInputMethodClientInvoker { return new IInputMethodClientInvoker(inputMethodClient, isProxy, isProxy ? null : handler); } @AnyThread @Nullable static IInputMethodClientInvoker create$ravenwood( @Nullable IInputMethodClient inputMethodClient, @NonNull Handler handler) { if (inputMethodClient == null) { return null; } return new IInputMethodClientInvoker(inputMethodClient, true, null); } private IInputMethodClientInvoker(@NonNull IInputMethodClient target, boolean isProxy, @Nullable Handler handler) { mTarget = target; Loading services/tests/InputMethodSystemServerTests/Android.bp +0 −1 Original line number Diff line number Diff line Loading @@ -85,7 +85,6 @@ android_ravenwood_test { srcs: [ "src/com/android/server/inputmethod/**/ClientControllerTest.java", ], sdk_version: "test_current", auto_gen_config: true, } Loading services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/ClientControllerTest.java +18 −26 Original line number Diff line number Diff line Loading @@ -32,10 +32,8 @@ import android.content.pm.PackageManagerInternal; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.platform.test.annotations.IgnoreUnderRavenwood; import android.platform.test.ravenwood.RavenwoodRule; import android.view.Display; import android.view.inputmethod.InputBinding; import com.android.internal.inputmethod.IInputMethodClient; import com.android.internal.inputmethod.IRemoteInputConnection; Loading @@ -53,7 +51,7 @@ import java.util.concurrent.TimeUnit; public final class ClientControllerTest { private static final int ANY_DISPLAY_ID = Display.DEFAULT_DISPLAY; private static final int ANY_CALLER_UID = 1; private static final int ANY_CALLER_PID = 1; private static final int ANY_CALLER_PID = 2; private static final String SOME_PACKAGE_NAME = "some.package"; @Rule Loading Loading @@ -82,13 +80,16 @@ public final class ClientControllerTest { mController = new ClientController(mMockPackageManagerInternal); } // TODO(b/322895594): No need to directly invoke create$ravenwood once b/322895594 is fixed. private IInputMethodClientInvoker createInvoker(IInputMethodClient client, Handler handler) { return RavenwoodRule.isOnRavenwood() ? IInputMethodClientInvoker.create$ravenwood(client, handler) : IInputMethodClientInvoker.create(client, handler); } @Test // TODO(b/314150112): Enable host side mode for this test once Ravenwood is enabled for // inputmethod server classes. @IgnoreUnderRavenwood(blockedBy = {InputBinding.class, IInputMethodClientInvoker.class}) public void testAddClient_cannotAddTheSameClientTwice() { var invoker = IInputMethodClientInvoker.create(mClient, mHandler); final var invoker = createInvoker(mClient, mHandler); synchronized (ImfLock.class) { mController.addClient(invoker, mConnection, ANY_DISPLAY_ID, ANY_CALLER_UID, ANY_CALLER_PID); Loading @@ -101,18 +102,17 @@ public final class ClientControllerTest { } }); assertThat(thrown.getMessage()).isEqualTo( "uid=1/pid=1/displayId=0 is already registered"); "uid=" + ANY_CALLER_UID + "/pid=" + ANY_CALLER_PID + "/displayId=0 is already registered"); } } @Test // TODO(b/314150112): Enable host side mode for this test once Ravenwood is enabled for // inputmethod server classes. @IgnoreUnderRavenwood(blockedBy = {InputBinding.class, IInputMethodClientInvoker.class}) public void testAddClient() throws Exception { final var invoker = createInvoker(mClient, mHandler); synchronized (ImfLock.class) { var invoker = IInputMethodClientInvoker.create(mClient, mHandler); var added = mController.addClient(invoker, mConnection, ANY_DISPLAY_ID, ANY_CALLER_UID, final var added = mController.addClient(invoker, mConnection, ANY_DISPLAY_ID, ANY_CALLER_UID, ANY_CALLER_PID); verify(invoker.asBinder()).linkToDeath(any(IBinder.DeathRecipient.class), eq(0)); Loading @@ -121,16 +121,12 @@ public final class ClientControllerTest { } @Test // TODO(b/314150112): Enable host side mode for this test once Ravenwood is enabled for // inputmethod server classes. @IgnoreUnderRavenwood(blockedBy = {InputBinding.class, IInputMethodClientInvoker.class}) public void testRemoveClient() { var callback = new TestClientControllerCallback(); final var invoker = createInvoker(mClient, mHandler); final var callback = new TestClientControllerCallback(); ClientState added; synchronized (ImfLock.class) { mController.addClientControllerCallback(callback); var invoker = IInputMethodClientInvoker.create(mClient, mHandler); added = mController.addClient(invoker, mConnection, ANY_DISPLAY_ID, ANY_CALLER_UID, ANY_CALLER_PID); assertThat(mController.getClient(invoker.asBinder())).isSameInstanceAs(added); Loading @@ -138,21 +134,17 @@ public final class ClientControllerTest { } // Test callback var removed = callback.waitForRemovedClient(5, TimeUnit.SECONDS); final var removed = callback.waitForRemovedClient(5, TimeUnit.SECONDS); assertThat(removed).isSameInstanceAs(added); } @Test // TODO(b/314150112): Enable host side mode for this test once Ravenwood is enabled for // inputmethod server classes and updated to newer Mockito with static mock support (mock // InputMethodUtils#checkIfPackageBelongsToUid instead of PackageManagerInternal#isSameApp) @IgnoreUnderRavenwood(blockedBy = {InputMethodUtils.class}) public void testVerifyClientAndPackageMatch() { final var invoker = createInvoker(mClient, mHandler); when(mMockPackageManagerInternal.isSameApp(eq(SOME_PACKAGE_NAME), /* flags= */ anyLong(), eq(ANY_CALLER_UID), /* userId= */ anyInt())).thenReturn(true); synchronized (ImfLock.class) { var invoker = IInputMethodClientInvoker.create(mClient, mHandler); mController.addClient(invoker, mConnection, ANY_DISPLAY_ID, ANY_CALLER_UID, ANY_CALLER_PID); assertThat( Loading Loading
core/java/android/view/inputmethod/InputBinding.java +2 −0 Original line number Diff line number Diff line Loading @@ -19,11 +19,13 @@ package android.view.inputmethod; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; import android.ravenwood.annotation.RavenwoodKeepWholeClass; /** * Information given to an {@link InputMethod} about a client connecting * to it. */ @RavenwoodKeepWholeClass public final class InputBinding implements Parcelable { static final String TAG = "InputBinding"; Loading
ravenwood/ravenwood-annotation-allowed-classes.txt +1 −0 Original line number Diff line number Diff line Loading @@ -255,6 +255,7 @@ android.view.Display android.view.Display$HdrCapabilities android.view.Display$Mode android.view.DisplayInfo android.view.inputmethod.InputBinding android.hardware.SerialManager android.hardware.SerialManagerInternal Loading
services/core/java/com/android/server/inputmethod/IInputMethodClientInvoker.java +13 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,9 @@ import com.android.internal.inputmethod.InputBindResult; * the given {@link Handler} thread if {@link IInputMethodClient} is not a proxy object. Be careful * about its call ordering characteristics.</p> */ // TODO(b/322895594) Mark this class to be host side test compatible once enabling fw/services in // Ravenwood (mark this class with @RavenwoodKeepWholeClass and #create with @RavenwoodReplace, // so Ravenwood can properly swap create method during test execution). final class IInputMethodClientInvoker { private static final String TAG = InputMethodManagerService.TAG; private static final boolean DEBUG = InputMethodManagerService.DEBUG; Loading @@ -64,6 +67,16 @@ final class IInputMethodClientInvoker { return new IInputMethodClientInvoker(inputMethodClient, isProxy, isProxy ? null : handler); } @AnyThread @Nullable static IInputMethodClientInvoker create$ravenwood( @Nullable IInputMethodClient inputMethodClient, @NonNull Handler handler) { if (inputMethodClient == null) { return null; } return new IInputMethodClientInvoker(inputMethodClient, true, null); } private IInputMethodClientInvoker(@NonNull IInputMethodClient target, boolean isProxy, @Nullable Handler handler) { mTarget = target; Loading
services/tests/InputMethodSystemServerTests/Android.bp +0 −1 Original line number Diff line number Diff line Loading @@ -85,7 +85,6 @@ android_ravenwood_test { srcs: [ "src/com/android/server/inputmethod/**/ClientControllerTest.java", ], sdk_version: "test_current", auto_gen_config: true, } Loading
services/tests/InputMethodSystemServerTests/src/com/android/server/inputmethod/ClientControllerTest.java +18 −26 Original line number Diff line number Diff line Loading @@ -32,10 +32,8 @@ import android.content.pm.PackageManagerInternal; import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.platform.test.annotations.IgnoreUnderRavenwood; import android.platform.test.ravenwood.RavenwoodRule; import android.view.Display; import android.view.inputmethod.InputBinding; import com.android.internal.inputmethod.IInputMethodClient; import com.android.internal.inputmethod.IRemoteInputConnection; Loading @@ -53,7 +51,7 @@ import java.util.concurrent.TimeUnit; public final class ClientControllerTest { private static final int ANY_DISPLAY_ID = Display.DEFAULT_DISPLAY; private static final int ANY_CALLER_UID = 1; private static final int ANY_CALLER_PID = 1; private static final int ANY_CALLER_PID = 2; private static final String SOME_PACKAGE_NAME = "some.package"; @Rule Loading Loading @@ -82,13 +80,16 @@ public final class ClientControllerTest { mController = new ClientController(mMockPackageManagerInternal); } // TODO(b/322895594): No need to directly invoke create$ravenwood once b/322895594 is fixed. private IInputMethodClientInvoker createInvoker(IInputMethodClient client, Handler handler) { return RavenwoodRule.isOnRavenwood() ? IInputMethodClientInvoker.create$ravenwood(client, handler) : IInputMethodClientInvoker.create(client, handler); } @Test // TODO(b/314150112): Enable host side mode for this test once Ravenwood is enabled for // inputmethod server classes. @IgnoreUnderRavenwood(blockedBy = {InputBinding.class, IInputMethodClientInvoker.class}) public void testAddClient_cannotAddTheSameClientTwice() { var invoker = IInputMethodClientInvoker.create(mClient, mHandler); final var invoker = createInvoker(mClient, mHandler); synchronized (ImfLock.class) { mController.addClient(invoker, mConnection, ANY_DISPLAY_ID, ANY_CALLER_UID, ANY_CALLER_PID); Loading @@ -101,18 +102,17 @@ public final class ClientControllerTest { } }); assertThat(thrown.getMessage()).isEqualTo( "uid=1/pid=1/displayId=0 is already registered"); "uid=" + ANY_CALLER_UID + "/pid=" + ANY_CALLER_PID + "/displayId=0 is already registered"); } } @Test // TODO(b/314150112): Enable host side mode for this test once Ravenwood is enabled for // inputmethod server classes. @IgnoreUnderRavenwood(blockedBy = {InputBinding.class, IInputMethodClientInvoker.class}) public void testAddClient() throws Exception { final var invoker = createInvoker(mClient, mHandler); synchronized (ImfLock.class) { var invoker = IInputMethodClientInvoker.create(mClient, mHandler); var added = mController.addClient(invoker, mConnection, ANY_DISPLAY_ID, ANY_CALLER_UID, final var added = mController.addClient(invoker, mConnection, ANY_DISPLAY_ID, ANY_CALLER_UID, ANY_CALLER_PID); verify(invoker.asBinder()).linkToDeath(any(IBinder.DeathRecipient.class), eq(0)); Loading @@ -121,16 +121,12 @@ public final class ClientControllerTest { } @Test // TODO(b/314150112): Enable host side mode for this test once Ravenwood is enabled for // inputmethod server classes. @IgnoreUnderRavenwood(blockedBy = {InputBinding.class, IInputMethodClientInvoker.class}) public void testRemoveClient() { var callback = new TestClientControllerCallback(); final var invoker = createInvoker(mClient, mHandler); final var callback = new TestClientControllerCallback(); ClientState added; synchronized (ImfLock.class) { mController.addClientControllerCallback(callback); var invoker = IInputMethodClientInvoker.create(mClient, mHandler); added = mController.addClient(invoker, mConnection, ANY_DISPLAY_ID, ANY_CALLER_UID, ANY_CALLER_PID); assertThat(mController.getClient(invoker.asBinder())).isSameInstanceAs(added); Loading @@ -138,21 +134,17 @@ public final class ClientControllerTest { } // Test callback var removed = callback.waitForRemovedClient(5, TimeUnit.SECONDS); final var removed = callback.waitForRemovedClient(5, TimeUnit.SECONDS); assertThat(removed).isSameInstanceAs(added); } @Test // TODO(b/314150112): Enable host side mode for this test once Ravenwood is enabled for // inputmethod server classes and updated to newer Mockito with static mock support (mock // InputMethodUtils#checkIfPackageBelongsToUid instead of PackageManagerInternal#isSameApp) @IgnoreUnderRavenwood(blockedBy = {InputMethodUtils.class}) public void testVerifyClientAndPackageMatch() { final var invoker = createInvoker(mClient, mHandler); when(mMockPackageManagerInternal.isSameApp(eq(SOME_PACKAGE_NAME), /* flags= */ anyLong(), eq(ANY_CALLER_UID), /* userId= */ anyInt())).thenReturn(true); synchronized (ImfLock.class) { var invoker = IInputMethodClientInvoker.create(mClient, mHandler); mController.addClient(invoker, mConnection, ANY_DISPLAY_ID, ANY_CALLER_UID, ANY_CALLER_PID); assertThat( Loading