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

Commit 128b7e59 authored by Tony Wickham's avatar Tony Wickham Committed by Android (Google) Code Review
Browse files

Merge "Add support for getting widgets/shortucts for a particular...

Merge "Add support for getting widgets/shortucts for a particular package/user" into ub-launcher3-dorval
parents ca187461 86222d23
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ import android.os.StrictMode;
import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
import android.support.annotation.Nullable;
import android.text.Selection;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
@@ -3929,13 +3930,17 @@ public class Launcher extends BaseActivity

    @Override
    public void notifyWidgetProvidersChanged() {
        notifyWidgetProvidersChanged(false);
        if (mWorkspace.getState().shouldUpdateWidget) {
            refreshAndBindWidgetsForPackageUser(null);
        }

    public void notifyWidgetProvidersChanged(boolean force) {
        if (force || mWorkspace.getState().shouldUpdateWidget) {
            mModel.refreshAndBindWidgetsAndShortcuts(this, mWidgetsView.isEmpty());
    }

    /**
     * @param packageUser if null, refreshes all widgets and shortcuts, otherwise only
     *                    refreshes the widgets and shortcuts associated with the given package/user
     */
    public void refreshAndBindWidgetsForPackageUser(@Nullable PackageUserKey packageUser) {
        mModel.refreshAndBindWidgetsAndShortcuts(this, mWidgetsView.isEmpty(), packageUser);
    }

    public void lockScreenOrientation() {
+7 −4
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.os.Process;
import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
import android.util.LongSparseArray;
@@ -74,6 +75,7 @@ import com.android.launcher3.util.ComponentKey;
import com.android.launcher3.util.ManagedProfileHeuristic;
import com.android.launcher3.util.MultiHashMap;
import com.android.launcher3.util.PackageManagerHelper;
import com.android.launcher3.util.PackageUserKey;
import com.android.launcher3.util.Preconditions;
import com.android.launcher3.util.Provider;
import com.android.launcher3.util.Thunk;
@@ -1905,19 +1907,20 @@ public class LauncherModel extends BroadcastReceiver
        });
    }

    public void refreshAndBindWidgetsAndShortcuts(
            final Callbacks callbacks, final boolean bindFirst) {
    public void refreshAndBindWidgetsAndShortcuts(final Callbacks callbacks,
            final boolean bindFirst, @Nullable final PackageUserKey packageUser) {
        runOnWorkerThread(new Runnable() {
            @Override
            public void run() {
                if (bindFirst && !mBgWidgetsModel.isEmpty()) {
                    bindWidgetsModel(callbacks);
                }
                ArrayList<WidgetItem> allWidgets = mBgWidgetsModel.update(mApp.getContext());
                ArrayList<WidgetItem> widgets = mBgWidgetsModel.update(
                        mApp.getContext(), packageUser);
                bindWidgetsModel(callbacks);

                // update the Widget entries inside DB on the worker thread.
                mApp.getWidgetCache().removeObsoletePreviews(allWidgets);
                mApp.getWidgetCache().removeObsoletePreviews(widgets, packageUser);
            }
        });
    }
+15 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.os.AsyncTask;
import android.os.CancellationSignal;
import android.os.Handler;
import android.os.UserHandle;
import android.support.annotation.Nullable;
import android.support.v4.graphics.ColorUtils;
import android.util.Log;
import android.util.LongSparseArray;
@@ -36,6 +37,7 @@ import com.android.launcher3.graphics.LauncherIcons;
import com.android.launcher3.graphics.ShadowGenerator;
import com.android.launcher3.model.WidgetItem;
import com.android.launcher3.util.ComponentKey;
import com.android.launcher3.util.PackageUserKey;
import com.android.launcher3.util.Preconditions;
import com.android.launcher3.util.SQLiteCacheHelper;
import com.android.launcher3.util.Thunk;
@@ -170,8 +172,12 @@ public class WidgetPreviewLoader {
     *   1. Any preview generated for an old package version is removed
     *   2. Any preview for an absent package is removed
     * This ensures that we remove entries for packages which changed while the launcher was dead.
     *
     * @param packageUser if provided, specifies that list only contains previews for the
     *                    given package/user, otherwise the list contains all previews
     */
    public void removeObsoletePreviews(ArrayList<? extends ComponentKey> list) {
    public void removeObsoletePreviews(ArrayList<? extends ComponentKey> list,
            @Nullable PackageUserKey packageUser) {
        Preconditions.assertWorkerThread();

        LongSparseArray<HashSet<String>> validPackages = new LongSparseArray<>();
@@ -187,6 +193,8 @@ public class WidgetPreviewLoader {
        }

        LongSparseArray<HashSet<String>> packagesToDelete = new LongSparseArray<>();
        long passedUserId = packageUser == null ? 0
                : mUserManager.getSerialNumberForUser(packageUser.mUser);
        Cursor c = null;
        try {
            c = mDb.query(
@@ -199,6 +207,12 @@ public class WidgetPreviewLoader {
                long lastUpdated = c.getLong(2);
                long version = c.getLong(3);

                if (packageUser != null && (!pkg.equals(packageUser.mPackageName)
                        || userId != passedUserId)) {
                    // This preview is associated with a different package/user, no need to remove.
                    continue;
                }

                HashSet<String> packages = validPackages.get(userId);
                if (packages != null && packages.contains(pkg)) {
                    long[] versions = getPackageVersion(pkg);
+11 −3
Original line number Diff line number Diff line
@@ -22,12 +22,15 @@ import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
import android.content.ComponentName;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.UserHandle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;

import com.android.launcher3.LauncherAppWidgetProviderInfo;
import com.android.launcher3.Utilities;
import com.android.launcher3.util.ComponentKey;
import com.android.launcher3.util.PackageUserKey;

import java.util.HashMap;
import java.util.List;
@@ -40,8 +43,12 @@ public abstract class AppWidgetManagerCompat {
    public static AppWidgetManagerCompat getInstance(Context context) {
        synchronized (sInstanceLock) {
            if (sInstance == null) {
                if (Utilities.isAtLeastO()) {
                    sInstance = new AppWidgetManagerCompatVO(context.getApplicationContext());
                } else {
                    sInstance = new AppWidgetManagerCompatVL(context.getApplicationContext());
                }
            }
            return sInstance;
        }
    }
@@ -63,7 +70,8 @@ public abstract class AppWidgetManagerCompat {
        return info == null ? null : LauncherAppWidgetProviderInfo.fromProviderInfo(mContext, info);
    }

    public abstract List<AppWidgetProviderInfo> getAllProviders();
    public abstract List<AppWidgetProviderInfo> getAllProviders(
            @Nullable PackageUserKey packageUser);

    public abstract boolean bindAppWidgetIdIfAllowed(
            int appWidgetId, AppWidgetProviderInfo info, Bundle options);
+19 −7
Original line number Diff line number Diff line
@@ -22,39 +22,51 @@ import android.appwidget.AppWidgetProviderInfo;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
import android.support.annotation.Nullable;
import android.widget.Toast;

import com.android.launcher3.LauncherAppWidgetProviderInfo;
import com.android.launcher3.R;
import com.android.launcher3.util.ComponentKey;
import com.android.launcher3.util.PackageUserKey;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

class AppWidgetManagerCompatVL extends AppWidgetManagerCompat {

    private final UserManager mUserManager;
    private final PackageManager mPm;

    AppWidgetManagerCompatVL(Context context) {
        super(context);
        mPm = context.getPackageManager();
        mUserManager = (UserManager) context.getSystemService(Context.USER_SERVICE);
    }

    @Override
    public List<AppWidgetProviderInfo> getAllProviders() {
    public List<AppWidgetProviderInfo> getAllProviders(@Nullable PackageUserKey packageUser) {
        if (packageUser == null) {
            ArrayList<AppWidgetProviderInfo> providers = new ArrayList<AppWidgetProviderInfo>();
            for (UserHandle user : mUserManager.getUserProfiles()) {
                providers.addAll(mAppWidgetManager.getInstalledProvidersForProfile(user));
            }
            return providers;
        }
        // Only get providers for the given package/user.
        List<AppWidgetProviderInfo> providers = new ArrayList<>(mAppWidgetManager
                .getInstalledProvidersForProfile(packageUser.mUser));
        Iterator<AppWidgetProviderInfo> iterator = providers.iterator();
        while (iterator.hasNext()) {
            if (!iterator.next().provider.getPackageName().equals(packageUser.mPackageName)) {
                iterator.remove();
            }
        }
        return providers;
    }

    @Override
    public boolean bindAppWidgetIdIfAllowed(int appWidgetId, AppWidgetProviderInfo info,
Loading