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

Commit e0f58d73 authored by Sunny Goyal's avatar Sunny Goyal
Browse files

Adding shortcuts corresponding to ManagedUsers automatically.

Bug: 16188104
Change-Id: Ic07578dd187263f59f3c431cbb78dea90d0c24f4
parent b155bbb3
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -84,16 +84,11 @@ public class AppInfo extends ItemInfo {
        flags = initFlags(info);
        firstInstallTime = info.getFirstInstallTime();
        iconCache.getTitleAndIcon(this, info, labelCache);
        intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        intent.setComponent(info.getComponentName());
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        long serialNumber = UserManagerCompat.getInstance(context).getSerialNumberForUser(user);
        intent.putExtra(EXTRA_PROFILE, serialNumber);
        intent = makeLaunchIntent(context, info, user);
        this.user = user;
    }

    private static int initFlags(LauncherActivityInfoCompat info) {
    public static int initFlags(LauncherActivityInfoCompat info) {
        int appFlags = info.getApplicationInfo().flags;
        int flags = 0;
        if ((appFlags & android.content.pm.ApplicationInfo.FLAG_SYSTEM) == 0) {
@@ -137,4 +132,14 @@ public class AppInfo extends ItemInfo {
    public ShortcutInfo makeShortcut() {
        return new ShortcutInfo(this);
    }

    public static Intent makeLaunchIntent(Context context, LauncherActivityInfoCompat info,
            UserHandleCompat user) {
        long serialNumber = UserManagerCompat.getInstance(context).getSerialNumberForUser(user);
        return new Intent(Intent.ACTION_MAIN)
            .addCategory(Intent.CATEGORY_LAUNCHER)
            .setComponent(info.getComponentName())
            .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
            .putExtra(EXTRA_PROFILE, serialNumber);
    }
}
+212 −165

File changed.

Preview size limit exceeded, changes collapsed.

+7 −8
Original line number Diff line number Diff line
@@ -46,12 +46,14 @@ public class LauncherAppState implements DeviceProfile.DeviceProfileCallbacks {

    private final AppFilter mAppFilter;
    private final BuildInfo mBuildInfo;
    private LauncherModel mModel;
    private IconCache mIconCache;
    private final LauncherModel mModel;
    private final IconCache mIconCache;

    private final boolean mIsScreenLarge;
    private final float mScreenDensity;
    private final int mLongPressTimeout = 300;

    private WidgetPreviewLoader.CacheDb mWidgetPreviewCacheDb;
    private boolean mIsScreenLarge;
    private float mScreenDensity;
    private int mLongPressTimeout = 300;
    private boolean mWallpaperChangedSinceLastCheck;

    private static WeakReference<LauncherProvider> sLauncherProvider;
@@ -159,9 +161,6 @@ public class LauncherAppState implements DeviceProfile.DeviceProfileCallbacks {
    };

    LauncherModel setLauncher(Launcher launcher) {
        if (mModel == null) {
            throw new IllegalStateException("setLauncher() called before init()");
        }
        mModel.initialize(launcher);
        return mModel;
    }
+101 −37
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.content.Intent;
import android.content.Intent.ShortcutIconResource;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.content.pm.LauncherApps.Callback;
import android.content.pm.PackageManager;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
@@ -75,7 +76,6 @@ import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * Maintains in-memory state of the Launcher. It is expected that there should be only one
@@ -110,6 +110,11 @@ public class LauncherModel extends BroadcastReceiver
    private boolean mIsLoaderTaskRunning;
    private volatile boolean mFlushingWorkerThread;

    /**
     * Maintain a set of packages per user, for which we added a shortcut on the workspace.
     */
    private static final String INSTALLED_SHORTCUTS_SET_PREFIX = "installed_shortcuts_set_for_user_";

    // Specific runnable types that are run on the main thread deferred handler, this allows us to
    // clear all queued binding runnables when the Launcher activity is destroyed.
    private static final int MAIN_THREAD_NORMAL_RUNNABLE = 0;
@@ -343,7 +348,7 @@ public class LauncherModel extends BroadcastReceiver
        // Process the updated package state
        Runnable r = new Runnable() {
            public void run() {
                Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null;
                Callbacks callbacks = getCallback();
                if (callbacks != null) {
                    callbacks.updatePackageState(installInfo);
                }
@@ -356,7 +361,7 @@ public class LauncherModel extends BroadcastReceiver
        // Process the updated package badge
        Runnable r = new Runnable() {
            public void run() {
                Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null;
                Callbacks callbacks = getCallback();
                if (callbacks != null) {
                    callbacks.updatePackageBadge(packageName);
                }
@@ -366,7 +371,7 @@ public class LauncherModel extends BroadcastReceiver
    }

    public void addAppsToAllApps(final Context ctx, final ArrayList<AppInfo> allAppsApps) {
        final Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null;
        final Callbacks callbacks = getCallback();

        if (allAppsApps == null) {
            throw new RuntimeException("allAppsApps must not be null");
@@ -380,7 +385,7 @@ public class LauncherModel extends BroadcastReceiver
            public void run() {
                runOnMainThread(new Runnable() {
                    public void run() {
                        Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
                        Callbacks cb = getCallback();
                        if (callbacks == cb && cb != null) {
                            callbacks.bindAppsAdded(null, null, null, allAppsApps);
                        }
@@ -393,7 +398,7 @@ public class LauncherModel extends BroadcastReceiver

    public void addAndBindAddedWorkspaceApps(final Context context,
            final ArrayList<ItemInfo> workspaceApps) {
        final Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null;
        final Callbacks callbacks = getCallback();

        if (workspaceApps == null) {
            throw new RuntimeException("workspaceApps and allAppsApps must not be null");
@@ -425,7 +430,7 @@ public class LauncherModel extends BroadcastReceiver
                        final Intent launchIntent = a.getIntent();

                        // Short-circuit this logic if the icon exists somewhere on the workspace
                        if (shortcutExists(context, name, launchIntent)) {
                        if (shortcutExists(context, name, launchIntent, a.user)) {
                            continue;
                        }

@@ -484,7 +489,7 @@ public class LauncherModel extends BroadcastReceiver
                if (!addedShortcutsFinal.isEmpty()) {
                    runOnMainThread(new Runnable() {
                        public void run() {
                            Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
                            Callbacks cb = getCallback();
                            if (callbacks == cb && cb != null) {
                                final ArrayList<ItemInfo> addAnimated = new ArrayList<ItemInfo>();
                                final ArrayList<ItemInfo> addNotAnimated = new ArrayList<ItemInfo>();
@@ -844,7 +849,8 @@ public class LauncherModel extends BroadcastReceiver
     * Returns true if the shortcuts already exists in the database.
     * we identify a shortcut by its title and intent.
     */
    static boolean shortcutExists(Context context, String title, Intent intent) {
    static boolean shortcutExists(Context context, String title, Intent intent,
            UserHandleCompat user) {
        final ContentResolver cr = context.getContentResolver();
        final Intent intentWithPkg, intentWithoutPkg;

@@ -863,16 +869,18 @@ public class LauncherModel extends BroadcastReceiver
            intentWithPkg = intent;
            intentWithoutPkg = intent;
        }
        String userSerial = Long.toString(UserManagerCompat.getInstance(context)
                .getSerialNumberForUser(user));
        Cursor c = cr.query(LauncherSettings.Favorites.CONTENT_URI,
            new String[] { "title", "intent" }, "title=? and (intent=? or intent=?)",
            new String[] { title, intentWithPkg.toUri(0), intentWithoutPkg.toUri(0) }, null);
        boolean result = false;
            new String[] { "title", "intent", "profileId" },
            "title=? and (intent=? or intent=?) and profileId=?",
            new String[] { title, intentWithPkg.toUri(0), intentWithoutPkg.toUri(0), userSerial },
            null);
        try {
            result = c.moveToFirst();
            return c.moveToFirst();
        } finally {
            c.close();
        }
        return result;
    }

    /**
@@ -1285,14 +1293,12 @@ public class LauncherModel extends BroadcastReceiver
             mPreviousConfigMcc = currentConfig.mcc;
        } else if (SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED.equals(action) ||
                   SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED.equals(action)) {
            if (mCallbacks != null) {
                Callbacks callbacks = mCallbacks.get();
            Callbacks callbacks = getCallback();
            if (callbacks != null) {
                callbacks.bindSearchablesChanged();
            }
        }
    }
    }

    void forceReload() {
        resetLoadedState(true, true);
@@ -1321,15 +1327,13 @@ public class LauncherModel extends BroadcastReceiver
     */
    public void startLoaderFromBackground() {
        boolean runLoader = false;
        if (mCallbacks != null) {
            Callbacks callbacks = mCallbacks.get();
        Callbacks callbacks = getCallback();
        if (callbacks != null) {
            // Only actually run the loader if they're not paused.
            if (!callbacks.setLoadOnResume()) {
                runLoader = true;
            }
        }
        }
        if (runLoader) {
            startLoader(false, PagedView.INVALID_RESTORE_PAGE);
        }
@@ -2811,6 +2815,8 @@ public class LauncherModel extends BroadcastReceiver

            // Clear the list of apps
            mBgAllAppsList.clear();
            SharedPreferences prefs = mContext.getSharedPreferences(
                    LauncherAppState.getSharedPreferencesKey(), Context.MODE_PRIVATE);
            for (UserHandleCompat user : profiles) {
                // Query for the set of apps
                final long qiaTime = DEBUG_LOADERS ? SystemClock.uptimeMillis() : 0;
@@ -2821,6 +2827,7 @@ public class LauncherModel extends BroadcastReceiver
                    Log.d(TAG, "getActivityList got " + apps.size() + " apps for user " + user);
                }
                // Fail if we don't have any apps
                // TODO: Fix this. Only fail for the current user.
                if (apps == null || apps.isEmpty()) {
                    return;
                }
@@ -2839,6 +2846,25 @@ public class LauncherModel extends BroadcastReceiver
                    // This builds the icon bitmaps.
                    mBgAllAppsList.add(new AppInfo(mContext, app, user, mIconCache, mLabelCache));
                }

                if (!user.equals(UserHandleCompat.myUserHandle())) {
                    // Add shortcuts for packages which were installed while launcher was dead.
                    String shortcutsSetKey = INSTALLED_SHORTCUTS_SET_PREFIX
                            + mUserManager.getSerialNumberForUser(user);
                    Set<String> packagesAdded = prefs.getStringSet(shortcutsSetKey, Collections.EMPTY_SET);
                    HashSet<String> newPackageSet = new HashSet<String>();

                    for (LauncherActivityInfoCompat info : apps) {
                        String packageName = info.getComponentName().getPackageName();
                        if (!packagesAdded.contains(packageName)
                                && !newPackageSet.contains(packageName)) {
                            InstallShortcutReceiver.queueInstallShortcut(info, mContext);
                        }
                        newPackageSet.add(packageName);
                    }

                    prefs.edit().putStringSet(shortcutsSetKey, newPackageSet).commit();
                }
            }
            // Huh? Shouldn't this be inside the Runnable below?
            final ArrayList<AppInfo> added = mBgAllAppsList.added;
@@ -2953,6 +2979,30 @@ public class LauncherModel extends BroadcastReceiver
                        mIconCache.remove(packages[i], mUser);
                        mBgAllAppsList.addPackage(context, packages[i], mUser);
                    }

                    // Auto add shortcuts for added packages.
                    if (!UserHandleCompat.myUserHandle().equals(mUser)) {
                        SharedPreferences prefs = context.getSharedPreferences(
                                LauncherAppState.getSharedPreferencesKey(), Context.MODE_PRIVATE);
                        String shortcutsSetKey = INSTALLED_SHORTCUTS_SET_PREFIX
                                + mUserManager.getSerialNumberForUser(mUser);
                        Set<String> shortcutSet = new HashSet<String>(
                                prefs.getStringSet(shortcutsSetKey,Collections.EMPTY_SET));

                        for (int i=0; i<N; i++) {
                            if (!shortcutSet.contains(packages[i])) {
                                shortcutSet.add(packages[i]);
                                List<LauncherActivityInfoCompat> activities =
                                        mLauncherApps.getActivityList(packages[i], mUser);
                                if (activities != null && !activities.isEmpty()) {
                                    InstallShortcutReceiver.queueInstallShortcut(
                                            activities.get(0), context);
                                }
                            }
                        }

                        prefs.edit().putStringSet(shortcutsSetKey, shortcutSet).commit();
                    }
                    break;
                case OP_UPDATE:
                    for (int i=0; i<N; i++) {
@@ -2963,6 +3013,19 @@ public class LauncherModel extends BroadcastReceiver
                    }
                    break;
                case OP_REMOVE:
                    // Remove the packageName for the set of auto-installed shortcuts. This
                    // will ensure that the shortcut when the app is installed again.
                    if (!UserHandleCompat.myUserHandle().equals(mUser)) {
                        SharedPreferences prefs = context.getSharedPreferences(
                                LauncherAppState.getSharedPreferencesKey(), Context.MODE_PRIVATE);
                        String shortcutsSetKey = INSTALLED_SHORTCUTS_SET_PREFIX
                                + mUserManager.getSerialNumberForUser(mUser);
                        HashSet<String> shortcutSet = new HashSet<String>(
                                prefs.getStringSet(shortcutsSetKey, Collections.EMPTY_SET));
                        shortcutSet.removeAll(Arrays.asList(mPackages));
                        prefs.edit().putStringSet(shortcutsSetKey, shortcutSet).commit();
                    }
                    // Fall through
                case OP_UNAVAILABLE:
                    boolean clearCache = mOp == OP_REMOVE;
                    for (int i=0; i<N; i++) {
@@ -2991,7 +3054,7 @@ public class LauncherModel extends BroadcastReceiver
                mBgAllAppsList.removed.clear();
            }

            final Callbacks callbacks = mCallbacks != null ? mCallbacks.get() : null;
            final Callbacks callbacks = getCallback();
            if (callbacks == null) {
                Log.w(TAG, "Nobody to tell about the new app.  Launcher is probably loading.");
                return;
@@ -3021,7 +3084,7 @@ public class LauncherModel extends BroadcastReceiver

                mHandler.post(new Runnable() {
                    public void run() {
                        Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
                        Callbacks cb = getCallback();
                        if (callbacks == cb && cb != null) {
                            callbacks.bindAppsUpdated(modifiedFinal);
                        }
@@ -3134,7 +3197,7 @@ public class LauncherModel extends BroadcastReceiver
                    mHandler.post(new Runnable() {

                        public void run() {
                            Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
                            Callbacks cb = getCallback();
                            if (callbacks == cb && cb != null) {
                                callbacks.bindShortcutsChanged(
                                        updatedShortcuts, removedShortcuts, mUser);
@@ -3148,7 +3211,7 @@ public class LauncherModel extends BroadcastReceiver
                if (!widgets.isEmpty()) {
                    mHandler.post(new Runnable() {
                        public void run() {
                            Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
                            Callbacks cb = getCallback();
                            if (callbacks == cb && cb != null) {
                                callbacks.bindWidgetsRestored(widgets);
                            }
@@ -3189,14 +3252,11 @@ public class LauncherModel extends BroadcastReceiver
                }

                // Remove any queued items from the install queue
                String spKey = LauncherAppState.getSharedPreferencesKey();
                SharedPreferences sp =
                        context.getSharedPreferences(spKey, Context.MODE_PRIVATE);
                InstallShortcutReceiver.removeFromInstallQueue(sp, removedPackageNames);
                InstallShortcutReceiver.removeFromInstallQueue(context, removedPackageNames, mUser);
                // Call the components-removed callback
                mHandler.post(new Runnable() {
                    public void run() {
                        Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
                        Callbacks cb = getCallback();
                        if (callbacks == cb && cb != null) {
                            callbacks.bindComponentsRemoved(
                                    removedPackageNames, removedApps, mUser, removeReason);
@@ -3210,7 +3270,7 @@ public class LauncherModel extends BroadcastReceiver
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
                    Callbacks cb = getCallback();
                    if (callbacks == cb && cb != null) {
                        callbacks.bindPackagesUpdated(widgetsAndShortcuts);
                    }
@@ -3220,7 +3280,7 @@ public class LauncherModel extends BroadcastReceiver
            // Write all the logs to disk
            mHandler.post(new Runnable() {
                public void run() {
                    Callbacks cb = mCallbacks != null ? mCallbacks.get() : null;
                    Callbacks cb = getCallback();
                    if (callbacks == cb && cb != null) {
                        callbacks.dumpLogsToLocalData();
                    }
@@ -3754,4 +3814,8 @@ public class LauncherModel extends BroadcastReceiver
            Log.d(TAG, "mLoaderTask=null");
        }
    }

    public Callbacks getCallback() {
        return mCallbacks != null ? mCallbacks.get() : null;
    }
}