Merge "Recover when widget preview database is deleted" into jb-ub-now-kermit

This commit is contained in:
Michael Jurka
2014-01-14 11:10:34 +00:00
committed by Android (Google) Code Review
2 changed files with 55 additions and 21 deletions
@@ -84,7 +84,7 @@ public class LauncherAppState implements DeviceProfile.DeviceProfileCallbacks {
mIsScreenLarge = isScreenLarge(sContext.getResources());
mScreenDensity = sContext.getResources().getDisplayMetrics().density;
mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(sContext);
recreateWidgetPreviewDb();
mIconCache = new IconCache(sContext);
mAppFilter = AppFilter.loadByName(sContext.getString(R.string.app_filter_class));
@@ -115,6 +115,13 @@ public class LauncherAppState implements DeviceProfile.DeviceProfileCallbacks {
resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true,
mFavoritesObserver);
}
public void recreateWidgetPreviewDb() {
if (mWidgetPreviewCacheDb != null) {
mWidgetPreviewCacheDb.close();
}
mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(sContext);
}
/**
* Call from Application.onTerminate(), which is not guaranteed to ever be called.
@@ -10,6 +10,7 @@ import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDiskIOException;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
@@ -164,6 +165,12 @@ public class WidgetPreviewLoader {
editor.commit();
}
}
public void recreateDb() {
LauncherAppState app = LauncherAppState.getInstance();
app.recreateWidgetPreviewDb();
mDb = app.getWidgetPreviewCacheDb();
}
public void setPreviewSize(int previewWidth, int previewHeight,
PagedViewCellLayout widgetSpacingLayout) {
@@ -347,13 +354,20 @@ public class WidgetPreviewLoader {
preview.compress(Bitmap.CompressFormat.PNG, 100, stream);
values.put(CacheDb.COLUMN_PREVIEW_BITMAP, stream.toByteArray());
values.put(CacheDb.COLUMN_SIZE, mSize);
db.insert(CacheDb.TABLE_NAME, null, values);
try {
db.insert(CacheDb.TABLE_NAME, null, values);
} catch (SQLiteDiskIOException e) {
recreateDb();
}
}
private void clearDb() {
SQLiteDatabase db = mDb.getWritableDatabase();
// Delete everything
db.delete(CacheDb.TABLE_NAME, null, null);
try {
db.delete(CacheDb.TABLE_NAME, null, null);
} catch (SQLiteDiskIOException e) {
}
}
public static void removePackageFromDb(final CacheDb cacheDb, final String packageName) {
@@ -363,13 +377,17 @@ public class WidgetPreviewLoader {
new AsyncTask<Void, Void, Void>() {
public Void doInBackground(Void ... args) {
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
);
try {
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
);
} catch (SQLiteDiskIOException e) {
}
synchronized(sInvalidPackages) {
sInvalidPackages.remove(packageName);
}
@@ -382,9 +400,12 @@ public class WidgetPreviewLoader {
new AsyncTask<Void, Void, Void>() {
public Void doInBackground(Void ... args) {
SQLiteDatabase db = cacheDb.getWritableDatabase();
db.delete(CacheDb.TABLE_NAME,
CacheDb.COLUMN_NAME + " = ? ", // SELECT query
new String[] { objectName }); // args to SELECT query
try {
db.delete(CacheDb.TABLE_NAME,
CacheDb.COLUMN_NAME + " = ? ", // SELECT query
new String[] { objectName }); // args to SELECT query
} catch (SQLiteDiskIOException e) {
}
return null;
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null);
@@ -396,14 +417,20 @@ public class WidgetPreviewLoader {
CacheDb.COLUMN_SIZE + " = ?";
}
SQLiteDatabase db = mDb.getReadableDatabase();
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,
null,
null,
null);
Cursor result;
try {
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,
null,
null,
null);
} catch (SQLiteDiskIOException e) {
recreateDb();
return null;
}
if (result.getCount() > 0) {
result.moveToFirst();
byte[] blob = result.getBlob(0);