Merge "Add a better app filtering mechanism and filter widgets" into jb-ub-now-indigo-rose

This commit is contained in:
Bjorn Bringert 2013-10-03 23:22:56 +00:00 committed by Android (Google) Code Review
commit ed60ba1e24
7 changed files with 64 additions and 16 deletions

View File

@ -81,4 +81,9 @@
<!-- Memory debugging, including a memory dump icon -->
<bool name="debug_memory_enabled">false</bool>
<!-- Name of a subclass of com.android.launcher3.AppFilter used to
filter the activities shown in the launcher. Can be empty. -->
<string name="app_filter_class" translatable="false"></string>
</resources>

View File

@ -46,11 +46,14 @@ class AllAppsList {
private IconCache mIconCache;
private AppFilter mAppFilter;
/**
* Boring constructor.
*/
public AllAppsList(IconCache iconCache) {
public AllAppsList(IconCache iconCache, AppFilter appFilter) {
mIconCache = iconCache;
mAppFilter = appFilter;
}
/**
@ -60,13 +63,16 @@ class AllAppsList {
* If the app is already in the list, doesn't add it.
*/
public void add(AppInfo info) {
if (mAppFilter != null && !mAppFilter.shouldShowApp(info.componentName)) {
return;
}
if (findActivity(data, info.componentName)) {
return;
}
data.add(info);
added.add(info);
}
public void clear() {
data.clear();
// TODO: do we clear these too?

View File

@ -0,0 +1,35 @@
package com.android.launcher3;
import android.content.ComponentName;
import android.text.TextUtils;
import android.util.Log;
public abstract class AppFilter {
private static final boolean DBG = false;
private static final String TAG = "AppFilter";
public abstract boolean shouldShowApp(ComponentName app);
public static AppFilter loadByName(String className) {
if (TextUtils.isEmpty(className)) return null;
if (DBG) Log.d(TAG, "Loading AppFilter: " + className);
try {
Class<?> cls = Class.forName(className);
return (AppFilter) cls.newInstance();
} catch (ClassNotFoundException e) {
Log.e(TAG, "Bad AppFilter class", e);
return null;
} catch (InstantiationException e) {
Log.e(TAG, "Bad AppFilter class", e);
return null;
} catch (IllegalAccessException e) {
Log.e(TAG, "Bad AppFilter class", e);
return null;
} catch (ClassCastException e) {
Log.e(TAG, "Bad AppFilter class", e);
return null;
}
}
}

View File

@ -438,6 +438,9 @@ public class AppsCustomizePagedView extends PagedViewWithDraggableItems implemen
for (Object o : widgetsAndShortcuts) {
if (o instanceof AppWidgetProviderInfo) {
AppWidgetProviderInfo widget = (AppWidgetProviderInfo) o;
if (!app.shouldShowAppOrWidgetProvider(widget.provider)) {
continue;
}
widget.label = widget.label.trim();
if (widget.minWidth > 0 && widget.minHeight > 0) {
// Ensure that all widgets we show can be added on a workspace of this size

View File

@ -3937,11 +3937,6 @@ public class Launcher extends Activity
}
}
@Override
public boolean shouldShowApp(ResolveInfo app) {
return true;
}
/**
* A package was updated.
*

View File

@ -34,6 +34,7 @@ public class LauncherAppState {
private LauncherModel mModel;
private IconCache mIconCache;
private AppFilter mAppFilter;
private WidgetPreviewLoader.CacheDb mWidgetPreviewCacheDb;
private boolean mIsScreenLarge;
private float mScreenDensity;
@ -81,7 +82,9 @@ public class LauncherAppState {
mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(sContext);
mIconCache = new IconCache(sContext);
mModel = new LauncherModel(this, mIconCache);
mAppFilter = AppFilter.loadByName(sContext.getString(R.string.app_filter_class));
mModel = new LauncherModel(this, mIconCache, mAppFilter);
// Register intent receivers
IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
@ -147,6 +150,10 @@ public class LauncherAppState {
return mModel;
}
boolean shouldShowAppOrWidgetProvider(ComponentName componentName) {
return mAppFilter == null || mAppFilter.shouldShowApp(componentName);
}
WidgetPreviewLoader.CacheDb getWidgetPreviewCacheDb() {
return mWidgetPreviewCacheDb;
}

View File

@ -158,7 +158,6 @@ public class LauncherModel extends BroadcastReceiver {
public void bindFolders(HashMap<Long,FolderInfo> folders);
public void finishBindingItems(boolean upgradePath);
public void bindAppWidget(LauncherAppWidgetInfo info);
public boolean shouldShowApp(ResolveInfo app);
public void bindAllApplications(ArrayList<AppInfo> apps);
public void bindAppsAdded(ArrayList<Long> newScreens,
ArrayList<ItemInfo> addNotAnimated,
@ -179,12 +178,12 @@ public class LauncherModel extends BroadcastReceiver {
public boolean filterItem(ItemInfo parent, ItemInfo info, ComponentName cn);
}
LauncherModel(LauncherAppState app, IconCache iconCache) {
LauncherModel(LauncherAppState app, IconCache iconCache, AppFilter appFilter) {
final Context context = app.getContext();
mAppsCanBeOnRemoveableStorage = Environment.isExternalStorageRemovable();
mApp = app;
mBgAllAppsList = new AllAppsList(iconCache);
mBgAllAppsList = new AllAppsList(iconCache, appFilter);
mIconCache = iconCache;
mDefaultIcon = Utilities.createIconBitmap(
@ -2397,11 +2396,9 @@ public class LauncherModel extends BroadcastReceiver {
// Create the ApplicationInfos
for (int i = 0; i < apps.size(); i++) {
ResolveInfo app = apps.get(i);
if (oldCallbacks.shouldShowApp(app)) {
// This builds the icon bitmaps.
mBgAllAppsList.add(new AppInfo(packageManager, app,
mIconCache, mLabelCache));
}
// This builds the icon bitmaps.
mBgAllAppsList.add(new AppInfo(packageManager, app,
mIconCache, mLabelCache));
}
// Huh? Shouldn't this be inside the Runnable below?