diff --git a/quickstep/res/layout/keyboard_quick_switch_overview.xml b/quickstep/res/layout/keyboard_quick_switch_textonly_taskview.xml similarity index 98% rename from quickstep/res/layout/keyboard_quick_switch_overview.xml rename to quickstep/res/layout/keyboard_quick_switch_textonly_taskview.xml index 30ca32d706..e48794eeae 100644 --- a/quickstep/res/layout/keyboard_quick_switch_overview.xml +++ b/quickstep/res/layout/keyboard_quick_switch_textonly_taskview.xml @@ -40,7 +40,6 @@ android:layout_width="@dimen/keyboard_quick_switch_recents_icon_size" android:layout_height="@dimen/keyboard_quick_switch_recents_icon_size" android:layout_marginBottom="8dp" - android:src="@drawable/view_carousel" android:tint="?androidprv:attr/materialColorOnSurface" app:layout_constraintVertical_chainStyle="packed" diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml index 71855eb61f..fc3c0e347c 100644 --- a/quickstep/res/values/strings.xml +++ b/quickstep/res/values/strings.xml @@ -324,6 +324,12 @@ other{Show # more apps.} } + + {count, plural, + =1{Show # desktop app.} + other{Show # desktop apps.} + } + %1$s and %2$s diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java index 584106bc05..b213203cb1 100644 --- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java +++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java @@ -151,20 +151,10 @@ public final class KeyboardQuickSwitchController implements private void processLoadedTasks(ArrayList tasks) { // Only store MAX_TASK tasks, from most to least recent Collections.reverse(tasks); - - // Hide all desktop tasks and show them on the hidden tile - int hiddenDesktopTasks = 0; - DesktopTask desktopTask = findDesktopTask(tasks); - if (desktopTask != null) { - hiddenDesktopTasks = desktopTask.tasks.size(); - tasks = tasks.stream() - .filter(t -> !(t instanceof DesktopTask)) - .collect(Collectors.toCollection(ArrayList::new)); - } mTasks = tasks.stream() .limit(MAX_TASKS) .collect(Collectors.toList()); - mNumHiddenTasks = Math.max(0, tasks.size() - MAX_TASKS) + hiddenDesktopTasks; + mNumHiddenTasks = Math.max(0, tasks.size() - MAX_TASKS); } private void processLoadedTasksOnDesktop(ArrayList tasks) { diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java index a5383f5a23..5d47212114 100644 --- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java +++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java @@ -36,11 +36,14 @@ import android.view.ViewOutlineProvider; import android.view.ViewTreeObserver; import android.view.animation.Interpolator; import android.widget.HorizontalScrollView; +import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.LayoutRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.content.res.ResourcesCompat; import com.android.app.animation.Interpolators; import com.android.launcher3.R; @@ -48,6 +51,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimatedFloat; import com.android.launcher3.testing.TestLogging; import com.android.launcher3.testing.shared.TestProtocol; +import com.android.quickstep.util.DesktopTask; import com.android.quickstep.util.GroupTask; import java.util.HashMap; @@ -92,6 +96,7 @@ public class KeyboardQuickSwitchView extends ConstraintLayout { private HorizontalScrollView mScrollView; private ConstraintLayout mContent; + private int mTaskViewWidth; private int mTaskViewHeight; private int mSpacing; private int mOutlineRadius; @@ -128,6 +133,8 @@ public class KeyboardQuickSwitchView extends ConstraintLayout { mContent = findViewById(R.id.content); Resources resources = getResources(); + mTaskViewWidth = resources.getDimensionPixelSize( + R.dimen.keyboard_quick_switch_taskview_width); mTaskViewHeight = resources.getDimensionPixelSize( R.dimen.keyboard_quick_switch_taskview_height); mSpacing = resources.getDimensionPixelSize(R.dimen.keyboard_quick_switch_view_spacing); @@ -135,21 +142,18 @@ public class KeyboardQuickSwitchView extends ConstraintLayout { mIsRtl = Utilities.isRtl(resources); } - @NonNull private KeyboardQuickSwitchTaskView createAndAddTaskView( int index, - int width, boolean isFinalView, - boolean updateTasks, + @LayoutRes int resId, @NonNull LayoutInflater layoutInflater, - @Nullable View previousView, - @NonNull List groupTasks) { + @Nullable View previousView) { KeyboardQuickSwitchTaskView taskView = (KeyboardQuickSwitchTaskView) layoutInflater.inflate( - R.layout.keyboard_quick_switch_taskview, mContent, false); + resId, mContent, false); taskView.setId(View.generateViewId()); taskView.setOnClickListener(v -> mViewCallbacks.launchTaskAt(index)); - LayoutParams lp = new LayoutParams(width, mTaskViewHeight); + LayoutParams lp = new LayoutParams(mTaskViewWidth, mTaskViewHeight); // Create a left-to-right ordering of views (or right-to-left in RTL locales) if (previousView != null) { lp.startToEnd = previousView.getId(); @@ -167,45 +171,11 @@ public class KeyboardQuickSwitchView extends ConstraintLayout { lp.horizontalBias = 1f; } - GroupTask groupTask = groupTasks.get(index); - taskView.setThumbnails( - groupTask.task1, - groupTask.task2, - updateTasks ? mViewCallbacks::updateThumbnailInBackground : null, - updateTasks ? mViewCallbacks::updateIconInBackground : null); - mContent.addView(taskView, lp); + return taskView; } - private void createAndAddOverviewButton( - int width, - @NonNull LayoutInflater layoutInflater, - @Nullable View previousView, - @NonNull String overflowString) { - KeyboardQuickSwitchTaskView overviewButton = - (KeyboardQuickSwitchTaskView) layoutInflater.inflate( - R.layout.keyboard_quick_switch_overview, this, false); - overviewButton.setOnClickListener(v -> mViewCallbacks.launchTaskAt(MAX_TASKS)); - - overviewButton.findViewById(R.id.text).setText(overflowString); - - ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams( - width, mTaskViewHeight); - if (previousView == null) { - lp.startToStart = PARENT_ID; - } else { - lp.endToEnd = PARENT_ID; - lp.startToEnd = previousView.getId(); - } - lp.topToTop = PARENT_ID; - lp.bottomToBottom = PARENT_ID; - lp.setMarginEnd(mSpacing); - lp.setMarginStart(mSpacing); - - mContent.addView(overviewButton, lp); - } - protected void applyLoadPlan( @NonNull Context context, @NonNull List groupTasks, @@ -215,32 +185,57 @@ public class KeyboardQuickSwitchView extends ConstraintLayout { @NonNull KeyboardQuickSwitchViewController.ViewCallbacks viewCallbacks) { mViewCallbacks = viewCallbacks; Resources resources = context.getResources(); - int width = resources.getDimensionPixelSize(R.dimen.keyboard_quick_switch_taskview_width); - View previousView = null; + Resources.Theme theme = context.getTheme(); + View previousTaskView = null; LayoutInflater layoutInflater = LayoutInflater.from(context); int tasksToDisplay = Math.min(MAX_TASKS, groupTasks.size()); for (int i = 0; i < tasksToDisplay; i++) { - previousView = createAndAddTaskView( + GroupTask groupTask = groupTasks.get(i); + KeyboardQuickSwitchTaskView currentTaskView = createAndAddTaskView( i, - width, /* isFinalView= */ i == tasksToDisplay - 1 && numHiddenTasks == 0, - updateTasks, + groupTask instanceof DesktopTask + ? R.layout.keyboard_quick_switch_textonly_taskview + : R.layout.keyboard_quick_switch_taskview, layoutInflater, - previousView, - groupTasks); + previousTaskView); + + if (groupTask instanceof DesktopTask desktopTask) { + HashMap args = new HashMap<>(); + args.put("count", desktopTask.tasks.size()); + + currentTaskView.findViewById(R.id.icon).setImageDrawable( + ResourcesCompat.getDrawable(resources, R.drawable.ic_desktop, theme)); + currentTaskView.findViewById(R.id.text).setText(new MessageFormat( + resources.getString(R.string.quick_switch_desktop), + Locale.getDefault()).format(args)); + } else { + currentTaskView.setThumbnails( + groupTask.task1, + groupTask.task2, + updateTasks ? mViewCallbacks::updateThumbnailInBackground : null, + updateTasks ? mViewCallbacks::updateIconInBackground : null); + } + previousTaskView = currentTaskView; } if (numHiddenTasks > 0) { HashMap args = new HashMap<>(); args.put("count", numHiddenTasks); - createAndAddOverviewButton( - width, + + View overviewButton = createAndAddTaskView( + MAX_TASKS, + /* isFinalView= */ true, + R.layout.keyboard_quick_switch_textonly_taskview, layoutInflater, - previousView, - new MessageFormat( - resources.getString(R.string.quick_switch_overflow), - Locale.getDefault()).format(args)); + previousTaskView); + + overviewButton.findViewById(R.id.icon).setImageDrawable( + ResourcesCompat.getDrawable(resources, R.drawable.view_carousel, theme)); + overviewButton.findViewById(R.id.text).setText(new MessageFormat( + resources.getString(R.string.quick_switch_overflow), + Locale.getDefault()).format(args)); } mDisplayingRecentTasks = !groupTasks.isEmpty(); diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java index 25a97d4429..d6ee92f195 100644 --- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java @@ -32,6 +32,7 @@ import com.android.launcher3.Utilities; import com.android.launcher3.anim.AnimatorListeners; import com.android.launcher3.taskbar.overlay.TaskbarOverlayContext; import com.android.quickstep.SystemUiProxy; +import com.android.quickstep.util.DesktopTask; import com.android.quickstep.util.GroupTask; import com.android.quickstep.util.SlideInRemoteTransition; import com.android.systemui.shared.recents.model.Task; @@ -157,7 +158,13 @@ public class KeyboardQuickSwitchViewController { AnimationUtils.loadInterpolator( context, android.R.interpolator.fast_out_extra_slow_in)), "SlideInTransition"); - if (mOnDesktop) { + if (task instanceof DesktopTask) { + UI_HELPER_EXECUTOR.execute(() -> + SystemUiProxy.INSTANCE.get(mKeyboardQuickSwitchView.getContext()) + .showDesktopApps( + mKeyboardQuickSwitchView.getDisplay().getDisplayId(), + remoteTransition)); + } else if (mOnDesktop) { UI_HELPER_EXECUTOR.execute(() -> SystemUiProxy.INSTANCE.get(mKeyboardQuickSwitchView.getContext()) .showDesktopApp(task.task1.key.id));