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