Recover when reading corrupted widget previews

Bug: 10785722
This commit is contained in:
Michael Jurka
2013-09-26 11:29:01 -07:00
parent 1b495f5298
commit eb1bb92050
3 changed files with 25 additions and 8 deletions

View File

@@ -159,11 +159,12 @@ public class WidgetPreviewLoader {
}
public Bitmap getPreview(final Object o) {
String name = getObjectName(o);
final String name = getObjectName(o);
final String packageName = getObjectPackage(o);
// check if the package is valid
boolean packageValid = true;
synchronized(sInvalidPackages) {
packageValid = !sInvalidPackages.contains(getObjectPackage(o));
packageValid = !sInvalidPackages.contains(packageName);
}
if (!packageValid) {
return null;
@@ -334,7 +335,7 @@ public class WidgetPreviewLoader {
db.insert(CacheDb.TABLE_NAME, null, values);
}
public static void removeFromDb(final CacheDb cacheDb, final String packageName) {
public static void removePackageFromDb(final CacheDb cacheDb, final String packageName) {
synchronized(sInvalidPackages) {
sInvalidPackages.add(packageName);
}
@@ -356,6 +357,18 @@ public class WidgetPreviewLoader {
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null);
}
public static void removeItemFromDb(final CacheDb cacheDb, final String objectName) {
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
return null;
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void) null);
}
private Bitmap readFromDb(String name, Bitmap b) {
if (mCachedSelectQuery == null) {
mCachedSelectQuery = CacheDb.COLUMN_NAME + " = ? AND " +
@@ -377,8 +390,12 @@ public class WidgetPreviewLoader {
final BitmapFactory.Options opts = mCachedBitmapFactoryOptions.get();
opts.inBitmap = b;
opts.inSampleSize = 1;
Bitmap out = BitmapFactory.decodeByteArray(blob, 0, blob.length, opts);
return out;
try {
return BitmapFactory.decodeByteArray(blob, 0, blob.length, opts);
} catch (IllegalArgumentException e) {
removeItemFromDb(mDb, name);
return null;
}
} else {
result.close();
return null;