From a8021e33802bf4701ba61b63e56d8ac2b962da1b Mon Sep 17 00:00:00 2001 From: Wilson Wu Date: Tue, 13 Jul 2021 17:08:59 +0800 Subject: [PATCH] Remove direct IMMS dependency from DevelopmentTiles Using ImeTracing instead of IInputMethodManager so we can get rid of the direct dependency between Settings DevelopmentTiles and IInputMethodManager. Bug: 175742251 Test: Manually test ime winscope works properly Test: make RunSettingsRoboTests ROBOTEST_FILTER="WinscopeTraceTest" Change-Id: I87e6e841a50b671b7f99c7afff562f3b9a6e3db9 --- .../development/qstile/DevelopmentTiles.java | 26 ++++--------- .../development/qstile/WinscopeTraceTest.java | 37 +++++++------------ 2 files changed, 21 insertions(+), 42 deletions(-) diff --git a/src/com/android/settings/development/qstile/DevelopmentTiles.java b/src/com/android/settings/development/qstile/DevelopmentTiles.java index 764c83ef64a..0483aea861f 100644 --- a/src/com/android/settings/development/qstile/DevelopmentTiles.java +++ b/src/com/android/settings/development/qstile/DevelopmentTiles.java @@ -48,8 +48,8 @@ import android.widget.Toast; import androidx.annotation.VisibleForTesting; import com.android.internal.app.LocalePicker; +import com.android.internal.inputmethod.ImeTracing; import com.android.internal.statusbar.IStatusBarService; -import com.android.internal.view.IInputMethodManager; import com.android.settings.R; import com.android.settings.development.WirelessDebuggingPreferenceController; import com.android.settings.overlay.FeatureFactory; @@ -198,7 +198,7 @@ public abstract class DevelopmentTiles extends TileService { static final int SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE = 1026; private IBinder mSurfaceFlinger; private IWindowManager mWindowManager; - private IInputMethodManager mInputMethodManager; + private ImeTracing mImeTracing; private Toast mToast; @Override @@ -206,8 +206,7 @@ public abstract class DevelopmentTiles extends TileService { super.onCreate(); mWindowManager = WindowManagerGlobal.getWindowManagerService(); mSurfaceFlinger = ServiceManager.getService("SurfaceFlinger"); - mInputMethodManager = IInputMethodManager.Stub.asInterface( - ServiceManager.getService("input_method")); + mImeTracing = ImeTracing.getInstance(); Context context = getApplicationContext(); CharSequence text = "Trace files written to /data/misc/wmtrace"; mToast = Toast.makeText(context, text, Toast.LENGTH_LONG); @@ -261,12 +260,7 @@ public abstract class DevelopmentTiles extends TileService { } private boolean isImeTraceEnabled() { - try { - return mInputMethodManager.isImeTraceEnabled(); - } catch (RemoteException e) { - Log.e(TAG, "Could not get ime trace status, defaulting to false.", e); - } - return false; + return mImeTracing.isEnabled(); } @Override @@ -323,14 +317,10 @@ public abstract class DevelopmentTiles extends TileService { } private void setImeTraceEnabled(boolean isEnabled) { - try { - if (isEnabled) { - mInputMethodManager.startImeTrace(); - } else { - mInputMethodManager.stopImeTrace(); - } - } catch (RemoteException e) { - Log.e(TAG, "Could not set ime trace status." + e.toString()); + if (isEnabled) { + mImeTracing.startImeTrace(); + } else { + mImeTracing.stopImeTrace(); } } diff --git a/tests/robotests/src/com/android/settings/development/qstile/WinscopeTraceTest.java b/tests/robotests/src/com/android/settings/development/qstile/WinscopeTraceTest.java index b4dab0d7cbd..37bf54c80ee 100644 --- a/tests/robotests/src/com/android/settings/development/qstile/WinscopeTraceTest.java +++ b/tests/robotests/src/com/android/settings/development/qstile/WinscopeTraceTest.java @@ -37,7 +37,7 @@ import android.os.RemoteException; import android.view.IWindowManager; import android.widget.Toast; -import com.android.internal.view.IInputMethodManager; +import com.android.internal.inputmethod.ImeTracing; import com.android.settings.testutils.shadow.ShadowParcel; import org.junit.After; @@ -56,7 +56,7 @@ public class WinscopeTraceTest { @Mock private IWindowManager mWindowManager; @Mock - private IInputMethodManager mInputMethodManager; + private ImeTracing mImeTracing; @Mock private IBinder mSurfaceFlinger; @Mock @@ -69,7 +69,7 @@ public class WinscopeTraceTest { MockitoAnnotations.initMocks(this); mWinscopeTrace = spy(new DevelopmentTiles.WinscopeTrace()); ReflectionHelpers.setField(mWinscopeTrace, "mWindowManager", mWindowManager); - ReflectionHelpers.setField(mWinscopeTrace, "mInputMethodManager", mInputMethodManager); + ReflectionHelpers.setField(mWinscopeTrace, "mImeTracing", mImeTracing); ReflectionHelpers.setField(mWinscopeTrace, "mSurfaceFlinger", mSurfaceFlinger); ReflectionHelpers.setField(mWinscopeTrace, "mToast", mToast); } @@ -93,7 +93,7 @@ public class WinscopeTraceTest { public void sfReturnsTraceEnabled_shouldReturnEnabled() throws RemoteException { // Assume Window Trace and Input Method Manager are disabled. doReturn(false).when(mWindowManager).isWindowTraceEnabled(); - doReturn(false).when(mInputMethodManager).isImeTraceEnabled(); + doReturn(false).when(mImeTracing).isEnabled(); ShadowParcel.sReadBoolResult = true; assertThat(mWinscopeTrace.isEnabled()).isTrue(); verify(mSurfaceFlinger) @@ -114,7 +114,7 @@ public class WinscopeTraceTest { public void wmAndSfAndImmReturnTraceDisabled_shouldReturnDisabled() throws RemoteException { ShadowParcel.sReadBoolResult = false; doReturn(false).when(mWindowManager).isWindowTraceEnabled(); - doReturn(false).when(mInputMethodManager).isImeTraceEnabled(); + doReturn(false).when(mImeTracing).isEnabled(); assertThat(mWinscopeTrace.isEnabled()).isFalse(); verify(mSurfaceFlinger) .transact(eq(SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE), any(), any(), @@ -127,7 +127,7 @@ public class WinscopeTraceTest { throws RemoteException { ShadowParcel.sReadBoolResult = false; doReturn(false).when(mWindowManager).isWindowTraceEnabled(); - doReturn(true).when(mInputMethodManager).isImeTraceEnabled(); + doReturn(true).when(mImeTracing).isEnabled(); assertThat(mWinscopeTrace.isEnabled()).isTrue(); verify(mSurfaceFlinger) .transact(eq(SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE), any(), any(), @@ -140,7 +140,7 @@ public class WinscopeTraceTest { public void immReturnsTraceEnabled_shouldReturnEnabled() throws RemoteException { // Assume Window Manager and Surface Trace are disabled. ShadowParcel.sReadBoolResult = false; - doReturn(true).when(mInputMethodManager).isImeTraceEnabled(); + doReturn(true).when(mImeTracing).isEnabled(); assertThat(mWinscopeTrace.isEnabled()).isTrue(); } @@ -149,7 +149,7 @@ public class WinscopeTraceTest { public void immReturnsTraceDisabled_shouldReturnDisabled() throws RemoteException { // Assume Window Manager and Surface Trace are disabled. ShadowParcel.sReadBoolResult = false; - doReturn(false).when(mInputMethodManager).isImeTraceEnabled(); + doReturn(false).when(mImeTracing).isEnabled(); assertThat(mWinscopeTrace.isEnabled()).isFalse(); } @@ -167,7 +167,7 @@ public class WinscopeTraceTest { public void sfUnavailableAndWmAndImmReturnTraceDisabled_shouldReturnDisabled() throws RemoteException { doReturn(false).when(mWindowManager).isWindowTraceEnabled(); - doReturn(false).when(mInputMethodManager).isImeTraceEnabled(); + doReturn(false).when(mImeTracing).isEnabled(); ReflectionHelpers.setField(mWinscopeTrace, "mSurfaceFlinger", null); assertThat(mWinscopeTrace.isEnabled()).isFalse(); } @@ -182,8 +182,8 @@ public class WinscopeTraceTest { @Test public void setIsEnableTrue_shouldEnableImeTrace() throws RemoteException { mWinscopeTrace.setIsEnabled(true); - verify(mInputMethodManager).startImeTrace(); - verifyNoMoreInteractions(mInputMethodManager); + verify(mImeTracing).startImeTrace(); + verifyNoMoreInteractions(mImeTracing); } @Test @@ -210,8 +210,8 @@ public class WinscopeTraceTest { @Config(shadows = ShadowParcel.class) public void setIsEnableFalse_shouldDisableImeTrace() throws RemoteException { mWinscopeTrace.setIsEnabled(false); - verify(mInputMethodManager).stopImeTrace(); - verifyNoMoreInteractions(mInputMethodManager); + verify(mImeTracing).stopImeTrace(); + verifyNoMoreInteractions(mImeTracing); verify(mToast).show(); } @@ -244,17 +244,6 @@ public class WinscopeTraceTest { mWinscopeTrace.setIsEnabled(true); } - /** - * Verify when input method manager call throws a remote exception, it is handled without - * re-throwing the exception. - */ - @Test - public void setIsEnableAndImmThrowsRemoteException_shouldFailGracefully() - throws RemoteException { - doThrow(new RemoteException("Unknown")).when(mInputMethodManager).isImeTraceEnabled(); - mWinscopeTrace.setIsEnabled(true); - } - /** * Verify is surface flinger is not available not calls are made to it. */