@Override
  public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    AdapterView.AdapterContextMenuInfo i = (AdapterView.AdapterContextMenuInfo) menuInfo;

    MenuInflater inflater = getMenuInflater();
    if (mMostVisited) {
      inflater.inflate(R.menu.historycontext, menu);
    } else {
      inflater.inflate(R.menu.bookmarkscontext, menu);
    }

    if (0 == i.position && !mMostVisited) {
      menu.setGroupVisible(R.id.CONTEXT_MENU, false);
      if (mAddHeader == null) {
        mAddHeader = new AddNewBookmark(BrowserBookmarksPage.this);
      } else if (mAddHeader.getParent() != null) {
        ((ViewGroup) mAddHeader.getParent()).removeView(mAddHeader);
      }
      mAddHeader.setUrl(getIntent().getStringExtra("url"));
      menu.setHeaderView(mAddHeader);
      return;
    }
    if (mMostVisited) {
      if ((mViewMode == BookmarkViewMode.LIST && ((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 (mDisableNewWindow) {
      menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
    }
    if (mContextHeader == null) {
      mContextHeader = new BookmarkItem(BrowserBookmarksPage.this);
    } else if (mContextHeader.getParent() != null) {
      ((ViewGroup) mContextHeader.getParent()).removeView(mContextHeader);
    }
    if (mViewMode == BookmarkViewMode.GRID) {
      mBookmarksAdapter.populateBookmarkItem(mContextHeader, i.position);
    } else {
      BookmarkItem b = (BookmarkItem) i.targetView;
      b.copyTo(mContextHeader);
    }
    menu.setHeaderView(mContextHeader);
  }
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   switch (requestCode) {
     case BOOKMARKS_SAVE:
       if (resultCode == RESULT_OK) {
         Bundle extras;
         if (data != null && (extras = data.getExtras()) != null) {
           // If there are extras, then we need to save
           // the edited bookmark. This is done in updateRow()
           String title = extras.getString("title");
           String url = extras.getString("url");
           if (title != null && url != null) {
             mBookmarksAdapter.updateRow(extras);
           }
         } else {
           // extras == null then a new bookmark was added to
           // the database.
           refreshList();
         }
       }
       break;
     default:
       break;
   }
 }
 @Override
 public void handleMessage(Message msg) {
   switch (msg.what) {
     case SAVE_CURRENT_PAGE:
       saveCurrentPage();
       break;
     case ADAPTER_CREATED:
       mBookmarksAdapter = (BrowserBookmarksAdapter) msg.obj;
       mBookmarksAdapter.switchViewMode(mViewMode);
       if (mGridPage != null) {
         mGridPage.setAdapter(mBookmarksAdapter);
       }
       if (mVerticalList != null) {
         mVerticalList.setAdapter(mBookmarksAdapter);
       }
       // Add our own listener in case there are favicons that
       // have yet to be loaded.
       if (mMostVisited) {
         IconListener listener =
             new IconListener() {
               public void onReceivedIcon(String url, Bitmap icon) {
                 if (mGridPage != null) {
                   mGridPage.setAdapter(mBookmarksAdapter);
                 }
                 if (mVerticalList != null) {
                   mVerticalList.setAdapter(mBookmarksAdapter);
                 }
               }
             };
         CombinedBookmarkHistoryActivity.getIconListenerSet().addListener(listener);
       }
       break;
   }
 }
 @Override
 public boolean onPrepareOptionsMenu(Menu menu) {
   boolean result = super.onPrepareOptionsMenu(menu);
   if (mCreateShortcut
       || mMostVisited
       || mBookmarksAdapter == null
       || mBookmarksAdapter.getCount() == 0) {
     // No need to show the menu if there are no items.
     return result;
   }
   MenuItem switchItem = menu.findItem(R.id.switch_mode_menu_id);
   int titleResId;
   int iconResId;
   if (mViewMode == BookmarkViewMode.GRID) {
     titleResId = R.string.switch_to_list;
     iconResId = R.drawable.ic_menu_list;
   } else {
     titleResId = R.string.switch_to_thumbnails;
     iconResId = R.drawable.ic_menu_thumbnail;
   }
   switchItem.setTitle(titleResId);
   switchItem.setIcon(iconResId);
   return true;
 }
  @Override
  public boolean onContextItemSelected(MenuItem item) {
    // It is possible that the view has been canceled when we get to
    // this point as back has a higher priority
    if (mCanceled) {
      return true;
    }
    AdapterView.AdapterContextMenuInfo i = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
    // If we have no menu info, we can't tell which item was selected.
    if (i == null) {
      return true;
    }

    switch (item.getItemId()) {
      case R.id.new_context_menu_id:
        saveCurrentPage();
        break;
      case R.id.open_context_menu_id:
        loadUrl(i.position);
        break;
      case R.id.edit_context_menu_id:
        editBookmark(i.position);
        break;
      case R.id.shortcut_context_menu_id:
        final Intent send = createShortcutIntent(i.position);
        send.setAction(INSTALL_SHORTCUT);
        sendBroadcast(send);
        break;
      case R.id.delete_context_menu_id:
        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.share_link_context_menu_id:
        BrowserActivity.sharePage(
            BrowserBookmarksPage.this,
            mBookmarksAdapter.getTitle(i.position),
            getUrl(i.position),
            getFavicon(i.position),
            mBookmarksAdapter.getScreenshot(i.position));
        break;
      case R.id.copy_url_context_menu_id:
        copy(getUrl(i.position));
        break;
      case R.id.homepage_context_menu_id:
        BrowserSettings.getInstance().setHomePage(this, getUrl(i.position));
        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:
        boolean isBookmark;
        String name;
        String url;
        if (mViewMode == BookmarkViewMode.GRID) {
          isBookmark = mBookmarksAdapter.getIsBookmark(i.position);
          name = mBookmarksAdapter.getTitle(i.position);
          url = mBookmarksAdapter.getUrl(i.position);
        } else {
          HistoryItem historyItem = ((HistoryItem) i.targetView);
          isBookmark = historyItem.isBookmark();
          name = historyItem.getName();
          url = historyItem.getUrl();
        }
        // If the site is bookmarked, the item becomes remove from
        // bookmarks.
        if (isBookmark) {
          Bookmarks.removeFromBookmarks(this, getContentResolver(), url, name);
        } else {
          Browser.saveBookmark(this, name, url);
        }
        break;
      default:
        return super.onContextItemSelected(item);
    }
    return true;
  }
 /** Delete the currently highlighted row. */
 public void deleteBookmark(int position) {
   if (mBookmarksAdapter == null) return;
   mBookmarksAdapter.deleteRow(position);
 }
 public String getBookmarkTitle(int position) {
   return mBookmarksAdapter == null ? null : mBookmarksAdapter.getTitle(position);
 }
 private Bitmap getTouchIcon(int position) {
   return mBookmarksAdapter == null ? null : mBookmarksAdapter.getTouchIcon(position);
 }
 /** Return the favicon of the currently highlighted row. */
 public Bitmap getFavicon(int position) {
   return mBookmarksAdapter == null ? null : mBookmarksAdapter.getFavicon(position);
 }
 /** Return the url of the currently highlighted row. */
 public String getUrl(int position) {
   return mBookmarksAdapter == null ? null : mBookmarksAdapter.getUrl(position);
 }
 /** Return a hashmap representing the currently highlighted row. */
 public Bundle getRow(int position) {
   return mBookmarksAdapter == null ? null : mBookmarksAdapter.getRow(position);
 }
 /** Refresh the shown list after the database has changed. */
 private void refreshList() {
   if (mBookmarksAdapter == null) return;
   mBookmarksAdapter.refreshList();
 }
  /** Set the ContentView to be either the grid of thumbnails or the vertical list. */
  private void switchViewMode(BookmarkViewMode viewMode) {
    if (mViewMode == viewMode) {
      return;
    }

    mViewMode = viewMode;

    // Update the preferences to make the new view mode sticky.
    Editor ed = getPreferences(MODE_PRIVATE).edit();
    if (mMostVisited) {
      ed.putInt(PREF_MOST_VISITED_VIEW_MODE, mViewMode.ordinal());
    } else {
      ed.putInt(PREF_BOOKMARK_VIEW_MODE, mViewMode.ordinal());
    }
    ed.apply();

    if (mBookmarksAdapter != null) {
      mBookmarksAdapter.switchViewMode(viewMode);
    }
    if (mViewMode == BookmarkViewMode.GRID) {
      if (mGridPage == null) {
        mGridPage = new GridView(this);
        if (mBookmarksAdapter != null) {
          mGridPage.setAdapter(mBookmarksAdapter);
        }
        mGridPage.setOnItemClickListener(mListener);
        mGridPage.setNumColumns(GridView.AUTO_FIT);
        mGridPage.setColumnWidth(BrowserActivity.getDesiredThumbnailWidth(this));
        mGridPage.setFocusable(true);
        mGridPage.setFocusableInTouchMode(true);
        mGridPage.setSelector(android.R.drawable.gallery_thumb);
        float density = getResources().getDisplayMetrics().density;
        mGridPage.setVerticalSpacing((int) (14 * density));
        mGridPage.setHorizontalSpacing((int) (8 * density));
        mGridPage.setStretchMode(GridView.STRETCH_SPACING);
        mGridPage.setScrollBarStyle(View.SCROLLBARS_INSIDE_INSET);
        mGridPage.setDrawSelectorOnTop(true);
        if (mMostVisited) {
          mGridPage.setEmptyView(mEmptyView);
        }
        if (!mCreateShortcut) {
          mGridPage.setOnCreateContextMenuListener(this);
        }
      }
      addContentView(mGridPage, FULL_SCREEN_PARAMS);
      if (mVerticalList != null) {
        ViewGroup parent = (ViewGroup) mVerticalList.getParent();
        if (parent != null) {
          parent.removeView(mVerticalList);
        }
      }
    } else {
      if (null == mVerticalList) {
        ListView listView = new ListView(this);
        if (mBookmarksAdapter != null) {
          listView.setAdapter(mBookmarksAdapter);
        }
        listView.setDrawSelectorOnTop(false);
        listView.setVerticalScrollBarEnabled(true);
        listView.setOnItemClickListener(mListener);
        if (mMostVisited) {
          listView.setEmptyView(mEmptyView);
        }
        if (!mCreateShortcut) {
          listView.setOnCreateContextMenuListener(this);
        }
        mVerticalList = listView;
      }
      addContentView(mVerticalList, FULL_SCREEN_PARAMS);
      if (mGridPage != null) {
        ViewGroup parent = (ViewGroup) mGridPage.getParent();
        if (parent != null) {
          parent.removeView(mGridPage);
        }
      }
    }
  }