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

Commit 9cd69787 authored by Govinda Wasserman's avatar Govinda Wasserman
Browse files

Makes Assistant handles comply with a11y timeouts

Test: atest AssisthandleBehaviorControllerTest
BUG: 148142362
FIX: 148142362
Change-Id: Ia581fb357f65ba96948f7dae73bf49efe48b4d20
parent 1a1b5934
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.content.Context;
import android.os.Handler;
import android.os.SystemClock;
import android.util.Log;
import android.view.accessibility.AccessibilityManager;

import androidx.annotation.Nullable;

@@ -45,6 +46,8 @@ import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;

import dagger.Lazy;

/**
 * A class for managing Assistant handle logic.
 *
@@ -73,6 +76,7 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac
    private final Provider<AssistHandleViewController> mAssistHandleViewController;
    private final DeviceConfigHelper mDeviceConfigHelper;
    private final Map<AssistHandleBehavior, BehaviorController> mBehaviorMap;
    private final Lazy<AccessibilityManager> mA11yManager;

    private boolean mHandlesShowing = false;
    private long mHandlesLastHiddenAt;
@@ -93,6 +97,7 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac
            DeviceConfigHelper deviceConfigHelper,
            Map<AssistHandleBehavior, BehaviorController> behaviorMap,
            NavigationModeController navigationModeController,
            Lazy<AccessibilityManager> a11yManager,
            DumpManager dumpManager) {
        mContext = context;
        mAssistUtils = assistUtils;
@@ -100,6 +105,7 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac
        mAssistHandleViewController = assistHandleViewController;
        mDeviceConfigHelper = deviceConfigHelper;
        mBehaviorMap = behaviorMap;
        mA11yManager = a11yManager;

        mInGesturalMode = QuickStepContract.isGesturalMode(
                navigationModeController.addListener(this::handleNavigationModeChange));
@@ -211,9 +217,11 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac
    }

    private long getShowAndGoDuration() {
        return mDeviceConfigHelper.getLong(
        long configuredTime = mDeviceConfigHelper.getLong(
                SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOW_AND_GO_DURATION_MS,
                DEFAULT_SHOW_AND_GO_DURATION_MS);
        return mA11yManager.get().getRecommendedTimeoutMillis(
                (int) configuredTime, AccessibilityManager.FLAG_CONTENT_ICONS);
    }

    private String getBehaviorMode() {
@@ -291,7 +299,7 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac

        pw.println("   Phenotype Flags:");
        pw.println("      "
                + SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOW_AND_GO_DURATION_MS
                + SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOW_AND_GO_DURATION_MS + "(a11y modded)"
                + "="
                + getShowAndGoDuration());
        pw.println("      "
+28 −4
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.content.ComponentName;
import android.os.Handler;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.accessibility.AccessibilityManager;

import androidx.test.filters.SmallTest;

@@ -40,14 +41,13 @@ import com.android.internal.app.AssistUtils;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.statusbar.phone.NavigationModeController;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -73,15 +73,16 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase {
    @Mock private AssistHandleBehaviorController.BehaviorController mMockTestBehavior;
    @Mock private NavigationModeController mMockNavigationModeController;
    @Mock private AssistHandleViewController mMockAssistHandleViewController;
    @Mock private AccessibilityManager mMockA11yManager;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
        mDependency.injectMockDependency(StatusBarStateController.class);
        mDependency.injectMockDependency(OverviewProxyService.class);
        doAnswer(answerVoid(Runnable::run)).when(mMockHandler).post(any(Runnable.class));
        doAnswer(answerVoid(Runnable::run)).when(mMockHandler)
                .postDelayed(any(Runnable.class), anyLong());
        doAnswer(invocation -> invocation.getArgument(0)).when(mMockA11yManager)
                .getRecommendedTimeoutMillis(anyInt(), anyInt());

        Map<AssistHandleBehavior, AssistHandleBehaviorController.BehaviorController> behaviorMap =
                new EnumMap<>(AssistHandleBehavior.class);
@@ -99,6 +100,7 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase {
                        mMockDeviceConfigHelper,
                        behaviorMap,
                        mMockNavigationModeController,
                        () -> mMockA11yManager,
                        mock(DumpManager.class));
    }

@@ -242,6 +244,28 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase {
        verifyNoMoreInteractions(mMockAssistHandleViewController);
    }

    @Test
    public void showAndGo_usesA11yTimeout() {
        // Arrange
        when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
        when(mMockDeviceConfigHelper.getLong(
                eq(SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOW_AND_GO_DURATION_MS), anyLong()))
                .thenReturn(12345L);
        mAssistHandleBehaviorController.hide();
        reset(mMockAssistHandleViewController, mMockA11yManager);
        when(mMockA11yManager.getRecommendedTimeoutMillis(anyInt(), anyInt())).thenReturn(54321);
        ArgumentCaptor<Long> delay = ArgumentCaptor.forClass(Long.class);

        // Act
        mAssistHandleBehaviorController.showAndGo();

        // Assert
        verify(mMockA11yManager).getRecommendedTimeoutMillis(
                eq(12345), eq(AccessibilityManager.FLAG_CONTENT_ICONS));
        verify(mMockHandler).postDelayed(any(Runnable.class), delay.capture());
        assert delay.getValue() == 54321L;
    }

    @Test
    public void showAndGoDelayed_showsThenHidesHandlesWhenHiding() {
        // Arrange