16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file.
46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)package org.chromium.components.bookmarks;
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)import android.text.TextUtils;
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)import android.util.Log;
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)import org.chromium.base.CalledByNative;
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)/**
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * Simple object representing the bookmark id.
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) */
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)public class BookmarkId {
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public static final int INVALID_FOLDER_ID = -2;
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public static final int ROOT_FOLDER_ID = -1;
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    private static final String LOG_TAG = "BookmarkId";
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    private static final char TYPE_PARTNER = 'p';
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    private final long mId;
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    private final int mType;
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public BookmarkId(long id, int type) {
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        mId = id;
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        mType = type;
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    /**
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     * @param c The char representing the type.
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     * @return The Bookmark type from a char representing the type.
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     */
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    private static int getBookmarkTypeFromChar(char c) {
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        switch (c) {
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            case TYPE_PARTNER:
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                return BookmarkType.BOOKMARK_TYPE_PARTNER;
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            default:
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                return BookmarkType.BOOKMARK_TYPE_NORMAL;
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    /**
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     * @param c The char representing the bookmark type.
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     * @return Whether the char representing the bookmark type is a valid type.
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     */
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    private static boolean isValidBookmarkTypeFromChar(char c) {
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        return c == TYPE_PARTNER;
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    /**
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     * @param s The bookmark id string (Eg: p1 for partner bookmark id 1).
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     * @return the Bookmark id from the string which is a concatenation of
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     *         bookmark type and the bookmark id.
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     */
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public static BookmarkId getBookmarkIdFromString(String s) {
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        long id = ROOT_FOLDER_ID;
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        int type = BookmarkType.BOOKMARK_TYPE_NORMAL;
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        if (TextUtils.isEmpty(s))
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            return new BookmarkId(id, type);
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        char folderTypeChar = s.charAt(0);
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        if (isValidBookmarkTypeFromChar(folderTypeChar)) {
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            type = getBookmarkTypeFromChar(folderTypeChar);
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            s = s.substring(1);
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        try {
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            id = Long.parseLong(s);
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        } catch (NumberFormatException exception) {
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            Log.e(LOG_TAG, "Error parsing url to extract the bookmark folder id.", exception);
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        return new BookmarkId(id, type);
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    /**
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     * @return The id of the bookmark.
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     */
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    @CalledByNative
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public long getId() {
796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        return mId;
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    /**
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     * @return The bookmark type.
846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)     */
856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    @CalledByNative
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public int getType() {
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        return mType;
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    private String getBookmarkTypeString() {
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        switch (mType) {
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            case BookmarkType.BOOKMARK_TYPE_PARTNER:
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                return String.valueOf(TYPE_PARTNER);
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            case BookmarkType.BOOKMARK_TYPE_NORMAL:
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            default:
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                return "";
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        }
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    @Override
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public String toString() {
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        return getBookmarkTypeString() + mId;
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    @Override
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public boolean equals(Object o) {
1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        if (!(o instanceof BookmarkId))
1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)            return false;
1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        BookmarkId item = (BookmarkId) o;
1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        return (item.mId == mId && item.mType == mType);
1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    @Override
1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    public int hashCode() {
1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        return toString().hashCode();
1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
118