1f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal/*
2f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal * Copyright (C) 2016 The Android Open Source Project
3f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal *
4f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal * Licensed under the Apache License, Version 2.0 (the "License");
5f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal * you may not use this file except in compliance with the License.
6f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal * You may obtain a copy of the License at
7f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal *
8f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal *      http://www.apache.org/licenses/LICENSE-2.0
9f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal *
10f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal * Unless required by applicable law or agreed to in writing, software
11f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal * distributed under the License is distributed on an "AS IS" BASIS,
12f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal * See the License for the specific language governing permissions and
14f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal * limitations under the License.
15f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal */
16f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalpackage com.android.launcher3.model;
17f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
18f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport android.content.Context;
197c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyalimport android.os.UserHandle;
20f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
21f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.AllAppsList;
22f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.ItemInfo;
23f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.LauncherAppState;
24f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.LauncherSettings;
25f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.ShortcutInfo;
26f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.compat.UserManagerCompat;
271b0726359b5157db8d3d96c52a37f05fce065618Sunny Goyalimport com.android.launcher3.graphics.LauncherIcons;
28f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.shortcuts.DeepShortcutManager;
29f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.shortcuts.ShortcutInfoCompat;
30f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.shortcuts.ShortcutKey;
31f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.util.ComponentKey;
326e13dd3aa867d01f3f1d196ac82eca184328577cSunny Goyalimport com.android.launcher3.util.ItemInfoMatcher;
33f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
34f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport java.util.ArrayList;
35f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport java.util.HashMap;
366e13dd3aa867d01f3f1d196ac82eca184328577cSunny Goyalimport java.util.HashSet;
37f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport java.util.Iterator;
38f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport java.util.List;
39f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
40f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal/**
41f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal * Task to handle changing of lock state of the user
42f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal */
43e86f11fa386e5cc3ee81bd72771fc22750a35f03Sunny Goyalpublic class UserLockStateChangedTask extends BaseModelUpdateTask {
44f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
457c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal    private final UserHandle mUser;
46f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
477c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal    public UserLockStateChangedTask(UserHandle user) {
48f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        mUser = user;
49f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    }
50f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
51f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    @Override
52f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
53f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        Context context = app.getContext();
54f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        boolean isUserUnlocked = UserManagerCompat.getInstance(context).isUserUnlocked(mUser);
55dde4fd971e825749686e7aa77379c65e410eea54Sunny Goyal        DeepShortcutManager deepShortcutManager = DeepShortcutManager.getInstance(context);
56f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
57f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        HashMap<ShortcutKey, ShortcutInfoCompat> pinnedShortcuts = new HashMap<>();
58f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        if (isUserUnlocked) {
59f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            List<ShortcutInfoCompat> shortcuts =
60f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    deepShortcutManager.queryForPinnedShortcuts(null, mUser);
61f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            if (deepShortcutManager.wasLastCallSuccess()) {
62f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                for (ShortcutInfoCompat shortcut : shortcuts) {
63f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    pinnedShortcuts.put(ShortcutKey.fromInfo(shortcut), shortcut);
64f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                }
65f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            } else {
66f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                // Shortcut manager can fail due to some race condition when the lock state
67f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                // changes too frequently. For the purpose of the update,
68f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                // consider it as still locked.
69f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                isUserUnlocked = false;
70f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            }
71f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        }
72f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
73f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        // Update the workspace to reflect the changes to updated shortcuts residing on it.
74f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        ArrayList<ShortcutInfo> updatedShortcutInfos = new ArrayList<>();
756e13dd3aa867d01f3f1d196ac82eca184328577cSunny Goyal        HashSet<ShortcutKey> removedKeys = new HashSet<>();
766e13dd3aa867d01f3f1d196ac82eca184328577cSunny Goyal
77f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        for (ItemInfo itemInfo : dataModel.itemsIdMap) {
78f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            if (itemInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT
79f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    && mUser.equals(itemInfo.user)) {
80f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                ShortcutInfo si = (ShortcutInfo) itemInfo;
81f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                if (isUserUnlocked) {
826e13dd3aa867d01f3f1d196ac82eca184328577cSunny Goyal                    ShortcutKey key = ShortcutKey.fromItemInfo(si);
836e13dd3aa867d01f3f1d196ac82eca184328577cSunny Goyal                    ShortcutInfoCompat shortcut = pinnedShortcuts.get(key);
84f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    // We couldn't verify the shortcut during loader. If its no longer available
85f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    // (probably due to clear data), delete the workspace item as well
86f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    if (shortcut == null) {
876e13dd3aa867d01f3f1d196ac82eca184328577cSunny Goyal                        removedKeys.add(key);
88f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                        continue;
89f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    }
90f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    si.isDisabled &= ~ShortcutInfo.FLAG_DISABLED_LOCKED_USER;
91f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    si.updateFromDeepShortcutInfo(shortcut, context);
92a8ccf0959754907de6aec63a41db5dc442047b80Tony                    si.iconBitmap = LauncherIcons.createShortcutIcon(shortcut, context,
93a8ccf0959754907de6aec63a41db5dc442047b80Tony                            si.iconBitmap);
94f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                } else {
95f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    si.isDisabled |= ShortcutInfo.FLAG_DISABLED_LOCKED_USER;
96f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                }
97f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                updatedShortcutInfos.add(si);
98f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            }
99f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        }
1006e13dd3aa867d01f3f1d196ac82eca184328577cSunny Goyal        bindUpdatedShortcuts(updatedShortcutInfos, mUser);
1016e13dd3aa867d01f3f1d196ac82eca184328577cSunny Goyal        if (!removedKeys.isEmpty()) {
1026e13dd3aa867d01f3f1d196ac82eca184328577cSunny Goyal            deleteAndBindComponentsRemoved(ItemInfoMatcher.ofShortcutKeys(removedKeys));
103f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        }
104f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
105f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        // Remove shortcut id map for that user
106f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        Iterator<ComponentKey> keysIter = dataModel.deepShortcutMap.keySet().iterator();
107f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        while (keysIter.hasNext()) {
108f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            if (keysIter.next().user.equals(mUser)) {
109f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                keysIter.remove();
110f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            }
111f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        }
112f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
113f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        if (isUserUnlocked) {
114f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            dataModel.updateDeepShortcutMap(
115f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    null, mUser, deepShortcutManager.queryForAllShortcuts(mUser));
116f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        }
117f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        bindDeepShortcuts(dataModel);
118f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    }
119f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal}
120