Merge "Trigger doze detection using WakefulnessLifecycle" into qt-qpr1-dev

am: 17f9fb422c

Change-Id: I1b0d431c1de7d861d14edd649bedd525afe66a86
This commit is contained in:
Govinda Wasserman
2019-09-12 09:22:26 -07:00
committed by android-build-merger
11 changed files with 628 additions and 108 deletions

View File

@@ -20,6 +20,7 @@ import android.annotation.Nullable;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import com.android.systemui.assist.AssistModule;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.phone.KeyguardLiftController; import com.android.systemui.statusbar.phone.KeyguardLiftController;
import com.android.systemui.util.AsyncSensorManager; import com.android.systemui.util.AsyncSensorManager;
@@ -33,7 +34,7 @@ import dagger.Provides;
* A dagger module for injecting components of System UI that are not overridden by the System UI * A dagger module for injecting components of System UI that are not overridden by the System UI
* implementation. * implementation.
*/ */
@Module @Module(includes = {AssistModule.class})
public abstract class SystemUIModule { public abstract class SystemUIModule {
@Singleton @Singleton

View File

@@ -16,6 +16,8 @@
package com.android.systemui.assist; package com.android.systemui.assist;
import static com.android.systemui.assist.AssistModule.ASSIST_HANDLE_THREAD_NAME;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.os.Handler; import android.os.Handler;
@@ -28,20 +30,21 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.AssistUtils; import com.android.internal.app.AssistUtils;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.Dependency;
import com.android.systemui.DumpController; import com.android.systemui.DumpController;
import com.android.systemui.Dumpable; import com.android.systemui.Dumpable;
import com.android.systemui.ScreenDecorations; import com.android.systemui.ScreenDecorations;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.statusbar.phone.NavigationModeController; import com.android.systemui.statusbar.phone.NavigationModeController;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.EnumMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Provider;
import javax.inject.Singleton;
/** /**
* A class for managing Assistant handle logic. * A class for managing Assistant handle logic.
@@ -49,6 +52,7 @@ import java.util.function.Supplier;
* Controls when visual handles for Assistant gesture affordance should be shown or hidden using an * Controls when visual handles for Assistant gesture affordance should be shown or hidden using an
* {@link AssistHandleBehavior}. * {@link AssistHandleBehavior}.
*/ */
@Singleton
public final class AssistHandleBehaviorController implements AssistHandleCallbacks, Dumpable { public final class AssistHandleBehaviorController implements AssistHandleCallbacks, Dumpable {
private static final String TAG = "AssistHandleBehavior"; private static final String TAG = "AssistHandleBehavior";
@@ -67,10 +71,9 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac
private final Handler mHandler; private final Handler mHandler;
private final Runnable mHideHandles = this::hideHandles; private final Runnable mHideHandles = this::hideHandles;
private final Runnable mShowAndGo = this::showAndGoInternal; private final Runnable mShowAndGo = this::showAndGoInternal;
private final Supplier<ScreenDecorations> mScreenDecorationsSupplier; private final Provider<ScreenDecorations> mScreenDecorations;
private final PhenotypeHelper mPhenotypeHelper; private final PhenotypeHelper mPhenotypeHelper;
private final Map<AssistHandleBehavior, BehaviorController> mBehaviorMap = private final Map<AssistHandleBehavior, BehaviorController> mBehaviorMap;
new EnumMap<>(AssistHandleBehavior.class);
private boolean mHandlesShowing = false; private boolean mHandlesShowing = false;
private long mHandlesLastHiddenAt; private long mHandlesLastHiddenAt;
@@ -82,41 +85,25 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac
private AssistHandleBehavior mCurrentBehavior = AssistHandleBehavior.OFF; private AssistHandleBehavior mCurrentBehavior = AssistHandleBehavior.OFF;
private boolean mInGesturalMode; private boolean mInGesturalMode;
AssistHandleBehaviorController(Context context, AssistUtils assistUtils, Handler handler) { @Inject
this(
context,
assistUtils,
handler,
() -> SysUiServiceProvider.getComponent(context, ScreenDecorations.class),
new PhenotypeHelper(),
/* testBehavior = */ null);
}
@VisibleForTesting
AssistHandleBehaviorController( AssistHandleBehaviorController(
Context context, Context context,
AssistUtils assistUtils, AssistUtils assistUtils,
Handler handler, @Named(ASSIST_HANDLE_THREAD_NAME) Handler handler,
Supplier<ScreenDecorations> screenDecorationsSupplier, Provider<ScreenDecorations> screenDecorations,
PhenotypeHelper phenotypeHelper, PhenotypeHelper phenotypeHelper,
@Nullable BehaviorController testBehavior) { Map<AssistHandleBehavior, BehaviorController> behaviorMap,
NavigationModeController navigationModeController,
DumpController dumpController) {
mContext = context; mContext = context;
mAssistUtils = assistUtils; mAssistUtils = assistUtils;
mHandler = handler; mHandler = handler;
mScreenDecorationsSupplier = screenDecorationsSupplier; mScreenDecorations = screenDecorations;
mPhenotypeHelper = phenotypeHelper; mPhenotypeHelper = phenotypeHelper;
mBehaviorMap.put(AssistHandleBehavior.OFF, new AssistHandleOffBehavior()); mBehaviorMap = behaviorMap;
mBehaviorMap.put(AssistHandleBehavior.LIKE_HOME, new AssistHandleLikeHomeBehavior());
mBehaviorMap.put(
AssistHandleBehavior.REMINDER_EXP,
new AssistHandleReminderExpBehavior(handler, phenotypeHelper));
if (testBehavior != null) {
mBehaviorMap.put(AssistHandleBehavior.TEST, testBehavior);
}
mInGesturalMode = QuickStepContract.isGesturalMode( mInGesturalMode = QuickStepContract.isGesturalMode(
Dependency.get(NavigationModeController.class) navigationModeController.addListener(this::handleNavigationModeChange));
.addListener(this::handleNavigationModeChange));
setBehavior(getBehaviorMode()); setBehavior(getBehaviorMode());
mPhenotypeHelper.addOnPropertiesChangedListener( mPhenotypeHelper.addOnPropertiesChangedListener(
@@ -128,7 +115,8 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac
SystemUiDeviceConfigFlags.ASSIST_HANDLES_BEHAVIOR_MODE, null)); SystemUiDeviceConfigFlags.ASSIST_HANDLES_BEHAVIOR_MODE, null));
} }
}); });
Dependency.get(DumpController.class).addListener(this);
dumpController.addListener(this);
} }
@Override // AssistHandleCallbacks @Override // AssistHandleCallbacks
@@ -241,7 +229,7 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac
} }
if (handlesUnblocked(ignoreThreshold)) { if (handlesUnblocked(ignoreThreshold)) {
ScreenDecorations screenDecorations = mScreenDecorationsSupplier.get(); ScreenDecorations screenDecorations = mScreenDecorations.get();
if (screenDecorations == null) { if (screenDecorations == null) {
Log.w(TAG, "Couldn't show handles, ScreenDecorations unavailable"); Log.w(TAG, "Couldn't show handles, ScreenDecorations unavailable");
} else { } else {
@@ -256,7 +244,7 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac
return; return;
} }
ScreenDecorations screenDecorations = mScreenDecorationsSupplier.get(); ScreenDecorations screenDecorations = mScreenDecorations.get();
if (screenDecorations == null) { if (screenDecorations == null) {
Log.w(TAG, "Couldn't hide handles, ScreenDecorations unavailable"); Log.w(TAG, "Couldn't hide handles, ScreenDecorations unavailable");
} else { } else {

View File

@@ -20,25 +20,45 @@ import android.content.Context;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.android.systemui.Dependency;
import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController; import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.QuickStepContract;
import java.io.PrintWriter; import java.io.PrintWriter;
import javax.inject.Inject;
import javax.inject.Singleton;
import dagger.Lazy;
/** /**
* Assistant Handle behavior that makes Assistant handles show/hide when the home handle is * Assistant Handle behavior that makes Assistant handles show/hide when the home handle is
* shown/hidden, respectively. * shown/hidden, respectively.
*/ */
@Singleton
final class AssistHandleLikeHomeBehavior implements BehaviorController { final class AssistHandleLikeHomeBehavior implements BehaviorController {
private final StatusBarStateController.StateListener mStatusBarStateListener = private final WakefulnessLifecycle.Observer mWakefulnessLifecycleObserver =
new StatusBarStateController.StateListener() { new WakefulnessLifecycle.Observer() {
@Override @Override
public void onDozingChanged(boolean isDozing) { public void onStartedWakingUp() {
handleDozingChanged(isDozing); handleDozingChanged(/* isDozing = */ true);
}
@Override
public void onFinishedWakingUp() {
handleDozingChanged(/* isDozing = */ false);
}
@Override
public void onStartedGoingToSleep() {
handleDozingChanged(/* isDozing = */ true);
}
@Override
public void onFinishedGoingToSleep() {
handleDozingChanged(/* isDozing = */ true);
} }
}; };
private final OverviewProxyService.OverviewProxyListener mOverviewProxyListener = private final OverviewProxyService.OverviewProxyListener mOverviewProxyListener =
@@ -48,32 +68,39 @@ final class AssistHandleLikeHomeBehavior implements BehaviorController {
handleSystemUiStateChange(sysuiStateFlags); handleSystemUiStateChange(sysuiStateFlags);
} }
}; };
private final StatusBarStateController mStatusBarStateController;
private final OverviewProxyService mOverviewProxyService;
private final Lazy<WakefulnessLifecycle> mWakefulnessLifecycle;
private final Lazy<OverviewProxyService> mOverviewProxyService;
private boolean mIsDozing; private boolean mIsDozing;
private boolean mIsHomeHandleHiding; private boolean mIsHomeHandleHiding;
@Nullable private AssistHandleCallbacks mAssistHandleCallbacks; @Nullable private AssistHandleCallbacks mAssistHandleCallbacks;
AssistHandleLikeHomeBehavior() { @Inject
mStatusBarStateController = Dependency.get(StatusBarStateController.class); AssistHandleLikeHomeBehavior(
mOverviewProxyService = Dependency.get(OverviewProxyService.class); Lazy<WakefulnessLifecycle> wakefulnessLifecycle,
Lazy<OverviewProxyService> overviewProxyService) {
mWakefulnessLifecycle = wakefulnessLifecycle;
mOverviewProxyService = overviewProxyService;
} }
@Override @Override
public void onModeActivated(Context context, AssistHandleCallbacks callbacks) { public void onModeActivated(Context context, AssistHandleCallbacks callbacks) {
mAssistHandleCallbacks = callbacks; mAssistHandleCallbacks = callbacks;
mIsDozing = mStatusBarStateController.isDozing(); mIsDozing = mWakefulnessLifecycle.get().getWakefulness()
mStatusBarStateController.addCallback(mStatusBarStateListener); != WakefulnessLifecycle.WAKEFULNESS_AWAKE;
mOverviewProxyService.addCallback(mOverviewProxyListener); mWakefulnessLifecycle.get().addObserver(mWakefulnessLifecycleObserver);
mOverviewProxyService.get().addCallback(mOverviewProxyListener);
callbackForCurrentState(); callbackForCurrentState();
} }
@Override @Override
public void onModeDeactivated() { public void onModeDeactivated() {
mAssistHandleCallbacks = null; mAssistHandleCallbacks = null;
mOverviewProxyService.removeCallback(mOverviewProxyListener); mWakefulnessLifecycle.get().removeObserver(mWakefulnessLifecycleObserver);
mOverviewProxyService.get().removeCallback(mOverviewProxyListener);
} }
private static boolean isHomeHandleHiding(int sysuiStateFlags) { private static boolean isHomeHandleHiding(int sysuiStateFlags) {

View File

@@ -20,9 +20,17 @@ import android.content.Context;
import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController; import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController;
import javax.inject.Inject;
import javax.inject.Singleton;
/** Assistant handle behavior that hides the Assistant handles. */ /** Assistant handle behavior that hides the Assistant handles. */
@Singleton
final class AssistHandleOffBehavior implements BehaviorController { final class AssistHandleOffBehavior implements BehaviorController {
@Inject
AssistHandleOffBehavior() {
}
@Override @Override
public void onModeActivated(Context context, AssistHandleCallbacks callbacks) { public void onModeActivated(Context context, AssistHandleCallbacks callbacks) {
callbacks.hide(); callbacks.hide();

View File

@@ -16,6 +16,9 @@
package com.android.systemui.assist; package com.android.systemui.assist;
import static com.android.systemui.assist.AssistModule.ASSIST_HANDLE_THREAD_NAME;
import static com.android.systemui.assist.AssistModule.UPTIME_NAME;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.ComponentName; import android.content.ComponentName;
@@ -24,14 +27,14 @@ import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo;
import android.os.Handler; import android.os.Handler;
import android.os.SystemClock;
import android.provider.Settings; import android.provider.Settings;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.slice.Clock;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.systemui.Dependency;
import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController; import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.ActivityManagerWrapper;
@@ -46,11 +49,18 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import javax.inject.Named;
import javax.inject.Singleton;
import dagger.Lazy;
/** /**
* Assistant handle behavior that hides the handles when the phone is dozing or in immersive mode, * Assistant handle behavior that hides the handles when the phone is dozing or in immersive mode,
* shows the handles when on lockscreen, and shows the handles temporarily when changing tasks or * shows the handles when on lockscreen, and shows the handles temporarily when changing tasks or
* entering overview. * entering overview.
*/ */
@Singleton
final class AssistHandleReminderExpBehavior implements BehaviorController { final class AssistHandleReminderExpBehavior implements BehaviorController {
private static final String LEARNING_TIME_ELAPSED_KEY = "reminder_exp_learning_time_elapsed"; private static final String LEARNING_TIME_ELAPSED_KEY = "reminder_exp_learning_time_elapsed";
@@ -83,11 +93,6 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
public void onStateChanged(int newState) { public void onStateChanged(int newState) {
handleStatusBarStateChanged(newState); handleStatusBarStateChanged(newState);
} }
@Override
public void onDozingChanged(boolean isDozing) {
handleDozingChanged(isDozing);
}
}; };
private final TaskStackChangeListener mTaskStackChangeListener = private final TaskStackChangeListener mTaskStackChangeListener =
new TaskStackChangeListener() { new TaskStackChangeListener() {
@@ -113,6 +118,18 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
handleSystemUiStateChanged(sysuiStateFlags); handleSystemUiStateChanged(sysuiStateFlags);
} }
}; };
private final WakefulnessLifecycle.Observer mWakefulnessLifecycleObserver =
new WakefulnessLifecycle.Observer() {
@Override
public void onFinishedWakingUp() {
handleDozingChanged(false);
}
@Override
public void onStartedGoingToSleep() {
handleDozingChanged(true);
}
};
private final BroadcastReceiver mDefaultHomeBroadcastReceiver = new BroadcastReceiver() { private final BroadcastReceiver mDefaultHomeBroadcastReceiver = new BroadcastReceiver() {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
@@ -122,11 +139,14 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
private final IntentFilter mDefaultHomeIntentFilter; private final IntentFilter mDefaultHomeIntentFilter;
private final Runnable mResetConsecutiveTaskSwitches = this::resetConsecutiveTaskSwitches; private final Runnable mResetConsecutiveTaskSwitches = this::resetConsecutiveTaskSwitches;
private final Clock mClock;
private final Handler mHandler; private final Handler mHandler;
private final PhenotypeHelper mPhenotypeHelper; private final PhenotypeHelper mPhenotypeHelper;
private final StatusBarStateController mStatusBarStateController; private final Lazy<StatusBarStateController> mStatusBarStateController;
private final ActivityManagerWrapper mActivityManagerWrapper; private final Lazy<ActivityManagerWrapper> mActivityManagerWrapper;
private final OverviewProxyService mOverviewProxyService; private final Lazy<OverviewProxyService> mOverviewProxyService;
private final Lazy<WakefulnessLifecycle> mWakefulnessLifecycle;
private final Lazy<PackageManagerWrapper> mPackageManagerWrapper;
private boolean mOnLockscreen; private boolean mOnLockscreen;
private boolean mIsDozing; private boolean mIsDozing;
@@ -148,12 +168,24 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
@Nullable private AssistHandleCallbacks mAssistHandleCallbacks; @Nullable private AssistHandleCallbacks mAssistHandleCallbacks;
@Nullable private ComponentName mDefaultHome; @Nullable private ComponentName mDefaultHome;
AssistHandleReminderExpBehavior(Handler handler, PhenotypeHelper phenotypeHelper) { @Inject
AssistHandleReminderExpBehavior(
@Named(UPTIME_NAME) Clock clock,
@Named(ASSIST_HANDLE_THREAD_NAME) Handler handler,
PhenotypeHelper phenotypeHelper,
Lazy<StatusBarStateController> statusBarStateController,
Lazy<ActivityManagerWrapper> activityManagerWrapper,
Lazy<OverviewProxyService> overviewProxyService,
Lazy<WakefulnessLifecycle> wakefulnessLifecycle,
Lazy<PackageManagerWrapper> packageManagerWrapper) {
mClock = clock;
mHandler = handler; mHandler = handler;
mPhenotypeHelper = phenotypeHelper; mPhenotypeHelper = phenotypeHelper;
mStatusBarStateController = Dependency.get(StatusBarStateController.class); mStatusBarStateController = statusBarStateController;
mActivityManagerWrapper = ActivityManagerWrapper.getInstance(); mActivityManagerWrapper = activityManagerWrapper;
mOverviewProxyService = Dependency.get(OverviewProxyService.class); mOverviewProxyService = overviewProxyService;
mWakefulnessLifecycle = wakefulnessLifecycle;
mPackageManagerWrapper = packageManagerWrapper;
mDefaultHomeIntentFilter = new IntentFilter(); mDefaultHomeIntentFilter = new IntentFilter();
for (String action : DEFAULT_HOME_CHANGE_ACTIONS) { for (String action : DEFAULT_HOME_CHANGE_ACTIONS) {
mDefaultHomeIntentFilter.addAction(action); mDefaultHomeIntentFilter.addAction(action);
@@ -167,13 +199,16 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
mConsecutiveTaskSwitches = 0; mConsecutiveTaskSwitches = 0;
mDefaultHome = getCurrentDefaultHome(); mDefaultHome = getCurrentDefaultHome();
context.registerReceiver(mDefaultHomeBroadcastReceiver, mDefaultHomeIntentFilter); context.registerReceiver(mDefaultHomeBroadcastReceiver, mDefaultHomeIntentFilter);
mOnLockscreen = onLockscreen(mStatusBarStateController.getState()); mOnLockscreen = onLockscreen(mStatusBarStateController.get().getState());
mIsDozing = mStatusBarStateController.isDozing(); mStatusBarStateController.get().addCallback(mStatusBarStateListener);
mStatusBarStateController.addCallback(mStatusBarStateListener); ActivityManager.RunningTaskInfo runningTaskInfo =
ActivityManager.RunningTaskInfo runningTaskInfo = mActivityManagerWrapper.getRunningTask(); mActivityManagerWrapper.get().getRunningTask();
mRunningTaskId = runningTaskInfo == null ? 0 : runningTaskInfo.taskId; mRunningTaskId = runningTaskInfo == null ? 0 : runningTaskInfo.taskId;
mActivityManagerWrapper.registerTaskStackListener(mTaskStackChangeListener); mActivityManagerWrapper.get().registerTaskStackListener(mTaskStackChangeListener);
mOverviewProxyService.addCallback(mOverviewProxyListener); mOverviewProxyService.get().addCallback(mOverviewProxyListener);
mIsDozing = mWakefulnessLifecycle.get().getWakefulness()
!= WakefulnessLifecycle.WAKEFULNESS_AWAKE;
mWakefulnessLifecycle.get().addObserver(mWakefulnessLifecycleObserver);
mLearningTimeElapsed = Settings.Secure.getLong( mLearningTimeElapsed = Settings.Secure.getLong(
context.getContentResolver(), LEARNING_TIME_ELAPSED_KEY, /* default = */ 0); context.getContentResolver(), LEARNING_TIME_ELAPSED_KEY, /* default = */ 0);
@@ -181,7 +216,7 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
context.getContentResolver(), LEARNING_EVENT_COUNT_KEY, /* default = */ 0); context.getContentResolver(), LEARNING_EVENT_COUNT_KEY, /* default = */ 0);
mLearnedHintLastShownEpochDay = Settings.Secure.getLong( mLearnedHintLastShownEpochDay = Settings.Secure.getLong(
context.getContentResolver(), LEARNED_HINT_LAST_SHOWN_KEY, /* default = */ 0); context.getContentResolver(), LEARNED_HINT_LAST_SHOWN_KEY, /* default = */ 0);
mLastLearningTimestamp = SystemClock.uptimeMillis(); mLastLearningTimestamp = mClock.currentTimeMillis();
callbackForCurrentState(/* justUnlocked = */ false); callbackForCurrentState(/* justUnlocked = */ false);
} }
@@ -196,9 +231,10 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
Settings.Secure.putLong(mContext.getContentResolver(), LEARNED_HINT_LAST_SHOWN_KEY, 0); Settings.Secure.putLong(mContext.getContentResolver(), LEARNED_HINT_LAST_SHOWN_KEY, 0);
mContext = null; mContext = null;
} }
mStatusBarStateController.removeCallback(mStatusBarStateListener); mStatusBarStateController.get().removeCallback(mStatusBarStateListener);
mActivityManagerWrapper.unregisterTaskStackListener(mTaskStackChangeListener); mActivityManagerWrapper.get().unregisterTaskStackListener(mTaskStackChangeListener);
mOverviewProxyService.removeCallback(mOverviewProxyListener); mOverviewProxyService.get().removeCallback(mOverviewProxyListener);
mWakefulnessLifecycle.get().removeObserver(mWakefulnessLifecycleObserver);
} }
@Override @Override
@@ -218,15 +254,10 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
} }
} }
private static boolean isNavBarHidden(int sysuiStateFlags) {
return (sysuiStateFlags & QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN) != 0;
}
@Nullable @Nullable
private static ComponentName getCurrentDefaultHome() { private ComponentName getCurrentDefaultHome() {
List<ResolveInfo> homeActivities = new ArrayList<>(); List<ResolveInfo> homeActivities = new ArrayList<>();
ComponentName defaultHome = ComponentName defaultHome = mPackageManagerWrapper.get().getHomeActivities(homeActivities);
PackageManagerWrapper.getInstance().getHomeActivities(homeActivities);
if (defaultHome != null) { if (defaultHome != null) {
return defaultHome; return defaultHome;
} }
@@ -282,7 +313,8 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
} }
private void handleSystemUiStateChanged(int sysuiStateFlags) { private void handleSystemUiStateChanged(int sysuiStateFlags) {
boolean isNavBarHidden = isNavBarHidden(sysuiStateFlags); boolean isNavBarHidden =
(sysuiStateFlags & QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN) != 0;
if (mIsNavBarHidden == isNavBarHidden) { if (mIsNavBarHidden == isNavBarHidden) {
return; return;
} }
@@ -369,21 +401,15 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
return; return;
} }
long currentTimestamp = SystemClock.uptimeMillis(); long currentTimestamp = mClock.currentTimeMillis();
mLearningTimeElapsed += currentTimestamp - mLastLearningTimestamp; mLearningTimeElapsed += currentTimestamp - mLastLearningTimestamp;
mLastLearningTimestamp = currentTimestamp; mLastLearningTimestamp = currentTimestamp;
mIsLearned = mIsLearned =
mLearningCount >= getLearningCount() || mLearningTimeElapsed >= getLearningTimeMs(); mLearningCount >= getLearningCount() || mLearningTimeElapsed >= getLearningTimeMs();
mHandler.post(this::recordLearnTimeElapsed); mHandler.post(() -> Settings.Secure.putLong(
} mContext.getContentResolver(), LEARNING_TIME_ELAPSED_KEY, mLearningTimeElapsed));
private void recordLearnTimeElapsed() {
if (mContext != null) {
Settings.Secure.putLong(
mContext.getContentResolver(), LEARNING_TIME_ELAPSED_KEY, mLearningTimeElapsed);
}
} }
private void resetConsecutiveTaskSwitches() { private void resetConsecutiveTaskSwitches() {

View File

@@ -19,7 +19,6 @@ import android.os.AsyncTask;
import android.os.Binder; import android.os.Binder;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerThread;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.SystemClock; import android.os.SystemClock;
import android.os.UserHandle; import android.os.UserHandle;
@@ -155,17 +154,18 @@ public class AssistManager implements ConfigurationChangedReceiver {
}; };
@Inject @Inject
public AssistManager(DeviceProvisionedController controller, Context context) { public AssistManager(
DeviceProvisionedController controller,
Context context,
AssistUtils assistUtils,
AssistHandleBehaviorController handleController) {
mContext = context; mContext = context;
mDeviceProvisionedController = controller; mDeviceProvisionedController = controller;
mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
mAssistUtils = new AssistUtils(context); mAssistUtils = assistUtils;
mAssistDisclosure = new AssistDisclosure(context, new Handler()); mAssistDisclosure = new AssistDisclosure(context, new Handler());
mPhoneStateMonitor = new PhoneStateMonitor(context); mPhoneStateMonitor = new PhoneStateMonitor(context);
final HandlerThread assistHandleThread = new HandlerThread("AssistHandleThread"); mHandleController = handleController;
assistHandleThread.start();
mHandleController = new AssistHandleBehaviorController(
context, mAssistUtils, assistHandleThread.getThreadHandler());
registerVoiceInteractionSessionListener(); registerVoiceInteractionSessionListener();
mInterestingConfigChanges = new InterestingConfigChanges(ActivityInfo.CONFIG_ORIENTATION mInterestingConfigChanges = new InterestingConfigChanges(ActivityInfo.CONFIG_ORIENTATION

View File

@@ -0,0 +1,88 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.assist;
import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.SystemClock;
import androidx.slice.Clock;
import com.android.internal.app.AssistUtils;
import com.android.systemui.ScreenDecorations;
import com.android.systemui.SysUiServiceProvider;
import java.util.EnumMap;
import java.util.Map;
import javax.inject.Named;
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
/** Module for dagger injections related to the Assistant. */
@Module
public abstract class AssistModule {
static final String ASSIST_HANDLE_THREAD_NAME = "assist_handle_thread";
static final String UPTIME_NAME = "uptime";
@Provides
@Singleton
@Named(ASSIST_HANDLE_THREAD_NAME)
static Handler provideBackgroundHandler() {
final HandlerThread backgroundHandlerThread =
new HandlerThread("AssistHandleThread");
backgroundHandlerThread.start();
return backgroundHandlerThread.getThreadHandler();
}
@Provides
@Singleton
static Map<AssistHandleBehavior, AssistHandleBehaviorController.BehaviorController>
provideAssistHandleBehaviorControllerMap(
AssistHandleOffBehavior offBehavior,
AssistHandleLikeHomeBehavior likeHomeBehavior,
AssistHandleReminderExpBehavior reminderExpBehavior) {
Map<AssistHandleBehavior, AssistHandleBehaviorController.BehaviorController> map =
new EnumMap<>(AssistHandleBehavior.class);
map.put(AssistHandleBehavior.OFF, offBehavior);
map.put(AssistHandleBehavior.LIKE_HOME, likeHomeBehavior);
map.put(AssistHandleBehavior.REMINDER_EXP, reminderExpBehavior);
return map;
}
@Provides
static ScreenDecorations provideScreenDecorations(Context context) {
return SysUiServiceProvider.getComponent(context, ScreenDecorations.class);
}
@Provides
@Singleton
static AssistUtils provideAssistUtils(Context context) {
return new AssistUtils(context);
}
@Provides
@Singleton
@Named(UPTIME_NAME)
static Clock provideSystemClock() {
return SystemClock::uptimeMillis;
}
}

View File

@@ -22,8 +22,18 @@ import androidx.annotation.Nullable;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import javax.inject.Inject;
import javax.inject.Singleton;
/**
* Wrapper class for retrieving phenotype flag values.
*
* Can be mocked in tests for ease of testing the effects of particular values.
*/
@Singleton
public class PhenotypeHelper { public class PhenotypeHelper {
@Inject
public PhenotypeHelper() {} public PhenotypeHelper() {}
public long getLong(String name, long defaultValue) { public long getLong(String name, long defaultValue) {

View File

@@ -37,10 +37,12 @@ import androidx.test.filters.SmallTest;
import com.android.internal.app.AssistUtils; import com.android.internal.app.AssistUtils;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags; import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.systemui.DumpController;
import com.android.systemui.ScreenDecorations; import com.android.systemui.ScreenDecorations;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.recents.OverviewProxyService; import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.statusbar.phone.NavigationModeController;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@@ -50,6 +52,9 @@ import org.mockito.InOrder;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.MockitoAnnotations; import org.mockito.MockitoAnnotations;
import java.util.EnumMap;
import java.util.Map;
@SmallTest @SmallTest
@RunWith(AndroidTestingRunner.class) @RunWith(AndroidTestingRunner.class)
@RunWithLooper @RunWithLooper
@@ -63,7 +68,12 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase {
@Mock private AssistUtils mMockAssistUtils; @Mock private AssistUtils mMockAssistUtils;
@Mock private Handler mMockHandler; @Mock private Handler mMockHandler;
@Mock private PhenotypeHelper mMockPhenotypeHelper; @Mock private PhenotypeHelper mMockPhenotypeHelper;
@Mock private AssistHandleBehaviorController.BehaviorController mMockBehaviorController; @Mock private AssistHandleOffBehavior mMockOffBehavior;
@Mock private AssistHandleLikeHomeBehavior mMockLikeHomeBehavior;
@Mock private AssistHandleReminderExpBehavior mMockReminderExpBehavior;
@Mock private AssistHandleBehaviorController.BehaviorController mMockTestBehavior;
@Mock private NavigationModeController mMockNavigationModeController;
@Mock private DumpController mMockDumpController;
@Before @Before
public void setup() { public void setup() {
@@ -74,13 +84,23 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase {
doAnswer(answerVoid(Runnable::run)).when(mMockHandler) doAnswer(answerVoid(Runnable::run)).when(mMockHandler)
.postDelayed(any(Runnable.class), anyLong()); .postDelayed(any(Runnable.class), anyLong());
Map<AssistHandleBehavior, AssistHandleBehaviorController.BehaviorController> behaviorMap =
new EnumMap<>(AssistHandleBehavior.class);
behaviorMap.put(AssistHandleBehavior.OFF, mMockOffBehavior);
behaviorMap.put(AssistHandleBehavior.LIKE_HOME, mMockLikeHomeBehavior);
behaviorMap.put(AssistHandleBehavior.REMINDER_EXP, mMockReminderExpBehavior);
behaviorMap.put(AssistHandleBehavior.TEST, mMockTestBehavior);
mAssistHandleBehaviorController = mAssistHandleBehaviorController =
new AssistHandleBehaviorController( new AssistHandleBehaviorController(
mContext, mContext,
mMockAssistUtils, mMockAssistUtils,
mMockHandler, () -> mMockScreenDecorations, mMockHandler,
() -> mMockScreenDecorations,
mMockPhenotypeHelper, mMockPhenotypeHelper,
mMockBehaviorController); behaviorMap,
mMockNavigationModeController,
mMockDumpController);
} }
@After @After
@@ -314,8 +334,8 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase {
mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.TEST); mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.TEST);
// Assert // Assert
verify(mMockBehaviorController).onModeActivated(mContext, mAssistHandleBehaviorController); verify(mMockTestBehavior).onModeActivated(mContext, mAssistHandleBehaviorController);
verifyNoMoreInteractions(mMockBehaviorController); verifyNoMoreInteractions(mMockTestBehavior);
} }
@Test @Test
@@ -324,14 +344,14 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase {
when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME); when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.TEST); mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.TEST);
mAssistHandleBehaviorController.setInGesturalModeForTest(true); mAssistHandleBehaviorController.setInGesturalModeForTest(true);
reset(mMockBehaviorController); reset(mMockTestBehavior);
// Act // Act
mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.OFF); mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.OFF);
// Assert // Assert
verify(mMockBehaviorController).onModeDeactivated(); verify(mMockTestBehavior).onModeDeactivated();
verifyNoMoreInteractions(mMockBehaviorController); verifyNoMoreInteractions(mMockTestBehavior);
} }
@Test @Test
@@ -344,6 +364,6 @@ public class AssistHandleBehaviorControllerTest extends SysuiTestCase {
mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.TEST); mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.TEST);
// Assert // Assert
verifyNoMoreInteractions(mMockBehaviorController); verifyNoMoreInteractions(mMockTestBehavior);
} }
} }

View File

@@ -0,0 +1,251 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.assist;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
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.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.shared.system.QuickStepContract;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class AssistHandleLikeHomeBehaviorTest extends SysuiTestCase {
private AssistHandleLikeHomeBehavior mAssistHandleLikeHomeBehavior;
@Mock private WakefulnessLifecycle mMockWakefulnessLifecycle;
@Mock private OverviewProxyService mMockOverviewProxyService;
@Mock private AssistHandleCallbacks mMockAssistHandleCallbacks;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mAssistHandleLikeHomeBehavior = new AssistHandleLikeHomeBehavior(
() -> mMockWakefulnessLifecycle, () -> mMockOverviewProxyService);
}
@Test
public void onModeActivated_beginsObserving() {
// Arrange
// Act
mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
// Assert
verify(mMockWakefulnessLifecycle).getWakefulness();
verify(mMockWakefulnessLifecycle).addObserver(any(WakefulnessLifecycle.Observer.class));
verify(mMockOverviewProxyService).addCallback(any(
OverviewProxyService.OverviewProxyListener.class));
verifyNoMoreInteractions(mMockWakefulnessLifecycle, mMockOverviewProxyService);
}
@Test
public void onModeActivated_showsHandlesWhenAwake() {
// Arrange
when(mMockWakefulnessLifecycle.getWakefulness())
.thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE);
// Act
mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
// Assert
verify(mMockAssistHandleCallbacks).showAndStay();
verifyNoMoreInteractions(mMockAssistHandleCallbacks);
}
@Test
public void onModeActivated_hidesHandlesWhenNotAwake() {
// Arrange
when(mMockWakefulnessLifecycle.getWakefulness())
.thenReturn(WakefulnessLifecycle.WAKEFULNESS_ASLEEP);
// Act
mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
// Assert
verify(mMockAssistHandleCallbacks).hide();
verifyNoMoreInteractions(mMockAssistHandleCallbacks);
}
@Test
public void onModeDeactivated_stopsObserving() {
// Arrange
mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
ArgumentCaptor<WakefulnessLifecycle.Observer> observer =
ArgumentCaptor.forClass(WakefulnessLifecycle.Observer.class);
ArgumentCaptor<OverviewProxyService.OverviewProxyListener> overviewProxyListener =
ArgumentCaptor.forClass(OverviewProxyService.OverviewProxyListener.class);
verify(mMockWakefulnessLifecycle).addObserver(observer.capture());
verify(mMockOverviewProxyService).addCallback(overviewProxyListener.capture());
reset(mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
// Act
mAssistHandleLikeHomeBehavior.onModeDeactivated();
// Assert
verify(mMockWakefulnessLifecycle).removeObserver(eq(observer.getValue()));
verify(mMockOverviewProxyService).removeCallback(eq(overviewProxyListener.getValue()));
verifyNoMoreInteractions(
mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
}
@Test
public void onAssistantGesturePerformed_doesNothing() {
// Arrange
mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
reset(mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
// Act
mAssistHandleLikeHomeBehavior.onAssistantGesturePerformed();
// Assert
verifyNoMoreInteractions(
mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
}
@Test
public void onAssistHandlesRequested_doesNothing() {
// Arrange
mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
reset(mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
// Act
mAssistHandleLikeHomeBehavior.onAssistHandlesRequested();
// Assert
verifyNoMoreInteractions(
mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
}
@Test
public void onWake_handlesShow() {
// Arrange
when(mMockWakefulnessLifecycle.getWakefulness())
.thenReturn(WakefulnessLifecycle.WAKEFULNESS_ASLEEP);
ArgumentCaptor<WakefulnessLifecycle.Observer> observer =
ArgumentCaptor.forClass(WakefulnessLifecycle.Observer.class);
mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
verify(mMockWakefulnessLifecycle).addObserver(observer.capture());
reset(mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
// Act
observer.getValue().onStartedWakingUp();
// Assert
verifyNoMoreInteractions(
mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
// Act
observer.getValue().onFinishedWakingUp();
// Assert
verify(mMockAssistHandleCallbacks).showAndStay();
verifyNoMoreInteractions(
mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
}
@Test
public void onSleep_handlesHide() {
// Arrange
when(mMockWakefulnessLifecycle.getWakefulness())
.thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE);
ArgumentCaptor<WakefulnessLifecycle.Observer> observer =
ArgumentCaptor.forClass(WakefulnessLifecycle.Observer.class);
mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
verify(mMockWakefulnessLifecycle).addObserver(observer.capture());
reset(mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
// Act
observer.getValue().onStartedGoingToSleep();
// Assert
verify(mMockAssistHandleCallbacks).hide();
verifyNoMoreInteractions(
mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
// Act
observer.getValue().onFinishedGoingToSleep();
// Assert
verifyNoMoreInteractions(
mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
}
@Test
public void onHomeHandleHide_handlesHide() {
// Arrange
when(mMockWakefulnessLifecycle.getWakefulness())
.thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE);
ArgumentCaptor<OverviewProxyService.OverviewProxyListener> sysUiStateCallback =
ArgumentCaptor.forClass(OverviewProxyService.OverviewProxyListener.class);
mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
verify(mMockOverviewProxyService).addCallback(sysUiStateCallback.capture());
reset(mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
// Act
sysUiStateCallback.getValue().onSystemUiStateChanged(
QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN);
// Assert
verify(mMockAssistHandleCallbacks).hide();
verifyNoMoreInteractions(
mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
}
@Test
public void onHomeHandleUnhide_handlesShow() {
// Arrange
when(mMockWakefulnessLifecycle.getWakefulness())
.thenReturn(WakefulnessLifecycle.WAKEFULNESS_AWAKE);
ArgumentCaptor<OverviewProxyService.OverviewProxyListener> sysUiStateCallback =
ArgumentCaptor.forClass(OverviewProxyService.OverviewProxyListener.class);
mAssistHandleLikeHomeBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
verify(mMockOverviewProxyService).addCallback(sysUiStateCallback.capture());
sysUiStateCallback.getValue().onSystemUiStateChanged(
QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN);
reset(mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
// Act
sysUiStateCallback.getValue().onSystemUiStateChanged(
~QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN);
// Assert
verify(mMockAssistHandleCallbacks).showAndStay();
verifyNoMoreInteractions(
mMockWakefulnessLifecycle, mMockOverviewProxyService, mMockAssistHandleCallbacks);
}
}

View File

@@ -0,0 +1,101 @@
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.assist;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class AssistHandleOffBehaviorTest extends SysuiTestCase {
private AssistHandleOffBehavior mAssistHandleOffBehavior;
@Mock private AssistHandleCallbacks mMockAssistHandleCallbacks;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mAssistHandleOffBehavior = new AssistHandleOffBehavior();
}
@Test
public void onModeActivated_hidesHandles() {
// Arrange
// Act
mAssistHandleOffBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
// Assert
verify(mMockAssistHandleCallbacks).hide();
verifyNoMoreInteractions(mMockAssistHandleCallbacks);
}
@Test
public void onModeDeactivated_doesNothing() {
// Arrange
mAssistHandleOffBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
reset(mMockAssistHandleCallbacks);
// Act
mAssistHandleOffBehavior.onModeDeactivated();
// Assert
verifyNoMoreInteractions(mMockAssistHandleCallbacks);
}
@Test
public void onAssistantGesturePerformed_doesNothing() {
// Arrange
mAssistHandleOffBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
reset(mMockAssistHandleCallbacks);
// Act
mAssistHandleOffBehavior.onAssistantGesturePerformed();
// Assert
verifyNoMoreInteractions(mMockAssistHandleCallbacks);
}
@Test
public void onAssistHandlesRequested_doesNothing() {
// Arrange
mAssistHandleOffBehavior.onModeActivated(mContext, mMockAssistHandleCallbacks);
reset(mMockAssistHandleCallbacks);
// Act
mAssistHandleOffBehavior.onAssistHandlesRequested();
// Assert
verifyNoMoreInteractions(mMockAssistHandleCallbacks);
}
}