mirror of
https://github.com/LawnchairLauncher/lawnchair.git
synced 2026-03-04 09:56:49 +00:00
Merge "Hide launcher when freeform tasks are visible" into tm-qpr-dev
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.launcher3.statehandlers;
|
||||
|
||||
import android.os.SystemProperties;
|
||||
import android.view.View;
|
||||
|
||||
import com.android.launcher3.Launcher;
|
||||
import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.statemanager.StatefulActivity;
|
||||
import com.android.launcher3.uioverrides.QuickstepLauncher;
|
||||
|
||||
/**
|
||||
* Controls the visibility of the workspace and the resumed / paused state when desktop mode
|
||||
* is enabled.
|
||||
*/
|
||||
public class DesktopVisibilityController {
|
||||
|
||||
private final Launcher mLauncher;
|
||||
|
||||
private boolean mFreeformTasksVisible;
|
||||
private boolean mInOverviewState;
|
||||
|
||||
public DesktopVisibilityController(Launcher launcher) {
|
||||
mLauncher = launcher;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether desktop mode is supported.
|
||||
*/
|
||||
private boolean isDesktopModeSupported() {
|
||||
return SystemProperties.getBoolean("persist.wm.debug.desktop_mode", false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether freeform windows are visible in desktop mode.
|
||||
*/
|
||||
public boolean areFreeformTasksVisible() {
|
||||
return mFreeformTasksVisible;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether freeform windows are visible and updates launcher visibility based on that.
|
||||
*/
|
||||
public void setFreeformTasksVisible(boolean freeformTasksVisible) {
|
||||
if (freeformTasksVisible != mFreeformTasksVisible) {
|
||||
mFreeformTasksVisible = freeformTasksVisible;
|
||||
updateLauncherVisibility();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets whether the overview is visible and updates launcher visibility based on that.
|
||||
*/
|
||||
public void setOverviewStateEnabled(boolean overviewStateEnabled) {
|
||||
if (overviewStateEnabled != mInOverviewState) {
|
||||
mInOverviewState = overviewStateEnabled;
|
||||
updateLauncherVisibility();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates launcher visibility and state to look like it is paused or resumed depending on
|
||||
* whether freeform windows are showing in desktop mode.
|
||||
*/
|
||||
private void updateLauncherVisibility() {
|
||||
StatefulActivity<LauncherState> activity =
|
||||
QuickstepLauncher.ACTIVITY_TRACKER.getCreatedActivity();
|
||||
View workspaceView = mLauncher.getWorkspace();
|
||||
if (activity == null || workspaceView == null || !isDesktopModeSupported()) return;
|
||||
|
||||
if (mFreeformTasksVisible) {
|
||||
workspaceView.setVisibility(View.INVISIBLE);
|
||||
if (!mInOverviewState) {
|
||||
// When freeform is visible & we're not in overview, we want launcher to appear
|
||||
// paused, this ensures that taskbar displays.
|
||||
activity.setPaused();
|
||||
}
|
||||
} else {
|
||||
workspaceView.setVisibility(View.VISIBLE);
|
||||
// If freeform isn't visible ensure that launcher appears resumed to behave normally.
|
||||
activity.setResumed();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -96,6 +96,7 @@ import com.android.launcher3.popup.SystemShortcut;
|
||||
import com.android.launcher3.proxy.ProxyActivityStarter;
|
||||
import com.android.launcher3.proxy.StartActivityParams;
|
||||
import com.android.launcher3.statehandlers.DepthController;
|
||||
import com.android.launcher3.statehandlers.DesktopVisibilityController;
|
||||
import com.android.launcher3.statemanager.StateManager.AtomicAnimationFactory;
|
||||
import com.android.launcher3.statemanager.StateManager.StateHandler;
|
||||
import com.android.launcher3.taskbar.LauncherTaskbarUIController;
|
||||
@@ -167,6 +168,7 @@ public class QuickstepLauncher extends Launcher {
|
||||
private FixedContainerItems mAllAppsPredictions;
|
||||
private HotseatPredictionController mHotseatPredictionController;
|
||||
private DepthController mDepthController;
|
||||
private DesktopVisibilityController mDesktopVisibilityController;
|
||||
private QuickstepTransitionManager mAppTransitionManager;
|
||||
private OverviewActionsView mActionsView;
|
||||
private TISBindHelper mTISBindHelper;
|
||||
@@ -207,6 +209,7 @@ public class QuickstepLauncher extends Launcher {
|
||||
|
||||
mTISBindHelper = new TISBindHelper(this, this::onTISConnected);
|
||||
mDepthController = new DepthController(this);
|
||||
mDesktopVisibilityController = new DesktopVisibilityController(this);
|
||||
mHotseatPredictionController = new HotseatPredictionController(this);
|
||||
|
||||
mEnableWidgetDepth = ENABLE_WIDGET_PICKER_DEPTH.get()
|
||||
@@ -732,6 +735,10 @@ public class QuickstepLauncher extends Launcher {
|
||||
return mDepthController;
|
||||
}
|
||||
|
||||
public DesktopVisibilityController getDesktopVisibilityController() {
|
||||
return mDesktopVisibilityController;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public UnfoldTransitionProgressProvider getUnfoldTransitionProgressProvider() {
|
||||
return mUnfoldTransitionProgressProvider;
|
||||
|
||||
@@ -1881,10 +1881,16 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>,
|
||||
}
|
||||
|
||||
private void finishCurrentTransitionToRecents() {
|
||||
// TODO(b/245569277#comment2): enable once isFreeformActive is implemented
|
||||
mStateCallback.setStateOnUiThread(STATE_CURRENT_TASK_FINISHED);
|
||||
if (mRecentsAnimationController != null) {
|
||||
mRecentsAnimationController.detachNavigationBarFromApp(true);
|
||||
if (mRecentsAnimationController != null
|
||||
&& mActivityInterface.getDesktopVisibilityController() != null
|
||||
&& mActivityInterface.getDesktopVisibilityController().areFreeformTasksVisible()) {
|
||||
mRecentsAnimationController.finish(true /* toRecents */,
|
||||
() -> mStateCallback.setStateOnUiThread(STATE_CURRENT_TASK_FINISHED));
|
||||
} else {
|
||||
mStateCallback.setStateOnUiThread(STATE_CURRENT_TASK_FINISHED);
|
||||
if (mRecentsAnimationController != null) {
|
||||
mRecentsAnimationController.detachNavigationBarFromApp(true);
|
||||
}
|
||||
}
|
||||
ActiveGestureLog.INSTANCE.addLog(
|
||||
/* event= */ "finishRecentsAnimation",
|
||||
|
||||
@@ -50,6 +50,7 @@ import com.android.launcher3.R;
|
||||
import com.android.launcher3.anim.AnimatorPlaybackController;
|
||||
import com.android.launcher3.anim.PendingAnimation;
|
||||
import com.android.launcher3.statehandlers.DepthController;
|
||||
import com.android.launcher3.statehandlers.DesktopVisibilityController;
|
||||
import com.android.launcher3.statemanager.BaseState;
|
||||
import com.android.launcher3.statemanager.StatefulActivity;
|
||||
import com.android.launcher3.taskbar.TaskbarUIController;
|
||||
@@ -141,6 +142,11 @@ public abstract class BaseActivityInterface<STATE_TYPE extends BaseState<STATE_T
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public DesktopVisibilityController getDesktopVisibilityController() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public abstract TaskbarUIController getTaskbarController();
|
||||
|
||||
|
||||
@@ -39,6 +39,7 @@ import com.android.launcher3.LauncherInitListener;
|
||||
import com.android.launcher3.LauncherState;
|
||||
import com.android.launcher3.anim.PendingAnimation;
|
||||
import com.android.launcher3.statehandlers.DepthController;
|
||||
import com.android.launcher3.statehandlers.DesktopVisibilityController;
|
||||
import com.android.launcher3.statemanager.StateManager;
|
||||
import com.android.launcher3.taskbar.LauncherTaskbarUIController;
|
||||
import com.android.launcher3.touch.PagedOrientationHandler;
|
||||
@@ -173,6 +174,16 @@ public final class LauncherActivityInterface extends
|
||||
return launcher.getDepthController();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public DesktopVisibilityController getDesktopVisibilityController() {
|
||||
QuickstepLauncher launcher = getCreatedActivity();
|
||||
if (launcher == null) {
|
||||
return null;
|
||||
}
|
||||
return launcher.getDesktopVisibilityController();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public LauncherTaskbarUIController getTaskbarController() {
|
||||
|
||||
@@ -27,6 +27,7 @@ import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent
|
||||
import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_UNLOCK_ANIMATION_CONTROLLER;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_FREEFORM_ACTIVE_IN_DESKTOP_MODE;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED;
|
||||
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_TRACING_ENABLED;
|
||||
import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_BACK_ANIMATION;
|
||||
@@ -71,6 +72,7 @@ import com.android.launcher3.R;
|
||||
import com.android.launcher3.Utilities;
|
||||
import com.android.launcher3.config.FeatureFlags;
|
||||
import com.android.launcher3.provider.RestoreDbTask;
|
||||
import com.android.launcher3.statehandlers.DesktopVisibilityController;
|
||||
import com.android.launcher3.statemanager.StatefulActivity;
|
||||
import com.android.launcher3.taskbar.TaskbarActivityContext;
|
||||
import com.android.launcher3.taskbar.TaskbarManager;
|
||||
@@ -543,6 +545,18 @@ public class TouchInteractionService extends Service
|
||||
mOverviewComponentObserver.onSystemUiStateChanged();
|
||||
mTaskbarManager.onSystemUiFlagsChanged(systemUiStateFlags);
|
||||
|
||||
boolean wasFreeformActive =
|
||||
(lastSysUIFlags & SYSUI_STATE_FREEFORM_ACTIVE_IN_DESKTOP_MODE) != 0;
|
||||
boolean isFreeformActive =
|
||||
(systemUiStateFlags & SYSUI_STATE_FREEFORM_ACTIVE_IN_DESKTOP_MODE) != 0;
|
||||
if (wasFreeformActive != isFreeformActive) {
|
||||
DesktopVisibilityController controller = mOverviewComponentObserver
|
||||
.getActivityInterface().getDesktopVisibilityController();
|
||||
if (controller != null) {
|
||||
controller.setFreeformTasksVisible(isFreeformActive);
|
||||
}
|
||||
}
|
||||
|
||||
boolean wasExpanded = (lastSysUIFlags & SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED) != 0;
|
||||
boolean isExpanded =
|
||||
(systemUiStateFlags & SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED) != 0;
|
||||
|
||||
@@ -147,6 +147,9 @@ public class LauncherRecentsView extends RecentsView<QuickstepLauncher, Launcher
|
||||
& CLEAR_ALL_BUTTON) != 0;
|
||||
setDisallowScrollToClearAll(!hasClearAllButton);
|
||||
}
|
||||
if (mActivity.getDesktopVisibilityController() != null) {
|
||||
mActivity.getDesktopVisibilityController().setOverviewStateEnabled(enabled);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -196,8 +196,7 @@ public abstract class BaseActivity extends Activity implements AppLauncher,
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
addActivityFlags(ACTIVITY_STATE_RESUMED | ACTIVITY_STATE_USER_ACTIVE);
|
||||
removeActivityFlags(ACTIVITY_STATE_USER_WILL_BE_ACTIVE);
|
||||
setResumed();
|
||||
super.onResume();
|
||||
}
|
||||
|
||||
@@ -228,7 +227,7 @@ public abstract class BaseActivity extends Activity implements AppLauncher,
|
||||
|
||||
@Override
|
||||
protected void onPause() {
|
||||
removeActivityFlags(ACTIVITY_STATE_RESUMED | ACTIVITY_STATE_DEFERRED_RESUMED);
|
||||
setPaused();
|
||||
super.onPause();
|
||||
|
||||
// Reset the overridden sysui flags used for the task-swipe launch animation, we do this
|
||||
@@ -260,6 +259,21 @@ public abstract class BaseActivity extends Activity implements AppLauncher,
|
||||
return (mActivityFlags & ACTIVITY_STATE_RESUMED) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the activity to appear as paused.
|
||||
*/
|
||||
public void setPaused() {
|
||||
removeActivityFlags(ACTIVITY_STATE_RESUMED | ACTIVITY_STATE_DEFERRED_RESUMED);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the activity to appear as resumed.
|
||||
*/
|
||||
public void setResumed() {
|
||||
addActivityFlags(ACTIVITY_STATE_RESUMED | ACTIVITY_STATE_USER_ACTIVE);
|
||||
removeActivityFlags(ACTIVITY_STATE_USER_WILL_BE_ACTIVE);
|
||||
}
|
||||
|
||||
public boolean isUserActive() {
|
||||
return (mActivityFlags & ACTIVITY_STATE_USER_ACTIVE) != 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user