10c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project/*
20c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
30c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project *
40c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
50c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * you may not use this file except in compliance with the License.
60c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * You may obtain a copy of the License at
70c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project *
80c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
90c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project *
100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * See the License for the specific language governing permissions and
140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * limitations under the License.
150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */
160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectpackage com.android.browser;
180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
19504433a185c3e60110590ce2aacd9b76b204b129Leon Scrogginsimport com.android.browser.addbookmark.FolderSpinner;
20dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scrogginsimport com.android.browser.addbookmark.FolderSpinnerAdapter;
2125230d7c576c18f40a0feeb7ef8b4a57e2e6240dLeon Scroggins
220c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.Activity;
23052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.app.LoaderManager;
242eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reckimport android.app.LoaderManager.LoaderCallbacks;
252eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reckimport android.content.AsyncTaskLoader;
260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ContentResolver;
27d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolbimport android.content.ContentUris;
28052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.content.ContentValues;
29052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.content.Context;
30052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.content.CursorLoader;
31052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.content.Loader;
320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.res.Resources;
333918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.database.Cursor;
34aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdochimport android.graphics.Bitmap;
350208194e0f9bf88f121b1e762744d66d00755ad3Leon Scrogginsimport android.graphics.drawable.Drawable;
360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.ParseException;
37d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolbimport android.net.Uri;
380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.net.WebAddress;
39c8490818ccb693ed2610366d2e91fb290e40c372John Reckimport android.os.AsyncTask;
400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Bundle;
411794fe252866c311f3b4700a2a1e44e843962243Ben Murdochimport android.os.Handler;
421794fe252866c311f3b4700a2a1e44e843962243Ben Murdochimport android.os.Message;
43052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.provider.BrowserContract;
442eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reckimport android.provider.BrowserContract.Accounts;
4525230d7c576c18f40a0feeb7ef8b4a57e2e6240dLeon Scrogginsimport android.text.TextUtils;
46162f8357656638b6ad9789098a180ea47b26800bLeon Scrogginsimport android.util.AttributeSet;
47052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.view.KeyEvent;
48052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.view.LayoutInflater;
490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.View;
50052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.view.ViewGroup;
510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Window;
5276a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins IIIimport android.view.WindowManager;
53052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.view.inputmethod.EditorInfo;
54052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.view.inputmethod.InputMethodManager;
55052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.widget.AdapterView;
562eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reckimport android.widget.AdapterView.OnItemSelectedListener;
572eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reckimport android.widget.ArrayAdapter;
58052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.widget.CursorAdapter;
590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.EditText;
60052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.widget.ListView;
612eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reckimport android.widget.Spinner;
620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.TextView;
630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.Toast;
640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
65f2407c682fafef77d568deba9987b193a5f2d361Cary Clarkimport java.net.URI;
66f2407c682fafef77d568deba9987b193a5f2d361Cary Clarkimport java.net.URISyntaxException;
67052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
68052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIpublic class AddBookmarkPage extends Activity
69052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        implements View.OnClickListener, TextView.OnEditorActionListener,
7074dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins        AdapterView.OnItemClickListener, LoaderManager.LoaderCallbacks<Cursor>,
712eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        BreadCrumbView.Controller, FolderSpinner.OnSetSelectionListener,
722eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        OnItemSelectedListener {
730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
74370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb    public static final long DEFAULT_FOLDER_ID = -1;
75bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins    public static final String TOUCH_ICON_URL = "touch_icon_url";
76bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins    // Place on an edited bookmark to remove the saved thumbnail
77bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins    public static final String REMOVE_THUMBNAIL = "remove_thumbnail";
78bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins    public static final String USER_AGENT = "user_agent";
79bdff8a72bd9894fc59ca658442e6ead37a56fa5dLeon Scroggins    public static final String CHECK_FOR_DUPE = "check_for_dupe";
80370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb
81c8490818ccb693ed2610366d2e91fb290e40c372John Reck    /* package */ static final String EXTRA_EDIT_BOOKMARK = "bookmark";
82c8490818ccb693ed2610366d2e91fb290e40c372John Reck    /* package */ static final String EXTRA_IS_FOLDER = "is_folder";
83c8490818ccb693ed2610366d2e91fb290e40c372John Reck
8474dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins    private static final int MAX_CRUMBS_SHOWN = 2;
8574dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins
860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private final String LOGTAG = "Bookmarks";
870c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
88052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    // IDs for the CursorLoaders that are used.
892eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    private final int LOADER_ID_ACCOUNTS = 0;
902eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    private final int LOADER_ID_FOLDER_CONTENTS = 1;
912eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    private final int LOADER_ID_EDIT_INFO = 2;
92052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private EditText    mTitle;
940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private EditText    mAddress;
950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private TextView    mButton;
960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private View        mCancelButton;
970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private boolean     mEditingExisting;
98c8490818ccb693ed2610366d2e91fb290e40c372John Reck    private boolean     mEditingFolder;
990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private Bundle      mMap;
1003918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott    private String      mTouchIconUrl;
101aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch    private String      mOriginalUrl;
102504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    private FolderSpinner mFolder;
103052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private View mDefaultView;
104052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private View mFolderSelector;
105052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private EditText mFolderNamer;
1060e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins    private View mFolderCancel;
107162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins    private boolean mIsFolderNamerShowing;
108162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins    private View mFolderNamerHolder;
109052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private View mAddNewFolder;
1107e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins    private View mAddSeparator;
111b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins    private long mCurrentFolder;
112052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private FolderAdapter mAdapter;
11374dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins    private BreadCrumbView mCrumbs;
1147e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins    private TextView mFakeTitle;
1157e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins    private View mCrumbHolder;
116162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins    private CustomListView mListView;
11788d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins    private boolean mSaveToHomeScreen;
1180208194e0f9bf88f121b1e762744d66d00755ad3Leon Scroggins    private long mRootFolder;
119905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins    private TextView mTopLevelLabel;
120905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins    private Drawable mHeaderIcon;
12175630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins    private View mRemoveLink;
12275630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins    private View mFakeTitleHolder;
1232f24e991b167b7ed6742d39d941c16ade899e14cLeon Scroggins    private FolderSpinnerAdapter mFolderAdapter;
1242eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    private Spinner mAccountSpinner;
1252eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    private ArrayAdapter<BookmarkAccount> mAccountAdapter;
1262eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
127052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private static class Folder {
128052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        String Name;
129052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        long Id;
130052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        Folder(String name, long id) {
131052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            Name = name;
132052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            Id = id;
133052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        }
134052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    }
1350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
1361794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch    // Message IDs
1371794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch    private static final int SAVE_BOOKMARK = 100;
13888d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins    private static final int TOUCH_ICON_DOWNLOADED = 101;
13975630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins    private static final int BOOKMARK_DELETED = 102;
1401794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch
1411794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch    private Handler mHandler;
1421794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch
143b1402a5c3e1617867c58d32d1fe9782cf6de423fBjorn Bringert    private InputMethodManager getInputMethodManager() {
144b1402a5c3e1617867c58d32d1fe9782cf6de423fBjorn Bringert        return (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
145b1402a5c3e1617867c58d32d1fe9782cf6de423fBjorn Bringert    }
146b1402a5c3e1617867c58d32d1fe9782cf6de423fBjorn Bringert
1478baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins    private Uri getUriForFolder(long folder) {
148903a0724c7cfd7c8d8eca790622d96d2c3ce63dfJohn Reck        BookmarkAccount account =
149903a0724c7cfd7c8d8eca790622d96d2c3ce63dfJohn Reck                (BookmarkAccount) mAccountSpinner.getSelectedItem();
150903a0724c7cfd7c8d8eca790622d96d2c3ce63dfJohn Reck        if (folder == mRootFolder && account != null) {
151903a0724c7cfd7c8d8eca790622d96d2c3ce63dfJohn Reck            return BookmarksLoader.addAccount(
152903a0724c7cfd7c8d8eca790622d96d2c3ce63dfJohn Reck                    BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER,
153903a0724c7cfd7c8d8eca790622d96d2c3ce63dfJohn Reck                    account.accountType, account.accountName);
154903a0724c7cfd7c8d8eca790622d96d2c3ce63dfJohn Reck        }
1552eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        return BrowserContract.Bookmarks.buildFolderUri(folder);
1568baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins    }
1578baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins
158052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    @Override
15971efc2bbf08574425a387c992e24cb9eaf0a6e6cJohn Reck    public void onTop(BreadCrumbView view, int level, Object data) {
16074dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins        if (null == data) return;
16152f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        Folder folderData = (Folder) data;
16252f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        long folder = folderData.Id;
16374dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins        LoaderManager manager = getLoaderManager();
1642eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        CursorLoader loader = (CursorLoader) ((Loader<?>) manager.getLoader(
16574dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins                LOADER_ID_FOLDER_CONTENTS));
1668baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        loader.setUri(getUriForFolder(folder));
16774dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins        loader.forceLoad();
168162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        if (mIsFolderNamerShowing) {
1696573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins            completeOrCancelFolderNaming(true);
1706573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        }
171905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins        setShowBookmarkIcon(level == 1);
172905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins    }
173905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins
174905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins    /**
175905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins     * Show or hide the icon for bookmarks next to "Bookmarks" in the crumb view.
176905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins     * @param show True if the icon should visible, false otherwise.
177905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins     */
178905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins    private void setShowBookmarkIcon(boolean show) {
179905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins        Drawable drawable = show ? mHeaderIcon: null;
180905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins        mTopLevelLabel.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);
18174dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins    }
18274dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins
18374dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins    @Override
184052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
185052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        if (v == mFolderNamer) {
186052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            if (v.getText().length() > 0) {
187052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                if (actionId == EditorInfo.IME_NULL) {
188052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                    // Only want to do this once.
189052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                    if (event.getAction() == KeyEvent.ACTION_UP) {
1906573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins                        completeOrCancelFolderNaming(false);
191052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                    }
192052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                }
1930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
19431829b941ca8ac02a828619440cb62b64673caa8Michael Kolb            // Steal the key press; otherwise a newline will be added
19531829b941ca8ac02a828619440cb62b64673caa8Michael Kolb            return true;
1960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
197052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        return false;
198052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    }
1990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
20052f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins    private void switchToDefaultView(boolean changedFolder) {
20152f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        mFolderSelector.setVisibility(View.GONE);
20252f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        mDefaultView.setVisibility(View.VISIBLE);
20352f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        mCrumbHolder.setVisibility(View.GONE);
20475630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins        mFakeTitleHolder.setVisibility(View.VISIBLE);
20552f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        if (changedFolder) {
20652f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins            Object data = mCrumbs.getTopData();
20752f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins            if (data != null) {
20852f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins                Folder folder = (Folder) data;
20952f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins                mCurrentFolder = folder.Id;
210dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins                if (mCurrentFolder == mRootFolder) {
211dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins                    // The Spinner changed to show "Other folder ..."  Change
212dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins                    // it back to "Bookmarks", which is position 0 if we are
213dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins                    // editing a folder, 1 otherwise.
214504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                    mFolder.setSelectionIgnoringSelectionChange(mEditingFolder ? 0 : 1);
215dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins                } else {
2162eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    mFolderAdapter.setOtherFolderDisplayText(folder.Name);
217dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins                }
218dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            }
219dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins        } else {
220dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            // The user canceled selecting a folder.  Revert back to the earlier
221dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            // selection.
222dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            if (mSaveToHomeScreen) {
223504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                mFolder.setSelectionIgnoringSelectionChange(0);
224dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            } else {
225b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                if (mCurrentFolder == mRootFolder) {
226b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                    mFolder.setSelectionIgnoringSelectionChange(mEditingFolder ? 0 : 1);
227b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                } else {
228b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                    Object data = mCrumbs.getTopData();
229b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                    if (data != null && ((Folder) data).Id == mCurrentFolder) {
2302eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        // We are showing the correct folder hierarchy. The
231b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        // folder selector will say "Other folder..."  Change it
232b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        // to say the name of the folder once again.
2332eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        mFolderAdapter.setOtherFolderDisplayText(((Folder) data).Name);
234b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                    } else {
2352eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        // We are not showing the correct folder hierarchy.
236b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        // Clear the Crumbs and find the proper folder
237b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        setupTopCrumb();
238b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        LoaderManager manager = getLoaderManager();
239b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        manager.restartLoader(LOADER_ID_FOLDER_CONTENTS, null, this);
240b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins
241b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                    }
242b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                }
24352f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins            }
24452f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        }
24552f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins    }
24652f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins
247052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    @Override
248052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    public void onClick(View v) {
249052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        if (v == mButton) {
250052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            if (mFolderSelector.getVisibility() == View.VISIBLE) {
25152f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins                // We are showing the folder selector.
252162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins                if (mIsFolderNamerShowing) {
2536573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins                    completeOrCancelFolderNaming(false);
254d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb                } else {
255d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb                    // User has selected a folder.  Go back to the opening page
25688d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                    mSaveToHomeScreen = false;
25752f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins                    switchToDefaultView(true);
258d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb                }
259052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            } else if (save()) {
260052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                finish();
261052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            }
262052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        } else if (v == mCancelButton) {
263162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            if (mIsFolderNamerShowing) {
2646573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins                completeOrCancelFolderNaming(true);
26552f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins            } else if (mFolderSelector.getVisibility() == View.VISIBLE) {
26652f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins                switchToDefaultView(false);
267d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb            } else {
268d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb                finish();
269d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb            }
2700e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins        } else if (v == mFolderCancel) {
2710e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins            completeOrCancelFolderNaming(true);
272052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        } else if (v == mAddNewFolder) {
273162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            setShowFolderNamer(true);
274052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            mFolderNamer.setText(R.string.new_folder);
275052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            mFolderNamer.requestFocus();
276d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb            mAddNewFolder.setVisibility(View.GONE);
2777e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins            mAddSeparator.setVisibility(View.GONE);
278162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            InputMethodManager imm = getInputMethodManager();
279162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            // Set the InputMethodManager to focus on the ListView so that it
280162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            // can transfer the focus to mFolderNamer.
281162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            imm.focusIn(mListView);
282162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            imm.showSoftInput(mFolderNamer, InputMethodManager.SHOW_IMPLICIT);
28375630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins        } else if (v == mRemoveLink) {
28475630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins            if (!mEditingExisting) {
28575630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                throw new AssertionError("Remove button should not be shown for"
28675630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                        + " new bookmarks");
28775630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins            }
28875630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins            long id = mMap.getLong(BrowserContract.Bookmarks._ID);
28975630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins            createHandler();
29075630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins            Message msg = Message.obtain(mHandler, BOOKMARK_DELETED);
29175630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins            BookmarkUtils.displayRemoveBookmarkDialog(id,
29275630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                    mTitle.getText().toString(), this, msg);
293052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        }
294052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    }
295052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
296504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    // FolderSpinner.OnSetSelectionListener
297504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins
29888d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins    @Override
299504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    public void onSetSelection(long id) {
300dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins        int intId = (int) id;
301dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins        switch (intId) {
302dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            case FolderSpinnerAdapter.ROOT_FOLDER:
3030208194e0f9bf88f121b1e762744d66d00755ad3Leon Scroggins                mCurrentFolder = mRootFolder;
30488d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                mSaveToHomeScreen = false;
30588d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                break;
306dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            case FolderSpinnerAdapter.HOME_SCREEN:
30788d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                // Create a short cut to the home screen
30888d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                mSaveToHomeScreen = true;
30988d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                break;
310dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            case FolderSpinnerAdapter.OTHER_FOLDER:
31188d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                switchToFolderSelector();
31288d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                break;
3132f24e991b167b7ed6742d39d941c16ade899e14cLeon Scroggins            case FolderSpinnerAdapter.RECENT_FOLDER:
3142f24e991b167b7ed6742d39d941c16ade899e14cLeon Scroggins                mCurrentFolder = mFolderAdapter.recentFolderId();
3152f24e991b167b7ed6742d39d941c16ade899e14cLeon Scroggins                mSaveToHomeScreen = false;
3162f24e991b167b7ed6742d39d941c16ade899e14cLeon Scroggins                // In case the user decides to select OTHER_FOLDER
3172f24e991b167b7ed6742d39d941c16ade899e14cLeon Scroggins                // and choose a different one, so that we will start from
3182f24e991b167b7ed6742d39d941c16ade899e14cLeon Scroggins                // the correct place.
3192f24e991b167b7ed6742d39d941c16ade899e14cLeon Scroggins                LoaderManager manager = getLoaderManager();
3202f24e991b167b7ed6742d39d941c16ade899e14cLeon Scroggins                manager.restartLoader(LOADER_ID_FOLDER_CONTENTS, null, this);
3210b95ad434c1c4bf0b7bdb9b788e68adffb55b188Leon Scroggins                break;
32288d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            default:
323dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins                break;
32488d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins        }
325dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins    }
326dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins
3270e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins    /**
3280e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins     * Finish naming a folder, and close the IME
3290e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins     * @param cancel If true, the new folder is not created.  If false, the new
3300e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins     *      folder is created and the user is taken inside it.
3310e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins     */
3326573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins    private void completeOrCancelFolderNaming(boolean cancel) {
3336573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        if (!cancel && !TextUtils.isEmpty(mFolderNamer.getText())) {
33431829b941ca8ac02a828619440cb62b64673caa8Michael Kolb            String name = mFolderNamer.getText().toString();
33531829b941ca8ac02a828619440cb62b64673caa8Michael Kolb            long id = addFolderToCurrent(mFolderNamer.getText().toString());
33631829b941ca8ac02a828619440cb62b64673caa8Michael Kolb            descendInto(name, id);
33731829b941ca8ac02a828619440cb62b64673caa8Michael Kolb        }
338162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        setShowFolderNamer(false);
3396573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        mAddNewFolder.setVisibility(View.VISIBLE);
3406573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        mAddSeparator.setVisibility(View.VISIBLE);
3416573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        getInputMethodManager().hideSoftInputFromWindow(
342162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins                mListView.getWindowToken(), 0);
34331829b941ca8ac02a828619440cb62b64673caa8Michael Kolb    }
34431829b941ca8ac02a828619440cb62b64673caa8Michael Kolb
345d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb    private long addFolderToCurrent(String name) {
346d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        // Add the folder to the database
347d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        ContentValues values = new ContentValues();
348d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        values.put(BrowserContract.Bookmarks.TITLE,
349d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb                name);
350d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        values.put(BrowserContract.Bookmarks.IS_FOLDER, 1);
35152f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        long currentFolder;
35252f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        Object data = mCrumbs.getTopData();
35352f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        if (data != null) {
35452f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins            currentFolder = ((Folder) data).Id;
35552f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        } else {
3560208194e0f9bf88f121b1e762744d66d00755ad3Leon Scroggins            currentFolder = mRootFolder;
35752f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        }
35852f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        values.put(BrowserContract.Bookmarks.PARENT, currentFolder);
359d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        Uri uri = getContentResolver().insert(
360d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb                BrowserContract.Bookmarks.CONTENT_URI, values);
361d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        if (uri != null) {
362d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb            return ContentUris.parseId(uri);
363d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        } else {
364d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb            return -1;
365d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        }
366d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb    }
367d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb
368052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private void switchToFolderSelector() {
369dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins        // Set the list to the top in case it is scrolled.
370dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins        mListView.setSelection(0);
371052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mDefaultView.setVisibility(View.GONE);
372052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mFolderSelector.setVisibility(View.VISIBLE);
3737e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins        mCrumbHolder.setVisibility(View.VISIBLE);
37475630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins        mFakeTitleHolder.setVisibility(View.GONE);
3757e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins        mAddNewFolder.setVisibility(View.VISIBLE);
3767e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins        mAddSeparator.setVisibility(View.VISIBLE);
37795f88e4825f6330938bd589ed39f1537469338e4John Reck        getInputMethodManager().hideSoftInputFromWindow(
37895f88e4825f6330938bd589ed39f1537469338e4John Reck                mListView.getWindowToken(), 0);
379052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    }
380052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
381d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb    private void descendInto(String foldername, long id) {
382370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb        if (id != DEFAULT_FOLDER_ID) {
38352f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins            mCrumbs.pushView(foldername, new Folder(foldername, id));
38474dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins            mCrumbs.notifyController();
385d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        }
386d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb    }
387d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb
3882eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    private LoaderCallbacks<EditBookmarkInfo> mEditInfoLoaderCallbacks =
3892eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            new LoaderCallbacks<EditBookmarkInfo>() {
3902eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
3912eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        @Override
3922eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        public void onLoaderReset(Loader<EditBookmarkInfo> loader) {
3932eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            // Don't care
3942eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        }
3952eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
3962eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        @Override
3972eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        public void onLoadFinished(Loader<EditBookmarkInfo> loader,
3982eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                EditBookmarkInfo info) {
3992eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            boolean setAccount = false;
4002eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            if (info.id != -1) {
4012eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                mEditingExisting = true;
4022eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                showRemoveButton();
4032eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                mFakeTitle.setText(R.string.edit_bookmark);
4042eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                mTitle.setText(info.title);
4052eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                mFolderAdapter.setOtherFolderDisplayText(info.parentTitle);
4062eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                mMap.putLong(BrowserContract.Bookmarks._ID, info.id);
4072eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                setAccount = true;
4082eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                setAccount(info.accountName, info.accountType);
4092eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                mCurrentFolder = info.parentId;
4102eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                onCurrentFolderFound();
4112eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            }
41237894a9707458cb2556c61ba483c18e2dc660a7eJohn Reck            // TODO: Detect if lastUsedId is a subfolder of info.id in the
41337894a9707458cb2556c61ba483c18e2dc660a7eJohn Reck            // editing folder case. For now, just don't show the last used
41437894a9707458cb2556c61ba483c18e2dc660a7eJohn Reck            // folder at all to prevent any chance of the user adding a parent
41537894a9707458cb2556c61ba483c18e2dc660a7eJohn Reck            // folder to a child folder
41637894a9707458cb2556c61ba483c18e2dc660a7eJohn Reck            if (info.lastUsedId != -1 && info.lastUsedId != info.id
41737894a9707458cb2556c61ba483c18e2dc660a7eJohn Reck                    && !mEditingFolder) {
4182eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                if (setAccount && info.lastUsedId != mRootFolder
4192eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        && TextUtils.equals(info.lastUsedAccountName, info.accountName)
4202eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        && TextUtils.equals(info.lastUsedAccountType, info.accountType)) {
4212eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    mFolderAdapter.addRecentFolder(info.lastUsedId, info.lastUsedTitle);
4222eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                } else if (!setAccount) {
4232eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    setAccount = true;
4242eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    setAccount(info.lastUsedAccountName, info.lastUsedAccountType);
4252eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    if (info.lastUsedId != mRootFolder) {
4262eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        mFolderAdapter.addRecentFolder(info.lastUsedId,
4272eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                                info.lastUsedTitle);
4282eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    }
4292eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                }
4302eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            }
4312eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            if (!setAccount) {
4322eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                mAccountSpinner.setSelection(0);
4332eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            }
4342eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        }
4352eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
4362eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        @Override
4372eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        public Loader<EditBookmarkInfo> onCreateLoader(int id, Bundle args) {
4382eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            return new EditBookmarkInfoLoader(AddBookmarkPage.this, mMap);
4392eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        }
4402eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    };
4412eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
4422eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    void setAccount(String accountName, String accountType) {
4432eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        for (int i = 0; i < mAccountAdapter.getCount(); i++) {
4442eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            BookmarkAccount account = mAccountAdapter.getItem(i);
4452eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            if (TextUtils.equals(account.accountName, accountName)
4462eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    && TextUtils.equals(account.accountType, accountType)) {
4472eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                mAccountSpinner.setSelection(i);
448903a0724c7cfd7c8d8eca790622d96d2c3ce63dfJohn Reck                onRootFolderFound(account.rootFolderId);
4492eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                return;
4502eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            }
4512eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        }
4522eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    }
4532eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
454052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    @Override
455052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
456052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        String[] projection;
457052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        switch (id) {
4582eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            case LOADER_ID_ACCOUNTS:
4592eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                return new AccountsLoader(this);
460052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            case LOADER_ID_FOLDER_CONTENTS:
461052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                projection = new String[] {
462052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        BrowserContract.Bookmarks._ID,
463052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        BrowserContract.Bookmarks.TITLE,
464052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        BrowserContract.Bookmarks.IS_FOLDER
465052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                };
466c112990af09d3e15f8503b863f1d8088c258995eLeon Scroggins                String where = BrowserContract.Bookmarks.IS_FOLDER + " != 0";
4671dd8cd43ff1bf1d7b8ef257b19e761b3eee296a7John Reck                String whereArgs[] = null;
468c112990af09d3e15f8503b863f1d8088c258995eLeon Scroggins                if (mEditingFolder) {
4691dd8cd43ff1bf1d7b8ef257b19e761b3eee296a7John Reck                    where += " AND " + BrowserContract.Bookmarks._ID + " != ?";
4701dd8cd43ff1bf1d7b8ef257b19e761b3eee296a7John Reck                    whereArgs = new String[] { Long.toString(mMap.getLong(
4711dd8cd43ff1bf1d7b8ef257b19e761b3eee296a7John Reck                            BrowserContract.Bookmarks._ID)) };
4721dd8cd43ff1bf1d7b8ef257b19e761b3eee296a7John Reck                }
4731dd8cd43ff1bf1d7b8ef257b19e761b3eee296a7John Reck                long currentFolder;
4741dd8cd43ff1bf1d7b8ef257b19e761b3eee296a7John Reck                Object data = mCrumbs.getTopData();
4751dd8cd43ff1bf1d7b8ef257b19e761b3eee296a7John Reck                if (data != null) {
4761dd8cd43ff1bf1d7b8ef257b19e761b3eee296a7John Reck                    currentFolder = ((Folder) data).Id;
4771dd8cd43ff1bf1d7b8ef257b19e761b3eee296a7John Reck                } else {
4781dd8cd43ff1bf1d7b8ef257b19e761b3eee296a7John Reck                    currentFolder = mRootFolder;
479c112990af09d3e15f8503b863f1d8088c258995eLeon Scroggins                }
480052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                return new CursorLoader(this,
4811dd8cd43ff1bf1d7b8ef257b19e761b3eee296a7John Reck                        getUriForFolder(currentFolder),
482052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        projection,
483c112990af09d3e15f8503b863f1d8088c258995eLeon Scroggins                        where,
4841dd8cd43ff1bf1d7b8ef257b19e761b3eee296a7John Reck                        whereArgs,
4858baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins                        BrowserContract.Bookmarks._ID + " ASC");
486052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            default:
487052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                throw new AssertionError("Asking for nonexistant loader!");
488052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        }
489052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    }
490052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
491052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    @Override
492052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
493052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        switch (loader.getId()) {
4942eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            case LOADER_ID_ACCOUNTS:
4952eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                mAccountAdapter.clear();
4962eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                while (cursor.moveToNext()) {
4972eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    mAccountAdapter.add(new BookmarkAccount(this, cursor));
498504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                }
4992eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                getLoaderManager().destroyLoader(LOADER_ID_ACCOUNTS);
5002eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                getLoaderManager().restartLoader(LOADER_ID_EDIT_INFO, null,
5012eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        mEditInfoLoaderCallbacks);
502504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                break;
503052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            case LOADER_ID_FOLDER_CONTENTS:
504052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                mAdapter.changeCursor(cursor);
505052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                break;
506052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        }
507052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    }
508052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
50939772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn    public void onLoaderReset(Loader<Cursor> loader) {
51039772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn        switch (loader.getId()) {
51139772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn            case LOADER_ID_FOLDER_CONTENTS:
51239772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn                mAdapter.changeCursor(null);
51339772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn                break;
51439772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn        }
51539772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn    }
51639772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn
5170208194e0f9bf88f121b1e762744d66d00755ad3Leon Scroggins    /**
5188baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     * Move cursor to the position that has folderToFind as its "_id".
5198baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     * @param cursor Cursor containing folders in the bookmarks database
5208baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     * @param folderToFind "_id" of the folder to move to.
5218baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     * @param idIndex Index in cursor of "_id"
5228baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     * @throws AssertionError if cursor is empty or there is no row with folderToFind
5238baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     *      as its "_id".
5248baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     */
5258baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins    void moveCursorToFolder(Cursor cursor, long folderToFind, int idIndex)
5268baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins            throws AssertionError {
5278baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        if (!cursor.moveToFirst()) {
5288baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins            throw new AssertionError("No folders in the database!");
5298baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        }
5308baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        long folder;
5318baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        do {
5328baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins            folder = cursor.getLong(idIndex);
5338baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        } while (folder != folderToFind && cursor.moveToNext());
5348baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        if (cursor.isAfterLast()) {
5358baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins            throw new AssertionError("Folder(id=" + folderToFind
5368baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins                    + ") holding this bookmark does not exist!");
5378baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        }
5388baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins    }
5398baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins
540052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    @Override
541052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    public void onItemClick(AdapterView<?> parent, View view, int position,
542052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            long id) {
543d14cb123f8d80896d568104f0f776be8cdc1aa60Leon Scroggins        TextView tv = (TextView) view.findViewById(android.R.id.text1);
544052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        // Switch to the folder that was clicked on.
545d14cb123f8d80896d568104f0f776be8cdc1aa60Leon Scroggins        descendInto(tv.getText().toString(), id);
546052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    }
547052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
548162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins    private void setShowFolderNamer(boolean show) {
549162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        if (show != mIsFolderNamerShowing) {
550162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            mIsFolderNamerShowing = show;
551162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            if (show) {
552162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins                // Set the selection to the folder namer so it will be in
553162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins                // view.
554162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins                mListView.addFooterView(mFolderNamerHolder);
555162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            } else {
556162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins                mListView.removeFooterView(mFolderNamerHolder);
557162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            }
558162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            // Refresh the list.
559162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            mListView.setAdapter(mAdapter);
560162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            if (show) {
561162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins                mListView.setSelection(mListView.getCount() - 1);
562162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            }
563162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        }
564162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins    }
565162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins
566052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    /**
567052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III     * Shows a list of names of folders.
568052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III     */
569052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private class FolderAdapter extends CursorAdapter {
570052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        public FolderAdapter(Context context) {
571052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            super(context, null);
5720c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
573052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
574052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        @Override
575052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        public void bindView(View view, Context context, Cursor cursor) {
576052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            ((TextView) view.findViewById(android.R.id.text1)).setText(
577052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                    cursor.getString(cursor.getColumnIndexOrThrow(
578052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                    BrowserContract.Bookmarks.TITLE)));
579052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        }
580052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
581052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        @Override
582052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        public View newView(Context context, Cursor cursor, ViewGroup parent) {
583d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb            View view = LayoutInflater.from(context).inflate(
584d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb                    R.layout.folder_list_item, null);
585d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb            view.setBackgroundDrawable(context.getResources().
586d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb                    getDrawable(android.R.drawable.list_selector_background));
587d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb            return view;
588052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        }
5896573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins
5906573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        @Override
5916573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        public boolean isEmpty() {
5926573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins            // Do not show the empty view if the user is creating a new folder.
593162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            return super.isEmpty() && !mIsFolderNamerShowing;
5946573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        }
595052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    }
5960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
597c112990af09d3e15f8503b863f1d8088c258995eLeon Scroggins    @Override
5980c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    protected void onCreate(Bundle icicle) {
5990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        super.onCreate(icicle);
6007453ff26de5948543979f5921eb8917284e8e5c4Leon Scroggins        requestWindowFeature(Window.FEATURE_NO_TITLE);
601eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch
602eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch        mMap = getIntent().getExtras();
603eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch
604052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        setContentView(R.layout.browser_add_bookmark);
605eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch
60676a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III        Window window = getWindow();
607d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb
6080c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        String title = null;
6090c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        String url = null;
610eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch
61152f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        mFakeTitle = (TextView) findViewById(R.id.fake_title);
61252f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins
6130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        if (mMap != null) {
614c8490818ccb693ed2610366d2e91fb290e40c372John Reck            Bundle b = mMap.getBundle(EXTRA_EDIT_BOOKMARK);
6150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if (b != null) {
616c8490818ccb693ed2610366d2e91fb290e40c372John Reck                mEditingFolder = mMap.getBoolean(EXTRA_IS_FOLDER, false);
6170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                mMap = b;
6180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                mEditingExisting = true;
6197e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins                mFakeTitle.setText(R.string.edit_bookmark);
620c8490818ccb693ed2610366d2e91fb290e40c372John Reck                if (mEditingFolder) {
621c8490818ccb693ed2610366d2e91fb290e40c372John Reck                    findViewById(R.id.row_address).setVisibility(View.GONE);
62275630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                } else {
62375630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                    showRemoveButton();
624c8490818ccb693ed2610366d2e91fb290e40c372John Reck                }
62576a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III            } else {
62676a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III                int gravity = mMap.getInt("gravity", -1);
62776a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III                if (gravity != -1) {
62876a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III                    WindowManager.LayoutParams l = window.getAttributes();
62976a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III                    l.gravity = gravity;
63076a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III                    window.setAttributes(l);
63176a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III                }
6320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
633bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            title = mMap.getString(BrowserContract.Bookmarks.TITLE);
634bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            url = mOriginalUrl = mMap.getString(BrowserContract.Bookmarks.URL);
635bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            mTouchIconUrl = mMap.getString(TOUCH_ICON_URL);
636370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb            mCurrentFolder = mMap.getLong(BrowserContract.Bookmarks.PARENT, DEFAULT_FOLDER_ID);
63725230d7c576c18f40a0feeb7ef8b4a57e2e6240dLeon Scroggins        }
6380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
6390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        mTitle = (EditText) findViewById(R.id.title);
6400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        mTitle.setText(title);
641eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch
642052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mAddress = (EditText) findViewById(R.id.address);
643052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mAddress.setText(url);
6440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
6450c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        mButton = (TextView) findViewById(R.id.OK);
646052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mButton.setOnClickListener(this);
6470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
6480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        mCancelButton = findViewById(R.id.cancel);
649052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mCancelButton.setOnClickListener(this);
650052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
651504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        mFolder = (FolderSpinner) findViewById(R.id.folder);
6522eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        mFolderAdapter = new FolderSpinnerAdapter(this, !mEditingFolder);
6532f24e991b167b7ed6742d39d941c16ade899e14cLeon Scroggins        mFolder.setAdapter(mFolderAdapter);
654504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        mFolder.setOnSetSelectionListener(this);
655052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
656052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mDefaultView = findViewById(R.id.default_view);
657052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mFolderSelector = findViewById(R.id.folder_selector);
658052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
659162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        mFolderNamerHolder = getLayoutInflater().inflate(R.layout.new_folder_layout, null);
660162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        mFolderNamer = (EditText) mFolderNamerHolder.findViewById(R.id.folder_namer);
661052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mFolderNamer.setOnEditorActionListener(this);
6620e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins        mFolderCancel = mFolderNamerHolder.findViewById(R.id.close);
6630e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins        mFolderCancel.setOnClickListener(this);
664052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
665052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mAddNewFolder = findViewById(R.id.add_new_folder);
666052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mAddNewFolder.setOnClickListener(this);
6677e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins        mAddSeparator = findViewById(R.id.add_divider);
668052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
66974dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins        mCrumbs = (BreadCrumbView) findViewById(R.id.crumbs);
67074dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins        mCrumbs.setUseBackButton(true);
67174dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins        mCrumbs.setController(this);
6725a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb        mHeaderIcon = getResources().getDrawable(R.drawable.ic_folder_holo_dark);
6737e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins        mCrumbHolder = findViewById(R.id.crumb_holder);
67489f73c1146f474641881e3e20c77cfbfc18fa313John Reck        mCrumbs.setMaxVisible(MAX_CRUMBS_SHOWN);
67574dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins
676052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mAdapter = new FolderAdapter(this);
677162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        mListView = (CustomListView) findViewById(R.id.list);
6786573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        View empty = findViewById(R.id.empty);
6796573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        mListView.setEmptyView(empty);
6806573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        mListView.setAdapter(mAdapter);
6816573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        mListView.setOnItemClickListener(this);
682162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        mListView.addEditText(mFolderNamer);
683504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins
6842eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        mAccountAdapter = new ArrayAdapter<BookmarkAccount>(this,
6852eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                android.R.layout.simple_spinner_item);
6862eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        mAccountAdapter.setDropDownViewResource(
6872eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                android.R.layout.simple_spinner_dropdown_item);
6882eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        mAccountSpinner = (Spinner) findViewById(R.id.accounts);
6892eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        mAccountSpinner.setAdapter(mAccountAdapter);
6902eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        mAccountSpinner.setOnItemSelectedListener(this);
6912eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
6922eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
69375630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins        mFakeTitleHolder = findViewById(R.id.title_holder);
69475630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins
695504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        if (!window.getDecorView().isInTouchMode()) {
696504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            mButton.requestFocus();
697504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        }
698504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins
6992eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        getLoaderManager().restartLoader(LOADER_ID_ACCOUNTS, null, this);
700504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    }
701504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins
70275630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins    private void showRemoveButton() {
70375630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins        findViewById(R.id.remove_divider).setVisibility(View.VISIBLE);
70475630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins        mRemoveLink = findViewById(R.id.remove);
70575630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins        mRemoveLink.setVisibility(View.VISIBLE);
70675630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins        mRemoveLink.setOnClickListener(this);
70775630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins    }
70875630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins
709504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    // Called once we have determined which folder is the root folder
710504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    private void onRootFolderFound(long root) {
711504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        mRootFolder = root;
7122eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        mCurrentFolder = mRootFolder;
713b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins        setupTopCrumb();
7142eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        onCurrentFolderFound();
715504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    }
716504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins
717b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins    private void setupTopCrumb() {
7182eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        mCrumbs.clear();
719b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins        String name = getString(R.string.bookmarks);
720b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins        mTopLevelLabel = (TextView) mCrumbs.pushView(name, false,
721b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                new Folder(name, mRootFolder));
722b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins        // To better match the other folders.
723b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins        mTopLevelLabel.setCompoundDrawablePadding(6);
724b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins    }
725b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins
726504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    private void onCurrentFolderFound() {
727052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        LoaderManager manager = getLoaderManager();
7288baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        if (mCurrentFolder != mRootFolder) {
729dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            // Since we're not in the root folder, change the selection to other
730dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            // folder now.  The text will get changed once we select the correct
731dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            // folder.
732504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            mFolder.setSelectionIgnoringSelectionChange(mEditingFolder ? 1 : 2);
733905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins        } else {
734905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins            setShowBookmarkIcon(true);
735504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            if (!mEditingFolder) {
736504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                // Initially the "Bookmarks" folder should be showing, rather than
737504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                // the home screen.  In the editing folder case, home screen is not
738504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                // an option, so "Bookmarks" folder is already at the top.
739504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                mFolder.setSelectionIgnoringSelectionChange(FolderSpinnerAdapter.ROOT_FOLDER);
740504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            }
741052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        }
74252f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        // Find the contents of the current folder
7432eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        manager.restartLoader(LOADER_ID_FOLDER_CONTENTS, null, this);
7448baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins    }
7458baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins
74602065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins    /**
74702065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins     * Runnable to save a bookmark, so it can be performed in its own thread.
74802065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins     */
74902065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins    private class SaveBookmarkRunnable implements Runnable {
750052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        // FIXME: This should be an async task.
75102065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins        private Message mMessage;
752980e99536e2fc6f305432387fe92c9916fa6e7b6Henrik Baard        private Context mContext;
753980e99536e2fc6f305432387fe92c9916fa6e7b6Henrik Baard        public SaveBookmarkRunnable(Context ctx, Message msg) {
754914c5591baeb86bf30a5bc28930071442a822d60Ben Murdoch            mContext = ctx.getApplicationContext();
75502065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            mMessage = msg;
75602065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins        }
75702065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins        public void run() {
75802065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            // Unbundle bookmark data.
75902065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            Bundle bundle = mMessage.getData();
760bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            String title = bundle.getString(BrowserContract.Bookmarks.TITLE);
761bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            String url = bundle.getString(BrowserContract.Bookmarks.URL);
762bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            boolean invalidateThumbnail = bundle.getBoolean(REMOVE_THUMBNAIL);
76302065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            Bitmap thumbnail = invalidateThumbnail ? null
764bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                    : (Bitmap) bundle.getParcelable(BrowserContract.Bookmarks.THUMBNAIL);
765bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            String touchIconUrl = bundle.getString(TOUCH_ICON_URL);
76602065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins
76702065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            // Save to the bookmarks DB.
76802065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            try {
76902065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins                final ContentResolver cr = getContentResolver();
770052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                Bookmarks.addBookmark(AddBookmarkPage.this, false, url,
771af262e703038106aef2e5187d120617836ffe9ceJohn Reck                        title, thumbnail, mCurrentFolder);
77202065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins                if (touchIconUrl != null) {
773980e99536e2fc6f305432387fe92c9916fa6e7b6Henrik Baard                    new DownloadTouchIcon(mContext, cr, url).execute(mTouchIconUrl);
77402065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins                }
77502065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins                mMessage.arg1 = 1;
77602065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            } catch (IllegalStateException e) {
77702065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins                mMessage.arg1 = 0;
77802065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            }
77902065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            mMessage.sendToTarget();
78002065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins        }
78102065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins    }
78202065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins
783c8490818ccb693ed2610366d2e91fb290e40c372John Reck    private static class UpdateBookmarkTask extends AsyncTask<ContentValues, Void, Void> {
784c8490818ccb693ed2610366d2e91fb290e40c372John Reck        Context mContext;
785c8490818ccb693ed2610366d2e91fb290e40c372John Reck        Long mId;
786c8490818ccb693ed2610366d2e91fb290e40c372John Reck
787c8490818ccb693ed2610366d2e91fb290e40c372John Reck        public UpdateBookmarkTask(Context context, long id) {
788914c5591baeb86bf30a5bc28930071442a822d60Ben Murdoch            mContext = context.getApplicationContext();
789c8490818ccb693ed2610366d2e91fb290e40c372John Reck            mId = id;
790c8490818ccb693ed2610366d2e91fb290e40c372John Reck        }
791c8490818ccb693ed2610366d2e91fb290e40c372John Reck
792c8490818ccb693ed2610366d2e91fb290e40c372John Reck        @Override
793c8490818ccb693ed2610366d2e91fb290e40c372John Reck        protected Void doInBackground(ContentValues... params) {
794c8490818ccb693ed2610366d2e91fb290e40c372John Reck            if (params.length != 1) {
795c8490818ccb693ed2610366d2e91fb290e40c372John Reck                throw new IllegalArgumentException("No ContentValues provided!");
796c8490818ccb693ed2610366d2e91fb290e40c372John Reck            }
797c8490818ccb693ed2610366d2e91fb290e40c372John Reck            Uri uri = ContentUris.withAppendedId(BookmarkUtils.getBookmarksUri(mContext), mId);
798c8490818ccb693ed2610366d2e91fb290e40c372John Reck            mContext.getContentResolver().update(
799c8490818ccb693ed2610366d2e91fb290e40c372John Reck                    uri,
800c8490818ccb693ed2610366d2e91fb290e40c372John Reck                    params[0], null, null);
801c8490818ccb693ed2610366d2e91fb290e40c372John Reck            return null;
802c8490818ccb693ed2610366d2e91fb290e40c372John Reck        }
803c8490818ccb693ed2610366d2e91fb290e40c372John Reck    }
804c8490818ccb693ed2610366d2e91fb290e40c372John Reck
8051794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch    private void createHandler() {
8061794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch        if (mHandler == null) {
8071794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch            mHandler = new Handler() {
8081794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                @Override
8091794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                public void handleMessage(Message msg) {
8101794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                    switch (msg.what) {
8111794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                        case SAVE_BOOKMARK:
81202065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins                            if (1 == msg.arg1) {
8131794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                                Toast.makeText(AddBookmarkPage.this, R.string.bookmark_saved,
8141794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                                        Toast.LENGTH_LONG).show();
8151794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                            } else {
8161794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                                Toast.makeText(AddBookmarkPage.this, R.string.bookmark_not_saved,
8171794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                                        Toast.LENGTH_LONG).show();
8181794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                            }
8191794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                            break;
82088d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                        case TOUCH_ICON_DOWNLOADED:
82188d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                            Bundle b = msg.getData();
82288d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                            sendBroadcast(BookmarkUtils.createAddToHomeIntent(
823bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                                    AddBookmarkPage.this,
824bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                                    b.getString(BrowserContract.Bookmarks.URL),
825bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                                    b.getString(BrowserContract.Bookmarks.TITLE),
826bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                                    (Bitmap) b.getParcelable(BrowserContract.Bookmarks.TOUCH_ICON),
827bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                                    (Bitmap) b.getParcelable(BrowserContract.Bookmarks.FAVICON)));
82888d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                            break;
82975630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                        case BOOKMARK_DELETED:
83075630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                            finish();
83175630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                            break;
8321794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                    }
8331794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                }
8341794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch            };
8351794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch        }
8361794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch    }
8371794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch
8380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    /**
8391794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch     * Parse the data entered in the dialog and post a message to update the bookmarks database.
8400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project     */
8410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    boolean save() {
8421794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch        createHandler();
8431794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch
8440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        String title = mTitle.getText().toString().trim();
845eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch        String unfilteredUrl;
8468233facddcc51865d612a919d450db6954aa48e3Michael Kolb        unfilteredUrl = UrlUtils.fixUrl(mAddress.getText().toString());
847eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch
8480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        boolean emptyTitle = title.length() == 0;
8490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        boolean emptyUrl = unfilteredUrl.trim().length() == 0;
8500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        Resources r = getResources();
851c8490818ccb693ed2610366d2e91fb290e40c372John Reck        if (emptyTitle || (emptyUrl && !mEditingFolder)) {
8520c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if (emptyTitle) {
8530c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                mTitle.setError(r.getText(R.string.bookmark_needs_title));
8540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
8550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if (emptyUrl) {
856052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                mAddress.setError(r.getText(R.string.bookmark_needs_url));
8570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
8586e3faea951326f28bd9db6923d777281de1837d1Leon Scroggins III            return false;
859eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch
8600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
861ca12cfa98fdf995c4cf37f487a050d0d4fb261e0Ben Murdoch        String url = unfilteredUrl.trim();
862c8490818ccb693ed2610366d2e91fb290e40c372John Reck        if (!mEditingFolder) {
863c8490818ccb693ed2610366d2e91fb290e40c372John Reck            try {
864c8490818ccb693ed2610366d2e91fb290e40c372John Reck                // We allow bookmarks with a javascript: scheme, but these will in most cases
865c8490818ccb693ed2610366d2e91fb290e40c372John Reck                // fail URI parsing, so don't try it if that's the kind of bookmark we have.
866c8490818ccb693ed2610366d2e91fb290e40c372John Reck
867c8490818ccb693ed2610366d2e91fb290e40c372John Reck                if (!url.toLowerCase().startsWith("javascript:")) {
868c8490818ccb693ed2610366d2e91fb290e40c372John Reck                    URI uriObj = new URI(url);
869c8490818ccb693ed2610366d2e91fb290e40c372John Reck                    String scheme = uriObj.getScheme();
870c8490818ccb693ed2610366d2e91fb290e40c372John Reck                    if (!Bookmarks.urlHasAcceptableScheme(url)) {
871c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        // If the scheme was non-null, let the user know that we
872c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        // can't save their bookmark. If it was null, we'll assume
873c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        // they meant http when we parse it in the WebAddress class.
874c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        if (scheme != null) {
875c8490818ccb693ed2610366d2e91fb290e40c372John Reck                            mAddress.setError(r.getText(R.string.bookmark_cannot_save_url));
876c8490818ccb693ed2610366d2e91fb290e40c372John Reck                            return false;
877c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        }
878c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        WebAddress address;
879c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        try {
880c8490818ccb693ed2610366d2e91fb290e40c372John Reck                            address = new WebAddress(unfilteredUrl);
881c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        } catch (ParseException e) {
882c8490818ccb693ed2610366d2e91fb290e40c372John Reck                            throw new URISyntaxException("", "");
883c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        }
884c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        if (address.getHost().length() == 0) {
885c8490818ccb693ed2610366d2e91fb290e40c372John Reck                            throw new URISyntaxException("", "");
886c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        }
887c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        url = address.toString();
888ca12cfa98fdf995c4cf37f487a050d0d4fb261e0Ben Murdoch                    }
889f2407c682fafef77d568deba9987b193a5f2d361Cary Clark                }
890c8490818ccb693ed2610366d2e91fb290e40c372John Reck            } catch (URISyntaxException e) {
891c8490818ccb693ed2610366d2e91fb290e40c372John Reck                mAddress.setError(r.getText(R.string.bookmark_url_not_valid));
892c8490818ccb693ed2610366d2e91fb290e40c372John Reck                return false;
8930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
8940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
8951794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch
89688d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins        if (mSaveToHomeScreen) {
89788d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            mEditingExisting = false;
89888d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins        }
89988d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins
90088d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins        boolean urlUnmodified = url.equals(mOriginalUrl);
90188d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins
9021794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch        if (mEditingExisting) {
903c8490818ccb693ed2610366d2e91fb290e40c372John Reck            Long id = mMap.getLong(BrowserContract.Bookmarks._ID);
904c8490818ccb693ed2610366d2e91fb290e40c372John Reck            ContentValues values = new ContentValues();
905c8490818ccb693ed2610366d2e91fb290e40c372John Reck            values.put(BrowserContract.Bookmarks.TITLE, title);
906c8490818ccb693ed2610366d2e91fb290e40c372John Reck            values.put(BrowserContract.Bookmarks.PARENT, mCurrentFolder);
907c8490818ccb693ed2610366d2e91fb290e40c372John Reck            if (!mEditingFolder) {
908c8490818ccb693ed2610366d2e91fb290e40c372John Reck                values.put(BrowserContract.Bookmarks.URL, url);
909c8490818ccb693ed2610366d2e91fb290e40c372John Reck                if (!urlUnmodified) {
910c8490818ccb693ed2610366d2e91fb290e40c372John Reck                    values.putNull(BrowserContract.Bookmarks.THUMBNAIL);
911c8490818ccb693ed2610366d2e91fb290e40c372John Reck                }
912c8490818ccb693ed2610366d2e91fb290e40c372John Reck            }
913c8490818ccb693ed2610366d2e91fb290e40c372John Reck            if (values.size() > 0) {
914c8490818ccb693ed2610366d2e91fb290e40c372John Reck                new UpdateBookmarkTask(getApplicationContext(), id).execute(values);
915c8490818ccb693ed2610366d2e91fb290e40c372John Reck            }
916c8490818ccb693ed2610366d2e91fb290e40c372John Reck            setResult(RESULT_OK);
9171794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch        } else {
91888d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            Bitmap thumbnail;
91988d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            Bitmap favicon;
92088d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            if (urlUnmodified) {
921bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                thumbnail = (Bitmap) mMap.getParcelable(
922bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                        BrowserContract.Bookmarks.THUMBNAIL);
923bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                favicon = (Bitmap) mMap.getParcelable(
924bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                        BrowserContract.Bookmarks.FAVICON);
92588d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            } else {
92688d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                thumbnail = null;
92788d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                favicon = null;
92888d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            }
92988d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins
9301794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch            Bundle bundle = new Bundle();
931bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            bundle.putString(BrowserContract.Bookmarks.TITLE, title);
932bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            bundle.putString(BrowserContract.Bookmarks.URL, url);
933bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            bundle.putParcelable(BrowserContract.Bookmarks.FAVICON, favicon);
93488d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins
93588d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            if (mSaveToHomeScreen) {
93688d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                if (mTouchIconUrl != null && urlUnmodified) {
93788d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                    Message msg = Message.obtain(mHandler,
93888d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                            TOUCH_ICON_DOWNLOADED);
93988d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                    msg.setData(bundle);
94088d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                    DownloadTouchIcon icon = new DownloadTouchIcon(this, msg,
941bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                            mMap.getString(USER_AGENT));
94288d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                    icon.execute(mTouchIconUrl);
94388d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                } else {
94488d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                    sendBroadcast(BookmarkUtils.createAddToHomeIntent(this, url,
94588d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                            title, null /*touchIcon*/, favicon));
94688d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                }
94788d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            } else {
948bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                bundle.putParcelable(BrowserContract.Bookmarks.THUMBNAIL, thumbnail);
949bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                bundle.putBoolean(REMOVE_THUMBNAIL, !urlUnmodified);
950bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                bundle.putString(TOUCH_ICON_URL, mTouchIconUrl);
95188d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                // Post a message to write to the DB.
95288d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                Message msg = Message.obtain(mHandler, SAVE_BOOKMARK);
95388d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                msg.setData(bundle);
95488d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                // Start a new thread so as to not slow down the UI
95588d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                Thread t = new Thread(new SaveBookmarkRunnable(getApplicationContext(), msg));
95688d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                t.start();
95788d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            }
9581794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch            setResult(RESULT_OK);
9590a1d838ccd16ac08300bb8ac89b61ee0c956a49bKristian Monsen            LogTag.logBookmarkAdded(url, "bookmarkview");
9600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
9610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        return true;
9620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
963162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins
9642eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    @Override
9652eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    public void onItemSelected(AdapterView<?> parent, View view, int position,
9662eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            long id) {
9672eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        if (mAccountSpinner == parent) {
9682eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            long root = mAccountAdapter.getItem(position).rootFolderId;
9692eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            if (root != mRootFolder) {
9702eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                onRootFolderFound(root);
971e890c903edc8b0eb0f54649f65f6d11a2b9ba009John Reck                mFolderAdapter.clearRecentFolder();
9722eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            }
9732eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        }
9742eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    }
9752eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
9762eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    @Override
9772eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    public void onNothingSelected(AdapterView<?> parent) {
9782eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        // Don't care
9792eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    }
9802eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
981162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins    /*
982162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins     * Class used as a proxy for the InputMethodManager to get to mFolderNamer
983162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins     */
984162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins    public static class CustomListView extends ListView {
985162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        private EditText mEditText;
986162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins
987162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        public void addEditText(EditText editText) {
988162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            mEditText = editText;
989162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        }
990162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins
991162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        public CustomListView(Context context) {
992162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            super(context);
993162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        }
994162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins
995162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        public CustomListView(Context context, AttributeSet attrs) {
996162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            super(context, attrs);
997162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        }
998162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins
999162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        public CustomListView(Context context, AttributeSet attrs, int defStyle) {
1000162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            super(context, attrs, defStyle);
1001162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        }
1002162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins
1003162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        @Override
1004162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        public boolean checkInputConnectionProxy(View view) {
1005162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            return view == mEditText;
1006162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        }
1007162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins    }
10082eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
10093bf3cfbf2938774d2f2ba3d2d6d5928ad95d52bbJohn Reck    static class AccountsLoader extends CursorLoader {
10102eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
10112eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        static final String[] PROJECTION = new String[] {
10122eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            Accounts.ACCOUNT_NAME,
10132eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            Accounts.ACCOUNT_TYPE,
10142eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            Accounts.ROOT_ID,
10152eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        };
10162eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
10172eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        static final int COLUMN_INDEX_ACCOUNT_NAME = 0;
10182eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        static final int COLUMN_INDEX_ACCOUNT_TYPE = 1;
10192eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        static final int COLUMN_INDEX_ROOT_ID = 2;
10202eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
10212eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        public AccountsLoader(Context context) {
10221e9815d4c4864790fde2ad1e216058f922060c92John Reck            super(context, Accounts.CONTENT_URI, PROJECTION, null, null, null);
10232eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        }
10242eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
10252eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    }
10262eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
10279b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck    public static class BookmarkAccount {
10282eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
10292eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        private String mLabel;
10302eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        String accountName, accountType;
10319b8cd1e564984874f2a6f5cc9bdc68cda8aa15ceJohn Reck        public long rootFolderId;
10322eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
10332eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        public BookmarkAccount(Context context, Cursor cursor) {
10342eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            accountName = cursor.getString(
10352eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    AccountsLoader.COLUMN_INDEX_ACCOUNT_NAME);
10362eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            accountType = cursor.getString(
10372eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    AccountsLoader.COLUMN_INDEX_ACCOUNT_TYPE);
10382eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            rootFolderId = cursor.getLong(
10392eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    AccountsLoader.COLUMN_INDEX_ROOT_ID);
10402eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            mLabel = accountName;
10412eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            if (TextUtils.isEmpty(mLabel)) {
10422eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                mLabel = context.getString(R.string.local_bookmarks);
10432eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            }
10442eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        }
10452eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
10462eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        @Override
10472eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        public String toString() {
10482eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            return mLabel;
10492eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        }
10502eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    }
10512eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
10522eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    static class EditBookmarkInfo {
10532eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        long id = -1;
10542eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        long parentId = -1;
10552eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        String parentTitle;
10562eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        String title;
10572eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        String accountName;
10582eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        String accountType;
10592eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
10602eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        long lastUsedId = -1;
10612eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        String lastUsedTitle;
10622eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        String lastUsedAccountName;
10632eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        String lastUsedAccountType;
10642eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    }
10652eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
10662eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    static class EditBookmarkInfoLoader extends AsyncTaskLoader<EditBookmarkInfo> {
10672eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
10682eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        private Context mContext;
10692eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        private Bundle mMap;
10702eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
10712eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        public EditBookmarkInfoLoader(Context context, Bundle bundle) {
10722eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            super(context);
1073914c5591baeb86bf30a5bc28930071442a822d60Ben Murdoch            mContext = context.getApplicationContext();
10742eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            mMap = bundle;
10752eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        }
10762eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
10772eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        @Override
10782eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        public EditBookmarkInfo loadInBackground() {
10792eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            final ContentResolver cr = mContext.getContentResolver();
10802eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            EditBookmarkInfo info = new EditBookmarkInfo();
10812eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            Cursor c = null;
10822eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
10832eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            try {
10842eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                // First, let's lookup the bookmark (check for dupes, get needed info)
10852eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                String url = mMap.getString(BrowserContract.Bookmarks.URL);
10862eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                info.id = mMap.getLong(BrowserContract.Bookmarks._ID, -1);
10872eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                boolean checkForDupe = mMap.getBoolean(CHECK_FOR_DUPE);
10882eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                if (checkForDupe && info.id == -1 && !TextUtils.isEmpty(url)) {
10892eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    c = cr.query(BrowserContract.Bookmarks.CONTENT_URI,
10902eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            new String[] { BrowserContract.Bookmarks._ID},
10912eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            BrowserContract.Bookmarks.URL + "=?",
10922eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            new String[] { url }, null);
10932eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    if (c.getCount() == 1 && c.moveToFirst()) {
10942eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        info.id = c.getLong(0);
10952eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    }
10962eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    c.close();
10972eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                }
10982eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                if (info.id != -1) {
10992eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    c = cr.query(ContentUris.withAppendedId(
11002eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            BrowserContract.Bookmarks.CONTENT_URI, info.id),
11012eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            new String[] {
11022eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            BrowserContract.Bookmarks.PARENT,
11032eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            BrowserContract.Bookmarks.ACCOUNT_NAME,
11042eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            BrowserContract.Bookmarks.ACCOUNT_TYPE,
11052eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            BrowserContract.Bookmarks.TITLE},
11062eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            null, null, null);
11072eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    if (c.moveToFirst()) {
11082eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        info.parentId = c.getLong(0);
11092eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        info.accountName = c.getString(1);
11102eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        info.accountType = c.getString(2);
11112eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        info.title = c.getString(3);
11122eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    }
11132eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    c.close();
11142eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    c = cr.query(ContentUris.withAppendedId(
11152eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            BrowserContract.Bookmarks.CONTENT_URI, info.parentId),
11162eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            new String[] {
11172eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            BrowserContract.Bookmarks.TITLE,},
11182eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            null, null, null);
11192eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    if (c.moveToFirst()) {
11202eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        info.parentTitle = c.getString(0);
11212eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    }
11222eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    c.close();
11232eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                }
11242eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
11252eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                // Figure out the last used folder/account
11262eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                c = cr.query(BrowserContract.Bookmarks.CONTENT_URI,
11272eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        new String[] {
11282eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        BrowserContract.Bookmarks.PARENT,
11292eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        }, null, null,
11302eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        BrowserContract.Bookmarks.DATE_MODIFIED + " DESC LIMIT 1");
11312eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                if (c.moveToFirst()) {
11322eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    long parent = c.getLong(0);
11332eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    c.close();
11342eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    c = cr.query(BrowserContract.Bookmarks.CONTENT_URI,
11352eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            new String[] {
11362eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            BrowserContract.Bookmarks.TITLE,
11372eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            BrowserContract.Bookmarks.ACCOUNT_NAME,
11382eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            BrowserContract.Bookmarks.ACCOUNT_TYPE},
11392eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            BrowserContract.Bookmarks._ID + "=?", new String[] {
11402eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                            Long.toString(parent)}, null);
11412eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    if (c.moveToFirst()) {
11422eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        info.lastUsedId = parent;
11432eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        info.lastUsedTitle = c.getString(0);
11442eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        info.lastUsedAccountName = c.getString(1);
11452eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                        info.lastUsedAccountType = c.getString(2);
11462eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    }
11472eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    c.close();
11482eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                }
11492eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            } finally {
11502eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                if (c != null) {
11512eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                    c.close();
11522eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck                }
11532eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            }
11542eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
11552eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            return info;
11562eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        }
11572eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
11582eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        @Override
11592eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        protected void onStartLoading() {
11602eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck            forceLoad();
11612eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck        }
11622eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
11632eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck    }
11642eec4c34867bbcf2c136f4e6e7f74670360545feJohn Reck
11650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project}
1166