blob: d4d1c0dc45a8ecbc35cee768ad7ba59775677984 [file] [log] [blame]
The Android Open Source Project0c908882009-03-03 19:32:16 -08001/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.browser;
18
19import android.app.Activity;
Jeff Hamilton64144e42010-08-18 16:31:59 -050020import android.app.Fragment;
Jeff Hamilton84029622010-08-05 14:29:28 -050021import android.app.LoaderManager;
Dianne Hackborneb07b172010-08-26 22:18:14 -070022import android.content.ClipData;
Michael Kolbbef7a752010-08-25 17:11:35 -070023import android.content.ClipboardManager;
Jeff Hamilton84029622010-08-05 14:29:28 -050024import android.content.ContentUris;
Dianne Hackborn80f32622010-08-05 14:17:53 -070025import android.content.Context;
John Reck71efc2b2011-05-09 16:54:28 -070026import android.content.CursorLoader;
The Android Open Source Project0c908882009-03-03 19:32:16 -080027import android.content.Intent;
Jeff Hamilton84029622010-08-05 14:29:28 -050028import android.content.Loader;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050029import android.content.SharedPreferences;
John Reck8af90642010-11-23 10:27:29 -080030import android.content.SharedPreferences.Editor;
John Reckb3417f02011-01-14 11:01:05 -080031import android.content.res.Configuration;
32import android.content.res.Resources;
Jeff Hamilton84029622010-08-05 14:29:28 -050033import android.database.Cursor;
The Android Open Source Project0c908882009-03-03 19:32:16 -080034import android.graphics.Bitmap;
Jeff Hamilton84029622010-08-05 14:29:28 -050035import android.graphics.BitmapFactory;
36import android.net.Uri;
John Reckc8490812010-11-22 14:15:36 -080037import android.os.AsyncTask;
The Android Open Source Project0c908882009-03-03 19:32:16 -080038import android.os.Bundle;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050039import android.preference.PreferenceManager;
Jeff Hamilton69bd7072010-08-17 12:38:22 -050040import android.provider.BrowserContract;
John Reck71efc2b2011-05-09 16:54:28 -070041import android.provider.BrowserContract.Accounts;
John Reck1cebb442010-12-10 12:02:16 -080042import android.provider.BrowserContract.ChromeSyncColumns;
John Recke7c97de2011-05-27 14:42:43 -070043import android.view.ActionMode;
The Android Open Source Project0c908882009-03-03 19:32:16 -080044import android.view.ContextMenu;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050045import android.view.ContextMenu.ContextMenuInfo;
Jeff Hamilton64144e42010-08-18 16:31:59 -050046import android.view.LayoutInflater;
John Reckb3417f02011-01-14 11:01:05 -080047import android.view.Menu;
The Android Open Source Project0c908882009-03-03 19:32:16 -080048import android.view.MenuInflater;
49import android.view.MenuItem;
50import android.view.View;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -050051import android.view.ViewGroup;
Patrick Scottc1cf63a2010-03-09 16:02:08 -050052import android.webkit.WebIconDatabase.IconListener;
John Reck71efc2b2011-05-09 16:54:28 -070053import android.widget.ExpandableListView;
54import android.widget.ExpandableListView.OnChildClickListener;
John Recke7c97de2011-05-27 14:42:43 -070055import android.widget.ImageView;
56import android.widget.LinearLayout;
John Reck8af90642010-11-23 10:27:29 -080057import android.widget.ListView;
John Reck608baa72010-11-24 10:32:28 -080058import android.widget.PopupMenu.OnMenuItemClickListener;
Jeff Hamilton84029622010-08-05 14:29:28 -050059import android.widget.Toast;
The Android Open Source Project0c908882009-03-03 19:32:16 -080060
John Recke7c97de2011-05-27 14:42:43 -070061import com.android.browser.BookmarkDragHandler.BookmarkDragController;
62import com.android.browser.BookmarkDragHandler.BookmarkDragState;
63import com.android.browser.view.BookmarkExpandableGridView;
64import com.android.browser.view.BookmarkExpandableGridView.BookmarkContextMenuInfo;
65
John Reck71efc2b2011-05-09 16:54:28 -070066import java.util.HashMap;
67
John Reck608baa72010-11-24 10:32:28 -080068interface BookmarksPageCallbacks {
69 // Return true if handled
70 boolean onBookmarkSelected(Cursor c, boolean isFolder);
71 // Return true if handled
72 boolean onOpenInNewWindow(Cursor c);
73}
74
The Android Open Source Project0c908882009-03-03 19:32:16 -080075/**
76 * View showing the user's bookmarks in the browser.
77 */
Jeff Hamilton64144e42010-08-18 16:31:59 -050078public class BrowserBookmarksPage extends Fragment implements View.OnCreateContextMenuListener,
John Reck71efc2b2011-05-09 16:54:28 -070079 LoaderManager.LoaderCallbacks<Cursor>, IconListener,
80 BreadCrumbView.Controller, OnMenuItemClickListener, OnChildClickListener {
The Android Open Source Project0c908882009-03-03 19:32:16 -080081
John Recke7c97de2011-05-27 14:42:43 -070082 public static class ExtraDragState {
83 public int childPosition;
84 public int groupPosition;
85 }
86
Jeff Hamilton84029622010-08-05 14:29:28 -050087 static final String LOGTAG = "browser";
Nicolas Catania095292f2010-03-15 09:00:14 -070088
John Reck71efc2b2011-05-09 16:54:28 -070089 static final int LOADER_ACCOUNTS = 1;
90 static final int LOADER_BOOKMARKS = 100;
Jeff Hamilton84029622010-08-05 14:29:28 -050091
Michael Kolb801ecb72010-08-25 12:57:38 -070092 static final String EXTRA_DISABLE_WINDOW = "disable_new_window";
93
John Reck71efc2b2011-05-09 16:54:28 -070094 static final String ACCOUNT_TYPE = "account_type";
95 static final String ACCOUNT_NAME = "account_name";
96
John Reck8af90642010-11-23 10:27:29 -080097 static final int VIEW_THUMBNAILS = 1;
98 static final int VIEW_LIST = 2;
99 static final String PREF_SELECTED_VIEW = "bookmarks_view";
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500100
John Reck608baa72010-11-24 10:32:28 -0800101 BookmarksPageCallbacks mCallbacks;
John Reck0ce8a942011-01-14 19:57:09 -0800102 View mRoot;
John Reck71efc2b2011-05-09 16:54:28 -0700103 BookmarkExpandableGridView mGrid;
John Reck8af90642010-11-23 10:27:29 -0800104 ListView mList;
Jeff Hamilton84029622010-08-05 14:29:28 -0500105 boolean mDisableNewWindow;
John Reck608baa72010-11-24 10:32:28 -0800106 boolean mEnableContextMenu = true;
Jeff Hamilton84029622010-08-05 14:29:28 -0500107 View mEmptyView;
John Reck8af90642010-11-23 10:27:29 -0800108 int mCurrentView;
John Reck608baa72010-11-24 10:32:28 -0800109 View mHeader;
John Reck71efc2b2011-05-09 16:54:28 -0700110 HashMap<Integer, BrowserBookmarksAdapter> mBookmarkAdapters = new HashMap<Integer, BrowserBookmarksAdapter>();
John Reck66302e52011-05-18 17:12:33 -0700111 BookmarkDragHandler mDragHandler;
Michael Kolb370a4f32010-10-06 10:45:32 -0700112
John Reck608baa72010-11-24 10:32:28 -0800113 static BrowserBookmarksPage newInstance(BookmarksPageCallbacks cb,
114 Bundle args, ViewGroup headerContainer) {
Michael Kolbe421c242010-10-04 19:29:01 -0700115 BrowserBookmarksPage bbp = new BrowserBookmarksPage();
116 bbp.mCallbacks = cb;
117 bbp.setArguments(args);
118 return bbp;
119 }
120
Jeff Hamilton84029622010-08-05 14:29:28 -0500121 @Override
122 public Loader<Cursor> onCreateLoader(int id, Bundle args) {
John Reck71efc2b2011-05-09 16:54:28 -0700123 if (id == LOADER_ACCOUNTS) {
124 return new AccountsLoader(getActivity());
125 } else if (id >= LOADER_BOOKMARKS) {
126 String accountType = args.getString(ACCOUNT_TYPE);
127 String accountName = args.getString(ACCOUNT_NAME);
128 BookmarksLoader bl = new BookmarksLoader(getActivity(),
129 accountType, accountName);
130 return bl;
131 } else {
132 throw new UnsupportedOperationException("Unknown loader id " + id);
Jeff Hamilton84029622010-08-05 14:29:28 -0500133 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500134 }
135
136 @Override
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500137 public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
John Reck71efc2b2011-05-09 16:54:28 -0700138 if (loader.getId() == LOADER_ACCOUNTS) {
139 LoaderManager lm = getLoaderManager();
140 int id = LOADER_BOOKMARKS;
141 while (cursor.moveToNext()) {
142 String accountName = cursor.getString(0);
143 String accountType = cursor.getString(1);
144 Bundle args = new Bundle();
145 args.putString(ACCOUNT_NAME, accountName);
146 args.putString(ACCOUNT_TYPE, accountType);
147 BrowserBookmarksAdapter adapter = new BrowserBookmarksAdapter(
148 getActivity(), mCurrentView);
149 mBookmarkAdapters.put(id, adapter);
150 mGrid.addAccount(accountName, adapter);
151 lm.restartLoader(id, args, this);
152 id++;
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500153 }
John Reck71efc2b2011-05-09 16:54:28 -0700154 // TODO: Figure out what a reload of these means
155 // Currently, a reload is triggered whenever bookmarks change
156 // This is less than ideal
157 // It also causes UI flickering as a new adapter is created
158 // instead of re-using an existing one when the account_name is the
159 // same.
160 // For now, this is a one-shot load
161 getLoaderManager().destroyLoader(LOADER_ACCOUNTS);
162 } else if (loader.getId() >= LOADER_BOOKMARKS) {
163 BrowserBookmarksAdapter adapter = mBookmarkAdapters.get(loader.getId());
164 adapter.changeCursor(cursor);
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500165 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500166 }
167
John Reck522a4382011-01-26 13:23:47 -0800168 @Override
Dianne Hackborn39772c82010-12-16 00:43:54 -0800169 public void onLoaderReset(Loader<Cursor> loader) {
John Reck71efc2b2011-05-09 16:54:28 -0700170 // TODO: Figure out what to do here (if anything?)
Dianne Hackborn39772c82010-12-16 00:43:54 -0800171 }
172
Michael Kolb370a4f32010-10-06 10:45:32 -0700173 long getFolderId() {
174 LoaderManager manager = getLoaderManager();
175 BookmarksLoader loader =
John Reck608baa72010-11-24 10:32:28 -0800176 (BookmarksLoader) ((Loader<?>)manager.getLoader(LOADER_BOOKMARKS));
Michael Kolb370a4f32010-10-06 10:45:32 -0700177
178 Uri uri = loader.getUri();
179 if (uri != null) {
180 try {
181 return ContentUris.parseId(uri);
182 } catch (NumberFormatException nfx) {
183 return -1;
184 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500185 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700186 return -1;
187 }
188
The Android Open Source Project0c908882009-03-03 19:32:16 -0800189 @Override
190 public boolean onContextItemSelected(MenuItem item) {
John Reck71efc2b2011-05-09 16:54:28 -0700191 BookmarkContextMenuInfo i = (BookmarkContextMenuInfo)item.getMenuInfo();
The Android Open Source Project0c908882009-03-03 19:32:16 -0800192 // If we have no menu info, we can't tell which item was selected.
193 if (i == null) {
Leon Scrogginsc8cae082010-11-03 18:51:46 -0400194 return false;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800195 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700196
John Recke7c97de2011-05-27 14:42:43 -0700197 if (handleContextItem(item.getItemId(), i.groupPosition, i.childPosition)) {
198 return true;
199 }
200 return super.onContextItemSelected(item);
201 }
202
203 public boolean handleContextItem(int itemId, int groupPosition,
204 int childPosition) {
205 final Activity activity = getActivity();
206 BrowserBookmarksAdapter adapter = getChildAdapter(groupPosition);
207
208 switch (itemId) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800209 case R.id.open_context_menu_id:
John Recke7c97de2011-05-27 14:42:43 -0700210 loadUrl(adapter, childPosition);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800211 break;
212 case R.id.edit_context_menu_id:
John Recke7c97de2011-05-27 14:42:43 -0700213 editBookmark(adapter, childPosition);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800214 break;
215 case R.id.shortcut_context_menu_id:
John Recke7c97de2011-05-27 14:42:43 -0700216 Cursor c = adapter.getItem(childPosition);
John Reck608baa72010-11-24 10:32:28 -0800217 activity.sendBroadcast(createShortcutIntent(getActivity(), c));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800218 break;
219 case R.id.delete_context_menu_id:
John Recke7c97de2011-05-27 14:42:43 -0700220 displayRemoveBookmarkDialog(adapter, childPosition);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800221 break;
222 case R.id.new_window_context_menu_id:
John Recke7c97de2011-05-27 14:42:43 -0700223 openInNewWindow(adapter, childPosition);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800224 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500225 case R.id.share_link_context_menu_id: {
John Recke7c97de2011-05-27 14:42:43 -0700226 Cursor cursor = adapter.getItem(childPosition);
Michael Kolb8233fac2010-10-26 16:08:53 -0700227 Controller.sharePage(activity,
Jeff Hamilton84029622010-08-05 14:29:28 -0500228 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE),
229 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL),
230 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON),
231 getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_THUMBNAIL));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800232 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500233 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800234 case R.id.copy_url_context_menu_id:
John Recke7c97de2011-05-27 14:42:43 -0700235 copy(getUrl(adapter, childPosition));
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400236 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500237 case R.id.homepage_context_menu_id: {
John Recke7c97de2011-05-27 14:42:43 -0700238 BrowserSettings.getInstance().setHomePage(getUrl(adapter, childPosition));
Jeff Hamilton64144e42010-08-18 16:31:59 -0500239 Toast.makeText(activity, R.string.homepage_set, Toast.LENGTH_LONG).show();
Leon Scrogginsfeb941d2009-05-28 17:27:38 -0400240 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500241 }
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400242 // Only for the Most visited page
Jeff Hamilton84029622010-08-05 14:29:28 -0500243 case R.id.save_to_bookmarks_menu_id: {
John Recke7c97de2011-05-27 14:42:43 -0700244 Cursor cursor = adapter.getItem(childPosition);
Jeff Hamilton84029622010-08-05 14:29:28 -0500245 String name = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
246 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400247 // If the site is bookmarked, the item becomes remove from
248 // bookmarks.
Jeff Hamilton64144e42010-08-18 16:31:59 -0500249 Bookmarks.removeFromBookmarks(activity, activity.getContentResolver(), url, name);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400250 break;
Jeff Hamilton84029622010-08-05 14:29:28 -0500251 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800252 default:
John Recke7c97de2011-05-27 14:42:43 -0700253 return false;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800254 }
255 return true;
256 }
257
John Reck608baa72010-11-24 10:32:28 -0800258 static Bitmap getBitmap(Cursor cursor, int columnIndex) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500259 byte[] data = cursor.getBlob(columnIndex);
260 if (data == null) {
261 return null;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800262 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500263 return BitmapFactory.decodeByteArray(data, 0, data.length);
264 }
265
John Reckc8490812010-11-22 14:15:36 -0800266 private MenuItem.OnMenuItemClickListener mContextItemClickListener =
267 new MenuItem.OnMenuItemClickListener() {
268 @Override
269 public boolean onMenuItemClick(MenuItem item) {
270 return onContextItemSelected(item);
271 }
272 };
273
Jeff Hamilton84029622010-08-05 14:29:28 -0500274 @Override
John Reckb3417f02011-01-14 11:01:05 -0800275 public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
276 inflater.inflate(R.menu.bookmark, menu);
John Recka5176f32011-05-17 12:35:37 -0700277 if (!BrowserActivity.isTablet(getActivity())) {
John Reck9d27ff52011-02-11 17:47:54 -0800278 MenuItem item = menu.findItem(R.id.add_bookmark);
279 item.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
280 }
John Reckb3417f02011-01-14 11:01:05 -0800281 }
282
283 @Override
Jeff Hamilton84029622010-08-05 14:29:28 -0500284 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
John Reck71efc2b2011-05-09 16:54:28 -0700285 BookmarkContextMenuInfo info = (BookmarkContextMenuInfo) menuInfo;
286 BrowserBookmarksAdapter adapter = getChildAdapter(info.groupPosition);
287 Cursor cursor = adapter.getItem(info.childPosition);
John Reck1cebb442010-12-10 12:02:16 -0800288 if (!canEdit(cursor)) {
289 return;
290 }
Leon Scroggins5e8a40f2010-09-27 17:13:35 -0400291 boolean isFolder
292 = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
Michael Kolb801ecb72010-08-25 12:57:38 -0700293
Jeff Hamilton64144e42010-08-18 16:31:59 -0500294 final Activity activity = getActivity();
295 MenuInflater inflater = activity.getMenuInflater();
Jeff Hamilton84029622010-08-05 14:29:28 -0500296 inflater.inflate(R.menu.bookmarkscontext, menu);
John Reckc8490812010-11-22 14:15:36 -0800297 if (isFolder) {
298 menu.setGroupVisible(R.id.FOLDER_CONTEXT_MENU, true);
299 } else {
300 menu.setGroupVisible(R.id.BOOKMARK_CONTEXT_MENU, true);
301 if (mDisableNewWindow) {
302 menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
303 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500304 }
John Reckc8490812010-11-22 14:15:36 -0800305 BookmarkItem header = new BookmarkItem(activity);
306 populateBookmarkItem(cursor, header, isFolder);
John Reckc8490812010-11-22 14:15:36 -0800307 menu.setHeaderView(header);
Jeff Hamilton84029622010-08-05 14:29:28 -0500308
John Reckc8490812010-11-22 14:15:36 -0800309 int count = menu.size();
310 for (int i = 0; i < count; i++) {
311 menu.getItem(i).setOnMenuItemClickListener(mContextItemClickListener);
Jeff Hamilton84029622010-08-05 14:29:28 -0500312 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500313 }
314
John Reck1cebb442010-12-10 12:02:16 -0800315 boolean canEdit(Cursor c) {
316 String unique = c.getString(BookmarksLoader.COLUMN_INDEX_SERVER_UNIQUE);
317 return !ChromeSyncColumns.FOLDER_NAME_OTHER_BOOKMARKS.equals(unique);
318 }
319
John Reckc8490812010-11-22 14:15:36 -0800320 private void populateBookmarkItem(Cursor cursor, BookmarkItem item, boolean isFolder) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500321 item.setName(cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
John Reckc8490812010-11-22 14:15:36 -0800322 if (isFolder) {
323 item.setUrl(null);
324 Bitmap bitmap =
Michael Kolb5a72f182011-01-13 20:35:06 -0800325 BitmapFactory.decodeResource(getResources(), R.drawable.ic_folder_holo_dark);
John Reckc8490812010-11-22 14:15:36 -0800326 item.setFavicon(bitmap);
John Reck60e33362010-12-02 17:52:38 -0800327 new LookupBookmarkCount(getActivity(), item)
328 .execute(cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
John Reckc8490812010-11-22 14:15:36 -0800329 } else {
330 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
331 item.setUrl(url);
332 Bitmap bitmap = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
333 if (bitmap == null) {
334 bitmap = CombinedBookmarkHistoryView.getIconListenerSet().getFavicon(url);
335 }
336 item.setFavicon(bitmap);
Jeff Hamilton84029622010-08-05 14:29:28 -0500337 }
Jeff Hamilton84029622010-08-05 14:29:28 -0500338 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800339
340 /**
341 * Create a new BrowserBookmarksPage.
Nicolas Catania095292f2010-03-15 09:00:14 -0700342 */
The Android Open Source Project0c908882009-03-03 19:32:16 -0800343 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500344 public void onCreate(Bundle icicle) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800345 super.onCreate(icicle);
John Reck8f295d12011-03-18 15:25:18 -0700346 SharedPreferences prefs = PreferenceManager
John Reck71efc2b2011-05-09 16:54:28 -0700347 .getDefaultSharedPreferences(getActivity());
John Reck8f295d12011-03-18 15:25:18 -0700348 mCurrentView = prefs.getInt(PREF_SELECTED_VIEW, getDefaultView());
John Reck71efc2b2011-05-09 16:54:28 -0700349 // TODO: Support list view
350 mCurrentView = VIEW_THUMBNAILS;
John Reckb3417f02011-01-14 11:01:05 -0800351
Jeff Hamilton64144e42010-08-18 16:31:59 -0500352 Bundle args = getArguments();
Leon Scrogginsbc922852010-10-22 12:15:27 -0400353 mDisableNewWindow = args == null ? false : args.getBoolean(EXTRA_DISABLE_WINDOW, false);
John Reck8f295d12011-03-18 15:25:18 -0700354
355 setHasOptionsMenu(true);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500356 }
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400357
Jeff Hamilton64144e42010-08-18 16:31:59 -0500358 @Override
Jeff Hamilton64144e42010-08-18 16:31:59 -0500359 public View onCreateView(LayoutInflater inflater, ViewGroup container,
360 Bundle savedInstanceState) {
John Reck0ce8a942011-01-14 19:57:09 -0800361 mRoot = inflater.inflate(R.layout.bookmarks, container, false);
362 mEmptyView = mRoot.findViewById(android.R.id.empty);
Leon Scrogginsd87f85e2009-08-18 14:13:31 -0400363
John Reck71efc2b2011-05-09 16:54:28 -0700364 mGrid = (BookmarkExpandableGridView) mRoot.findViewById(R.id.grid);
365 mGrid.setOnChildClickListener(this);
366 mGrid.setColumnWidthFromLayout(R.layout.bookmark_thumbnail);
367 mGrid.setBreadcrumbController(this);
John Reck0ce8a942011-01-14 19:57:09 -0800368 mList = (ListView) mRoot.findViewById(R.id.list);
John Reck71efc2b2011-05-09 16:54:28 -0700369 // TODO: mList.setOnItemClickListener(this);
John Reck608baa72010-11-24 10:32:28 -0800370 setEnableContextMenu(mEnableContextMenu);
John Reck66302e52011-05-18 17:12:33 -0700371 mDragHandler = new BookmarkDragHandler(getActivity(), mDragController,
372 mGrid.getDragAdapter());
John Reck608baa72010-11-24 10:32:28 -0800373
Jeff Hamiltondb90aa82010-09-16 03:38:04 -0500374 // Start the loaders
375 LoaderManager lm = getLoaderManager();
John Reck71efc2b2011-05-09 16:54:28 -0700376 lm.restartLoader(LOADER_ACCOUNTS, null, this);
Jeff Hamilton84029622010-08-05 14:29:28 -0500377
378 // Add our own listener in case there are favicons that have yet to be loaded.
Michael Kolbe421c242010-10-04 19:29:01 -0700379 CombinedBookmarkHistoryView.getIconListenerSet().addListener(this);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800380
John Reck0ce8a942011-01-14 19:57:09 -0800381 return mRoot;
Jeff Hamilton64144e42010-08-18 16:31:59 -0500382 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700383
John Reck9d27ff52011-02-11 17:47:54 -0800384 private int getDefaultView() {
John Recka5176f32011-05-17 12:35:37 -0700385 if (BrowserActivity.isTablet(getActivity())) {
John Reck9d27ff52011-02-11 17:47:54 -0800386 return VIEW_THUMBNAILS;
387 }
388 return VIEW_LIST;
389 }
390
John Reck608baa72010-11-24 10:32:28 -0800391 @Override
392 public void onDestroyView() {
393 super.onDestroyView();
John Reck71efc2b2011-05-09 16:54:28 -0700394 mGrid.setBreadcrumbController(null);
395 LoaderManager lm = getLoaderManager();
396 lm.destroyLoader(LOADER_ACCOUNTS);
397 for (int id : mBookmarkAdapters.keySet()) {
398 lm.destroyLoader(id);
John Reck608baa72010-11-24 10:32:28 -0800399 }
John Reck71efc2b2011-05-09 16:54:28 -0700400 mBookmarkAdapters.clear();
401
John Recke3063ae2011-01-27 14:57:40 -0800402 CombinedBookmarkHistoryView.getIconListenerSet().removeListener(this);
John Reck608baa72010-11-24 10:32:28 -0800403 }
404
Nicolas Catania095292f2010-03-15 09:00:14 -0700405 @Override
Jeff Hamilton84029622010-08-05 14:29:28 -0500406 public void onReceivedIcon(String url, Bitmap icon) {
407 // A new favicon has been loaded, so let anything attached to the adapter know about it
408 // so new icons will be loaded.
John Reck71efc2b2011-05-09 16:54:28 -0700409 // TODO: Notify all of data set changed
410 // TODO: Wait, is this even needed? Won't this trigger a DB change anyway?
411 }
412
413 private BrowserBookmarksAdapter getChildAdapter(int groupPosition) {
414 if (mCurrentView == VIEW_THUMBNAILS) {
415 return mGrid.getChildAdapter(groupPosition);
416 } else {
417 // TODO: Support expandable list
418 return null;
419 }
420 }
421
422 private BreadCrumbView getBreadCrumbs(int groupPosition) {
423 if (mCurrentView == VIEW_THUMBNAILS) {
424 return mGrid.getBreadCrumbs(groupPosition);
425 } else {
426 // TODO: Support expandable list
427 return null;
428 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700429 }
430
Jeff Hamilton84029622010-08-05 14:29:28 -0500431 @Override
John Reck71efc2b2011-05-09 16:54:28 -0700432 public boolean onChildClick(ExpandableListView parent, View v,
433 int groupPosition, int childPosition, long id) {
434 BrowserBookmarksAdapter adapter = getChildAdapter(groupPosition);
435 Cursor cursor = adapter.getItem(childPosition);
John Reck608baa72010-11-24 10:32:28 -0800436 boolean isFolder = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
437 if (mCallbacks != null &&
438 mCallbacks.onBookmarkSelected(cursor, isFolder)) {
John Reck71efc2b2011-05-09 16:54:28 -0700439 return true;
Ben Murdoch328ea872009-09-16 13:33:29 +0100440 }
441
John Reck71efc2b2011-05-09 16:54:28 -0700442 // TODO: Folder stuff
John Reck608baa72010-11-24 10:32:28 -0800443 if (isFolder) {
Michael Kolb370a4f32010-10-06 10:45:32 -0700444 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton84029622010-08-05 14:29:28 -0500445 Uri uri = ContentUris.withAppendedId(
446 BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER, id);
John Reck71efc2b2011-05-09 16:54:28 -0700447 BreadCrumbView crumbs = getBreadCrumbs(groupPosition);
448 if (crumbs != null) {
Michael Kolb370a4f32010-10-06 10:45:32 -0700449 // update crumbs
John Reck71efc2b2011-05-09 16:54:28 -0700450 crumbs.pushView(title, uri);
Michael Kolb370a4f32010-10-06 10:45:32 -0700451 }
John Reck71efc2b2011-05-09 16:54:28 -0700452 loadFolder(groupPosition, uri);
Leon Scrogginsa5d669e2009-08-05 14:07:58 -0400453 }
John Reck71efc2b2011-05-09 16:54:28 -0700454 return true;
The Android Open Source Project0c908882009-03-03 19:32:16 -0800455 }
456
John Reck608baa72010-11-24 10:32:28 -0800457 /* package */ static Intent createShortcutIntent(Context context, Cursor cursor) {
Jeff Hamilton84029622010-08-05 14:29:28 -0500458 String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL);
Michael Kolbccaa8962010-10-20 17:03:10 -0700459 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton84029622010-08-05 14:29:28 -0500460 Bitmap touchIcon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_TOUCH_ICON);
461 Bitmap favicon = getBitmap(cursor, BookmarksLoader.COLUMN_INDEX_FAVICON);
John Reck608baa72010-11-24 10:32:28 -0800462 return BookmarkUtils.createAddToHomeIntent(context, url, title, touchIcon, favicon);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800463 }
464
John Reck71efc2b2011-05-09 16:54:28 -0700465 private void loadUrl(BrowserBookmarksAdapter adapter, int position) {
466 if (mCallbacks != null && adapter != null) {
467 mCallbacks.onBookmarkSelected(adapter.getItem(position), false);
John Reck608baa72010-11-24 10:32:28 -0800468 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800469 }
470
John Reck71efc2b2011-05-09 16:54:28 -0700471 private void openInNewWindow(BrowserBookmarksAdapter adapter, int position) {
John Reck608baa72010-11-24 10:32:28 -0800472 if (mCallbacks != null) {
John Reck71efc2b2011-05-09 16:54:28 -0700473 Cursor c = adapter.getItem(position);
John Reck1b3c66e2011-01-11 13:20:32 -0800474 boolean isFolder = c.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) == 1;
475 if (isFolder) {
476 long id = c.getLong(BookmarksLoader.COLUMN_INDEX_ID);
477 new OpenAllInTabsTask(id).execute();
478 } else {
479 mCallbacks.onOpenInNewWindow(c);
480 }
John Reck608baa72010-11-24 10:32:28 -0800481 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800482 }
Nicolas Catania095292f2010-03-15 09:00:14 -0700483
John Reck1b3c66e2011-01-11 13:20:32 -0800484 class OpenAllInTabsTask extends AsyncTask<Void, Void, Cursor> {
485 long mFolderId;
486 public OpenAllInTabsTask(long id) {
487 mFolderId = id;
488 }
489
490 @Override
491 protected Cursor doInBackground(Void... params) {
492 Context c = getActivity();
493 if (c == null) return null;
494 return c.getContentResolver().query(BookmarkUtils.getBookmarksUri(c),
495 BookmarksLoader.PROJECTION, BrowserContract.Bookmarks.PARENT + "=?",
496 new String[] { Long.toString(mFolderId) }, null);
497 }
498
499 @Override
500 protected void onPostExecute(Cursor result) {
501 if (mCallbacks != null) {
502 while (result.moveToNext()) {
503 mCallbacks.onOpenInNewWindow(result);
504 }
505 }
506 }
507
508 }
509
John Reck71efc2b2011-05-09 16:54:28 -0700510 private void editBookmark(BrowserBookmarksAdapter adapter, int position) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500511 Intent intent = new Intent(getActivity(), AddBookmarkPage.class);
John Reck71efc2b2011-05-09 16:54:28 -0700512 Cursor cursor = adapter.getItem(position);
Jeff Hamilton84029622010-08-05 14:29:28 -0500513 Bundle item = new Bundle();
Michael Kolbbef7a752010-08-25 17:11:35 -0700514 item.putString(BrowserContract.Bookmarks.TITLE,
Jeff Hamilton84029622010-08-05 14:29:28 -0500515 cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE));
Michael Kolbbef7a752010-08-25 17:11:35 -0700516 item.putString(BrowserContract.Bookmarks.URL,
Jeff Hamilton84029622010-08-05 14:29:28 -0500517 cursor.getString(BookmarksLoader.COLUMN_INDEX_URL));
518 byte[] data = cursor.getBlob(BookmarksLoader.COLUMN_INDEX_FAVICON);
519 if (data != null) {
Michael Kolbbef7a752010-08-25 17:11:35 -0700520 item.putParcelable(BrowserContract.Bookmarks.FAVICON,
Jeff Hamilton84029622010-08-05 14:29:28 -0500521 BitmapFactory.decodeByteArray(data, 0, data.length));
522 }
John Reckc8490812010-11-22 14:15:36 -0800523 item.putLong(BrowserContract.Bookmarks._ID,
524 cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID));
Leon Scroggins III052ce662010-09-13 14:44:16 -0400525 item.putLong(BrowserContract.Bookmarks.PARENT,
526 cursor.getLong(BookmarksLoader.COLUMN_INDEX_PARENT));
John Reckc8490812010-11-22 14:15:36 -0800527 intent.putExtra(AddBookmarkPage.EXTRA_EDIT_BOOKMARK, item);
528 intent.putExtra(AddBookmarkPage.EXTRA_IS_FOLDER,
529 cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) == 1);
530 startActivity(intent);
Jeff Hamilton84029622010-08-05 14:29:28 -0500531 }
532
John Reck71efc2b2011-05-09 16:54:28 -0700533 private void displayRemoveBookmarkDialog(BrowserBookmarksAdapter adapter,
534 int position) {
The Android Open Source Project0c908882009-03-03 19:32:16 -0800535 // Put up a dialog asking if the user really wants to
536 // delete the bookmark
John Reck71efc2b2011-05-09 16:54:28 -0700537 Cursor cursor = adapter.getItem(position);
Leon Scroggins75630672011-01-13 17:56:15 -0500538 long id = cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID);
539 String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
Jeff Hamilton64144e42010-08-18 16:31:59 -0500540 Context context = getActivity();
Leon Scroggins75630672011-01-13 17:56:15 -0500541 BookmarkUtils.displayRemoveBookmarkDialog(id, title, context, null);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800542 }
543
John Reck71efc2b2011-05-09 16:54:28 -0700544 private String getUrl(BrowserBookmarksAdapter adapter, int position) {
545 return getUrl(adapter.getItem(position));
John Reck608baa72010-11-24 10:32:28 -0800546 }
547
548 /* package */ static String getUrl(Cursor c) {
549 return c.getString(BookmarksLoader.COLUMN_INDEX_URL);
The Android Open Source Project0c908882009-03-03 19:32:16 -0800550 }
Michael Kolb801ecb72010-08-25 12:57:38 -0700551
The Android Open Source Project0c908882009-03-03 19:32:16 -0800552 private void copy(CharSequence text) {
Jeff Hamilton64144e42010-08-18 16:31:59 -0500553 ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(
554 Context.CLIPBOARD_SERVICE);
Dianne Hackbornbf1d10a2011-01-17 12:29:51 -0800555 cm.setPrimaryClip(ClipData.newRawUri(null, Uri.parse(text.toString())));
The Android Open Source Project0c908882009-03-03 19:32:16 -0800556 }
Michael Kolb370a4f32010-10-06 10:45:32 -0700557
John Reckb3417f02011-01-14 11:01:05 -0800558 @Override
559 public boolean onOptionsItemSelected(MenuItem item) {
560 switch (item.getItemId()) {
561 case R.id.thumbnail_view:
562 selectView(VIEW_THUMBNAILS);
563 return true;
564 case R.id.list_view:
565 selectView(VIEW_LIST);
566 return true;
567 }
568 return super.onOptionsItemSelected(item);
569 }
570
571 @Override
572 public void onConfigurationChanged(Configuration newConfig) {
573 super.onConfigurationChanged(newConfig);
574 Resources res = getActivity().getResources();
575 int horizontalSpacing = (int) res.getDimension(R.dimen.combo_horizontalSpacing);
576 mGrid.setHorizontalSpacing(horizontalSpacing);
John Reck71efc2b2011-05-09 16:54:28 -0700577 mGrid.setColumnWidthFromLayout(R.layout.bookmark_thumbnail);
John Reck0ce8a942011-01-14 19:57:09 -0800578 int paddingLeftRight = (int) res.getDimension(R.dimen.combo_paddingLeftRight);
579 int paddingTop = (int) res.getDimension(R.dimen.combo_paddingTop);
580 mRoot.setPadding(paddingLeftRight, paddingTop,
581 paddingLeftRight, 0);
John Reck9fdd9812011-05-17 14:16:38 -0700582 getActivity().invalidateOptionsMenu();
John Reckb3417f02011-01-14 11:01:05 -0800583 }
584
585 @Override
586 public void onPrepareOptionsMenu(Menu menu) {
587 super.onPrepareOptionsMenu(menu);
588 menu.findItem(R.id.list_view).setVisible(mCurrentView != VIEW_LIST);
589 menu.findItem(R.id.thumbnail_view).setVisible(mCurrentView != VIEW_THUMBNAILS);
590 }
591
John Reck8af90642010-11-23 10:27:29 -0800592 void selectView(int view) {
John Reck71efc2b2011-05-09 16:54:28 -0700593 // TODO: Support list view
594 view = mCurrentView;
John Reck8af90642010-11-23 10:27:29 -0800595 if (view == mCurrentView) {
596 return;
597 }
John Reck8af90642010-11-23 10:27:29 -0800598 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
599 Editor edit = prefs.edit();
600 edit.putInt(PREF_SELECTED_VIEW, mCurrentView);
601 edit.apply();
602 if (mEmptyView.getVisibility() == View.VISIBLE) {
603 return;
604 }
605 setupBookmarkView();
606 }
607
608 private void setupBookmarkView() {
John Reck71efc2b2011-05-09 16:54:28 -0700609 // TODO: Support list view
610// mAdapter.selectView(mCurrentView);
611// switch (mCurrentView) {
612// case VIEW_THUMBNAILS:
613// mList.setAdapter(null);
614// SharedPreferences prefs = PreferenceManager
615// .getDefaultSharedPreferences(getActivity());
616// String accountName = prefs.getString(PREF_ACCOUNT_NAME, null);
617// mGrid.addAccount(accountName, mAdapter);
618// mGrid.setVisibility(View.VISIBLE);
619// mList.setVisibility(View.GONE);
620// break;
621// case VIEW_LIST:
622// mGrid.clearAccounts();
623// if (mList.getAdapter() != mAdapter) {
624// mList.setAdapter(mAdapter);
625// }
626// mGrid.setVisibility(View.GONE);
627// mList.setVisibility(View.VISIBLE);
628// break;
629// }
John Reck8af90642010-11-23 10:27:29 -0800630 }
John Reck608baa72010-11-24 10:32:28 -0800631
John Reck608baa72010-11-24 10:32:28 -0800632 /**
633 * BreadCrumb controller callback
634 */
635 @Override
John Reck71efc2b2011-05-09 16:54:28 -0700636 public void onTop(BreadCrumbView view, int level, Object data) {
637 int groupPosition = (Integer) view.getTag(R.id.group_position);
John Reck89f73c12010-12-01 10:10:14 -0800638 Uri uri = (Uri) data;
639 if (uri == null) {
640 // top level
641 uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER;
642 }
John Reck71efc2b2011-05-09 16:54:28 -0700643 loadFolder(groupPosition, uri);
John Reck89f73c12010-12-01 10:10:14 -0800644 }
645
646 /**
647 * @param uri
648 */
John Reck71efc2b2011-05-09 16:54:28 -0700649 private void loadFolder(int groupPosition, Uri uri) {
John Reck89f73c12010-12-01 10:10:14 -0800650 LoaderManager manager = getLoaderManager();
John Reck71efc2b2011-05-09 16:54:28 -0700651 // This assumes groups are ordered the same as loaders
652 BookmarksLoader loader = (BookmarksLoader) ((Loader<?>)
653 manager.getLoader(LOADER_BOOKMARKS + groupPosition));
John Reck89f73c12010-12-01 10:10:14 -0800654 loader.setUri(uri);
655 loader.forceLoad();
John Reck608baa72010-11-24 10:32:28 -0800656 }
657
658 @Override
John Reck608baa72010-11-24 10:32:28 -0800659 public boolean onMenuItemClick(MenuItem item) {
660 switch (item.getItemId()) {
661 case R.id.list_view:
John Reck608baa72010-11-24 10:32:28 -0800662 selectView(BrowserBookmarksPage.VIEW_LIST);
663 return true;
664 case R.id.thumbnail_view:
John Reck608baa72010-11-24 10:32:28 -0800665 selectView(BrowserBookmarksPage.VIEW_THUMBNAILS);
666 return true;
667 }
668 return false;
669 }
670
671 public boolean onBackPressed() {
John Reck608baa72010-11-24 10:32:28 -0800672 return false;
673 }
674
675 public void setCallbackListener(BookmarksPageCallbacks callbackListener) {
676 mCallbacks = callbackListener;
677 }
678
679 public void setEnableContextMenu(boolean enable) {
680 mEnableContextMenu = enable;
681 if (mGrid != null) {
682 if (mEnableContextMenu) {
683 registerForContextMenu(mGrid);
684 } else {
685 unregisterForContextMenu(mGrid);
686 mGrid.setLongClickable(false);
687 }
688 }
689 if (mList != null) {
690 if (mEnableContextMenu) {
691 registerForContextMenu(mList);
692 } else {
693 unregisterForContextMenu(mList);
694 mList.setLongClickable(false);
695 }
696 }
697 }
John Reckc8490812010-11-22 14:15:36 -0800698
John Reck66302e52011-05-18 17:12:33 -0700699 private BookmarkDragController mDragController = new BookmarkDragController() {
700
701 @Override
702 public boolean startDrag(Cursor item) {
703 return canEdit(item);
704 }
John Recke7c97de2011-05-27 14:42:43 -0700705
706 @Override
707 public ViewGroup getActionModeView(ActionMode mode,
708 BookmarkDragState state) {
709 LayoutInflater inflater = LayoutInflater.from(getActivity());
710 LinearLayout view = (LinearLayout) inflater.inflate(
711 R.layout.bookmarks_drag_actionmode, null);
712 view.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
713 ExtraDragState extraState = (ExtraDragState) state.extraState;
714 BrowserBookmarksAdapter adapter = getChildAdapter(extraState.groupPosition);
715 Cursor c = adapter.getItem(extraState.childPosition);
716 boolean isFolder = c.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0;
717 if (isFolder) {
718 view.findViewById(R.id.open_context_menu_id).setVisibility(View.GONE);
719 ImageView iv = (ImageView) view.findViewById(
720 R.id.new_window_context_menu_id);
721 iv.setImageResource(R.drawable.ic_windows_holo_dark);
722 }
723 return view;
724 }
725
726 @Override
727 public void actionItemClicked(View v, BookmarkDragState state) {
728 if (v.getId() == R.id.info) {
729 if (mCurrentView == VIEW_THUMBNAILS) {
730 mGrid.showContextMenuForState(state);
731 } else {
732 // TODO: Support expandable list
733 }
734 } else {
735 ExtraDragState extraState = (ExtraDragState) state.extraState;
736 handleContextItem(v.getId(), extraState.groupPosition,
737 extraState.childPosition);
738 }
739 }
John Reck66302e52011-05-18 17:12:33 -0700740 };
741
John Reckc8490812010-11-22 14:15:36 -0800742 private static class LookupBookmarkCount extends AsyncTask<Long, Void, Integer> {
743 Context mContext;
744 BookmarkItem mHeader;
745
746 public LookupBookmarkCount(Context context, BookmarkItem header) {
747 mContext = context;
748 mHeader = header;
749 }
750
751 @Override
752 protected Integer doInBackground(Long... params) {
753 if (params.length != 1) {
754 throw new IllegalArgumentException("Missing folder id!");
755 }
756 Uri uri = BookmarkUtils.getBookmarksUri(mContext);
757 Cursor c = mContext.getContentResolver().query(uri,
758 null, BrowserContract.Bookmarks.PARENT + "=?",
759 new String[] {params[0].toString()}, null);
760 return c.getCount();
761 }
762
763 @Override
764 protected void onPostExecute(Integer result) {
765 if (result > 0) {
766 mHeader.setUrl(mContext.getString(R.string.contextheader_folder_bookmarkcount,
767 result));
768 } else if (result == 0) {
769 mHeader.setUrl(mContext.getString(R.string.contextheader_folder_empty));
770 }
771 }
772 }
John Reck89f73c12010-12-01 10:10:14 -0800773
John Reck71efc2b2011-05-09 16:54:28 -0700774 static class AccountsLoader extends CursorLoader {
John Reck89f73c12010-12-01 10:10:14 -0800775
John Reck71efc2b2011-05-09 16:54:28 -0700776 static String[] ACCOUNTS_PROJECTION = new String[] {
777 Accounts.ACCOUNT_NAME,
778 Accounts.ACCOUNT_TYPE
779 };
John Reck89f73c12010-12-01 10:10:14 -0800780
John Reck71efc2b2011-05-09 16:54:28 -0700781 public AccountsLoader(Context context) {
782 super(context, Accounts.CONTENT_URI, ACCOUNTS_PROJECTION, null, null,
783 Accounts.ACCOUNT_NAME + " ASC");
John Reck89f73c12010-12-01 10:10:14 -0800784 }
John Reck522a4382011-01-26 13:23:47 -0800785
John Reck522a4382011-01-26 13:23:47 -0800786 }
The Android Open Source Project0c908882009-03-03 19:32:16 -0800787}