Merge "Update assist handle behavior control" into qt-dev

This commit is contained in:
TreeHugger Robot
2019-05-29 20:34:48 +00:00
committed by Android (Google) Code Review
4 changed files with 135 additions and 75 deletions

View File

@@ -113,5 +113,25 @@ public final class SystemUiDeviceConfigFlags {
*/ */
public static final String PROPERTY_PERMISSIONS_HUB_ENABLED = "permissions_hub_enabled"; public static final String PROPERTY_PERMISSIONS_HUB_ENABLED = "permissions_hub_enabled";
// Flags related to Assistant Handles
/**
* (String) Which behavior mode for the Assistant Handles to use.
*/
public static final String ASSIST_HANDLES_BEHAVIOR_MODE = "assist_handles_behavior_mode";
/**
* (long) How long, in milliseconds, to display Assist Handles when showing them temporarily.
*/
public static final String ASSIST_HANDLES_SHOW_AND_GO_DURATION_MS =
"assist_handles_show_and_go_duration_ms";
/**
* (long) How long, in milliseconds, to wait before displaying Assist Handles temporarily after
* hiding them.
*/
public static final String ASSIST_HANDLES_SHOWN_FREQUENCY_THRESHOLD_MS =
"assist_handles_shown_frequency_threshold_ms";
private SystemUiDeviceConfigFlags() { } private SystemUiDeviceConfigFlags() { }
} }

View File

@@ -24,9 +24,13 @@ import android.os.Build;
import android.os.Handler; import android.os.Handler;
import android.os.SystemClock; import android.os.SystemClock;
import android.os.SystemProperties; import android.os.SystemProperties;
import android.provider.DeviceConfig;
import android.util.Log; import android.util.Log;
import androidx.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
import com.android.systemui.Dependency; import com.android.systemui.Dependency;
import com.android.systemui.ScreenDecorations; import com.android.systemui.ScreenDecorations;
import com.android.systemui.SysUiServiceProvider; import com.android.systemui.SysUiServiceProvider;
@@ -46,6 +50,7 @@ import java.util.function.Supplier;
public final class AssistHandleBehaviorController implements AssistHandleCallbacks { public final class AssistHandleBehaviorController implements AssistHandleCallbacks {
private static final String TAG = "AssistHandleBehavior"; private static final String TAG = "AssistHandleBehavior";
private static final boolean IS_DEBUG_DEVICE = private static final boolean IS_DEBUG_DEVICE =
Build.TYPE.toLowerCase(Locale.ROOT).contains("debug") Build.TYPE.toLowerCase(Locale.ROOT).contains("debug")
|| Build.TYPE.toLowerCase(Locale.ROOT).equals("eng"); || Build.TYPE.toLowerCase(Locale.ROOT).equals("eng");
@@ -87,6 +92,19 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac
Dependency.get(NavigationModeController.class) Dependency.get(NavigationModeController.class)
.addListener(this::handleNavigationModeChange)); .addListener(this::handleNavigationModeChange));
setBehavior(DeviceConfig.getString(
DeviceConfig.NAMESPACE_SYSTEMUI,
SystemUiDeviceConfigFlags.ASSIST_HANDLES_BEHAVIOR_MODE,
mCurrentBehavior.toString()));
DeviceConfig.addOnPropertyChangedListener(
DeviceConfig.NAMESPACE_SYSTEMUI,
mHandler::post,
(namespace, name, value) -> {
if (SystemUiDeviceConfigFlags.ASSIST_HANDLES_BEHAVIOR_MODE.equals(name)) {
setBehavior(value);
}
});
if (IS_DEBUG_DEVICE) { if (IS_DEBUG_DEVICE) {
context.registerReceiver(new BroadcastReceiver() { context.registerReceiver(new BroadcastReceiver() {
@Override @Override
@@ -136,13 +154,29 @@ public final class AssistHandleBehaviorController implements AssistHandleCallbac
mCurrentBehavior = behavior; mCurrentBehavior = behavior;
} }
private static long getShownFrequencyThreshold() { private void setBehavior(@Nullable String behavior) {
return SystemProperties.getLong( try {
SHOWN_FREQUENCY_THRESHOLD_KEY, DEFAULT_SHOWN_FREQUENCY_THRESHOLD_MS); setBehavior(AssistHandleBehavior.valueOf(behavior));
} catch (IllegalArgumentException | NullPointerException e) {
Log.e(TAG, "Invalid behavior: " + behavior, e);
}
} }
private static long getShowAndGoDuration() { private long getShownFrequencyThreshold() {
return SystemProperties.getLong(SHOW_AND_GO_DURATION_KEY, DEFAULT_SHOW_AND_GO_DURATION_MS); long configValue = 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(
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) { private void maybeShowHandles(boolean ignoreThreshold) {

View File

@@ -16,17 +16,15 @@
package com.android.systemui.assist; package com.android.systemui.assist;
import android.app.StatusBarManager;
import android.content.Context; import android.content.Context;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.android.systemui.Dependency; import com.android.systemui.Dependency;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController; import com.android.systemui.assist.AssistHandleBehaviorController.BehaviorController;
import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.NavigationBarController; import com.android.systemui.recents.OverviewProxyService;
import com.android.systemui.statusbar.phone.NavigationBarFragment; import com.android.systemui.shared.system.QuickStepContract;
/** /**
* 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
@@ -34,47 +32,68 @@ import com.android.systemui.statusbar.phone.NavigationBarFragment;
*/ */
final class AssistHandleLikeHomeBehavior implements BehaviorController { final class AssistHandleLikeHomeBehavior implements BehaviorController {
private final CommandQueue.Callbacks mCallbacks = new CommandQueue.Callbacks() { private final StatusBarStateController.StateListener mStatusBarStateListener =
new StatusBarStateController.StateListener() {
@Override @Override
public void setWindowState(int displayId, int window, int state) { public void onDozingChanged(boolean isDozing) {
if (mNavBarDisplayId == displayId handleDozingChanged(isDozing);
&& window == StatusBarManager.WINDOW_NAVIGATION_BAR) {
handleWindowStateChanged(state);
}
} }
}; };
private final OverviewProxyService.OverviewProxyListener mOverviewProxyListener =
new OverviewProxyService.OverviewProxyListener() {
@Override
public void onSystemUiStateChanged(int sysuiStateFlags) {
handleSystemUiStateChange(sysuiStateFlags);
}
};
private final StatusBarStateController mStatusBarStateController;
private final OverviewProxyService mOverviewProxyService;
private CommandQueue mCommandQueue; private boolean mIsDozing;
private int mNavBarDisplayId; private boolean mIsHomeHandleHiding;
private boolean mIsNavBarWindowVisible;
@Nullable private AssistHandleCallbacks mAssistHandleCallbacks; @Nullable private AssistHandleCallbacks mAssistHandleCallbacks;
AssistHandleLikeHomeBehavior() {
mStatusBarStateController = Dependency.get(StatusBarStateController.class);
mOverviewProxyService = Dependency.get(OverviewProxyService.class);
}
@Override @Override
public void onModeActivated(Context context, AssistHandleCallbacks callbacks) { public void onModeActivated(Context context, AssistHandleCallbacks callbacks) {
mAssistHandleCallbacks = callbacks; mAssistHandleCallbacks = callbacks;
NavigationBarFragment navigationBarFragment = mIsDozing = mStatusBarStateController.isDozing();
Dependency.get(NavigationBarController.class).getDefaultNavigationBarFragment(); mStatusBarStateController.addCallback(mStatusBarStateListener);
mNavBarDisplayId = navigationBarFragment.mDisplayId; mOverviewProxyService.addCallback(mOverviewProxyListener);
mIsNavBarWindowVisible = navigationBarFragment.isNavBarWindowVisible();
mCommandQueue = SysUiServiceProvider.getComponent(context, CommandQueue.class);
mCommandQueue.addCallback(mCallbacks);
callbackForCurrentState(); callbackForCurrentState();
} }
@Override @Override
public void onModeDeactivated() { public void onModeDeactivated() {
mAssistHandleCallbacks = null; mAssistHandleCallbacks = null;
mCommandQueue.removeCallback(mCallbacks); mOverviewProxyService.removeCallback(mOverviewProxyListener);
} }
private void handleWindowStateChanged(int state) { private static boolean isHomeHandleHiding(int sysuiStateFlags) {
boolean newVisibility = state == StatusBarManager.WINDOW_STATE_SHOWING; return (sysuiStateFlags & QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN) != 0;
if (mIsNavBarWindowVisible == newVisibility) { }
private void handleDozingChanged(boolean isDozing) {
if (mIsDozing == isDozing) {
return; return;
} }
mIsNavBarWindowVisible = newVisibility; mIsDozing = isDozing;
callbackForCurrentState();
}
private void handleSystemUiStateChange(int sysuiStateFlags) {
boolean isHomeHandleHiding = isHomeHandleHiding(sysuiStateFlags);
if (mIsHomeHandleHiding == isHomeHandleHiding) {
return;
}
mIsHomeHandleHiding = isHomeHandleHiding;
callbackForCurrentState(); callbackForCurrentState();
} }
@@ -83,10 +102,10 @@ final class AssistHandleLikeHomeBehavior implements BehaviorController {
return; return;
} }
if (mIsNavBarWindowVisible) { if (mIsHomeHandleHiding || mIsDozing) {
mAssistHandleCallbacks.showAndStay();
} else {
mAssistHandleCallbacks.hide(); mAssistHandleCallbacks.hide();
} else {
mAssistHandleCallbacks.showAndStay();
} }
} }
} }

View File

@@ -16,22 +16,19 @@
package com.android.systemui.assist; package com.android.systemui.assist;
import android.app.ActivityManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.graphics.Rect;
import android.view.View;
import android.view.WindowManager;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.android.systemui.Dependency; import com.android.systemui.Dependency;
import com.android.systemui.SysUiServiceProvider;
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.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;
import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.StatusBarState;
/** /**
@@ -65,53 +62,45 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
handleTaskStackTopChanged(taskId); handleTaskStackTopChanged(taskId);
} }
}; };
private final CommandQueue.Callbacks mCallbacks = new CommandQueue.Callbacks() {
@Override
public void setSystemUiVisibility(int displayId, int vis,
int fullscreenStackVis, int dockedStackVis, int mask,
Rect fullscreenStackBounds, Rect dockedStackBounds,
boolean navbarColorManagedByIme) {
if (mStatusBarDisplayId == displayId) {
handleSystemUiVisibilityChange(vis, mask);
}
}
};
private final OverviewProxyService.OverviewProxyListener mOverviewProxyListener = private final OverviewProxyService.OverviewProxyListener mOverviewProxyListener =
new OverviewProxyService.OverviewProxyListener() { new OverviewProxyService.OverviewProxyListener() {
@Override @Override
public void onOverviewShown(boolean fromHome) { public void onOverviewShown(boolean fromHome) {
handleOverviewShown(); handleOverviewShown();
} }
@Override
public void onSystemUiStateChanged(int sysuiStateFlags) {
handleSystemUiStateChanged(sysuiStateFlags);
}
}; };
private StatusBarStateController mStatusBarStateController; private final StatusBarStateController mStatusBarStateController;
private ActivityManagerWrapper mActivityManagerWrapper; private final ActivityManagerWrapper mActivityManagerWrapper;
private OverviewProxyService mOverviewProxyService; private final OverviewProxyService mOverviewProxyService;
private int mStatusBarDisplayId;
private CommandQueue mCommandQueue;
private boolean mOnLockscreen; private boolean mOnLockscreen;
private boolean mIsDozing; private boolean mIsDozing;
private int mRunningTaskId; private int mRunningTaskId;
private boolean mIsImmersive; private boolean mIsNavBarHidden;
@Nullable private AssistHandleCallbacks mAssistHandleCallbacks; @Nullable private AssistHandleCallbacks mAssistHandleCallbacks;
AssistHandleReminderExpBehavior() {
mStatusBarStateController = Dependency.get(StatusBarStateController.class);
mActivityManagerWrapper = ActivityManagerWrapper.getInstance();
mOverviewProxyService = Dependency.get(OverviewProxyService.class);
}
@Override @Override
public void onModeActivated(Context context, AssistHandleCallbacks callbacks) { public void onModeActivated(Context context, AssistHandleCallbacks callbacks) {
mAssistHandleCallbacks = callbacks; mAssistHandleCallbacks = callbacks;
mStatusBarStateController = Dependency.get(StatusBarStateController.class);
mOnLockscreen = onLockscreen(mStatusBarStateController.getState()); mOnLockscreen = onLockscreen(mStatusBarStateController.getState());
mIsDozing = mStatusBarStateController.isDozing(); mIsDozing = mStatusBarStateController.isDozing();
mStatusBarStateController.addCallback(mStatusBarStateListener); mStatusBarStateController.addCallback(mStatusBarStateListener);
mActivityManagerWrapper = ActivityManagerWrapper.getInstance(); ActivityManager.RunningTaskInfo runningTaskInfo = mActivityManagerWrapper.getRunningTask();
mRunningTaskId = mActivityManagerWrapper.getRunningTask().taskId; mRunningTaskId = runningTaskInfo == null ? 0 : runningTaskInfo.taskId;
mActivityManagerWrapper.registerTaskStackListener(mTaskStackChangeListener); mActivityManagerWrapper.registerTaskStackListener(mTaskStackChangeListener);
mStatusBarDisplayId =
((WindowManager) context.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay().getDisplayId();
mCommandQueue = SysUiServiceProvider.getComponent(context, CommandQueue.class);
mCommandQueue.addCallback(mCallbacks);
mOverviewProxyService = Dependency.get(OverviewProxyService.class);
mOverviewProxyService.addCallback(mOverviewProxyListener); mOverviewProxyService.addCallback(mOverviewProxyListener);
callbackForCurrentState(); callbackForCurrentState();
} }
@@ -121,10 +110,13 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
mAssistHandleCallbacks = null; mAssistHandleCallbacks = null;
mStatusBarStateController.removeCallback(mStatusBarStateListener); mStatusBarStateController.removeCallback(mStatusBarStateListener);
mActivityManagerWrapper.unregisterTaskStackListener(mTaskStackChangeListener); mActivityManagerWrapper.unregisterTaskStackListener(mTaskStackChangeListener);
mCommandQueue.removeCallback(mCallbacks);
mOverviewProxyService.removeCallback(mOverviewProxyListener); mOverviewProxyService.removeCallback(mOverviewProxyListener);
} }
private static boolean isNavBarHidden(int sysuiStateFlags) {
return (sysuiStateFlags & QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN) != 0;
}
private void handleStatusBarStateChanged(int newState) { private void handleStatusBarStateChanged(int newState) {
boolean onLockscreen = onLockscreen(newState); boolean onLockscreen = onLockscreen(newState);
if (mOnLockscreen == onLockscreen) { if (mOnLockscreen == onLockscreen) {
@@ -153,13 +145,13 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
callbackForCurrentState(); callbackForCurrentState();
} }
private void handleSystemUiVisibilityChange(int vis, int mask) { private void handleSystemUiStateChanged(int sysuiStateFlags) {
boolean isImmersive = isImmersive(vis, mask); boolean isNavBarHidden = isNavBarHidden(sysuiStateFlags);
if (mIsImmersive == isImmersive) { if (mIsNavBarHidden == isNavBarHidden) {
return; return;
} }
mIsImmersive = isImmersive; mIsNavBarHidden = isNavBarHidden;
callbackForCurrentState(); callbackForCurrentState();
} }
@@ -172,17 +164,12 @@ final class AssistHandleReminderExpBehavior implements BehaviorController {
|| statusBarState == StatusBarState.SHADE_LOCKED; || statusBarState == StatusBarState.SHADE_LOCKED;
} }
private boolean isImmersive(int vis, int mask) {
return ((vis & mask)
& (View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)) != 0;
}
private void callbackForCurrentState() { private void callbackForCurrentState() {
if (mAssistHandleCallbacks == null) { if (mAssistHandleCallbacks == null) {
return; return;
} }
if (mIsDozing || mIsImmersive) { if (mIsDozing || mIsNavBarHidden) {
mAssistHandleCallbacks.hide(); mAssistHandleCallbacks.hide();
} else if (mOnLockscreen) { } else if (mOnLockscreen) {
mAssistHandleCallbacks.showAndStay(); mAssistHandleCallbacks.showAndStay();