diff options
author | Hyunyoung Song <hyunyoungs@google.com> | 2015-05-21 13:04:53 -0700 |
---|---|---|
committer | Hyunyoung Song <hyunyoungs@google.com> | 2015-05-21 13:04:53 -0700 |
commit | 2bd3d7d1cb5e4d8d826982d11b456739fed6b817 (patch) | |
tree | 4e0ecf47c9b3ced1116d896b3b9e8487792201fb /src/com/android/launcher3/widget | |
parent | 3e4d5f20ba9128fcbe77b220380129be773887b3 (diff) | |
download | android_packages_apps_Trebuchet-2bd3d7d1cb5e4d8d826982d11b456739fed6b817.tar.gz android_packages_apps_Trebuchet-2bd3d7d1cb5e4d8d826982d11b456739fed6b817.tar.bz2 android_packages_apps_Trebuchet-2bd3d7d1cb5e4d8d826982d11b456739fed6b817.zip |
Load PackageItemInfo in background thread to prevent ANR
- Decoupled widget model from widget view, and placed the
creation to LauncherModel.
- As a result packagemanager operation, iconcache retrieval is all done inside
LauncherModel on background thread
b/21311085
b/21325319
Change-Id: I294698527db58b89f3da558090a367530c058776
Diffstat (limited to 'src/com/android/launcher3/widget')
4 files changed, 6 insertions, 198 deletions
diff --git a/src/com/android/launcher3/widget/PackageItemInfo.java b/src/com/android/launcher3/widget/PackageItemInfo.java deleted file mode 100644 index 8f45a7754..000000000 --- a/src/com/android/launcher3/widget/PackageItemInfo.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2015 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.widget; - -import android.content.ComponentName; -import android.graphics.Bitmap; - -import com.android.launcher3.ItemInfo; - -import java.util.Arrays; - -/** - * Represents a {@link Package} in the widget tray section. - */ -public class PackageItemInfo extends ItemInfo { - private static final String TAG = "PackageInfo"; - - /** - * A bitmap version of the application icon. - */ - public Bitmap iconBitmap; - - /** - * Indicates whether we're using a low res icon - */ - public boolean usingLowResIcon; - - public String packageName; - - int flags = 0; - - PackageItemInfo(String packageName) { - this.packageName = packageName; - } - - @Override - public String toString() { - return "PackageItemInfo(title=" + title + " id=" + this.id - + " type=" + this.itemType + " container=" + this.container - + " screen=" + screenId + " cellX=" + cellX + " cellY=" + cellY - + " spanX=" + spanX + " spanY=" + spanY + " dropPos=" + Arrays.toString(dropPos) - + " user=" + user + ")"; - } -} diff --git a/src/com/android/launcher3/widget/WidgetsContainerView.java b/src/com/android/launcher3/widget/WidgetsContainerView.java index 7a7895ff8..5a879faa0 100644 --- a/src/com/android/launcher3/widget/WidgetsContainerView.java +++ b/src/com/android/launcher3/widget/WidgetsContainerView.java @@ -17,7 +17,6 @@ package com.android.launcher3.widget; import android.content.Context; -import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.Rect; import android.graphics.drawable.Drawable; @@ -36,6 +35,7 @@ import com.android.launcher3.DeviceProfile; import com.android.launcher3.DragController; import com.android.launcher3.DragSource; import com.android.launcher3.DropTarget.DragObject; +import com.android.launcher3.model.WidgetsModel; import com.android.launcher3.Folder; import com.android.launcher3.IconCache; import com.android.launcher3.ItemInfo; @@ -47,8 +47,6 @@ import com.android.launcher3.Utilities; import com.android.launcher3.WidgetPreviewLoader; import com.android.launcher3.Workspace; -import java.util.ArrayList; - /** * The widgets list view container. */ @@ -68,9 +66,6 @@ public class WidgetsContainerView extends BaseContainerView private DragController mDragController; private IconCache mIconCache; - /* Data model for the widget */ - private WidgetsModel mWidgets; - /* Recycler view related member variables */ private RecyclerView mView; private WidgetsListAdapter mAdapter; @@ -98,8 +93,6 @@ public class WidgetsContainerView extends BaseContainerView mDragController = mLauncher.getDragController(); mWidgetHostViewLoader = new WidgetHostViewLoader(mLauncher); mAdapter = new WidgetsListAdapter(context, this, this, mLauncher); - mWidgets = new WidgetsModel(context, mAdapter); - mAdapter.setWidgetsModel(mWidgets); mIconCache = (LauncherAppState.getInstance()).getIconCache(); if (DEBUG) { @@ -109,10 +102,6 @@ public class WidgetsContainerView extends BaseContainerView @Override protected void onFinishInflate() { - if (DEBUG) { - Log.d(TAG, String.format("onFinishInflate [widgets size=%d]", - mWidgets.getPackageSize())); - } mView = (RecyclerView) findViewById(R.id.widgets_list_view); mView.setAdapter(mAdapter); @@ -145,10 +134,6 @@ public class WidgetsContainerView extends BaseContainerView public void scrollToTop() { mView.scrollToPosition(0); - if (DEBUG) { - Log.d(TAG, String.format("scrollToTop, [widgets size=%d]", - mWidgets.getPackageSize())); - } } // @@ -374,8 +359,9 @@ public class WidgetsContainerView extends BaseContainerView /** * Initialize the widget data model. */ - public void addWidgets(ArrayList<Object> widgetsShortcuts, PackageManager pm) { - mWidgets.addWidgetsAndShortcuts(widgetsShortcuts, pm); + public void addWidgets(WidgetsModel model) { + mAdapter.setWidgetsModel(model); + mAdapter.notifyDataSetChanged(); } private WidgetPreviewLoader getWidgetPreviewLoader() { diff --git a/src/com/android/launcher3/widget/WidgetsListAdapter.java b/src/com/android/launcher3/widget/WidgetsListAdapter.java index 3916c00d2..918ec1bda 100644 --- a/src/com/android/launcher3/widget/WidgetsListAdapter.java +++ b/src/com/android/launcher3/widget/WidgetsListAdapter.java @@ -38,6 +38,8 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherAppWidgetProviderInfo; import com.android.launcher3.R; import com.android.launcher3.WidgetPreviewLoader; +import com.android.launcher3.model.PackageItemInfo; +import com.android.launcher3.model.WidgetsModel; import java.util.List; diff --git a/src/com/android/launcher3/widget/WidgetsModel.java b/src/com/android/launcher3/widget/WidgetsModel.java deleted file mode 100644 index 5a920e8d4..000000000 --- a/src/com/android/launcher3/widget/WidgetsModel.java +++ /dev/null @@ -1,122 +0,0 @@ - -package com.android.launcher3.widget; - -import android.content.Context; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; -import android.support.v7.widget.RecyclerView; -import android.util.Log; - -import com.android.launcher3.IconCache; -import com.android.launcher3.LauncherAppState; -import com.android.launcher3.LauncherAppWidgetProviderInfo; -import com.android.launcher3.compat.UserHandleCompat; -import com.android.launcher3.model.AppNameComparator; -import com.android.launcher3.model.WidgetsAndShortcutNameComparator; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Widgets data model that is used by the adapters of the widget views and controllers. - * - * <p> The widgets and shortcuts are organized using package name as its index. - */ -public class WidgetsModel { - - private static final String TAG = "WidgetsModel"; - private static final boolean DEBUG = false; - - /* List of packages that is tracked by this model. */ - private List<PackageItemInfo> mPackageItemInfos = new ArrayList<>(); - - /* Map of widgets and shortcuts that are tracked per package. */ - private Map<PackageItemInfo, ArrayList<Object>> mWidgetsList = new HashMap<>(); - - /* Notifies the adapter when data changes. */ - private RecyclerView.Adapter mAdapter; - - private Comparator mWidgetAndShortcutNameComparator; - private Comparator mAppNameComparator; - - private IconCache mIconCache; - - public WidgetsModel(Context context, RecyclerView.Adapter adapter) { - mAdapter = adapter; - mWidgetAndShortcutNameComparator = new WidgetsAndShortcutNameComparator(context); - mAppNameComparator = (new AppNameComparator(context)).getAppInfoComparator(); - mIconCache = LauncherAppState.getInstance().getIconCache(); - } - - // Access methods that may be deleted if the private fields are made package-private. - public int getPackageSize() { - return mPackageItemInfos.size(); - } - - // Access methods that may be deleted if the private fields are made package-private. - public PackageItemInfo getPackageItemInfo(int pos) { - return mPackageItemInfos.get(pos); - } - - public List<Object> getSortedWidgets(int pos) { - return mWidgetsList.get(mPackageItemInfos.get(pos)); - } - - public void addWidgetsAndShortcuts(ArrayList<Object> widgetsShortcuts, PackageManager pm) { - if (DEBUG) { - Log.d(TAG, "addWidgetsAndShortcuts, widgetsShortcuts#=" + widgetsShortcuts.size()); - } - - // Temporary list for {@link PackageItemInfos} to avoid having to go through - // {@link mPackageItemInfos} to locate the key to be used for {@link #mWidgetsList} - HashMap<String, PackageItemInfo> tmpPackageItemInfos = new HashMap<>(); - - // clear the lists. - mWidgetsList.clear(); - mPackageItemInfos.clear(); - - // add and update. - for (Object o: widgetsShortcuts) { - String packageName = ""; - if (o instanceof LauncherAppWidgetProviderInfo) { - LauncherAppWidgetProviderInfo widgetInfo = (LauncherAppWidgetProviderInfo) o; - packageName = widgetInfo.provider.getPackageName(); - } else if (o instanceof ResolveInfo) { - ResolveInfo resolveInfo = (ResolveInfo) o; - packageName = resolveInfo.activityInfo.packageName; - } else { - Log.e(TAG, String.format("addWidgetsAndShortcuts, nothing added for class=%s", - o.getClass().toString())); - } - - PackageItemInfo pInfo = tmpPackageItemInfos.get(packageName); - ArrayList<Object> widgetsShortcutsList = mWidgetsList.get(pInfo); - if (widgetsShortcutsList != null) { - widgetsShortcutsList.add(o); - } else { - widgetsShortcutsList = new ArrayList<Object>(); - widgetsShortcutsList.add(o); - - pInfo = new PackageItemInfo(packageName); - mIconCache.getTitleAndIconForApp(packageName, UserHandleCompat.myUserHandle(), - true /* useLowResIcon */, pInfo); - mWidgetsList.put(pInfo, widgetsShortcutsList); - tmpPackageItemInfos.put(packageName, pInfo); - mPackageItemInfos.add(pInfo); - } - } - - // sort. - Collections.sort(mPackageItemInfos, mAppNameComparator); - for (PackageItemInfo p: mPackageItemInfos) { - Collections.sort(mWidgetsList.get(p), mWidgetAndShortcutNameComparator); - } - - // notify. - mAdapter.notifyDataSetChanged(); - } -}
\ No newline at end of file |