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
This commit is contained in:
Wilson Wu
2021-07-13 17:08:59 +08:00
parent 1fae7f3fdc
commit a8021e3380
2 changed files with 21 additions and 42 deletions

View File

@@ -48,8 +48,8 @@ import android.widget.Toast;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import com.android.internal.app.LocalePicker; import com.android.internal.app.LocalePicker;
import com.android.internal.inputmethod.ImeTracing;
import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.view.IInputMethodManager;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.development.WirelessDebuggingPreferenceController; import com.android.settings.development.WirelessDebuggingPreferenceController;
import com.android.settings.overlay.FeatureFactory; 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; static final int SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE = 1026;
private IBinder mSurfaceFlinger; private IBinder mSurfaceFlinger;
private IWindowManager mWindowManager; private IWindowManager mWindowManager;
private IInputMethodManager mInputMethodManager; private ImeTracing mImeTracing;
private Toast mToast; private Toast mToast;
@Override @Override
@@ -206,8 +206,7 @@ public abstract class DevelopmentTiles extends TileService {
super.onCreate(); super.onCreate();
mWindowManager = WindowManagerGlobal.getWindowManagerService(); mWindowManager = WindowManagerGlobal.getWindowManagerService();
mSurfaceFlinger = ServiceManager.getService("SurfaceFlinger"); mSurfaceFlinger = ServiceManager.getService("SurfaceFlinger");
mInputMethodManager = IInputMethodManager.Stub.asInterface( mImeTracing = ImeTracing.getInstance();
ServiceManager.getService("input_method"));
Context context = getApplicationContext(); Context context = getApplicationContext();
CharSequence text = "Trace files written to /data/misc/wmtrace"; CharSequence text = "Trace files written to /data/misc/wmtrace";
mToast = Toast.makeText(context, text, Toast.LENGTH_LONG); mToast = Toast.makeText(context, text, Toast.LENGTH_LONG);
@@ -261,12 +260,7 @@ public abstract class DevelopmentTiles extends TileService {
} }
private boolean isImeTraceEnabled() { private boolean isImeTraceEnabled() {
try { return mImeTracing.isEnabled();
return mInputMethodManager.isImeTraceEnabled();
} catch (RemoteException e) {
Log.e(TAG, "Could not get ime trace status, defaulting to false.", e);
}
return false;
} }
@Override @Override
@@ -323,14 +317,10 @@ public abstract class DevelopmentTiles extends TileService {
} }
private void setImeTraceEnabled(boolean isEnabled) { private void setImeTraceEnabled(boolean isEnabled) {
try {
if (isEnabled) { if (isEnabled) {
mInputMethodManager.startImeTrace(); mImeTracing.startImeTrace();
} else { } else {
mInputMethodManager.stopImeTrace(); mImeTracing.stopImeTrace();
}
} catch (RemoteException e) {
Log.e(TAG, "Could not set ime trace status." + e.toString());
} }
} }

View File

@@ -37,7 +37,7 @@ import android.os.RemoteException;
import android.view.IWindowManager; import android.view.IWindowManager;
import android.widget.Toast; import android.widget.Toast;
import com.android.internal.view.IInputMethodManager; import com.android.internal.inputmethod.ImeTracing;
import com.android.settings.testutils.shadow.ShadowParcel; import com.android.settings.testutils.shadow.ShadowParcel;
import org.junit.After; import org.junit.After;
@@ -56,7 +56,7 @@ public class WinscopeTraceTest {
@Mock @Mock
private IWindowManager mWindowManager; private IWindowManager mWindowManager;
@Mock @Mock
private IInputMethodManager mInputMethodManager; private ImeTracing mImeTracing;
@Mock @Mock
private IBinder mSurfaceFlinger; private IBinder mSurfaceFlinger;
@Mock @Mock
@@ -69,7 +69,7 @@ public class WinscopeTraceTest {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mWinscopeTrace = spy(new DevelopmentTiles.WinscopeTrace()); mWinscopeTrace = spy(new DevelopmentTiles.WinscopeTrace());
ReflectionHelpers.setField(mWinscopeTrace, "mWindowManager", mWindowManager); ReflectionHelpers.setField(mWinscopeTrace, "mWindowManager", mWindowManager);
ReflectionHelpers.setField(mWinscopeTrace, "mInputMethodManager", mInputMethodManager); ReflectionHelpers.setField(mWinscopeTrace, "mImeTracing", mImeTracing);
ReflectionHelpers.setField(mWinscopeTrace, "mSurfaceFlinger", mSurfaceFlinger); ReflectionHelpers.setField(mWinscopeTrace, "mSurfaceFlinger", mSurfaceFlinger);
ReflectionHelpers.setField(mWinscopeTrace, "mToast", mToast); ReflectionHelpers.setField(mWinscopeTrace, "mToast", mToast);
} }
@@ -93,7 +93,7 @@ public class WinscopeTraceTest {
public void sfReturnsTraceEnabled_shouldReturnEnabled() throws RemoteException { public void sfReturnsTraceEnabled_shouldReturnEnabled() throws RemoteException {
// Assume Window Trace and Input Method Manager are disabled. // Assume Window Trace and Input Method Manager are disabled.
doReturn(false).when(mWindowManager).isWindowTraceEnabled(); doReturn(false).when(mWindowManager).isWindowTraceEnabled();
doReturn(false).when(mInputMethodManager).isImeTraceEnabled(); doReturn(false).when(mImeTracing).isEnabled();
ShadowParcel.sReadBoolResult = true; ShadowParcel.sReadBoolResult = true;
assertThat(mWinscopeTrace.isEnabled()).isTrue(); assertThat(mWinscopeTrace.isEnabled()).isTrue();
verify(mSurfaceFlinger) verify(mSurfaceFlinger)
@@ -114,7 +114,7 @@ public class WinscopeTraceTest {
public void wmAndSfAndImmReturnTraceDisabled_shouldReturnDisabled() throws RemoteException { public void wmAndSfAndImmReturnTraceDisabled_shouldReturnDisabled() throws RemoteException {
ShadowParcel.sReadBoolResult = false; ShadowParcel.sReadBoolResult = false;
doReturn(false).when(mWindowManager).isWindowTraceEnabled(); doReturn(false).when(mWindowManager).isWindowTraceEnabled();
doReturn(false).when(mInputMethodManager).isImeTraceEnabled(); doReturn(false).when(mImeTracing).isEnabled();
assertThat(mWinscopeTrace.isEnabled()).isFalse(); assertThat(mWinscopeTrace.isEnabled()).isFalse();
verify(mSurfaceFlinger) verify(mSurfaceFlinger)
.transact(eq(SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE), any(), any(), .transact(eq(SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE), any(), any(),
@@ -127,7 +127,7 @@ public class WinscopeTraceTest {
throws RemoteException { throws RemoteException {
ShadowParcel.sReadBoolResult = false; ShadowParcel.sReadBoolResult = false;
doReturn(false).when(mWindowManager).isWindowTraceEnabled(); doReturn(false).when(mWindowManager).isWindowTraceEnabled();
doReturn(true).when(mInputMethodManager).isImeTraceEnabled(); doReturn(true).when(mImeTracing).isEnabled();
assertThat(mWinscopeTrace.isEnabled()).isTrue(); assertThat(mWinscopeTrace.isEnabled()).isTrue();
verify(mSurfaceFlinger) verify(mSurfaceFlinger)
.transact(eq(SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE), any(), any(), .transact(eq(SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE), any(), any(),
@@ -140,7 +140,7 @@ public class WinscopeTraceTest {
public void immReturnsTraceEnabled_shouldReturnEnabled() throws RemoteException { public void immReturnsTraceEnabled_shouldReturnEnabled() throws RemoteException {
// Assume Window Manager and Surface Trace are disabled. // Assume Window Manager and Surface Trace are disabled.
ShadowParcel.sReadBoolResult = false; ShadowParcel.sReadBoolResult = false;
doReturn(true).when(mInputMethodManager).isImeTraceEnabled(); doReturn(true).when(mImeTracing).isEnabled();
assertThat(mWinscopeTrace.isEnabled()).isTrue(); assertThat(mWinscopeTrace.isEnabled()).isTrue();
} }
@@ -149,7 +149,7 @@ public class WinscopeTraceTest {
public void immReturnsTraceDisabled_shouldReturnDisabled() throws RemoteException { public void immReturnsTraceDisabled_shouldReturnDisabled() throws RemoteException {
// Assume Window Manager and Surface Trace are disabled. // Assume Window Manager and Surface Trace are disabled.
ShadowParcel.sReadBoolResult = false; ShadowParcel.sReadBoolResult = false;
doReturn(false).when(mInputMethodManager).isImeTraceEnabled(); doReturn(false).when(mImeTracing).isEnabled();
assertThat(mWinscopeTrace.isEnabled()).isFalse(); assertThat(mWinscopeTrace.isEnabled()).isFalse();
} }
@@ -167,7 +167,7 @@ public class WinscopeTraceTest {
public void sfUnavailableAndWmAndImmReturnTraceDisabled_shouldReturnDisabled() public void sfUnavailableAndWmAndImmReturnTraceDisabled_shouldReturnDisabled()
throws RemoteException { throws RemoteException {
doReturn(false).when(mWindowManager).isWindowTraceEnabled(); doReturn(false).when(mWindowManager).isWindowTraceEnabled();
doReturn(false).when(mInputMethodManager).isImeTraceEnabled(); doReturn(false).when(mImeTracing).isEnabled();
ReflectionHelpers.setField(mWinscopeTrace, "mSurfaceFlinger", null); ReflectionHelpers.setField(mWinscopeTrace, "mSurfaceFlinger", null);
assertThat(mWinscopeTrace.isEnabled()).isFalse(); assertThat(mWinscopeTrace.isEnabled()).isFalse();
} }
@@ -182,8 +182,8 @@ public class WinscopeTraceTest {
@Test @Test
public void setIsEnableTrue_shouldEnableImeTrace() throws RemoteException { public void setIsEnableTrue_shouldEnableImeTrace() throws RemoteException {
mWinscopeTrace.setIsEnabled(true); mWinscopeTrace.setIsEnabled(true);
verify(mInputMethodManager).startImeTrace(); verify(mImeTracing).startImeTrace();
verifyNoMoreInteractions(mInputMethodManager); verifyNoMoreInteractions(mImeTracing);
} }
@Test @Test
@@ -210,8 +210,8 @@ public class WinscopeTraceTest {
@Config(shadows = ShadowParcel.class) @Config(shadows = ShadowParcel.class)
public void setIsEnableFalse_shouldDisableImeTrace() throws RemoteException { public void setIsEnableFalse_shouldDisableImeTrace() throws RemoteException {
mWinscopeTrace.setIsEnabled(false); mWinscopeTrace.setIsEnabled(false);
verify(mInputMethodManager).stopImeTrace(); verify(mImeTracing).stopImeTrace();
verifyNoMoreInteractions(mInputMethodManager); verifyNoMoreInteractions(mImeTracing);
verify(mToast).show(); verify(mToast).show();
} }
@@ -244,17 +244,6 @@ public class WinscopeTraceTest {
mWinscopeTrace.setIsEnabled(true); 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. * Verify is surface flinger is not available not calls are made to it.
*/ */