diff options
author | Sunny Goyal <sunnygoyal@google.com> | 2016-09-01 15:50:36 -0700 |
---|---|---|
committer | Sunny Goyal <sunnygoyal@google.com> | 2016-09-02 11:06:18 -0700 |
commit | c2936bcbdbdfbf3b499b39c65ce1942694f35676 (patch) | |
tree | 20dbb0c2798c004715a0c8ed434f646de4c101f9 /src | |
parent | c92551f4954aef812ed1efee85ffd853c43c4d73 (diff) | |
download | android_packages_apps_Trebuchet-c2936bcbdbdfbf3b499b39c65ce1942694f35676.tar.gz android_packages_apps_Trebuchet-c2936bcbdbdfbf3b499b39c65ce1942694f35676.tar.bz2 android_packages_apps_Trebuchet-c2936bcbdbdfbf3b499b39c65ce1942694f35676.zip |
Moving AppsAvailabilityCheck into a separate class
Change-Id: Ieea1b5100d63752d928049ad9b1d3b4f84234f0d
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/launcher3/LauncherModel.java | 66 | ||||
-rw-r--r-- | src/com/android/launcher3/model/SdCardAvailableReceiver.java | 88 |
2 files changed, 102 insertions, 52 deletions
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 68450e7a7..ccde0e9cf 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -59,6 +59,7 @@ import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.logging.FileLog; import com.android.launcher3.model.GridSizeMigrationTask; +import com.android.launcher3.model.SdCardAvailableReceiver; import com.android.launcher3.model.WidgetsModel; import com.android.launcher3.provider.ImportDataTask; import com.android.launcher3.provider.LauncherDbUtils; @@ -188,10 +189,6 @@ public class LauncherModel extends BroadcastReceiver // times it is pinned. static final Map<ShortcutKey, MutableInt> sBgPinnedShortcutCounts = new HashMap<>(); - // sPendingPackages is a set of packages which could be on sdcard and are not available yet - static final HashMap<UserHandleCompat, HashSet<String>> sPendingPackages = - new HashMap<UserHandleCompat, HashSet<String>>(); - // </ only access in worker thread > private IconCache mIconCache; @@ -1150,9 +1147,12 @@ public class LauncherModel extends BroadcastReceiver @Override public void onPackageRemoved(String packageName, UserHandleCompat user) { + onPackagesRemoved(user, packageName); + } + + public void onPackagesRemoved(UserHandleCompat user, String... packages) { int op = PackageUpdatedTask.OP_REMOVE; - enqueueItemUpdatedTask(new PackageUpdatedTask(op, new String[] { packageName }, - user)); + enqueueItemUpdatedTask(new PackageUpdatedTask(op, packages, user)); } @Override @@ -1663,6 +1663,7 @@ public class LauncherModel extends BroadcastReceiver final boolean isSafeMode = manager.isSafeMode(); final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); final boolean isSdCardReady = Utilities.isBootCompleted(); + final MultiHashMap<UserHandleCompat, String> pendingPackages = new MultiHashMap<>(); LauncherAppState app = LauncherAppState.getInstance(); InvariantDeviceProfile profile = app.getInvariantDeviceProfile(); @@ -1901,12 +1902,7 @@ public class LauncherModel extends BroadcastReceiver // SdCard is not ready yet. Package might get available, // once it is ready. Log.d(TAG, "Invalid package: " + cn + " (check again later)"); - HashSet<String> pkgs = sPendingPackages.get(user); - if (pkgs == null) { - pkgs = new HashSet<String>(); - sPendingPackages.put(user, pkgs); - } - pkgs.add(cn.getPackageName()); + pendingPackages.addToList(user, cn.getPackageName()); allowMissingTarget = true; // Add the icon on the workspace anyway. @@ -2298,10 +2294,13 @@ public class LauncherModel extends BroadcastReceiver LauncherSettings.Favorites._ID, restoredRows), null); } - if (!isSdCardReady && !sPendingPackages.isEmpty()) { - context.registerReceiver(new AppsAvailabilityCheck(), + if (!isSdCardReady && !pendingPackages.isEmpty()) { + context.registerReceiver( + new SdCardAvailableReceiver( + LauncherModel.this, mContext, pendingPackages), new IntentFilter(Intent.ACTION_BOOT_COMPLETED), - null, sWorker); + null, + sWorker); } // Remove any empty screens @@ -2971,43 +2970,6 @@ public class LauncherModel extends BroadcastReceiver sWorker.post(task); } - @Thunk class AppsAvailabilityCheck extends BroadcastReceiver { - - @Override - public void onReceive(Context context, Intent intent) { - synchronized (sBgLock) { - final LauncherAppsCompat launcherApps = LauncherAppsCompat - .getInstance(mApp.getContext()); - final PackageManager manager = context.getPackageManager(); - final ArrayList<String> packagesRemoved = new ArrayList<String>(); - final ArrayList<String> packagesUnavailable = new ArrayList<String>(); - for (Entry<UserHandleCompat, HashSet<String>> entry : sPendingPackages.entrySet()) { - UserHandleCompat user = entry.getKey(); - packagesRemoved.clear(); - packagesUnavailable.clear(); - for (String pkg : entry.getValue()) { - if (!launcherApps.isPackageEnabledForProfile(pkg, user)) { - if (PackageManagerHelper.isAppOnSdcard(manager, pkg)) { - packagesUnavailable.add(pkg); - } else { - packagesRemoved.add(pkg); - } - } - } - if (!packagesRemoved.isEmpty()) { - enqueueItemUpdatedTask(new PackageUpdatedTask(PackageUpdatedTask.OP_REMOVE, - packagesRemoved.toArray(new String[packagesRemoved.size()]), user)); - } - if (!packagesUnavailable.isEmpty()) { - enqueueItemUpdatedTask(new PackageUpdatedTask(PackageUpdatedTask.OP_UNAVAILABLE, - packagesUnavailable.toArray(new String[packagesUnavailable.size()]), user)); - } - } - sPendingPackages.clear(); - } - } - } - private class PackageUpdatedTask implements Runnable { int mOp; String[] mPackages; diff --git a/src/com/android/launcher3/model/SdCardAvailableReceiver.java b/src/com/android/launcher3/model/SdCardAvailableReceiver.java new file mode 100644 index 000000000..54260c915 --- /dev/null +++ b/src/com/android/launcher3/model/SdCardAvailableReceiver.java @@ -0,0 +1,88 @@ +/* + * 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.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; + +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.LauncherModel; +import com.android.launcher3.compat.LauncherAppsCompat; +import com.android.launcher3.compat.UserHandleCompat; +import com.android.launcher3.util.MultiHashMap; +import com.android.launcher3.util.PackageManagerHelper; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Map.Entry; + +/** + * Helper class to re-query app status when SD-card becomes available. + * + * During first load, just after reboot, some apps on sdcard might not be available immediately due + * to some race conditions in the system. We wait for ACTION_BOOT_COMPLETED and process such + * apps again. + */ +public class SdCardAvailableReceiver extends BroadcastReceiver { + + private final LauncherModel mModel; + private final Context mContext; + private final MultiHashMap<UserHandleCompat, String> mPackages; + + public SdCardAvailableReceiver(LauncherModel model, Context context, + MultiHashMap<UserHandleCompat, String> packages) { + mModel = model; + mContext = context; + mPackages = packages; + } + + @Override + public void onReceive(Context context, Intent intent) { + final LauncherAppsCompat launcherApps = LauncherAppsCompat.getInstance(context); + final PackageManager manager = context.getPackageManager(); + for (Entry<UserHandleCompat, ArrayList<String>> entry : mPackages.entrySet()) { + UserHandleCompat user = entry.getKey(); + + final ArrayList<String> packagesRemoved = new ArrayList<>(); + final ArrayList<String> packagesUnavailable = new ArrayList<>(); + + for (String pkg : new HashSet<>(entry.getValue())) { + if (!launcherApps.isPackageEnabledForProfile(pkg, user)) { + if (PackageManagerHelper.isAppOnSdcard(manager, pkg)) { + packagesUnavailable.add(pkg); + } else { + packagesRemoved.add(pkg); + } + } + } + if (!packagesRemoved.isEmpty()) { + mModel.onPackagesRemoved(user, + packagesRemoved.toArray(new String[packagesRemoved.size()])); + } + if (!packagesUnavailable.isEmpty()) { + mModel.onPackagesUnavailable( + packagesUnavailable.toArray(new String[packagesUnavailable.size()]), + user, false); + } + } + + // Unregister the broadcast receiver, just in case + mContext.unregisterReceiver(this); + } +} |