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