/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.launcher3.model; import android.content.Context; import android.os.UserHandle; import com.android.launcher3.AllAppsList; import com.android.launcher3.ItemInfo; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherSettings; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.graphics.LauncherIcons; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.shortcuts.ShortcutInfoCompat; import com.android.launcher3.util.MultiHashMap; import java.util.ArrayList; import java.util.List; /** * Handles changes due to shortcut manager updates (deep shortcut changes) */ public class ShortcutsChangedTask extends BaseModelUpdateTask { private final String mPackageName; private final List mShortcuts; private final UserHandle mUser; private final boolean mUpdateIdMap; public ShortcutsChangedTask(String packageName, List shortcuts, UserHandle user, boolean updateIdMap) { mPackageName = packageName; mShortcuts = shortcuts; mUser = user; mUpdateIdMap = updateIdMap; } @Override public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) { final Context context = app.getContext(); DeepShortcutManager deepShortcutManager = DeepShortcutManager.getInstance(context); deepShortcutManager.onShortcutsChanged(mShortcuts); // Find ShortcutInfo's that have changed on the workspace. final ArrayList removedShortcutInfos = new ArrayList<>(); MultiHashMap idsToWorkspaceShortcutInfos = new MultiHashMap<>(); for (ItemInfo itemInfo : dataModel.itemsIdMap) { if (itemInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) { ShortcutInfo si = (ShortcutInfo) itemInfo; if (si.getIntent().getPackage().equals(mPackageName) && si.user.equals(mUser)) { idsToWorkspaceShortcutInfos.addToList(si.getDeepShortcutId(), si); } } } final ArrayList updatedShortcutInfos = new ArrayList<>(); if (!idsToWorkspaceShortcutInfos.isEmpty()) { // Update the workspace to reflect the changes to updated shortcuts residing on it. List shortcuts = deepShortcutManager.queryForFullDetails( mPackageName, new ArrayList<>(idsToWorkspaceShortcutInfos.keySet()), mUser); for (ShortcutInfoCompat fullDetails : shortcuts) { List shortcutInfos = idsToWorkspaceShortcutInfos .remove(fullDetails.getId()); if (!fullDetails.isPinned()) { // The shortcut was previously pinned but is no longer, so remove it from // the workspace and our pinned shortcut counts. // Note that we put this check here, after querying for full details, // because there's a possible race condition between pinning and // receiving this callback. removedShortcutInfos.addAll(shortcutInfos); continue; } for (ShortcutInfo shortcutInfo : shortcutInfos) { shortcutInfo.updateFromDeepShortcutInfo(fullDetails, context); shortcutInfo.iconBitmap = LauncherIcons.createShortcutIcon(fullDetails, context); updatedShortcutInfos.add(shortcutInfo); } } } // If there are still entries in idsToWorkspaceShortcutInfos, that means that // the corresponding shortcuts weren't passed in onShortcutsChanged(). This // means they were cleared, so we remove and unpin them now. for (String id : idsToWorkspaceShortcutInfos.keySet()) { removedShortcutInfos.addAll(idsToWorkspaceShortcutInfos.get(id)); } bindUpdatedShortcuts(updatedShortcutInfos, removedShortcutInfos, mUser); if (!removedShortcutInfos.isEmpty()) { getModelWriter().deleteItemsFromDatabase(removedShortcutInfos); } if (mUpdateIdMap) { // Update the deep shortcut map if the list of ids has changed for an activity. dataModel.updateDeepShortcutMap(mPackageName, mUser, mShortcuts); bindDeepShortcuts(dataModel); } } }