import android.database.Cursor;
import android.database.DataSetObserver;
import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.ServiceManager;
import android.text.IClipboard;
import android.util.Log;
import android.view.ContextMenu;
-import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.ViewStub;
import android.webkit.DateSorter;
import android.webkit.WebIconDatabase.IconListener;
-import android.widget.AdapterView;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
import android.widget.TextView;
import android.widget.Toast;
-import java.util.List;
import java.util.Vector;
/**
public class BrowserHistoryPage extends ExpandableListActivity {
private HistoryAdapter mAdapter;
private DateSorter mDateSorter;
- private boolean mMaxTabsOpen;
+ private boolean mDisableNewWindow;
+ private HistoryItem mContextHeader;
private final static String LOGTAG = "browser";
final ExpandableListView list = getExpandableListView();
list.setOnCreateContextMenuListener(this);
View v = new ViewStub(this, R.layout.empty_history);
- addContentView(v, new LayoutParams(LayoutParams.FILL_PARENT,
- LayoutParams.FILL_PARENT));
+ addContentView(v, new LayoutParams(LayoutParams.MATCH_PARENT,
+ LayoutParams.MATCH_PARENT));
list.setEmptyView(v);
// Do not post the runnable if there is nothing in the list.
if (list.getExpandableListAdapter().getGroupCount() > 0) {
}
});
}
- mMaxTabsOpen = getIntent().getBooleanExtra("maxTabsOpen", false);
- CombinedBookmarkHistoryActivity.getIconListenerSet(getContentResolver())
+ mDisableNewWindow = getIntent().getBooleanExtra("disable_new_window",
+ false);
+ CombinedBookmarkHistoryActivity.getIconListenerSet()
.addListener(mIconReceiver);
// initialize the result to canceled, so that if the user just presses
}
@Override
+ protected void onDestroy() {
+ super.onDestroy();
+ CombinedBookmarkHistoryActivity.getIconListenerSet()
+ .removeListener(mIconReceiver);
+ }
+
+ @Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
}
return super.onOptionsItemSelected(item);
}
-
+
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.historycontext, menu);
+ HistoryItem historyItem = (HistoryItem) i.targetView;
+
// Setup the header
- menu.setHeaderTitle(((HistoryItem)i.targetView).getUrl());
+ if (mContextHeader == null) {
+ mContextHeader = new HistoryItem(this);
+ } else if (mContextHeader.getParent() != null) {
+ ((ViewGroup) mContextHeader.getParent()).removeView(mContextHeader);
+ }
+ historyItem.copyTo(mContextHeader);
+ menu.setHeaderView(mContextHeader);
- // Only show open in new tab if we have not maxed out available tabs
- menu.findItem(R.id.new_window_context_menu_id).setVisible(!mMaxTabsOpen);
-
+ // Only show open in new tab if it was not explicitly disabled
+ if (mDisableNewWindow) {
+ menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
+ }
+ // For a bookmark, provide the option to remove it from bookmarks
+ if (historyItem.isBookmark()) {
+ MenuItem item = menu.findItem(R.id.save_to_bookmarks_menu_id);
+ item.setTitle(R.string.remove_from_bookmarks);
+ }
// decide whether to show the share link option
PackageManager pm = getPackageManager();
Intent send = new Intent(Intent.ACTION_SEND);
public boolean onContextItemSelected(MenuItem item) {
ExpandableListContextMenuInfo i =
(ExpandableListContextMenuInfo) item.getMenuInfo();
- String url = ((HistoryItem)i.targetView).getUrl();
- String title = ((HistoryItem)i.targetView).getName();
+ HistoryItem historyItem = (HistoryItem) i.targetView;
+ String url = historyItem.getUrl();
+ String title = historyItem.getName();
switch (item.getItemId()) {
case R.id.open_context_menu_id:
loadUrl(url, false);
loadUrl(url, true);
return true;
case R.id.save_to_bookmarks_menu_id:
- Browser.saveBookmark(this, title, url);
+ if (historyItem.isBookmark()) {
+ Bookmarks.removeFromBookmarks(this, getContentResolver(),
+ url, title);
+ } else {
+ Browser.saveBookmark(this, title, url);
+ }
return true;
case R.id.share_link_context_menu_id:
- Browser.sendString(this, url);
+ Browser.sendString(this, url,
+ getText(R.string.choosertitle_sharevia).toString());
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:
}
void refreshData() {
+ if (mCursor.isClosed()) {
+ return;
+ }
mCursor.requery();
buildMap();
for (DataSetObserver o : mObservers) {
} else {
item = (HistoryItem) convertView;
}
+ // Bail early if the Cursor is closed.
+ if (mCursor.isClosed()) return item;
int index = childPosition;
for (int i = 0; i < groupPosition; i++) {
index += mItemMap[i];
item.setName(mCursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX));
String url = mCursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX);
item.setUrl(url);
- item.setFavicon(CombinedBookmarkHistoryActivity.getIconListenerSet(
- getContentResolver()).getFavicon(url));
+ byte[] data = mCursor.getBlob(Browser.HISTORY_PROJECTION_FAVICON_INDEX);
+ if (data != null) {
+ item.setFavicon(BitmapFactory.decodeByteArray(data, 0,
+ data.length));
+ } else {
+ item.setFavicon(CombinedBookmarkHistoryActivity
+ .getIconListenerSet().getFavicon(url));
+ }
item.setIsBookmark(1 ==
mCursor.getInt(Browser.HISTORY_PROJECTION_BOOKMARK_INDEX));
return item;
}
public boolean isEmpty() {
- return mCursor.getCount() == 0;
+ return mCursor.isClosed() || mCursor.getCount() == 0;
}
}
}