Make the "Most visited" page have a thumbnail viewing mode.
Start capturing screenshots for all visited pages, and show them
in a grid view on the most visited page. Modify the BrowserBookmarks-
Page and Adapter so they can be used for the "Most visited" page.
Also change some of the ids for context menu items to be the same
in the browser and history context menus, for simplicity in
handling them in BrowserBookmarksPage.
diff --git a/res/menu/bookmarkscontext.xml b/res/menu/bookmarkscontext.xml
index ba5d1dc..badbb00 100644
--- a/res/menu/bookmarkscontext.xml
+++ b/res/menu/bookmarkscontext.xml
@@ -28,8 +28,8 @@
android:title="@string/edit_bookmark"/>
<item android:id="@+id/shortcut_context_menu_id"
android:title="@string/create_shortcut_bookmark"/>
- <item android:id="@+id/send_context_menu_id"
- android:title="@string/tab_picker_send_url"/>
+ <item android:id="@+id/share_link_context_menu_id"
+ android:title="@string/contextmenu_sharelink"/>
<item android:id="@+id/copy_url_context_menu_id"
android:title="@string/contextmenu_copylink"/>
<item android:id="@+id/delete_context_menu_id"
diff --git a/res/menu/historycontext.xml b/res/menu/historycontext.xml
index 5306396..bd4ede4 100644
--- a/res/menu/historycontext.xml
+++ b/res/menu/historycontext.xml
@@ -23,7 +23,7 @@
android:title="@string/save_to_bookmarks"/>
<item android:id="@+id/share_link_context_menu_id"
android:title="@string/contextmenu_sharelink"/>
- <item android:id="@+id/copy_context_menu_id"
+ <item android:id="@+id/copy_url_context_menu_id"
android:title="@string/contextmenu_copylink"/>
<item android:id="@+id/delete_context_menu_id"
android:title="@string/remove_history_item"/>
diff --git a/src/com/android/browser/AddBookmarkPage.java b/src/com/android/browser/AddBookmarkPage.java
index d269546..87638d8 100644
--- a/src/com/android/browser/AddBookmarkPage.java
+++ b/src/com/android/browser/AddBookmarkPage.java
@@ -150,7 +150,7 @@
if (mTouchIconUrl != null) {
final Cursor c =
BrowserBookmarksAdapter.queryBookmarksForUrl(
- cr, null, url);
+ cr, null, url, true);
new DownloadTouchIcon(cr, c, url)
.execute(mTouchIconUrl);
}
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 3c46fc9..68ccf79 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -2929,7 +2929,7 @@
// currently accessible here.
ContentResolver cr = getContentResolver();
final Cursor c = BrowserBookmarksAdapter.queryBookmarksForUrl(
- cr, view.getOriginalUrl(), view.getUrl());
+ cr, view.getOriginalUrl(), view.getUrl(), false);
if (c != null) {
boolean succeed = c.moveToFirst();
ContentValues values = null;
@@ -3790,7 +3790,7 @@
final ContentResolver cr = getContentResolver();
final Cursor c =
BrowserBookmarksAdapter.queryBookmarksForUrl(cr,
- view.getOriginalUrl(), view.getUrl());
+ view.getOriginalUrl(), view.getUrl(), true);
if (c != null) {
if (c.getCount() > 0) {
new DownloadTouchIcon(cr, c, view).execute(url);
diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index c3ccdfd..bf74ba2 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -52,10 +52,9 @@
private ContentResolver mContentResolver;
private boolean mDataValid;
private boolean mGridMode;
-
- // When true, this adapter is used to pick a bookmark to create a shortcut
- private boolean mCreateShortcut;
- private int mExtraOffset;
+ private boolean mMostVisited;
+ private boolean mNeedsOffset;
+ private int mExtraOffset;
// Implementation of WebIconDatabase.IconListener
private class IconReceiver implements IconListener {
@@ -74,10 +73,10 @@
* appropriately after a search.
*/
public BrowserBookmarksAdapter(BrowserBookmarksPage b, String curPage,
- String curTitle, boolean createShortcut) {
- mDataValid = false;
- mCreateShortcut = createShortcut;
- mExtraOffset = createShortcut ? 0 : 1;
+ String curTitle, boolean createShortcut, boolean mostVisited) {
+ mNeedsOffset = !(createShortcut || mostVisited);
+ mMostVisited = mostVisited;
+ mExtraOffset = mNeedsOffset ? 1 : 0;
mBookmarksPage = b;
mCurrentPage = b.getResources().getString(R.string.current_page)
+ curPage;
@@ -85,9 +84,14 @@
mContentResolver = b.getContentResolver();
mGridMode = false;
+ String whereClause;
// FIXME: Should have a default sort order that the user selects.
- String whereClause = Browser.BookmarkColumns.BOOKMARK + " != 0";
String orderBy = Browser.BookmarkColumns.VISITS + " DESC";
+ if (mostVisited) {
+ whereClause = Browser.BookmarkColumns.VISITS + " != 0";
+ } else {
+ whereClause = Browser.BookmarkColumns.BOOKMARK + " != 0";
+ }
mCursor = b.managedQuery(Browser.BOOKMARKS_URI,
Browser.HISTORY_PROJECTION, whereClause, null, orderBy);
mCursor.registerContentObserver(new ChangeObserver());
@@ -264,7 +268,7 @@
private static void updateBookmarkFavicon(ContentResolver cr,
String originalUrl, String url, Bitmap favicon) {
- final Cursor c = queryBookmarksForUrl(cr, originalUrl, url);
+ final Cursor c = queryBookmarksForUrl(cr, originalUrl, url, true);
if (c == null) {
return;
}
@@ -285,7 +289,7 @@
}
/* package */ static Cursor queryBookmarksForUrl(ContentResolver cr,
- String originalUrl, String url) {
+ String originalUrl, String url, boolean onlyBookmarks) {
if (cr == null || url == null) {
return null;
}
@@ -309,11 +313,13 @@
// http://www.google.com/m?some_query)
final String[] selArgs = new String[] {
originalUrlNoQuery, urlNoQuery, originalUrl, url };
- final String where = "(" + BookmarkColumns.URL + " == ? OR "
+ String where = BookmarkColumns.URL + " == ? OR "
+ BookmarkColumns.URL + " == ? OR "
+ BookmarkColumns.URL + " GLOB ? || '*' OR "
- + BookmarkColumns.URL + " GLOB ? || '*') AND "
- + BookmarkColumns.BOOKMARK + " == 1";
+ + BookmarkColumns.URL + " GLOB ? || '*'";
+ if (onlyBookmarks) {
+ where = "(" + where + ") AND " + BookmarkColumns.BOOKMARK + " == 1";
+ }
final String[] projection =
new String[] { Browser.BookmarkColumns._ID };
return cr.query(Browser.BOOKMARKS_URI, projection, where, selArgs,
@@ -411,7 +417,7 @@
ImageView thumb = (ImageView) convertView.findViewById(R.id.thumb);
TextView tv = (TextView) convertView.findViewById(R.id.label);
- if (0 == position && !mCreateShortcut) {
+ if (0 == position && mNeedsOffset) {
// This is to create a bookmark for the current page.
holder.setVisibility(View.VISIBLE);
tv.setText(mCurrentTitle);
@@ -436,7 +442,7 @@
return convertView;
}
- if (position == 0 && !mCreateShortcut) {
+ if (position == 0 && mNeedsOffset) {
AddNewBookmark b;
if (convertView instanceof AddNewBookmark) {
b = (AddNewBookmark) convertView;
@@ -446,10 +452,20 @@
b.setUrl(mCurrentPage);
return b;
}
- if (convertView == null || !(convertView instanceof BookmarkItem)) {
- convertView = new BookmarkItem(mBookmarksPage);
+ if (mMostVisited) {
+ if (convertView == null || !(convertView instanceof HistoryItem)) {
+ convertView = new HistoryItem(mBookmarksPage);
+ }
+ } else {
+ if (convertView == null || !(convertView instanceof BookmarkItem)) {
+ convertView = new BookmarkItem(mBookmarksPage);
+ }
}
- bind((BookmarkItem)convertView, position);
+ bind((BookmarkItem) convertView, position);
+ if (mMostVisited) {
+ ((HistoryItem) convertView).setIsBookmark(
+ getIsBookmark(position));
+ }
return convertView;
}
@@ -491,6 +507,17 @@
}
/**
+ * Return whether or not this item represents a bookmarked site.
+ */
+ public boolean getIsBookmark(int position) {
+ if (position < mExtraOffset || position > mCount) {
+ return false;
+ }
+ mCursor.moveToPosition(position - mExtraOffset);
+ return (1 == mCursor.getInt(Browser.HISTORY_PROJECTION_BOOKMARK_INDEX));
+ }
+
+ /**
* Private helper function to return the title or url.
*/
private String getString(int cursorIndex, int position) {
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index 0fc2643..caadfdd 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -45,6 +45,8 @@
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+import android.view.ViewStub;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.GridView;
@@ -67,6 +69,8 @@
private AddNewBookmark mAddHeader;
private boolean mCanceled = false;
private boolean mCreateShortcut;
+ private boolean mMostVisited;
+ private View mEmptyView;
// XXX: There is no public string defining this intent so if Home changes
// the value, we have to update this string.
private static final String INSTALL_SHORTCUT =
@@ -105,12 +109,18 @@
sendBroadcast(send);
break;
case R.id.delete_context_menu_id:
- displayRemoveBookmarkDialog(i.position);
+ if (mMostVisited) {
+ Browser.deleteFromHistory(getContentResolver(),
+ getUrl(i.position));
+ refreshList();
+ } else {
+ displayRemoveBookmarkDialog(i.position);
+ }
break;
case R.id.new_window_context_menu_id:
openInNewWindow(i.position);
break;
- case R.id.send_context_menu_id:
+ case R.id.share_link_context_menu_id:
Browser.sendString(BrowserBookmarksPage.this, getUrl(i.position));
break;
case R.id.copy_url_context_menu_id:
@@ -122,6 +132,19 @@
Toast.makeText(this, R.string.homepage_set,
Toast.LENGTH_LONG).show();
break;
+ // Only for the Most visited page
+ case R.id.save_to_bookmarks_menu_id:
+ HistoryItem historyItem = ((HistoryItem) i.targetView);
+ // If the site is bookmarked, the item becomes remove from
+ // bookmarks.
+ if (historyItem.isBookmark()) {
+ Bookmarks.removeFromBookmarks(this, getContentResolver(),
+ historyItem.getUrl());
+ } else {
+ Browser.saveBookmark(this, historyItem.getName(),
+ historyItem.getUrl());
+ }
+ break;
default:
return super.onContextItemSelected(item);
}
@@ -135,9 +158,13 @@
(AdapterView.AdapterContextMenuInfo) menuInfo;
MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.bookmarkscontext, menu);
+ if (mMostVisited) {
+ inflater.inflate(R.menu.historycontext, menu);
+ } else {
+ inflater.inflate(R.menu.bookmarkscontext, menu);
+ }
- if (0 == i.position) {
+ if (0 == i.position && !mMostVisited) {
menu.setGroupVisible(R.id.CONTEXT_MENU, false);
if (mAddHeader == null) {
mAddHeader = new AddNewBookmark(BrowserBookmarksPage.this);
@@ -149,7 +176,17 @@
menu.setHeaderView(mAddHeader);
return;
}
- menu.setGroupVisible(R.id.ADD_MENU, false);
+ if (mMostVisited) {
+ if ((!mGridMode && ((HistoryItem) i.targetView).isBookmark())
+ || mBookmarksAdapter.getIsBookmark(i.position)) {
+ MenuItem item = menu.findItem(
+ R.id.save_to_bookmarks_menu_id);
+ item.setTitle(R.string.remove_from_bookmarks);
+ }
+ } else {
+ // The historycontext menu has no ADD_MENU group.
+ menu.setGroupVisible(R.id.ADD_MENU, false);
+ }
if (mMaxTabsOpen) {
menu.findItem(R.id.new_window_context_menu_id).setVisible(
false);
@@ -181,11 +218,18 @@
mCreateShortcut = true;
}
mMaxTabsOpen = getIntent().getBooleanExtra("maxTabsOpen", false);
+ mMostVisited = getIntent().getBooleanExtra("mostVisited", false);
- setTitle(R.string.browser_bookmarks_page_bookmarks_text);
+ if (mCreateShortcut) {
+ setTitle(R.string.browser_bookmarks_page_bookmarks_text);
+ }
mBookmarksAdapter = new BrowserBookmarksAdapter(this,
getIntent().getStringExtra("url"),
- getIntent().getStringExtra("title"), mCreateShortcut);
+ getIntent().getStringExtra("title"), mCreateShortcut,
+ mMostVisited);
+ if (mMostVisited) {
+ mEmptyView = new ViewStub(this, R.layout.empty_history);
+ }
switchViewMode(true);
}
@@ -209,6 +253,9 @@
mGridPage.setFocusableInTouchMode(true);
mGridPage.setSelector(android.R.drawable.gallery_thumb);
mGridPage.setVerticalSpacing(10);
+ if (mMostVisited) {
+ mGridPage.setEmptyView(mEmptyView);
+ }
if (!mCreateShortcut) {
mGridPage.setOnCreateContextMenuListener(this);
}
@@ -226,6 +273,9 @@
listView.setDrawSelectorOnTop(false);
listView.setVerticalScrollBarEnabled(true);
listView.setOnItemClickListener(mListener);
+ if (mMostVisited) {
+ listView.setEmptyView(mEmptyView);
+ }
if (!mCreateShortcut) {
listView.setOnCreateContextMenuListener(this);
@@ -233,6 +283,10 @@
}
setContentView(mVerticalList);
}
+ if (mMostVisited) {
+ addContentView(mEmptyView, new LayoutParams(
+ LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
+ }
}
private static final int SAVE_CURRENT_PAGE = 1000;
@@ -254,7 +308,7 @@
return;
}
if (!mCreateShortcut) {
- if (0 == position) {
+ if (0 == position && !mMostVisited) {
// XXX: Work-around for a framework issue.
mHandler.sendEmptyMessage(SAVE_CURRENT_PAGE);
} else {
@@ -366,6 +420,9 @@
if (!mCreateShortcut) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.bookmarks, menu);
+ // Most visited page does not have an option to bookmark the last
+ // viewed page.
+ menu.findItem(R.id.new_context_menu_id).setVisible(!mMostVisited);
return true;
}
return result;
@@ -373,6 +430,10 @@
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
+ if (mBookmarksAdapter.getCount() == 0) {
+ // No need to show the menu if there are no items.
+ return false;
+ }
menu.findItem(R.id.switch_mode_menu_id).setTitle(
mGridMode ? R.string.switch_to_list
: R.string.switch_to_thumbnails);
diff --git a/src/com/android/browser/BrowserHistoryPage.java b/src/com/android/browser/BrowserHistoryPage.java
index 335d8fe..cb8340e 100644
--- a/src/com/android/browser/BrowserHistoryPage.java
+++ b/src/com/android/browser/BrowserHistoryPage.java
@@ -236,7 +236,7 @@
case R.id.share_link_context_menu_id:
Browser.sendString(this, url);
return true;
- case R.id.copy_context_menu_id:
+ case R.id.copy_url_context_menu_id:
copy(url);
return true;
case R.id.delete_context_menu_id:
diff --git a/src/com/android/browser/CombinedBookmarkHistoryActivity.java b/src/com/android/browser/CombinedBookmarkHistoryActivity.java
index 26fd1ee..7162c88 100644
--- a/src/com/android/browser/CombinedBookmarkHistoryActivity.java
+++ b/src/com/android/browser/CombinedBookmarkHistoryActivity.java
@@ -91,8 +91,12 @@
bookmarksIntent.putExtras(extras);
createTab(bookmarksIntent, R.string.tab_bookmarks, BOOKMARKS_TAB);
- Intent visitedIntent = new Intent(this, MostVisitedActivity.class);
- visitedIntent.putExtras(extras);
+ Intent visitedIntent = new Intent(this, BrowserBookmarksPage.class);
+ // Need to copy extras so the bookmarks activity and this one will be
+ // different
+ Bundle visitedExtras = new Bundle(extras);
+ visitedExtras.putBoolean("mostVisited", true);
+ visitedIntent.putExtras(visitedExtras);
createTab(visitedIntent, R.string.tab_most_visited, VISITED_TAB);
Intent historyIntent = new Intent(this, BrowserHistoryPage.class);