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;
19f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
20f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.AllAppsList;
21f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.ItemInfo;
22f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.LauncherAppState;
23f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.LauncherAppWidgetInfo;
24f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.LauncherModel.CallbackTask;
25f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.LauncherModel.Callbacks;
26f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.ShortcutInfo;
27f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.compat.PackageInstallerCompat;
28f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport com.android.launcher3.compat.PackageInstallerCompat.PackageInstallInfo;
29f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
30f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalimport java.util.HashSet;
31f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
32f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal/**
33f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal * Handles changes due to a sessions updates for a currently installing app.
34f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal */
35f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyalpublic class PackageInstallStateChangedTask extends ExtendedModelTask {
36f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
37f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    private final PackageInstallInfo mInstallInfo;
38f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
39f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    public PackageInstallStateChangedTask(PackageInstallInfo installInfo) {
40f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        mInstallInfo = installInfo;
41f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    }
42f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
43f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    @Override
44f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
45f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        if (mInstallInfo.state == PackageInstallerCompat.STATUS_INSTALLED) {
46f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            // Ignore install success events as they are handled by Package add events.
47f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            return;
48f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        }
49f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
50f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        synchronized (dataModel) {
51f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            final HashSet<ItemInfo> updates = new HashSet<>();
52f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            for (ItemInfo info : dataModel.itemsIdMap) {
53f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                if (info instanceof ShortcutInfo) {
54f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    ShortcutInfo si = (ShortcutInfo) info;
55f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    ComponentName cn = si.getTargetComponent();
56f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    if (si.isPromise() && (cn != null)
57f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                            && mInstallInfo.packageName.equals(cn.getPackageName())) {
58f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                        si.setInstallProgress(mInstallInfo.progress);
59f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
60f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                        if (mInstallInfo.state == PackageInstallerCompat.STATUS_FAILED) {
61f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                            // Mark this info as broken.
62f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                            si.status &= ~ShortcutInfo.FLAG_INSTALL_SESSION_ACTIVE;
63f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                        }
64f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                        updates.add(si);
65f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    }
66f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                }
67f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            }
68f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
69f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            for (LauncherAppWidgetInfo widget : dataModel.appWidgets) {
70f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                if (widget.providerName.getPackageName().equals(mInstallInfo.packageName)) {
71f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    widget.installProgress = mInstallInfo.progress;
72f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    updates.add(widget);
73f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                }
74f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            }
75f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal
76f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            if (!updates.isEmpty()) {
77f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                scheduleCallbackTask(new CallbackTask() {
78f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    @Override
79f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    public void execute(Callbacks callbacks) {
80f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                        callbacks.bindRestoreItemsChange(updates);
81f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                    }
82f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal                });
83f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal            }
84f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal        }
85f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal    }
86f0ba8b7ca1dc8fd53451d3d16e9f4fc306cddcd4Sunny Goyal}
87