summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/widget
diff options
context:
space:
mode:
authorHyunyoung Song <hyunyoungs@google.com>2015-05-21 13:04:53 -0700
committerHyunyoung Song <hyunyoungs@google.com>2015-05-21 13:04:53 -0700
commit2bd3d7d1cb5e4d8d826982d11b456739fed6b817 (patch)
tree4e0ecf47c9b3ced1116d896b3b9e8487792201fb /src/com/android/launcher3/widget
parent3e4d5f20ba9128fcbe77b220380129be773887b3 (diff)
downloadandroid_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')
-rw-r--r--src/com/android/launcher3/widget/PackageItemInfo.java58
-rw-r--r--src/com/android/launcher3/widget/WidgetsContainerView.java22
-rw-r--r--src/com/android/launcher3/widget/WidgetsListAdapter.java2
-rw-r--r--src/com/android/launcher3/widget/WidgetsModel.java122
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