diff options
4 files changed, 108 insertions, 52 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehavior.java b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehavior.java index e2c731314246..2eda3d784382 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehavior.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehavior.java @@ -16,31 +16,10 @@ package com.android.systemui.assist; - -import com.android.internal.annotations.VisibleForTesting; -import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController; - public enum AssistHandleBehavior { - TEST(new AssistHandleOffBehavior()), - OFF(new AssistHandleOffBehavior()), - LIKE_HOME(new AssistHandleLikeHomeBehavior()), - REMINDER_EXP(new AssistHandleReminderExpBehavior()); - - private BehaviorController mController; - - AssistHandleBehavior(BehaviorController controller) { - mController = controller; - } - - BehaviorController getController() { - return mController; - } - - @VisibleForTesting - void setTestController(BehaviorController controller) { - if (this.equals(TEST)) { - mController = controller; - } - } + TEST, + OFF, + LIKE_HOME, + REMINDER_EXP; } diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehaviorController.java b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehaviorController.java index 1aa47cc6d800..01deb03c466b 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehaviorController.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistHandleBehaviorController.java @@ -16,23 +16,27 @@ package com.android.systemui.assist; +import android.content.ComponentName; import android.content.Context; import android.os.Handler; import android.os.SystemClock; -import android.os.SystemProperties; import android.provider.DeviceConfig; import android.util.Log; import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.app.AssistUtils; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; +import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.Dependency; import com.android.systemui.ScreenDecorations; import com.android.systemui.SysUiServiceProvider; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.phone.NavigationModeController; +import java.util.EnumMap; +import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; @@ -46,10 +50,7 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac private static final String TAG = "AssistHandleBehavior"; - private static final String SHOWN_FREQUENCY_THRESHOLD_KEY = - "ASSIST_HANDLES_SHOWN_FREQUENCY_THRESHOLD_MS"; private static final long DEFAULT_SHOWN_FREQUENCY_THRESHOLD_MS = TimeUnit.SECONDS.toMillis(10); - private static final String SHOW_AND_GO_DURATION_KEY = "ASSIST_HANDLES_SHOW_AND_GO_DURATION_MS"; private static final long DEFAULT_SHOW_AND_GO_DURATION_MS = TimeUnit.SECONDS.toMillis(3); /** @@ -59,9 +60,12 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac private static final AssistHandleBehavior DEFAULT_BEHAVIOR = AssistHandleBehavior.REMINDER_EXP; private final Context mContext; + private final AssistUtils mAssistUtils; private final Handler mHandler; private final Runnable mHideHandles = this::hideHandles; private final Supplier<ScreenDecorations> mScreenDecorationsSupplier; + private final Map<AssistHandleBehavior, BehaviorController> mBehaviorMap = + new EnumMap<>(AssistHandleBehavior.class); private boolean mHandlesShowing = false; private long mHandlesLastHiddenAt; @@ -72,20 +76,33 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac private AssistHandleBehavior mCurrentBehavior = AssistHandleBehavior.OFF; private boolean mInGesturalMode; - AssistHandleBehaviorController(Context context, Handler handler) { - this(context, handler, () -> - SysUiServiceProvider.getComponent(context, ScreenDecorations.class)); + AssistHandleBehaviorController(Context context, AssistUtils assistUtils, Handler handler) { + this( + context, + assistUtils, + handler, () -> SysUiServiceProvider.getComponent(context, ScreenDecorations.class), + /* testBehavior = */ null); } @VisibleForTesting AssistHandleBehaviorController( Context context, + AssistUtils assistUtils, Handler handler, - Supplier<ScreenDecorations> screenDecorationsSupplier) { + Supplier<ScreenDecorations> screenDecorationsSupplier, + @Nullable BehaviorController testBehavior) { mContext = context; + mAssistUtils = assistUtils; mHandler = handler; mScreenDecorationsSupplier = screenDecorationsSupplier; + mBehaviorMap.put(AssistHandleBehavior.OFF, new AssistHandleOffBehavior()); + mBehaviorMap.put(AssistHandleBehavior.LIKE_HOME, new AssistHandleLikeHomeBehavior()); + mBehaviorMap.put(AssistHandleBehavior.REMINDER_EXP, new AssistHandleReminderExpBehavior()); + if (testBehavior != null) { + mBehaviorMap.put(AssistHandleBehavior.TEST, testBehavior); + } + mInGesturalMode = QuickStepContract.isGesturalMode( Dependency.get(NavigationModeController.class) .addListener(this::handleNavigationModeChange)); @@ -126,7 +143,7 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac } void onAssistantGesturePerformed() { - mCurrentBehavior.getController().onAssistantGesturePerformed(); + mBehaviorMap.get(mCurrentBehavior).onAssistantGesturePerformed(); } void setBehavior(AssistHandleBehavior behavior) { @@ -134,9 +151,14 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac return; } + if (!mBehaviorMap.containsKey(behavior)) { + Log.e(TAG, "Unsupported behavior requested: " + behavior.toString()); + return; + } + if (mInGesturalMode) { - mCurrentBehavior.getController().onModeDeactivated(); - behavior.getController().onModeActivated(mContext, this); + mBehaviorMap.get(mCurrentBehavior).onModeDeactivated(); + mBehaviorMap.get(behavior).onModeActivated(mContext, /* callbacks = */ this); } mCurrentBehavior = behavior; @@ -150,21 +172,26 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac } } + private boolean handlesUnblocked(boolean ignoreThreshold) { + long timeSinceHidden = SystemClock.elapsedRealtime() - mHandlesLastHiddenAt; + boolean notThrottled = ignoreThreshold || timeSinceHidden > getShownFrequencyThreshold(); + ComponentName assistantComponent = + mAssistUtils.getAssistComponentForUser(KeyguardUpdateMonitor.getCurrentUser()); + return notThrottled && assistantComponent != null; + } + private long getShownFrequencyThreshold() { - long configValue = DeviceConfig.getLong( + return DeviceConfig.getLong( DeviceConfig.NAMESPACE_SYSTEMUI, SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOWN_FREQUENCY_THRESHOLD_MS, DEFAULT_SHOWN_FREQUENCY_THRESHOLD_MS); - return SystemProperties.getLong( - SHOWN_FREQUENCY_THRESHOLD_KEY, configValue); } private long getShowAndGoDuration() { - long configValue = DeviceConfig.getLong( + return DeviceConfig.getLong( DeviceConfig.NAMESPACE_SYSTEMUI, SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOW_AND_GO_DURATION_MS, DEFAULT_SHOW_AND_GO_DURATION_MS); - return SystemProperties.getLong(SHOW_AND_GO_DURATION_KEY, configValue); } private void maybeShowHandles(boolean ignoreThreshold) { @@ -172,8 +199,7 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac return; } - long timeSinceHidden = SystemClock.elapsedRealtime() - mHandlesLastHiddenAt; - if (ignoreThreshold || timeSinceHidden > getShownFrequencyThreshold()) { + if (handlesUnblocked(ignoreThreshold)) { mHandlesShowing = true; ScreenDecorations screenDecorations = mScreenDecorationsSupplier.get(); if (screenDecorations == null) { @@ -207,9 +233,9 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac mInGesturalMode = inGesturalMode; if (mInGesturalMode) { - mCurrentBehavior.getController().onModeActivated(mContext, this); + mBehaviorMap.get(mCurrentBehavior).onModeActivated(mContext, /* callbacks = */ this); } else { - mCurrentBehavior.getController().onModeDeactivated(); + mBehaviorMap.get(mCurrentBehavior).onModeDeactivated(); hide(); } } diff --git a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java index 8cf836eddc28..2fc79d618546 100644 --- a/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java +++ b/packages/SystemUI/src/com/android/systemui/assist/AssistManager.java @@ -149,7 +149,8 @@ public class AssistManager implements ConfigurationChangedReceiver { mAssistUtils = new AssistUtils(context); mAssistDisclosure = new AssistDisclosure(context, new Handler()); mPhoneStateMonitor = new PhoneStateMonitor(context); - mHandleController = new AssistHandleBehaviorController(context, new Handler()); + mHandleController = + new AssistHandleBehaviorController(context, mAssistUtils, new Handler()); registerVoiceInteractionSessionListener(); mInterestingConfigChanges = new InterestingConfigChanges(ActivityInfo.CONFIG_ORIENTATION diff --git a/packages/SystemUI/tests/src/com/android/systemui/assist/AssistHandleBehaviorControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/assist/AssistHandleBehaviorControllerTest.java index 13c92b605c03..18f114a71a8d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/assist/AssistHandleBehaviorControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/assist/AssistHandleBehaviorControllerTest.java @@ -18,21 +18,27 @@ package com.android.systemui.assist; import static org.mockito.AdditionalAnswers.answerVoid; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; +import android.content.ComponentName; import android.os.Handler; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; import androidx.test.filters.SmallTest; +import com.android.internal.app.AssistUtils; import com.android.systemui.ScreenDecorations; import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.recents.OverviewProxyService; import org.junit.Before; import org.junit.Test; @@ -46,29 +52,35 @@ import org.mockito.MockitoAnnotations; @RunWithLooper public class AssistHandleBehaviorControllerTest extends SysuiTestCase { - private final AssistHandleBehavior mTestBehavior = AssistHandleBehavior.TEST; + private static final ComponentName COMPONENT_NAME = new ComponentName("", ""); private AssistHandleBehaviorController mAssistHandleBehaviorController; @Mock private ScreenDecorations mMockScreenDecorations; + @Mock private AssistUtils mMockAssistUtils; @Mock private Handler mMockHandler; @Mock private AssistHandleBehaviorController.BehaviorController mMockBehaviorController; @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()); - mTestBehavior.setTestController(mMockBehaviorController); mAssistHandleBehaviorController = new AssistHandleBehaviorController( - mContext, mMockHandler, () -> mMockScreenDecorations); + mContext, + mMockAssistUtils, + mMockHandler, () -> mMockScreenDecorations, + mMockBehaviorController); } @Test public void hide_hidesHandlesWhenShowing() { // Arrange + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); mAssistHandleBehaviorController.showAndStay(); reset(mMockScreenDecorations); @@ -83,6 +95,7 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase { @Test public void hide_doesNothingWhenHiding() { // Arrange + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); mAssistHandleBehaviorController.hide(); reset(mMockScreenDecorations); @@ -96,6 +109,7 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase { @Test public void showAndStay_showsHandlesWhenHiding() { // Arrange + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); mAssistHandleBehaviorController.hide(); reset(mMockScreenDecorations); @@ -110,6 +124,7 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase { @Test public void showAndStay_doesNothingWhenShowing() { // Arrange + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); mAssistHandleBehaviorController.showAndStay(); reset(mMockScreenDecorations); @@ -121,8 +136,23 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase { } @Test + public void showAndStay_doesNothingWhenThereIsNoAssistant() { + // Arrange + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(null); + mAssistHandleBehaviorController.hide(); + reset(mMockScreenDecorations); + + // Act + mAssistHandleBehaviorController.showAndStay(); + + // Assert + verifyNoMoreInteractions(mMockScreenDecorations); + } + + @Test public void showAndGo_showsThenHidesHandlesWhenHiding() { // Arrange + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); mAssistHandleBehaviorController.hide(); reset(mMockScreenDecorations); @@ -139,6 +169,7 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase { @Test public void showAndGo_hidesHandlesAfterTimeoutWhenShowing() { // Arrange + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); mAssistHandleBehaviorController.showAndStay(); reset(mMockScreenDecorations); @@ -153,6 +184,7 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase { @Test public void showAndGo_doesNothingIfRecentlyHidden() { // Arrange + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); mAssistHandleBehaviorController.showAndGo(); reset(mMockScreenDecorations); @@ -164,12 +196,27 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase { } @Test + public void showAndGo_doesNothingWhenThereIsNoAssistant() { + // Arrange + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(null); + mAssistHandleBehaviorController.hide(); + reset(mMockScreenDecorations); + + // Act + mAssistHandleBehaviorController.showAndGo(); + + // Assert + verifyNoMoreInteractions(mMockScreenDecorations); + } + + @Test public void setBehavior_activatesTheBehaviorWhenInGesturalMode() { // Arrange + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); mAssistHandleBehaviorController.setInGesturalModeForTest(true); // Act - mAssistHandleBehaviorController.setBehavior(mTestBehavior); + mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.TEST); // Assert verify(mMockBehaviorController).onModeActivated(mContext, mAssistHandleBehaviorController); @@ -179,8 +226,10 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase { @Test public void setBehavior_deactivatesThePreviousBehaviorWhenInGesturalMode() { // Arrange - mAssistHandleBehaviorController.setBehavior(mTestBehavior); + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); + mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.TEST); mAssistHandleBehaviorController.setInGesturalModeForTest(true); + reset(mMockBehaviorController); // Act mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.OFF); @@ -193,10 +242,11 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase { @Test public void setBehavior_doesNothingWhenNotInGesturalMode() { // Arrange + when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); mAssistHandleBehaviorController.setInGesturalModeForTest(false); // Act - mAssistHandleBehaviorController.setBehavior(mTestBehavior); + mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.TEST); // Assert verifyNoMoreInteractions(mMockBehaviorController); |