Search in sources :

Example 36 with LauncherAppState

use of com.android.launcher3.LauncherAppState in project Neo-Launcher by NeoApplications.

the class ShortcutsChangedTask method execute.

@Override
public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
    final Context context = app.getContext();
    DeepShortcutManager deepShortcutManager = DeepShortcutManager.getInstance(context);
    // Find WorkspaceItemInfo's that have changed on the workspace.
    HashSet<ShortcutKey> removedKeys = new HashSet<>();
    MultiHashMap<ShortcutKey, WorkspaceItemInfo> keyToShortcutInfo = new MultiHashMap<>();
    HashSet<String> allIds = new HashSet<>();
    for (ItemInfo itemInfo : dataModel.itemsIdMap) {
        if (itemInfo.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) {
            WorkspaceItemInfo si = (WorkspaceItemInfo) itemInfo;
            if (mPackageName.equals(si.getIntent().getPackage()) && si.user.equals(mUser)) {
                keyToShortcutInfo.addToList(ShortcutKey.fromItemInfo(si), si);
                allIds.add(si.getDeepShortcutId());
            }
        }
    }
    final ArrayList<WorkspaceItemInfo> updatedWorkspaceItemInfos = new ArrayList<>();
    if (!keyToShortcutInfo.isEmpty()) {
        // Update the workspace to reflect the changes to updated shortcuts residing on it.
        List<ShortcutInfo> shortcuts = deepShortcutManager.queryForFullDetails(mPackageName, new ArrayList<>(allIds), mUser);
        for (ShortcutInfo fullDetails : shortcuts) {
            ShortcutKey key = ShortcutKey.fromInfo(fullDetails);
            List<WorkspaceItemInfo> workspaceItemInfos = keyToShortcutInfo.remove(key);
            if (!fullDetails.isPinned()) {
                // The shortcut was previously pinned but is no longer, so remove it from
                // the workspace and our pinned shortcut counts.
                // Note that we put this check here, after querying for full details,
                // because there's a possible race condition between pinning and
                // receiving this callback.
                removedKeys.add(key);
                continue;
            }
            for (final WorkspaceItemInfo workspaceItemInfo : workspaceItemInfos) {
                workspaceItemInfo.updateFromDeepShortcutInfo(fullDetails, context);
                // If the shortcut is pinned but no longer has an icon in the system,
                // keep the current icon instead of reverting to the default icon.
                LauncherIcons li = LauncherIcons.obtain(context);
                workspaceItemInfo.applyFrom(li.createShortcutIcon(fullDetails, true, () -> workspaceItemInfo));
                li.recycle();
                updatedWorkspaceItemInfos.add(workspaceItemInfo);
            }
        }
    }
    // If there are still entries in keyToShortcutInfo, that means that
    // the corresponding shortcuts weren't passed in onShortcutsChanged(). This
    // means they were cleared, so we remove and unpin them now.
    removedKeys.addAll(keyToShortcutInfo.keySet());
    bindUpdatedWorkspaceItems(updatedWorkspaceItemInfos);
    if (!keyToShortcutInfo.isEmpty()) {
        deleteAndBindComponentsRemoved(ItemInfoMatcher.ofShortcutKeys(removedKeys));
    }
    if (mUpdateIdMap) {
        // Update the deep shortcut map if the list of ids has changed for an activity.
        dataModel.updateDeepShortcutCounts(mPackageName, mUser, mShortcuts);
        bindDeepShortcuts(dataModel);
    }
}
Also used : Context(android.content.Context) ShortcutInfo(android.content.pm.ShortcutInfo) ItemInfo(com.android.launcher3.ItemInfo) WorkspaceItemInfo(com.android.launcher3.WorkspaceItemInfo) ArrayList(java.util.ArrayList) MultiHashMap(com.android.launcher3.util.MultiHashMap) ShortcutKey(com.android.launcher3.shortcuts.ShortcutKey) LauncherIcons(com.android.launcher3.icons.LauncherIcons) DeepShortcutManager(com.android.launcher3.shortcuts.DeepShortcutManager) HashSet(java.util.HashSet) WorkspaceItemInfo(com.android.launcher3.WorkspaceItemInfo)

Example 37 with LauncherAppState

use of com.android.launcher3.LauncherAppState in project Neo-Launcher by NeoApplications.

the class WidgetsModel method setWidgetsAndShortcuts.

private synchronized void setWidgetsAndShortcuts(ArrayList<WidgetItem> rawWidgetsShortcuts, LauncherAppState app, @Nullable PackageUserKey packageUser) {
    if (DEBUG) {
        Log.d(TAG, "addWidgetsAndShortcuts, widgetsShortcuts#=" + rawWidgetsShortcuts.size());
    }
    // Temporary list for {@link PackageItemInfos} to avoid having to go through
    // {@link mPackageItemInfos} to locate the key to be used for {@link #mWidgetsList}
    HashMap<String, PackageItemInfo> tmpPackageItemInfos = new HashMap<>();
    // clear the lists.
    if (packageUser == null) {
        mWidgetsList.clear();
    } else {
        // Only clear the widgets for the given package/user.
        PackageItemInfo packageItem = null;
        for (PackageItemInfo item : mWidgetsList.keySet()) {
            if (item.packageName.equals(packageUser.mPackageName)) {
                packageItem = item;
                break;
            }
        }
        if (packageItem != null) {
            // We want to preserve the user that was on the packageItem previously,
            // so add it to tmpPackageItemInfos here to avoid creating a new entry.
            tmpPackageItemInfos.put(packageItem.packageName, packageItem);
            Iterator<WidgetItem> widgetItemIterator = mWidgetsList.get(packageItem).iterator();
            while (widgetItemIterator.hasNext()) {
                WidgetItem nextWidget = widgetItemIterator.next();
                if (nextWidget.componentName.getPackageName().equals(packageUser.mPackageName) && nextWidget.user.equals(packageUser.mUser)) {
                    widgetItemIterator.remove();
                }
            }
        }
    }
    InvariantDeviceProfile idp = app.getInvariantDeviceProfile();
    UserHandle myUser = Process.myUserHandle();
    // add and update.
    for (WidgetItem item : rawWidgetsShortcuts) {
        if (item.widgetInfo != null) {
            if ((item.widgetInfo.getWidgetFeatures() & WIDGET_FEATURE_HIDE_FROM_PICKER) != 0) {
                // Widget is hidden from picker
                continue;
            }
            // Ensure that all widgets we show can be added on a workspace of this size
            int minSpanX = Math.min(item.widgetInfo.spanX, item.widgetInfo.minSpanX);
            int minSpanY = Math.min(item.widgetInfo.spanY, item.widgetInfo.minSpanY);
            if (minSpanX > idp.numColumns || minSpanY > idp.numRows) {
                if (DEBUG) {
                    Log.d(TAG, String.format("Widget %s : (%d X %d) can't fit on this device", item.componentName, minSpanX, minSpanY));
                }
                continue;
            }
        }
        if (mAppFilter == null) {
            mAppFilter = AppFilter.newInstance(app.getContext());
        }
        if (!mAppFilter.shouldShowApp(item.componentName, item.user)) {
            if (DEBUG) {
                Log.d(TAG, String.format("%s is filtered and not added to the widget tray.", item.componentName));
            }
            continue;
        }
        String packageName = item.componentName.getPackageName();
        PackageItemInfo pInfo = tmpPackageItemInfos.get(packageName);
        if (pInfo == null) {
            pInfo = new PackageItemInfo(packageName);
            pInfo.user = item.user;
            tmpPackageItemInfos.put(packageName, pInfo);
        } else if (!myUser.equals(pInfo.user)) {
            // Keep updating the user, until we get the primary user.
            pInfo.user = item.user;
        }
        mWidgetsList.addToList(pInfo, item);
    }
    // Update each package entry
    IconCache iconCache = app.getIconCache();
    for (PackageItemInfo p : tmpPackageItemInfos.values()) {
        iconCache.getTitleAndIconForApp(p, true);
    }
}
Also used : HashMap(java.util.HashMap) MultiHashMap(com.android.launcher3.util.MultiHashMap) InvariantDeviceProfile(com.android.launcher3.InvariantDeviceProfile) UserHandle(android.os.UserHandle) IconCache(com.android.launcher3.icons.IconCache)

Example 38 with LauncherAppState

use of com.android.launcher3.LauncherAppState in project Neo-Launcher by NeoApplications.

the class WidgetsModel method update.

/**
 * @param packageUser If null, all widgets and shortcuts are updated and returned, otherwise
 *                    only widgets and shortcuts associated with the package/user are.
 */
public List<ComponentWithLabel> update(LauncherAppState app, @Nullable PackageUserKey packageUser) {
    Preconditions.assertWorkerThread();
    Context context = app.getContext();
    final ArrayList<WidgetItem> widgetsAndShortcuts = new ArrayList<>();
    List<ComponentWithLabel> updatedItems = new ArrayList<>();
    try {
        InvariantDeviceProfile idp = app.getInvariantDeviceProfile();
        PackageManager pm = app.getContext().getPackageManager();
        // Widgets
        AppWidgetManagerCompat widgetManager = AppWidgetManagerCompat.getInstance(context);
        for (AppWidgetProviderInfo widgetInfo : widgetManager.getAllProviders(packageUser)) {
            LauncherAppWidgetProviderInfo launcherWidgetInfo = LauncherAppWidgetProviderInfo.fromProviderInfo(context, widgetInfo);
            widgetsAndShortcuts.add(new WidgetItem(launcherWidgetInfo, idp, app.getIconCache()));
            updatedItems.add(launcherWidgetInfo);
        }
        // Shortcuts
        for (ShortcutConfigActivityInfo info : LauncherAppsCompat.getInstance(context).getCustomShortcutActivityList(packageUser)) {
            widgetsAndShortcuts.add(new WidgetItem(info, app.getIconCache(), pm));
            updatedItems.add(info);
        }
        setWidgetsAndShortcuts(widgetsAndShortcuts, app, packageUser);
    } catch (Exception e) {
        if (!FeatureFlags.IS_DOGFOOD_BUILD && Utilities.isBinderSizeError(e)) {
        // the returned value may be incomplete and will not be refreshed until the next
        // time Launcher starts.
        // TODO: after figuring out a repro step, introduce a dirty bit to check when
        // onResume is called to refresh the widget provider list.
        } else {
            throw e;
        }
    }
    app.getWidgetCache().removeObsoletePreviews(widgetsAndShortcuts, packageUser);
    return updatedItems;
}
Also used : Context(android.content.Context) LauncherAppWidgetProviderInfo(com.android.launcher3.LauncherAppWidgetProviderInfo) InvariantDeviceProfile(com.android.launcher3.InvariantDeviceProfile) ArrayList(java.util.ArrayList) AppWidgetManagerCompat(com.android.launcher3.compat.AppWidgetManagerCompat) PackageManager(android.content.pm.PackageManager) AppWidgetProviderInfo(android.appwidget.AppWidgetProviderInfo) LauncherAppWidgetProviderInfo(com.android.launcher3.LauncherAppWidgetProviderInfo) ShortcutConfigActivityInfo(com.android.launcher3.compat.ShortcutConfigActivityInfo) ComponentWithLabel(com.android.launcher3.icons.ComponentWithLabel)

Example 39 with LauncherAppState

use of com.android.launcher3.LauncherAppState in project android_packages_apps_Launcher3 by ArrowOS.

the class Utilities method loadFullDrawableWithoutTheme.

private static Drawable loadFullDrawableWithoutTheme(Context context, ItemInfo info, int width, int height, Object[] outObj) {
    ActivityContext activity = ActivityContext.lookupContext(context);
    LauncherAppState appState = LauncherAppState.getInstance(context);
    if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) {
        LauncherActivityInfo activityInfo = context.getSystemService(LauncherApps.class).resolveActivity(info.getIntent(), info.user);
        outObj[0] = activityInfo;
        return activityInfo == null ? null : LauncherAppState.getInstance(context).getIconProvider().getIcon(activityInfo, activity.getDeviceProfile().inv.fillResIconDpi);
    } else if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) {
        if (info instanceof PendingAddShortcutInfo) {
            ShortcutConfigActivityInfo activityInfo = ((PendingAddShortcutInfo) info).activityInfo;
            outObj[0] = activityInfo;
            return activityInfo.getFullResIcon(appState.getIconCache());
        }
        List<ShortcutInfo> si = ShortcutKey.fromItemInfo(info).buildRequest(context).query(ShortcutRequest.ALL);
        if (si.isEmpty()) {
            return null;
        } else {
            outObj[0] = si.get(0);
            return ShortcutCachingLogic.getIcon(context, si.get(0), appState.getInvariantDeviceProfile().fillResIconDpi);
        }
    } else if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_FOLDER) {
        FolderAdaptiveIcon icon = FolderAdaptiveIcon.createFolderAdaptiveIcon(activity, info.id, new Point(width, height));
        if (icon == null) {
            return null;
        }
        outObj[0] = icon;
        return icon;
    } else if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_SEARCH_ACTION && info instanceof SearchActionItemInfo) {
        return new AdaptiveIconDrawable(new FastBitmapDrawable(((SearchActionItemInfo) info).bitmap), null);
    } else {
        return null;
    }
}
Also used : ActivityContext(com.android.launcher3.views.ActivityContext) FolderAdaptiveIcon(com.android.launcher3.dragndrop.FolderAdaptiveIcon) FastBitmapDrawable(com.android.launcher3.icons.FastBitmapDrawable) LauncherActivityInfo(android.content.pm.LauncherActivityInfo) PendingAddShortcutInfo(com.android.launcher3.widget.PendingAddShortcutInfo) ShortcutConfigActivityInfo(com.android.launcher3.pm.ShortcutConfigActivityInfo) LauncherApps(android.content.pm.LauncherApps) List(java.util.List) SearchActionItemInfo(com.android.launcher3.model.data.SearchActionItemInfo) Point(android.graphics.Point) AdaptiveIconDrawable(android.graphics.drawable.AdaptiveIconDrawable)

Example 40 with LauncherAppState

use of com.android.launcher3.LauncherAppState in project android_packages_apps_Launcher3 by ArrowOS.

the class PredictionUpdateTask method execute.

@Override
public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
    Context context = app.getContext();
    // TODO: remove this
    Utilities.getDevicePrefs(context).edit().putBoolean(LAST_PREDICTION_ENABLED_STATE, !mTargets.isEmpty()).apply();
    FixedContainerItems fci = mPredictorState.items;
    Set<UserHandle> usersForChangedShortcuts = new HashSet<>(fci.items.stream().filter(info -> info.itemType == ITEM_TYPE_DEEP_SHORTCUT).map(info -> info.user).collect(Collectors.toSet()));
    fci.items.clear();
    for (AppTarget target : mTargets) {
        WorkspaceItemInfo itemInfo;
        ShortcutInfo si = target.getShortcutInfo();
        if (si != null) {
            usersForChangedShortcuts.add(si.getUserHandle());
            itemInfo = new WorkspaceItemInfo(si, context);
            app.getIconCache().getShortcutIcon(itemInfo, si);
        } else {
            String className = target.getClassName();
            if (COMPONENT_CLASS_MARKER.equals(className)) {
                // TODO: Implement this
                continue;
            }
            ComponentName cn = new ComponentName(target.getPackageName(), className);
            UserHandle user = target.getUser();
            itemInfo = apps.data.stream().filter(info -> user.equals(info.user) && cn.equals(info.componentName)).map(ai -> {
                app.getIconCache().getTitleAndIcon(ai, false);
                return ai.makeWorkspaceItem();
            }).findAny().orElseGet(() -> {
                LauncherActivityInfo lai = context.getSystemService(LauncherApps.class).resolveActivity(AppInfo.makeLaunchIntent(cn), user);
                if (lai == null) {
                    return null;
                }
                AppInfo ai = new AppInfo(context, lai, user);
                app.getIconCache().getTitleAndIcon(ai, lai, false);
                return ai.makeWorkspaceItem();
            });
            if (itemInfo == null) {
                continue;
            }
        }
        itemInfo.container = fci.containerId;
        fci.items.add(itemInfo);
    }
    bindExtraContainerItems(fci);
    usersForChangedShortcuts.forEach(u -> dataModel.updateShortcutPinnedState(app.getContext(), u));
    // Save to disk
    mPredictorState.storage.write(context, fci.items);
}
Also used : Context(android.content.Context) Utilities(com.android.launcher3.Utilities) Context(android.content.Context) AppInfo(com.android.launcher3.model.data.AppInfo) ComponentName(android.content.ComponentName) ShortcutInfo(android.content.pm.ShortcutInfo) ITEM_TYPE_DEEP_SHORTCUT(com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT) LauncherAppState(com.android.launcher3.LauncherAppState) Set(java.util.Set) Collectors(java.util.stream.Collectors) AppTarget(android.app.prediction.AppTarget) LauncherApps(android.content.pm.LauncherApps) HashSet(java.util.HashSet) List(java.util.List) COMPONENT_CLASS_MARKER(com.android.quickstep.InstantAppResolverImpl.COMPONENT_CLASS_MARKER) WorkspaceItemInfo(com.android.launcher3.model.data.WorkspaceItemInfo) UserHandle(android.os.UserHandle) LauncherActivityInfo(android.content.pm.LauncherActivityInfo) FixedContainerItems(com.android.launcher3.model.BgDataModel.FixedContainerItems) LAST_PREDICTION_ENABLED_STATE(com.android.launcher3.model.QuickstepModelDelegate.LAST_PREDICTION_ENABLED_STATE) PredictorState(com.android.launcher3.model.QuickstepModelDelegate.PredictorState) ShortcutInfo(android.content.pm.ShortcutInfo) FixedContainerItems(com.android.launcher3.model.BgDataModel.FixedContainerItems) AppInfo(com.android.launcher3.model.data.AppInfo) AppTarget(android.app.prediction.AppTarget) UserHandle(android.os.UserHandle) LauncherActivityInfo(android.content.pm.LauncherActivityInfo) ComponentName(android.content.ComponentName) HashSet(java.util.HashSet) WorkspaceItemInfo(com.android.launcher3.model.data.WorkspaceItemInfo)

Aggregations

ArrayList (java.util.ArrayList)62 WorkspaceItemInfo (com.android.launcher3.model.data.WorkspaceItemInfo)56 Context (android.content.Context)39 LauncherAppState (com.android.launcher3.LauncherAppState)38 HashSet (java.util.HashSet)37 ShortcutInfo (android.content.pm.ShortcutInfo)33 List (java.util.List)33 ComponentName (android.content.ComponentName)32 ItemInfo (com.android.launcher3.model.data.ItemInfo)30 LauncherActivityInfo (android.content.pm.LauncherActivityInfo)24 Point (android.graphics.Point)24 LauncherApps (android.content.pm.LauncherApps)23 IconCache (com.android.launcher3.icons.IconCache)23 LauncherIcons (com.android.launcher3.icons.LauncherIcons)23 AppInfo (com.android.launcher3.model.data.AppInfo)22 PackageManager (android.content.pm.PackageManager)20 InvariantDeviceProfile (com.android.launcher3.InvariantDeviceProfile)20 HashMap (java.util.HashMap)20 AppWidgetProviderInfo (android.appwidget.AppWidgetProviderInfo)19 LauncherAppWidgetInfo (com.android.launcher3.model.data.LauncherAppWidgetInfo)19