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

Commit 039206a9 authored by Adam Cohen's avatar Adam Cohen
Browse files

Pushing state persistence to a background thread

Change-Id: If776bc22c48525ba91dc7e4dd0e27de92612f2f5
parent 9986b2d2
Loading
Loading
Loading
Loading
+35 −12
Original line number Diff line number Diff line
@@ -41,7 +41,10 @@ import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Looper;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
@@ -180,6 +183,8 @@ class AppWidgetServiceImpl {
    boolean mStateLoaded;
    int mMaxWidgetBitmapMemory;

    private final Handler mSaveStateHandler;

    // These are for debugging only -- widgets are going missing in some rare instances
    ArrayList<Provider> mDeletedProviders = new ArrayList<Provider>();
    ArrayList<Host> mDeletedHosts = new ArrayList<Host>();
@@ -189,6 +194,10 @@ class AppWidgetServiceImpl {
        mPm = AppGlobals.getPackageManager();
        mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
        mUserId = userId;

        HandlerThread handlerThread = new HandlerThread("AppWidgetServiceImpl -- Save state");
        handlerThread.start();
        mSaveStateHandler = new Handler(handlerThread.getLooper());
        computeMaximumWidgetBitmapMemory();
    }

@@ -236,7 +245,7 @@ class AppWidgetServiceImpl {
                        updateProvidersForPackageLocked(cn.getPackageName(), removedProviders);
                    }
                }
                saveStateLocked();
                saveStateAsync();
            }
        }
    }
@@ -286,7 +295,7 @@ class AppWidgetServiceImpl {
                        providersModified |= addProvidersForPackageLocked(pkgName);
                    }
                }
                saveStateLocked();
                saveStateAsync();
            }
        } else {
            Bundle extras = intent.getExtras();
@@ -297,7 +306,7 @@ class AppWidgetServiceImpl {
                    ensureStateLoadedLocked();
                    for (String pkgName : pkgList) {
                        providersModified |= removeProvidersForPackageLocked(pkgName);
                        saveStateLocked();
                        saveStateAsync();
                    }
                }
            }
@@ -411,7 +420,7 @@ class AppWidgetServiceImpl {

    private void ensureStateLoadedLocked() {
        if (!mStateLoaded) {
            loadAppWidgetList();
            loadAppWidgetListLocked();
            loadStateLocked();
            mStateLoaded = true;
        }
@@ -432,7 +441,7 @@ class AppWidgetServiceImpl {
            host.instances.add(id);
            mAppWidgetIds.add(id);

            saveStateLocked();
            saveStateAsync();
            if (DBG) log("Allocating AppWidgetId for " + packageName + " host=" + hostId
                    + " id=" + appWidgetId);
            return appWidgetId;
@@ -445,7 +454,7 @@ class AppWidgetServiceImpl {
            AppWidgetId id = lookupAppWidgetIdLocked(appWidgetId);
            if (id != null) {
                deleteAppWidgetLocked(id);
                saveStateLocked();
                saveStateAsync();
            }
        }
    }
@@ -457,7 +466,7 @@ class AppWidgetServiceImpl {
            Host host = lookupHostLocked(callingUid, hostId);
            if (host != null) {
                deleteHostLocked(host);
                saveStateLocked();
                saveStateAsync();
            }
        }
    }
@@ -476,7 +485,7 @@ class AppWidgetServiceImpl {
                }
            }
            if (changed) {
                saveStateLocked();
                saveStateAsync();
            }
        }
    }
@@ -592,7 +601,7 @@ class AppWidgetServiceImpl {

                // schedule the future updates
                registerForBroadcastsLocked(p, getAppWidgetIds(p));
                saveStateLocked();
                saveStateAsync();
            }
        } finally {
            Binder.restoreCallingIdentity(ident);
@@ -656,8 +665,8 @@ class AppWidgetServiceImpl {
            } else {
                mPackagesWithBindWidgetPermission.remove(packageName);
            }
            saveStateAsync();
        }
        saveStateLocked();
    }

    // Binds to a specific RemoteViewsService
@@ -894,6 +903,20 @@ class AppWidgetServiceImpl {
        }
    }

    private void saveStateAsync() {
        mSaveStateHandler.post(mSaveStateRunnable);
    }

    private final Runnable mSaveStateRunnable = new Runnable() {
        @Override
        public void run() {
            synchronized (mAppWidgetIds) {
                ensureStateLoadedLocked();
                saveStateLocked();
            }
        }
    };

    public void updateAppWidgetOptions(int appWidgetId, Bundle options) {
        synchronized (mAppWidgetIds) {
            options = cloneIfLocalBinder(options);
@@ -914,7 +937,7 @@ class AppWidgetServiceImpl {
            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id.appWidgetId);
            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, id.options);
            mContext.sendBroadcastAsUser(intent, new UserHandle(mUserId));
            saveStateLocked();
            saveStateAsync();
        }
    }

@@ -1215,7 +1238,7 @@ class AppWidgetServiceImpl {
        }
    }

    void loadAppWidgetList() {
    void loadAppWidgetListLocked() {
        Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        try {
            List<ResolveInfo> broadcastReceivers = mPm.queryIntentReceivers(intent,