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.ComponentName;
197c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyalimport android.os.UserHandle;
20f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
21f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.AllAppsList;
22f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.AppInfo;
23f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.IconCache;
24f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.ItemInfo;
25f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.LauncherAppState;
26f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.LauncherModel.CallbackTask;
27f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.LauncherModel.Callbacks;
28f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.LauncherSettings;
291cd01b023acc123b771765b7297d8aaedac224e0Sunny Goyalimport com.android.launcher3.LauncherSettings.Favorites;
30f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.ShortcutInfo;
31f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
32f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport java.util.ArrayList;
33f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport java.util.HashSet;
34f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
35f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal/**
36f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal * Handles changes due to cache updates.
37f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal */
38f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalpublic class CacheDataUpdatedTask extends ExtendedModelTask {
39f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
40f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    public static final int OP_CACHE_UPDATE = 1;
41f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    public static final int OP_SESSION_UPDATE = 2;
42f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
43f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    private final int mOp;
447c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal    private final UserHandle mUser;
45f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    private final HashSet<String> mPackages;
46f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
477c74e4ae641e76f73d74348e293c244a157f6585Sunny Goyal    public CacheDataUpdatedTask(int op, UserHandle user, HashSet<String> packages) {
48f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        mOp = op;
49f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        mUser = user;
50f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        mPackages = packages;
51f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    }
52f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
53f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    @Override
54f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
55f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        IconCache iconCache = app.getIconCache();
56f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
57f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        final ArrayList<AppInfo> updatedApps = new ArrayList<>();
58f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
59f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        ArrayList<ShortcutInfo> updatedShortcuts = new ArrayList<>();
60f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        synchronized (dataModel) {
61f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            for (ItemInfo info : dataModel.itemsIdMap) {
62f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                if (info instanceof ShortcutInfo && mUser.equals(info.user)) {
63f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    ShortcutInfo si = (ShortcutInfo) info;
64f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    ComponentName cn = si.getTargetComponent();
651cd01b023acc123b771765b7297d8aaedac224e0Sunny Goyal                    if (si.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION
661cd01b023acc123b771765b7297d8aaedac224e0Sunny Goyal                            && isValidShortcut(si) && cn != null
671cd01b023acc123b771765b7297d8aaedac224e0Sunny Goyal                            && mPackages.contains(cn.getPackageName())) {
683fe4a146cf774261ab3552dd8ab392439c771e54Sunny Goyal                        iconCache.getTitleAndIcon(si, si.usingLowResIcon);
69f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                        updatedShortcuts.add(si);
70f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    }
71f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                }
72f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            }
73f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            apps.updateIconsAndLabels(mPackages, mUser, updatedApps);
74f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        }
75f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        bindUpdatedShortcuts(updatedShortcuts, mUser);
76f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
77f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        if (!updatedApps.isEmpty()) {
78f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            scheduleCallbackTask(new CallbackTask() {
79f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                @Override
80f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                public void execute(Callbacks callbacks) {
81f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    callbacks.bindAppsUpdated(updatedApps);
82f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                }
83f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            });
84f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        }
85f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    }
86f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
87f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    public boolean isValidShortcut(ShortcutInfo si) {
88f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        switch (mOp) {
89f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            case OP_CACHE_UPDATE:
901cd01b023acc123b771765b7297d8aaedac224e0Sunny Goyal                return true;
91f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            case OP_SESSION_UPDATE:
92f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                return si.isPromise();
93f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            default:
94f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                return false;
95f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        }
96f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    }
97f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal}
98