diff --git a/go/quickstep/src/com/android/quickstep/TaskActionController.java b/go/quickstep/src/com/android/quickstep/TaskActionController.java index 77b287ba5d..71bee9181d 100644 --- a/go/quickstep/src/com/android/quickstep/TaskActionController.java +++ b/go/quickstep/src/com/android/quickstep/TaskActionController.java @@ -42,6 +42,9 @@ public final class TaskActionController { * @param viewHolder the task view holder to launch */ public void launchTask(TaskHolder viewHolder) { + if (viewHolder.getTask() == null) { + return; + } TaskItemView itemView = (TaskItemView) (viewHolder.itemView); View v = itemView.getThumbnailView(); int left = 0; @@ -60,6 +63,9 @@ public final class TaskActionController { * @param viewHolder the task view holder to remove */ public void removeTask(TaskHolder viewHolder) { + if (viewHolder.getTask() == null) { + return; + } int position = viewHolder.getAdapterPosition(); Task task = viewHolder.getTask(); ActivityManagerWrapper.getInstance().removeTask(task.key.id); diff --git a/go/quickstep/src/com/android/quickstep/TaskAdapter.java b/go/quickstep/src/com/android/quickstep/TaskAdapter.java index c98eca6221..674fcae914 100644 --- a/go/quickstep/src/com/android/quickstep/TaskAdapter.java +++ b/go/quickstep/src/com/android/quickstep/TaskAdapter.java @@ -28,6 +28,7 @@ import com.android.quickstep.views.TaskItemView; import com.android.systemui.shared.recents.model.Task; import java.util.List; +import java.util.Objects; /** * Recycler view adapter that dynamically inflates and binds {@link TaskHolder} instances with the @@ -40,6 +41,7 @@ public final class TaskAdapter extends Adapter { private final TaskListLoader mLoader; private final ArrayMap mTaskIdToViewMap = new ArrayMap<>(); private TaskActionController mTaskActionController; + private boolean mIsShowingLoadingUi; public TaskAdapter(@NonNull TaskListLoader loader) { mLoader = loader; @@ -49,6 +51,18 @@ public final class TaskAdapter extends Adapter { mTaskActionController = taskActionController; } + /** + * Sets all positions in the task adapter to loading views, binding new views if necessary. + * This changes the task adapter's view of the data, so the appropriate notify events should be + * called in addition to this method to reflect the changes. + * + * @param isShowingLoadingUi true to bind loading task views to all positions, false to return + * to the real data + */ + public void setIsShowingLoadingUi(boolean isShowingLoadingUi) { + mIsShowingLoadingUi = isShowingLoadingUi; + } + /** * Get task item view for a given task id if it's attached to the view. * @@ -70,6 +84,10 @@ public final class TaskAdapter extends Adapter { @Override public void onBindViewHolder(TaskHolder holder, int position) { + if (mIsShowingLoadingUi) { + holder.bindEmptyUi(); + return; + } List tasks = mLoader.getCurrentTaskList(); if (position >= tasks.size()) { // Task list has updated. @@ -79,13 +97,13 @@ public final class TaskAdapter extends Adapter { holder.bindTask(task); mLoader.loadTaskIconAndLabel(task, () -> { // Ensure holder still has the same task. - if (task.equals(holder.getTask())) { + if (Objects.equals(task, holder.getTask())) { holder.getTaskItemView().setIcon(task.icon); holder.getTaskItemView().setLabel(task.titleDescription); } }); mLoader.loadTaskThumbnail(task, () -> { - if (task.equals(holder.getTask())) { + if (Objects.equals(task, holder.getTask())) { holder.getTaskItemView().setThumbnail(task.thumbnail.thumbnail); } }); @@ -93,16 +111,27 @@ public final class TaskAdapter extends Adapter { @Override public void onViewAttachedToWindow(@NonNull TaskHolder holder) { + if (holder.getTask() == null) { + return; + } mTaskIdToViewMap.put(holder.getTask().key.id, (TaskItemView) holder.itemView); } @Override public void onViewDetachedFromWindow(@NonNull TaskHolder holder) { + if (holder.getTask() == null) { + return; + } mTaskIdToViewMap.remove(holder.getTask().key.id); } @Override public int getItemCount() { - return Math.min(mLoader.getCurrentTaskList().size(), MAX_TASKS_TO_DISPLAY); + if (mIsShowingLoadingUi) { + // Show loading version of all items. + return MAX_TASKS_TO_DISPLAY; + } else { + return Math.min(mLoader.getCurrentTaskList().size(), MAX_TASKS_TO_DISPLAY); + } } } diff --git a/go/quickstep/src/com/android/quickstep/TaskHolder.java b/go/quickstep/src/com/android/quickstep/TaskHolder.java index 744afd766e..98dc989317 100644 --- a/go/quickstep/src/com/android/quickstep/TaskHolder.java +++ b/go/quickstep/src/com/android/quickstep/TaskHolder.java @@ -15,7 +15,7 @@ */ package com.android.quickstep; -import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView.ViewHolder; import com.android.quickstep.views.TaskItemView; @@ -50,11 +50,23 @@ public final class TaskHolder extends ViewHolder { } /** - * Gets the task currently bound to this view + * Bind a generic empty UI to the holder to make it clear that the item is loading/unbound and + * should not be expected to react to user input. + */ + public void bindEmptyUi() { + mTask = null; + // TODO: Set the task view to a loading, empty UI. + // Temporarily using the one below for visual confirmation but should be swapped out to new + // UI later. + mTaskItemView.resetTaskItemView(); + } + + /** + * Gets the task currently bound to this view. May be null if task holder is in a loading state. * * @return the current task */ - public @NonNull Task getTask() { + public @Nullable Task getTask() { return mTask; } } diff --git a/go/quickstep/src/com/android/quickstep/TaskListLoader.java b/go/quickstep/src/com/android/quickstep/TaskListLoader.java index 1234989d24..51b73f1815 100644 --- a/go/quickstep/src/com/android/quickstep/TaskListLoader.java +++ b/go/quickstep/src/com/android/quickstep/TaskListLoader.java @@ -67,17 +67,27 @@ public final class TaskListLoader { return Collections.unmodifiableList(mTaskList); } + /** + * Whether or not the loader needs to load data to be up to date. This can return true if the + * task list is already up to date OR there is already a load in progress for the task list to + * become up to date. + * + * @return true if already up to date or load in progress, false otherwise + */ + public boolean needsToLoad() { + return !mRecentsModel.isTaskListValid(mTaskListChangeId); + } + /** * Fetches the most recent tasks and updates the task list asynchronously. This call does not * provide guarantees the task content (icon, thumbnail, label) are loaded but will fill in * what it has. May run the callback immediately if there have been no changes in the task - * list. + * list since the start of the last load. * * @param onLoadedCallback callback to run when task list is loaded */ public void loadTaskList(@Nullable Consumer> onLoadedCallback) { - if (mRecentsModel.isTaskListValid(mTaskListChangeId)) { - // Current task list is already up to date. No need to update. + if (!needsToLoad()) { if (onLoadedCallback != null) { onLoadedCallback.accept(mTaskList); } diff --git a/go/quickstep/src/com/android/quickstep/TouchInteractionService.java b/go/quickstep/src/com/android/quickstep/TouchInteractionService.java index c579c8a33d..734425ee4c 100644 --- a/go/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/go/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -49,7 +49,6 @@ public class TouchInteractionService extends Service { ISystemUiProxy iSystemUiProxy = ISystemUiProxy.Stub .asInterface(bundle.getBinder(KEY_EXTRA_SYSUI_PROXY)); mRecentsModel.setSystemUiProxy(iSystemUiProxy); - mRecentsModel.onInitializeSystemUI(bundle); } @Override diff --git a/go/quickstep/src/com/android/quickstep/views/IconRecentsView.java b/go/quickstep/src/com/android/quickstep/views/IconRecentsView.java index 5bb4c5aaaa..c06b6ec416 100644 --- a/go/quickstep/src/com/android/quickstep/views/IconRecentsView.java +++ b/go/quickstep/src/com/android/quickstep/views/IconRecentsView.java @@ -28,6 +28,10 @@ import android.util.AttributeSet; import android.util.FloatProperty; import android.view.View; import android.view.ViewDebug; +import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; +import android.view.animation.AnimationSet; +import android.view.animation.LayoutAnimationController; import android.widget.FrameLayout; import androidx.annotation.NonNull; @@ -69,6 +73,8 @@ public final class IconRecentsView extends FrameLayout { } }; private static final long CROSSFADE_DURATION = 300; + private static final long LAYOUT_ITEM_ANIMATE_IN_DURATION = 150; + private static final long LAYOUT_ITEM_ANIMATE_IN_DELAY_BETWEEN = 40; private static final long ITEM_ANIMATE_OUT_DURATION = 150; private static final long ITEM_ANIMATE_OUT_DELAY_BETWEEN = 40; private static final float ITEM_ANIMATE_OUT_TRANSLATION_X_RATIO = .25f; @@ -84,6 +90,7 @@ public final class IconRecentsView extends FrameLayout { private final TaskListLoader mTaskLoader; private final TaskAdapter mTaskAdapter; private final TaskActionController mTaskActionController; + private final LayoutAnimationController mLayoutAnimation; private RecentsToActivityHelper mActivityHelper; private RecyclerView mTaskRecyclerView; @@ -99,6 +106,7 @@ public final class IconRecentsView extends FrameLayout { mTaskAdapter = new TaskAdapter(mTaskLoader); mTaskActionController = new TaskActionController(mTaskLoader, mTaskAdapter); mTaskAdapter.setActionController(mTaskActionController); + mLayoutAnimation = createLayoutAnimation(); } @Override @@ -112,6 +120,7 @@ public final class IconRecentsView extends FrameLayout { ItemTouchHelper helper = new ItemTouchHelper( new TaskSwipeCallback(mTaskActionController)); helper.attachToRecyclerView(mTaskRecyclerView); + mTaskRecyclerView.setLayoutAnimation(mLayoutAnimation); mEmptyView = findViewById(R.id.recent_task_empty_view); mContentView = findViewById(R.id.recent_task_content_view); @@ -131,7 +140,6 @@ public final class IconRecentsView extends FrameLayout { } } - @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); @@ -157,10 +165,17 @@ public final class IconRecentsView extends FrameLayout { * becomes visible. */ public void onBeginTransitionToOverview() { + mTaskRecyclerView.scheduleLayoutAnimation(); + // Load any task changes + if (!mTaskLoader.needsToLoad()) { + return; + } + mTaskAdapter.setIsShowingLoadingUi(true); + mTaskAdapter.notifyDataSetChanged(); mTaskLoader.loadTaskList(tasks -> { - // TODO: Put up some loading UI while task content is loading. May have to do something - // smarter when animating from app to overview. + mTaskAdapter.setIsShowingLoadingUi(false); + // TODO: Animate the loading UI out and the loaded data in. mTaskAdapter.notifyDataSetChanged(); }); } @@ -322,4 +337,18 @@ public final class IconRecentsView extends FrameLayout { } }); } + + private static LayoutAnimationController createLayoutAnimation() { + AnimationSet anim = new AnimationSet(false /* shareInterpolator */); + + Animation alphaAnim = new AlphaAnimation(0, 1); + alphaAnim.setDuration(LAYOUT_ITEM_ANIMATE_IN_DURATION); + anim.addAnimation(alphaAnim); + + LayoutAnimationController layoutAnim = new LayoutAnimationController(anim); + layoutAnim.setDelay( + (float) LAYOUT_ITEM_ANIMATE_IN_DELAY_BETWEEN / LAYOUT_ITEM_ANIMATE_IN_DURATION); + + return layoutAnim; + } } diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java index 225ae8450a..462e63098c 100644 --- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java +++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java @@ -75,12 +75,4 @@ public class BackgroundAppState extends OverviewState { return new ScaleAndTranslation(scale, 0f, 0f); } - @Override - public int getVisibleElements(Launcher launcher) { - if (SysUINavigationMode.getMode(launcher) == Mode.NO_BUTTON) { - return super.getVisibleElements(launcher); - } - // Hide shelf content (e.g. QSB) because we fade it in when swiping up. - return ALL_APPS_HEADER_EXTRA; - } } diff --git a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/NavBarToHomeTouchController.java b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/NavBarToHomeTouchController.java index 673beff852..21ddfc0154 100644 --- a/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/NavBarToHomeTouchController.java +++ b/quickstep/recents_ui_overrides/src/com/android/launcher3/uioverrides/touchcontrollers/NavBarToHomeTouchController.java @@ -15,74 +15,131 @@ */ package com.android.launcher3.uioverrides.touchcontrollers; +import static android.view.View.TRANSLATION_X; + +import static com.android.launcher3.AbstractFloatingView.TYPE_ALL; +import static com.android.launcher3.AbstractFloatingView.TYPE_HIDE_BACK_BUTTON; import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.allapps.AllAppsTransitionController.ALL_APPS_PROGRESS; import static com.android.launcher3.anim.Interpolators.DEACCEL_3; +import static com.android.launcher3.touch.AbstractStateChangeTouchController.SUCCESS_TRANSITION_PROGRESS; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; import android.view.MotionEvent; -import android.view.View; import android.view.animation.Interpolator; +import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.Launcher; import com.android.launcher3.LauncherState; import com.android.launcher3.LauncherStateManager.AnimationConfig; +import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.allapps.AllAppsTransitionController; +import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.AnimatorSetBuilder; import com.android.launcher3.anim.Interpolators; -import com.android.launcher3.touch.AbstractStateChangeTouchController; import com.android.launcher3.touch.SwipeDetector; import com.android.launcher3.userevent.nano.LauncherLogProto; +import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Command; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; +import com.android.launcher3.util.TouchController; import com.android.quickstep.views.RecentsView; /** - * Handles swiping up on the nav bar to go home from overview or all apps. + * Handles swiping up on the nav bar to go home from launcher, e.g. overview or all apps. */ -public class NavBarToHomeTouchController extends AbstractStateChangeTouchController { +public class NavBarToHomeTouchController implements TouchController, SwipeDetector.Listener { private static final Interpolator PULLBACK_INTERPOLATOR = DEACCEL_3; + private final Launcher mLauncher; + private final SwipeDetector mSwipeDetector; + private final float mPullbackDistance; + + private boolean mNoIntercept; + private LauncherState mStartState; + private LauncherState mEndState = NORMAL; + private AnimatorPlaybackController mCurrentAnimation; + public NavBarToHomeTouchController(Launcher launcher) { - super(launcher, SwipeDetector.VERTICAL); + mLauncher = launcher; + mSwipeDetector = new SwipeDetector(mLauncher, this, SwipeDetector.VERTICAL); + mPullbackDistance = mLauncher.getResources().getDimension(R.dimen.home_pullback_distance); } @Override - protected boolean canInterceptTouch(MotionEvent ev) { - boolean cameFromNavBar = (ev.getEdgeFlags() & Utilities.EDGE_NAV_BAR) != 0; - return cameFromNavBar && (mLauncher.isInState(OVERVIEW) || mLauncher.isInState(ALL_APPS)); - } - - @Override - protected LauncherState getTargetState(LauncherState fromState, boolean isDragTowardPositive) { - return isDragTowardPositive ? NORMAL : fromState; - } - - @Override - protected float initCurrentAnimation(int animComponents) { - long accuracy = (long) (getShiftRange() * 2); - final AnimatorSet anim; - if (mFromState == OVERVIEW) { - anim = new AnimatorSet(); - RecentsView recentsView = mLauncher.getOverviewPanel(); - float pullbackDistance = recentsView.getPaddingStart() / 2; - if (!recentsView.isRtl()) { - pullbackDistance = -pullbackDistance; + public final boolean onControllerInterceptTouchEvent(MotionEvent ev) { + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + mStartState = mLauncher.getStateManager().getState(); + mNoIntercept = !canInterceptTouch(ev); + if (mNoIntercept) { + return false; } - anim.play(ObjectAnimator.ofFloat(recentsView, View.TRANSLATION_X, pullbackDistance)); - anim.setInterpolator(PULLBACK_INTERPOLATOR); - } else { // if (mFromState == ALL_APPS) + mSwipeDetector.setDetectableScrollConditions(SwipeDetector.DIRECTION_POSITIVE, false); + } + + if (mNoIntercept) { + return false; + } + + onControllerTouchEvent(ev); + return mSwipeDetector.isDraggingOrSettling(); + } + + private boolean canInterceptTouch(MotionEvent ev) { + boolean cameFromNavBar = (ev.getEdgeFlags() & Utilities.EDGE_NAV_BAR) != 0; + if (!cameFromNavBar) { + return false; + } + if (mStartState == OVERVIEW || mStartState == ALL_APPS) { + return true; + } + if (!mLauncher.hasWindowFocus()) { + return true; + } + if (AbstractFloatingView.getTopOpenView(mLauncher) != null) { + return true; + } + return false; + } + + @Override + public final boolean onControllerTouchEvent(MotionEvent ev) { + return mSwipeDetector.onTouchEvent(ev); + } + + private float getShiftRange() { + return mLauncher.getDeviceProfile().heightPx; + } + + @Override + public void onDragStart(boolean start) { + initCurrentAnimation(); + } + + private void initCurrentAnimation() { + long accuracy = (long) (getShiftRange() * 2); + final AnimatorSet anim = new AnimatorSet(); + if (mStartState == OVERVIEW) { + RecentsView recentsView = mLauncher.getOverviewPanel(); + float pullbackDist = mPullbackDistance; + if (!recentsView.isRtl()) { + pullbackDist = -pullbackDist; + } + Animator pullback = ObjectAnimator.ofFloat(recentsView, TRANSLATION_X, pullbackDist); + pullback.setInterpolator(PULLBACK_INTERPOLATOR); + anim.play(pullback); + } else if (mStartState == ALL_APPS) { AnimatorSetBuilder builder = new AnimatorSetBuilder(); AllAppsTransitionController allAppsController = mLauncher.getAllAppsController(); - final float pullbackDistance = mLauncher.getDeviceProfile().allAppsIconSizePx / 2; Animator allAppsProgress = ObjectAnimator.ofFloat(allAppsController, ALL_APPS_PROGRESS, - -pullbackDistance / allAppsController.getShiftRange()); + -mPullbackDistance / allAppsController.getShiftRange()); allAppsProgress.setInterpolator(PULLBACK_INTERPOLATOR); builder.play(allAppsProgress); // Slightly fade out all apps content to further distinguish from scrolling. @@ -90,52 +147,79 @@ public class NavBarToHomeTouchController extends AbstractStateChangeTouchControl .mapToProgress(PULLBACK_INTERPOLATOR, 0, 0.5f)); AnimationConfig config = new AnimationConfig(); config.duration = accuracy; - allAppsController.setAlphas(mToState.getVisibleElements(mLauncher), config, builder); - anim = builder.build(); + allAppsController.setAlphas(mEndState.getVisibleElements(mLauncher), config, builder); + anim.play(builder.build()); + } + AbstractFloatingView topView = AbstractFloatingView.getTopOpenView(mLauncher); + if (topView != null) { + Animator hintCloseAnim = topView.createHintCloseAnim(mPullbackDistance); + if (hintCloseAnim != null) { + hintCloseAnim.setInterpolator(PULLBACK_INTERPOLATOR); + anim.play(hintCloseAnim); + } } anim.setDuration(accuracy); mCurrentAnimation = AnimatorPlaybackController.wrap(anim, accuracy, this::clearState); - return -1 / getShiftRange(); + } + + private void clearState() { + mCurrentAnimation = null; + mSwipeDetector.finishedScrolling(); + mSwipeDetector.setDetectableScrollConditions(0, false); } @Override - public void onDragStart(boolean start) { - super.onDragStart(start); - mStartContainerType = LauncherLogProto.ContainerType.NAVBAR; + public boolean onDrag(float displacement) { + // Only allow swipe up. + displacement = Math.min(0, displacement); + float progress = Utilities.getProgress(displacement, 0, getShiftRange()); + mCurrentAnimation.setPlayFraction(progress); + return true; } @Override public void onDragEnd(float velocity, boolean fling) { final int logAction = fling ? Touch.FLING : Touch.SWIPE; - float interpolatedProgress = PULLBACK_INTERPOLATOR.getInterpolation( - mCurrentAnimation.getProgressFraction()); - if (interpolatedProgress >= SUCCESS_TRANSITION_PROGRESS || velocity < 0 && fling) { - mLauncher.getStateManager().goToState(mToState, true, - () -> onSwipeInteractionCompleted(mToState, logAction)); + float progress = mCurrentAnimation.getProgressFraction(); + float interpolatedProgress = PULLBACK_INTERPOLATOR.getInterpolation(progress); + boolean success = interpolatedProgress >= SUCCESS_TRANSITION_PROGRESS + || (velocity < 0 && fling); + if (success) { + mLauncher.getStateManager().goToState(mEndState, true, + () -> onSwipeInteractionCompleted(mEndState)); + if (mStartState != mEndState) { + logStateChange(mStartState.containerType, logAction); + } + AbstractFloatingView topOpenView = AbstractFloatingView.getTopOpenView(mLauncher); + if (topOpenView != null) { + AbstractFloatingView.closeAllOpenViews(mLauncher); + logStateChange(topOpenView.getLogContainerType(), logAction); + } } else { // Quickly return to the state we came from (we didn't move far). - AnimatorPlaybackController anim = mLauncher.getStateManager() - .createAnimationToNewWorkspace(mFromState, 80); - anim.setEndAction(() -> onSwipeInteractionCompleted(mFromState, logAction)); - anim.start(); + ValueAnimator anim = mCurrentAnimation.getAnimationPlayer(); + anim.setFloatValues(progress, 0); + anim.addListener(new AnimationSuccessListener() { + @Override + public void onAnimationSuccess(Animator animator) { + onSwipeInteractionCompleted(mStartState); + } + }); + anim.setDuration(80).start(); } - mCurrentAnimation.dispatchOnCancel(); } - @Override - protected int getDirectionForLog() { - return LauncherLogProto.Action.Direction.UP; + private void onSwipeInteractionCompleted(LauncherState targetState) { + clearState(); + mLauncher.getStateManager().goToState(targetState, false /* animated */); } - @Override - protected boolean goingBetweenNormalAndOverview(LauncherState fromState, - LauncherState toState) { - // We don't want to create an atomic animation to/from overview. - return false; - } - - @Override - protected int getLogContainerTypeForNormalState() { - return LauncherLogProto.ContainerType.NAVBAR; + private void logStateChange(int startContainerType, int logAction) { + mLauncher.getUserEventDispatcher().logStateChangeAction(logAction, + LauncherLogProto.Action.Direction.UP, + LauncherLogProto.ContainerType.NAVBAR, + startContainerType, + mEndState.containerType, + mLauncher.getWorkspace().getCurrentPage()); } } diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java index e903b6f3f3..baef2eb7c7 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/LauncherActivityControllerHelper.java @@ -23,7 +23,6 @@ import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.LauncherState.OVERVIEW; import static com.android.launcher3.allapps.AllAppsTransitionController.SPRING_DAMPING_RATIO; import static com.android.launcher3.allapps.AllAppsTransitionController.SPRING_STIFFNESS; -import static com.android.launcher3.anim.Interpolators.DEACCEL_3; import static com.android.launcher3.anim.Interpolators.LINEAR; import android.animation.Animator; @@ -44,11 +43,8 @@ import com.android.launcher3.Launcher; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherInitListener; import com.android.launcher3.LauncherState; -import com.android.launcher3.LauncherStateManager; -import com.android.launcher3.allapps.AllAppsTransitionController; import com.android.launcher3.allapps.DiscoveryBounce; import com.android.launcher3.anim.AnimatorPlaybackController; -import com.android.launcher3.anim.AnimatorSetBuilder; import com.android.launcher3.anim.SpringObjectAnimator; import com.android.launcher3.compat.AccessibilityManagerCompat; import com.android.launcher3.userevent.nano.LauncherLogProto; @@ -220,7 +216,7 @@ public final class LauncherActivityControllerHelper implements ActivityControlHe : mShelfState == ShelfAnimState.PEEK ? shelfPeekingProgress : shelfOverviewProgress; - mShelfAnim = createShelfProgressAnim(activity, toProgress); + mShelfAnim = createShelfAnim(activity, toProgress); mShelfAnim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { @@ -238,10 +234,10 @@ public final class LauncherActivityControllerHelper implements ActivityControlHe LauncherState fromState, long transitionLength, Consumer callback) { LauncherState endState = OVERVIEW; - DeviceProfile dp = activity.getDeviceProfile(); - long accuracy = 2 * Math.max(dp.widthPx, dp.heightPx); if (wasVisible && fromState != BACKGROUND_APP) { // If a translucent app was launched fom launcher, animate launcher states. + DeviceProfile dp = activity.getDeviceProfile(); + long accuracy = 2 * Math.max(dp.widthPx, dp.heightPx); callback.accept(activity.getStateManager() .createAnimationToNewWorkspace(fromState, endState, accuracy)); return; @@ -254,11 +250,10 @@ public final class LauncherActivityControllerHelper implements ActivityControlHe if (!activity.getDeviceProfile().isVerticalBarLayout() && SysUINavigationMode.getMode(activity) != Mode.NO_BUTTON) { // Don't animate the shelf when the mode is NO_BUTTON, because we update it atomically. - Animator shiftAnim = createShelfProgressAnim(activity, + Animator shiftAnim = createShelfAnim(activity, fromState.getVerticalProgress(activity), endState.getVerticalProgress(activity)); anim.play(shiftAnim); - anim.play(createShelfAlphaAnim(activity, endState, accuracy)); } playScaleDownAnim(anim, activity, endState); @@ -275,7 +270,7 @@ public final class LauncherActivityControllerHelper implements ActivityControlHe callback.accept(controller); } - private Animator createShelfProgressAnim(Launcher activity, float ... progressValues) { + private Animator createShelfAnim(Launcher activity, float ... progressValues) { Animator shiftAnim = new SpringObjectAnimator<>(activity.getAllAppsController(), "allAppsSpringFromACH", activity.getAllAppsController().getShiftRange(), SPRING_DAMPING_RATIO, SPRING_STIFFNESS, progressValues); @@ -283,19 +278,6 @@ public final class LauncherActivityControllerHelper implements ActivityControlHe return shiftAnim; } - /** - * Very quickly fade the alpha of shelf content. - */ - private Animator createShelfAlphaAnim(Launcher activity, LauncherState toState, long accuracy) { - AllAppsTransitionController allAppsController = activity.getAllAppsController(); - AnimatorSetBuilder animBuilder = new AnimatorSetBuilder(); - animBuilder.setInterpolator(AnimatorSetBuilder.ANIM_ALL_APPS_FADE, DEACCEL_3); - LauncherStateManager.AnimationConfig config = new LauncherStateManager.AnimationConfig(); - config.duration = accuracy; - allAppsController.setAlphas(toState.getVisibleElements(activity), config, animBuilder); - return animBuilder.build(); - } - /** * Scale down recents from the center task being full screen to being in overview. */ diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/OverviewInputConsumer.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/OverviewInputConsumer.java index 3ebe9687f6..8bda3f68b5 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/OverviewInputConsumer.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/OverviewInputConsumer.java @@ -136,17 +136,13 @@ public class OverviewInputConsumer } private void sendEvent(MotionEvent ev) { - if (mInvalidated || !mTarget.verifyTouchDispatch(this, ev)) { - mInvalidated = true; + if (mInvalidated) { return; } int flags = ev.getEdgeFlags(); ev.setEdgeFlags(flags | Utilities.EDGE_NAV_BAR); ev.offsetLocation(-mLocationOnScreen[0], -mLocationOnScreen[1]); - if (ev.getAction() == ACTION_DOWN) { - mTarget.onInterceptTouchEvent(ev); - } - mTarget.onTouchEvent(ev); + mInvalidated = !mTarget.dispatchTouchEvent(this, ev); ev.offsetLocation(mLocationOnScreen[0], mLocationOnScreen[1]); ev.setEdgeFlags(flags); } diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskSystemShortcut.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskSystemShortcut.java index 42a28fbfa9..6e98a5ad2f 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskSystemShortcut.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/TaskSystemShortcut.java @@ -290,6 +290,10 @@ public class TaskSystemShortcut extends SystemShortcut if (sysUiProxy == null) { return null; } + if (SysUINavigationMode.getMode(activity) == SysUINavigationMode.Mode.NO_BUTTON) { + // TODO(b/130225926): Temporarily disable pinning while gesture nav is enabled + return null; + } if (!ActivityManagerWrapper.getInstance().isScreenPinningEnabled()) { return null; } diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java index bcce937eb8..3ea8de0ce3 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/TouchInteractionService.java @@ -101,7 +101,6 @@ public class TouchInteractionService extends Service implements MAIN_THREAD_EXECUTOR.execute(TouchInteractionService.this::initInputMonitor); runWhenUserUnlocked(() -> { mRecentsModel.setSystemUiProxy(mISystemUiProxy); - mRecentsModel.onInitializeSystemUI(bundle); mOverviewInteractionState.setSystemUiProxy(mISystemUiProxy); }); } @@ -426,7 +425,7 @@ public class TouchInteractionService extends Service implements private InputConsumer newConsumer(boolean useSharedState, MotionEvent event) { // TODO: this makes a binder call every touch down. we should move to a listener pattern. - if (mKM.isDeviceLocked()) { + if (!mIsUserUnlocked || mKM.isDeviceLocked()) { // This handles apps launched in direct boot mode (e.g. dialer) as well as apps launched // while device is locked even after exiting direct boot mode (e.g. camera). return new DeviceLockedInputConsumer(this); diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/ClipAnimationHelper.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/ClipAnimationHelper.java index e1a39c64b8..32d510dd28 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/util/ClipAnimationHelper.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/util/ClipAnimationHelper.java @@ -16,6 +16,8 @@ package com.android.quickstep.util; import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE; +import static com.android.systemui.shared.system.QuickStepContract.getWindowCornerRadius; +import static com.android.systemui.shared.system.QuickStepContract.supportsRoundedCornersOnWindows; import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING; import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_OPENING; @@ -33,6 +35,7 @@ import com.android.launcher3.BaseDraggingActivity; import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; import com.android.launcher3.Utilities; +import com.android.launcher3.util.Themes; import com.android.launcher3.views.BaseDragLayer; import com.android.quickstep.RecentsModel; import com.android.quickstep.views.RecentsView; @@ -97,12 +100,9 @@ public class ClipAnimationHelper { (t, a1) -> a1; public ClipAnimationHelper(Context context) { - mWindowCornerRadius = RecentsModel.INSTANCE.get(context).getWindowCornerRadius(); - mSupportsRoundedCornersOnWindows = RecentsModel.INSTANCE.get(context) - .supportsRoundedCornersOnWindows(); - int taskCornerRadiusRes = mSupportsRoundedCornersOnWindows ? - R.dimen.task_corner_radius : R.dimen.task_corner_radius_small; - mTaskCornerRadius = context.getResources().getDimension(taskCornerRadiusRes); + mWindowCornerRadius = getWindowCornerRadius(context.getResources()); + mSupportsRoundedCornersOnWindows = supportsRoundedCornersOnWindows(context.getResources()); + mTaskCornerRadius = Themes.getDialogCornerRadius(context); } private void updateSourceStack(RemoteAnimationTargetCompat target) { diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskMenuView.java index d15a392635..c47e943bee 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskMenuView.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskMenuView.java @@ -40,6 +40,7 @@ import com.android.launcher3.R; import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.Interpolators; import com.android.launcher3.anim.RoundedRectRevealOutlineProvider; +import com.android.launcher3.util.Themes; import com.android.launcher3.views.BaseDragLayer; import com.android.quickstep.TaskSystemShortcut; import com.android.quickstep.TaskUtils; @@ -270,7 +271,7 @@ public class TaskMenuView extends AbstractFloatingView { } private RoundedRectRevealOutlineProvider createOpenCloseOutlineProvider() { - float radius = getResources().getDimension(R.dimen.task_corner_radius); + float radius = Themes.getDialogCornerRadius(getContext()); Rect fromRect = new Rect(0, 0, getWidth(), 0); Rect toRect = new Rect(0, 0, getWidth(), getHeight()); return new RoundedRectRevealOutlineProvider(radius, radius, fromRect, toRect); diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java index a9f6311851..7905230223 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskThumbnailView.java @@ -46,11 +46,11 @@ import com.android.launcher3.Utilities; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.util.SystemUiController; import com.android.launcher3.util.Themes; -import com.android.quickstep.RecentsModel; import com.android.quickstep.TaskOverlayFactory; import com.android.quickstep.TaskOverlayFactory.TaskOverlay; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.ThumbnailData; +import com.android.systemui.shared.system.QuickStepContract; /** * A task in the Recents view. @@ -108,7 +108,7 @@ public class TaskThumbnailView extends View { public TaskThumbnailView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); - mCornerRadius = getResources().getDimension(R.dimen.task_corner_radius); + mCornerRadius = Themes.getDialogCornerRadius(context); mOverlay = TaskOverlayFactory.INSTANCE.get(context).createOverlay(this); mPaint.setFilterBitmap(true); mBackgroundPaint.setColor(Color.WHITE); @@ -116,7 +116,7 @@ public class TaskThumbnailView extends View { mDimmingPaintAfterClearing.setColor(Color.BLACK); mActivity = BaseActivity.fromContext(context); mIsDarkTextTheme = Themes.getAttrBoolean(mActivity, R.attr.isWorkspaceDarkText); - mWindowCornerRadius = RecentsModel.INSTANCE.get(context).getWindowCornerRadius(); + mWindowCornerRadius = QuickStepContract.getWindowCornerRadius(context.getResources()); } public void bind(Task task) { diff --git a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java index 747c480fa3..02a2ec6e2f 100644 --- a/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java +++ b/quickstep/recents_ui_overrides/src/com/android/quickstep/views/TaskView.java @@ -51,6 +51,7 @@ import com.android.launcher3.anim.Interpolators; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Direction; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.util.PendingAnimation; +import com.android.launcher3.util.Themes; import com.android.launcher3.util.ViewPool.Reusable; import com.android.quickstep.RecentsModel; import com.android.quickstep.TaskIconCache; @@ -195,7 +196,7 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable { fromContext(context).getStatsLogManager().logTaskLaunch(getRecentsView(), TaskUtils.getLaunchComponentKeyForTask(getTask().key)); }); - setOutlineProvider(new TaskOutlineProvider(getResources())); + setOutlineProvider(new TaskOutlineProvider(context, getResources())); } @Override @@ -513,9 +514,9 @@ public class TaskView extends FrameLayout implements PageCallbacks, Reusable { private final int mMarginTop; private final float mRadius; - TaskOutlineProvider(Resources res) { + TaskOutlineProvider(Context context, Resources res) { mMarginTop = res.getDimensionPixelSize(R.dimen.task_thumbnail_top_margin); - mRadius = res.getDimension(R.dimen.task_corner_radius); + mRadius = Themes.getDialogCornerRadius(context); } @Override diff --git a/quickstep/res/drawable/bg_wellbeing_toast.xml b/quickstep/res/drawable/bg_wellbeing_toast.xml index 22d6f8aa77..65730f6cc7 100644 --- a/quickstep/res/drawable/bg_wellbeing_toast.xml +++ b/quickstep/res/drawable/bg_wellbeing_toast.xml @@ -15,5 +15,5 @@ --> - + \ No newline at end of file diff --git a/quickstep/res/drawable/task_menu_bg.xml b/quickstep/res/drawable/task_menu_bg.xml index d5597a9dbe..7334d984f1 100644 --- a/quickstep/res/drawable/task_menu_bg.xml +++ b/quickstep/res/drawable/task_menu_bg.xml @@ -28,8 +28,8 @@ diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml index 97f2de7622..6ec3bf62d7 100644 --- a/quickstep/res/values/dimens.xml +++ b/quickstep/res/values/dimens.xml @@ -19,9 +19,7 @@ 24dp 12dp 48dp - 8dp - - 2dp + 10dp 70dp 32dp @@ -61,11 +59,13 @@ docked_stack_divider_thickness - 2 * docked_stack_divider_insets --> 10dp - 16dp 24dp 28dp 70dp + + + 28dp diff --git a/quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java b/quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java index f77bd65138..cda9d4f348 100644 --- a/quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java +++ b/quickstep/src/com/android/launcher3/QuickstepAppTransitionManagerImpl.java @@ -31,6 +31,7 @@ import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.dragndrop.DragLayer.ALPHA_INDEX_TRANSITIONS; import static com.android.launcher3.views.FloatingIconView.SHAPE_PROGRESS_DURATION; import static com.android.quickstep.TaskUtils.taskIsATargetWithMode; +import static com.android.systemui.shared.system.QuickStepContract.getWindowCornerRadius; import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING; import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_OPENING; @@ -63,12 +64,12 @@ import com.android.launcher3.shortcuts.DeepShortcutView; import com.android.launcher3.util.MultiValueAlpha; import com.android.launcher3.util.MultiValueAlpha.AlphaProperty; import com.android.launcher3.views.FloatingIconView; -import com.android.quickstep.RecentsModel; import com.android.quickstep.util.MultiValueUpdateListener; import com.android.quickstep.util.RemoteAnimationProvider; import com.android.quickstep.util.RemoteAnimationTargetSet; import com.android.systemui.shared.system.ActivityCompat; import com.android.systemui.shared.system.ActivityOptionsCompat; +import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.RemoteAnimationAdapterCompat; import com.android.systemui.shared.system.RemoteAnimationDefinitionCompat; import com.android.systemui.shared.system.RemoteAnimationRunnerCompat; @@ -473,6 +474,10 @@ public abstract class QuickstepAppTransitionManagerImpl extends LauncherAppTrans }); float shapeRevealDuration = APP_LAUNCH_DURATION * SHAPE_PROGRESS_DURATION; + + final float windowRadius = mDeviceProfile.isMultiWindowMode + ? 0 : getWindowCornerRadius(mLauncher.getResources()); + appAnimator.addUpdateListener(new MultiValueUpdateListener() { FloatProp mDx = new FloatProp(0, dX, 0, xDuration, AGGRESSIVE_EASE); FloatProp mDy = new FloatProp(0, dY, 0, yDuration, AGGRESSIVE_EASE); @@ -514,13 +519,6 @@ public abstract class QuickstepAppTransitionManagerImpl extends LauncherAppTrans float transX0 = temp.left - offsetX; float transY0 = temp.top - offsetY; - float windowRadius = 0; - if (!mDeviceProfile.isMultiWindowMode && - RecentsModel.INSTANCE.get(mLauncher).supportsRoundedCornersOnWindows()) { - windowRadius = RecentsModel.INSTANCE.get(mLauncher) - .getWindowCornerRadius(); - } - SurfaceParams[] params = new SurfaceParams[targets.length]; for (int i = targets.length - 1; i >= 0; i--) { RemoteAnimationTargetCompat target = targets[i]; @@ -651,7 +649,7 @@ public abstract class QuickstepAppTransitionManagerImpl extends LauncherAppTrans ValueAnimator unlockAnimator = ValueAnimator.ofFloat(0, 1); unlockAnimator.setDuration(CLOSING_TRANSITION_DURATION_MS); float cornerRadius = mDeviceProfile.isMultiWindowMode ? 0 : - RecentsModel.INSTANCE.get(mLauncher).getWindowCornerRadius(); + QuickStepContract.getWindowCornerRadius(mLauncher.getResources()); unlockAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { @@ -677,8 +675,8 @@ public abstract class QuickstepAppTransitionManagerImpl extends LauncherAppTrans Matrix matrix = new Matrix(); ValueAnimator closingAnimator = ValueAnimator.ofFloat(0, 1); int duration = CLOSING_TRANSITION_DURATION_MS; - float windowCornerRadius = mDeviceProfile.isMultiWindowMode ? 0 : - RecentsModel.INSTANCE.get(mLauncher).getWindowCornerRadius(); + float windowCornerRadius = mDeviceProfile.isMultiWindowMode + ? 0 : getWindowCornerRadius(mLauncher.getResources()); closingAnimator.setDuration(duration); closingAnimator.addUpdateListener(new MultiValueUpdateListener() { FloatProp mDy = new FloatProp(0, mClosingWindowTransY, 0, duration, DEACCEL_1_7); diff --git a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java index 482bbdee1a..b263a4c963 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java +++ b/quickstep/src/com/android/launcher3/uioverrides/UiFactory.java @@ -42,7 +42,6 @@ import com.android.launcher3.LauncherStateManager; import com.android.launcher3.LauncherStateManager.StateHandler; import com.android.launcher3.QuickstepAppTransitionManagerImpl; import com.android.launcher3.Utilities; -import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.dragndrop.DragLayer; import com.android.quickstep.OverviewInteractionState; import com.android.quickstep.RecentsModel; @@ -87,6 +86,9 @@ public class UiFactory extends RecentsUiFactory { } OverviewInteractionState.INSTANCE.get(launcher) .setBackButtonAlpha(shouldBackButtonBeHidden ? 0 : 1, true /* animate */); + if (launcher != null && launcher.getDragLayer() != null) { + launcher.getDragLayer().setDisallowBackGesture(shouldBackButtonBeHidden); + } } public static void onCreate(Launcher launcher) { diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java index ce50b680f3..0c29fcf5ab 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java +++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java @@ -44,7 +44,6 @@ import com.android.launcher3.anim.Interpolators; import com.android.launcher3.touch.AbstractStateChangeTouchController; import com.android.launcher3.touch.SwipeDetector; import com.android.launcher3.uioverrides.states.OverviewState; -import com.android.launcher3.uioverrides.touchcontrollers.PortraitOverviewStateTouchHelper; import com.android.launcher3.userevent.nano.LauncherLogProto.Action.Touch; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import com.android.quickstep.RecentsModel; @@ -114,8 +113,10 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr return false; } } else { + // If we are swiping to all apps instead of overview, allow it from anywhere. + boolean interceptAnywhere = mLauncher.isInState(NORMAL) && !mAllowDragToOverview; // For all other states, only listen if the event originated below the hotseat height - if (!isTouchOverHotseat(mLauncher, ev)) { + if (!interceptAnywhere && !isTouchOverHotseat(mLauncher, ev)) { return false; } } diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java index a65bc33f14..675cfe2ef6 100644 --- a/quickstep/src/com/android/quickstep/RecentsModel.java +++ b/quickstep/src/com/android/quickstep/RecentsModel.java @@ -35,6 +35,7 @@ import com.android.systemui.shared.recents.ISystemUiProxy; import com.android.systemui.shared.recents.model.Task; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.ActivityManagerWrapper; +import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.shared.system.TaskStackChangeListener; import java.util.ArrayList; @@ -62,9 +63,6 @@ public class RecentsModel extends TaskStackChangeListener { private final TaskIconCache mIconCache; private final TaskThumbnailCache mThumbnailCache; - private float mWindowCornerRadius = 0; - private boolean mSupportsRoundedCornersOnWindows; - private RecentsModel(Context context) { mContext = context; HandlerThread loaderThread = new HandlerThread("TaskThumbnailIconCache", @@ -76,12 +74,6 @@ public class RecentsModel extends TaskStackChangeListener { ActivityManagerWrapper.getInstance().registerTaskStackListener(this); } - public void onInitializeSystemUI(Bundle params) { - mWindowCornerRadius = params.getFloat(KEY_EXTRA_WINDOW_CORNER_RADIUS, 0); - mSupportsRoundedCornersOnWindows = - params.getBoolean(KEY_EXTRA_SUPPORTS_WINDOW_CORNERS, false); - } - public TaskIconCache getIconCache() { return mIconCache; } @@ -182,14 +174,6 @@ public class RecentsModel extends TaskStackChangeListener { return mSystemUiProxy; } - public float getWindowCornerRadius() { - return mWindowCornerRadius; - } - - public boolean supportsRoundedCornersOnWindows() { - return mSupportsRoundedCornersOnWindows; - } - public void onTrimMemory(int level) { if (level == ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN) { mThumbnailCache.getHighResLoadingState().setVisible(false); diff --git a/quickstep/src/com/android/quickstep/util/LayoutUtils.java b/quickstep/src/com/android/quickstep/util/LayoutUtils.java index bfe31d1311..47f4f4d8fe 100644 --- a/quickstep/src/com/android/quickstep/util/LayoutUtils.java +++ b/quickstep/src/com/android/quickstep/util/LayoutUtils.java @@ -27,8 +27,6 @@ import androidx.annotation.IntDef; import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; import com.android.launcher3.config.FeatureFlags; -import com.android.quickstep.SysUINavigationMode; -import com.android.quickstep.SysUINavigationMode.Mode; import java.lang.annotation.Retention; @@ -118,14 +116,10 @@ public class LayoutUtils { } public static int getShelfTrackingDistance(Context context, DeviceProfile dp) { - if (SysUINavigationMode.getMode(context) == Mode.NO_BUTTON) { - // Track the bottom of the window rather than the top of the shelf. - int shelfHeight = dp.hotseatBarSizePx + dp.getInsets().bottom; - int spaceBetweenShelfAndRecents = (int) context.getResources().getDimension( - R.dimen.task_card_vert_space); - return shelfHeight + spaceBetweenShelfAndRecents; - } - // Start from a third of bottom inset to provide some shelf overlap. - return dp.hotseatBarSizePx + dp.getInsets().bottom / 3 - dp.edgeMarginPx * 2; + // Track the bottom of the window. + int shelfHeight = dp.hotseatBarSizePx + dp.getInsets().bottom; + int spaceBetweenShelfAndRecents = (int) context.getResources().getDimension( + R.dimen.task_card_vert_space); + return shelfHeight + spaceBetweenShelfAndRecents; } } diff --git a/quickstep/src/com/android/quickstep/views/ShelfScrimView.java b/quickstep/src/com/android/quickstep/views/ShelfScrimView.java index d74e880a21..36521e5cc9 100644 --- a/quickstep/src/com/android/quickstep/views/ShelfScrimView.java +++ b/quickstep/src/com/android/quickstep/views/ShelfScrimView.java @@ -53,6 +53,9 @@ public class ShelfScrimView extends ScrimView implements NavigationModeChangeLis // cover the whole screen private static final float SCRIM_CATCHUP_THRESHOLD = 0.2f; + // Temporarily needed until android.R.attr.bottomDialogCornerRadius becomes public + private static final float BOTTOM_CORNER_RADIUS_RATIO = 2f; + // In transposed layout, we simply draw a flat color. private boolean mDrawingFlatColor; @@ -87,7 +90,7 @@ public class ShelfScrimView extends ScrimView implements NavigationModeChangeLis mMaxScrimAlpha = Math.round(OVERVIEW.getWorkspaceScrimAlpha(mLauncher) * 255); mEndAlpha = Color.alpha(mEndScrim); - mRadius = mLauncher.getResources().getDimension(R.dimen.shelf_surface_radius); + mRadius = BOTTOM_CORNER_RADIUS_RATIO * Themes.getDialogCornerRadius(context); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mShelfOffset = context.getResources().getDimension(R.dimen.shelf_surface_offset); diff --git a/quickstep/tests/src/com/android/quickstep/NavigationModeSwitchRule.java b/quickstep/tests/src/com/android/quickstep/NavigationModeSwitchRule.java index 895485ddf8..6034791d71 100644 --- a/quickstep/tests/src/com/android/quickstep/NavigationModeSwitchRule.java +++ b/quickstep/tests/src/com/android/quickstep/NavigationModeSwitchRule.java @@ -32,7 +32,6 @@ import androidx.test.uiautomator.UiDevice; import com.android.launcher3.tapl.LauncherInstrumentation; import com.android.launcher3.tapl.TestHelpers; -import com.android.systemui.shared.system.QuickStepContract; import org.junit.Assert; import org.junit.rules.TestRule; @@ -78,9 +77,9 @@ public class NavigationModeSwitchRule implements TestRule { @Override public void evaluate() throws Throwable { final Context context = getInstrumentation().getContext(); - final String prevOverlayPkg = QuickStepContract.isGesturalMode(context) + final String prevOverlayPkg = LauncherInstrumentation.isGesturalMode(context) ? NAV_BAR_MODE_GESTURAL_OVERLAY - : QuickStepContract.isSwipeUpMode(context) + : LauncherInstrumentation.isSwipeUpMode(context) ? NAV_BAR_MODE_2BUTTON_OVERLAY : NAV_BAR_MODE_3BUTTON_OVERLAY; final LauncherInstrumentation.NavigationModel originalMode = @@ -150,4 +149,4 @@ public class NavigationModeSwitchRule implements TestRule { return base; } } -} \ No newline at end of file +} diff --git a/res/drawable-v28/round_rect_primary.xml b/res/drawable-v28/round_rect_primary.xml new file mode 100644 index 0000000000..53679ed1b1 --- /dev/null +++ b/res/drawable-v28/round_rect_primary.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/res/drawable-v28/top_round_rect_primary.xml b/res/drawable-v28/top_round_rect_primary.xml new file mode 100644 index 0000000000..5c40df76d4 --- /dev/null +++ b/res/drawable-v28/top_round_rect_primary.xml @@ -0,0 +1,26 @@ + + + + + + diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index a471e50172..008910dc93 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -33,7 +33,7 @@ "Tryk to gange, og hold fingeren nede for at vælge en widget eller bruge tilpassede handlinger." "%1$d × %2$d" "%1$d i bredden og %2$d i højden" - "Tryk og hold fingeren nede for at placere manuelt" + "Tryk og hold nede for at placere manuelt" "Tilføj automatisk" "Søg efter apps" "Indlæser apps…" diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index d4bfbc1e82..e03340bdb1 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -33,7 +33,7 @@ "വിജറ്റ് തിരഞ്ഞെടുക്കാനോ ഇഷ്ടാനുസൃത പ്രവർത്തനങ്ങൾ ഉപയോഗിക്കാനോ രണ്ടുതവണ ടാപ്പുചെയ്ത് പിടിക്കുക." "%1$d × %2$d" "%1$d വീതിയും %2$d ഉയരവും" - "സ്വമേധയാ സ്ഥാപിക്കുന്നതിന് സ്‌പർശിച്ചുപിടിക്കുക" + "നേരിട്ട് സ്ഥാപിക്കുന്നതിന് സ്‌പർശിച്ചുപിടിക്കുക" "സ്വയമേവ ചേർക്കുക" "ആപ്പുകൾ തിരയുക" "ആപ്പുകൾ ലോഡുചെയ്യുന്നു..." diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index 60dc9a6784..f6eac53997 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -34,7 +34,7 @@ "%1$d × %2$d" "%1$d रूंद बाय %2$d उंच" "स्वतः ठेवण्यासाठी स्पर्श करा आणि धरून ठेवा" - "अापोआप जोडा" + "आपोआप जोडा" "अॅप्स शोधा" "अॅप्स लोड करत आहे…" "\"%1$s\" शी जुळणारे कोणतेही अॅप्स आढळले नाहीत" diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index 0bd1911ba0..d4cd5be4bc 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -104,7 +104,7 @@ "%1$s ਵਿਜੇਟ" "ਵਿਜੇਟਾਂ ਦੀ ਸੂਚੀ" "ਵਿਜੇਟਾਂ ਦੀ ਸੂਚੀ ਬੰਦ ਕੀਤੀ ਗਈ" - "ਹੋਮ ਸਕ੍ਰੀਨ ਵਿੱਚ ਸ਼ਾਮਲ ਕਰੋ" + "ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਸ਼ਾਮਲ ਕਰੋ" "ਆਈਟਮ ਨੂੰ ਇੱਥੇ ਮੂਵ ਕਰੋ" "ਆਈਟਮ ਨੂੰ ਹੋਮ ਸਕ੍ਰੀਨ ਵਿੱਚ ਜੋੜਿਆ ਗਿਆ" "ਅਈਟਮ ਹਟਾਈ ਗਈ" diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 1b74be1f52..528ce481bd 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -33,8 +33,8 @@ "విడ్జెట్‌ను ఎంచుకోవడానికి లేదా అనుకూల చర్యలను ఉపయోగించడానికి రెండుసార్లు నొక్కి, ఉంచండి." "%1$d × %2$d" "%1$d వెడల్పు X %2$d ఎత్తు" - "మాన్యువల్‌గా ఉంచడానికి నొక్కి &amp పట్టుకోండి" - "స్వయంచాలకంగా జోడించు" + "మాన్యువల్‌గా ఉంచడానికి నొక్కి, పట్టుకోండి" + "ఆటోమేటిక్‌గా జోడించు" "అప్లికేషన్‌లను శోధించండి" "అప్లికేషన్‌లను లోడ్ చేస్తోంది…" "\"%1$s\"కి సరిపోలే అప్లికేషన్‌లేవీ కనుగొనబడలేదు" diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index fee76e6d02..03c02ad50e 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -104,7 +104,7 @@ "วิดเจ็ตของ %1$s" "รายการวิดเจ็ต" "ปิดรายการวิดเจ็ตแล้ว" - "เพิ่มลงในหน้าแรก" + "เพิ่มลงในหน้าจอหลัก" "ย้ายรายการมาที่นี่" "เพิ่มรายการไปยังหน้าจอหลักแล้ว" "นำออกรายการออกแล้ว" diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index 359934ec09..f0c241e9e8 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -33,7 +33,7 @@ "I-double tap nang matagal upang pumili ng widget o gumamit ng mga custom na pagkilos." "%1$d × %2$d" "%1$d ang lapad at %2$d ang taas" - "Pindutin nang matagal upang manual na ilagay" + "Pindutin nang matagal para manual na ilagay" "Awtomatikong idagdag" "Maghanap ng mga app" "Naglo-load ng mga app…" diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 7822e0547a..469b176fb4 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -37,8 +37,6 @@ 0dp - 8dp - 8dp 4dp 24dp 0dp @@ -237,4 +235,8 @@ 26dp 194dp + + + 8dp + diff --git a/res/values/styles.xml b/res/values/styles.xml index 252cae1461..ec63e35974 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -44,7 +44,7 @@ @style/WidgetContainerTheme ?android:attr/colorPrimary ?android:attr/colorPrimary - #FFF + #CCFFFFFF false false @@ -82,7 +82,7 @@ #FF464646 #FF80868B true - #000 + #99FFFFFF