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

Commit 6a41d56b authored by Pinyao Ting's avatar Pinyao Ting
Browse files

Log the reason why a WorkspaceItemInfo was removed

In the past we've seen a WorkspaceItem disappeared from the workspace
but wasn't able to determine why it was removed. This CL includes the
reason why it was removed in the error log, which hopefully would help
us debugging similar issues in the future.

Bug: 231239260
Test: make
Change-Id: Iba3d57568c9b3e011a6b65b26f0d4170d42fe1a5
parent 9c7551a9
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -160,7 +160,7 @@ public class DeleteDropTarget extends ButtonDropTarget {
        // Remove the item from launcher and the db, we can ignore the containerInfo in this call
        // because we already remove the drag view from the folder (if the drag originated from
        // a folder) in Folder.beginDrag()
        mLauncher.removeItem(view, item, true /* deleteFromDb */);
        mLauncher.removeItem(view, item, true /* deleteFromDb */, "removed by accessibility drop");
        mLauncher.getWorkspace().stripEmptyScreens();
        mLauncher.getDragLayer()
                .announceForAccessibility(getContext().getString(R.string.item_removed));
+21 −8
Original line number Diff line number Diff line
@@ -1956,6 +1956,19 @@ public class Launcher extends StatefulActivity<LauncherState>
     * @param deleteFromDb whether or not to delete this item from the db.
     */
    public boolean removeItem(View v, final ItemInfo itemInfo, boolean deleteFromDb) {
        return removeItem(v, itemInfo, deleteFromDb, null);
    }

    /**
     * Unbinds the view for the specified item, and removes the item and all its children.
     *
     * @param v the view being removed.
     * @param itemInfo the {@link ItemInfo} for this view.
     * @param deleteFromDb whether or not to delete this item from the db.
     * @param reason the resaon for removal.
     */
    public boolean removeItem(View v, final ItemInfo itemInfo, boolean deleteFromDb,
            @Nullable final String reason) {
        if (itemInfo instanceof WorkspaceItemInfo) {
            // Remove the shortcut from the folder before removing it from launcher
            View folderIcon = mWorkspace.getHomescreenIconByItemId(itemInfo.container);
@@ -1965,7 +1978,7 @@ public class Launcher extends StatefulActivity<LauncherState>
                mWorkspace.removeWorkspaceItem(v);
            }
            if (deleteFromDb) {
                getModelWriter().deleteItemFromDatabase(itemInfo);
                getModelWriter().deleteItemFromDatabase(itemInfo, reason);
            }
        } else if (itemInfo instanceof FolderInfo) {
            final FolderInfo folderInfo = (FolderInfo) itemInfo;
@@ -1980,7 +1993,7 @@ public class Launcher extends StatefulActivity<LauncherState>
            final LauncherAppWidgetInfo widgetInfo = (LauncherAppWidgetInfo) itemInfo;
            mWorkspace.removeWorkspaceItem(v);
            if (deleteFromDb) {
                getModelWriter().deleteWidgetInfo(widgetInfo, getAppWidgetHost());
                getModelWriter().deleteWidgetInfo(widgetInfo, getAppWidgetHost(), reason);
            }
        } else {
            return false;
@@ -2399,8 +2412,7 @@ public class Launcher extends StatefulActivity<LauncherState>
                    if (FeatureFlags.IS_STUDIO_BUILD) {
                        throw (new RuntimeException(desc));
                    } else {
                        Log.d(TAG, desc);
                        getModelWriter().deleteItemFromDatabase(item);
                        getModelWriter().deleteItemFromDatabase(item, desc);
                        if (TestProtocol.sDebugTracing) {
                            Log.d(TestProtocol.MISSING_PROMISE_ICON,
                                    TAG + "bindItems failed for item=" + item);
@@ -2480,7 +2492,8 @@ public class Launcher extends StatefulActivity<LauncherState>
        if (item.hasOptionFlag(LauncherAppWidgetInfo.OPTION_SEARCH_WIDGET)) {
            item.providerName = QsbContainerView.getSearchComponentName(this);
            if (item.providerName == null) {
                getModelWriter().deleteItemFromDatabase(item);
                getModelWriter().deleteItemFromDatabase(item,
                        "search widget removed because search component cannot be found");
                return null;
            }
        }
@@ -2531,10 +2544,10 @@ public class Launcher extends StatefulActivity<LauncherState>
            if (!item.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY)
                    && (item.restoreStatus != LauncherAppWidgetInfo.RESTORE_COMPLETED)) {
                if (appWidgetInfo == null) {
                    FileLog.d(TAG, "Removing restored widget: id=" + item.appWidgetId
                    getModelWriter().deleteItemFromDatabase(item,
                            "Removing restored widget: id=" + item.appWidgetId
                            + " belongs to component " + item.providerName + " user " + item.user
                            + ", as the provider is null and " + removalReason);
                    getModelWriter().deleteItemFromDatabase(item);
                    return null;
                }

@@ -2604,7 +2617,7 @@ public class Launcher extends StatefulActivity<LauncherState>
                // Verify that we own the widget
                if (appWidgetInfo == null) {
                    FileLog.e(TAG, "Removing invalid widget: id=" + item.appWidgetId);
                    getModelWriter().deleteWidgetInfo(item, getAppWidgetHost());
                    getModelWriter().deleteWidgetInfo(item, getAppWidgetHost(), removalReason);
                    return null;
                }

+3 −1
Original line number Diff line number Diff line
@@ -477,7 +477,9 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi
                }

                if (!removedIds.isEmpty()) {
                    deleteAndBindComponentsRemoved(ItemInfoMatcher.ofItemIds(removedIds));
                    deleteAndBindComponentsRemoved(
                            ItemInfoMatcher.ofItemIds(removedIds),
                            "removed because install session failed");
                }
            }
        });
+5 −3
Original line number Diff line number Diff line
@@ -3068,7 +3068,8 @@ public class Workspace<T extends View & PageIndicator> extends PagedView<T>
            if (info instanceof LauncherAppWidgetInfo) {
                LauncherAppWidgetInfo appWidgetInfo = (LauncherAppWidgetInfo) info;
                if (appWidgetInfo.appWidgetId == appWidgetId) {
                    mLauncher.removeItem(view, appWidgetInfo, true);
                    mLauncher.removeItem(view, appWidgetInfo, true,
                            "widget is removed in response to widget remove broadcast");
                    return true;
                }
            }
@@ -3318,8 +3319,9 @@ public class Workspace<T extends View & PageIndicator> extends PagedView<T>
     *
     * @param matcher  the matcher generated by the caller.
     */
    public void persistRemoveItemsByMatcher(Predicate<ItemInfo> matcher) {
        mLauncher.getModelWriter().deleteItemsFromDatabase(matcher);
    public void persistRemoveItemsByMatcher(Predicate<ItemInfo> matcher,
            @Nullable final String reason) {
        mLauncher.getModelWriter().deleteItemsFromDatabase(matcher, reason);
        removeItemsByMatcher(matcher);
    }

+2 −1
Original line number Diff line number Diff line
@@ -100,7 +100,8 @@ public class LauncherDelegate {
                    }

                    // Remove the folder
                    mLauncher.removeItem(folder.mFolderIcon, info, true /* deleteFromDb */);
                    mLauncher.removeItem(folder.mFolderIcon, info, true /* deleteFromDb */,
                            "folder removed because there's only 1 item in it");
                    if (folder.mFolderIcon instanceof DropTarget) {
                        folder.mDragController.removeDropTarget((DropTarget) folder.mFolderIcon);
                    }
Loading