Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a8021e33 authored by Wilson Wu's avatar Wilson Wu
Browse files

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
parent 1fae7f3f
Loading
Loading
Loading
Loading
+8 −18
Original line number Diff line number Diff line
@@ -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();
                mImeTracing.startImeTrace();
            } else {
                    mInputMethodManager.stopImeTrace();
                }
            } catch (RemoteException e) {
                Log.e(TAG, "Could not set ime trace status." + e.toString());
                mImeTracing.stopImeTrace();
            }
        }

+13 −24
Original line number Diff line number Diff line
@@ -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.
     */