Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 24af7881 authored by Stefan Andonian's avatar Stefan Andonian
Browse files

Fix for Top Dogfood Backup/Restore issue.

Sometimes when deferred restore is occurring, the launcher is killed and
restarted in restricted mode. Backup Restore uses this mode to clear the
data from the nexuslauncher app. However, this can conflict with
launcher loading and requesting data from its DBs. The solution is to
use a try catch around this issue so the app doesn't crash, and then
rely upon later launcher processes to clean up the icons that weren't
deleted.

Bug: 353505773
Test: Reproduced this bug locally, then verified that the backup restore
happens successfully after the fix is introduced.
Flag: EXEMPT bug fix

Change-Id: I958bf78d9db26b678be44e83aafb40b41d2ff966
parent 00abe511
Loading
Loading
Loading
Loading
+19 −7
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import android.content.res.Resources;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteReadOnlyDatabaseException;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
@@ -187,6 +188,7 @@ public abstract class BaseIconCache {
    }

    private synchronized void updateIconParamsBg(final int iconDpi, final int iconPixelSize) {
        try {
            mIconDpi = iconDpi;
            mDefaultIcon = null;
            mUserFlagOpMap.clear();
@@ -194,6 +196,16 @@ public abstract class BaseIconCache {
            mIconDb.close();
            mIconDb = new IconDB(mContext, mDbFileName, iconPixelSize);
            mCache.clear();
        } catch (SQLiteReadOnlyDatabaseException e) {
            // This is known to happen during repeated backup and restores, if the Launcher is in
            // restricted mode. When the launcher is loading and the backup restore is being cleared
            // there can be a conflict where one DB is trying to delete the DB file, and the other
            // is attempting to write to it. The effect is that launcher crashes, then the backup /
            // restore process fails, then the user's home screen icons fail to restore. Adding this
            // try / catch will stop the crash, and LoaderTask will sanitize any residual icon data,
            // leading to a completed backup / restore and a better experience for our customers.
            Log.e(TAG, "failed to clear the launcher's icon db or cache.", e);
        }
    }

    @Nullable