AddBookmarkPage.java revision bdff8a72bd9894fc59ca658442e6ead37a56fa5d
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
1925230d7c576c18f40a0feeb7ef8b4a57e2e6240dLeon Scrogginsimport com.android.browser.provider.BrowserProvider2;
20504433a185c3e60110590ce2aacd9b76b204b129Leon Scrogginsimport com.android.browser.addbookmark.FolderSpinner;
21dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scrogginsimport com.android.browser.addbookmark.FolderSpinnerAdapter;
2225230d7c576c18f40a0feeb7ef8b4a57e2e6240dLeon Scroggins
230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.Activity;
24052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.app.LoaderManager;
250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.ContentResolver;
26d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolbimport android.content.ContentUris;
27052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.content.ContentValues;
28052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.content.Context;
29052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.content.CursorLoader;
30052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.content.Loader;
3125230d7c576c18f40a0feeb7ef8b4a57e2e6240dLeon Scrogginsimport android.content.SharedPreferences;
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;
4325230d7c576c18f40a0feeb7ef8b4a57e2e6240dLeon Scrogginsimport android.preference.PreferenceManager;
44052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.provider.BrowserContract;
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;
56052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.widget.CursorAdapter;
570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.EditText;
58052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIimport android.widget.ListView;
590c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.TextView;
600c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.widget.Toast;
610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
62f2407c682fafef77d568deba9987b193a5f2d361Cary Clarkimport java.net.URI;
63f2407c682fafef77d568deba9987b193a5f2d361Cary Clarkimport java.net.URISyntaxException;
6474dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scrogginsimport java.util.Stack;
65052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
66052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins IIIpublic class AddBookmarkPage extends Activity
67052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        implements View.OnClickListener, TextView.OnEditorActionListener,
6874dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins        AdapterView.OnItemClickListener, LoaderManager.LoaderCallbacks<Cursor>,
69504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        BreadCrumbView.Controller, FolderSpinner.OnSetSelectionListener {
700c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
71370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb    public static final long DEFAULT_FOLDER_ID = -1;
72bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins    public static final String TOUCH_ICON_URL = "touch_icon_url";
73bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins    // Place on an edited bookmark to remove the saved thumbnail
74bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins    public static final String REMOVE_THUMBNAIL = "remove_thumbnail";
75bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins    public static final String USER_AGENT = "user_agent";
76bdff8a72bd9894fc59ca658442e6ead37a56fa5dLeon Scroggins    public static final String CHECK_FOR_DUPE = "check_for_dupe";
77370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb
78c8490818ccb693ed2610366d2e91fb290e40c372John Reck    /* package */ static final String EXTRA_EDIT_BOOKMARK = "bookmark";
79c8490818ccb693ed2610366d2e91fb290e40c372John Reck    /* package */ static final String EXTRA_IS_FOLDER = "is_folder";
80c8490818ccb693ed2610366d2e91fb290e40c372John Reck
8174dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins    private static final int MAX_CRUMBS_SHOWN = 2;
8274dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins
830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private final String LOGTAG = "Bookmarks";
840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
85052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    // IDs for the CursorLoaders that are used.
86052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private final int LOADER_ID_FOLDER_CONTENTS = 0;
87052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private final int LOADER_ID_ALL_FOLDERS = 1;
88504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    private final int LOADER_ID_FIND_ROOT = 2;
89504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    private final int LOADER_ID_CHECK_FOR_DUPE = 3;
90052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private EditText    mTitle;
920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private EditText    mAddress;
930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private TextView    mButton;
940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private View        mCancelButton;
950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private boolean     mEditingExisting;
96c8490818ccb693ed2610366d2e91fb290e40c372John Reck    private boolean     mEditingFolder;
970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private Bundle      mMap;
983918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott    private String      mTouchIconUrl;
99aac7aa6fcfcb519755987ec126be066323f589c8Ben Murdoch    private String      mOriginalUrl;
100504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    private FolderSpinner mFolder;
101052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private View mDefaultView;
102052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private View mFolderSelector;
103052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private EditText mFolderNamer;
1040e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins    private View mFolderCancel;
105162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins    private boolean mIsFolderNamerShowing;
106162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins    private View mFolderNamerHolder;
107052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private View mAddNewFolder;
1087e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins    private View mAddSeparator;
109b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins    private long mCurrentFolder;
110052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private FolderAdapter mAdapter;
11174dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins    private BreadCrumbView mCrumbs;
1127e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins    private TextView mFakeTitle;
1137e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins    private View mCrumbHolder;
114162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins    private CustomListView mListView;
11588d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins    private boolean mSaveToHomeScreen;
1160208194e0f9bf88f121b1e762744d66d00755ad3Leon Scroggins    private long mRootFolder;
117905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins    private TextView mTopLevelLabel;
118905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins    private Drawable mHeaderIcon;
11975630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins    private View mRemoveLink;
12075630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins    private View mFakeTitleHolder;
121052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private static class Folder {
122052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        String Name;
123052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        long Id;
124052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        Folder(String name, long id) {
125052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            Name = name;
126052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            Id = id;
127052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        }
128052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    }
1290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
1301794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch    // Message IDs
1311794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch    private static final int SAVE_BOOKMARK = 100;
13288d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins    private static final int TOUCH_ICON_DOWNLOADED = 101;
13375630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins    private static final int BOOKMARK_DELETED = 102;
1341794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch
1351794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch    private Handler mHandler;
1361794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch
137b1402a5c3e1617867c58d32d1fe9782cf6de423fBjorn Bringert    private InputMethodManager getInputMethodManager() {
138b1402a5c3e1617867c58d32d1fe9782cf6de423fBjorn Bringert        return (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
139b1402a5c3e1617867c58d32d1fe9782cf6de423fBjorn Bringert    }
140b1402a5c3e1617867c58d32d1fe9782cf6de423fBjorn Bringert
1418baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins    private Uri getUriForFolder(long folder) {
1428baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        Uri uri;
1438baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        if (folder == mRootFolder) {
1448baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins            uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER;
1458baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        } else {
1468baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins            uri = BrowserContract.Bookmarks.buildFolderUri(folder);
1478baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        }
1488baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        String[] accountInfo = getAccountNameAndType(this);
1498baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        if (accountInfo != null) {
1508baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins            uri = BookmarksLoader.addAccount(uri, accountInfo[1], accountInfo[0]);
1518baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        }
1528baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        return uri;
1538baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins    }
1548baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins
155052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    @Override
15674dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins    public void onTop(int level, Object data) {
15774dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins        if (null == data) return;
15852f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        Folder folderData = (Folder) data;
15952f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        long folder = folderData.Id;
16074dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins        LoaderManager manager = getLoaderManager();
16174dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins        CursorLoader loader = (CursorLoader) ((Loader) manager.getLoader(
16274dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins                LOADER_ID_FOLDER_CONTENTS));
1638baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        loader.setUri(getUriForFolder(folder));
16474dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins        loader.forceLoad();
165162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        if (mIsFolderNamerShowing) {
1666573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins            completeOrCancelFolderNaming(true);
1676573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        }
168905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins        setShowBookmarkIcon(level == 1);
169905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins    }
170905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins
171905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins    /**
172905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins     * Show or hide the icon for bookmarks next to "Bookmarks" in the crumb view.
173905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins     * @param show True if the icon should visible, false otherwise.
174905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins     */
175905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins    private void setShowBookmarkIcon(boolean show) {
176905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins        Drawable drawable = show ? mHeaderIcon: null;
177905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins        mTopLevelLabel.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);
17874dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins    }
17974dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins
18074dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins    @Override
181052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
182052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        if (v == mFolderNamer) {
183052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            if (v.getText().length() > 0) {
184052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                if (actionId == EditorInfo.IME_NULL) {
185052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                    // Only want to do this once.
186052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                    if (event.getAction() == KeyEvent.ACTION_UP) {
1876573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins                        completeOrCancelFolderNaming(false);
188052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                    }
189052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                }
1900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
19131829b941ca8ac02a828619440cb62b64673caa8Michael Kolb            // Steal the key press; otherwise a newline will be added
19231829b941ca8ac02a828619440cb62b64673caa8Michael Kolb            return true;
1930c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
194052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        return false;
195052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    }
1960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
19752f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins    private void switchToDefaultView(boolean changedFolder) {
19852f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        mFolderSelector.setVisibility(View.GONE);
19952f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        mDefaultView.setVisibility(View.VISIBLE);
20052f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        mCrumbHolder.setVisibility(View.GONE);
20175630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins        mFakeTitleHolder.setVisibility(View.VISIBLE);
20252f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        if (changedFolder) {
20352f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins            Object data = mCrumbs.getTopData();
20452f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins            if (data != null) {
20552f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins                Folder folder = (Folder) data;
20652f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins                mCurrentFolder = folder.Id;
207dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins                if (mCurrentFolder == mRootFolder) {
208dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins                    // The Spinner changed to show "Other folder ..."  Change
209dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins                    // it back to "Bookmarks", which is position 0 if we are
210dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins                    // editing a folder, 1 otherwise.
211504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                    mFolder.setSelectionIgnoringSelectionChange(mEditingFolder ? 0 : 1);
212dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins                } else {
213dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins                    ((TextView) mFolder.getSelectedView()).setText(folder.Name);
214dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins                }
215dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            }
216dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins        } else {
217dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            // The user canceled selecting a folder.  Revert back to the earlier
218dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            // selection.
219dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            if (mSaveToHomeScreen) {
220504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                mFolder.setSelectionIgnoringSelectionChange(0);
221dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            } else {
222b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                if (mCurrentFolder == mRootFolder) {
223b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                    mFolder.setSelectionIgnoringSelectionChange(mEditingFolder ? 0 : 1);
224b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                } else {
225b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                    Object data = mCrumbs.getTopData();
226b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                    if (data != null && ((Folder) data).Id == mCurrentFolder) {
227b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        // We are showing the correct folder heirarchy. The
228b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        // folder selector will say "Other folder..."  Change it
229b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        // to say the name of the folder once again.
230b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        ((TextView) mFolder.getSelectedView()).setText(((Folder) data).Name);
231b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                    } else {
232b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        // We are not be showing the correct folder heirarchy.
233b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        // Clear the Crumbs and find the proper folder
234b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        mCrumbs.clear();
235b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        setupTopCrumb();
236b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        LoaderManager manager = getLoaderManager();
237b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        manager.restartLoader(LOADER_ID_ALL_FOLDERS, null, this);
238b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                        manager.restartLoader(LOADER_ID_FOLDER_CONTENTS, null, this);
239b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins
240b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                    }
241b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                }
24252f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins            }
24352f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        }
24452f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins    }
24552f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins
246052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    @Override
247052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    public void onClick(View v) {
248052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        if (v == mButton) {
249052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            if (mFolderSelector.getVisibility() == View.VISIBLE) {
25052f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins                // We are showing the folder selector.
251162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins                if (mIsFolderNamerShowing) {
2526573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins                    completeOrCancelFolderNaming(false);
253d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb                } else {
254d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb                    // User has selected a folder.  Go back to the opening page
25588d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                    mSaveToHomeScreen = false;
25652f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins                    switchToDefaultView(true);
257d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb                }
258052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            } else if (save()) {
259052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                finish();
260052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            }
261052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        } else if (v == mCancelButton) {
262162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            if (mIsFolderNamerShowing) {
2636573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins                completeOrCancelFolderNaming(true);
26452f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins            } else if (mFolderSelector.getVisibility() == View.VISIBLE) {
26552f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins                switchToDefaultView(false);
266d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb            } else {
267d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb                finish();
268d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb            }
2690e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins        } else if (v == mFolderCancel) {
2700e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins            completeOrCancelFolderNaming(true);
271052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        } else if (v == mAddNewFolder) {
272162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            setShowFolderNamer(true);
273052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            mFolderNamer.setText(R.string.new_folder);
274052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            mFolderNamer.requestFocus();
275d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb            mAddNewFolder.setVisibility(View.GONE);
2767e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins            mAddSeparator.setVisibility(View.GONE);
277162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            InputMethodManager imm = getInputMethodManager();
278162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            // Set the InputMethodManager to focus on the ListView so that it
279162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            // can transfer the focus to mFolderNamer.
280162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            imm.focusIn(mListView);
281162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            imm.showSoftInput(mFolderNamer, InputMethodManager.SHOW_IMPLICIT);
28275630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins        } else if (v == mRemoveLink) {
28375630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins            if (!mEditingExisting) {
28475630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                throw new AssertionError("Remove button should not be shown for"
28575630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                        + " new bookmarks");
28675630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins            }
28775630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins            long id = mMap.getLong(BrowserContract.Bookmarks._ID);
28875630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins            createHandler();
28975630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins            Message msg = Message.obtain(mHandler, BOOKMARK_DELETED);
29075630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins            BookmarkUtils.displayRemoveBookmarkDialog(id,
29175630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                    mTitle.getText().toString(), this, msg);
292052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        }
293052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    }
294052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
295504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    // FolderSpinner.OnSetSelectionListener
296504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins
29788d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins    @Override
298504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    public void onSetSelection(long id) {
299dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins        int intId = (int) id;
300dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins        switch (intId) {
301dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            case FolderSpinnerAdapter.ROOT_FOLDER:
3020208194e0f9bf88f121b1e762744d66d00755ad3Leon Scroggins                mCurrentFolder = mRootFolder;
30388d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                mSaveToHomeScreen = false;
30488d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                break;
305dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            case FolderSpinnerAdapter.HOME_SCREEN:
30688d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                // Create a short cut to the home screen
30788d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                mSaveToHomeScreen = true;
30888d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                break;
309dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            case FolderSpinnerAdapter.OTHER_FOLDER:
31088d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                switchToFolderSelector();
31188d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                break;
31288d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            default:
313dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins                break;
31488d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins        }
315dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins    }
316dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins
3170e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins    /**
3180e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins     * Finish naming a folder, and close the IME
3190e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins     * @param cancel If true, the new folder is not created.  If false, the new
3200e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins     *      folder is created and the user is taken inside it.
3210e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins     */
3226573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins    private void completeOrCancelFolderNaming(boolean cancel) {
3236573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        if (!cancel && !TextUtils.isEmpty(mFolderNamer.getText())) {
32431829b941ca8ac02a828619440cb62b64673caa8Michael Kolb            String name = mFolderNamer.getText().toString();
32531829b941ca8ac02a828619440cb62b64673caa8Michael Kolb            long id = addFolderToCurrent(mFolderNamer.getText().toString());
32631829b941ca8ac02a828619440cb62b64673caa8Michael Kolb            descendInto(name, id);
32731829b941ca8ac02a828619440cb62b64673caa8Michael Kolb        }
328162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        setShowFolderNamer(false);
3296573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        mAddNewFolder.setVisibility(View.VISIBLE);
3306573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        mAddSeparator.setVisibility(View.VISIBLE);
3316573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        getInputMethodManager().hideSoftInputFromWindow(
332162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins                mListView.getWindowToken(), 0);
33331829b941ca8ac02a828619440cb62b64673caa8Michael Kolb    }
33431829b941ca8ac02a828619440cb62b64673caa8Michael Kolb
335d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb    private long addFolderToCurrent(String name) {
336d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        // Add the folder to the database
337d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        ContentValues values = new ContentValues();
338d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        values.put(BrowserContract.Bookmarks.TITLE,
339d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb                name);
340d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        values.put(BrowserContract.Bookmarks.IS_FOLDER, 1);
3418baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        String[] accountInfo = getAccountNameAndType(this);
3428baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        if (accountInfo != null) {
3438baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins            values.put(BrowserContract.Bookmarks.ACCOUNT_TYPE, accountInfo[1]);
3448baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins            values.put(BrowserContract.Bookmarks.ACCOUNT_NAME, accountInfo[0]);
345e89daa99d144e8cba904f3733147daea093875ccJohn Reck        }
34652f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        long currentFolder;
34752f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        Object data = mCrumbs.getTopData();
34852f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        if (data != null) {
34952f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins            currentFolder = ((Folder) data).Id;
35052f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        } else {
3510208194e0f9bf88f121b1e762744d66d00755ad3Leon Scroggins            currentFolder = mRootFolder;
35252f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        }
35352f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        values.put(BrowserContract.Bookmarks.PARENT, currentFolder);
354d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        Uri uri = getContentResolver().insert(
355d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb                BrowserContract.Bookmarks.CONTENT_URI, values);
356d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        if (uri != null) {
357d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb            return ContentUris.parseId(uri);
358d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        } else {
359d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb            return -1;
360d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        }
361d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb    }
362d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb
363052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private void switchToFolderSelector() {
364dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins        // Set the list to the top in case it is scrolled.
365dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins        mListView.setSelection(0);
366052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mDefaultView.setVisibility(View.GONE);
367052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mFolderSelector.setVisibility(View.VISIBLE);
3687e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins        mCrumbHolder.setVisibility(View.VISIBLE);
36975630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins        mFakeTitleHolder.setVisibility(View.GONE);
3707e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins        mAddNewFolder.setVisibility(View.VISIBLE);
3717e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins        mAddSeparator.setVisibility(View.VISIBLE);
372052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    }
373052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
374d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb    private void descendInto(String foldername, long id) {
375370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb        if (id != DEFAULT_FOLDER_ID) {
37652f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins            mCrumbs.pushView(foldername, new Folder(foldername, id));
37774dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins            mCrumbs.notifyController();
378d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb        }
379d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb    }
380d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb
381052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    @Override
382052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
383052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        String[] projection;
384052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        switch (id) {
385504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            case LOADER_ID_CHECK_FOR_DUPE:
386504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                projection = new String[] {
387504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        BrowserContract.Bookmarks._ID,
388504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        BrowserContract.Bookmarks.PARENT,
389504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        BrowserContract.Bookmarks.TITLE
390504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                };
391504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                return new CursorLoader(this,
392504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        BookmarkUtils.getBookmarksUri(this),
393504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        projection,
394504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        BrowserContract.Bookmarks.URL + " = ?",
395504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        new String[] { mOriginalUrl },
396504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        null);
397504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            case LOADER_ID_FIND_ROOT:
398504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                String name = args.getString(BrowserBookmarksPage.PREF_ACCOUNT_NAME);
399504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                String type = args.getString(BrowserBookmarksPage.PREF_ACCOUNT_TYPE);
400504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins
401504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                projection = new String[] { BrowserContract.Bookmarks._ID };
402504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                String selection = BrowserContract.ChromeSyncColumns.SERVER_UNIQUE + "=? AND "
403504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        + BrowserContract.Bookmarks.ACCOUNT_NAME + "=? AND "
404504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        + BrowserContract.Bookmarks.ACCOUNT_TYPE + "=?";
405504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                String[] selArgs = new String[] {
406504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        BrowserContract.ChromeSyncColumns.FOLDER_NAME_BOOKMARKS_BAR,
407504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        name,
408504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        type
409504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                };
410504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                return new CursorLoader(this,
411504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        BrowserContract.Bookmarks.CONTENT_URI,
412504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        projection,
413504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        selection,
414504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        selArgs,
415504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                        null);
416052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            case LOADER_ID_ALL_FOLDERS:
417052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                projection = new String[] {
418052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        BrowserContract.Bookmarks._ID,
419052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        BrowserContract.Bookmarks.PARENT,
420052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        BrowserContract.Bookmarks.TITLE,
421052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        BrowserContract.Bookmarks.IS_FOLDER
422052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                };
423052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                return new CursorLoader(this,
424052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        BrowserContract.Bookmarks.CONTENT_URI,
425052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        projection,
426052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        BrowserContract.Bookmarks.IS_FOLDER + " != 0",
427052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        null,
428052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        null);
429052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            case LOADER_ID_FOLDER_CONTENTS:
430052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                projection = new String[] {
431052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        BrowserContract.Bookmarks._ID,
432052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        BrowserContract.Bookmarks.TITLE,
433052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        BrowserContract.Bookmarks.IS_FOLDER
434052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                };
435c112990af09d3e15f8503b863f1d8088c258995eLeon Scroggins                String where = BrowserContract.Bookmarks.IS_FOLDER + " != 0";
436c112990af09d3e15f8503b863f1d8088c258995eLeon Scroggins                if (mEditingFolder) {
437c112990af09d3e15f8503b863f1d8088c258995eLeon Scroggins                    where += " AND " + BrowserContract.Bookmarks._ID + " != "
438c112990af09d3e15f8503b863f1d8088c258995eLeon Scroggins                            + mMap.getLong(BrowserContract.Bookmarks._ID);
439c112990af09d3e15f8503b863f1d8088c258995eLeon Scroggins                }
440052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                return new CursorLoader(this,
4418baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins                        getUriForFolder(mCurrentFolder),
442052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        projection,
443c112990af09d3e15f8503b863f1d8088c258995eLeon Scroggins                        where,
444052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        null,
4458baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins                        BrowserContract.Bookmarks._ID + " ASC");
446052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            default:
447052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                throw new AssertionError("Asking for nonexistant loader!");
448052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        }
449052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    }
450052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
451052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    @Override
452052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
453052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        switch (loader.getId()) {
454504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            case LOADER_ID_CHECK_FOR_DUPE:
455504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                if (cursor != null && cursor.moveToFirst()) {
456504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                    // Site is bookmarked.
457504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                    mEditingExisting = true;
45875630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                    showRemoveButton();
459504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                    mFakeTitle.setText(R.string.edit_bookmark);
460504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                    int index = cursor.getColumnIndexOrThrow(
461504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                            BrowserContract.Bookmarks.PARENT);
462504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                    mCurrentFolder = cursor.getLong(index);
463504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                    index = cursor.getColumnIndexOrThrow(
464504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                            BrowserContract.Bookmarks.TITLE);
465504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                    String title = cursor.getString(index);
466504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                    mTitle.setText(title);
467504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                    index = cursor.getColumnIndexOrThrow(
468504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                            BrowserContract.Bookmarks._ID);
469504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                    long id = cursor.getLong(index);
470504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                    mMap.putLong(BrowserContract.Bookmarks._ID, id);
471504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                }
472504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                onCurrentFolderFound();
473504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                getLoaderManager().destroyLoader(LOADER_ID_CHECK_FOR_DUPE);
474504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                break;
475504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            case LOADER_ID_FIND_ROOT:
476504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                long root;
477504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                if (cursor != null && cursor.moveToFirst()) {
478504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                    root = cursor.getLong(0);
479504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                } else {
480504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                    root = BrowserProvider2.FIXED_ID_ROOT;
481504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                }
482504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                onRootFolderFound(root);
483504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                getLoaderManager().destroyLoader(LOADER_ID_FIND_ROOT);
484504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                break;
485052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            case LOADER_ID_FOLDER_CONTENTS:
486052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                mAdapter.changeCursor(cursor);
487052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                break;
488052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            case LOADER_ID_ALL_FOLDERS:
489052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                long parent = mCurrentFolder;
490052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                int idIndex = cursor.getColumnIndexOrThrow(
491052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        BrowserContract.Bookmarks._ID);
492052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                int titleIndex = cursor.getColumnIndexOrThrow(
493052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        BrowserContract.Bookmarks.TITLE);
494052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                int parentIndex = cursor.getColumnIndexOrThrow(
495052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        BrowserContract.Bookmarks.PARENT);
4968baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins                // If the user is editing anything inside the "Other Bookmarks"
4978baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins                // folder, we need to stop searching up when we reach its parent.
4988baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins                // Find the root folder
4998baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins                moveCursorToFolder(cursor, mRootFolder, idIndex);
5008baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins                // omniparent is the folder which contains root, and therefore
5018baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins                // also the parent of the "Other Bookmarks" folder.
5028baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins                long omniparent = cursor.getLong(parentIndex);
5038baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins                Stack<Folder> folderStack = new Stack<Folder>();
5048baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins                while ((parent != mRootFolder) && (parent != 0) && (parent != omniparent)) {
505052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                    // First, find the folder corresponding to the current
506052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                    // folder
5078baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins                    moveCursorToFolder(cursor, parent, idIndex);
508052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                    String name = cursor.getString(titleIndex);
50952f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins                    if (parent == mCurrentFolder) {
510dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins                        ((TextView) mFolder.getSelectedView()).setText(name);
51152f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins                    }
51274dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins                    folderStack.push(new Folder(name, parent));
513052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                    parent = cursor.getLong(parentIndex);
514052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                }
51574dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins                while (!folderStack.isEmpty()) {
5168baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins                    Folder thisFolder = folderStack.pop();
51752f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins                    mCrumbs.pushView(thisFolder.Name, thisFolder);
51874dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins                }
51971e76c71d8fb70433a60521dfdbcd4e7a8762ef8Dianne Hackborn                getLoaderManager().destroyLoader(LOADER_ID_ALL_FOLDERS);
520052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                break;
521052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            default:
522052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                break;
523052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        }
524052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    }
525052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
52639772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn    public void onLoaderReset(Loader<Cursor> loader) {
52739772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn        switch (loader.getId()) {
52839772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn            case LOADER_ID_FOLDER_CONTENTS:
52939772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn                mAdapter.changeCursor(null);
53039772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn                break;
53139772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn        }
53239772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn    }
53339772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn
5340208194e0f9bf88f121b1e762744d66d00755ad3Leon Scroggins    /**
5358baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     * Move cursor to the position that has folderToFind as its "_id".
5368baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     * @param cursor Cursor containing folders in the bookmarks database
5378baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     * @param folderToFind "_id" of the folder to move to.
5388baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     * @param idIndex Index in cursor of "_id"
5398baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     * @throws AssertionError if cursor is empty or there is no row with folderToFind
5408baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     *      as its "_id".
5418baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     */
5428baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins    void moveCursorToFolder(Cursor cursor, long folderToFind, int idIndex)
5438baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins            throws AssertionError {
5448baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        if (!cursor.moveToFirst()) {
5458baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins            throw new AssertionError("No folders in the database!");
5468baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        }
5478baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        long folder;
5488baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        do {
5498baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins            folder = cursor.getLong(idIndex);
5508baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        } while (folder != folderToFind && cursor.moveToNext());
5518baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        if (cursor.isAfterLast()) {
5528baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins            throw new AssertionError("Folder(id=" + folderToFind
5538baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins                    + ") holding this bookmark does not exist!");
5548baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        }
5558baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins    }
5568baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins
557052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    @Override
558052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    public void onItemClick(AdapterView<?> parent, View view, int position,
559052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            long id) {
560d14cb123f8d80896d568104f0f776be8cdc1aa60Leon Scroggins        TextView tv = (TextView) view.findViewById(android.R.id.text1);
561052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        // Switch to the folder that was clicked on.
562d14cb123f8d80896d568104f0f776be8cdc1aa60Leon Scroggins        descendInto(tv.getText().toString(), id);
563052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    }
564052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
565162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins    private void setShowFolderNamer(boolean show) {
566162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        if (show != mIsFolderNamerShowing) {
567162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            mIsFolderNamerShowing = show;
568162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            if (show) {
569162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins                // Set the selection to the folder namer so it will be in
570162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins                // view.
571162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins                mListView.addFooterView(mFolderNamerHolder);
572162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            } else {
573162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins                mListView.removeFooterView(mFolderNamerHolder);
574162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            }
575162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            // Refresh the list.
576162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            mListView.setAdapter(mAdapter);
577162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            if (show) {
578162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins                mListView.setSelection(mListView.getCount() - 1);
579162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            }
580162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        }
581162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins    }
582162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins
583052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    /**
584052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III     * Shows a list of names of folders.
585052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III     */
586052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    private class FolderAdapter extends CursorAdapter {
587052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        public FolderAdapter(Context context) {
588052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            super(context, null);
5890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
590052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
591052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        @Override
592052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        public void bindView(View view, Context context, Cursor cursor) {
593052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            ((TextView) view.findViewById(android.R.id.text1)).setText(
594052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                    cursor.getString(cursor.getColumnIndexOrThrow(
595052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                    BrowserContract.Bookmarks.TITLE)));
596052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        }
597052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
598052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        @Override
599052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        public View newView(Context context, Cursor cursor, ViewGroup parent) {
600d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb            View view = LayoutInflater.from(context).inflate(
601d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb                    R.layout.folder_list_item, null);
602d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb            view.setBackgroundDrawable(context.getResources().
603d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb                    getDrawable(android.R.drawable.list_selector_background));
604d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb            return view;
605052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        }
6066573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins
6076573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        @Override
6086573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        public boolean isEmpty() {
6096573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins            // Do not show the empty view if the user is creating a new folder.
610162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            return super.isEmpty() && !mIsFolderNamerShowing;
6116573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        }
612052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III    }
6130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
614c112990af09d3e15f8503b863f1d8088c258995eLeon Scroggins    @Override
6150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    protected void onCreate(Bundle icicle) {
6160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        super.onCreate(icicle);
6177453ff26de5948543979f5921eb8917284e8e5c4Leon Scroggins        requestWindowFeature(Window.FEATURE_NO_TITLE);
618eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch
619eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch        mMap = getIntent().getExtras();
620eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch
621052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        setContentView(R.layout.browser_add_bookmark);
622eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch
62376a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III        Window window = getWindow();
624d40ac1afadfbba82bc266eebc029f3c99884c9a3Michael Kolb
6250c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        String title = null;
6260c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        String url = null;
627eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch
62852f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        mFakeTitle = (TextView) findViewById(R.id.fake_title);
62952f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins
6300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        if (mMap != null) {
631c8490818ccb693ed2610366d2e91fb290e40c372John Reck            Bundle b = mMap.getBundle(EXTRA_EDIT_BOOKMARK);
6320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if (b != null) {
633c8490818ccb693ed2610366d2e91fb290e40c372John Reck                mEditingFolder = mMap.getBoolean(EXTRA_IS_FOLDER, false);
6340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                mMap = b;
6350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                mEditingExisting = true;
6367e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins                mFakeTitle.setText(R.string.edit_bookmark);
637c8490818ccb693ed2610366d2e91fb290e40c372John Reck                if (mEditingFolder) {
638c8490818ccb693ed2610366d2e91fb290e40c372John Reck                    findViewById(R.id.row_address).setVisibility(View.GONE);
63975630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                } else {
64075630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                    showRemoveButton();
641c8490818ccb693ed2610366d2e91fb290e40c372John Reck                }
64276a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III            } else {
64376a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III                int gravity = mMap.getInt("gravity", -1);
64476a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III                if (gravity != -1) {
64576a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III                    WindowManager.LayoutParams l = window.getAttributes();
64676a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III                    l.gravity = gravity;
64776a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III                    window.setAttributes(l);
64876a0e9ce21bc3ad4798f5f76b36b1d514e3595beLeon Scroggins III                }
6490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
650bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            title = mMap.getString(BrowserContract.Bookmarks.TITLE);
651bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            url = mOriginalUrl = mMap.getString(BrowserContract.Bookmarks.URL);
652bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            mTouchIconUrl = mMap.getString(TOUCH_ICON_URL);
653370a4f3e47b740fd10b9028aae9e87e17254caa8Michael Kolb            mCurrentFolder = mMap.getLong(BrowserContract.Bookmarks.PARENT, DEFAULT_FOLDER_ID);
65425230d7c576c18f40a0feeb7ef8b4a57e2e6240dLeon Scroggins        }
6550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
6560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        mTitle = (EditText) findViewById(R.id.title);
6570c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        mTitle.setText(title);
658eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch
659052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mAddress = (EditText) findViewById(R.id.address);
660052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mAddress.setText(url);
6610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
6620c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        mButton = (TextView) findViewById(R.id.OK);
663052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mButton.setOnClickListener(this);
6640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
6650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        mCancelButton = findViewById(R.id.cancel);
666052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mCancelButton.setOnClickListener(this);
667052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
668504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        mFolder = (FolderSpinner) findViewById(R.id.folder);
669dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins        mFolder.setAdapter(new FolderSpinnerAdapter(!mEditingFolder));
670504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        mFolder.setOnSetSelectionListener(this);
671052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
672052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mDefaultView = findViewById(R.id.default_view);
673052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mFolderSelector = findViewById(R.id.folder_selector);
674052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
675162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        mFolderNamerHolder = getLayoutInflater().inflate(R.layout.new_folder_layout, null);
676162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        mFolderNamer = (EditText) mFolderNamerHolder.findViewById(R.id.folder_namer);
677052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mFolderNamer.setOnEditorActionListener(this);
6780e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins        mFolderCancel = mFolderNamerHolder.findViewById(R.id.close);
6790e3a7b8dd64b064871a40e65a5c59f969759b320Leon Scroggins        mFolderCancel.setOnClickListener(this);
680052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
681052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mAddNewFolder = findViewById(R.id.add_new_folder);
682052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mAddNewFolder.setOnClickListener(this);
6837e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins        mAddSeparator = findViewById(R.id.add_divider);
684052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III
68574dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins        mCrumbs = (BreadCrumbView) findViewById(R.id.crumbs);
68674dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins        mCrumbs.setUseBackButton(true);
68774dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins        mCrumbs.setController(this);
6885a72f1858c2f73be3558c6cdaa2c84b4c36fa748Michael Kolb        mHeaderIcon = getResources().getDrawable(R.drawable.ic_folder_holo_dark);
6897e5f735150ad3fa89305a32889356ff94e453851Leon Scroggins        mCrumbHolder = findViewById(R.id.crumb_holder);
69089f73c1146f474641881e3e20c77cfbfc18fa313John Reck        mCrumbs.setMaxVisible(MAX_CRUMBS_SHOWN);
69174dbe014c9be6ebbba80f1f08aec12d15254fcc7Leon Scroggins
692052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        mAdapter = new FolderAdapter(this);
693162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        mListView = (CustomListView) findViewById(R.id.list);
6946573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        View empty = findViewById(R.id.empty);
6956573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        mListView.setEmptyView(empty);
6966573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        mListView.setAdapter(mAdapter);
6976573f9edd734c8dc42251840d6f693058ca4dfd8Leon Scroggins        mListView.setOnItemClickListener(this);
698162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        mListView.addEditText(mFolderNamer);
699504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins
70075630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins        mFakeTitleHolder = findViewById(R.id.title_holder);
70175630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins
702504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        if (!window.getDecorView().isInTouchMode()) {
703504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            mButton.requestFocus();
704504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        }
705504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins
706504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        String[] accountInfo = getAccountNameAndType(this);
707504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        if (accountInfo == null) {
708504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            onRootFolderFound(BrowserProvider2.FIXED_ID_ROOT);
709504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        } else {
710504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            Bundle args = new Bundle();
711504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            args.putString(BrowserBookmarksPage.PREF_ACCOUNT_NAME, accountInfo[0]);
712504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            args.putString(BrowserBookmarksPage.PREF_ACCOUNT_TYPE, accountInfo[1]);
713504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            getLoaderManager().initLoader(LOADER_ID_FIND_ROOT, args, this);
714504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        }
715504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins
716504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    }
717504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins
71875630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins    private void showRemoveButton() {
71975630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins        findViewById(R.id.remove_divider).setVisibility(View.VISIBLE);
72075630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins        mRemoveLink = findViewById(R.id.remove);
72175630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins        mRemoveLink.setVisibility(View.VISIBLE);
72275630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins        mRemoveLink.setOnClickListener(this);
72375630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins    }
72475630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins
725504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    // Called once we have determined which folder is the root folder
726504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    private void onRootFolderFound(long root) {
727504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        mRootFolder = root;
728504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        if (mCurrentFolder == DEFAULT_FOLDER_ID) {
729504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            mCurrentFolder = mRootFolder;
730504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        }
731b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins        setupTopCrumb();
732bdff8a72bd9894fc59ca658442e6ead37a56fa5dLeon Scroggins        if (mEditingExisting || TextUtils.isEmpty(mOriginalUrl)
733bdff8a72bd9894fc59ca658442e6ead37a56fa5dLeon Scroggins                || !(mMap != null && mMap.getBoolean(CHECK_FOR_DUPE))) {
734504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            onCurrentFolderFound();
735504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        } else {
736504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            // User is attempting to bookmark a site, rather than deliberately
737504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            // editing a bookmark.  Rather than let them create a duplicate
738504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            // bookmark, see if the bookmark already exists.
739504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            getLoaderManager().initLoader(LOADER_ID_CHECK_FOR_DUPE, null, this);
740504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins        }
741504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    }
742504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins
743b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins    private void setupTopCrumb() {
744b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins        String name = getString(R.string.bookmarks);
745b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins        mTopLevelLabel = (TextView) mCrumbs.pushView(name, false,
746b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins                new Folder(name, mRootFolder));
747b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins        // To better match the other folders.
748b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins        mTopLevelLabel.setCompoundDrawablePadding(6);
749b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins    }
750b3ae88082b13dfdd021f57d1242814cb6e3fdc0cLeon Scroggins
751504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins    private void onCurrentFolderFound() {
752052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        LoaderManager manager = getLoaderManager();
7538baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        if (mCurrentFolder != mRootFolder) {
754052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            // Find all the folders
755052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III            manager.initLoader(LOADER_ID_ALL_FOLDERS, null, this);
756dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            // Since we're not in the root folder, change the selection to other
757dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            // folder now.  The text will get changed once we select the correct
758dd13bad0ea5e01b6689a61145327febea4bfde8aLeon Scroggins            // folder.
759504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            mFolder.setSelectionIgnoringSelectionChange(mEditingFolder ? 1 : 2);
760905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins        } else {
761905250c0e82e89a08b9e4670f1e3a806cb4d2fb8Leon Scroggins            setShowBookmarkIcon(true);
762504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            if (!mEditingFolder) {
763504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                // Initially the "Bookmarks" folder should be showing, rather than
764504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                // the home screen.  In the editing folder case, home screen is not
765504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                // an option, so "Bookmarks" folder is already at the top.
766504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins                mFolder.setSelectionIgnoringSelectionChange(FolderSpinnerAdapter.ROOT_FOLDER);
767504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins            }
768052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        }
76952f7daafdd225359cca972e766f0ebaba6ae9beeLeon Scroggins        // Find the contents of the current folder
770052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        manager.initLoader(LOADER_ID_FOLDER_CONTENTS, null, this);
771504433a185c3e60110590ce2aacd9b76b204b129Leon Scroggins}
7728baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins    /**
7738baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     * Get the account name and type of the currently synced account.
7748baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     * @param context Context to access preferences.
7758baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     * @return null if no account name or type.  Otherwise, the result will be
7768baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     *      an array of two Strings, the accountName and accountType, respectively.
7778baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins     */
7788baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins    private String[] getAccountNameAndType(Context context) {
7798baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
7808baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        String accountName = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_NAME, null);
7818baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        String accountType = prefs.getString(BrowserBookmarksPage.PREF_ACCOUNT_TYPE, null);
7828baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        if (TextUtils.isEmpty(accountName) || TextUtils.isEmpty(accountType)) {
7838baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins            return null;
7848baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        }
7858baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins        return new String[] { accountName, accountType };
7868baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins    }
7878baaa63db013de227b7d054a6dd0901a1314d6d7Leon Scroggins
78802065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins    /**
78902065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins     * Runnable to save a bookmark, so it can be performed in its own thread.
79002065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins     */
79102065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins    private class SaveBookmarkRunnable implements Runnable {
792052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III        // FIXME: This should be an async task.
79302065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins        private Message mMessage;
794980e99536e2fc6f305432387fe92c9916fa6e7b6Henrik Baard        private Context mContext;
795980e99536e2fc6f305432387fe92c9916fa6e7b6Henrik Baard        public SaveBookmarkRunnable(Context ctx, Message msg) {
796980e99536e2fc6f305432387fe92c9916fa6e7b6Henrik Baard            mContext = ctx;
79702065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            mMessage = msg;
79802065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins        }
79902065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins        public void run() {
80002065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            // Unbundle bookmark data.
80102065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            Bundle bundle = mMessage.getData();
802bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            String title = bundle.getString(BrowserContract.Bookmarks.TITLE);
803bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            String url = bundle.getString(BrowserContract.Bookmarks.URL);
804bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            boolean invalidateThumbnail = bundle.getBoolean(REMOVE_THUMBNAIL);
80502065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            Bitmap thumbnail = invalidateThumbnail ? null
806bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                    : (Bitmap) bundle.getParcelable(BrowserContract.Bookmarks.THUMBNAIL);
807bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            String touchIconUrl = bundle.getString(TOUCH_ICON_URL);
80802065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins
80902065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            // Save to the bookmarks DB.
81002065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            try {
81102065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins                final ContentResolver cr = getContentResolver();
812052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                Bookmarks.addBookmark(AddBookmarkPage.this, false, url,
813052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                        title, thumbnail, true, mCurrentFolder);
81402065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins                if (touchIconUrl != null) {
815980e99536e2fc6f305432387fe92c9916fa6e7b6Henrik Baard                    new DownloadTouchIcon(mContext, cr, url).execute(mTouchIconUrl);
81602065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins                }
81702065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins                mMessage.arg1 = 1;
81802065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            } catch (IllegalStateException e) {
81902065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins                mMessage.arg1 = 0;
82002065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            }
82102065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins            mMessage.sendToTarget();
82202065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins        }
82302065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins    }
82402065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins
825c8490818ccb693ed2610366d2e91fb290e40c372John Reck    private static class UpdateBookmarkTask extends AsyncTask<ContentValues, Void, Void> {
826c8490818ccb693ed2610366d2e91fb290e40c372John Reck        Context mContext;
827c8490818ccb693ed2610366d2e91fb290e40c372John Reck        Long mId;
828c8490818ccb693ed2610366d2e91fb290e40c372John Reck
829c8490818ccb693ed2610366d2e91fb290e40c372John Reck        public UpdateBookmarkTask(Context context, long id) {
830c8490818ccb693ed2610366d2e91fb290e40c372John Reck            mContext = context;
831c8490818ccb693ed2610366d2e91fb290e40c372John Reck            mId = id;
832c8490818ccb693ed2610366d2e91fb290e40c372John Reck        }
833c8490818ccb693ed2610366d2e91fb290e40c372John Reck
834c8490818ccb693ed2610366d2e91fb290e40c372John Reck        @Override
835c8490818ccb693ed2610366d2e91fb290e40c372John Reck        protected Void doInBackground(ContentValues... params) {
836c8490818ccb693ed2610366d2e91fb290e40c372John Reck            if (params.length != 1) {
837c8490818ccb693ed2610366d2e91fb290e40c372John Reck                throw new IllegalArgumentException("No ContentValues provided!");
838c8490818ccb693ed2610366d2e91fb290e40c372John Reck            }
839c8490818ccb693ed2610366d2e91fb290e40c372John Reck            Uri uri = ContentUris.withAppendedId(BookmarkUtils.getBookmarksUri(mContext), mId);
840c8490818ccb693ed2610366d2e91fb290e40c372John Reck            mContext.getContentResolver().update(
841c8490818ccb693ed2610366d2e91fb290e40c372John Reck                    uri,
842c8490818ccb693ed2610366d2e91fb290e40c372John Reck                    params[0], null, null);
843c8490818ccb693ed2610366d2e91fb290e40c372John Reck            return null;
844c8490818ccb693ed2610366d2e91fb290e40c372John Reck        }
845c8490818ccb693ed2610366d2e91fb290e40c372John Reck    }
846c8490818ccb693ed2610366d2e91fb290e40c372John Reck
8471794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch    private void createHandler() {
8481794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch        if (mHandler == null) {
8491794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch            mHandler = new Handler() {
8501794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                @Override
8511794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                public void handleMessage(Message msg) {
8521794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                    switch (msg.what) {
8531794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                        case SAVE_BOOKMARK:
85402065b07aea6b4392c344a4172c3ab56019225edLeon Scroggins                            if (1 == msg.arg1) {
8551794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                                Toast.makeText(AddBookmarkPage.this, R.string.bookmark_saved,
8561794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                                        Toast.LENGTH_LONG).show();
8571794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                            } else {
8581794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                                Toast.makeText(AddBookmarkPage.this, R.string.bookmark_not_saved,
8591794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                                        Toast.LENGTH_LONG).show();
8601794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                            }
8611794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                            break;
86288d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                        case TOUCH_ICON_DOWNLOADED:
86388d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                            Bundle b = msg.getData();
86488d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                            sendBroadcast(BookmarkUtils.createAddToHomeIntent(
865bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                                    AddBookmarkPage.this,
866bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                                    b.getString(BrowserContract.Bookmarks.URL),
867bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                                    b.getString(BrowserContract.Bookmarks.TITLE),
868bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                                    (Bitmap) b.getParcelable(BrowserContract.Bookmarks.TOUCH_ICON),
869bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                                    (Bitmap) b.getParcelable(BrowserContract.Bookmarks.FAVICON)));
87088d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                            break;
87175630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                        case BOOKMARK_DELETED:
87275630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                            finish();
87375630678154c89662b7f8e5fb19d0b77a2d7abb8Leon Scroggins                            break;
8741794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                    }
8751794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch                }
8761794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch            };
8771794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch        }
8781794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch    }
8791794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch
8800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    /**
8811794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch     * Parse the data entered in the dialog and post a message to update the bookmarks database.
8820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project     */
8830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    boolean save() {
8841794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch        createHandler();
8851794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch
8860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        String title = mTitle.getText().toString().trim();
887eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch        String unfilteredUrl;
8888233facddcc51865d612a919d450db6954aa48e3Michael Kolb        unfilteredUrl = UrlUtils.fixUrl(mAddress.getText().toString());
889eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch
8900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        boolean emptyTitle = title.length() == 0;
8910c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        boolean emptyUrl = unfilteredUrl.trim().length() == 0;
8920c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        Resources r = getResources();
893c8490818ccb693ed2610366d2e91fb290e40c372John Reck        if (emptyTitle || (emptyUrl && !mEditingFolder)) {
8940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if (emptyTitle) {
8950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                mTitle.setError(r.getText(R.string.bookmark_needs_title));
8960c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
8970c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            if (emptyUrl) {
898052ce667ce77c4fb3208c0b0dacba7be79c072d9Leon Scroggins III                mAddress.setError(r.getText(R.string.bookmark_needs_url));
8990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
9006e3faea951326f28bd9db6923d777281de1837d1Leon Scroggins III            return false;
901eecb4e6cb64af03aad3f9facdbf6fd7190091b41Ben Murdoch
9020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
903ca12cfa98fdf995c4cf37f487a050d0d4fb261e0Ben Murdoch        String url = unfilteredUrl.trim();
904c8490818ccb693ed2610366d2e91fb290e40c372John Reck        if (!mEditingFolder) {
905c8490818ccb693ed2610366d2e91fb290e40c372John Reck            try {
906c8490818ccb693ed2610366d2e91fb290e40c372John Reck                // We allow bookmarks with a javascript: scheme, but these will in most cases
907c8490818ccb693ed2610366d2e91fb290e40c372John Reck                // fail URI parsing, so don't try it if that's the kind of bookmark we have.
908c8490818ccb693ed2610366d2e91fb290e40c372John Reck
909c8490818ccb693ed2610366d2e91fb290e40c372John Reck                if (!url.toLowerCase().startsWith("javascript:")) {
910c8490818ccb693ed2610366d2e91fb290e40c372John Reck                    URI uriObj = new URI(url);
911c8490818ccb693ed2610366d2e91fb290e40c372John Reck                    String scheme = uriObj.getScheme();
912c8490818ccb693ed2610366d2e91fb290e40c372John Reck                    if (!Bookmarks.urlHasAcceptableScheme(url)) {
913c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        // If the scheme was non-null, let the user know that we
914c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        // can't save their bookmark. If it was null, we'll assume
915c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        // they meant http when we parse it in the WebAddress class.
916c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        if (scheme != null) {
917c8490818ccb693ed2610366d2e91fb290e40c372John Reck                            mAddress.setError(r.getText(R.string.bookmark_cannot_save_url));
918c8490818ccb693ed2610366d2e91fb290e40c372John Reck                            return false;
919c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        }
920c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        WebAddress address;
921c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        try {
922c8490818ccb693ed2610366d2e91fb290e40c372John Reck                            address = new WebAddress(unfilteredUrl);
923c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        } catch (ParseException e) {
924c8490818ccb693ed2610366d2e91fb290e40c372John Reck                            throw new URISyntaxException("", "");
925c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        }
926c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        if (address.getHost().length() == 0) {
927c8490818ccb693ed2610366d2e91fb290e40c372John Reck                            throw new URISyntaxException("", "");
928c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        }
929c8490818ccb693ed2610366d2e91fb290e40c372John Reck                        url = address.toString();
930ca12cfa98fdf995c4cf37f487a050d0d4fb261e0Ben Murdoch                    }
931f2407c682fafef77d568deba9987b193a5f2d361Cary Clark                }
932c8490818ccb693ed2610366d2e91fb290e40c372John Reck            } catch (URISyntaxException e) {
933c8490818ccb693ed2610366d2e91fb290e40c372John Reck                mAddress.setError(r.getText(R.string.bookmark_url_not_valid));
934c8490818ccb693ed2610366d2e91fb290e40c372John Reck                return false;
9350c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
9360c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
9371794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch
93888d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins        if (mSaveToHomeScreen) {
93988d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            mEditingExisting = false;
94088d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins        }
94188d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins
94288d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins        boolean urlUnmodified = url.equals(mOriginalUrl);
94388d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins
9441794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch        if (mEditingExisting) {
945c8490818ccb693ed2610366d2e91fb290e40c372John Reck            Long id = mMap.getLong(BrowserContract.Bookmarks._ID);
946c8490818ccb693ed2610366d2e91fb290e40c372John Reck            ContentValues values = new ContentValues();
947c8490818ccb693ed2610366d2e91fb290e40c372John Reck            values.put(BrowserContract.Bookmarks.TITLE, title);
948c8490818ccb693ed2610366d2e91fb290e40c372John Reck            values.put(BrowserContract.Bookmarks.PARENT, mCurrentFolder);
949c8490818ccb693ed2610366d2e91fb290e40c372John Reck            if (!mEditingFolder) {
950c8490818ccb693ed2610366d2e91fb290e40c372John Reck                values.put(BrowserContract.Bookmarks.URL, url);
951c8490818ccb693ed2610366d2e91fb290e40c372John Reck                if (!urlUnmodified) {
952c8490818ccb693ed2610366d2e91fb290e40c372John Reck                    values.putNull(BrowserContract.Bookmarks.THUMBNAIL);
953c8490818ccb693ed2610366d2e91fb290e40c372John Reck                }
954c8490818ccb693ed2610366d2e91fb290e40c372John Reck            }
955c8490818ccb693ed2610366d2e91fb290e40c372John Reck            if (values.size() > 0) {
956c8490818ccb693ed2610366d2e91fb290e40c372John Reck                new UpdateBookmarkTask(getApplicationContext(), id).execute(values);
957c8490818ccb693ed2610366d2e91fb290e40c372John Reck            }
958c8490818ccb693ed2610366d2e91fb290e40c372John Reck            setResult(RESULT_OK);
9591794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch        } else {
96088d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            Bitmap thumbnail;
96188d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            Bitmap favicon;
96288d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            if (urlUnmodified) {
963bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                thumbnail = (Bitmap) mMap.getParcelable(
964bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                        BrowserContract.Bookmarks.THUMBNAIL);
965bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                favicon = (Bitmap) mMap.getParcelable(
966bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                        BrowserContract.Bookmarks.FAVICON);
96788d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            } else {
96888d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                thumbnail = null;
96988d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                favicon = null;
97088d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            }
97188d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins
9721794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch            Bundle bundle = new Bundle();
973bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            bundle.putString(BrowserContract.Bookmarks.TITLE, title);
974bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            bundle.putString(BrowserContract.Bookmarks.URL, url);
975bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins            bundle.putParcelable(BrowserContract.Bookmarks.FAVICON, favicon);
97688d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins
97788d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            if (mSaveToHomeScreen) {
97888d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                if (mTouchIconUrl != null && urlUnmodified) {
97988d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                    Message msg = Message.obtain(mHandler,
98088d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                            TOUCH_ICON_DOWNLOADED);
98188d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                    msg.setData(bundle);
98288d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                    DownloadTouchIcon icon = new DownloadTouchIcon(this, msg,
983bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                            mMap.getString(USER_AGENT));
98488d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                    icon.execute(mTouchIconUrl);
98588d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                } else {
98688d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                    sendBroadcast(BookmarkUtils.createAddToHomeIntent(this, url,
98788d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                            title, null /*touchIcon*/, favicon));
98888d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                }
98988d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            } else {
990bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                bundle.putParcelable(BrowserContract.Bookmarks.THUMBNAIL, thumbnail);
991bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                bundle.putBoolean(REMOVE_THUMBNAIL, !urlUnmodified);
992bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins                bundle.putString(TOUCH_ICON_URL, mTouchIconUrl);
99388d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                // Post a message to write to the DB.
99488d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                Message msg = Message.obtain(mHandler, SAVE_BOOKMARK);
99588d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                msg.setData(bundle);
99688d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                // Start a new thread so as to not slow down the UI
99788d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                Thread t = new Thread(new SaveBookmarkRunnable(getApplicationContext(), msg));
99888d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins                t.start();
99988d080394ca18120e05c6926b178fd6843ff9cecLeon Scroggins            }
10001794fe252866c311f3b4700a2a1e44e843962243Ben Murdoch            setResult(RESULT_OK);
10010a1d838ccd16ac08300bb8ac89b61ee0c956a49bKristian Monsen            LogTag.logBookmarkAdded(url, "bookmarkview");
10020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
10030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        return true;
10040c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
1005162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins
1006162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins    /*
1007162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins     * Class used as a proxy for the InputMethodManager to get to mFolderNamer
1008162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins     */
1009162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins    public static class CustomListView extends ListView {
1010162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        private EditText mEditText;
1011162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins
1012162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        public void addEditText(EditText editText) {
1013162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            mEditText = editText;
1014162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        }
1015162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins
1016162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        public CustomListView(Context context) {
1017162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            super(context);
1018162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        }
1019162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins
1020162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        public CustomListView(Context context, AttributeSet attrs) {
1021162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            super(context, attrs);
1022162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        }
1023162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins
1024162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        public CustomListView(Context context, AttributeSet attrs, int defStyle) {
1025162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            super(context, attrs, defStyle);
1026162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        }
1027162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins
1028162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        @Override
1029162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        public boolean checkInputConnectionProxy(View view) {
1030162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins            return view == mEditText;
1031162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins        }
1032162f8357656638b6ad9789098a180ea47b26800bLeon Scroggins    }
10330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project}
1034