From 8c574de97f967ca79d5d25ef8bd65a8bd58256f0 Mon Sep 17 00:00:00 2001 From: Andras Kloczl Date: Tue, 17 Aug 2021 23:12:17 +0200 Subject: [PATCH] Two panel home empty page removing logic change - Don't remove a single page if it's empty, only if both pages are empty. - Add back empty pages after they were removed while the phone was on single panel home. - On two panel home don't add new workspace items onto the second screen Test: manual Bug: 196376162 Change-Id: I4c54ffa3b359a236deb3ab67adb54111e77ec896 --- src/com/android/launcher3/Launcher.java | 19 ++++++++++- src/com/android/launcher3/Workspace.java | 32 +++++++++++++++++++ .../launcher3/WorkspaceLayoutManager.java | 2 ++ .../graphics/LauncherPreviewRenderer.java | 3 +- .../graphics/PreviewSurfaceRenderer.java | 5 +-- .../model/AddWorkspaceItemsTask.java | 6 ++++ src/com/android/launcher3/util/IntArray.java | 2 +- 7 files changed, 62 insertions(+), 7 deletions(-) diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 4d5cc5ee4a..6ea7b17871 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -2186,6 +2186,24 @@ public class Launcher extends StatefulActivity implements Launche } private void bindAddScreens(IntArray orderedScreenIds) { + if (mDeviceProfile.isTwoPanels) { + // Some empty pages might have been removed while the phone was in a single panel + // mode, so we want to add those empty pages back. + IntSet screenIds = IntSet.wrap(orderedScreenIds); + for (int i = 0; i < orderedScreenIds.size(); i++) { + int screenId = orderedScreenIds.get(i); + // Don't add the page pair if the page is the last one and if the pair is on the + // right, because that would cause a bug when adding new pages. + // TODO: (b/196376162) remove this when the new screen id logic is fixed for two + // panel in Workspace::commitExtraEmptyScreen + if (i == orderedScreenIds.size() - 1 && screenId % 2 == 0) { + continue; + } + screenIds.add(mWorkspace.getPagePair(screenId)); + } + orderedScreenIds = screenIds.getArray(); + } + int count = orderedScreenIds.size(); for (int i = 0; i < count; i++) { int screenId = orderedScreenIds.get(i); @@ -2193,7 +2211,6 @@ public class Launcher extends StatefulActivity implements Launche // No need to bind the first screen, as its always bound. continue; } - mWorkspace.insertNewWorkspaceScreenBeforeEmptyScreen(screenId); } } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 38beeea97d..5049ae5bd5 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -123,6 +123,7 @@ import com.android.systemui.plugins.shared.LauncherOverlayManager.LauncherOverla import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -797,6 +798,21 @@ public class Workspace extends PagedView return mScreenOrder; } + /** + * Returns the page that is shown together with the given page when two panel is enabled. + * @throws IllegalStateException if called while two panel home isn't enabled. + */ + public int getPagePair(int page) { + if (!isTwoPanelEnabled()) { + throw new IllegalStateException("Two panel home isn't enabled."); + } + if (page % 2 == 0) { + return page + 1; + } else { + return page - 1; + } + } + public void stripEmptyScreens() { if (mLauncher.isWorkspaceLoading()) { // Don't strip empty screens if the workspace is still loading. @@ -822,6 +838,22 @@ public class Workspace extends PagedView } } + // When two panel home is enabled we only remove an empty page if both visible pages are + // empty. + if (isTwoPanelEnabled()) { + // We go through all the pages that were marked as removable and check their page pair + Iterator removeScreensIterator = removeScreens.iterator(); + while (removeScreensIterator.hasNext()) { + int pageToRemove = removeScreensIterator.next(); + int pagePair = getPagePair(pageToRemove); + if (!removeScreens.contains(pagePair)) { + // The page pair isn't empty so we want to remove the current page from the + // removable pages' collection + removeScreensIterator.remove(); + } + } + } + // We enforce at least one page to add new items to. In the case that we remove the last // such screen, we convert the last screen to the empty screen int minScreens = 1; diff --git a/src/com/android/launcher3/WorkspaceLayoutManager.java b/src/com/android/launcher3/WorkspaceLayoutManager.java index d6302ce580..44a5536c92 100644 --- a/src/com/android/launcher3/WorkspaceLayoutManager.java +++ b/src/com/android/launcher3/WorkspaceLayoutManager.java @@ -32,6 +32,8 @@ public interface WorkspaceLayoutManager { int EXTRA_EMPTY_SCREEN_ID = -201; // The is the first screen. It is always present, even if its empty. int FIRST_SCREEN_ID = 0; + // This is the second page. On two panel home it is always present, even if its empty. + int SECOND_SCREEN_ID = 1; /** * At bind time, we use the rank (screenId) to compute x and y for hotseat items. diff --git a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java index a96de31241..94c578e0ae 100644 --- a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java +++ b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java @@ -65,6 +65,7 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.R; import com.android.launcher3.Utilities; +import com.android.launcher3.Workspace; import com.android.launcher3.WorkspaceLayoutManager; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.folder.FolderIcon; @@ -279,7 +280,7 @@ public class LauncherPreviewRenderer extends ContextWrapper mDp.workspacePadding.top, mDp.workspacePadding.right + mDp.cellLayoutPaddingLeftRightPx, mDp.workspacePadding.bottom); - mWorkspaceScreens.put(PreviewSurfaceRenderer.SECOND_SCREEN_ID, rightPanel); + mWorkspaceScreens.put(Workspace.SECOND_SCREEN_ID, rightPanel); } if (Utilities.ATLEAST_S) { diff --git a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java index af006d6a56..f4d1e615d7 100644 --- a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java +++ b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java @@ -66,9 +66,6 @@ public class PreviewSurfaceRenderer { private static final int FADE_IN_ANIMATION_DURATION = 200; - // The is the second screen. It is always present in two panel, even if its empty. - static final int SECOND_SCREEN_ID = 1; - private static final String KEY_HOST_TOKEN = "host_token"; private static final String KEY_VIEW_WIDTH = "width"; private static final String KEY_VIEW_HEIGHT = "height"; @@ -172,7 +169,7 @@ public class PreviewSurfaceRenderer { + LauncherSettings.Favorites.CONTAINER_HOTSEAT; if (deviceProfile.isTwoPanels) { query += " or " + LauncherSettings.Favorites.SCREEN + " = " - + SECOND_SCREEN_ID; + + Workspace.SECOND_SCREEN_ID; } loadWorkspace(new ArrayList<>(), LauncherSettings.Favorites.PREVIEW_CONTENT_URI, query); diff --git a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java index a13fa55dff..fea15c41f8 100644 --- a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java +++ b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java @@ -16,6 +16,7 @@ package com.android.launcher3.model; import static com.android.launcher3.WorkspaceLayoutManager.FIRST_SCREEN_ID; +import static com.android.launcher3.WorkspaceLayoutManager.SECOND_SCREEN_ID; import android.content.Intent; import android.content.pm.LauncherActivityInfo; @@ -299,6 +300,11 @@ public class AddWorkspaceItemsTask extends BaseModelUpdateTask { IntSet screensToExclude = new IntSet(); if (FeatureFlags.QSB_ON_FIRST_SCREEN) { screensToExclude.add(FIRST_SCREEN_ID); + + // On split display we don't want to add the new items onto the second screen. + if (app.getInvariantDeviceProfile().isSplitDisplay) { + screensToExclude.add(SECOND_SCREEN_ID); + } } for (int screen = 0; screen < screenCount; screen++) { diff --git a/src/com/android/launcher3/util/IntArray.java b/src/com/android/launcher3/util/IntArray.java index e7235e76ce..1c787959e4 100644 --- a/src/com/android/launcher3/util/IntArray.java +++ b/src/com/android/launcher3/util/IntArray.java @@ -296,7 +296,7 @@ public class IntArray implements Cloneable, Iterable { @Override public void remove() { - throw new UnsupportedOperationException(); + removeIndex(--mNextIndex); } } } \ No newline at end of file