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

Commit 7b0c8779 authored by Michael Jurka's avatar Michael Jurka Committed by Android (Google) Code Review
Browse files

Merge "Delete appWidgetId when removing lockscreen widgets" into jb-mr1.1-dev

parents a9c0bb4a 75b5cfb4
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -224,6 +224,22 @@ public class AppWidgetHost {
        }
    }

    /**
     * Gets a list of all the appWidgetIds that are bound to the current host
     *
     * @hide
     */
    public int[] getAppWidgetIds() {
        try {
            if (sService == null) {
                bindService();
            }
            return sService.getAppWidgetIdsForHost(mHostId);
        } catch (RemoteException e) {
            throw new RuntimeException("system server dead?", e);
        }
    }

    private static void checkCallerIsSystem() {
        int uid = Process.myUid();
        if (UserHandle.getAppId(uid) == Process.SYSTEM_UID || uid == 0) {
+1 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ interface IAppWidgetService {
    void deleteHost(int hostId);
    void deleteAllHosts();
    RemoteViews getAppWidgetViews(int appWidgetId);
    int[] getAppWidgetIdsForHost(int hostId);

    //
    // for AppWidgetManager
+37 −2
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -128,6 +127,8 @@ public class KeyguardHostView extends KeyguardViewBase {
        mLockPatternUtils = new LockPatternUtils(context);
        mAppWidgetHost = new AppWidgetHost(
                context, APPWIDGET_HOST_ID, mOnClickHandler, Looper.myLooper());
        cleanupAppWidgetIds();

        mAppWidgetManager = AppWidgetManager.getInstance(mContext);
        mSecurityModel = new KeyguardSecurityModel(context);

@@ -153,6 +154,33 @@ public class KeyguardHostView extends KeyguardViewBase {
        }
    }

    private void cleanupAppWidgetIds() {
        // Clean up appWidgetIds that are bound to lockscreen, but not actually used
        // This is only to clean up after another bug: we used to not call
        // deleteAppWidgetId when a user manually deleted a widget in keyguard. This code
        // shouldn't have to run more than once per user. AppWidgetProviders rely on callbacks
        // that are triggered by deleteAppWidgetId, which is why we're doing this
        int[] appWidgetIdsInKeyguardSettings = mLockPatternUtils.getAppWidgets();
        int[] appWidgetIdsBoundToHost = mAppWidgetHost.getAppWidgetIds();
        for (int i = 0; i < appWidgetIdsBoundToHost.length; i++) {
            int appWidgetId = appWidgetIdsBoundToHost[i];
            if (!contains(appWidgetIdsInKeyguardSettings, appWidgetId)) {
                Log.d(TAG, "Found a appWidgetId that's not being used by keyguard, deleting id "
                        + appWidgetId);
                mAppWidgetHost.deleteAppWidgetId(appWidgetId);
            }
        }
    }

    private static boolean contains(int[] array, int target) {
        for (int value : array) {
            if (value == target) {
                return true;
            }
        }
        return false;
    }

    private KeyguardUpdateMonitorCallback mUpdateMonitorCallbacks =
            new KeyguardUpdateMonitorCallback() {
        @Override
@@ -331,10 +359,17 @@ public class KeyguardHostView extends KeyguardViewBase {
        };

        @Override
        public void onRemoveView(View v) {
        public void onRemoveView(View v, boolean deletePermanently) {
            if (numWidgets() < MAX_WIDGETS) {
                setAddWidgetEnabled(true);
            }
            if (deletePermanently) {
                final int appWidgetId = ((KeyguardWidgetFrame) v).getContentAppWidgetId();
                if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID &&
                        appWidgetId != LockPatternUtils.ID_DEFAULT_STATUS_WIDGET) {
                    mAppWidgetHost.deleteAppWidgetId(appWidgetId);
                }
            }
        }
    };

+3 −3
Original line number Diff line number Diff line
@@ -237,7 +237,7 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
        public void userActivity();
        public void onUserActivityTimeoutChanged();
        public void onAddView(View v);
        public void onRemoveView(View v);
        public void onRemoveView(View v, boolean deletePermanently);
    }

    public void addWidget(View widget) {
@@ -245,10 +245,10 @@ public class KeyguardWidgetPager extends PagedView implements PagedView.PageSwit
    }


    public void onRemoveView(View v) {
    public void onRemoveView(View v, final boolean deletePermanently) {
        final int appWidgetId = ((KeyguardWidgetFrame) v).getContentAppWidgetId();
        if (mCallbacks != null) {
            mCallbacks.onRemoveView(v);
            mCallbacks.onRemoveView(v, deletePermanently);
        }
        mBackgroundWorkerHandler.post(new Runnable() {
            @Override
+3 −3
Original line number Diff line number Diff line
@@ -1457,7 +1457,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
                                }

                                removeView(mDragView);
                                onRemoveView(mDragView);
                                onRemoveView(mDragView, false);
                                addView(mDragView, pageUnderPointIndex);
                                onAddView(mDragView, pageUnderPointIndex);
                                mSidePageHoverIndex = -1;
@@ -1587,7 +1587,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
    }

    //public abstract void onFlingToDelete(View v);
    public abstract void onRemoveView(View v);
    public abstract void onRemoveView(View v, boolean deletePermanently);
    public abstract void onAddView(View v, int index);

    private void resetTouchState() {
@@ -2391,7 +2391,7 @@ public abstract class PagedView extends ViewGroup implements ViewGroup.OnHierarc
                slideAnimations.start();

                removeView(dragView);
                onRemoveView(dragView);
                onRemoveView(dragView, true);
            }
        };
    }
Loading