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

Commit 15d161f6 authored by Jeff Sharkey's avatar Jeff Sharkey Committed by Adam Cohen
Browse files

Ensure appwidgets are loaded before usage.

Before accessing appwidget details, always ensure that configuration
is loaded from disk.

Change-Id: Ic71dd62fcdb1d1e5f7bae397efa8dce787434ba5
parent ba5fe923
Loading
Loading
Loading
Loading
+33 −2
Original line number Diff line number Diff line
@@ -170,6 +170,7 @@ class AppWidgetService extends IAppWidgetService.Stub
    final ArrayList<AppWidgetId> mAppWidgetIds = new ArrayList<AppWidgetId>();
    ArrayList<Host> mHosts = new ArrayList<Host>();
    boolean mSafeMode;
    boolean mStateLoaded;

    AppWidgetService(Context context) {
        mContext = context;
@@ -180,8 +181,9 @@ class AppWidgetService extends IAppWidgetService.Stub
    public void systemReady(boolean safeMode) {
        mSafeMode = safeMode;

        loadAppWidgetList();
        loadStateLocked();
        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
        }

        // Register for the boot completed broadcast, so we can send the
        // ENABLE broacasts.  If we try to send them now, they time out,
@@ -209,6 +211,14 @@ class AppWidgetService extends IAppWidgetService.Stub
        mContext.registerReceiver(mBroadcastReceiver, sdFilter);
    }

    private void ensureStateLoadedLocked() {
        if (!mStateLoaded) {
            loadAppWidgetList();
            loadStateLocked();
            mStateLoaded = true;
        }
    }

    @Override
    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
@@ -285,6 +295,7 @@ class AppWidgetService extends IAppWidgetService.Stub
    public int allocateAppWidgetId(String packageName, int hostId) {
        int callingUid = enforceCallingUid(packageName);
        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            int appWidgetId = mNextAppWidgetId++;

            Host host = lookupOrAddHostLocked(callingUid, packageName, hostId);
@@ -304,6 +315,7 @@ class AppWidgetService extends IAppWidgetService.Stub

    public void deleteAppWidgetId(int appWidgetId) {
        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            AppWidgetId id = lookupAppWidgetIdLocked(appWidgetId);
            if (id != null) {
                deleteAppWidgetLocked(id);
@@ -314,6 +326,7 @@ class AppWidgetService extends IAppWidgetService.Stub

    public void deleteHost(int hostId) {
        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            int callingUid = getCallingUid();
            Host host = lookupHostLocked(callingUid, hostId);
            if (host != null) {
@@ -325,6 +338,7 @@ class AppWidgetService extends IAppWidgetService.Stub

    public void deleteAllHosts() {
        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            int callingUid = getCallingUid();
            final int N = mHosts.size();
            boolean changed = false;
@@ -405,6 +419,7 @@ class AppWidgetService extends IAppWidgetService.Stub
        final long ident = Binder.clearCallingIdentity();
        try {
            synchronized (mAppWidgetIds) {
                ensureStateLoadedLocked();
                AppWidgetId id = lookupAppWidgetIdLocked(appWidgetId);
                if (id == null) {
                    throw new IllegalArgumentException("bad appWidgetId");
@@ -448,6 +463,7 @@ class AppWidgetService extends IAppWidgetService.Stub
    // Binds to a specific RemoteViewsService
    public void bindRemoteViewsService(int appWidgetId, Intent intent, IBinder connection) {
        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            AppWidgetId id = lookupAppWidgetIdLocked(appWidgetId);
            if (id == null) {
                throw new IllegalArgumentException("bad appWidgetId");
@@ -499,6 +515,7 @@ class AppWidgetService extends IAppWidgetService.Stub
    // Unbinds from a specific RemoteViewsService
    public void unbindRemoteViewsService(int appWidgetId, Intent intent) {
        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            // Unbind from the RemoteViewsService (which will trigger a callback to the bound
            // RemoteViewsAdapter)
            Pair<Integer, FilterComparison> key = Pair.create(appWidgetId,
@@ -610,6 +627,7 @@ class AppWidgetService extends IAppWidgetService.Stub

    public AppWidgetProviderInfo getAppWidgetInfo(int appWidgetId) {
        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            AppWidgetId id = lookupAppWidgetIdLocked(appWidgetId);
            if (id != null && id.provider != null && !id.provider.zombie) {
                return id.provider.info;
@@ -620,6 +638,7 @@ class AppWidgetService extends IAppWidgetService.Stub

    public RemoteViews getAppWidgetViews(int appWidgetId) {
        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            AppWidgetId id = lookupAppWidgetIdLocked(appWidgetId);
            if (id != null) {
                return id.views;
@@ -630,6 +649,7 @@ class AppWidgetService extends IAppWidgetService.Stub

    public List<AppWidgetProviderInfo> getInstalledProviders() {
        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            final int N = mInstalledProviders.size();
            ArrayList<AppWidgetProviderInfo> result = new ArrayList<AppWidgetProviderInfo>(N);
            for (int i=0; i<N; i++) {
@@ -652,6 +672,7 @@ class AppWidgetService extends IAppWidgetService.Stub
        final int N = appWidgetIds.length;

        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            for (int i=0; i<N; i++) {
                AppWidgetId id = lookupAppWidgetIdLocked(appWidgetIds[i]);
                updateAppWidgetInstanceLocked(id, views);
@@ -669,6 +690,7 @@ class AppWidgetService extends IAppWidgetService.Stub
        final int N = appWidgetIds.length;

        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            for (int i=0; i<N; i++) {
                AppWidgetId id = lookupAppWidgetIdLocked(appWidgetIds[i]);
                updateAppWidgetInstanceLocked(id, views, true);
@@ -686,6 +708,7 @@ class AppWidgetService extends IAppWidgetService.Stub
        final int N = appWidgetIds.length;

        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            for (int i=0; i<N; i++) {
                AppWidgetId id = lookupAppWidgetIdLocked(appWidgetIds[i]);
                notifyAppWidgetViewDataChangedInstanceLocked(id, viewId);
@@ -695,6 +718,7 @@ class AppWidgetService extends IAppWidgetService.Stub

    public void updateAppWidgetProvider(ComponentName provider, RemoteViews views) {
        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            Provider p = lookupProviderLocked(provider);
            if (p == null) {
                Slog.w(TAG, "updateAppWidgetProvider: provider doesn't exist: " + provider);
@@ -759,6 +783,7 @@ class AppWidgetService extends IAppWidgetService.Stub
            List<RemoteViews> updatedViews) {
        int callingUid = enforceCallingUid(packageName);
        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            Host host = lookupOrAddHostLocked(callingUid, packageName, hostId);
            host.callbacks = callbacks;

@@ -778,6 +803,7 @@ class AppWidgetService extends IAppWidgetService.Stub

    public void stopListening(int hostId) {
        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            Host host = lookupHostLocked(getCallingUid(), hostId);
            if (host != null) {
                host.callbacks = null;
@@ -965,6 +991,7 @@ class AppWidgetService extends IAppWidgetService.Stub
    
    public int[] getAppWidgetIds(ComponentName provider) {
        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            Provider p = lookupProviderLocked(provider);
            if (p != null && getCallingUid() == p.uid) {
                return getAppWidgetIds(p);                
@@ -1087,6 +1114,7 @@ class AppWidgetService extends IAppWidgetService.Stub

    void sendInitialBroadcasts() {
        synchronized (mAppWidgetIds) {
            ensureStateLoadedLocked();
            final int N = mInstalledProviders.size();
            for (int i=0; i<N; i++) {
                Provider p = mInstalledProviders.get(i);
@@ -1391,6 +1419,7 @@ class AppWidgetService extends IAppWidgetService.Stub
                    mLocale = revised;

                    synchronized (mAppWidgetIds) {
                        ensureStateLoadedLocked();
                        int N = mInstalledProviders.size();
                        for (int i=N-1; i>=0; i--) {
                            Provider p = mInstalledProviders.get(i);
@@ -1428,6 +1457,7 @@ class AppWidgetService extends IAppWidgetService.Stub
                }
                if (added || changed) {
                    synchronized (mAppWidgetIds) {
                        ensureStateLoadedLocked();
                        Bundle extras = intent.getExtras();
                        if (changed || (extras != null &&
                                    extras.getBoolean(Intent.EXTRA_REPLACING, false))) {
@@ -1449,6 +1479,7 @@ class AppWidgetService extends IAppWidgetService.Stub
                        // The package is being updated.  We'll receive a PACKAGE_ADDED shortly.
                    } else {
                        synchronized (mAppWidgetIds) {
                            ensureStateLoadedLocked();
                            for (String pkgName : pkgList) {
                                removeProvidersForPackageLocked(pkgName);
                                saveStateLocked();