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

Commit 55c108fd authored by Pinyao Ting's avatar Pinyao Ting Committed by Android (Google) Code Review
Browse files

Merge changes from topic "shortcut-app-search" into sc-dev

* changes:
  Shortcut integration with AppSearch (Part 10)
  Shortcut integration with AppSearch (Part 9)
  Shortcut integration with AppSearch (Part 8)
  Shortcut integration with AppSearch (Part 7)
  Shortcut integration with AppSearch (Part 5)
parents 60ef47b3 47092c27
Loading
Loading
Loading
Loading
+242 −20
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ public class AppSearchShortcutInfo extends GenericDocument {

    /** The name of the schema type for {@link ShortcutInfo} documents.*/
    public static final String SCHEMA_TYPE = "Shortcut";
    public static final int SCHEMA_VERSION = 1;

    public static final String KEY_ACTIVITY = "activity";
    public static final String KEY_SHORT_LABEL = "shortLabel";
@@ -163,8 +164,10 @@ public class AppSearchShortcutInfo extends GenericDocument {
                    .setIndexingType(AppSearchSchema.StringPropertyConfig.INDEXING_TYPE_EXACT_TERMS)
                    .build()

            ).addProperty(new AppSearchSchema.Int64PropertyConfig.Builder(KEY_RANK)
            ).addProperty(new AppSearchSchema.StringPropertyConfig.Builder(KEY_RANK)
                    .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_OPTIONAL)
                    .setTokenizerType(AppSearchSchema.StringPropertyConfig.TOKENIZER_TYPE_PLAIN)
                    .setIndexingType(AppSearchSchema.StringPropertyConfig.INDEXING_TYPE_EXACT_TERMS)
                    .build()

            ).addProperty(new AppSearchSchema.Int64PropertyConfig.Builder(KEY_IMPLICIT_RANK)
@@ -175,8 +178,10 @@ public class AppSearchShortcutInfo extends GenericDocument {
                    .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_OPTIONAL)
                    .build()

            ).addProperty(new AppSearchSchema.Int64PropertyConfig.Builder(KEY_FLAGS)
            ).addProperty(new AppSearchSchema.StringPropertyConfig.Builder(KEY_FLAGS)
                    .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_REPEATED)
                    .setTokenizerType(AppSearchSchema.StringPropertyConfig.TOKENIZER_TYPE_PLAIN)
                    .setIndexingType(AppSearchSchema.StringPropertyConfig.INDEXING_TYPE_EXACT_TERMS)
                    .build()

            ).addProperty(new AppSearchSchema.Int64PropertyConfig.Builder(KEY_ICON_RES_ID)
@@ -201,12 +206,111 @@ public class AppSearchShortcutInfo extends GenericDocument {
                    .setIndexingType(AppSearchSchema.StringPropertyConfig.INDEXING_TYPE_NONE)
                    .build()

            ).addProperty(new AppSearchSchema.Int64PropertyConfig.Builder(KEY_DISABLED_REASON)
            ).addProperty(new AppSearchSchema.StringPropertyConfig.Builder(KEY_DISABLED_REASON)
                    .setCardinality(AppSearchSchema.PropertyConfig.CARDINALITY_REQUIRED)
                    .setTokenizerType(AppSearchSchema.StringPropertyConfig.TOKENIZER_TYPE_PLAIN)
                    .setIndexingType(AppSearchSchema.StringPropertyConfig.INDEXING_TYPE_EXACT_TERMS)
                    .build()

            ).build();

    /**
     * The string representation of every flag within {@link ShortcutInfo}. Note that its value
     * needs to be camelCase since AppSearch's tokenizer will break the word when it sees
     * underscore.
     */
    private static final String IS_DYNAMIC = "Dyn";
    private static final String NOT_DYNAMIC = "nDyn";
    private static final String IS_PINNED = "Pin";
    private static final String NOT_PINNED = "nPin";
    private static final String HAS_ICON_RES = "IcR";
    private static final String NO_ICON_RES = "nIcR";
    private static final String HAS_ICON_FILE = "IcF";
    private static final String NO_ICON_FILE = "nIcF";
    private static final String IS_KEY_FIELD_ONLY = "Key";
    private static final String NOT_KEY_FIELD_ONLY = "nKey";
    private static final String IS_MANIFEST = "Man";
    private static final String NOT_MANIFEST = "nMan";
    private static final String IS_DISABLED = "Dis";
    private static final String NOT_DISABLED = "nDis";
    private static final String ARE_STRINGS_RESOLVED = "Str";
    private static final String NOT_STRINGS_RESOLVED = "nStr";
    private static final String IS_IMMUTABLE = "Im";
    private static final String NOT_IMMUTABLE = "nIm";
    private static final String HAS_ADAPTIVE_BITMAP = "IcA";
    private static final String NO_ADAPTIVE_BITMAP = "nIcA";
    private static final String IS_RETURNED_BY_SERVICE = "Rets";
    private static final String NOT_RETURNED_BY_SERVICE = "nRets";
    private static final String HAS_ICON_FILE_PENDING_SAVE = "Pens";
    private static final String NO_ICON_FILE_PENDING_SAVE = "nPens";
    private static final String IS_SHADOW = "Sdw";
    private static final String NOT_SHADOW = "nSdw";
    private static final String IS_LONG_LIVED = "Liv";
    private static final String NOT_LONG_LIVED = "nLiv";
    private static final String HAS_ICON_URI = "IcU";
    private static final String NO_ICON_URI = "nIcU";
    private static final String IS_CACHED_NOTIFICATION = "CaN";
    private static final String NOT_CACHED_NOTIFICATION = "nCaN";
    private static final String IS_CACHED_BUBBLE = "CaB";
    private static final String NOT_CACHED_BUBBLE = "nCaB";
    private static final String IS_CACHED_PEOPLE_TITLE = "CaPT";
    private static final String NOT_CACHED_PEOPLE_TITLE = "nCaPT";

    /**
     * Following flags are not store within ShortcutInfo, but book-keeping states to reduce search
     * space when performing queries against AppSearch.
     */
    private static final String HAS_BITMAP_PATH = "hBiP";
    private static final String HAS_STRING_RESOURCE = "hStr";
    private static final String HAS_NON_ZERO_RANK = "hRan";

    public static final String QUERY_IS_DYNAMIC = KEY_FLAGS + ":" + IS_DYNAMIC;
    public static final String QUERY_IS_NOT_DYNAMIC = KEY_FLAGS + ":" + NOT_DYNAMIC;
    public static final String QUERY_IS_PINNED = KEY_FLAGS + ":" + IS_PINNED;
    public static final String QUERY_IS_NOT_PINNED = KEY_FLAGS + ":" + NOT_PINNED;
    public static final String QUERY_IS_MANIFEST = KEY_FLAGS + ":" + IS_MANIFEST;
    public static final String QUERY_IS_NOT_MANIFEST = KEY_FLAGS + ":" + NOT_MANIFEST;
    public static final String QUERY_IS_PINNED_AND_ENABLED =
            "(" + KEY_FLAGS + ":" + IS_PINNED + " " + KEY_FLAGS + ":" + NOT_DISABLED + ")";
    public static final String QUERY_IS_CACHED =
            "(" + KEY_FLAGS + ":" + IS_CACHED_NOTIFICATION + " OR "
            + KEY_FLAGS + ":" + IS_CACHED_BUBBLE + " OR "
            + KEY_FLAGS + ":" + IS_CACHED_PEOPLE_TITLE + ")";
    public static final String QUERY_IS_NOT_CACHED =
            "(" + KEY_FLAGS + ":" + NOT_CACHED_NOTIFICATION + " "
                    + KEY_FLAGS + ":" + NOT_CACHED_BUBBLE + " "
                    + KEY_FLAGS + ":" + NOT_CACHED_PEOPLE_TITLE + ")";
    public static final String QUERY_IS_FLOATING =
            "((" + IS_PINNED + " OR " + QUERY_IS_CACHED + ") "
                    + QUERY_IS_NOT_DYNAMIC + " " + QUERY_IS_NOT_MANIFEST + ")";
    public static final String QUERY_IS_NOT_FLOATING =
            "((" + QUERY_IS_NOT_PINNED + " " + QUERY_IS_NOT_CACHED + ") OR "
                    + QUERY_IS_DYNAMIC + " OR " + QUERY_IS_MANIFEST + ")";
    public static final String QUERY_IS_VISIBLE_TO_PUBLISHER =
            "(" + KEY_DISABLED_REASON + ":" + ShortcutInfo.DISABLED_REASON_NOT_DISABLED
                    + " OR " + KEY_DISABLED_REASON + ":"
                    + ShortcutInfo.DISABLED_REASON_BY_APP
                    + " OR " + KEY_DISABLED_REASON + ":"
                    + ShortcutInfo.DISABLED_REASON_APP_CHANGED
                    + " OR " + KEY_DISABLED_REASON + ":"
                    + ShortcutInfo.DISABLED_REASON_UNKNOWN + ")";
    public static final String QUERY_DISABLED_REASON_VERSION_LOWER =
            KEY_DISABLED_REASON + ":" + ShortcutInfo.DISABLED_REASON_VERSION_LOWER;
    public static final String QUERY_IS_NON_MANIFEST_VISIBLE =
            "(" + QUERY_IS_NOT_MANIFEST + " " + QUERY_IS_VISIBLE_TO_PUBLISHER + " ("
                    + QUERY_IS_PINNED + " OR " + QUERY_IS_CACHED + " OR " + QUERY_IS_DYNAMIC + "))";
    public static final String QUERY_IS_VISIBLE_CACHED_OR_PINNED =
            "(" + QUERY_IS_VISIBLE_TO_PUBLISHER + " " + QUERY_IS_DYNAMIC
                    + " (" + QUERY_IS_CACHED + " OR " + QUERY_IS_PINNED + "))";
    public static final String QUERY_IS_VISIBLE_PINNED_ONLY =
            "(" + QUERY_IS_VISIBLE_TO_PUBLISHER + " " + QUERY_IS_PINNED + " " + QUERY_IS_NOT_CACHED
            + " " + QUERY_IS_NOT_DYNAMIC + " " + QUERY_IS_NOT_MANIFEST + ")";
    public static final String QUERY_HAS_BITMAP_PATH = KEY_FLAGS + ":" + HAS_BITMAP_PATH;
    public static final String QUERY_HAS_STRING_RESOURCE = KEY_FLAGS + ":" + HAS_STRING_RESOURCE;
    public static final String QUERY_HAS_NON_ZERO_RANK = KEY_FLAGS + ":" + HAS_NON_ZERO_RANK;
    public static final String QUERY_IS_FLOATING_AND_HAS_RANK =
            "(" + QUERY_IS_FLOATING + " " + QUERY_HAS_NON_ZERO_RANK + ")";

    public AppSearchShortcutInfo(@NonNull GenericDocument document) {
        super(document);
    }
@@ -304,16 +408,16 @@ public class AppSearchShortcutInfo extends GenericDocument {
        final Person[] persons = parsePerson(getPropertyDocumentArray(KEY_PERSON));
        final String locusIdString = getPropertyString(KEY_LOCUS_ID);
        final LocusId locusId = locusIdString == null ? null : new LocusId(locusIdString);
        final int rank = (int) getPropertyLong(KEY_RANK);
        final int rank = Integer.parseInt(getPropertyString(KEY_RANK));
        final int implicitRank = (int) getPropertyLong(KEY_IMPLICIT_RANK);
        final byte[] extrasByte = getPropertyBytes(KEY_EXTRAS);
        final PersistableBundle extras = transformToPersistableBundle(extrasByte);
        final int flags = parseFlags(getPropertyLongArray(KEY_FLAGS));
        final int flags = parseFlags(getPropertyStringArray(KEY_FLAGS));
        final int iconResId = (int) getPropertyLong(KEY_ICON_RES_ID);
        final String iconResName = getPropertyString(KEY_ICON_RES_NAME);
        final String iconUri = getPropertyString(KEY_ICON_URI);
        final String bitmapPath = getPropertyString(KEY_BITMAP_PATH);
        final int disabledReason = (int) getPropertyLong(KEY_DISABLED_REASON);
        final int disabledReason = Integer.parseInt(getPropertyString(KEY_DISABLED_REASON));
        final ShortcutInfo si = new ShortcutInfo(
                userId, getUri(), packageName, activity, icon, shortLabel, shortLabelResId,
                shortLabelResName, longLabel, longLabelResId, longLabelResName, disabledMessage,
@@ -344,6 +448,9 @@ public class AppSearchShortcutInfo extends GenericDocument {
    @VisibleForTesting
    public static class Builder extends GenericDocument.Builder<Builder> {

        private List<String> mFlags = new ArrayList<>(1);
        private boolean mHasStringResource = false;

        public Builder(String packageName, String id) {
            super(/*namespace=*/ packageName, id, SCHEMA_TYPE);
        }
@@ -386,8 +493,11 @@ public class AppSearchShortcutInfo extends GenericDocument {
         * @hide
         */
        @NonNull
        public Builder setShortLabelResId(@Nullable final int shortLabelResId) {
        public Builder setShortLabelResId(final int shortLabelResId) {
            setPropertyLong(KEY_SHORT_LABEL_RES_ID, shortLabelResId);
            if (shortLabelResId != 0) {
                mHasStringResource = true;
            }
            return this;
        }

@@ -417,8 +527,11 @@ public class AppSearchShortcutInfo extends GenericDocument {
         * @hide
         */
        @NonNull
        public Builder setLongLabelResId(@Nullable final int longLabelResId) {
        public Builder setLongLabelResId(final int longLabelResId) {
            setPropertyLong(KEY_LONG_LABEL_RES_ID, longLabelResId);
            if (longLabelResId != 0) {
                mHasStringResource = true;
            }
            return this;
        }

@@ -448,8 +561,11 @@ public class AppSearchShortcutInfo extends GenericDocument {
         * @hide
         */
        @NonNull
        public Builder setDisabledMessageResId(@Nullable final int disabledMessageResId) {
        public Builder setDisabledMessageResId(final int disabledMessageResId) {
            setPropertyLong(KEY_DISABLED_MESSAGE_RES_ID, disabledMessageResId);
            if (disabledMessageResId != 0) {
                mHasStringResource = true;
            }
            return this;
        }

@@ -546,7 +662,10 @@ public class AppSearchShortcutInfo extends GenericDocument {
        @NonNull
        public Builder setRank(final int rank) {
            Preconditions.checkArgument((0 <= rank), "Rank cannot be negative");
            setPropertyLong(KEY_RANK, rank);
            setPropertyString(KEY_RANK, String.valueOf(rank));
            if (rank != 0) {
                mFlags.add(HAS_NON_ZERO_RANK);
            }
            return this;
        }

@@ -574,7 +693,10 @@ public class AppSearchShortcutInfo extends GenericDocument {
         * @hide
         */
        public Builder setFlags(@ShortcutInfo.ShortcutFlags final int flags) {
            setPropertyLong(KEY_FLAGS, flattenFlags(flags));
            final String[] flagArray = flattenFlags(flags);
            if (flagArray != null && flagArray.length > 0) {
                mFlags.addAll(Arrays.asList(flagArray));
            }
            return this;
        }

@@ -603,6 +725,7 @@ public class AppSearchShortcutInfo extends GenericDocument {
        public Builder setBitmapPath(@Nullable final String bitmapPath) {
            if (!TextUtils.isEmpty(bitmapPath)) {
                setPropertyString(KEY_BITMAP_PATH, bitmapPath);
                mFlags.add(HAS_BITMAP_PATH);
            }
            return this;
        }
@@ -621,7 +744,7 @@ public class AppSearchShortcutInfo extends GenericDocument {
         * @hide
         */
        public Builder setDisabledReason(@ShortcutInfo.DisabledReason final int disabledReason) {
            setPropertyLong(KEY_DISABLED_REASON, disabledReason);
            setPropertyString(KEY_DISABLED_REASON, String.valueOf(disabledReason));
            return this;
        }

@@ -631,6 +754,10 @@ public class AppSearchShortcutInfo extends GenericDocument {
        @NonNull
        @Override
        public AppSearchShortcutInfo build() {
            if (mHasStringResource) {
                mFlags.add(HAS_STRING_RESOURCE);
            }
            setPropertyString(KEY_FLAGS, mFlags.toArray(new String[0]));
            return new AppSearchShortcutInfo(super.build());
        }
    }
@@ -682,20 +809,115 @@ public class AppSearchShortcutInfo extends GenericDocument {
        }
    }

    private static long[] flattenFlags(@ShortcutInfo.ShortcutFlags final int flags) {
        final List<Integer> flattenedFlags = new ArrayList<>();
        flattenedFlags.add(0);
    private static String[] flattenFlags(@ShortcutInfo.ShortcutFlags final int flags) {
        final List<String> flattenedFlags = new ArrayList<>();
        for (int i = 0; i < 31; i++) {
            final int mask = 1 << i;
            if ((flags & mask) != 0) {
                flattenedFlags.add(mask);
            final String value = flagToString(flags, mask);
            if (value != null) {
                flattenedFlags.add(value);
            }
        }
        return flattenedFlags.toArray(new String[0]);
    }

    @Nullable
    private static String flagToString(
            @ShortcutInfo.ShortcutFlags final int flags, final int mask) {
        switch (mask) {
            case ShortcutInfo.FLAG_DYNAMIC:
                return (flags & mask) != 0 ? IS_DYNAMIC : NOT_DYNAMIC;
            case ShortcutInfo.FLAG_PINNED:
                return (flags & mask) != 0 ? IS_PINNED : NOT_PINNED;
            case ShortcutInfo.FLAG_HAS_ICON_RES:
                return (flags & mask) != 0 ? HAS_ICON_RES : NO_ICON_RES;
            case ShortcutInfo.FLAG_HAS_ICON_FILE:
                return (flags & mask) != 0 ? HAS_ICON_FILE : NO_ICON_FILE;
            case ShortcutInfo.FLAG_KEY_FIELDS_ONLY:
                return (flags & mask) != 0 ? IS_KEY_FIELD_ONLY : NOT_KEY_FIELD_ONLY;
            case ShortcutInfo.FLAG_MANIFEST:
                return (flags & mask) != 0 ? IS_MANIFEST : NOT_MANIFEST;
            case ShortcutInfo.FLAG_DISABLED:
                return (flags & mask) != 0 ? IS_DISABLED : NOT_DISABLED;
            case ShortcutInfo.FLAG_STRINGS_RESOLVED:
                return (flags & mask) != 0 ? ARE_STRINGS_RESOLVED : NOT_STRINGS_RESOLVED;
            case ShortcutInfo.FLAG_IMMUTABLE:
                return (flags & mask) != 0 ? IS_IMMUTABLE : NOT_IMMUTABLE;
            case ShortcutInfo.FLAG_ADAPTIVE_BITMAP:
                return (flags & mask) != 0 ? HAS_ADAPTIVE_BITMAP : NO_ADAPTIVE_BITMAP;
            case ShortcutInfo.FLAG_RETURNED_BY_SERVICE:
                return (flags & mask) != 0 ? IS_RETURNED_BY_SERVICE : NOT_RETURNED_BY_SERVICE;
            case ShortcutInfo.FLAG_ICON_FILE_PENDING_SAVE:
                return (flags & mask) != 0 ? HAS_ICON_FILE_PENDING_SAVE : NO_ICON_FILE_PENDING_SAVE;
            case ShortcutInfo.FLAG_SHADOW:
                return (flags & mask) != 0 ? IS_SHADOW : NOT_SHADOW;
            case ShortcutInfo.FLAG_LONG_LIVED:
                return (flags & mask) != 0 ? IS_LONG_LIVED : NOT_LONG_LIVED;
            case ShortcutInfo.FLAG_HAS_ICON_URI:
                return (flags & mask) != 0 ? HAS_ICON_URI : NO_ICON_URI;
            case ShortcutInfo.FLAG_CACHED_NOTIFICATIONS:
                return (flags & mask) != 0 ? IS_CACHED_NOTIFICATION : NOT_CACHED_NOTIFICATION;
            case ShortcutInfo.FLAG_CACHED_BUBBLES:
                return (flags & mask) != 0 ? IS_CACHED_BUBBLE : NOT_CACHED_BUBBLE;
            case ShortcutInfo.FLAG_CACHED_PEOPLE_TILE:
                return (flags & mask) != 0 ? IS_CACHED_PEOPLE_TITLE : NOT_CACHED_PEOPLE_TITLE;
            default:
                return null;
        }
        return flattenedFlags.stream().mapToLong(i -> i).toArray();
    }

    private static int parseFlags(final long[] flags) {
        return (int) Arrays.stream(flags).reduce((p, v) -> p | v).getAsLong();
    private static int parseFlags(@Nullable final String[] flags) {
        if (flags == null) {
            return 0;
        }
        int ret = 0;
        for (int i = 0; i < flags.length; i++) {
            ret = ret | parseFlag(flags[i]);
        }
        return ret;
    }

    private static int parseFlag(final String value) {
        switch (value) {
            case IS_DYNAMIC:
                return ShortcutInfo.FLAG_DYNAMIC;
            case IS_PINNED:
                return ShortcutInfo.FLAG_PINNED;
            case HAS_ICON_RES:
                return ShortcutInfo.FLAG_HAS_ICON_RES;
            case HAS_ICON_FILE:
                return ShortcutInfo.FLAG_HAS_ICON_FILE;
            case IS_KEY_FIELD_ONLY:
                return ShortcutInfo.FLAG_KEY_FIELDS_ONLY;
            case IS_MANIFEST:
                return ShortcutInfo.FLAG_MANIFEST;
            case IS_DISABLED:
                return ShortcutInfo.FLAG_DISABLED;
            case ARE_STRINGS_RESOLVED:
                return ShortcutInfo.FLAG_STRINGS_RESOLVED;
            case IS_IMMUTABLE:
                return ShortcutInfo.FLAG_IMMUTABLE;
            case HAS_ADAPTIVE_BITMAP:
                return ShortcutInfo.FLAG_ADAPTIVE_BITMAP;
            case IS_RETURNED_BY_SERVICE:
                return ShortcutInfo.FLAG_RETURNED_BY_SERVICE;
            case HAS_ICON_FILE_PENDING_SAVE:
                return ShortcutInfo.FLAG_ICON_FILE_PENDING_SAVE;
            case IS_SHADOW:
                return ShortcutInfo.FLAG_SHADOW;
            case IS_LONG_LIVED:
                return ShortcutInfo.FLAG_LONG_LIVED;
            case HAS_ICON_URI:
                return ShortcutInfo.FLAG_HAS_ICON_URI;
            case IS_CACHED_NOTIFICATION:
                return ShortcutInfo.FLAG_CACHED_NOTIFICATIONS;
            case IS_CACHED_BUBBLE:
                return ShortcutInfo.FLAG_CACHED_BUBBLES;
            case IS_CACHED_PEOPLE_TITLE:
                return ShortcutInfo.FLAG_CACHED_PEOPLE_TILE;
            default:
                return 0;
        }
    }

    @NonNull
+7 −1
Original line number Diff line number Diff line
@@ -148,7 +148,13 @@ public final class ShortcutInfo implements Parcelable {
    public static final int FLAG_CACHED_ALL =
            FLAG_CACHED_NOTIFICATIONS | FLAG_CACHED_BUBBLES | FLAG_CACHED_PEOPLE_TILE;

    /** @hide */
    /**
     * Bitmask-based flags indicating different states associated with the shortcut. Note that if
     * new value is added here, consider adding also the corresponding string representation and
     * queries in {@link AppSearchShortcutInfo}.
     *
     * @hide
     */
    @IntDef(flag = true, prefix = { "FLAG_" }, value = {
            FLAG_DYNAMIC,
            FLAG_PINNED,
+650 −296

File changed.

Preview size limit exceeded, changes collapsed.

+120 −50

File changed.

Preview size limit exceeded, changes collapsed.

+1 −3
Original line number Diff line number Diff line
@@ -457,7 +457,6 @@ class ShortcutUser {
                        case ShortcutPackage.TAG_ROOT: {
                            final ShortcutPackage shortcuts = ShortcutPackage.loadFromXml(
                                    s, ret, parser, fromBackup);
                            shortcuts.restoreParsedShortcuts(false);

                            // Don't use addShortcut(), we don't need to save the icon.
                            ret.mPackages.put(shortcuts.getPackageName(), shortcuts);
@@ -492,7 +491,6 @@ class ShortcutUser {
                final ShortcutPackage sp = ShortcutPackage.loadFromFile(s, ret, f, fromBackup);
                if (sp != null) {
                    ret.mPackages.put(sp.getPackageName(), sp);
                    sp.restoreParsedShortcuts(false);
                }
            });

@@ -575,7 +573,7 @@ class ShortcutUser {
                Log.w(TAG, "Shortcuts for package " + sp.getPackageName() + " are being restored."
                        + " Existing non-manifeset shortcuts will be overwritten.");
            }
            sp.restoreParsedShortcuts(true);
            sp.restoreParsedShortcuts();
            addPackage(sp);
            restoredPackages[0]++;
            restoredShortcuts[0] += sp.getShortcutCount();
Loading