Merge "Moving NavigationMode to display controller" into tm-dev am: 86cbea3dc4
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/17084125 Change-Id: I623051990b6b5ada50684bdf104def23bafc2273
This commit is contained in:
@@ -25,10 +25,11 @@ import static com.android.launcher3.config.FeatureFlags.ENABLE_SPLIT_FROM_WORKSP
|
||||
import static com.android.launcher3.model.data.ItemInfo.NO_MATCHING_ID;
|
||||
import static com.android.launcher3.popup.QuickstepSystemShortcut.getSplitSelectShortcutByPosition;
|
||||
import static com.android.launcher3.util.DisplayController.CHANGE_ACTIVE_SCREEN;
|
||||
import static com.android.launcher3.util.DisplayController.CHANGE_NAVIGATION_MODE;
|
||||
import static com.android.launcher3.util.DisplayController.NavigationMode.NO_BUTTON;
|
||||
import static com.android.launcher3.util.DisplayController.NavigationMode.TWO_BUTTONS;
|
||||
import static com.android.launcher3.util.Executors.THREAD_POOL_EXECUTOR;
|
||||
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
|
||||
import static com.android.quickstep.SysUINavigationMode.Mode.NO_BUTTON;
|
||||
import static com.android.quickstep.SysUINavigationMode.Mode.TWO_BUTTONS;
|
||||
import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_HOME_KEY;
|
||||
|
||||
import android.animation.AnimatorSet;
|
||||
@@ -65,6 +66,7 @@ import com.android.launcher3.taskbar.TaskbarManager;
|
||||
import com.android.launcher3.uioverrides.RecentsViewStateController;
|
||||
import com.android.launcher3.util.ActivityOptionsWrapper;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
import com.android.launcher3.util.IntSet;
|
||||
import com.android.launcher3.util.ObjectWrapper;
|
||||
import com.android.launcher3.util.RunnableList;
|
||||
@@ -72,9 +74,6 @@ import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
|
||||
import com.android.launcher3.util.UiThreadHelper;
|
||||
import com.android.quickstep.OverviewCommandHelper;
|
||||
import com.android.quickstep.RecentsModel;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.quickstep.SysUINavigationMode.Mode;
|
||||
import com.android.quickstep.SysUINavigationMode.NavigationModeChangeListener;
|
||||
import com.android.quickstep.SystemUiProxy;
|
||||
import com.android.quickstep.TaskUtils;
|
||||
import com.android.quickstep.TouchInteractionService.TISBinder;
|
||||
@@ -102,8 +101,7 @@ import java.util.stream.Stream;
|
||||
/**
|
||||
* Extension of Launcher activity to provide quickstep specific functionality
|
||||
*/
|
||||
public abstract class BaseQuickstepLauncher extends Launcher
|
||||
implements NavigationModeChangeListener {
|
||||
public abstract class BaseQuickstepLauncher extends Launcher {
|
||||
|
||||
private DepthController mDepthController = new DepthController(this);
|
||||
private QuickstepTransitionManager mAppTransitionManager;
|
||||
@@ -131,7 +129,6 @@ public abstract class BaseQuickstepLauncher extends Launcher
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
SysUINavigationMode.INSTANCE.get(this).addModeChangeListener(this);
|
||||
addMultiWindowModeChangedListener(mDepthController);
|
||||
initUnfoldTransitionProgressProvider();
|
||||
}
|
||||
@@ -161,8 +158,6 @@ public abstract class BaseQuickstepLauncher extends Launcher
|
||||
mUnfoldTransitionProgressProvider.destroy();
|
||||
}
|
||||
|
||||
SysUINavigationMode.INSTANCE.get(this).removeModeChangeListener(this);
|
||||
|
||||
mTISBindHelper.onDestroy();
|
||||
if (mTaskbarManager != null) {
|
||||
mTaskbarManager.clearActivity(this);
|
||||
@@ -188,14 +183,6 @@ public abstract class BaseQuickstepLauncher extends Launcher
|
||||
return mAppTransitionManager;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNavigationModeChanged(Mode newMode) {
|
||||
getDragLayer().recreateControllers();
|
||||
if (mActionsView != null) {
|
||||
mActionsView.updateVerticalMargin(newMode);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnterAnimationComplete() {
|
||||
super.onEnterAnimationComplete();
|
||||
@@ -305,7 +292,6 @@ public abstract class BaseQuickstepLauncher extends Launcher
|
||||
protected void setupViews() {
|
||||
super.setupViews();
|
||||
|
||||
SysUINavigationMode.INSTANCE.get(this).updateMode();
|
||||
mActionsView = findViewById(R.id.overview_actions_view);
|
||||
RecentsView overviewPanel = (RecentsView) getOverviewPanel();
|
||||
SplitSelectStateController controller =
|
||||
@@ -313,7 +299,7 @@ public abstract class BaseQuickstepLauncher extends Launcher
|
||||
getStateManager(), getDepthController());
|
||||
overviewPanel.init(mActionsView, controller);
|
||||
mActionsView.setDp(getDeviceProfile());
|
||||
mActionsView.updateVerticalMargin(SysUINavigationMode.getMode(this));
|
||||
mActionsView.updateVerticalMargin(DisplayController.getNavigationMode(this));
|
||||
|
||||
mAppTransitionManager = new QuickstepTransitionManager(this);
|
||||
mAppTransitionManager.registerRemoteAnimations();
|
||||
@@ -434,7 +420,7 @@ public abstract class BaseQuickstepLauncher extends Launcher
|
||||
|
||||
@Override
|
||||
public float[] getNormalOverviewScaleAndOffset() {
|
||||
return SysUINavigationMode.getMode(this).hasGestures
|
||||
return DisplayController.getNavigationMode(this).hasGestures
|
||||
? new float[] {1, 1} : new float[] {1.1f, NO_OFFSET};
|
||||
}
|
||||
|
||||
@@ -464,7 +450,7 @@ public abstract class BaseQuickstepLauncher extends Launcher
|
||||
}
|
||||
|
||||
public boolean shouldBackButtonBeHidden(LauncherState toState) {
|
||||
Mode mode = SysUINavigationMode.getMode(this);
|
||||
NavigationMode mode = DisplayController.getNavigationMode(this);
|
||||
boolean shouldBackButtonBeHidden = mode.hasGestures
|
||||
&& toState.hasFlag(FLAG_HIDE_BACK_BUTTON)
|
||||
&& hasWindowFocus()
|
||||
@@ -482,7 +468,7 @@ public abstract class BaseQuickstepLauncher extends Launcher
|
||||
*/
|
||||
private void onLauncherStateOrFocusChanged() {
|
||||
boolean shouldBackButtonBeHidden = shouldBackButtonBeHidden(getStateManager().getState());
|
||||
if (SysUINavigationMode.getMode(this) == TWO_BUTTONS) {
|
||||
if (DisplayController.getNavigationMode(this) == TWO_BUTTONS) {
|
||||
UiThreadHelper.setBackButtonAlphaAsync(this, SET_BACK_BUTTON_ALPHA,
|
||||
shouldBackButtonBeHidden ? 0f : 1f, true /* animate */);
|
||||
}
|
||||
@@ -612,6 +598,13 @@ public abstract class BaseQuickstepLauncher extends Launcher
|
||||
if ((flags & CHANGE_ACTIVE_SCREEN) != 0) {
|
||||
getStateManager().moveToRestState();
|
||||
}
|
||||
|
||||
if ((flags & CHANGE_NAVIGATION_MODE) != 0) {
|
||||
getDragLayer().recreateControllers();
|
||||
if (mActionsView != null) {
|
||||
mActionsView.updateVerticalMargin(info.navigationMode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -627,7 +620,7 @@ public abstract class BaseQuickstepLauncher extends Launcher
|
||||
WindowInsets oldInsets) {
|
||||
// Override the tappable insets to be 0 on the bottom for gesture nav (otherwise taskbar
|
||||
// would count towards it). This is used for the bottom protection in All Apps for example.
|
||||
if (SysUINavigationMode.getMode(this) == NO_BUTTON) {
|
||||
if (DisplayController.getNavigationMode(this) == NO_BUTTON) {
|
||||
Insets oldTappableInsets = oldInsets.getInsets(WindowInsets.Type.tappableElement());
|
||||
Insets newTappableInsets = Insets.of(oldTappableInsets.left, oldTappableInsets.top,
|
||||
oldTappableInsets.right, 0);
|
||||
|
||||
@@ -17,17 +17,17 @@
|
||||
package com.android.launcher3.statehandlers;
|
||||
|
||||
import static com.android.launcher3.anim.Interpolators.LINEAR;
|
||||
import static com.android.launcher3.util.DisplayController.NavigationMode.TWO_BUTTONS;
|
||||
import static com.android.quickstep.AnimatedFloat.VALUE;
|
||||
import static com.android.quickstep.SysUINavigationMode.Mode.TWO_BUTTONS;
|
||||
|
||||
import com.android.launcher3.BaseQuickstepLauncher;
|
||||
import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.anim.PendingAnimation;
|
||||
import com.android.launcher3.statemanager.StateManager.StateHandler;
|
||||
import com.android.launcher3.states.StateAnimationConfig;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.UiThreadHelper;
|
||||
import com.android.quickstep.AnimatedFloat;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.quickstep.SystemUiProxy;
|
||||
|
||||
/**
|
||||
@@ -48,7 +48,7 @@ public class BackButtonAlphaHandler implements StateHandler<LauncherState> {
|
||||
@Override
|
||||
public void setStateWithAnimation(LauncherState toState, StateAnimationConfig config,
|
||||
PendingAnimation animation) {
|
||||
if (SysUINavigationMode.getMode(mLauncher) != TWO_BUTTONS) {
|
||||
if (DisplayController.getNavigationMode(mLauncher) != TWO_BUTTONS) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_M
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
|
||||
|
||||
import static com.android.launcher3.AbstractFloatingView.TYPE_ALL;
|
||||
import static com.android.launcher3.ResourceUtils.getBoolByName;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_FOLDER_OPEN;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED;
|
||||
@@ -70,13 +71,13 @@ import com.android.launcher3.model.data.WorkspaceItemInfo;
|
||||
import com.android.launcher3.popup.PopupDataProvider;
|
||||
import com.android.launcher3.taskbar.allapps.TaskbarAllAppsController;
|
||||
import com.android.launcher3.touch.ItemClickHandler;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
import com.android.launcher3.util.PackageManagerHelper;
|
||||
import com.android.launcher3.util.SettingsCache;
|
||||
import com.android.launcher3.util.TraceHelper;
|
||||
import com.android.launcher3.util.ViewCache;
|
||||
import com.android.launcher3.views.ActivityContext;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.quickstep.SysUINavigationMode.Mode;
|
||||
import com.android.systemui.shared.recents.model.Task;
|
||||
import com.android.systemui.shared.rotation.RotationButtonController;
|
||||
import com.android.systemui.shared.system.ActivityManagerWrapper;
|
||||
@@ -92,6 +93,8 @@ import java.io.PrintWriter;
|
||||
*/
|
||||
public class TaskbarActivityContext extends BaseTaskbarContext {
|
||||
|
||||
private static final String IME_DRAWS_IME_NAV_BAR_RES_NAME = "config_imeDrawsImeNavBar";
|
||||
|
||||
private static final boolean ENABLE_THREE_BUTTON_TASKBAR =
|
||||
SystemProperties.getBoolean("persist.debug.taskbar_three_button", false);
|
||||
private static final String TAG = "TaskbarActivityContext";
|
||||
@@ -109,7 +112,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
|
||||
// The size we should return to when we call setTaskbarWindowFullscreen(false)
|
||||
private int mLastRequestedNonFullscreenHeight;
|
||||
|
||||
private final SysUINavigationMode.Mode mNavMode;
|
||||
private final NavigationMode mNavMode;
|
||||
private final boolean mImeDrawsImeNavBar;
|
||||
private final ViewCache mViewCache = new ViewCache();
|
||||
|
||||
@@ -130,8 +133,10 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
|
||||
super(windowContext);
|
||||
mDeviceProfile = dp;
|
||||
|
||||
mNavMode = SysUINavigationMode.getMode(windowContext);
|
||||
mImeDrawsImeNavBar = SysUINavigationMode.getImeDrawsImeNavBar(windowContext);
|
||||
final Resources resources = getResources();
|
||||
|
||||
mNavMode = DisplayController.getNavigationMode(windowContext);
|
||||
mImeDrawsImeNavBar = getBoolByName(IME_DRAWS_IME_NAV_BAR_RES_NAME, resources, false);
|
||||
mIsSafeModeEnabled = TraceHelper.allowIpcs("isSafeMode",
|
||||
() -> getPackageManager().isSafeMode());
|
||||
mIsUserSetupComplete = SettingsCache.INSTANCE.get(this).getValue(
|
||||
@@ -141,9 +146,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
|
||||
mIsNavBarKidsMode = SettingsCache.INSTANCE.get(this).getValue(
|
||||
Settings.Secure.getUriFor(Settings.Secure.NAV_BAR_KIDS_MODE), 0);
|
||||
|
||||
final Resources resources = getResources();
|
||||
updateIconSize(resources);
|
||||
|
||||
mTaskbarHeightForIme = resources.getDimensionPixelSize(R.dimen.taskbar_ime_size);
|
||||
|
||||
// Inflate views.
|
||||
@@ -258,11 +261,11 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
|
||||
}
|
||||
|
||||
public boolean isThreeButtonNav() {
|
||||
return mNavMode == Mode.THREE_BUTTONS;
|
||||
return mNavMode == NavigationMode.THREE_BUTTONS;
|
||||
}
|
||||
|
||||
public boolean isGestureNav() {
|
||||
return mNavMode == Mode.NO_BUTTON;
|
||||
return mNavMode == NavigationMode.NO_BUTTON;
|
||||
}
|
||||
|
||||
public boolean imeDrawsImeNavBar() {
|
||||
|
||||
@@ -21,6 +21,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
|
||||
|
||||
import static com.android.launcher3.util.DisplayController.CHANGE_ACTIVE_SCREEN;
|
||||
import static com.android.launcher3.util.DisplayController.CHANGE_DENSITY;
|
||||
import static com.android.launcher3.util.DisplayController.CHANGE_NAVIGATION_MODE;
|
||||
import static com.android.launcher3.util.DisplayController.CHANGE_SUPPORTED_BOUNDS;
|
||||
|
||||
import android.content.ComponentCallbacks;
|
||||
@@ -40,15 +41,12 @@ import androidx.annotation.Nullable;
|
||||
import com.android.launcher3.BaseQuickstepLauncher;
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.LauncherAppState;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
import com.android.launcher3.statemanager.StatefulActivity;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.DisplayController.Info;
|
||||
import com.android.launcher3.util.SettingsCache;
|
||||
import com.android.launcher3.util.SimpleBroadcastReceiver;
|
||||
import com.android.quickstep.RecentsActivity;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.quickstep.SysUINavigationMode.Mode;
|
||||
import com.android.quickstep.SystemUiProxy;
|
||||
import com.android.quickstep.TouchInteractionService;
|
||||
import com.android.systemui.unfold.UnfoldTransitionProgressProvider;
|
||||
@@ -59,8 +57,7 @@ import java.io.PrintWriter;
|
||||
/**
|
||||
* Class to manage taskbar lifecycle
|
||||
*/
|
||||
public class TaskbarManager implements DisplayController.DisplayInfoChangeListener,
|
||||
SysUINavigationMode.NavigationModeChangeListener {
|
||||
public class TaskbarManager implements DisplayController.DisplayInfoChangeListener {
|
||||
|
||||
private static final Uri USER_SETUP_COMPLETE_URI = Settings.Secure.getUriFor(
|
||||
Settings.Secure.USER_SETUP_COMPLETE);
|
||||
@@ -70,7 +67,6 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen
|
||||
|
||||
private final Context mContext;
|
||||
private final DisplayController mDisplayController;
|
||||
private final SysUINavigationMode mSysUINavigationMode;
|
||||
private final TaskbarNavButtonController mNavButtonController;
|
||||
private final SettingsCache.OnChangeListener mUserSetupCompleteListener;
|
||||
private final SettingsCache.OnChangeListener mNavBarKidsModeListener;
|
||||
@@ -89,14 +85,13 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen
|
||||
*/
|
||||
private final TaskbarSharedState mSharedState = new TaskbarSharedState();
|
||||
|
||||
private static final int CHANGE_FLAGS =
|
||||
CHANGE_ACTIVE_SCREEN | CHANGE_DENSITY | CHANGE_SUPPORTED_BOUNDS;
|
||||
private static final int CHANGE_FLAGS = CHANGE_ACTIVE_SCREEN | CHANGE_DENSITY
|
||||
| CHANGE_SUPPORTED_BOUNDS | CHANGE_NAVIGATION_MODE;
|
||||
|
||||
private boolean mUserUnlocked = false;
|
||||
|
||||
public TaskbarManager(TouchInteractionService service) {
|
||||
mDisplayController = DisplayController.INSTANCE.get(service);
|
||||
mSysUINavigationMode = SysUINavigationMode.INSTANCE.get(service);
|
||||
Display display =
|
||||
service.getSystemService(DisplayManager.class).getDisplay(DEFAULT_DISPLAY);
|
||||
mContext = service.createWindowContext(display, TYPE_NAVIGATION_BAR_PANEL, null);
|
||||
@@ -137,7 +132,6 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen
|
||||
mShutdownReceiver = new SimpleBroadcastReceiver(i -> destroyExistingTaskbar());
|
||||
|
||||
mDisplayController.addChangeListener(this);
|
||||
mSysUINavigationMode.addModeChangeListener(this);
|
||||
SettingsCache.INSTANCE.get(mContext).register(USER_SETUP_COMPLETE_URI,
|
||||
mUserSetupCompleteListener);
|
||||
SettingsCache.INSTANCE.get(mContext).register(NAV_BAR_KIDS_MODE,
|
||||
@@ -148,11 +142,6 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen
|
||||
recreateTaskbar();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNavigationModeChanged(Mode newMode) {
|
||||
recreateTaskbar();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisplayInfoChanged(Context context, Info info, int flags) {
|
||||
if ((flags & CHANGE_FLAGS) != 0) {
|
||||
@@ -301,7 +290,6 @@ public class TaskbarManager implements DisplayController.DisplayInfoChangeListen
|
||||
public void destroy() {
|
||||
destroyExistingTaskbar();
|
||||
mDisplayController.removeChangeListener(this);
|
||||
mSysUINavigationMode.removeModeChangeListener(this);
|
||||
SettingsCache.INSTANCE.get(mContext).unregister(USER_SETUP_COMPLETE_URI,
|
||||
mUserSetupCompleteListener);
|
||||
SettingsCache.INSTANCE.get(mContext).unregister(NAV_BAR_KIDS_MODE,
|
||||
|
||||
@@ -24,8 +24,8 @@ import android.view.Display;
|
||||
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.quickstep.SysUINavigationMode.Mode;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
|
||||
public class ApiWrapper {
|
||||
|
||||
@@ -54,7 +54,7 @@ public class ApiWrapper {
|
||||
* Returns the minimum space that should be left empty at the end of hotseat
|
||||
*/
|
||||
public static int getHotseatEndOffset(Context context) {
|
||||
if (SysUINavigationMode.INSTANCE.get(context).getMode() == Mode.THREE_BUTTONS) {
|
||||
if (DisplayController.getNavigationMode(context) == NavigationMode.THREE_BUTTONS) {
|
||||
Resources res = context.getResources();
|
||||
/*
|
||||
* 3 nav buttons +
|
||||
|
||||
@@ -68,14 +68,14 @@ import com.android.launcher3.uioverrides.touchcontrollers.StatusBarTouchControll
|
||||
import com.android.launcher3.uioverrides.touchcontrollers.TaskViewTouchController;
|
||||
import com.android.launcher3.uioverrides.touchcontrollers.TransposedQuickSwitchTouchController;
|
||||
import com.android.launcher3.uioverrides.touchcontrollers.TwoButtonNavbarTouchController;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
import com.android.launcher3.util.ItemInfoMatcher;
|
||||
import com.android.launcher3.util.PendingRequestArgs;
|
||||
import com.android.launcher3.util.TouchController;
|
||||
import com.android.launcher3.util.UiThreadHelper;
|
||||
import com.android.launcher3.util.UiThreadHelper.AsyncCommand;
|
||||
import com.android.launcher3.widget.LauncherAppWidgetHost;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.quickstep.SysUINavigationMode.Mode;
|
||||
import com.android.quickstep.SystemUiProxy;
|
||||
import com.android.quickstep.TaskUtils;
|
||||
import com.android.quickstep.util.QuickstepOnboardingPrefs;
|
||||
@@ -303,7 +303,7 @@ public class QuickstepLauncher extends BaseQuickstepLauncher {
|
||||
|
||||
@Override
|
||||
public TouchController[] createTouchControllers() {
|
||||
Mode mode = SysUINavigationMode.getMode(this);
|
||||
NavigationMode mode = DisplayController.getNavigationMode(this);
|
||||
|
||||
ArrayList<TouchController> list = new ArrayList<>();
|
||||
list.add(getDragController());
|
||||
|
||||
@@ -26,8 +26,8 @@ import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.Launcher;
|
||||
import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.Themes;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.quickstep.util.LayoutUtils;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
import com.android.quickstep.views.TaskView;
|
||||
@@ -58,7 +58,7 @@ public class OverviewState extends LauncherState {
|
||||
@Override
|
||||
public int getTransitionDuration(Context context) {
|
||||
// In gesture modes, overview comes in all the way from the side, so give it more time.
|
||||
return SysUINavigationMode.INSTANCE.get(context).getMode().hasGestures ? 380 : 250;
|
||||
return DisplayController.getNavigationMode(context).hasGestures ? 380 : 250;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+3
-3
@@ -60,7 +60,7 @@ import com.android.launcher3.Workspace;
|
||||
import com.android.launcher3.anim.Interpolators;
|
||||
import com.android.launcher3.states.StateAnimationConfig;
|
||||
import com.android.launcher3.uioverrides.QuickstepLauncher;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.quickstep.util.RecentsAtomicAnimationFactory;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
|
||||
@@ -97,7 +97,7 @@ public class QuickstepAtomicAnimationFactory extends
|
||||
config.setInterpolator(ANIM_WORKSPACE_SCALE, DEACCEL);
|
||||
config.setInterpolator(ANIM_WORKSPACE_FADE, ACCEL);
|
||||
|
||||
if (SysUINavigationMode.getMode(mActivity).hasGestures
|
||||
if (DisplayController.getNavigationMode(mActivity).hasGestures
|
||||
&& overview.getTaskViewCount() > 0) {
|
||||
// Overview is going offscreen, so keep it at its current scale and opacity.
|
||||
config.setInterpolator(ANIM_OVERVIEW_SCALE, FINAL_FRAME);
|
||||
@@ -139,7 +139,7 @@ public class QuickstepAtomicAnimationFactory extends
|
||||
}
|
||||
} else if ((fromState == NORMAL || fromState == HINT_STATE
|
||||
|| fromState == HINT_STATE_TWO_BUTTON) && toState == OVERVIEW) {
|
||||
if (SysUINavigationMode.getMode(mActivity).hasGestures) {
|
||||
if (DisplayController.getNavigationMode(mActivity).hasGestures) {
|
||||
config.setInterpolator(ANIM_WORKSPACE_SCALE,
|
||||
fromState == NORMAL ? ACCEL : OVERSHOOT_1_2);
|
||||
config.setInterpolator(ANIM_WORKSPACE_TRANSLATE, ACCEL);
|
||||
|
||||
+3
-3
@@ -44,8 +44,8 @@ import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.states.StateAnimationConfig;
|
||||
import com.android.launcher3.touch.AbstractStateChangeTouchController;
|
||||
import com.android.launcher3.touch.SingleAxisSwipeDetector;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.quickstep.SysUINavigationMode.Mode;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
import com.android.quickstep.SystemUiProxy;
|
||||
import com.android.quickstep.TaskUtils;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
@@ -125,7 +125,7 @@ public class QuickSwitchTouchController extends AbstractStateChangeTouchControll
|
||||
private void setupInterpolators(StateAnimationConfig stateAnimationConfig) {
|
||||
stateAnimationConfig.setInterpolator(ANIM_WORKSPACE_FADE, DEACCEL_2);
|
||||
stateAnimationConfig.setInterpolator(ANIM_ALL_APPS_FADE, DEACCEL_2);
|
||||
if (SysUINavigationMode.getMode(mLauncher) == Mode.NO_BUTTON) {
|
||||
if (DisplayController.getNavigationMode(mLauncher) == NavigationMode.NO_BUTTON) {
|
||||
// Overview lives to the left of workspace, so translate down later than over
|
||||
stateAnimationConfig.setInterpolator(ANIM_WORKSPACE_TRANSLATE, ACCEL_2);
|
||||
stateAnimationConfig.setInterpolator(ANIM_VERTICAL_PROGRESS, ACCEL_2);
|
||||
|
||||
+2
-2
@@ -38,10 +38,10 @@ import com.android.launcher3.anim.PendingAnimation;
|
||||
import com.android.launcher3.touch.BaseSwipeDetector;
|
||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||
import com.android.launcher3.touch.SingleAxisSwipeDetector;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.FlingBlockCheck;
|
||||
import com.android.launcher3.util.TouchController;
|
||||
import com.android.launcher3.views.BaseDragLayer;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.quickstep.util.VibratorWrapper;
|
||||
import com.android.quickstep.views.RecentsView;
|
||||
import com.android.quickstep.views.TaskView;
|
||||
@@ -177,7 +177,7 @@ public abstract class TaskViewTouchController<T extends BaseDraggingActivity>
|
||||
// - It's the focused task if in grid view
|
||||
// - The task is snapped
|
||||
mAllowGoingDown = i == mRecentsView.getCurrentPage()
|
||||
&& SysUINavigationMode.getMode(mActivity).hasGestures
|
||||
&& DisplayController.getNavigationMode(mActivity).hasGestures
|
||||
&& (!mRecentsView.showAsGrid() || mTaskBeingDragged.isFocusedTask())
|
||||
&& mRecentsView.isTaskInExpectedScrollPosition(i);
|
||||
|
||||
|
||||
@@ -19,9 +19,9 @@ import static com.android.launcher3.LauncherAnimUtils.VIEW_BACKGROUND_COLOR;
|
||||
import static com.android.launcher3.anim.Interpolators.ACCEL_2;
|
||||
import static com.android.launcher3.anim.Interpolators.INSTANT;
|
||||
import static com.android.launcher3.anim.Interpolators.LINEAR;
|
||||
import static com.android.launcher3.util.DisplayController.getNavigationMode;
|
||||
import static com.android.quickstep.AbsSwipeUpHandler.RECENTS_ATTACH_DURATION;
|
||||
import static com.android.quickstep.GestureState.GestureEndTarget.RECENTS;
|
||||
import static com.android.quickstep.SysUINavigationMode.getMode;
|
||||
import static com.android.quickstep.util.RecentsAtomicAnimationFactory.INDEX_RECENTS_FADE_ANIM;
|
||||
import static com.android.quickstep.util.RecentsAtomicAnimationFactory.INDEX_RECENTS_TRANSLATE_X_ANIM;
|
||||
import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_HORIZONTAL_OFFSET;
|
||||
@@ -55,9 +55,10 @@ import com.android.launcher3.statemanager.BaseState;
|
||||
import com.android.launcher3.statemanager.StatefulActivity;
|
||||
import com.android.launcher3.taskbar.TaskbarUIController;
|
||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
import com.android.launcher3.util.WindowBounds;
|
||||
import com.android.launcher3.views.ScrimView;
|
||||
import com.android.quickstep.SysUINavigationMode.Mode;
|
||||
import com.android.quickstep.util.ActivityInitListener;
|
||||
import com.android.quickstep.util.AnimatorControllerWithResistance;
|
||||
import com.android.quickstep.util.SplitScreenBounds;
|
||||
@@ -356,8 +357,8 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T
|
||||
/** Gets the space that the overview actions will take, including bottom margin. */
|
||||
private int getOverviewActionsHeight(Context context, DeviceProfile dp) {
|
||||
Resources res = context.getResources();
|
||||
return OverviewActionsView.getOverviewActionsBottomMarginPx(getMode(context), dp)
|
||||
+ OverviewActionsView.getOverviewActionsTopMarginPx(getMode(context), dp)
|
||||
return OverviewActionsView.getOverviewActionsBottomMarginPx(getNavigationMode(context), dp)
|
||||
+ OverviewActionsView.getOverviewActionsTopMarginPx(getNavigationMode(context), dp)
|
||||
+ res.getDimensionPixelSize(R.dimen.overview_actions_height);
|
||||
}
|
||||
|
||||
@@ -480,7 +481,7 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T
|
||||
// Creating the activity controller animation sometimes reapplies the launcher state
|
||||
// (because we set the animation as the current state animation), so we reapply the
|
||||
// attached state here as well to ensure recents is shown/hidden appropriately.
|
||||
if (SysUINavigationMode.getMode(mActivity) == Mode.NO_BUTTON) {
|
||||
if (DisplayController.getNavigationMode(mActivity) == NavigationMode.NO_BUTTON) {
|
||||
setRecentsAttachedToAppWindow(mIsAttachedToWindow, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
package com.android.quickstep;
|
||||
|
||||
import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
|
||||
import static com.android.quickstep.SysUINavigationMode.Mode.NO_BUTTON;
|
||||
import static com.android.launcher3.util.DisplayController.NavigationMode.NO_BUTTON;
|
||||
import static com.android.quickstep.fallback.RecentsState.BACKGROUND_APP;
|
||||
import static com.android.quickstep.fallback.RecentsState.DEFAULT;
|
||||
import static com.android.quickstep.fallback.RecentsState.HOME;
|
||||
@@ -33,6 +33,7 @@ import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.statemanager.StateManager;
|
||||
import com.android.launcher3.taskbar.FallbackTaskbarUIController;
|
||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.quickstep.GestureState.GestureEndTarget;
|
||||
import com.android.quickstep.fallback.RecentsState;
|
||||
import com.android.quickstep.util.ActivityInitListener;
|
||||
@@ -62,8 +63,7 @@ public final class FallbackActivityInterface extends
|
||||
public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect,
|
||||
PagedOrientationHandler orientationHandler) {
|
||||
calculateTaskSize(context, dp, outRect);
|
||||
if (dp.isVerticalBarLayout()
|
||||
&& SysUINavigationMode.INSTANCE.get(context).getMode() != NO_BUTTON) {
|
||||
if (dp.isVerticalBarLayout() && DisplayController.getNavigationMode(context) != NO_BUTTON) {
|
||||
return dp.isSeascape() ? outRect.left : (dp.widthPx - outRect.right);
|
||||
} else {
|
||||
return dp.heightPx - outRect.bottom;
|
||||
|
||||
@@ -56,6 +56,7 @@ import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.anim.AnimatorPlaybackController;
|
||||
import com.android.launcher3.anim.PendingAnimation;
|
||||
import com.android.launcher3.anim.SpringAnimationBuilder;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.quickstep.fallback.FallbackRecentsView;
|
||||
import com.android.quickstep.fallback.RecentsState;
|
||||
import com.android.quickstep.util.RectFSpringAnim;
|
||||
@@ -176,7 +177,7 @@ public class FallbackSwipeHandler extends
|
||||
@Override
|
||||
protected void notifyGestureAnimationStartToRecents() {
|
||||
if (mRunningOverHome) {
|
||||
if (SysUINavigationMode.getMode(mContext).hasGestures) {
|
||||
if (DisplayController.getNavigationMode(mContext).hasGestures) {
|
||||
mRecentsView.onGestureAnimationStartOnHome(
|
||||
new ActivityManager.RunningTaskInfo[]{mGestureState.getRunningTask()});
|
||||
}
|
||||
|
||||
@@ -44,8 +44,9 @@ import com.android.launcher3.statehandlers.DepthController.ClampedDepthProperty;
|
||||
import com.android.launcher3.statemanager.StateManager;
|
||||
import com.android.launcher3.taskbar.LauncherTaskbarUIController;
|
||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
import com.android.quickstep.GestureState.GestureEndTarget;
|
||||
import com.android.quickstep.SysUINavigationMode.Mode;
|
||||
import com.android.quickstep.util.ActivityInitListener;
|
||||
import com.android.quickstep.util.AnimatorControllerWithResistance;
|
||||
import com.android.quickstep.util.LayoutUtils;
|
||||
@@ -72,7 +73,8 @@ public final class LauncherActivityInterface extends
|
||||
public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect,
|
||||
PagedOrientationHandler orientationHandler) {
|
||||
calculateTaskSize(context, dp, outRect);
|
||||
if (dp.isVerticalBarLayout() && SysUINavigationMode.getMode(context) != Mode.NO_BUTTON) {
|
||||
if (dp.isVerticalBarLayout()
|
||||
&& DisplayController.getNavigationMode(context) != NavigationMode.NO_BUTTON) {
|
||||
return dp.isSeascape() ? outRect.left : (dp.widthPx - outRect.right);
|
||||
} else {
|
||||
return LayoutUtils.getShelfTrackingDistance(context, dp, orientationHandler);
|
||||
|
||||
@@ -34,6 +34,7 @@ import android.view.Surface;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.ResourceUtils;
|
||||
import com.android.launcher3.util.DisplayController.Info;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.util.HashMap;
|
||||
@@ -112,7 +113,7 @@ class OrientationTouchTransformer {
|
||||
* mQuickstepStartingRotation only updates when device rotation matches touch rotation.
|
||||
*/
|
||||
private int mActiveTouchRotation;
|
||||
private SysUINavigationMode.Mode mMode;
|
||||
private NavigationMode mMode;
|
||||
private QuickStepContractInfo mContractInfo;
|
||||
|
||||
/**
|
||||
@@ -135,7 +136,7 @@ class OrientationTouchTransformer {
|
||||
}
|
||||
|
||||
|
||||
OrientationTouchTransformer(Resources resources, SysUINavigationMode.Mode mode,
|
||||
OrientationTouchTransformer(Resources resources, NavigationMode mode,
|
||||
QuickStepContractInfo contractInfo) {
|
||||
mResources = resources;
|
||||
mMode = mode;
|
||||
@@ -155,7 +156,7 @@ class OrientationTouchTransformer {
|
||||
resetSwipeRegions(info);
|
||||
}
|
||||
|
||||
void setNavigationMode(SysUINavigationMode.Mode newMode, Info info, Resources newRes) {
|
||||
void setNavigationMode(NavigationMode newMode, Info info, Resources newRes) {
|
||||
if (DEBUG) {
|
||||
Log.d(TAG, "setNavigationMode new: " + newMode + " oldMode: " + mMode + " " + this);
|
||||
}
|
||||
@@ -212,8 +213,7 @@ class OrientationTouchTransformer {
|
||||
* @param info The current displayInfo which will be the start of the quickswitch gesture
|
||||
*/
|
||||
void enableMultipleRegions(boolean enableMultipleRegions, Info info) {
|
||||
mEnableMultipleRegions = enableMultipleRegions &&
|
||||
mMode != SysUINavigationMode.Mode.TWO_BUTTONS;
|
||||
mEnableMultipleRegions = enableMultipleRegions && mMode != NavigationMode.TWO_BUTTONS;
|
||||
if (mEnableMultipleRegions) {
|
||||
mQuickStepStartingRotation = info.rotation;
|
||||
} else {
|
||||
@@ -276,9 +276,8 @@ class OrientationTouchTransformer {
|
||||
Point size = display.currentSize;
|
||||
int rotation = display.rotation;
|
||||
int touchHeight = mNavBarGesturalHeight;
|
||||
OrientationRectF orientationRectF =
|
||||
new OrientationRectF(0, 0, size.x, size.y, rotation);
|
||||
if (mMode == SysUINavigationMode.Mode.NO_BUTTON) {
|
||||
OrientationRectF orientationRectF = new OrientationRectF(0, 0, size.x, size.y, rotation);
|
||||
if (mMode == NavigationMode.NO_BUTTON) {
|
||||
orientationRectF.top = orientationRectF.bottom - touchHeight;
|
||||
updateAssistantRegions(orientationRectF);
|
||||
} else {
|
||||
|
||||
@@ -21,12 +21,13 @@ import static android.content.Intent.ACTION_USER_UNLOCKED;
|
||||
import static android.view.Display.DEFAULT_DISPLAY;
|
||||
|
||||
import static com.android.launcher3.util.DisplayController.CHANGE_ALL;
|
||||
import static com.android.launcher3.util.DisplayController.CHANGE_NAVIGATION_MODE;
|
||||
import static com.android.launcher3.util.DisplayController.CHANGE_ROTATION;
|
||||
import static com.android.launcher3.util.DisplayController.NavigationMode.NO_BUTTON;
|
||||
import static com.android.launcher3.util.DisplayController.NavigationMode.THREE_BUTTONS;
|
||||
import static com.android.launcher3.util.DisplayController.NavigationMode.TWO_BUTTONS;
|
||||
import static com.android.launcher3.util.SettingsCache.ONE_HANDED_ENABLED;
|
||||
import static com.android.launcher3.util.SettingsCache.ONE_HANDED_SWIPE_BOTTOM_TO_NOTIFICATION_ENABLED;
|
||||
import static com.android.quickstep.SysUINavigationMode.Mode.NO_BUTTON;
|
||||
import static com.android.quickstep.SysUINavigationMode.Mode.THREE_BUTTONS;
|
||||
import static com.android.quickstep.SysUINavigationMode.Mode.TWO_BUTTONS;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_CLICKABLE;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_ALLOW_GESTURE_IGNORING_BAR_VISIBILITY;
|
||||
@@ -71,9 +72,8 @@ import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.DisplayController.DisplayInfoChangeListener;
|
||||
import com.android.launcher3.util.DisplayController.Info;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
import com.android.launcher3.util.SettingsCache;
|
||||
import com.android.quickstep.SysUINavigationMode.NavigationModeChangeListener;
|
||||
import com.android.quickstep.SysUINavigationMode.OneHandedModeChangeListener;
|
||||
import com.android.quickstep.util.NavBarPosition;
|
||||
import com.android.systemui.shared.system.ActivityManagerWrapper;
|
||||
import com.android.systemui.shared.system.QuickStepContract;
|
||||
@@ -89,15 +89,11 @@ import java.util.List;
|
||||
/**
|
||||
* Manages the state of the system during a swipe up gesture.
|
||||
*/
|
||||
public class RecentsAnimationDeviceState implements
|
||||
NavigationModeChangeListener,
|
||||
DisplayInfoChangeListener,
|
||||
OneHandedModeChangeListener {
|
||||
public class RecentsAnimationDeviceState implements DisplayInfoChangeListener {
|
||||
|
||||
static final String SUPPORT_ONE_HANDED_MODE = "ro.support_one_handed_mode";
|
||||
|
||||
private final Context mContext;
|
||||
private final SysUINavigationMode mSysUiNavMode;
|
||||
private final DisplayController mDisplayController;
|
||||
private final int mDisplayId;
|
||||
private final RotationTouchHelper mRotationTouchHelper;
|
||||
@@ -110,7 +106,7 @@ public class RecentsAnimationDeviceState implements
|
||||
private final ArrayList<Runnable> mOnDestroyActions = new ArrayList<>();
|
||||
|
||||
private @SystemUiStateFlags int mSystemUiStateFlags;
|
||||
private SysUINavigationMode.Mode mMode = THREE_BUTTONS;
|
||||
private NavigationMode mMode = THREE_BUTTONS;
|
||||
private NavBarPosition mNavBarPosition;
|
||||
|
||||
private final Region mDeferredGestureRegion = new Region();
|
||||
@@ -148,10 +144,8 @@ public class RecentsAnimationDeviceState implements
|
||||
public RecentsAnimationDeviceState(Context context, boolean isInstanceForTouches) {
|
||||
mContext = context;
|
||||
mDisplayController = DisplayController.INSTANCE.get(context);
|
||||
mSysUiNavMode = SysUINavigationMode.INSTANCE.get(context);
|
||||
mDisplayId = DEFAULT_DISPLAY;
|
||||
mIsOneHandedModeSupported = SystemProperties.getBoolean(SUPPORT_ONE_HANDED_MODE, false);
|
||||
runOnDestroy(() -> mDisplayController.removeChangeListener(this));
|
||||
mRotationTouchHelper = RotationTouchHelper.INSTANCE.get(context);
|
||||
if (isInstanceForTouches) {
|
||||
// rotationTouchHelper doesn't get initialized after being destroyed, so only destroy
|
||||
@@ -180,9 +174,10 @@ public class RecentsAnimationDeviceState implements
|
||||
};
|
||||
runOnDestroy(mExclusionListener::unregister);
|
||||
|
||||
// Register for navigation mode changes
|
||||
onNavigationModeChanged(mSysUiNavMode.addModeChangeListener(this));
|
||||
runOnDestroy(() -> mSysUiNavMode.removeModeChangeListener(this));
|
||||
// Register for display changes changes
|
||||
mDisplayController.addChangeListener(this);
|
||||
onDisplayInfoChanged(context, mDisplayController.getInfo(), CHANGE_ALL);
|
||||
runOnDestroy(() -> mDisplayController.removeChangeListener(this));
|
||||
|
||||
// Add any blocked activities
|
||||
String[] blockingActivities;
|
||||
@@ -267,46 +262,35 @@ public class RecentsAnimationDeviceState implements
|
||||
* Adds a listener for the nav mode change, guaranteed to be called after the device state's
|
||||
* mode has changed.
|
||||
*/
|
||||
public void addNavigationModeChangedCallback(NavigationModeChangeListener listener) {
|
||||
listener.onNavigationModeChanged(mSysUiNavMode.addModeChangeListener(listener));
|
||||
runOnDestroy(() -> mSysUiNavMode.removeModeChangeListener(listener));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNavigationModeChanged(SysUINavigationMode.Mode newMode) {
|
||||
mDisplayController.removeChangeListener(this);
|
||||
mDisplayController.addChangeListener(this);
|
||||
onDisplayInfoChanged(mContext, mDisplayController.getInfo(), CHANGE_ALL);
|
||||
|
||||
if (newMode == NO_BUTTON) {
|
||||
mExclusionListener.register();
|
||||
} else {
|
||||
mExclusionListener.unregister();
|
||||
}
|
||||
|
||||
mNavBarPosition = new NavBarPosition(newMode, mDisplayController.getInfo());
|
||||
mMode = newMode;
|
||||
public void addNavigationModeChangedCallback(Runnable callback) {
|
||||
DisplayController.DisplayInfoChangeListener listener = (context, info, flags) -> {
|
||||
if ((flags & CHANGE_NAVIGATION_MODE) != 0) {
|
||||
callback.run();
|
||||
}
|
||||
};
|
||||
mDisplayController.addChangeListener(listener);
|
||||
callback.run();
|
||||
runOnDestroy(() -> mDisplayController.removeChangeListener(listener));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisplayInfoChanged(Context context, Info info, int flags) {
|
||||
if ((flags & CHANGE_ROTATION) != 0) {
|
||||
if ((flags & (CHANGE_ROTATION | CHANGE_NAVIGATION_MODE)) != 0) {
|
||||
mMode = info.navigationMode;
|
||||
mNavBarPosition = new NavBarPosition(mMode, info);
|
||||
|
||||
if (mMode == NO_BUTTON) {
|
||||
mExclusionListener.register();
|
||||
} else {
|
||||
mExclusionListener.unregister();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onOneHandedModeChanged(int newGesturalHeight) {
|
||||
mRotationTouchHelper.setGesturalHeight(newGesturalHeight);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the current navigation mode for the device.
|
||||
*/
|
||||
public SysUINavigationMode.Mode getNavMode() {
|
||||
return mMode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the nav bar position for the current nav bar mode and display rotation.
|
||||
*/
|
||||
|
||||
@@ -20,9 +20,10 @@ import static android.view.Surface.ROTATION_0;
|
||||
|
||||
import static com.android.launcher3.util.DisplayController.CHANGE_ACTIVE_SCREEN;
|
||||
import static com.android.launcher3.util.DisplayController.CHANGE_ALL;
|
||||
import static com.android.launcher3.util.DisplayController.CHANGE_NAVIGATION_MODE;
|
||||
import static com.android.launcher3.util.DisplayController.CHANGE_ROTATION;
|
||||
import static com.android.launcher3.util.DisplayController.NavigationMode.THREE_BUTTONS;
|
||||
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
|
||||
import static com.android.quickstep.SysUINavigationMode.Mode.THREE_BUTTONS;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
@@ -33,6 +34,7 @@ import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.DisplayController.DisplayInfoChangeListener;
|
||||
import com.android.launcher3.util.DisplayController.Info;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
import com.android.launcher3.util.MainThreadInitializedObject;
|
||||
import com.android.quickstep.util.RecentsOrientedState;
|
||||
import com.android.systemui.shared.system.QuickStepContract;
|
||||
@@ -42,22 +44,22 @@ import com.android.systemui.shared.system.TaskStackChangeListeners;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class RotationTouchHelper implements
|
||||
SysUINavigationMode.NavigationModeChangeListener,
|
||||
DisplayInfoChangeListener {
|
||||
/**
|
||||
* Helper class for transforming touch events
|
||||
*/
|
||||
public class RotationTouchHelper implements DisplayInfoChangeListener {
|
||||
|
||||
public static final MainThreadInitializedObject<RotationTouchHelper> INSTANCE =
|
||||
new MainThreadInitializedObject<>(RotationTouchHelper::new);
|
||||
|
||||
private OrientationTouchTransformer mOrientationTouchTransformer;
|
||||
private DisplayController mDisplayController;
|
||||
private SysUINavigationMode mSysUiNavMode;
|
||||
private int mDisplayId;
|
||||
private int mDisplayRotation;
|
||||
|
||||
private final ArrayList<Runnable> mOnDestroyActions = new ArrayList<>();
|
||||
|
||||
private SysUINavigationMode.Mode mMode = THREE_BUTTONS;
|
||||
private NavigationMode mMode = THREE_BUTTONS;
|
||||
|
||||
private TaskStackChangeListener mFrozenTaskListener = new TaskStackChangeListener() {
|
||||
@Override
|
||||
@@ -144,16 +146,16 @@ public class RotationTouchHelper implements
|
||||
}
|
||||
mDisplayController = DisplayController.INSTANCE.get(mContext);
|
||||
Resources resources = mContext.getResources();
|
||||
mSysUiNavMode = SysUINavigationMode.INSTANCE.get(mContext);
|
||||
mDisplayId = DEFAULT_DISPLAY;
|
||||
|
||||
mOrientationTouchTransformer = new OrientationTouchTransformer(resources, mMode,
|
||||
() -> QuickStepContract.getWindowCornerRadius(mContext));
|
||||
|
||||
// Register for navigation mode changes
|
||||
SysUINavigationMode.Mode newMode = mSysUiNavMode.addModeChangeListener(this);
|
||||
onNavModeChangedInternal(newMode, newMode.hasGestures);
|
||||
runOnDestroy(() -> mSysUiNavMode.removeModeChangeListener(this));
|
||||
mDisplayController.addChangeListener(this);
|
||||
DisplayController.Info info = mDisplayController.getInfo();
|
||||
onDisplayInfoChangedInternal(info, CHANGE_ALL, info.navigationMode.hasGestures);
|
||||
runOnDestroy(() -> mDisplayController.removeChangeListener(this));
|
||||
|
||||
mOrientationListener = new OrientationEventListener(mContext) {
|
||||
@Override
|
||||
@@ -242,66 +244,56 @@ public class RotationTouchHelper implements
|
||||
event.getY(pointerIndex));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onNavigationModeChanged(SysUINavigationMode.Mode newMode) {
|
||||
onNavModeChangedInternal(newMode, false);
|
||||
public void onDisplayInfoChanged(Context context, Info info, int flags) {
|
||||
onDisplayInfoChangedInternal(info, flags, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param forceRegister if {@code true}, this will register {@link #mFrozenTaskListener} via
|
||||
* {@link #setupOrientationSwipeHandler()}
|
||||
*/
|
||||
private void onNavModeChangedInternal(SysUINavigationMode.Mode newMode, boolean forceRegister) {
|
||||
mDisplayController.removeChangeListener(this);
|
||||
mDisplayController.addChangeListener(this);
|
||||
onDisplayInfoChanged(mContext, mDisplayController.getInfo(), CHANGE_ALL);
|
||||
private void onDisplayInfoChangedInternal(Info info, int flags, boolean forceRegister) {
|
||||
if ((flags & (CHANGE_ROTATION | CHANGE_ACTIVE_SCREEN | CHANGE_NAVIGATION_MODE)) != 0) {
|
||||
mDisplayRotation = info.rotation;
|
||||
|
||||
mOrientationTouchTransformer.setNavigationMode(newMode, mDisplayController.getInfo(),
|
||||
mContext.getResources());
|
||||
if (mMode.hasGestures) {
|
||||
updateGestureTouchRegions();
|
||||
mOrientationTouchTransformer.createOrAddTouchRegion(info);
|
||||
mCurrentAppRotation = mDisplayRotation;
|
||||
|
||||
if (forceRegister || (!mMode.hasGestures && newMode.hasGestures)) {
|
||||
setupOrientationSwipeHandler();
|
||||
} else if (mMode.hasGestures && !newMode.hasGestures){
|
||||
destroyOrientationSwipeHandlerCallback();
|
||||
/* Update nav bars on the following:
|
||||
* a) if this is coming from an activity rotation OR
|
||||
* aa) we launch an app in the orientation that user is already in
|
||||
* b) We're not in overview, since overview will always be portrait (w/o home
|
||||
* rotation)
|
||||
* c) We're actively in quickswitch mode
|
||||
*/
|
||||
if ((mPrioritizeDeviceRotation
|
||||
|| mCurrentAppRotation == mSensorRotation)
|
||||
// switch to an app of orientation user is in
|
||||
&& !mInOverview
|
||||
&& mTaskListFrozen) {
|
||||
toggleSecondaryNavBarsForRotation();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mMode = newMode;
|
||||
if ((flags & CHANGE_NAVIGATION_MODE) != 0) {
|
||||
NavigationMode newMode = info.navigationMode;
|
||||
mOrientationTouchTransformer.setNavigationMode(newMode, mDisplayController.getInfo(),
|
||||
mContext.getResources());
|
||||
|
||||
if (forceRegister || (!mMode.hasGestures && newMode.hasGestures)) {
|
||||
setupOrientationSwipeHandler();
|
||||
} else if (mMode.hasGestures && !newMode.hasGestures) {
|
||||
destroyOrientationSwipeHandlerCallback();
|
||||
}
|
||||
|
||||
mMode = newMode;
|
||||
}
|
||||
}
|
||||
|
||||
public int getDisplayRotation() {
|
||||
return mDisplayRotation;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisplayInfoChanged(Context context, Info info, int flags) {
|
||||
if ((flags & (CHANGE_ROTATION | CHANGE_ACTIVE_SCREEN)) == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
mDisplayRotation = info.rotation;
|
||||
|
||||
if (!mMode.hasGestures) {
|
||||
return;
|
||||
}
|
||||
updateGestureTouchRegions();
|
||||
mOrientationTouchTransformer.createOrAddTouchRegion(info);
|
||||
mCurrentAppRotation = mDisplayRotation;
|
||||
|
||||
/* Update nav bars on the following:
|
||||
* a) if this is coming from an activity rotation OR
|
||||
* aa) we launch an app in the orientation that user is already in
|
||||
* b) We're not in overview, since overview will always be portrait (w/o home rotation)
|
||||
* c) We're actively in quickswitch mode
|
||||
*/
|
||||
if ((mPrioritizeDeviceRotation
|
||||
|| mCurrentAppRotation == mSensorRotation) // switch to an app of orientation user is in
|
||||
&& !mInOverview
|
||||
&& mTaskListFrozen) {
|
||||
toggleSecondaryNavBarsForRotation();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the gestural height.
|
||||
*/
|
||||
|
||||
@@ -1,195 +0,0 @@
|
||||
/*
|
||||
* 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.quickstep;
|
||||
|
||||
import static com.android.launcher3.ResourceUtils.INVALID_RESOURCE_HANDLE;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NAVIGATION_MODE_2_BUTTON;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NAVIGATION_MODE_3_BUTTON;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NAVIGATION_MODE_GESTURE_BUTTON;
|
||||
import static com.android.launcher3.util.PackageManagerHelper.getPackageFilter;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.util.Log;
|
||||
|
||||
import com.android.launcher3.ResourceUtils;
|
||||
import com.android.launcher3.logging.StatsLogManager.LauncherEvent;
|
||||
import com.android.launcher3.util.MainThreadInitializedObject;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
/**
|
||||
* Observer for the resource config that specifies the navigation bar mode.
|
||||
*/
|
||||
public class SysUINavigationMode {
|
||||
|
||||
public enum Mode {
|
||||
THREE_BUTTONS(false, 0, LAUNCHER_NAVIGATION_MODE_3_BUTTON),
|
||||
TWO_BUTTONS(true, 1, LAUNCHER_NAVIGATION_MODE_2_BUTTON),
|
||||
NO_BUTTON(true, 2, LAUNCHER_NAVIGATION_MODE_GESTURE_BUTTON);
|
||||
|
||||
public final boolean hasGestures;
|
||||
public final int resValue;
|
||||
public final LauncherEvent launcherEvent;
|
||||
|
||||
Mode(boolean hasGestures, int resValue, LauncherEvent launcherEvent) {
|
||||
this.hasGestures = hasGestures;
|
||||
this.resValue = resValue;
|
||||
this.launcherEvent = launcherEvent;
|
||||
}
|
||||
}
|
||||
|
||||
public static Mode getMode(Context context) {
|
||||
return INSTANCE.get(context).getMode();
|
||||
}
|
||||
|
||||
public static boolean getImeDrawsImeNavBar(Context context) {
|
||||
return INSTANCE.get(context).getImeDrawsImeNavBar();
|
||||
}
|
||||
|
||||
public static final MainThreadInitializedObject<SysUINavigationMode> INSTANCE =
|
||||
new MainThreadInitializedObject<>(SysUINavigationMode::new);
|
||||
|
||||
private static final String TAG = "SysUINavigationMode";
|
||||
private static final String ACTION_OVERLAY_CHANGED = "android.intent.action.OVERLAY_CHANGED";
|
||||
private static final String NAV_BAR_INTERACTION_MODE_RES_NAME = "config_navBarInteractionMode";
|
||||
private static final String IME_DRAWS_IME_NAV_BAR_RES_NAME = "config_imeDrawsImeNavBar";
|
||||
private static final String TARGET_OVERLAY_PACKAGE = "android";
|
||||
|
||||
private final Context mContext;
|
||||
private Mode mMode;
|
||||
private boolean mImeDrawsImeNavBar;
|
||||
|
||||
private int mNavBarGesturalHeight;
|
||||
private int mNavBarLargerGesturalHeight;
|
||||
|
||||
private final List<NavigationModeChangeListener> mChangeListeners =
|
||||
new CopyOnWriteArrayList<>();
|
||||
|
||||
public SysUINavigationMode(Context context) {
|
||||
mContext = context;
|
||||
initializeMode();
|
||||
|
||||
mContext.registerReceiver(new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
updateMode();
|
||||
updateGesturalHeight();
|
||||
}
|
||||
}, getPackageFilter(TARGET_OVERLAY_PACKAGE, ACTION_OVERLAY_CHANGED));
|
||||
}
|
||||
|
||||
/** Updates navigation mode when needed. */
|
||||
public void updateMode() {
|
||||
Mode oldMode = mMode;
|
||||
initializeMode();
|
||||
if (mMode != oldMode) {
|
||||
dispatchModeChange();
|
||||
}
|
||||
}
|
||||
|
||||
private void updateGesturalHeight() {
|
||||
int newGesturalHeight = ResourceUtils.getDimenByName(
|
||||
ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE, mContext.getResources(),
|
||||
INVALID_RESOURCE_HANDLE);
|
||||
|
||||
if (newGesturalHeight == INVALID_RESOURCE_HANDLE) {
|
||||
Log.e(TAG, "Failed to get system resource ID. Incompatible framework version?");
|
||||
return;
|
||||
}
|
||||
|
||||
if (mNavBarGesturalHeight != newGesturalHeight) {
|
||||
mNavBarGesturalHeight = newGesturalHeight;
|
||||
}
|
||||
|
||||
int newLargerGesturalHeight = ResourceUtils.getDimenByName(
|
||||
ResourceUtils.NAVBAR_BOTTOM_GESTURE_LARGER_SIZE, mContext.getResources(),
|
||||
INVALID_RESOURCE_HANDLE);
|
||||
if (newLargerGesturalHeight == INVALID_RESOURCE_HANDLE) {
|
||||
Log.e(TAG, "Failed to get system resource ID. Incompatible framework version?");
|
||||
return;
|
||||
}
|
||||
if (mNavBarLargerGesturalHeight != newLargerGesturalHeight) {
|
||||
mNavBarLargerGesturalHeight = newLargerGesturalHeight;
|
||||
}
|
||||
}
|
||||
|
||||
private void initializeMode() {
|
||||
int modeInt = ResourceUtils.getIntegerByName(NAV_BAR_INTERACTION_MODE_RES_NAME,
|
||||
mContext.getResources(), INVALID_RESOURCE_HANDLE);
|
||||
mNavBarGesturalHeight = ResourceUtils.getDimenByName(
|
||||
ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE, mContext.getResources(),
|
||||
INVALID_RESOURCE_HANDLE);
|
||||
mNavBarLargerGesturalHeight = ResourceUtils.getDimenByName(
|
||||
ResourceUtils.NAVBAR_BOTTOM_GESTURE_LARGER_SIZE, mContext.getResources(),
|
||||
mNavBarGesturalHeight);
|
||||
mImeDrawsImeNavBar = ResourceUtils.getBoolByName(IME_DRAWS_IME_NAV_BAR_RES_NAME,
|
||||
mContext.getResources(), false);
|
||||
|
||||
if (modeInt == INVALID_RESOURCE_HANDLE) {
|
||||
Log.e(TAG, "Failed to get system resource ID. Incompatible framework version?");
|
||||
return;
|
||||
}
|
||||
|
||||
for (Mode m : Mode.values()) {
|
||||
if (m.resValue == modeInt) {
|
||||
mMode = m;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void dispatchModeChange() {
|
||||
for (NavigationModeChangeListener listener : mChangeListeners) {
|
||||
listener.onNavigationModeChanged(mMode);
|
||||
}
|
||||
}
|
||||
|
||||
public Mode addModeChangeListener(NavigationModeChangeListener listener) {
|
||||
mChangeListeners.add(listener);
|
||||
return mMode;
|
||||
}
|
||||
|
||||
public void removeModeChangeListener(NavigationModeChangeListener listener) {
|
||||
mChangeListeners.remove(listener);
|
||||
}
|
||||
|
||||
public Mode getMode() {
|
||||
return mMode;
|
||||
}
|
||||
|
||||
public boolean getImeDrawsImeNavBar() {
|
||||
return mImeDrawsImeNavBar;
|
||||
}
|
||||
|
||||
public void dump(PrintWriter pw) {
|
||||
pw.println("SysUINavigationMode:");
|
||||
pw.println(" mode=" + mMode.name());
|
||||
pw.println(" mImeDrawsImeNavBar=:" + mImeDrawsImeNavBar);
|
||||
pw.println(" mNavBarGesturalHeight=:" + mNavBarGesturalHeight);
|
||||
}
|
||||
|
||||
public interface NavigationModeChangeListener {
|
||||
void onNavigationModeChanged(Mode newMode);
|
||||
}
|
||||
|
||||
public interface OneHandedModeChangeListener {
|
||||
void onOneHandedModeChanged(int newGesturalHeight);
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,7 @@ package com.android.quickstep;
|
||||
|
||||
import static android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE;
|
||||
|
||||
import static com.android.launcher3.util.DisplayController.CHANGE_NAVIGATION_MODE;
|
||||
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
|
||||
|
||||
import android.app.PendingIntent;
|
||||
@@ -39,6 +40,8 @@ import android.view.RemoteAnimationAdapter;
|
||||
import android.view.RemoteAnimationTarget;
|
||||
import android.view.SurfaceControl;
|
||||
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.DisplayController.Info;
|
||||
import com.android.launcher3.util.MainThreadInitializedObject;
|
||||
import com.android.launcher3.util.SplitConfigurationOptions;
|
||||
import com.android.systemui.shared.recents.ISystemUiProxy;
|
||||
@@ -65,8 +68,7 @@ import java.util.Arrays;
|
||||
/**
|
||||
* Holds the reference to SystemUI.
|
||||
*/
|
||||
public class SystemUiProxy implements ISystemUiProxy,
|
||||
SysUINavigationMode.NavigationModeChangeListener {
|
||||
public class SystemUiProxy implements ISystemUiProxy, DisplayController.DisplayInfoChangeListener {
|
||||
private static final String TAG = SystemUiProxy.class.getSimpleName();
|
||||
|
||||
public static final MainThreadInitializedObject<SystemUiProxy> INSTANCE =
|
||||
@@ -107,13 +109,15 @@ public class SystemUiProxy implements ISystemUiProxy,
|
||||
private int mLastSystemUiStateFlags;
|
||||
|
||||
public SystemUiProxy(Context context) {
|
||||
SysUINavigationMode.INSTANCE.get(context).addModeChangeListener(this);
|
||||
DisplayController.INSTANCE.get(context).addChangeListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNavigationModeChanged(SysUINavigationMode.Mode newMode) {
|
||||
// Whenever the nav mode changes, force reset the nav button alpha
|
||||
setNavBarButtonAlpha(1f, false);
|
||||
public void onDisplayInfoChanged(Context context, Info info, int flags) {
|
||||
if ((flags & CHANGE_NAVIGATION_MODE) != 0) {
|
||||
// Whenever the nav mode changes, force reset the nav button alpha
|
||||
setNavBarButtonAlpha(1f, false);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -47,7 +47,6 @@ import android.content.res.Configuration;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.Region;
|
||||
import android.graphics.drawable.Icon;
|
||||
import android.hardware.display.DisplayManager;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.IBinder;
|
||||
@@ -77,6 +76,7 @@ import com.android.launcher3.testing.TestProtocol;
|
||||
import com.android.launcher3.tracing.LauncherTraceProto;
|
||||
import com.android.launcher3.tracing.TouchInteractionServiceProto;
|
||||
import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.OnboardingPrefs;
|
||||
import com.android.launcher3.util.TraceHelper;
|
||||
import com.android.launcher3.util.WindowBounds;
|
||||
@@ -344,8 +344,6 @@ public class TouchInteractionService extends Service
|
||||
private InputMonitorCompat mInputMonitorCompat;
|
||||
private InputEventReceiver mInputEventReceiver;
|
||||
|
||||
private DisplayManager mDisplayManager;
|
||||
|
||||
private TaskbarManager mTaskbarManager;
|
||||
private Function<GestureState, AnimatedFloat> mSwipeUpProxyProvider = i -> null;
|
||||
|
||||
@@ -357,7 +355,6 @@ public class TouchInteractionService extends Service
|
||||
mMainChoreographer = Choreographer.getInstance();
|
||||
mAM = ActivityManagerWrapper.getInstance();
|
||||
mDeviceState = new RecentsAnimationDeviceState(this, true);
|
||||
mDisplayManager = getSystemService(DisplayManager.class);
|
||||
mTaskbarManager = new TaskbarManager(this);
|
||||
mRotationTouchHelper = mDeviceState.getRotationTouchHelper();
|
||||
|
||||
@@ -399,7 +396,7 @@ public class TouchInteractionService extends Service
|
||||
/**
|
||||
* Called when the navigation mode changes, guaranteed to be after the device state has updated.
|
||||
*/
|
||||
private void onNavigationModeChanged(SysUINavigationMode.Mode mode) {
|
||||
private void onNavigationModeChanged() {
|
||||
initInputMonitor();
|
||||
resetHomeBounceSeenOnQuickstepEnabledFirstTime();
|
||||
}
|
||||
@@ -948,7 +945,7 @@ public class TouchInteractionService extends Service
|
||||
pw.println("Input state:");
|
||||
pw.println(" mInputMonitorCompat=" + mInputMonitorCompat);
|
||||
pw.println(" mInputEventReceiver=" + mInputEventReceiver);
|
||||
SysUINavigationMode.INSTANCE.get(this).dump(pw);
|
||||
DisplayController.INSTANCE.get(this).dump(pw);
|
||||
pw.println("TouchState:");
|
||||
BaseDraggingActivity createdOverviewActivity = mOverviewComponentObserver == null ? null
|
||||
: mOverviewComponentObserver.getActivityInterface().getCreatedActivity();
|
||||
|
||||
@@ -22,9 +22,9 @@ import androidx.annotation.Nullable;
|
||||
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
import com.android.launcher3.util.TouchController;
|
||||
import com.android.quickstep.RecentsActivity;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.quickstep.util.NavBarPosition;
|
||||
import com.android.quickstep.util.TriggerSwipeUpTouchTracker;
|
||||
|
||||
@@ -40,8 +40,8 @@ public class FallbackNavBarTouchController implements TouchController,
|
||||
|
||||
public FallbackNavBarTouchController(RecentsActivity activity) {
|
||||
mActivity = activity;
|
||||
SysUINavigationMode.Mode sysUINavigationMode = SysUINavigationMode.getMode(mActivity);
|
||||
if (sysUINavigationMode == SysUINavigationMode.Mode.NO_BUTTON) {
|
||||
NavigationMode sysUINavigationMode = DisplayController.getNavigationMode(mActivity);
|
||||
if (sysUINavigationMode == NavigationMode.NO_BUTTON) {
|
||||
NavBarPosition navBarPosition = new NavBarPosition(sysUINavigationMode,
|
||||
DisplayController.INSTANCE.get(mActivity).getInfo());
|
||||
mTriggerSwipeUpTracker = new TriggerSwipeUpTouchTracker(mActivity,
|
||||
|
||||
@@ -47,7 +47,7 @@ import androidx.annotation.Nullable;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.ResourceUtils;
|
||||
import com.android.launcher3.anim.Interpolators;
|
||||
import com.android.quickstep.SysUINavigationMode.Mode;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
import com.android.quickstep.util.MotionPauseDetector;
|
||||
import com.android.quickstep.util.NavBarPosition;
|
||||
import com.android.quickstep.util.TriggerSwipeUpTouchTracker;
|
||||
@@ -101,7 +101,7 @@ public class NavBarGestureHandler implements OnTouchListener,
|
||||
}
|
||||
mSwipeUpTouchTracker =
|
||||
new TriggerSwipeUpTouchTracker(context, true /*disableHorizontalSwipe*/,
|
||||
new NavBarPosition(Mode.NO_BUTTON, displayRotation),
|
||||
new NavBarPosition(NavigationMode.NO_BUTTON, displayRotation),
|
||||
null /*onInterceptTouch*/, this);
|
||||
mMotionPauseDetector = new MotionPauseDetector(context);
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCH
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_THEMED_ICON_ENABLED;
|
||||
import static com.android.launcher3.model.DeviceGridState.KEY_WORKSPACE_SIZE;
|
||||
import static com.android.launcher3.model.QuickstepModelDelegate.LAST_PREDICTION_ENABLED_STATE;
|
||||
import static com.android.launcher3.util.DisplayController.CHANGE_NAVIGATION_MODE;
|
||||
import static com.android.launcher3.util.SettingsCache.NOTIFICATION_BADGING_URI;
|
||||
import static com.android.launcher3.util.Themes.KEY_THEMED_ICONS;
|
||||
|
||||
@@ -44,11 +45,11 @@ import com.android.launcher3.logging.InstanceId;
|
||||
import com.android.launcher3.logging.StatsLogManager;
|
||||
import com.android.launcher3.logging.StatsLogManager.StatsLogger;
|
||||
import com.android.launcher3.model.DeviceGridState;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.DisplayController.Info;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
import com.android.launcher3.util.MainThreadInitializedObject;
|
||||
import com.android.launcher3.util.SettingsCache;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.quickstep.SysUINavigationMode.Mode;
|
||||
import com.android.quickstep.SysUINavigationMode.NavigationModeChangeListener;
|
||||
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
@@ -60,8 +61,8 @@ import java.util.Optional;
|
||||
* Utility class to log launcher settings changes
|
||||
*/
|
||||
public class SettingsChangeLogger implements
|
||||
NavigationModeChangeListener, OnSharedPreferenceChangeListener {
|
||||
|
||||
DisplayController.DisplayInfoChangeListener, OnSharedPreferenceChangeListener {
|
||||
|
||||
/**
|
||||
* Singleton instance
|
||||
*/
|
||||
@@ -76,7 +77,7 @@ public class SettingsChangeLogger implements
|
||||
private final ArrayMap<String, LoggablePref> mLoggablePrefs;
|
||||
private final StatsLogManager mStatsLogManager;
|
||||
|
||||
private Mode mNavMode;
|
||||
private NavigationMode mNavMode;
|
||||
private StatsLogManager.LauncherEvent mNotificationDotsEvent;
|
||||
private StatsLogManager.LauncherEvent mHomeScreenSuggestionEvent;
|
||||
|
||||
@@ -84,7 +85,8 @@ public class SettingsChangeLogger implements
|
||||
mContext = context;
|
||||
mStatsLogManager = StatsLogManager.newInstance(mContext);
|
||||
mLoggablePrefs = loadPrefKeys(context);
|
||||
mNavMode = SysUINavigationMode.INSTANCE.get(context).addModeChangeListener(this);
|
||||
DisplayController.INSTANCE.get(context).addChangeListener(this);
|
||||
mNavMode = DisplayController.getNavigationMode(context);
|
||||
|
||||
getPrefs(context).registerOnSharedPreferenceChangeListener(this);
|
||||
getDevicePrefs(context).registerOnSharedPreferenceChangeListener(this);
|
||||
@@ -141,9 +143,11 @@ public class SettingsChangeLogger implements
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNavigationModeChanged(Mode newMode) {
|
||||
mNavMode = newMode;
|
||||
mStatsLogManager.logger().log(newMode.launcherEvent);
|
||||
public void onDisplayInfoChanged(Context context, Info info, int flags) {
|
||||
if ((flags & CHANGE_NAVIGATION_MODE) != 0) {
|
||||
mNavMode = info.navigationMode;
|
||||
mStatsLogManager.logger().log(mNavMode.launcherEvent);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -22,8 +22,9 @@ import android.view.ViewGroup;
|
||||
|
||||
import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
import com.android.quickstep.LauncherActivityInterface;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
|
||||
public class LayoutUtils {
|
||||
|
||||
@@ -32,7 +33,7 @@ public class LayoutUtils {
|
||||
*/
|
||||
public static float getDefaultSwipeHeight(Context context, DeviceProfile dp) {
|
||||
float swipeHeight = dp.allAppsCellHeightPx - dp.allAppsIconTextSizePx;
|
||||
if (SysUINavigationMode.getMode(context) == SysUINavigationMode.Mode.NO_BUTTON) {
|
||||
if (DisplayController.getNavigationMode(context) == NavigationMode.NO_BUTTON) {
|
||||
swipeHeight -= dp.getInsets().bottom;
|
||||
}
|
||||
return swipeHeight;
|
||||
|
||||
@@ -15,27 +15,27 @@
|
||||
*/
|
||||
package com.android.quickstep.util;
|
||||
|
||||
import static com.android.quickstep.SysUINavigationMode.Mode.NO_BUTTON;
|
||||
import static com.android.launcher3.util.DisplayController.NavigationMode.NO_BUTTON;
|
||||
|
||||
import android.view.Surface;
|
||||
|
||||
import com.android.launcher3.util.DisplayController.Info;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
|
||||
/**
|
||||
* Utility class to check nav bar position.
|
||||
*/
|
||||
public class NavBarPosition {
|
||||
|
||||
private final SysUINavigationMode.Mode mMode;
|
||||
private final NavigationMode mMode;
|
||||
private final int mDisplayRotation;
|
||||
|
||||
public NavBarPosition(SysUINavigationMode.Mode mode, Info info) {
|
||||
public NavBarPosition(NavigationMode mode, Info info) {
|
||||
mMode = mode;
|
||||
mDisplayRotation = info.rotation;
|
||||
}
|
||||
|
||||
public NavBarPosition(SysUINavigationMode.Mode mode, int displayRotation) {
|
||||
public NavBarPosition(NavigationMode mode, int displayRotation) {
|
||||
mMode = mode;
|
||||
mDisplayRotation = displayRotation;
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ import static com.android.launcher3.LauncherState.ALL_APPS;
|
||||
import static com.android.launcher3.LauncherState.HINT_STATE;
|
||||
import static com.android.launcher3.LauncherState.NORMAL;
|
||||
import static com.android.launcher3.LauncherState.OVERVIEW;
|
||||
import static com.android.quickstep.SysUINavigationMode.Mode.NO_BUTTON;
|
||||
import static com.android.launcher3.util.DisplayController.NavigationMode.NO_BUTTON;
|
||||
|
||||
import android.content.SharedPreferences;
|
||||
|
||||
@@ -34,8 +34,8 @@ import com.android.launcher3.hybridhotseat.HotseatPredictionController;
|
||||
import com.android.launcher3.statemanager.StateManager;
|
||||
import com.android.launcher3.statemanager.StateManager.StateListener;
|
||||
import com.android.launcher3.uioverrides.QuickstepLauncher;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.OnboardingPrefs;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.quickstep.views.AllAppsEduView;
|
||||
|
||||
/**
|
||||
@@ -51,8 +51,8 @@ public class QuickstepOnboardingPrefs extends OnboardingPrefs<QuickstepLauncher>
|
||||
stateManager.addStateListener(new StateListener<LauncherState>() {
|
||||
@Override
|
||||
public void onStateTransitionComplete(LauncherState finalState) {
|
||||
boolean swipeUpEnabled = SysUINavigationMode.INSTANCE
|
||||
.get(mLauncher).getMode().hasGestures;
|
||||
boolean swipeUpEnabled =
|
||||
DisplayController.getNavigationMode(mLauncher).hasGestures;
|
||||
LauncherState prevState = stateManager.getLastState();
|
||||
|
||||
if (((swipeUpEnabled && finalState == OVERVIEW) || (!swipeUpEnabled
|
||||
@@ -88,7 +88,7 @@ public class QuickstepOnboardingPrefs extends OnboardingPrefs<QuickstepLauncher>
|
||||
});
|
||||
}
|
||||
|
||||
if (SysUINavigationMode.getMode(launcher) == NO_BUTTON
|
||||
if (DisplayController.getNavigationMode(launcher) == NO_BUTTON
|
||||
&& FeatureFlags.ENABLE_ALL_APPS_EDU.get()) {
|
||||
stateManager.addStateListener(new StateListener<LauncherState>() {
|
||||
private static final int MAX_NUM_SWIPES_TO_TRIGGER_EDU = 3;
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
package com.android.quickstep.views;
|
||||
|
||||
import static com.android.quickstep.SysUINavigationMode.Mode.THREE_BUTTONS;
|
||||
import static com.android.launcher3.util.DisplayController.NavigationMode.THREE_BUTTONS;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Configuration;
|
||||
@@ -36,10 +36,10 @@ import com.android.launcher3.DeviceProfile;
|
||||
import com.android.launcher3.Insettable;
|
||||
import com.android.launcher3.R;
|
||||
import com.android.launcher3.uioverrides.ApiWrapper;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.DisplayController.NavigationMode;
|
||||
import com.android.launcher3.util.MultiValueAlpha;
|
||||
import com.android.launcher3.util.MultiValueAlpha.AlphaProperty;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.quickstep.SysUINavigationMode.Mode;
|
||||
import com.android.quickstep.TaskOverlayFactory.OverlayUICallbacks;
|
||||
import com.android.quickstep.util.LayoutUtils;
|
||||
|
||||
@@ -148,13 +148,13 @@ public class OverviewActionsView<T extends OverlayUICallbacks> extends FrameLayo
|
||||
@Override
|
||||
protected void onConfigurationChanged(Configuration newConfig) {
|
||||
super.onConfigurationChanged(newConfig);
|
||||
updateVerticalMargin(SysUINavigationMode.getMode(getContext()));
|
||||
updateVerticalMargin(DisplayController.getNavigationMode(getContext()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setInsets(Rect insets) {
|
||||
mInsets.set(insets);
|
||||
updateVerticalMargin(SysUINavigationMode.getMode(getContext()));
|
||||
updateVerticalMargin(DisplayController.getNavigationMode(getContext()));
|
||||
updatePaddingAndTranslations();
|
||||
}
|
||||
|
||||
@@ -204,7 +204,7 @@ public class OverviewActionsView<T extends OverlayUICallbacks> extends FrameLayo
|
||||
*/
|
||||
private void updatePaddingAndTranslations() {
|
||||
boolean alignFor3ButtonTaskbar = mDp.isTaskbarPresent &&
|
||||
SysUINavigationMode.getMode(getContext()) == THREE_BUTTONS;
|
||||
DisplayController.getNavigationMode(getContext()) == THREE_BUTTONS;
|
||||
if (alignFor3ButtonTaskbar) {
|
||||
// Add extra horizontal spacing
|
||||
int additionalPadding = ApiWrapper.getHotseatEndOffset(getContext());
|
||||
@@ -218,7 +218,7 @@ public class OverviewActionsView<T extends OverlayUICallbacks> extends FrameLayo
|
||||
// the button nav top is.
|
||||
View startActionView = findViewById(R.id.action_screenshot);
|
||||
int marginBottom = getOverviewActionsBottomMarginPx(
|
||||
SysUINavigationMode.getMode(getContext()), mDp);
|
||||
DisplayController.getNavigationMode(getContext()), mDp);
|
||||
int actionsTop =
|
||||
(mDp.heightPx - marginBottom - mInsets.bottom) - startActionView.getHeight();
|
||||
int navTop = mDp.heightPx - (mDp.taskbarSize + mDp.getTaskbarOffsetY());
|
||||
@@ -233,7 +233,7 @@ public class OverviewActionsView<T extends OverlayUICallbacks> extends FrameLayo
|
||||
}
|
||||
|
||||
/** Updates vertical margins for different navigation mode or configuration changes. */
|
||||
public void updateVerticalMargin(Mode mode) {
|
||||
public void updateVerticalMargin(NavigationMode mode) {
|
||||
if (mDp == null) {
|
||||
return;
|
||||
}
|
||||
@@ -249,7 +249,7 @@ public class OverviewActionsView<T extends OverlayUICallbacks> extends FrameLayo
|
||||
*/
|
||||
public void setDp(DeviceProfile dp) {
|
||||
mDp = dp;
|
||||
updateVerticalMargin(SysUINavigationMode.getMode(getContext()));
|
||||
updateVerticalMargin(DisplayController.getNavigationMode(getContext()));
|
||||
|
||||
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
|
||||
dp.isVerticalBarLayout() ? 0 : dp.overviewActionsButtonSpacing,
|
||||
@@ -274,14 +274,13 @@ public class OverviewActionsView<T extends OverlayUICallbacks> extends FrameLayo
|
||||
}
|
||||
|
||||
/** Get the top margin associated with the action buttons in Overview. */
|
||||
public static int getOverviewActionsTopMarginPx(
|
||||
SysUINavigationMode.Mode mode, DeviceProfile dp) {
|
||||
public static int getOverviewActionsTopMarginPx(NavigationMode mode, DeviceProfile dp) {
|
||||
// In vertical bar, use the smaller task margin for the top regardless of mode
|
||||
if (dp.isVerticalBarLayout()) {
|
||||
return dp.overviewTaskMarginPx;
|
||||
}
|
||||
|
||||
if (mode == SysUINavigationMode.Mode.THREE_BUTTONS) {
|
||||
if (mode == NavigationMode.THREE_BUTTONS) {
|
||||
return dp.overviewActionsMarginThreeButtonPx;
|
||||
}
|
||||
|
||||
@@ -289,8 +288,7 @@ public class OverviewActionsView<T extends OverlayUICallbacks> extends FrameLayo
|
||||
}
|
||||
|
||||
/** Get the bottom margin associated with the action buttons in Overview. */
|
||||
public static int getOverviewActionsBottomMarginPx(
|
||||
SysUINavigationMode.Mode mode, DeviceProfile dp) {
|
||||
public static int getOverviewActionsBottomMarginPx(NavigationMode mode, DeviceProfile dp) {
|
||||
int inset = dp.getInsets().bottom;
|
||||
|
||||
if (dp.isVerticalBarLayout()) {
|
||||
@@ -298,7 +296,7 @@ public class OverviewActionsView<T extends OverlayUICallbacks> extends FrameLayo
|
||||
}
|
||||
|
||||
// Actions button will be aligned with nav buttons in updatePaddingAndTranslations().
|
||||
if (mode == SysUINavigationMode.Mode.THREE_BUTTONS) {
|
||||
if (mode == NavigationMode.THREE_BUTTONS) {
|
||||
return dp.overviewActionsMarginThreeButtonPx + inset;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ import androidx.test.uiautomator.UiDevice;
|
||||
import com.android.launcher3.tapl.LauncherInstrumentation;
|
||||
import com.android.launcher3.tapl.TestHelpers;
|
||||
import com.android.launcher3.ui.AbstractLauncherUiTest;
|
||||
import com.android.launcher3.util.DisplayController;
|
||||
import com.android.launcher3.util.Wait;
|
||||
import com.android.launcher3.util.rule.FailureWatcher;
|
||||
import com.android.systemui.shared.system.QuickStepContract;
|
||||
@@ -71,8 +72,8 @@ public class NavigationModeSwitchRule implements TestRule {
|
||||
|
||||
private final LauncherInstrumentation mLauncher;
|
||||
|
||||
static final SysUINavigationMode SYS_UI_NAVIGATION_MODE =
|
||||
SysUINavigationMode.INSTANCE.get(getInstrumentation().getTargetContext());
|
||||
static final DisplayController DISPLAY_CONTROLLER =
|
||||
DisplayController.INSTANCE.get(getInstrumentation().getTargetContext());
|
||||
|
||||
public NavigationModeSwitchRule(LauncherInstrumentation launcher) {
|
||||
mLauncher = launcher;
|
||||
@@ -138,7 +139,7 @@ public class NavigationModeSwitchRule implements TestRule {
|
||||
|
||||
private static LauncherInstrumentation.NavigationModel currentSysUiNavigationMode() {
|
||||
return LauncherInstrumentation.getNavigationModel(
|
||||
SysUINavigationMode.getMode(
|
||||
DisplayController.getNavigationMode(
|
||||
getInstrumentation().
|
||||
getTargetContext()).
|
||||
resValue);
|
||||
@@ -159,18 +160,18 @@ public class NavigationModeSwitchRule implements TestRule {
|
||||
if (currentSysUiNavigationMode() != expectedMode) {
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
final Context targetContext = getInstrumentation().getTargetContext();
|
||||
final SysUINavigationMode.NavigationModeChangeListener listener =
|
||||
newMode -> {
|
||||
if (LauncherInstrumentation.getNavigationModel(newMode.resValue)
|
||||
final DisplayController.DisplayInfoChangeListener listener =
|
||||
(context, info, flags) -> {
|
||||
if (LauncherInstrumentation.getNavigationModel(info.navigationMode.resValue)
|
||||
== expectedMode) {
|
||||
latch.countDown();
|
||||
}
|
||||
};
|
||||
targetContext.getMainExecutor().execute(() ->
|
||||
SYS_UI_NAVIGATION_MODE.addModeChangeListener(listener));
|
||||
DISPLAY_CONTROLLER.addChangeListener(listener));
|
||||
latch.await(60, TimeUnit.SECONDS);
|
||||
targetContext.getMainExecutor().execute(() ->
|
||||
SYS_UI_NAVIGATION_MODE.removeModeChangeListener(listener));
|
||||
DISPLAY_CONTROLLER.removeChangeListener(listener));
|
||||
|
||||
assertTrue(launcher, "Navigation mode didn't change to " + expectedMode,
|
||||
currentSysUiNavigationMode() == expectedMode, description);
|
||||
|
||||
@@ -21,7 +21,7 @@ import static android.view.Display.DEFAULT_DISPLAY;
|
||||
|
||||
import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
|
||||
|
||||
import static com.android.quickstep.SysUINavigationMode.Mode.NO_BUTTON;
|
||||
import static com.android.launcher3.util.DisplayController.NavigationMode.NO_BUTTON;
|
||||
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
@@ -39,7 +39,6 @@ import com.android.launcher3.util.DisplayController.Info;
|
||||
import com.android.launcher3.util.LauncherModelHelper;
|
||||
import com.android.launcher3.util.ReflectionHelpers;
|
||||
import com.android.quickstep.FallbackActivityInterface;
|
||||
import com.android.quickstep.SysUINavigationMode;
|
||||
import com.android.quickstep.SystemUiProxy;
|
||||
import com.android.systemui.shared.system.RemoteAnimationTargetCompat;
|
||||
import com.android.systemui.shared.system.SyncRtSurfaceTransactionApplierCompat.SurfaceParams;
|
||||
@@ -143,7 +142,6 @@ public class TaskViewSimulatorTest {
|
||||
LauncherModelHelper helper = new LauncherModelHelper();
|
||||
try {
|
||||
helper.sandboxContext.allow(SystemUiProxy.INSTANCE);
|
||||
helper.sandboxContext.allow(SysUINavigationMode.INSTANCE);
|
||||
|
||||
Display display = mock(Display.class);
|
||||
doReturn(DEFAULT_DISPLAY).when(display).getDisplayId();
|
||||
|
||||
@@ -15,11 +15,17 @@
|
||||
*/
|
||||
package com.android.launcher3.util;
|
||||
|
||||
import static android.content.Intent.ACTION_CONFIGURATION_CHANGED;
|
||||
import static android.view.Display.DEFAULT_DISPLAY;
|
||||
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
|
||||
|
||||
import static com.android.launcher3.ResourceUtils.INVALID_RESOURCE_HANDLE;
|
||||
import static com.android.launcher3.Utilities.dpiFromPx;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NAVIGATION_MODE_2_BUTTON;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NAVIGATION_MODE_3_BUTTON;
|
||||
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NAVIGATION_MODE_GESTURE_BUTTON;
|
||||
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
|
||||
import static com.android.launcher3.util.PackageManagerHelper.getPackageFilter;
|
||||
import static com.android.launcher3.util.WindowManagerCompat.MIN_TABLET_WIDTH;
|
||||
|
||||
import static java.util.Collections.emptyMap;
|
||||
@@ -29,7 +35,6 @@ import android.annotation.TargetApi;
|
||||
import android.content.ComponentCallbacks;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.content.res.Configuration;
|
||||
import android.graphics.Point;
|
||||
import android.hardware.display.DisplayManager;
|
||||
@@ -43,9 +48,12 @@ import android.view.Display;
|
||||
import androidx.annotation.AnyThread;
|
||||
import androidx.annotation.UiThread;
|
||||
|
||||
import com.android.launcher3.ResourceUtils;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.logging.StatsLogManager.LauncherEvent;
|
||||
import com.android.launcher3.uioverrides.ApiWrapper;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
@@ -66,9 +74,14 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {
|
||||
public static final int CHANGE_ROTATION = 1 << 1;
|
||||
public static final int CHANGE_DENSITY = 1 << 2;
|
||||
public static final int CHANGE_SUPPORTED_BOUNDS = 1 << 3;
|
||||
public static final int CHANGE_NAVIGATION_MODE = 1 << 4;
|
||||
|
||||
public static final int CHANGE_ALL = CHANGE_ACTIVE_SCREEN | CHANGE_ROTATION
|
||||
| CHANGE_DENSITY | CHANGE_SUPPORTED_BOUNDS;
|
||||
| CHANGE_DENSITY | CHANGE_SUPPORTED_BOUNDS | CHANGE_NAVIGATION_MODE;
|
||||
|
||||
private static final String ACTION_OVERLAY_CHANGED = "android.intent.action.OVERLAY_CHANGED";
|
||||
private static final String NAV_BAR_INTERACTION_MODE_RES_NAME = "config_navBarInteractionMode";
|
||||
private static final String TARGET_OVERLAY_PACKAGE = "android";
|
||||
|
||||
private final Context mContext;
|
||||
private final DisplayManager mDM;
|
||||
@@ -79,6 +92,8 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {
|
||||
private DisplayInfoChangeListener mPriorityListener;
|
||||
private final ArrayList<DisplayInfoChangeListener> mListeners = new ArrayList<>();
|
||||
|
||||
private final SimpleBroadcastReceiver mReceiver = new SimpleBroadcastReceiver(this::onIntent);
|
||||
|
||||
private Info mInfo;
|
||||
private boolean mDestroyed = false;
|
||||
|
||||
@@ -92,11 +107,13 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {
|
||||
mWindowContext.registerComponentCallbacks(this);
|
||||
} else {
|
||||
mWindowContext = null;
|
||||
SimpleBroadcastReceiver configChangeReceiver =
|
||||
new SimpleBroadcastReceiver(this::onConfigChanged);
|
||||
mContext.registerReceiver(configChangeReceiver,
|
||||
new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED));
|
||||
mReceiver.register(mContext, ACTION_CONFIGURATION_CHANGED);
|
||||
}
|
||||
|
||||
// Initialize navigation mode change listener
|
||||
mContext.registerReceiver(mReceiver,
|
||||
getPackageFilter(TARGET_OVERLAY_PACKAGE, ACTION_OVERLAY_CHANGED));
|
||||
|
||||
mInfo = new Info(getDisplayInfoContext(display), display,
|
||||
getInternalDisplays(mDM), emptyMap());
|
||||
}
|
||||
@@ -116,6 +133,13 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {
|
||||
return internalDisplays;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current navigation mode
|
||||
*/
|
||||
public static NavigationMode getNavigationMode(Context context) {
|
||||
return INSTANCE.get(context).getInfo().navigationMode;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
mDestroyed = true;
|
||||
@@ -140,15 +164,20 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {
|
||||
void onDisplayInfoChanged(Context context, Info info, int flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* Only used for pre-S
|
||||
*/
|
||||
private void onConfigChanged(Intent intent) {
|
||||
private void onIntent(Intent intent) {
|
||||
if (mDestroyed) {
|
||||
return;
|
||||
}
|
||||
Configuration config = mContext.getResources().getConfiguration();
|
||||
if (mInfo.fontScale != config.fontScale || mInfo.densityDpi != config.densityDpi) {
|
||||
boolean reconfigure = false;
|
||||
if (ACTION_OVERLAY_CHANGED.equals(intent.getAction())) {
|
||||
reconfigure = true;
|
||||
} else if (ACTION_CONFIGURATION_CHANGED.equals(intent.getAction())) {
|
||||
Configuration config = mContext.getResources().getConfiguration();
|
||||
reconfigure = mInfo.fontScale != config.fontScale
|
||||
|| mInfo.densityDpi != config.densityDpi;
|
||||
}
|
||||
|
||||
if (reconfigure) {
|
||||
Log.d(TAG, "Configuration changed, notifying listeners");
|
||||
Display display = mDM.getDisplay(DEFAULT_DISPLAY);
|
||||
if (display != null) {
|
||||
@@ -202,7 +231,8 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {
|
||||
Info newInfo = new Info(displayContext, display,
|
||||
oldInfo.mInternalDisplays, oldInfo.mPerDisplayBounds);
|
||||
|
||||
if (newInfo.densityDpi != oldInfo.densityDpi || newInfo.fontScale != oldInfo.fontScale) {
|
||||
if (newInfo.densityDpi != oldInfo.densityDpi || newInfo.fontScale != oldInfo.fontScale
|
||||
|| newInfo.navigationMode != oldInfo.navigationMode) {
|
||||
// Cache may not be valid anymore, recreate without cache
|
||||
newInfo = new Info(displayContext, display, getInternalDisplays(mDM), emptyMap());
|
||||
}
|
||||
@@ -217,6 +247,9 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {
|
||||
if (newInfo.densityDpi != oldInfo.densityDpi || newInfo.fontScale != oldInfo.fontScale) {
|
||||
change |= CHANGE_DENSITY;
|
||||
}
|
||||
if (newInfo.navigationMode != oldInfo.navigationMode) {
|
||||
change |= CHANGE_NAVIGATION_MODE;
|
||||
}
|
||||
if (!newInfo.supportedBounds.equals(oldInfo.supportedBounds)) {
|
||||
change |= CHANGE_SUPPORTED_BOUNDS;
|
||||
|
||||
@@ -247,7 +280,9 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {
|
||||
if (mPriorityListener != null) {
|
||||
mPriorityListener.onDisplayInfoChanged(context, mInfo, flags);
|
||||
}
|
||||
for (int i = mListeners.size() - 1; i >= 0; i--) {
|
||||
|
||||
int count = mListeners.size();
|
||||
for (int i = 0; i < count; i++) {
|
||||
mListeners.get(i).onDisplayInfoChanged(context, mInfo, flags);
|
||||
}
|
||||
}
|
||||
@@ -258,6 +293,7 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {
|
||||
public final int rotation;
|
||||
public final float fontScale;
|
||||
public final int densityDpi;
|
||||
public final NavigationMode navigationMode;
|
||||
|
||||
private final PortraitSize mScreenSizeDp;
|
||||
|
||||
@@ -282,6 +318,7 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {
|
||||
fontScale = config.fontScale;
|
||||
densityDpi = config.densityDpi;
|
||||
mScreenSizeDp = new PortraitSize(config.screenHeightDp, config.screenWidthDp);
|
||||
navigationMode = parseNavigationMode(context);
|
||||
|
||||
currentSize = new Point();
|
||||
display.getRealSize(currentSize);
|
||||
@@ -340,6 +377,21 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Dumps the current state information
|
||||
*/
|
||||
public void dump(PrintWriter pw) {
|
||||
Info info = mInfo;
|
||||
pw.println("DisplayController.Info:");
|
||||
pw.println(" id=" + info.displayId);
|
||||
pw.println(" rotation=" + info.rotation);
|
||||
pw.println(" fontScale=" + info.fontScale);
|
||||
pw.println(" densityDpi=" + info.displayId);
|
||||
pw.println(" navigationMode=" + info.navigationMode.name());
|
||||
pw.println(" currentSize=" + info.currentSize);
|
||||
pw.println(" supportedBounds=" + info.supportedBounds);
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility class to hold a size information in an orientation independent way
|
||||
*/
|
||||
@@ -364,4 +416,36 @@ public class DisplayController implements ComponentCallbacks, SafeCloseable {
|
||||
return Objects.hash(width, height);
|
||||
}
|
||||
}
|
||||
|
||||
public enum NavigationMode {
|
||||
THREE_BUTTONS(false, 0, LAUNCHER_NAVIGATION_MODE_3_BUTTON),
|
||||
TWO_BUTTONS(true, 1, LAUNCHER_NAVIGATION_MODE_2_BUTTON),
|
||||
NO_BUTTON(true, 2, LAUNCHER_NAVIGATION_MODE_GESTURE_BUTTON);
|
||||
|
||||
public final boolean hasGestures;
|
||||
public final int resValue;
|
||||
public final LauncherEvent launcherEvent;
|
||||
|
||||
NavigationMode(boolean hasGestures, int resValue, LauncherEvent launcherEvent) {
|
||||
this.hasGestures = hasGestures;
|
||||
this.resValue = resValue;
|
||||
this.launcherEvent = launcherEvent;
|
||||
}
|
||||
}
|
||||
|
||||
private static NavigationMode parseNavigationMode(Context context) {
|
||||
int modeInt = ResourceUtils.getIntegerByName(NAV_BAR_INTERACTION_MODE_RES_NAME,
|
||||
context.getResources(), INVALID_RESOURCE_HANDLE);
|
||||
|
||||
if (modeInt == INVALID_RESOURCE_HANDLE) {
|
||||
Log.e(TAG, "Failed to get system resource ID. Incompatible framework version?");
|
||||
} else {
|
||||
for (NavigationMode m : NavigationMode.values()) {
|
||||
if (m.resValue == modeInt) {
|
||||
return m;
|
||||
}
|
||||
}
|
||||
}
|
||||
return Utilities.ATLEAST_S ? NavigationMode.NO_BUTTON : NavigationMode.THREE_BUTTONS;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user