diff options
author | John Reck <jreck@google.com> | 2011-05-09 16:54:28 -0700 |
---|---|---|
committer | John Reck <jreck@google.com> | 2011-05-10 15:18:49 -0700 |
commit | 71efc2bbf08574425a387c992e24cb9eaf0a6e6c (patch) | |
tree | 078a3d1148e70e543fcbefcd7e11606d41e65371 /src/com/android/browser | |
parent | 503da5b02133380e94642f6e4966ecd8ee2cd76c (diff) | |
download | packages_apps_Browser-71efc2bbf08574425a387c992e24cb9eaf0a6e6c.zip packages_apps_Browser-71efc2bbf08574425a387c992e24cb9eaf0a6e6c.tar.gz packages_apps_Browser-71efc2bbf08574425a387c992e24cb9eaf0a6e6c.tar.bz2 |
Initial pass at collapsable bookmarks
Change bookmark view to show all bookmarks
Group by account_name
Change-Id: I2c252c9f0e8d4df4271649dbe9bf3db336f921df
Diffstat (limited to 'src/com/android/browser')
-rw-r--r-- | src/com/android/browser/AddBookmarkPage.java | 2 | ||||
-rw-r--r-- | src/com/android/browser/BookmarksLoader.java | 4 | ||||
-rw-r--r-- | src/com/android/browser/BreadCrumbView.java | 15 | ||||
-rw-r--r-- | src/com/android/browser/BrowserBookmarksAdapter.java | 2 | ||||
-rw-r--r-- | src/com/android/browser/BrowserBookmarksPage.java | 372 | ||||
-rw-r--r-- | src/com/android/browser/CombinedBookmarkHistoryView.java | 16 | ||||
-rw-r--r-- | src/com/android/browser/ShortcutActivity.java | 6 | ||||
-rw-r--r-- | src/com/android/browser/provider/BrowserProvider2.java | 2 | ||||
-rw-r--r-- | src/com/android/browser/view/BookmarkContainer.java | 92 | ||||
-rw-r--r-- | src/com/android/browser/view/BookmarkExpandableGridView.java | 424 |
10 files changed, 697 insertions, 238 deletions
diff --git a/src/com/android/browser/AddBookmarkPage.java b/src/com/android/browser/AddBookmarkPage.java index 08f9d39..3659041 100644 --- a/src/com/android/browser/AddBookmarkPage.java +++ b/src/com/android/browser/AddBookmarkPage.java @@ -156,7 +156,7 @@ public class AddBookmarkPage extends Activity } @Override - public void onTop(int level, Object data) { + public void onTop(BreadCrumbView view, int level, Object data) { if (null == data) return; Folder folderData = (Folder) data; long folder = folderData.Id; diff --git a/src/com/android/browser/BookmarksLoader.java b/src/com/android/browser/BookmarksLoader.java index 7722392..bc06497 100644 --- a/src/com/android/browser/BookmarksLoader.java +++ b/src/com/android/browser/BookmarksLoader.java @@ -49,8 +49,8 @@ public class BookmarksLoader extends CursorLoader { ChromeSyncColumns.SERVER_UNIQUE, // 9 }; - private String mAccountType; - private String mAccountName; + String mAccountType; + String mAccountName; public BookmarksLoader(Context context, String accountType, String accountName) { super(context, addAccount(Bookmarks.CONTENT_URI_DEFAULT_FOLDER, accountType, accountName), diff --git a/src/com/android/browser/BreadCrumbView.java b/src/com/android/browser/BreadCrumbView.java index 9aaecd7..6706deb 100644 --- a/src/com/android/browser/BreadCrumbView.java +++ b/src/com/android/browser/BreadCrumbView.java @@ -41,8 +41,8 @@ import java.util.List; public class BreadCrumbView extends LinearLayout implements OnClickListener { private static final int DIVIDER_PADDING = 12; // dips - interface Controller { - public void onTop(int level, Object data); + public interface Controller { + public void onTop(BreadCrumbView view, int level, Object data); } private ImageButton mBackButton; @@ -52,6 +52,7 @@ public class BreadCrumbView extends LinearLayout implements OnClickListener { private Drawable mSeparatorDrawable; private float mDividerPadding; private int mMaxVisible = -1; + private Context mContext; /** * @param context @@ -81,12 +82,14 @@ public class BreadCrumbView extends LinearLayout implements OnClickListener { } private void init(Context ctx) { + mContext = ctx; + setFocusable(true); mUseBackButton = false; mCrumbs = new ArrayList<Crumb>(); - TypedArray a = ctx.obtainStyledAttributes(com.android.internal.R.styleable.Theme); + TypedArray a = mContext.obtainStyledAttributes(com.android.internal.R.styleable.Theme); mSeparatorDrawable = a.getDrawable(com.android.internal.R.styleable.Theme_dividerVertical); a.recycle(); - mDividerPadding = DIVIDER_PADDING * ctx.getResources().getDisplayMetrics().density; + mDividerPadding = DIVIDER_PADDING * mContext.getResources().getDisplayMetrics().density; addBackButton(); } @@ -134,9 +137,9 @@ public class BreadCrumbView extends LinearLayout implements OnClickListener { public void notifyController() { if (mController != null) { if (mCrumbs.size() > 0) { - mController.onTop(mCrumbs.size(), getTopCrumb().data); + mController.onTop(this, mCrumbs.size(), getTopCrumb().data); } else { - mController.onTop(0, null); + mController.onTop(this, 0, null); } } } diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java index 201079c..7543528 100644 --- a/src/com/android/browser/BrowserBookmarksAdapter.java +++ b/src/com/android/browser/BrowserBookmarksAdapter.java @@ -27,7 +27,7 @@ import android.widget.CursorAdapter; import android.widget.ImageView; import android.widget.TextView; -class BrowserBookmarksAdapter extends CursorAdapter { +public class BrowserBookmarksAdapter extends CursorAdapter { LayoutInflater mInflater; int mCurrentView; diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java index 1dc2612..46197e9 100644 --- a/src/com/android/browser/BrowserBookmarksPage.java +++ b/src/com/android/browser/BrowserBookmarksPage.java @@ -16,7 +16,8 @@ package com.android.browser; -import com.android.browser.BreadCrumbView.Crumb; +import com.android.browser.view.BookmarkExpandableGridView; +import com.android.browser.view.BookmarkExpandableGridView.BookmarkContextMenuInfo; import android.app.Activity; import android.app.Fragment; @@ -25,11 +26,11 @@ import android.content.ClipData; import android.content.ClipboardManager; import android.content.ContentUris; import android.content.Context; +import android.content.CursorLoader; import android.content.Intent; import android.content.Loader; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.content.res.Configuration; import android.content.res.Resources; import android.database.Cursor; @@ -40,6 +41,7 @@ import android.os.AsyncTask; import android.os.Bundle; import android.preference.PreferenceManager; import android.provider.BrowserContract; +import android.provider.BrowserContract.Accounts; import android.provider.BrowserContract.ChromeSyncColumns; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; @@ -50,116 +52,114 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.webkit.WebIconDatabase.IconListener; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemClickListener; -import android.widget.GridView; +import android.widget.ExpandableListView; +import android.widget.ExpandableListView.OnChildClickListener; import android.widget.ListView; import android.widget.PopupMenu.OnMenuItemClickListener; import android.widget.Toast; +import java.util.HashMap; + interface BookmarksPageCallbacks { // Return true if handled boolean onBookmarkSelected(Cursor c, boolean isFolder); // Return true if handled boolean onOpenInNewWindow(Cursor c); - void onFolderChanged(int level, Uri uri); } /** * View showing the user's bookmarks in the browser. */ public class BrowserBookmarksPage extends Fragment implements View.OnCreateContextMenuListener, - LoaderManager.LoaderCallbacks<Cursor>, OnItemClickListener, IconListener, - BreadCrumbView.Controller, OnMenuItemClickListener, OnSharedPreferenceChangeListener { + LoaderManager.LoaderCallbacks<Cursor>, IconListener, + BreadCrumbView.Controller, OnMenuItemClickListener, OnChildClickListener { static final String LOGTAG = "browser"; - static final int LOADER_BOOKMARKS = 1; + static final int LOADER_ACCOUNTS = 1; + static final int LOADER_BOOKMARKS = 100; static final String EXTRA_DISABLE_WINDOW = "disable_new_window"; - static final String ACCOUNT_NAME_UNSYNCED = "Unsynced"; - public static final String PREF_ACCOUNT_TYPE = "acct_type"; public static final String PREF_ACCOUNT_NAME = "acct_name"; + static final String ACCOUNT_TYPE = "account_type"; + static final String ACCOUNT_NAME = "account_name"; + static final int VIEW_THUMBNAILS = 1; static final int VIEW_LIST = 2; static final String PREF_SELECTED_VIEW = "bookmarks_view"; BookmarksPageCallbacks mCallbacks; View mRoot; - GridView mGrid; + BookmarkExpandableGridView mGrid; ListView mList; - BrowserBookmarksAdapter mAdapter; boolean mDisableNewWindow; - boolean mCanceled = false; boolean mEnableContextMenu = true; - boolean mShowRootFolder = false; View mEmptyView; int mCurrentView; View mHeader; - ViewGroup mHeaderContainer; - BreadCrumbView mCrumbs; - int mCrumbVisibility = View.VISIBLE; - int mCrumbMaxVisible = -1; - boolean mCrumbBackButton = false; + HashMap<Integer, BrowserBookmarksAdapter> mBookmarkAdapters = new HashMap<Integer, BrowserBookmarksAdapter>(); static BrowserBookmarksPage newInstance(BookmarksPageCallbacks cb, Bundle args, ViewGroup headerContainer) { BrowserBookmarksPage bbp = new BrowserBookmarksPage(); bbp.mCallbacks = cb; - bbp.mHeaderContainer = headerContainer; bbp.setArguments(args); return bbp; } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { - switch (id) { - case LOADER_BOOKMARKS: { - SharedPreferences prefs = PreferenceManager - .getDefaultSharedPreferences(getActivity()); - String accountType = prefs.getString(PREF_ACCOUNT_TYPE, null); - String accountName = prefs.getString(PREF_ACCOUNT_NAME, null); - BookmarksLoader bl = new BookmarksLoader(getActivity(), - accountType, accountName); - if (mCrumbs != null) { - Uri uri = (Uri) mCrumbs.getTopData(); - if (uri != null) { - bl.setUri(uri); - } - } - return bl; - } + if (id == LOADER_ACCOUNTS) { + return new AccountsLoader(getActivity()); + } else if (id >= LOADER_BOOKMARKS) { + String accountType = args.getString(ACCOUNT_TYPE); + String accountName = args.getString(ACCOUNT_NAME); + BookmarksLoader bl = new BookmarksLoader(getActivity(), + accountType, accountName); + return bl; + } else { + throw new UnsupportedOperationException("Unknown loader id " + id); } - throw new UnsupportedOperationException("Unknown loader id " + id); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { - switch (loader.getId()) { - case LOADER_BOOKMARKS: { - // Set the visibility of the empty vs. content views - if (cursor == null || cursor.getCount() == 0) { - mEmptyView.setVisibility(View.VISIBLE); - mGrid.setVisibility(View.GONE); - mList.setVisibility(View.GONE); - } else { - mEmptyView.setVisibility(View.GONE); - setupBookmarkView(); - } - - // Give the new data to the adapter - mAdapter.changeCursor(cursor); - break; + if (loader.getId() == LOADER_ACCOUNTS) { + LoaderManager lm = getLoaderManager(); + int id = LOADER_BOOKMARKS; + while (cursor.moveToNext()) { + String accountName = cursor.getString(0); + String accountType = cursor.getString(1); + Bundle args = new Bundle(); + args.putString(ACCOUNT_NAME, accountName); + args.putString(ACCOUNT_TYPE, accountType); + BrowserBookmarksAdapter adapter = new BrowserBookmarksAdapter( + getActivity(), mCurrentView); + mBookmarkAdapters.put(id, adapter); + mGrid.addAccount(accountName, adapter); + lm.restartLoader(id, args, this); + id++; } + // TODO: Figure out what a reload of these means + // Currently, a reload is triggered whenever bookmarks change + // This is less than ideal + // It also causes UI flickering as a new adapter is created + // instead of re-using an existing one when the account_name is the + // same. + // For now, this is a one-shot load + getLoaderManager().destroyLoader(LOADER_ACCOUNTS); + } else if (loader.getId() >= LOADER_BOOKMARKS) { + BrowserBookmarksAdapter adapter = mBookmarkAdapters.get(loader.getId()); + adapter.changeCursor(cursor); } } @Override public void onLoaderReset(Loader<Cursor> loader) { - onLoadFinished(loader, null); + // TODO: Figure out what to do here (if anything?) } long getFolderId() { @@ -181,37 +181,32 @@ public class BrowserBookmarksPage extends Fragment implements View.OnCreateConte @Override public boolean onContextItemSelected(MenuItem item) { final Activity activity = getActivity(); - // It is possible that the view has been canceled when we get to - // this point as back has a higher priority - if (mCanceled) { - return false; - } - AdapterView.AdapterContextMenuInfo i = - (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); + BookmarkContextMenuInfo i = (BookmarkContextMenuInfo)item.getMenuInfo(); // If we have no menu info, we can't tell which item was selected. if (i == null) { return false; } + BrowserBookmarksAdapter adapter = getChildAdapter(i.groupPosition); switch (item.getItemId()) { case R.id.open_context_menu_id: - loadUrl(i.position); + loadUrl(adapter, i.childPosition); break; case R.id.edit_context_menu_id: - editBookmark(i.position); + editBookmark(adapter, i.childPosition); break; case R.id.shortcut_context_menu_id: - Cursor c = mAdapter.getItem(i.position); + Cursor c = adapter.getItem(i.childPosition); activity.sendBroadcast(createShortcutIntent(getActivity(), c)); break; case R.id.delete_context_menu_id: - displayRemoveBookmarkDialog(i.position); + displayRemoveBookmarkDialog(adapter, i.childPosition); break; case R.id.new_window_context_menu_id: - openInNewWindow(i.position); + openInNewWindow(adapter, i.childPosition); break; case R.id.share_link_context_menu_id: { - Cursor cursor = mAdapter.getItem(i.position); + Cursor cursor = adapter.getItem(i.childPosition); Controller.sharePage(activity, cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE), cursor.getString(BookmarksLoader.COLUMN_INDEX_URL), @@ -220,16 +215,16 @@ public class BrowserBookmarksPage extends Fragment implements View.OnCreateConte break; } case R.id.copy_url_context_menu_id: - copy(getUrl(i.position)); + copy(getUrl(adapter, i.childPosition)); break; case R.id.homepage_context_menu_id: { - BrowserSettings.getInstance().setHomePage(getUrl(i.position)); + BrowserSettings.getInstance().setHomePage(getUrl(adapter, i.childPosition)); Toast.makeText(activity, R.string.homepage_set, Toast.LENGTH_LONG).show(); break; } // Only for the Most visited page case R.id.save_to_bookmarks_menu_id: { - Cursor cursor = mAdapter.getItem(i.position); + Cursor cursor = adapter.getItem(i.childPosition); String name = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE); String url = cursor.getString(BookmarksLoader.COLUMN_INDEX_URL); // If the site is bookmarked, the item becomes remove from @@ -270,8 +265,9 @@ public class BrowserBookmarksPage extends Fragment implements View.OnCreateConte @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { - AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; - Cursor cursor = mAdapter.getItem(info.position); + BookmarkContextMenuInfo info = (BookmarkContextMenuInfo) menuInfo; + BrowserBookmarksAdapter adapter = getChildAdapter(info.groupPosition); + Cursor cursor = adapter.getItem(info.childPosition); if (!canEdit(cursor)) { return; } @@ -330,11 +326,11 @@ public class BrowserBookmarksPage extends Fragment implements View.OnCreateConte @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); - SharedPreferences prefs = PreferenceManager - .getDefaultSharedPreferences(getActivity()); - prefs.registerOnSharedPreferenceChangeListener(this); + .getDefaultSharedPreferences(getActivity()); mCurrentView = prefs.getInt(PREF_SELECTED_VIEW, getDefaultView()); + // TODO: Support list view + mCurrentView = VIEW_THUMBNAILS; Bundle args = getArguments(); mDisableNewWindow = args == null ? false : args.getBoolean(EXTRA_DISABLE_WINDOW, false); @@ -345,40 +341,20 @@ public class BrowserBookmarksPage extends Fragment implements View.OnCreateConte @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - Context context = getActivity(); - mRoot = inflater.inflate(R.layout.bookmarks, container, false); mEmptyView = mRoot.findViewById(android.R.id.empty); - mGrid = (GridView) mRoot.findViewById(R.id.grid); - mGrid.setOnItemClickListener(this); - mGrid.setColumnWidth(Controller.getDesiredThumbnailWidth(getActivity())); + mGrid = (BookmarkExpandableGridView) mRoot.findViewById(R.id.grid); + mGrid.setOnChildClickListener(this); + mGrid.setColumnWidthFromLayout(R.layout.bookmark_thumbnail); + mGrid.setBreadcrumbController(this); mList = (ListView) mRoot.findViewById(R.id.list); - mList.setOnItemClickListener(this); + // TODO: mList.setOnItemClickListener(this); setEnableContextMenu(mEnableContextMenu); - // Prep the header - ViewGroup hc = mHeaderContainer; - if (hc == null) { - hc = (ViewGroup) mRoot.findViewById(R.id.header_container); - hc.setVisibility(View.VISIBLE); - } - mHeader = inflater.inflate(R.layout.bookmarks_header, hc, false); - hc.addView(mHeader); - mCrumbs = (BreadCrumbView) mHeader.findViewById(R.id.crumbs); - mCrumbs.setController(this); - mCrumbs.setUseBackButton(mCrumbBackButton); - mCrumbs.setMaxVisible(mCrumbMaxVisible); - mCrumbs.setVisibility(mCrumbVisibility); - String name = getString(R.string.bookmarks); - mCrumbs.pushView(name, false, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER); - if (mCallbacks != null) { - mCallbacks.onFolderChanged(1, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER); - } // Start the loaders LoaderManager lm = getLoaderManager(); - mAdapter = new BrowserBookmarksAdapter(getActivity(), mCurrentView); - lm.restartLoader(LOADER_BOOKMARKS, null, this); + lm.restartLoader(LOADER_ACCOUNTS, null, this); // Add our own listener in case there are favicons that have yet to be loaded. CombinedBookmarkHistoryView.getIconListenerSet().addListener(this); @@ -386,7 +362,7 @@ public class BrowserBookmarksPage extends Fragment implements View.OnCreateConte return mRoot; } - private int getDefaultView() { + private int getDefaultView() { if (BrowserActivity.isXlarge(getActivity())) { return VIEW_THUMBNAILS; } @@ -396,16 +372,14 @@ public class BrowserBookmarksPage extends Fragment implements View.OnCreateConte @Override public void onDestroyView() { super.onDestroyView(); - SharedPreferences prefs = PreferenceManager - .getDefaultSharedPreferences(getActivity()); - prefs.unregisterOnSharedPreferenceChangeListener(this); - if (mHeaderContainer != null) { - mHeaderContainer.removeView(mHeader); - } - mCrumbs.setController(null); - mCrumbs = null; - getLoaderManager().destroyLoader(LOADER_BOOKMARKS); - mAdapter = null; + mGrid.setBreadcrumbController(null); + LoaderManager lm = getLoaderManager(); + lm.destroyLoader(LOADER_ACCOUNTS); + for (int id : mBookmarkAdapters.keySet()) { + lm.destroyLoader(id); + } + mBookmarkAdapters.clear(); + CombinedBookmarkHistoryView.getIconListenerSet().removeListener(this); } @@ -413,35 +387,52 @@ public class BrowserBookmarksPage extends Fragment implements View.OnCreateConte public void onReceivedIcon(String url, Bitmap icon) { // A new favicon has been loaded, so let anything attached to the adapter know about it // so new icons will be loaded. - mAdapter.notifyDataSetChanged(); + // TODO: Notify all of data set changed + // TODO: Wait, is this even needed? Won't this trigger a DB change anyway? } - @Override - public void onItemClick(AdapterView<?> parent, View v, int position, long id) { - // It is possible that the view has been canceled when we get to - // this point as back has a higher priority - if (mCanceled) { - android.util.Log.e(LOGTAG, "item clicked when dismissing"); - return; + private BrowserBookmarksAdapter getChildAdapter(int groupPosition) { + if (mCurrentView == VIEW_THUMBNAILS) { + return mGrid.getChildAdapter(groupPosition); + } else { + // TODO: Support expandable list + return null; + } + } + + private BreadCrumbView getBreadCrumbs(int groupPosition) { + if (mCurrentView == VIEW_THUMBNAILS) { + return mGrid.getBreadCrumbs(groupPosition); + } else { + // TODO: Support expandable list + return null; } + } - Cursor cursor = mAdapter.getItem(position); + @Override + public boolean onChildClick(ExpandableListView parent, View v, + int groupPosition, int childPosition, long id) { + BrowserBookmarksAdapter adapter = getChildAdapter(groupPosition); + Cursor cursor = adapter.getItem(childPosition); boolean isFolder = cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) != 0; if (mCallbacks != null && mCallbacks.onBookmarkSelected(cursor, isFolder)) { - return; + return true; } + // TODO: Folder stuff if (isFolder) { String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE); Uri uri = ContentUris.withAppendedId( BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER, id); - if (mCrumbs != null) { + BreadCrumbView crumbs = getBreadCrumbs(groupPosition); + if (crumbs != null) { // update crumbs - mCrumbs.pushView(title, uri); + crumbs.pushView(title, uri); } - loadFolder(uri); + loadFolder(groupPosition, uri); } + return true; } /* package */ static Intent createShortcutIntent(Context context, Cursor cursor) { @@ -452,15 +443,15 @@ public class BrowserBookmarksPage extends Fragment implements View.OnCreateConte return BookmarkUtils.createAddToHomeIntent(context, url, title, touchIcon, favicon); } - private void loadUrl(int position) { - if (mCallbacks != null && mAdapter != null) { - mCallbacks.onBookmarkSelected(mAdapter.getItem(position), false); + private void loadUrl(BrowserBookmarksAdapter adapter, int position) { + if (mCallbacks != null && adapter != null) { + mCallbacks.onBookmarkSelected(adapter.getItem(position), false); } } - private void openInNewWindow(int position) { + private void openInNewWindow(BrowserBookmarksAdapter adapter, int position) { if (mCallbacks != null) { - Cursor c = mAdapter.getItem(position); + Cursor c = adapter.getItem(position); boolean isFolder = c.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) == 1; if (isFolder) { long id = c.getLong(BookmarksLoader.COLUMN_INDEX_ID); @@ -497,9 +488,9 @@ public class BrowserBookmarksPage extends Fragment implements View.OnCreateConte } - private void editBookmark(int position) { + private void editBookmark(BrowserBookmarksAdapter adapter, int position) { Intent intent = new Intent(getActivity(), AddBookmarkPage.class); - Cursor cursor = mAdapter.getItem(position); + Cursor cursor = adapter.getItem(position); Bundle item = new Bundle(); item.putString(BrowserContract.Bookmarks.TITLE, cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE)); @@ -520,18 +511,19 @@ public class BrowserBookmarksPage extends Fragment implements View.OnCreateConte startActivity(intent); } - private void displayRemoveBookmarkDialog(final int position) { + private void displayRemoveBookmarkDialog(BrowserBookmarksAdapter adapter, + int position) { // Put up a dialog asking if the user really wants to // delete the bookmark - Cursor cursor = mAdapter.getItem(position); + Cursor cursor = adapter.getItem(position); long id = cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID); String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE); Context context = getActivity(); BookmarkUtils.displayRemoveBookmarkDialog(id, title, context, null); } - private String getUrl(int position) { - return getUrl(mAdapter.getItem(position)); + private String getUrl(BrowserBookmarksAdapter adapter, int position) { + return getUrl(adapter.getItem(position)); } /* package */ static String getUrl(Cursor c) { @@ -563,6 +555,7 @@ public class BrowserBookmarksPage extends Fragment implements View.OnCreateConte Resources res = getActivity().getResources(); int horizontalSpacing = (int) res.getDimension(R.dimen.combo_horizontalSpacing); mGrid.setHorizontalSpacing(horizontalSpacing); + mGrid.setColumnWidthFromLayout(R.layout.bookmark_thumbnail); int paddingLeftRight = (int) res.getDimension(R.dimen.combo_paddingLeftRight); int paddingTop = (int) res.getDimension(R.dimen.combo_paddingTop); mRoot.setPadding(paddingLeftRight, paddingTop, @@ -577,10 +570,11 @@ public class BrowserBookmarksPage extends Fragment implements View.OnCreateConte } void selectView(int view) { + // TODO: Support list view + view = mCurrentView; if (view == mCurrentView) { return; } - mCurrentView = view; SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity()); Editor edit = prefs.edit(); edit.putInt(PREF_SELECTED_VIEW, mCurrentView); @@ -592,52 +586,53 @@ public class BrowserBookmarksPage extends Fragment implements View.OnCreateConte } private void setupBookmarkView() { - mAdapter.selectView(mCurrentView); - switch (mCurrentView) { - case VIEW_THUMBNAILS: - mList.setAdapter(null); - if (mGrid.getAdapter() != mAdapter) { - mGrid.setAdapter(mAdapter); - } - mGrid.setVisibility(View.VISIBLE); - mList.setVisibility(View.GONE); - break; - case VIEW_LIST: - mGrid.setAdapter(null); - if (mList.getAdapter() != mAdapter) { - mList.setAdapter(mAdapter); - } - mGrid.setVisibility(View.GONE); - mList.setVisibility(View.VISIBLE); - break; - } + // TODO: Support list view +// mAdapter.selectView(mCurrentView); +// switch (mCurrentView) { +// case VIEW_THUMBNAILS: +// mList.setAdapter(null); +// SharedPreferences prefs = PreferenceManager +// .getDefaultSharedPreferences(getActivity()); +// String accountName = prefs.getString(PREF_ACCOUNT_NAME, null); +// mGrid.addAccount(accountName, mAdapter); +// mGrid.setVisibility(View.VISIBLE); +// mList.setVisibility(View.GONE); +// break; +// case VIEW_LIST: +// mGrid.clearAccounts(); +// if (mList.getAdapter() != mAdapter) { +// mList.setAdapter(mAdapter); +// } +// mGrid.setVisibility(View.GONE); +// mList.setVisibility(View.VISIBLE); +// break; +// } } /** * BreadCrumb controller callback */ @Override - public void onTop(int level, Object data) { + public void onTop(BreadCrumbView view, int level, Object data) { + int groupPosition = (Integer) view.getTag(R.id.group_position); Uri uri = (Uri) data; if (uri == null) { // top level uri = BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER; } - loadFolder(uri); + loadFolder(groupPosition, uri); } /** * @param uri */ - private void loadFolder(Uri uri) { + private void loadFolder(int groupPosition, Uri uri) { LoaderManager manager = getLoaderManager(); - BookmarksLoader loader = - (BookmarksLoader) ((Loader<?>) manager.getLoader(LOADER_BOOKMARKS)); + // This assumes groups are ordered the same as loaders + BookmarksLoader loader = (BookmarksLoader) ((Loader<?>) + manager.getLoader(LOADER_BOOKMARKS + groupPosition)); loader.setUri(uri); loader.forceLoad(); - if (mCallbacks != null) { - mCallbacks.onFolderChanged(mCrumbs.getTopLevel(), uri); - } } @Override @@ -654,18 +649,9 @@ public class BrowserBookmarksPage extends Fragment implements View.OnCreateConte } public boolean onBackPressed() { - if (canGoBack()) { - mCrumbs.popView(); - return true; - } return false; } - private boolean canGoBack() { - Crumb c = mCrumbs.getTopCrumb(); - return c != null && c.canGoBack; - } - public void setCallbackListener(BookmarksPageCallbacks callbackListener) { mCallbacks = callbackListener; } @@ -722,41 +708,17 @@ public class BrowserBookmarksPage extends Fragment implements View.OnCreateConte } } - public void setBreadCrumbVisibility(int visibility) { - mCrumbVisibility = visibility; - if (mCrumbs != null) { - mCrumbs.setVisibility(mCrumbVisibility); - } - } + static class AccountsLoader extends CursorLoader { - public void setBreadCrumbUseBackButton(boolean use) { - mCrumbBackButton = use; - if (mCrumbs != null) { - mCrumbs.setUseBackButton(mCrumbBackButton); - } - } + static String[] ACCOUNTS_PROJECTION = new String[] { + Accounts.ACCOUNT_NAME, + Accounts.ACCOUNT_TYPE + }; - public void setBreadCrumbMaxVisible(int max) { - mCrumbMaxVisible = max; - if (mCrumbs != null) { - mCrumbs.setMaxVisible(mCrumbMaxVisible); + public AccountsLoader(Context context) { + super(context, Accounts.CONTENT_URI, ACCOUNTS_PROJECTION, null, null, + Accounts.ACCOUNT_NAME + " ASC"); } - } - @Override - public void onSharedPreferenceChanged( - SharedPreferences sharedPreferences, String key) { - if (PREF_ACCOUNT_NAME.equals(key) || PREF_ACCOUNT_TYPE.equals(key)) { - mCrumbs.setController(null); - mCrumbs.clear(); - LoaderManager lm = getLoaderManager(); - lm.restartLoader(LOADER_BOOKMARKS, null, this); - mCrumbs.setController(this); - String name = getString(R.string.bookmarks); - mCrumbs.pushView(name, false, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER); - if (mCallbacks != null) { - mCallbacks.onFolderChanged(1, BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER); - } - } } } diff --git a/src/com/android/browser/CombinedBookmarkHistoryView.java b/src/com/android/browser/CombinedBookmarkHistoryView.java index 793f7a2..af87401 100644 --- a/src/com/android/browser/CombinedBookmarkHistoryView.java +++ b/src/com/android/browser/CombinedBookmarkHistoryView.java @@ -204,27 +204,11 @@ public class CombinedBookmarkHistoryView extends LinearLayout mUiController.onUrlSelected(BrowserBookmarksPage.getUrl(c), false); return true; } - - @Override - public void onFolderChanged(int level, Uri uri) { - final int toggleFlags = ActionBar.DISPLAY_SHOW_CUSTOM - | ActionBar.DISPLAY_HOME_AS_UP; - // 1 is "bookmarks" root folder - if (level <= 1) { - mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); - mActionBar.setDisplayOptions(0, toggleFlags); - } else { - mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); - mActionBar.setDisplayOptions(toggleFlags, toggleFlags); - } - } }; private void initFragments(Bundle extras) { mBookmarks = BrowserBookmarksPage.newInstance(mBookmarkCallbackWrapper, extras, mBookmarksHeader); - mBookmarks.setBreadCrumbMaxVisible(2); - mBookmarks.setBreadCrumbUseBackButton(false); mHistory = BrowserHistoryPage.newInstance(mUiController, extras); } diff --git a/src/com/android/browser/ShortcutActivity.java b/src/com/android/browser/ShortcutActivity.java index 16a4cbe..af1788d 100644 --- a/src/com/android/browser/ShortcutActivity.java +++ b/src/com/android/browser/ShortcutActivity.java @@ -38,8 +38,6 @@ public class ShortcutActivity extends Activity mBookmarks = (BrowserBookmarksPage) getFragmentManager() .findFragmentById(R.id.bookmarks); mBookmarks.setEnableContextMenu(false); - mBookmarks.setBreadCrumbMaxVisible(2); - mBookmarks.setBreadCrumbUseBackButton(true); mBookmarks.setCallbackListener(this); View cancel = findViewById(R.id.cancel); if (cancel != null) { @@ -73,10 +71,6 @@ public class ShortcutActivity extends Activity } @Override - public void onFolderChanged(int level, Uri uri) { - } - - @Override public void onClick(View v) { switch (v.getId()) { case R.id.cancel: diff --git a/src/com/android/browser/provider/BrowserProvider2.java b/src/com/android/browser/provider/BrowserProvider2.java index d154f20..7d94c7a 100644 --- a/src/com/android/browser/provider/BrowserProvider2.java +++ b/src/com/android/browser/provider/BrowserProvider2.java @@ -653,7 +653,7 @@ public class BrowserProvider2 extends SQLiteContentProvider { qb.setTables(TABLE_BOOKMARKS); qb.setProjectionMap(ACCOUNTS_PROJECTION_MAP); qb.setDistinct(true); - qb.appendWhere(Bookmarks.ACCOUNT_NAME + " IS NOT NULL"); + qb.appendWhere(Bookmarks.IS_DELETED + "=0"); break; } diff --git a/src/com/android/browser/view/BookmarkContainer.java b/src/com/android/browser/view/BookmarkContainer.java new file mode 100644 index 0000000..260b05e --- /dev/null +++ b/src/com/android/browser/view/BookmarkContainer.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.browser.view; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.StateListDrawable; +import android.graphics.drawable.TransitionDrawable; +import android.util.AttributeSet; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewConfiguration; +import android.widget.RelativeLayout; + +public class BookmarkContainer extends RelativeLayout implements OnClickListener { + + private OnClickListener mClickListener; + + public BookmarkContainer(Context context) { + super(context); + init(); + } + + public BookmarkContainer(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public BookmarkContainer( + Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(); + } + + void init() { + setFocusable(true); + super.setOnClickListener(this); + } + + @Override + public void setBackgroundDrawable(Drawable d) { + super.setBackgroundDrawable(d); + } + + @Override + public void setOnClickListener(OnClickListener l) { + mClickListener = l; + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + updateTransitionDrawable(isPressed()); + } + + void updateTransitionDrawable(boolean pressed) { + final int longPressTimeout = ViewConfiguration.getLongPressTimeout(); + Drawable selector = getBackground(); + if (selector != null && selector instanceof StateListDrawable) { + Drawable d = ((StateListDrawable)selector).getCurrent(); + if (d != null && d instanceof TransitionDrawable) { + if (pressed && isLongClickable()) { + ((TransitionDrawable) d).startTransition(longPressTimeout); + } else { + ((TransitionDrawable) d).resetTransition(); + } + } + } + } + + @Override + public void onClick(View view) { + updateTransitionDrawable(false); + if (mClickListener != null) { + mClickListener.onClick(view); + } + } +} diff --git a/src/com/android/browser/view/BookmarkExpandableGridView.java b/src/com/android/browser/view/BookmarkExpandableGridView.java new file mode 100644 index 0000000..1d603cc --- /dev/null +++ b/src/com/android/browser/view/BookmarkExpandableGridView.java @@ -0,0 +1,424 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.browser.view; + +import com.android.browser.BreadCrumbView; +import com.android.browser.BrowserBookmarksAdapter; +import com.android.browser.R; +import com.android.internal.view.menu.MenuBuilder; + +import android.content.Context; +import android.database.DataSetObserver; +import android.provider.BrowserContract; +import android.util.AttributeSet; +import android.view.ContextMenu; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseExpandableListAdapter; +import android.widget.ExpandableListAdapter; +import android.widget.ExpandableListView; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.TextView; + +import java.util.ArrayList; +import java.util.HashMap; + +public class BookmarkExpandableGridView extends ExpandableListView + implements BreadCrumbView.Controller { + + private BookmarkAccountAdapter mAdapter; + private int mColumnWidth; + private Context mContext; + private OnChildClickListener mOnChildClickListener; + private ContextMenuInfo mContextMenuInfo = null; + private OnCreateContextMenuListener mOnCreateContextMenuListener; + private boolean mLongClickable; + private BreadCrumbView.Controller mBreadcrumbController; + + public BookmarkExpandableGridView(Context context) { + super(context); + init(context); + } + + public BookmarkExpandableGridView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context); + } + + public BookmarkExpandableGridView( + Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(context); + } + + void init(Context context) { + mContext = context; + setItemsCanFocus(true); + setLongClickable(false); + mAdapter = new BookmarkAccountAdapter(mContext); + super.setAdapter(mAdapter); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + mAdapter.measureChildren(); + } + + @Override + public void setAdapter(ExpandableListAdapter adapter) { + throw new RuntimeException("Not supported"); + } + + public void setColumnWidthFromLayout(int layout) { + LayoutInflater infalter = LayoutInflater.from(mContext); + View v = infalter.inflate(layout, this, false); + v.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED); + mColumnWidth = v.getMeasuredWidth(); + } + + public void setHorizontalSpacing(int horizontalSpacing) { + // TODO Auto-generated method stub + } + + public void clearAccounts() { + mAdapter.clear(); + } + + public void addAccount(String accountName, BrowserBookmarksAdapter adapter) { + // First, check if it already exists + int indexOf = mAdapter.mGroups.indexOf(accountName); + if (indexOf >= 0) { + BrowserBookmarksAdapter existing = mAdapter.mChildren.get(indexOf); + if (existing != adapter) { + existing.unregisterDataSetObserver(mAdapter.mObserver); + // Replace the existing one + mAdapter.mChildren.remove(indexOf); + mAdapter.mChildren.add(indexOf, adapter); + adapter.registerDataSetObserver(mAdapter.mObserver); + } + } else { + mAdapter.mGroups.add(accountName); + mAdapter.mChildren.add(adapter); + adapter.registerDataSetObserver(mAdapter.mObserver); + } + mAdapter.notifyDataSetChanged(); + expandGroup(mAdapter.getGroupCount() - 1); + } + + @Override + public void setOnChildClickListener(OnChildClickListener onChildClickListener) { + mOnChildClickListener = onChildClickListener; + } + + @Override + public void setOnCreateContextMenuListener(OnCreateContextMenuListener l) { + mOnCreateContextMenuListener = l; + if (!mLongClickable) { + mLongClickable = true; + if (mAdapter != null) { + mAdapter.notifyDataSetChanged(); + } + } + } + + @Override + public void createContextMenu(ContextMenu menu) { + // The below is copied from View - we want to bypass the override + // in AbsListView + + ContextMenuInfo menuInfo = getContextMenuInfo(); + + // Sets the current menu info so all items added to menu will have + // my extra info set. + ((MenuBuilder)menu).setCurrentMenuInfo(menuInfo); + + onCreateContextMenu(menu); + if (mOnCreateContextMenuListener != null) { + mOnCreateContextMenuListener.onCreateContextMenu(menu, this, menuInfo); + } + + // Clear the extra information so subsequent items that aren't mine don't + // have my extra info. + ((MenuBuilder)menu).setCurrentMenuInfo(null); + + if (mParent != null) { + mParent.createContextMenu(menu); + } + } + + @Override + public boolean showContextMenuForChild(View originalView) { + int groupPosition = (Integer) originalView.getTag(R.id.group_position); + int childPosition = (Integer) originalView.getTag(R.id.child_position); + + mContextMenuInfo = new BookmarkContextMenuInfo(originalView, + childPosition, groupPosition); + if (getParent() != null) { + getParent().showContextMenuForChild(this); + } + + return true; + } + + @Override + public void onTop(BreadCrumbView view, int level, Object data) { + if (mBreadcrumbController != null) { + mBreadcrumbController.onTop(view, level, data); + } + } + + public void setBreadcrumbController(BreadCrumbView.Controller controller) { + mBreadcrumbController = controller; + } + + @Override + protected ContextMenuInfo getContextMenuInfo() { + return mContextMenuInfo; + } + + public BrowserBookmarksAdapter getChildAdapter(int groupPosition) { + return mAdapter.mChildren.get(groupPosition); + } + + private OnClickListener mChildClickListener = new OnClickListener() { + + @Override + public void onClick(View v) { + int groupPosition = (Integer) v.getTag(R.id.group_position); + int childPosition = (Integer) v.getTag(R.id.child_position); + long id = (Long) v.getTag(R.id.child_id); + if (mOnChildClickListener != null) { + mOnChildClickListener.onChildClick(BookmarkExpandableGridView.this, + v, groupPosition, childPosition, id); + } + } + }; + + private OnClickListener mGroupOnClickListener = new OnClickListener() { + + @Override + public void onClick(View v) { + int groupPosition = (Integer) v.getTag(R.id.group_position); + if (isGroupExpanded(groupPosition)) { + collapseGroup(groupPosition); + } else { + expandGroup(groupPosition); + } + } + }; + + public BreadCrumbView getBreadCrumbs(int groupPosition) { + return mAdapter.getBreadCrumbView(groupPosition); + } + + class BookmarkAccountAdapter extends BaseExpandableListAdapter { + ArrayList<BrowserBookmarksAdapter> mChildren; + ArrayList<String> mGroups; + HashMap<Integer, BreadCrumbView> mBreadcrumbs = + new HashMap<Integer, BreadCrumbView>(); + LayoutInflater mInflater; + int mRowCount = 1; // assume at least 1 child fits in a row + int mLastViewWidth = -1; + int mRowPadding = -1; + DataSetObserver mObserver = new DataSetObserver() { + @Override + public void onChanged() { + notifyDataSetChanged(); + } + + @Override + public void onInvalidated() { + notifyDataSetChanged(); + } + }; + + public BookmarkAccountAdapter(Context context) { + mContext = context; + mInflater = LayoutInflater.from(mContext); + mChildren = new ArrayList<BrowserBookmarksAdapter>(); + mGroups = new ArrayList<String>(); + } + + public void clear() { + mGroups.clear(); + mChildren.clear(); + notifyDataSetChanged(); + } + + @Override + public Object getChild(int groupPosition, int childPosition) { + return mChildren.get(groupPosition).getItem(childPosition); + } + + @Override + public long getChildId(int groupPosition, int childPosition) { + return childPosition; + } + + @Override + public View getChildView(int groupPosition, int childPosition, + boolean isLastChild, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = mInflater.inflate(R.layout.bookmark_grid_row, parent, false); + } + LinearLayout row = (LinearLayout) convertView; + row.setPadding( + mRowPadding, + row.getPaddingTop(), + mRowPadding, + row.getPaddingBottom()); + if (row.getChildCount() > mRowCount) { + row.removeViews(mRowCount, row.getChildCount() - mRowCount); + } + for (int i = 0; i < mRowCount; i++) { + View cv = null; + if (row.getChildCount() > i) { + cv = row.getChildAt(i); + } + int realChildPosition = (childPosition * mRowCount) + i; + BrowserBookmarksAdapter childAdapter = mChildren.get(groupPosition); + if (realChildPosition < childAdapter.getCount()) { + View v = childAdapter.getView(realChildPosition, cv, row); + v.setTag(R.id.group_position, groupPosition); + v.setTag(R.id.child_position, realChildPosition); + v.setTag(R.id.child_id, childAdapter.getItemId(realChildPosition)); + v.setOnClickListener(mChildClickListener); + v.setLongClickable(mLongClickable); + if (cv == null) { + row.addView(v); + } else if (cv != v) { + row.removeViewAt(i); + row.addView(v, i); + } else { + cv.setVisibility(View.VISIBLE); + } + } else if (cv != null) { + cv.setVisibility(View.GONE); + } + } + return row; + } + + @Override + public int getChildrenCount(int groupPosition) { + return (int) Math.ceil( + mChildren.get(groupPosition).getCount() / (float)mRowCount); + } + + @Override + public Object getGroup(int groupPosition) { + return mChildren.get(groupPosition); + } + + @Override + public int getGroupCount() { + return mGroups.size(); + } + + public void measureChildren() { + int viewWidth = getMeasuredWidth(); + if (mLastViewWidth == viewWidth) return; + + ViewGroup parent = (ViewGroup) mInflater.inflate(R.layout.bookmark_grid_row, null); + viewWidth -= parent.getPaddingLeft() + parent.getPaddingRight(); + int rowCount = viewWidth / mColumnWidth; + int rowPadding = (viewWidth - (rowCount * mColumnWidth)) / 2; + boolean notify = rowCount != mRowCount || rowPadding != mRowPadding; + mRowCount = rowCount; + mRowPadding = rowPadding; + mLastViewWidth = viewWidth; + if (notify) { + notifyDataSetChanged(); + } + } + + @Override + public long getGroupId(int groupPosition) { + return groupPosition; + } + + @Override + public View getGroupView(int groupPosition, boolean isExpanded, + View view, ViewGroup parent) { + if (view == null) { + view = mInflater.inflate(R.layout.bookmark_group_view, parent, false); + view.setOnClickListener(mGroupOnClickListener); + } + view.setTag(R.id.group_position, groupPosition); + FrameLayout crumbHolder = (FrameLayout) view.findViewById(R.id.crumb_holder); + crumbHolder.removeAllViews(); + BreadCrumbView crumbs = getBreadCrumbView(groupPosition); + if (crumbs.getParent() != null) { + ((ViewGroup)crumbs.getParent()).removeView(crumbs); + } + crumbHolder.addView(crumbs); + TextView name = (TextView) view.findViewById(R.id.group_name); + String groupName = mGroups.get(groupPosition); + if (groupName == null) { + groupName = mContext.getString(R.string.local_bookmarks); + } + name.setText(groupName); + return view; + } + + public BreadCrumbView getBreadCrumbView(int groupPosition) { + BreadCrumbView crumbs = mBreadcrumbs.get(groupPosition); + if (crumbs == null) { + crumbs = (BreadCrumbView) + mInflater.inflate(R.layout.bookmarks_header, null); + crumbs.setController(BookmarkExpandableGridView.this); + crumbs.setUseBackButton(true); + crumbs.setMaxVisible(2); + String bookmarks = mContext.getString(R.string.bookmarks); + crumbs.pushView(bookmarks, false, + BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER); + crumbs.setTag(R.id.group_position, groupPosition); + mBreadcrumbs.put(groupPosition, crumbs); + } + return crumbs; + } + + @Override + public boolean hasStableIds() { + return false; + } + + @Override + public boolean isChildSelectable(int groupPosition, int childPosition) { + return true; + } + } + + public static class BookmarkContextMenuInfo implements ContextMenuInfo { + + private BookmarkContextMenuInfo(View targetView, int childPosition, + int groupPosition) { + this.targetView = targetView; + this.childPosition = childPosition; + this.groupPosition = groupPosition; + } + + public View targetView; + public int childPosition; + public int groupPosition; + } + +} |