diff options
author | Bjorn Bringert <bringert@android.com> | 2010-03-16 21:51:38 +0000 |
---|---|---|
committer | Bjorn Bringert <bringert@android.com> | 2010-03-16 22:41:49 +0000 |
commit | 3352f23cbaf4224672f3fb530ed5f5fcb03dbe04 (patch) | |
tree | 8d3337813f108b89fa1b329a8414136600a0e960 | |
parent | 72b3dbb33c455151d3fa6a8e2bb73d262e5b0c15 (diff) | |
download | ApplicationsProvider-3352f23cbaf4224672f3fb530ed5f5fcb03dbe04.tar.gz |
Handle SD card app changes in ApplicationsProvider
Bug: http://b/issue?id=2518879
Change-Id: Ic132fceee60943268c9d5ec3c7cb98827a5d3a18
-rw-r--r-- | src/com/android/providers/applications/ApplicationsProvider.java | 113 |
1 files changed, 35 insertions, 78 deletions
diff --git a/src/com/android/providers/applications/ApplicationsProvider.java b/src/com/android/providers/applications/ApplicationsProvider.java index a00de2e..6d32d7f 100644 --- a/src/com/android/providers/applications/ApplicationsProvider.java +++ b/src/com/android/providers/applications/ApplicationsProvider.java @@ -16,6 +16,8 @@ package com.android.providers.applications; +import com.android.internal.content.PackageMonitor; + import android.app.SearchManager; import android.content.BroadcastReceiver; import android.content.ComponentName; @@ -69,8 +71,7 @@ public class ApplicationsProvider extends ContentProvider { private static final int THREAD_PRIORITY = android.os.Process.THREAD_PRIORITY_BACKGROUND; // Messages for mHandler - private static final int MSG_UPDATE = 0; - private static final int MSG_REMOVE = 1; + private static final int MSG_UPDATE_ALL = 0; // TODO: Move these to android.provider.Applications? public static final String _ID = "_id"; @@ -109,57 +110,44 @@ public class ApplicationsProvider extends ContentProvider { return matcher; } - // Broadcast receiver for updating applications list. - private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + /** + * Updates applications list when packages are added/removed. + * + * TODO: Maybe this should listen for changes to individual apps instead. + */ + private class MyPackageMonitor extends PackageMonitor { + @Override + public void onSomePackagesChanged() { + postUpdateAll(); + } + } + + // Broadcast receiver for updating applications list when the locale changes. + private BroadcastReceiver mLocaleChangeReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); - if (Intent.ACTION_PACKAGE_ADDED.equals(action) - || Intent.ACTION_PACKAGE_CHANGED.equals(action)) { - if (DBG) Log.d(TAG, "package added/updated: " + intent); - String packageName = getPackageName(intent); - postAppsUpdate(packageName); - } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) { - if (DBG) Log.d(TAG, "package removed: " + intent); - String packageName = getPackageName(intent); - postAppsRemove(packageName); - } else if (Intent.ACTION_LOCALE_CHANGED.equals(action)) { + if (Intent.ACTION_LOCALE_CHANGED.equals(action)) { if (DBG) Log.d(TAG, "locale changed"); - postAppsUpdate(null); + postUpdateAll(); } } }; - /** - * Gets the package name from an {@link Intent#ACTION_PACKAGE_ADDED}, - * {@link Intent#ACTION_PACKAGE_CHANGED}, or {@link Intent#ACTION_PACKAGE_REMOVED} - * intent. - * - * @param intent - * @return The package name, or {@code null} if none. - */ - private String getPackageName(Intent intent) { - Uri data = intent.getData(); - if (data == null) { - Log.e(TAG, "Got intent " + intent + " with no data."); - return null; - } - String packageName = data.getSchemeSpecificPart(); - if (packageName == null) { - Log.e(TAG, "No package name in " + intent); - return null; - } - return packageName; - } - @Override public boolean onCreate() { createDatabase(); - registerBroadcastReceiver(); + // Listen for package changes + new MyPackageMonitor().register(getContext(), true); + // Listen for locale changes + IntentFilter localeFilter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED); + getContext().registerReceiver(mLocaleChangeReceiver, localeFilter); + // Start thread that runs app updates HandlerThread thread = new HandlerThread("ApplicationsProviderUpdater", THREAD_PRIORITY); thread.start(); mHandler = new UpdateHandler(thread.getLooper()); - postAppsUpdate(null); + // Kick off first apps update + postUpdateAll(); return true; } @@ -172,16 +160,9 @@ public class ApplicationsProvider extends ContentProvider { @Override public void handleMessage(Message msg) { switch (msg.what) { - case MSG_UPDATE: { - String packageName = (String) msg.obj; - updateApplicationsList(packageName); - break; - } - case MSG_REMOVE: { - String packageName = (String) msg.obj; - removeApplications(packageName); + case MSG_UPDATE_ALL: + updateApplicationsList(null); break; - } default: Log.e(TAG, "Unknown message: " + msg.what); break; @@ -191,21 +172,13 @@ public class ApplicationsProvider extends ContentProvider { /** * Posts an update to run on the DB update thread. - * - * @param packageName Name of package whose activities to update. - * If {@code null}, all packages are updated. */ - private void postAppsUpdate(String packageName) { + private void postUpdateAll() { + // Clear pending updates + mHandler.removeMessages(MSG_UPDATE_ALL); + // Post a new update Message msg = Message.obtain(); - msg.what = MSG_UPDATE; - msg.obj = packageName; - mHandler.sendMessageDelayed(msg, UPDATE_DELAY_MILLIS); - } - - private void postAppsRemove(String packageName) { - Message msg = Message.obtain(); - msg.what = MSG_REMOVE; - msg.obj = packageName; + msg.what = MSG_UPDATE_ALL; mHandler.sendMessageDelayed(msg, UPDATE_DELAY_MILLIS); } @@ -258,23 +231,7 @@ public class ApplicationsProvider extends ContentProvider { "DELETE FROM applicationsLookup WHERE source = old." + _ID + ";" + "END"); } - - /** - * Registers a receiver which will be notified when packages are added, removed, - * or changed. - */ - private void registerBroadcastReceiver() { - IntentFilter packageFilter = new IntentFilter(); - packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED); - packageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED); - packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED); - packageFilter.addDataScheme("package"); - getContext().registerReceiver(mBroadcastReceiver, packageFilter); - IntentFilter localeFilter = new IntentFilter(); - localeFilter.addAction(Intent.ACTION_LOCALE_CHANGED); - getContext().registerReceiver(mBroadcastReceiver, localeFilter); - } - + /** * This will always return {@link SearchManager#SUGGEST_MIME_TYPE} as this * provider is purely to provide suggestions. |