diff options
author | Michael Jurka <mikejurka@google.com> | 2013-03-19 12:01:06 +0100 |
---|---|---|
committer | Steve Kondik <shade@chemlab.org> | 2013-08-17 02:35:26 -0700 |
commit | f68f03a254e193daaf970d5d5738f9d3643fabe9 (patch) | |
tree | 0e4dd5fefc93c0a21898d2e8c7b93980a176b0d7 /src/com/cyanogenmod | |
parent | 4b1ee66e4222e8d16f54888ede74affdbbc9af28 (diff) | |
download | android_packages_apps_Trebuchet-f68f03a254e193daaf970d5d5738f9d3643fabe9.tar.gz android_packages_apps_Trebuchet-f68f03a254e193daaf970d5d5738f9d3643fabe9.tar.bz2 android_packages_apps_Trebuchet-f68f03a254e193daaf970d5d5738f9d3643fabe9.zip |
Fix SQLite crashes in Launcher
We were using multiple SQLiteOpenHelpers, which
causes problems; this change switches us to using
only one
Bug: 8346109
Change-Id: If7d4dff3d34edb38d9586d3b0f4e8e1747a71a75
Diffstat (limited to 'src/com/cyanogenmod')
4 files changed, 48 insertions, 33 deletions
diff --git a/src/com/cyanogenmod/trebuchet/LauncherApplication.java b/src/com/cyanogenmod/trebuchet/LauncherApplication.java index 7fa88177b..56fc842ba 100644 --- a/src/com/cyanogenmod/trebuchet/LauncherApplication.java +++ b/src/com/cyanogenmod/trebuchet/LauncherApplication.java @@ -31,8 +31,9 @@ import com.cyanogenmod.trebuchet.R; import java.lang.ref.WeakReference; public class LauncherApplication extends Application { - public LauncherModel mModel; - public IconCache mIconCache; + private LauncherModel mModel; + private IconCache mIconCache; + private WidgetPreviewLoader.CacheDb mWidgetPreviewCacheDb; private static boolean sIsScreenLarge; private static float sScreenDensity; private static int sLongPressTimeout = 300; @@ -47,6 +48,7 @@ public class LauncherApplication extends Application { sIsScreenLarge = getResources().getBoolean(R.bool.is_large_screen); sScreenDensity = getResources().getDisplayMetrics().density; + mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(this); mIconCache = new IconCache(this); mModel = new LauncherModel(this, mIconCache); @@ -114,7 +116,11 @@ public class LauncherApplication extends Application { return mModel; } - void setLauncherProvider(LauncherProvider provider) { + WidgetPreviewLoader.CacheDb getWidgetPreviewCacheDb() { + return mWidgetPreviewCacheDb; + } + + void setLauncherProvider(LauncherProvider provider) { mLauncherProvider = new WeakReference<LauncherProvider>(provider); } diff --git a/src/com/cyanogenmod/trebuchet/LauncherModel.java b/src/com/cyanogenmod/trebuchet/LauncherModel.java index 91f0e794e..ba8eb6a63 100644 --- a/src/com/cyanogenmod/trebuchet/LauncherModel.java +++ b/src/com/cyanogenmod/trebuchet/LauncherModel.java @@ -2120,26 +2120,33 @@ public class LauncherModel extends BroadcastReceiver { final Context context = mApp; final String[] packages = mPackages; + final int N = packages.length; switch (mOp) { case OP_ADD: - for (String p : packages) { - if (DEBUG_LOADERS) Log.d(TAG, "mAllAppsList.addPackage " + p); - mBgAllAppsList.addPackage(context, p); + for (int i=0; i<N; i++) { + if (DEBUG_LOADERS) Log.d(TAG, "mAllAppsList.addPackage " + packages[i]); + mBgAllAppsList.addPackage(context, packages[i]); } break; case OP_UPDATE: - for (String p : packages) { - if (DEBUG_LOADERS) Log.d(TAG, "mAllAppsList.updatePackage " + p); - mBgAllAppsList.updatePackage(context, p); - WidgetPreviewLoader.removeFromDb(context, p); + for (int i=0; i<N; i++) { + if (DEBUG_LOADERS) Log.d(TAG, "mAllAppsList.updatePackage " + packages[i]); + mBgAllAppsList.updatePackage(context, packages[i]); + LauncherApplication app = + (LauncherApplication) context.getApplicationContext(); + WidgetPreviewLoader.removeFromDb( + app.getWidgetPreviewCacheDb(), packages[i]); } break; case OP_REMOVE: case OP_UNAVAILABLE: - for (String p : packages) { - if (DEBUG_LOADERS) Log.d(TAG, "mAllAppsList.removePackage " + p); - mBgAllAppsList.removePackage(p); - WidgetPreviewLoader.removeFromDb(context, p); + for (int i=0; i<N; i++) { + if (DEBUG_LOADERS) Log.d(TAG, "mAllAppsList.removePackage " + packages[i]); + mBgAllAppsList.removePackage(packages[i]); + LauncherApplication app = + (LauncherApplication) context.getApplicationContext(); + WidgetPreviewLoader.removeFromDb( + app.getWidgetPreviewCacheDb(), packages[i]); } break; } diff --git a/src/com/cyanogenmod/trebuchet/PackageChangedReceiver.java b/src/com/cyanogenmod/trebuchet/PackageChangedReceiver.java index 25b423965..baa2e65df 100644 --- a/src/com/cyanogenmod/trebuchet/PackageChangedReceiver.java +++ b/src/com/cyanogenmod/trebuchet/PackageChangedReceiver.java @@ -13,6 +13,7 @@ public class PackageChangedReceiver extends BroadcastReceiver { // they sent us a bad intent return; } - WidgetPreviewLoader.removeFromDb(context, packageName); + LauncherApplication app = (LauncherApplication) context.getApplicationContext(); + WidgetPreviewLoader.removeFromDb(app.getWidgetPreviewCacheDb(), packageName); } } diff --git a/src/com/cyanogenmod/trebuchet/WidgetPreviewLoader.java b/src/com/cyanogenmod/trebuchet/WidgetPreviewLoader.java index 5e26fe62f..becb9ca56 100644 --- a/src/com/cyanogenmod/trebuchet/WidgetPreviewLoader.java +++ b/src/com/cyanogenmod/trebuchet/WidgetPreviewLoader.java @@ -129,7 +129,7 @@ public class WidgetPreviewLoader { private final float sWidgetPreviewIconPaddingPercentage = 0.25f; - private WidgetPreviewCacheDb mDb; + private CacheDb mDb; private HashMap<String, WeakReference<Bitmap>> mLoadedPreviews; private ArrayList<SoftReference<Bitmap>> mUnusedBitmaps; @@ -143,8 +143,9 @@ public class WidgetPreviewLoader { mContext = mLauncher = launcher; mPackageManager = mContext.getPackageManager(); mAppIconSize = mContext.getResources().getDimensionPixelSize(R.dimen.app_icon_size); - mIconCache = ((LauncherApplication) launcher.getApplicationContext()).getIconCache(); - mDb = new WidgetPreviewCacheDb(mContext); + LauncherApplication app = (LauncherApplication) launcher.getApplicationContext(); + mIconCache = app.getIconCache(); + mDb = app.getWidgetPreviewCacheDb(); mLoadedPreviews = new HashMap<String, WeakReference<Bitmap>>(); mUnusedBitmaps = new ArrayList<SoftReference<Bitmap>>(); } @@ -253,7 +254,7 @@ public class WidgetPreviewLoader { } } - static class WidgetPreviewCacheDb extends SQLiteOpenHelper { + static class CacheDb extends SQLiteOpenHelper { final static int DB_VERSION = 2; final static String DB_NAME = "widgetpreviews.db"; final static String TABLE_NAME = "shortcut_and_widget_previews"; @@ -262,7 +263,7 @@ public class WidgetPreviewLoader { final static String COLUMN_PREVIEW_BITMAP = "preview_bitmap"; Context mContext; - public WidgetPreviewCacheDb(Context context) { + public CacheDb(Context context) { super(context, new File(context.getCacheDir(), DB_NAME).getPath(), null, DB_VERSION); // Store the context for later use mContext = context; @@ -325,24 +326,24 @@ public class WidgetPreviewLoader { SQLiteDatabase db = mDb.getWritableDatabase(); ContentValues values = new ContentValues(); - values.put(WidgetPreviewCacheDb.COLUMN_NAME, name); + values.put(CacheDb.COLUMN_NAME, name); ByteArrayOutputStream stream = new ByteArrayOutputStream(); preview.compress(Bitmap.CompressFormat.PNG, 100, stream); - values.put(WidgetPreviewCacheDb.COLUMN_PREVIEW_BITMAP, stream.toByteArray()); - values.put(WidgetPreviewCacheDb.COLUMN_SIZE, mSize); - db.insert(WidgetPreviewCacheDb.TABLE_NAME, null, values); + values.put(CacheDb.COLUMN_PREVIEW_BITMAP, stream.toByteArray()); + values.put(CacheDb.COLUMN_SIZE, mSize); + db.insert(CacheDb.TABLE_NAME, null, values); } - public static void removeFromDb(final Context mContext, final String packageName) { + public static void removeFromDb(final CacheDb cacheDb, final String packageName) { synchronized(sInvalidPackages) { sInvalidPackages.add(packageName); } new AsyncTask<Void, Void, Void>() { public Void doInBackground(Void ... args) { - SQLiteDatabase db = new WidgetPreviewCacheDb(mContext).getWritableDatabase(); - db.delete(WidgetPreviewCacheDb.TABLE_NAME, - WidgetPreviewCacheDb.COLUMN_NAME + " LIKE ? OR " + - WidgetPreviewCacheDb.COLUMN_NAME + " LIKE ?", // SELECT query + SQLiteDatabase db = cacheDb.getWritableDatabase(); + db.delete(CacheDb.TABLE_NAME, + CacheDb.COLUMN_NAME + " LIKE ? OR " + + CacheDb.COLUMN_NAME + " LIKE ?", // SELECT query new String[] { WIDGET_PREFIX + packageName + "/%", SHORTCUT_PREFIX + packageName + "/%"} // args to SELECT query @@ -364,12 +365,12 @@ public class WidgetPreviewLoader { private Bitmap readFromDb(String name, Bitmap b) { if (mCachedSelectQuery == null) { - mCachedSelectQuery = WidgetPreviewCacheDb.COLUMN_NAME + " = ? AND " + - WidgetPreviewCacheDb.COLUMN_SIZE + " = ?"; + mCachedSelectQuery = CacheDb.COLUMN_NAME + " = ? AND " + + CacheDb.COLUMN_SIZE + " = ?"; } SQLiteDatabase db = mDb.getReadableDatabase(); - Cursor result = db.query(WidgetPreviewCacheDb.TABLE_NAME, - new String[] { WidgetPreviewCacheDb.COLUMN_PREVIEW_BITMAP }, // cols to return + Cursor result = db.query(CacheDb.TABLE_NAME, + new String[] { CacheDb.COLUMN_PREVIEW_BITMAP }, // cols to return mCachedSelectQuery, // select query new String[] { name, mSize }, // args to select query null, |