Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ec391071 authored by Schneider Victor-tulias's avatar Schneider Victor-tulias
Browse files

Update KQS to better support desktop tasks

While we wait for a way to display a sreenshot of the desktop statically, using a placeholder solution.

Flag: LEGACY ENABLE_KEYBOARD_QUICK_SWITCH ENABLED
Fixes: 335632286
Test: TaplTestKeyboardQuickSwitch
Change-Id: I2525ab89eb3a5a902e7ab55367187d87aada1f10
parent 2fb15b12
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -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"
+6 −0
Original line number Diff line number Diff line
@@ -324,6 +324,12 @@
            other{Show # more apps.}
        }</string>

    <!-- Label for quick switch tile showing how many apps are available in desktop mode [CHAR LIMIT=NONE] -->
    <string name="quick_switch_desktop">{count, plural,
            =1{Show # desktop app.}
            other{Show # desktop apps.}
        }</string>

    <!-- Accessibility label for quick switch tiles showing split tasks [CHAR LIMIT=NONE] -->
    <string name="quick_switch_split_task"><xliff:g id="app_name_1" example="Chrome">%1$s</xliff:g> and <xliff:g id="app_name_2" example="Gmail">%2$s</xliff:g></string>

+1 −11
Original line number Diff line number Diff line
@@ -151,20 +151,10 @@ public final class KeyboardQuickSwitchController implements
    private void processLoadedTasks(ArrayList<GroupTask> 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<GroupTask>::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<GroupTask> tasks) {
+50 −55
Original line number Diff line number Diff line
@@ -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<GroupTask> 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,43 +171,9 @@ 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.<TextView>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);
        return taskView;
    }

    protected void applyLoadPlan(
@@ -215,30 +185,55 @@ 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<String, Integer> args = new HashMap<>();
                args.put("count", desktopTask.tasks.size());

                currentTaskView.<ImageView>findViewById(R.id.icon).setImageDrawable(
                        ResourcesCompat.getDrawable(resources, R.drawable.ic_desktop, theme));
                currentTaskView.<TextView>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<String, Integer> 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(
                    previousTaskView);

            overviewButton.<ImageView>findViewById(R.id.icon).setImageDrawable(
                    ResourcesCompat.getDrawable(resources, R.drawable.view_carousel, theme));
            overviewButton.<TextView>findViewById(R.id.text).setText(new MessageFormat(
                    resources.getString(R.string.quick_switch_overflow),
                    Locale.getDefault()).format(args));
        }
+8 −1
Original line number Diff line number Diff line
@@ -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));