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
diff --git a/src/com/android/launcher2/LauncherApplication.java b/src/com/android/launcher2/LauncherApplication.java
index 28362fd..e5f3250 100644
--- a/src/com/android/launcher2/LauncherApplication.java
+++ b/src/com/android/launcher2/LauncherApplication.java
@@ -31,8 +31,9 @@
 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 @@
         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 @@
         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/android/launcher2/LauncherModel.java b/src/com/android/launcher2/LauncherModel.java
index 9a5bd47..99808a6 100644
--- a/src/com/android/launcher2/LauncherModel.java
+++ b/src/com/android/launcher2/LauncherModel.java
@@ -1988,7 +1988,10 @@
                     for (int i=0; i<N; i++) {
                         if (DEBUG_LOADERS) Log.d(TAG, "mAllAppsList.updatePackage " + packages[i]);
                         mBgAllAppsList.updatePackage(context, packages[i]);
-                        WidgetPreviewLoader.removeFromDb(context, packages[i]);
+                        LauncherApplication app =
+                                (LauncherApplication) context.getApplicationContext();
+                        WidgetPreviewLoader.removeFromDb(
+                                app.getWidgetPreviewCacheDb(), packages[i]);
                     }
                     break;
                 case OP_REMOVE:
@@ -1996,7 +1999,10 @@
                     for (int i=0; i<N; i++) {
                         if (DEBUG_LOADERS) Log.d(TAG, "mAllAppsList.removePackage " + packages[i]);
                         mBgAllAppsList.removePackage(packages[i]);
-                        WidgetPreviewLoader.removeFromDb(context, packages[i]);
+                        LauncherApplication app =
+                                (LauncherApplication) context.getApplicationContext();
+                        WidgetPreviewLoader.removeFromDb(
+                                app.getWidgetPreviewCacheDb(), packages[i]);
                     }
                     break;
             }
diff --git a/src/com/android/launcher2/PackageChangedReceiver.java b/src/com/android/launcher2/PackageChangedReceiver.java
index ce08b3a..e5e7e94 100644
--- a/src/com/android/launcher2/PackageChangedReceiver.java
+++ b/src/com/android/launcher2/PackageChangedReceiver.java
@@ -13,6 +13,7 @@
             // 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/android/launcher2/WidgetPreviewLoader.java b/src/com/android/launcher2/WidgetPreviewLoader.java
index 68813d4..5ce3233 100644
--- a/src/com/android/launcher2/WidgetPreviewLoader.java
+++ b/src/com/android/launcher2/WidgetPreviewLoader.java
@@ -129,7 +129,7 @@
 
     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 @@
         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 @@
         }
     }
 
-    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 @@
         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 @@
         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 @@
 
     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,