private static PendingInstallShortcutInfo decode(String encoded, Context context) {
    try {
      JSONObject object = (JSONObject) new JSONTokener(encoded).nextValue();
      Intent launcherIntent = Intent.parseUri(object.getString(LAUNCH_INTENT_KEY), 0);

      if (object.optBoolean(APP_SHORTCUT_TYPE_KEY)) {
        // The is an internal launcher target shortcut.
        UserHandleCompat user =
            UserManagerCompat.getInstance(context)
                .getUserForSerialNumber(object.getLong(USER_HANDLE_KEY));
        if (user == null) {
          return null;
        }

        LauncherActivityInfoCompat info =
            LauncherAppsCompat.getInstance(context).resolveActivity(launcherIntent, user);
        return info == null ? null : new PendingInstallShortcutInfo(info, context);
      }

      Intent data = new Intent();
      data.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launcherIntent);
      data.putExtra(Intent.EXTRA_SHORTCUT_NAME, object.getString(NAME_KEY));

      String iconBase64 = object.optString(ICON_KEY);
      String iconResourceName = object.optString(ICON_RESOURCE_NAME_KEY);
      String iconResourcePackageName = object.optString(ICON_RESOURCE_PACKAGE_NAME_KEY);
      if (iconBase64 != null && !iconBase64.isEmpty()) {
        byte[] iconArray = Base64.decode(iconBase64, Base64.DEFAULT);
        Bitmap b = BitmapFactory.decodeByteArray(iconArray, 0, iconArray.length);
        data.putExtra(Intent.EXTRA_SHORTCUT_ICON, b);
      } else if (iconResourceName != null && !iconResourceName.isEmpty()) {
        Intent.ShortcutIconResource iconResource = new Intent.ShortcutIconResource();
        iconResource.resourceName = iconResourceName;
        iconResource.packageName = iconResourcePackageName;
        data.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
      }

      return new PendingInstallShortcutInfo(data, context);
    } catch (JSONException e) {
      Log.d(TAG, "Exception reading shortcut to add: " + e);
    } catch (URISyntaxException e) {
      Log.d(TAG, "Exception reading shortcut to add: " + e);
    }
    return null;
  }
    public String encodeToString() {
      if (activityInfo != null) {
        try {
          // If it a launcher target, we only need component name, and user to
          // recreate this.
          return new JSONStringer()
              .object()
              .key(LAUNCH_INTENT_KEY)
              .value(launchIntent.toUri(0))
              .key(APP_SHORTCUT_TYPE_KEY)
              .value(true)
              .key(USER_HANDLE_KEY)
              .value(UserManagerCompat.getInstance(mContext).getSerialNumberForUser(user))
              .endObject()
              .toString();
        } catch (JSONException e) {
          Log.d(TAG, "Exception when adding shortcut: " + e);
          return null;
        }
      }

      if (launchIntent.getAction() == null) {
        launchIntent.setAction(Intent.ACTION_VIEW);
      } else if (launchIntent.getAction().equals(Intent.ACTION_MAIN)
          && launchIntent.getCategories() != null
          && launchIntent.getCategories().contains(Intent.CATEGORY_LAUNCHER)) {
        launchIntent.addFlags(
            Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
      }

      // This name is only used for comparisons and notifications, so fall back to activity
      // name if not supplied
      String name = ensureValidName(mContext, launchIntent, label).toString();
      Bitmap icon = data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON);
      Intent.ShortcutIconResource iconResource =
          data.getParcelableExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE);

      // Only encode the parameters which are supported by the API.
      try {
        JSONStringer json =
            new JSONStringer()
                .object()
                .key(LAUNCH_INTENT_KEY)
                .value(launchIntent.toUri(0))
                .key(NAME_KEY)
                .value(name);
        if (icon != null) {
          byte[] iconByteArray = ItemInfo.flattenBitmap(icon);
          json =
              json.key(ICON_KEY)
                  .value(
                      Base64.encodeToString(
                          iconByteArray, 0, iconByteArray.length, Base64.DEFAULT));
        }
        if (iconResource != null) {
          json = json.key(ICON_RESOURCE_NAME_KEY).value(iconResource.resourceName);
          json = json.key(ICON_RESOURCE_PACKAGE_NAME_KEY).value(iconResource.packageName);
        }
        return json.endObject().toString();
      } catch (JSONException e) {
        Log.d(TAG, "Exception when adding shortcut: " + e);
      }
      return null;
    }