diff --git a/src/com/android/settings/development/qstile/DevelopmentTiles.java b/src/com/android/settings/development/qstile/DevelopmentTiles.java index e64c8c05756..203a688c11e 100644 --- a/src/com/android/settings/development/qstile/DevelopmentTiles.java +++ b/src/com/android/settings/development/qstile/DevelopmentTiles.java @@ -48,6 +48,8 @@ import android.widget.Toast; import androidx.annotation.VisibleForTesting; import com.android.internal.app.LocalePicker; +import com.android.internal.inputmethod.Completable; +import com.android.internal.inputmethod.ResultCallbacks; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.view.IInputMethodManager; import com.android.settings.R; @@ -260,9 +262,12 @@ public abstract class DevelopmentTiles extends TileService { return false; } - private boolean isImeTraceEnabled() { + @VisibleForTesting + boolean isImeTraceEnabled() { try { - return mInputMethodManager.isImeTraceEnabled(); + final Completable.Boolean value = Completable.createBoolean(); + mInputMethodManager.isImeTraceEnabled(ResultCallbacks.of(value)); + return Completable.getResult(value); } catch (RemoteException e) { Log.e(TAG, "Could not get ime trace status, defaulting to false.", e); } 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..88e28860fe3 100644 --- a/tests/robotests/src/com/android/settings/development/qstile/WinscopeTraceTest.java +++ b/tests/robotests/src/com/android/settings/development/qstile/WinscopeTraceTest.java @@ -37,6 +37,7 @@ import android.os.RemoteException; import android.view.IWindowManager; import android.widget.Toast; +import com.android.internal.inputmethod.IBooleanResultCallback; import com.android.internal.view.IInputMethodManager; import com.android.settings.testutils.shadow.ShadowParcel; @@ -68,6 +69,9 @@ public class WinscopeTraceTest { public void setUp() { MockitoAnnotations.initMocks(this); mWinscopeTrace = spy(new DevelopmentTiles.WinscopeTrace()); + // default ImeTraceEnabled value, prevent tests from actually calling into IMM and + // await the result forever. + doReturn(false).when(mWinscopeTrace).isImeTraceEnabled(); ReflectionHelpers.setField(mWinscopeTrace, "mWindowManager", mWindowManager); ReflectionHelpers.setField(mWinscopeTrace, "mInputMethodManager", mInputMethodManager); ReflectionHelpers.setField(mWinscopeTrace, "mSurfaceFlinger", mSurfaceFlinger); @@ -93,7 +97,6 @@ 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(); ShadowParcel.sReadBoolResult = true; assertThat(mWinscopeTrace.isEnabled()).isTrue(); verify(mSurfaceFlinger) @@ -114,7 +117,6 @@ public class WinscopeTraceTest { public void wmAndSfAndImmReturnTraceDisabled_shouldReturnDisabled() throws RemoteException { ShadowParcel.sReadBoolResult = false; doReturn(false).when(mWindowManager).isWindowTraceEnabled(); - doReturn(false).when(mInputMethodManager).isImeTraceEnabled(); assertThat(mWinscopeTrace.isEnabled()).isFalse(); verify(mSurfaceFlinger) .transact(eq(SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE), any(), any(), @@ -127,7 +129,7 @@ public class WinscopeTraceTest { throws RemoteException { ShadowParcel.sReadBoolResult = false; doReturn(false).when(mWindowManager).isWindowTraceEnabled(); - doReturn(true).when(mInputMethodManager).isImeTraceEnabled(); + doReturn(true).when(mWinscopeTrace).isImeTraceEnabled(); assertThat(mWinscopeTrace.isEnabled()).isTrue(); verify(mSurfaceFlinger) .transact(eq(SURFACE_FLINGER_LAYER_TRACE_STATUS_CODE), any(), any(), @@ -140,7 +142,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(mWinscopeTrace).isImeTraceEnabled(); assertThat(mWinscopeTrace.isEnabled()).isTrue(); } @@ -149,7 +151,6 @@ 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(); assertThat(mWinscopeTrace.isEnabled()).isFalse(); } @@ -167,7 +168,6 @@ public class WinscopeTraceTest { public void sfUnavailableAndWmAndImmReturnTraceDisabled_shouldReturnDisabled() throws RemoteException { doReturn(false).when(mWindowManager).isWindowTraceEnabled(); - doReturn(false).when(mInputMethodManager).isImeTraceEnabled(); ReflectionHelpers.setField(mWinscopeTrace, "mSurfaceFlinger", null); assertThat(mWinscopeTrace.isEnabled()).isFalse(); } @@ -251,7 +251,8 @@ public class WinscopeTraceTest { @Test public void setIsEnableAndImmThrowsRemoteException_shouldFailGracefully() throws RemoteException { - doThrow(new RemoteException("Unknown")).when(mInputMethodManager).isImeTraceEnabled(); + doThrow(new RemoteException("Unknown")).when(mInputMethodManager) + .isImeTraceEnabled(any(IBooleanResultCallback.Stub.class)); mWinscopeTrace.setIsEnabled(true); }