diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java index 69804bdd5f..113bd91f00 100644 --- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java @@ -121,10 +121,9 @@ public class NavbarButtonsViewController { /** * Initializes the controller */ - public void init(TaskbarControllers controllers, TaskbarSharedState sharedState) { + public void init(TaskbarControllers controllers) { mControllers = controllers; mNavButtonsView.getLayoutParams().height = mContext.getDeviceProfile().taskbarSize; - parseSystemUiFlags(sharedState.sysuiStateFlags); mNavButtonTranslationYMultiplier.value = 1; mA11yLongClickListener = view -> { @@ -290,12 +289,15 @@ public class NavbarButtonsViewController { } } - public void updateStateForSysuiFlags(int systemUiStateFlags) { + public void updateStateForSysuiFlags(int systemUiStateFlags, boolean skipAnim) { if (systemUiStateFlags == mSysuiStateFlags) { return; } parseSystemUiFlags(systemUiStateFlags); applyState(); + if (skipAnim) { + mPropertyHolders.forEach(StatePropertyHolder::endAnimation); + } } /** diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index 8ae661fd5d..db3156bfb9 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -70,7 +70,6 @@ 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.quickstep.SystemUiProxy; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.WindowManagerWrapper; @@ -158,7 +157,8 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ new TaskbarKeyguardController(this), new StashedHandleViewController(this, stashedHandleView), new TaskbarStashController(this), - new TaskbarEduController(this)); + new TaskbarEduController(this), + new TaskbarAutohideSuspendController(this)); } public void init(TaskbarSharedState sharedState) { @@ -191,6 +191,7 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ // Initialize controllers after all are constructed. mControllers.init(sharedState); + updateSysuiStateFlags(sharedState.sysuiStateFlags, true /* fromInit */); mWindowManager.addView(mDragLayer, mWindowLayoutParams); } @@ -325,26 +326,28 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ mWindowManager.removeViewImmediate(mDragLayer); } - public void updateSysuiStateFlags(int systemUiStateFlags) { - mControllers.navbarButtonsViewController.updateStateForSysuiFlags(systemUiStateFlags); + public void updateSysuiStateFlags(int systemUiStateFlags, boolean fromInit) { + mControllers.navbarButtonsViewController.updateStateForSysuiFlags(systemUiStateFlags, + fromInit); mControllers.taskbarViewController.setImeIsVisible( mControllers.navbarButtonsViewController.isImeVisible()); int shadeExpandedFlags = SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED | SYSUI_STATE_QUICK_SETTINGS_EXPANDED; - onNotificationShadeExpandChanged((systemUiStateFlags & shadeExpandedFlags) != 0); + onNotificationShadeExpandChanged((systemUiStateFlags & shadeExpandedFlags) != 0, fromInit); mControllers.taskbarViewController.setRecentsButtonDisabled( mControllers.navbarButtonsViewController.isRecentsDisabled()); mControllers.stashedHandleViewController.setIsHomeButtonDisabled( mControllers.navbarButtonsViewController.isHomeDisabled()); mControllers.taskbarKeyguardController.updateStateForSysuiFlags(systemUiStateFlags); - mControllers.taskbarStashController.updateStateForSysuiFlags(systemUiStateFlags); - mControllers.taskbarScrimViewController.updateStateForSysuiFlags(systemUiStateFlags); + mControllers.taskbarStashController.updateStateForSysuiFlags(systemUiStateFlags, fromInit); + mControllers.taskbarScrimViewController.updateStateForSysuiFlags(systemUiStateFlags, + fromInit); } /** * Hides the taskbar icons and background when the notication shade is expanded. */ - private void onNotificationShadeExpandChanged(boolean isExpanded) { + private void onNotificationShadeExpandChanged(boolean isExpanded, boolean skipAnim) { float alpha = isExpanded ? 0 : 1; AnimatorSet anim = new AnimatorSet(); anim.play(mControllers.taskbarViewController.getTaskbarIconAlpha().getProperty( @@ -354,6 +357,9 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ .animateToValue(alpha)); } anim.start(); + if (skipAnim) { + anim.end(); + } } public void onRotationProposal(int rotation, boolean isValid) { @@ -375,7 +381,8 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ * Updates the TaskbarContainer to MATCH_PARENT vs original Taskbar size. */ public void setTaskbarWindowFullscreen(boolean fullscreen) { - SystemUiProxy.INSTANCE.getNoCreate().notifyTaskbarAutohideSuspend(fullscreen); + mControllers.taskbarAutohideSuspendController.updateFlag( + TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_FULLSCREEN, fullscreen); mIsFullscreen = fullscreen; setTaskbarWindowHeight(fullscreen ? MATCH_PARENT : mLastRequestedNonFullscreenHeight); } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarAutohideSuspendController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarAutohideSuspendController.java new file mode 100644 index 0000000000..e42f83de6a --- /dev/null +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarAutohideSuspendController.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2021 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.taskbar; + +import androidx.annotation.IntDef; + +import com.android.quickstep.SystemUiProxy; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Normally Taskbar will auto-hide when entering immersive (fullscreen) apps. This controller allows + * us to suspend that behavior in certain cases (e.g. opening a Folder or dragging an icon). + */ +public class TaskbarAutohideSuspendController { + + public static final int FLAG_AUTOHIDE_SUSPEND_FULLSCREEN = 1 << 0; + public static final int FLAG_AUTOHIDE_SUSPEND_DRAGGING = 1 << 1; + @IntDef(flag = true, value = { + FLAG_AUTOHIDE_SUSPEND_FULLSCREEN, + FLAG_AUTOHIDE_SUSPEND_DRAGGING, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AutohideSuspendFlag {} + + private final SystemUiProxy mSystemUiProxy; + + private @AutohideSuspendFlag int mAutohideSuspendFlags = 0; + + public TaskbarAutohideSuspendController(TaskbarActivityContext activity) { + mSystemUiProxy = SystemUiProxy.INSTANCE.get(activity); + } + + public void onDestroy() { + mSystemUiProxy.notifyTaskbarAutohideSuspend(false); + } + + /** + * Adds or removes the given flag, then notifies system UI proxy whether to suspend auto-hide. + */ + public void updateFlag(@AutohideSuspendFlag int flag, boolean enabled) { + if (enabled) { + mAutohideSuspendFlags |= flag; + } else { + mAutohideSuspendFlags &= ~flag; + } + mSystemUiProxy.notifyTaskbarAutohideSuspend(mAutohideSuspendFlags != 0); + } +} diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java index 8684c2925c..d739eeac26 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java @@ -37,6 +37,7 @@ public class TaskbarControllers { public final StashedHandleViewController stashedHandleViewController; public final TaskbarStashController taskbarStashController; public final TaskbarEduController taskbarEduController; + public final TaskbarAutohideSuspendController taskbarAutohideSuspendController; /** Do not store this controller, as it may change at runtime. */ @NonNull public TaskbarUIController uiController = TaskbarUIController.DEFAULT; @@ -53,7 +54,8 @@ public class TaskbarControllers { TaskbarKeyguardController taskbarKeyguardController, StashedHandleViewController stashedHandleViewController, TaskbarStashController taskbarStashController, - TaskbarEduController taskbarEduController) { + TaskbarEduController taskbarEduController, + TaskbarAutohideSuspendController taskbarAutoHideSuspendController) { this.taskbarActivityContext = taskbarActivityContext; this.taskbarDragController = taskbarDragController; this.navButtonController = navButtonController; @@ -67,6 +69,7 @@ public class TaskbarControllers { this.stashedHandleViewController = stashedHandleViewController; this.taskbarStashController = taskbarStashController; this.taskbarEduController = taskbarEduController; + this.taskbarAutohideSuspendController = taskbarAutoHideSuspendController; } /** @@ -75,7 +78,8 @@ public class TaskbarControllers { * in constructors for now, as some controllers may still be waiting for init(). */ public void init(TaskbarSharedState sharedState) { - navbarButtonsViewController.init(this, sharedState); + taskbarDragController.init(this); + navbarButtonsViewController.init(this); if (taskbarActivityContext.isThreeButtonNav()) { rotationButtonController.init(); } @@ -101,5 +105,6 @@ public class TaskbarControllers { taskbarUnfoldAnimationController.onDestroy(); taskbarViewController.onDestroy(); stashedHandleViewController.onDestroy(); + taskbarAutohideSuspendController.onDestroy(); } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java index 1afbd177e7..3bcacb6c8a 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java @@ -15,9 +15,6 @@ */ package com.android.launcher3.taskbar; -import static android.view.View.INVISIBLE; -import static android.view.View.VISIBLE; - import android.content.ClipData; import android.content.ClipDescription; import android.content.Intent; @@ -49,7 +46,6 @@ import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.dragndrop.DragView; import com.android.launcher3.dragndrop.DraggableView; import com.android.launcher3.graphics.DragPreviewProvider; -import com.android.launcher3.icons.FastBitmapDrawable; import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.WorkspaceItemInfo; @@ -65,6 +61,9 @@ public class TaskbarDragController extends DragController { + btv.post(() -> { startInternalDrag(btv); - btv.setVisibility(INVISIBLE); + btv.getIcon().setIsDisabled(true); + mControllers.taskbarAutohideSuspendController.updateFlag( + TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_DRAGGING, true); }); return true; } private void startInternalDrag(BubbleTextView btv) { - float iconScale = 1f; - Drawable icon = btv.getIcon(); - if (icon instanceof FastBitmapDrawable) { - iconScale = ((FastBitmapDrawable) icon).getAnimatedScale(); - } + float iconScale = btv.getIcon().getAnimatedScale(); // Clear the pressed state if necessary btv.clearFocus(); @@ -239,16 +240,17 @@ public class TaskbarDragController extends DragController onClick() : null); mScrimView.setClickable(showScrim); ObjectAnimator anim = mScrimAlpha.animateToValue(showScrim ? alpha : 0); anim.setInterpolator(showScrim ? SCRIM_ALPHA_IN : SCRIM_ALPHA_OUT); anim.start(); + if (skipAnim) { + anim.end(); + } } private void updateScrimAlpha() { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index 0dd4ef19b3..d11eb36feb 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -408,10 +408,10 @@ public class TaskbarStashController { } /** Called when some system ui state has changed. (See SYSUI_STATE_... in QuickstepContract) */ - public void updateStateForSysuiFlags(int systemUiStateFlags) { + public void updateStateForSysuiFlags(int systemUiStateFlags, boolean skipAnim) { updateStateForFlag(FLAG_STASHED_IN_APP_PINNED, hasAnyFlag(systemUiStateFlags, SYSUI_STATE_SCREEN_PINNING)); - applyState(); + applyState(skipAnim ? 0 : TASKBAR_STASH_DURATION); } /** diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialController.java b/quickstep/src/com/android/quickstep/interaction/TutorialController.java index a59b0d76be..81e18f64cb 100644 --- a/quickstep/src/com/android/quickstep/interaction/TutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/TutorialController.java @@ -274,7 +274,6 @@ abstract class TutorialController implements BackGestureAttemptCallback, mFeedbackView.findViewById(R.id.gesture_tutorial_fragment_feedback_subtitle); subtitle.setText(subtitleResId); if (isGestureSuccessful) { - hideCloseButton(); if (mTutorialFragment.isAtFinalStep()) { showActionButton(); } @@ -402,6 +401,7 @@ abstract class TutorialController implements BackGestureAttemptCallback, void transitToController() { hideFeedback(); hideActionButton(); + updateCloseButton(); updateSubtext(); updateDrawables(); updateLayout(); @@ -412,26 +412,21 @@ abstract class TutorialController implements BackGestureAttemptCallback, } } - void hideCloseButton() { - mCloseButton.setVisibility(GONE); - } - - void showCloseButton() { - mCloseButton.setVisibility(View.VISIBLE); + void updateCloseButton() { mCloseButton.setTextAppearance(Utilities.isDarkTheme(mContext) ? R.style.TextAppearance_GestureTutorial_Feedback_Subtext : R.style.TextAppearance_GestureTutorial_Feedback_Subtext_Dark); } void hideActionButton() { - showCloseButton(); + mCloseButton.setVisibility(View.VISIBLE); // Invisible to maintain the layout. mActionButton.setVisibility(View.INVISIBLE); mActionButton.setOnClickListener(null); } void showActionButton() { - hideCloseButton(); + mCloseButton.setVisibility(GONE); mActionButton.setVisibility(View.VISIBLE); mActionButton.setOnClickListener(this::onActionButtonClicked); } diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/src/com/android/quickstep/views/TaskMenuView.java index 03ab737366..5c73fbbd22 100644 --- a/quickstep/src/com/android/quickstep/views/TaskMenuView.java +++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.java @@ -210,7 +210,7 @@ public class TaskMenuView extends AbstractFloatingView implements OnScrollChange @Override public void onScrollChanged() { - RecentsView rv = mTaskView.getRecentsView(); + RecentsView rv = mActivity.getOverviewPanel(); setPosition(mTaskView.getX() - rv.getScrollX(), mTaskView.getY() - rv.getScrollY(), rv.getOverScrollShift()); } diff --git a/src_plugins/com/android/systemui/plugins/OneSearch.java b/src_plugins/com/android/systemui/plugins/OneSearch.java index 8bd0b75a31..29826c39e3 100644 --- a/src_plugins/com/android/systemui/plugins/OneSearch.java +++ b/src_plugins/com/android/systemui/plugins/OneSearch.java @@ -28,7 +28,7 @@ import java.util.ArrayList; @ProvidesInterface(action = OneSearch.ACTION, version = OneSearch.VERSION) public interface OneSearch extends Plugin { String ACTION = "com.android.systemui.action.PLUGIN_ONE_SEARCH"; - int VERSION = 3; + int VERSION = 4; /** * Get the content provider warmed up. @@ -40,4 +40,7 @@ public interface OneSearch extends Plugin { * @param query The query to get the search suggests for. */ ArrayList getSuggests(Parcelable query); + + /** Get image bitmap with the URL. */ + Parcelable getImageBitmap(String imageUrl); }