10c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project/*
20c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
30c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project *
40c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
50c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * you may not use this file except in compliance with the License.
60c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * You may obtain a copy of the License at
70c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project *
80c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
90c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project *
100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * See the License for the specific language governing permissions and
140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * limitations under the License.
150c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */
160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectpackage com.android.browser;
180c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.app.Activity;
2047f7d8d0b36b54a5934daaa6975e05c87e761383Steve Blockimport android.app.AlertDialog;
2147f7d8d0b36b54a5934daaa6975e05c87e761383Steve Blockimport android.app.Dialog;
2264144e49208df145c8362dfa037335c7b9210167Jeff Hamiltonimport android.app.Fragment;
230ce8a942a895cfe1d432076a95f3ed3798ccb002John Reckimport android.app.FragmentBreadCrumbs;
248ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamiltonimport android.app.LoaderManager.LoaderCallbacks;
2580f32627140aefe828ad539f66fc439d1580bae7Dianne Hackbornimport android.content.ClipboardManager;
263f83159b1cd8c732337d966be575233f0d1cae90John Reckimport android.content.ContentResolver;
276fd2ed751dc2efcdaed50631bd0f78f9eb0308fbLeon Scrogginsimport android.content.Context;
288ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamiltonimport android.content.CursorLoader;
2947f7d8d0b36b54a5934daaa6975e05c87e761383Steve Blockimport android.content.DialogInterface;
300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.Intent;
318ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamiltonimport android.content.Loader;
320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.pm.PackageManager;
330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.content.pm.ResolveInfo;
340c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.database.Cursor;
350ce8a942a895cfe1d432076a95f3ed3798ccb002John Reckimport android.database.DataSetObserver;
368f0076b720c9ee1e9ef9d29910c261634fd5fb25Patrick Scottimport android.graphics.BitmapFactory;
370ce8a942a895cfe1d432076a95f3ed3798ccb002John Reckimport android.graphics.drawable.Drawable;
389fed39185e23c71afced2f4176d0d859630dbdc5John Reckimport android.net.Uri;
390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.os.Bundle;
400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.provider.Browser;
419fed39185e23c71afced2f4176d0d859630dbdc5John Reckimport android.provider.BrowserContract;
424b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reckimport android.provider.BrowserContract.Combined;
430c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.ContextMenu;
448ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamiltonimport android.view.ContextMenu.ContextMenuInfo;
4564144e49208df145c8362dfa037335c7b9210167Jeff Hamiltonimport android.view.LayoutInflater;
460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.Menu;
470c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.MenuInflater;
480c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.MenuItem;
490c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.View;
500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Projectimport android.view.ViewGroup;
510ce8a942a895cfe1d432076a95f3ed3798ccb002John Reckimport android.view.ViewStub;
523f7efde1a112ecfb5e008dbd583837056c2ad8efJohn Reckimport android.widget.AbsListView;
530ce8a942a895cfe1d432076a95f3ed3798ccb002John Reckimport android.widget.AdapterView;
5470413a7cc17c2c779b4b673584946ad590f7eb87John Reckimport android.widget.AdapterView.AdapterContextMenuInfo;
550ce8a942a895cfe1d432076a95f3ed3798ccb002John Reckimport android.widget.AdapterView.OnItemClickListener;
560ce8a942a895cfe1d432076a95f3ed3798ccb002John Reckimport android.widget.BaseAdapter;
57765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reckimport android.widget.ExpandableListView;
58765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reckimport android.widget.ExpandableListView.ExpandableListContextMenuInfo;
59765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reckimport android.widget.ExpandableListView.OnChildClickListener;
600ce8a942a895cfe1d432076a95f3ed3798ccb002John Reckimport android.widget.ListView;
619fed39185e23c71afced2f4176d0d859630dbdc5John Reckimport android.widget.TextView;
62feb941d4be5daaf439f6b463f423618caee15892Leon Scrogginsimport android.widget.Toast;
630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project/**
650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * Activity for displaying the browser's history, divided into
660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project * days of viewing.
670c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project */
6864144e49208df145c8362dfa037335c7b9210167Jeff Hamiltonpublic class BrowserHistoryPage extends Fragment
69765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        implements LoaderCallbacks<Cursor>, OnChildClickListener {
708ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton
718ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton    static final int LOADER_HISTORY = 1;
729fed39185e23c71afced2f4176d0d859630dbdc5John Reck    static final int LOADER_MOST_VISITED = 2;
730c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
74d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck    CombinedBookmarksCallbacks mCallback;
758ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton    HistoryAdapter mAdapter;
760ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    HistoryChildWrapper mChildWrapper;
778ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton    boolean mDisableNewWindow;
788ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton    HistoryItem mContextHeader;
799fed39185e23c71afced2f4176d0d859630dbdc5John Reck    String mMostVisitsLimit;
800ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    ListView mGroupList, mChildList;
810ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    private ViewGroup mPrefsContainer;
820ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    private FragmentBreadCrumbs mFragmentBreadCrumbs;
83765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck    private ExpandableListView mHistoryList;
840c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
850ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    private View mRoot;
868ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton
878ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton    static interface HistoryQuery {
888ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton        static final String[] PROJECTION = new String[] {
894b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck                Combined._ID, // 0
904b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck                Combined.DATE_LAST_VISITED, // 1
914b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck                Combined.TITLE, // 2
924b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck                Combined.URL, // 3
934b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck                Combined.FAVICON, // 4
944b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck                Combined.VISITS, // 5
954b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck                Combined.IS_BOOKMARK, // 6
968ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton        };
978ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton
988ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton        static final int INDEX_ID = 0;
998ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton        static final int INDEX_DATE_LAST_VISITED = 1;
1008ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton        static final int INDEX_TITE = 2;
1018ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton        static final int INDEX_URL = 3;
1028ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton        static final int INDEX_FAVICON = 4;
1039fed39185e23c71afced2f4176d0d859630dbdc5John Reck        static final int INDEX_VISITS = 5;
1044b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck        static final int INDEX_IS_BOOKMARK = 6;
1058ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton    }
1060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
1070c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    private void copy(CharSequence text) {
10864144e49208df145c8362dfa037335c7b9210167Jeff Hamilton        ClipboardManager cm = (ClipboardManager) getActivity().getSystemService(
10964144e49208df145c8362dfa037335c7b9210167Jeff Hamilton                Context.CLIPBOARD_SERVICE);
11080f32627140aefe828ad539f66fc439d1580bae7Dianne Hackborn        cm.setText(text);
1110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
1120c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
1138ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton    @Override
1148ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
1154b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck        Uri.Builder combinedBuilder = Combined.CONTENT_URI.buildUpon();
1164b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck
1178ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton        switch (id) {
1188ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton            case LOADER_HISTORY: {
1194b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck                String sort = Combined.DATE_LAST_VISITED + " DESC";
1204b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck                String where = Combined.VISITS + " > 0";
1214b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck                CursorLoader loader = new CursorLoader(getActivity(), combinedBuilder.build(),
1224b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck                        HistoryQuery.PROJECTION, where, null, sort);
1238ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton                return loader;
1248ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton            }
1258ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton
1269fed39185e23c71afced2f4176d0d859630dbdc5John Reck            case LOADER_MOST_VISITED: {
1274b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck                Uri uri = combinedBuilder
1289fed39185e23c71afced2f4176d0d859630dbdc5John Reck                        .appendQueryParameter(BrowserContract.PARAM_LIMIT, mMostVisitsLimit)
1299fed39185e23c71afced2f4176d0d859630dbdc5John Reck                        .build();
1304b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck                String where = Combined.VISITS + " > 0";
1319fed39185e23c71afced2f4176d0d859630dbdc5John Reck                CursorLoader loader = new CursorLoader(getActivity(), uri,
1324b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck                        HistoryQuery.PROJECTION, where, null, Combined.VISITS + " DESC");
1339fed39185e23c71afced2f4176d0d859630dbdc5John Reck                return loader;
1349fed39185e23c71afced2f4176d0d859630dbdc5John Reck            }
1359fed39185e23c71afced2f4176d0d859630dbdc5John Reck
1368ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton            default: {
1378ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton                throw new IllegalArgumentException();
1383a04dd3fa9c62d940256057ac36bf5f1f9281eb3Leon Scroggins III            }
1393a04dd3fa9c62d940256057ac36bf5f1f9281eb3Leon Scroggins III        }
1408ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton    }
1413a04dd3fa9c62d940256057ac36bf5f1f9281eb3Leon Scroggins III
1420ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    void selectGroup(int position) {
1430ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        mGroupItemClickListener.onItemClick(null,
1440ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                mAdapter.getGroupView(position, false, null, null),
1450ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                position, position);
1460ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    }
1470ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
1480ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    void checkIfEmpty() {
1490ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        if (mAdapter.mMostVisited != null && mAdapter.mHistoryCursor != null) {
1500ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            // Both cursors have loaded - check to see if we have data
1510ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            if (mAdapter.isEmpty()) {
1520ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                mRoot.findViewById(R.id.history).setVisibility(View.GONE);
1530ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                mRoot.findViewById(android.R.id.empty).setVisibility(View.VISIBLE);
1540ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            } else {
1550ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                mRoot.findViewById(R.id.history).setVisibility(View.VISIBLE);
1560ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                mRoot.findViewById(android.R.id.empty).setVisibility(View.GONE);
1570ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            }
1580ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        }
1590ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    }
1600ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
1610c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    @Override
1628ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
1638ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton        switch (loader.getId()) {
1648ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton            case LOADER_HISTORY: {
1658ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton                mAdapter.changeCursor(data);
166765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck                if (!mAdapter.isEmpty() && mGroupList != null
1674bc9d06697a4779a698ffa984c2a02c1ad81a63bJohn Reck                        && mGroupList.getCheckedItemPosition() == ListView.INVALID_POSITION) {
1680ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                    selectGroup(0);
1690ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                }
1708ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton
1710ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                checkIfEmpty();
1729fed39185e23c71afced2f4176d0d859630dbdc5John Reck                break;
1739fed39185e23c71afced2f4176d0d859630dbdc5John Reck            }
1748ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton
1759fed39185e23c71afced2f4176d0d859630dbdc5John Reck            case LOADER_MOST_VISITED: {
1769fed39185e23c71afced2f4176d0d859630dbdc5John Reck                mAdapter.changeMostVisitedCursor(data);
1779fed39185e23c71afced2f4176d0d859630dbdc5John Reck
1780ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                checkIfEmpty();
1798ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton                break;
1808ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton            }
1818ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton
1828ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton            default: {
1838ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton                throw new IllegalArgumentException();
1848ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton            }
1858ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton        }
1868ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton    }
18764144e49208df145c8362dfa037335c7b9210167Jeff Hamilton
1880ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    @Override
18939772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn    public void onLoaderReset(Loader<Cursor> loader) {
19039772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn    }
19139772c83f8e210eed1186b66f5f4841aa41776eeDianne Hackborn
1928ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton    @Override
19364144e49208df145c8362dfa037335c7b9210167Jeff Hamilton    public void onCreate(Bundle icicle) {
1940c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        super.onCreate(icicle);
1950c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
19664144e49208df145c8362dfa037335c7b9210167Jeff Hamilton        setHasOptionsMenu(true);
1978ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton
19864144e49208df145c8362dfa037335c7b9210167Jeff Hamilton        Bundle args = getArguments();
199bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins        mDisableNewWindow = args.getBoolean(BrowserBookmarksPage.EXTRA_DISABLE_WINDOW, false);
2009fed39185e23c71afced2f4176d0d859630dbdc5John Reck        int mvlimit = getResources().getInteger(R.integer.most_visits_limit);
2019fed39185e23c71afced2f4176d0d859630dbdc5John Reck        mMostVisitsLimit = Integer.toString(mvlimit);
2022d963a2899afbe000d1ab498f94de87f25e33184John Reck        mCallback = (CombinedBookmarksCallbacks) getActivity();
20364144e49208df145c8362dfa037335c7b9210167Jeff Hamilton    }
204c1cf63a4c15ad81f4d19e10574e9dba91f0b83e4Patrick Scott
20564144e49208df145c8362dfa037335c7b9210167Jeff Hamilton    @Override
20664144e49208df145c8362dfa037335c7b9210167Jeff Hamilton    public View onCreateView(LayoutInflater inflater, ViewGroup container,
20764144e49208df145c8362dfa037335c7b9210167Jeff Hamilton            Bundle savedInstanceState) {
2080ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        mRoot = inflater.inflate(R.layout.history, container, false);
209765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        mAdapter = new HistoryAdapter(getActivity());
2100ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        ViewStub stub = (ViewStub) mRoot.findViewById(R.id.pref_stub);
211765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        if (stub != null) {
212765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck            inflateTwoPane(stub);
213765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        } else {
214765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck            inflateSinglePane();
215765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        }
216765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck
217765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        // Start the loaders
218765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        getLoaderManager().restartLoader(LOADER_HISTORY, null, this);
219765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        getLoaderManager().restartLoader(LOADER_MOST_VISITED, null, this);
220765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck
221765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        return mRoot;
222765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck    }
223765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck
224765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck    private void inflateSinglePane() {
225765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        mHistoryList = (ExpandableListView) mRoot.findViewById(R.id.history);
226765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        mHistoryList.setAdapter(mAdapter);
227765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        mHistoryList.setOnChildClickListener(this);
228765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        registerForContextMenu(mHistoryList);
229765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck    }
230765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck
231765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck    private void inflateTwoPane(ViewStub stub) {
23299ab48a8a23f0d017445ed5055ed14b9588a4856John Reck        stub.setLayoutResource(R.layout.preference_list_content);
2330ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        stub.inflate();
2340ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        mGroupList = (ListView) mRoot.findViewById(android.R.id.list);
23599ab48a8a23f0d017445ed5055ed14b9588a4856John Reck        mPrefsContainer = (ViewGroup) mRoot.findViewById(R.id.prefs_frame);
2360ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        mFragmentBreadCrumbs = (FragmentBreadCrumbs) mRoot.findViewById(android.R.id.title);
2370ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        mFragmentBreadCrumbs.setMaxVisible(1);
2380ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        mFragmentBreadCrumbs.setActivity(getActivity());
2390ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        mPrefsContainer.setVisibility(View.VISIBLE);
2400ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        mGroupList.setAdapter(new HistoryGroupWrapper(mAdapter));
2410ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        mGroupList.setOnItemClickListener(mGroupItemClickListener);
2423f7efde1a112ecfb5e008dbd583837056c2ad8efJohn Reck        mGroupList.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE);
2430ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        mChildWrapper = new HistoryChildWrapper(mAdapter);
2440ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        mChildList = new ListView(getActivity());
2450ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        mChildList.setAdapter(mChildWrapper);
24670413a7cc17c2c779b4b673584946ad590f7eb87John Reck        mChildList.setOnItemClickListener(mChildItemClickListener);
24770413a7cc17c2c779b4b673584946ad590f7eb87John Reck        registerForContextMenu(mChildList);
24899ab48a8a23f0d017445ed5055ed14b9588a4856John Reck        ViewGroup prefs = (ViewGroup) mRoot.findViewById(R.id.prefs);
2490ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        prefs.addView(mChildList);
2500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
2510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
2520ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    private OnItemClickListener mGroupItemClickListener = new OnItemClickListener() {
2530ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        @Override
2540ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        public void onItemClick(
2550ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                AdapterView<?> parent, View view, int position, long id) {
2560ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            CharSequence title = ((TextView) view).getText();
2570ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            mFragmentBreadCrumbs.setTitle(title, title);
2580ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            mChildWrapper.setSelectedGroup(position);
2593f7efde1a112ecfb5e008dbd583837056c2ad8efJohn Reck            mGroupList.setItemChecked(position, true);
2600ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        }
2610ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    };
2620ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
26370413a7cc17c2c779b4b673584946ad590f7eb87John Reck    private OnItemClickListener mChildItemClickListener = new OnItemClickListener() {
26470413a7cc17c2c779b4b673584946ad590f7eb87John Reck        @Override
26570413a7cc17c2c779b4b673584946ad590f7eb87John Reck        public void onItemClick(
26670413a7cc17c2c779b4b673584946ad590f7eb87John Reck                AdapterView<?> parent, View view, int position, long id) {
267d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck            mCallback.openUrl(((HistoryItem) view).getUrl());
26870413a7cc17c2c779b4b673584946ad590f7eb87John Reck        }
26970413a7cc17c2c779b4b673584946ad590f7eb87John Reck    };
27070413a7cc17c2c779b4b673584946ad590f7eb87John Reck
2710c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    @Override
272765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck    public boolean onChildClick(ExpandableListView parent, View view,
273765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck            int groupPosition, int childPosition, long id) {
274d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck        mCallback.openUrl(((HistoryItem) view).getUrl());
275765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        return true;
276765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck    }
277765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck
278765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck    @Override
27964144e49208df145c8362dfa037335c7b9210167Jeff Hamilton    public void onDestroy() {
280b8a9cb0e2b3b2a1bb250853a79b8ea2046ff3d6eGrace Kloba        super.onDestroy();
28171e76c71d8fb70433a60521dfdbcd4e7a8762ef8Dianne Hackborn        getLoaderManager().destroyLoader(LOADER_HISTORY);
28271e76c71d8fb70433a60521dfdbcd4e7a8762ef8Dianne Hackborn        getLoaderManager().destroyLoader(LOADER_MOST_VISITED);
283b8a9cb0e2b3b2a1bb250853a79b8ea2046ff3d6eGrace Kloba    }
284b8a9cb0e2b3b2a1bb250853a79b8ea2046ff3d6eGrace Kloba
285b8a9cb0e2b3b2a1bb250853a79b8ea2046ff3d6eGrace Kloba    @Override
28664144e49208df145c8362dfa037335c7b9210167Jeff Hamilton    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
287d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck        super.onCreateOptionsMenu(menu, inflater);
2880c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        inflater.inflate(R.menu.history, menu);
2890c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
2900c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
291d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck    void promptToClearHistory() {
292d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck        final ContentResolver resolver = getActivity().getContentResolver();
293d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck        final ClearHistoryTask clear = new ClearHistoryTask(resolver);
294d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
295d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck                .setMessage(R.string.pref_privacy_clear_history_dlg)
2962aa8ba254d128ca75f97a62b8d48d1305183e93cBjörn Lundén                .setIconAttribute(android.R.attr.alertDialogIcon)
297d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck                .setNegativeButton(R.string.cancel, null)
298d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck                .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
299d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck                     @Override
300d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck                     public void onClick(DialogInterface dialog, int which) {
301d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck                         if (which == DialogInterface.BUTTON_POSITIVE) {
302d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck                             clear.start();
303d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck                         }
304d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck                     }
305d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck                });
306d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck        final Dialog dialog = builder.create();
307d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck        dialog.show();
308d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck    }
309d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck
3100c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    @Override
3110c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    public boolean onOptionsItemSelected(MenuItem item) {
312d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck        if (item.getItemId() == R.id.clear_history_menu_id) {
313d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck            promptToClearHistory();
314d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck            return true;
315e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb        }
3160c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        return super.onOptionsItemSelected(item);
3170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
318186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins
319d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck    static class ClearHistoryTask extends Thread {
3205eb850d10e4d5109f3a65cabc2b17675f2828e04John Reck        ContentResolver mResolver;
3215eb850d10e4d5109f3a65cabc2b17675f2828e04John Reck
322d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck        public ClearHistoryTask(ContentResolver resolver) {
3235eb850d10e4d5109f3a65cabc2b17675f2828e04John Reck            mResolver = resolver;
3245eb850d10e4d5109f3a65cabc2b17675f2828e04John Reck        }
3255eb850d10e4d5109f3a65cabc2b17675f2828e04John Reck
3265eb850d10e4d5109f3a65cabc2b17675f2828e04John Reck        @Override
327d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck        public void run() {
328d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck            Browser.clearHistory(mResolver);
3295eb850d10e4d5109f3a65cabc2b17675f2828e04John Reck        }
3305eb850d10e4d5109f3a65cabc2b17675f2828e04John Reck    }
3315eb850d10e4d5109f3a65cabc2b17675f2828e04John Reck
332765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck    View getTargetView(ContextMenuInfo menuInfo) {
333765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        if (menuInfo instanceof AdapterContextMenuInfo) {
334765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck            return ((AdapterContextMenuInfo) menuInfo).targetView;
335765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        }
336765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        if (menuInfo instanceof ExpandableListContextMenuInfo) {
337765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck            return ((ExpandableListContextMenuInfo) menuInfo).targetView;
338765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        }
339765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        return null;
340765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck    }
341765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck
3420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    @Override
34364144e49208df145c8362dfa037335c7b9210167Jeff Hamilton    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
344765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck
345765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        View targetView = getTargetView(menuInfo);
346765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        if (!(targetView instanceof HistoryItem)) {
347765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck            return;
348765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        }
349765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        HistoryItem historyItem = (HistoryItem) targetView;
3500c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
3510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        // Inflate the menu
35264144e49208df145c8362dfa037335c7b9210167Jeff Hamilton        Activity parent = getActivity();
35364144e49208df145c8362dfa037335c7b9210167Jeff Hamilton        MenuInflater inflater = parent.getMenuInflater();
3540c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        inflater.inflate(R.menu.historycontext, menu);
3550c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
3560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        // Setup the header
357186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins        if (mContextHeader == null) {
358177746d05e1ceefe8421a4fdab7407e1d17b46d6John Reck            mContextHeader = new HistoryItem(parent, false);
35983c0151b266f4789cb1728294eac98e3dba0ed53John Reck            mContextHeader.setEnableScrolling(true);
360186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins        } else if (mContextHeader.getParent() != null) {
361186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins            ((ViewGroup) mContextHeader.getParent()).removeView(mContextHeader);
362186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins        }
363186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins        historyItem.copyTo(mContextHeader);
364186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins        menu.setHeaderView(mContextHeader);
3650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
366190095d42ef36347df265f40df190ec8be190d9eLeon Scroggins        // Only show open in new tab if it was not explicitly disabled
367190095d42ef36347df265f40df190ec8be190d9eLeon Scroggins        if (mDisableNewWindow) {
368190095d42ef36347df265f40df190ec8be190d9eLeon Scroggins            menu.findItem(R.id.new_window_context_menu_id).setVisible(false);
369190095d42ef36347df265f40df190ec8be190d9eLeon Scroggins        }
370186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins        // For a bookmark, provide the option to remove it from bookmarks
371186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins        if (historyItem.isBookmark()) {
372186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins            MenuItem item = menu.findItem(R.id.save_to_bookmarks_menu_id);
373186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins            item.setTitle(R.string.remove_from_bookmarks);
374186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins        }
3750c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        // decide whether to show the share link option
37664144e49208df145c8362dfa037335c7b9210167Jeff Hamilton        PackageManager pm = parent.getPackageManager();
3770c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        Intent send = new Intent(Intent.ACTION_SEND);
3780c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        send.setType("text/plain");
3790c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        ResolveInfo ri = pm.resolveActivity(send, PackageManager.MATCH_DEFAULT_ONLY);
3800c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        menu.findItem(R.id.share_link_context_menu_id).setVisible(ri != null);
381e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb
3820c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        super.onCreateContextMenu(menu, v, menuInfo);
3830c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
384e421c2472744ca7d35906f86204790ee97b91ca2Michael Kolb
3850c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    @Override
3860c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    public boolean onContextItemSelected(MenuItem item) {
387765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        ContextMenuInfo menuInfo = item.getMenuInfo();
388765ae39a09114e45b1461adde54dfb4ca3fb91a1John Reck        if (menuInfo == null) {
389c8cae086f23bd8f3d740befcdbbda9a8688cc2a3Leon Scroggins            return false;
390c8cae086f23bd8f3d740befcdbbda9a8688cc2a3Leon Scroggins        }
39154ed3aa8417f4c6a27eecb9caf10f742a705b6e0John Reck        View targetView = getTargetView(menuInfo);
39254ed3aa8417f4c6a27eecb9caf10f742a705b6e0John Reck        if (!(targetView instanceof HistoryItem)) {
39354ed3aa8417f4c6a27eecb9caf10f742a705b6e0John Reck            return false;
39454ed3aa8417f4c6a27eecb9caf10f742a705b6e0John Reck        }
39554ed3aa8417f4c6a27eecb9caf10f742a705b6e0John Reck        HistoryItem historyItem = (HistoryItem) targetView;
396186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins        String url = historyItem.getUrl();
397186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins        String title = historyItem.getName();
39864144e49208df145c8362dfa037335c7b9210167Jeff Hamilton        Activity activity = getActivity();
3990c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        switch (item.getItemId()) {
4000c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            case R.id.open_context_menu_id:
401d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck                mCallback.openUrl(url);
4020c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                return true;
4030c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            case R.id.new_window_context_menu_id:
404d3e4d5b4ffdf374b836ec9d4d3e315040c8c3779John Reck                mCallback.openInNewTab(url);
4050c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                return true;
4060c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            case R.id.save_to_bookmarks_menu_id:
407186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins                if (historyItem.isBookmark()) {
40864144e49208df145c8362dfa037335c7b9210167Jeff Hamilton                    Bookmarks.removeFromBookmarks(activity, activity.getContentResolver(),
409c95261955cf08f30b484b6a229c4bcff42c645ceAndrei Popescu                            url, title);
410186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins                } else {
41164144e49208df145c8362dfa037335c7b9210167Jeff Hamilton                    Browser.saveBookmark(activity, title, url);
412186e593776c396bde3d720addd6f6842fe880a7cLeon Scroggins                }
4130c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                return true;
4140c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            case R.id.share_link_context_menu_id:
41564144e49208df145c8362dfa037335c7b9210167Jeff Hamilton                Browser.sendString(activity, url,
41664144e49208df145c8362dfa037335c7b9210167Jeff Hamilton                        activity.getText(R.string.choosertitle_sharevia).toString());
4170c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                return true;
418a5d669e4c08f0e64387c2c539c41a26ac8c845abLeon Scroggins            case R.id.copy_url_context_menu_id:
4190c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                copy(url);
4200c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                return true;
4210c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            case R.id.delete_context_menu_id:
42264144e49208df145c8362dfa037335c7b9210167Jeff Hamilton                Browser.deleteFromHistory(activity.getContentResolver(), url);
4230c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                return true;
424feb941d4be5daaf439f6b463f423618caee15892Leon Scroggins            case R.id.homepage_context_menu_id:
42535e9dd6283a2d65687104eb0b3a459c02dcb150bJohn Reck                BrowserSettings.getInstance().setHomePage(url);
42664144e49208df145c8362dfa037335c7b9210167Jeff Hamilton                Toast.makeText(activity, R.string.homepage_set, Toast.LENGTH_LONG).show();
427feb941d4be5daaf439f6b463f423618caee15892Leon Scroggins                return true;
4280c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            default:
4290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                break;
4300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
4310c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        return super.onContextItemSelected(item);
4320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
4338ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton
4340ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    private static abstract class HistoryWrapper extends BaseAdapter {
4350ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
4360ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        protected HistoryAdapter mAdapter;
4370ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        private DataSetObserver mObserver = new DataSetObserver() {
4380ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            @Override
4390ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            public void onChanged() {
4400ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                super.onChanged();
4410ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                notifyDataSetChanged();
4420ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            }
4430ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
4440ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            @Override
4450ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            public void onInvalidated() {
4460ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                super.onInvalidated();
4470ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                notifyDataSetInvalidated();
4480ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            }
4490ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        };
4500ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
4510ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        public HistoryWrapper(HistoryAdapter adapter) {
4520ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            mAdapter = adapter;
4530ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            mAdapter.registerDataSetObserver(mObserver);
4540ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        }
4550ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
4560ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    }
4570ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    private static class HistoryGroupWrapper extends HistoryWrapper {
4580ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
4590ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        public HistoryGroupWrapper(HistoryAdapter adapter) {
4600ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            super(adapter);
4610ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        }
4620ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
4630ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        @Override
4640ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        public int getCount() {
4650ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            return mAdapter.getGroupCount();
4660ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        }
4670ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
4680ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        @Override
4690ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        public Object getItem(int position) {
4700ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            return null;
4710ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        }
4720ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
4730ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        @Override
4740ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        public long getItemId(int position) {
4750ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            return position;
4760ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        }
4770ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
4780ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        @Override
4790ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        public View getView(int position, View convertView, ViewGroup parent) {
4800ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            return mAdapter.getGroupView(position, false, convertView, parent);
4810ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        }
4820ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
4830ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    }
4840ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
4850ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    private static class HistoryChildWrapper extends HistoryWrapper {
4860ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
4870ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        private int mSelectedGroup;
4880ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
4890ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        public HistoryChildWrapper(HistoryAdapter adapter) {
4900ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            super(adapter);
4910ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        }
4920ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
4930ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        void setSelectedGroup(int groupPosition) {
4940ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            mSelectedGroup = groupPosition;
4950ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            notifyDataSetChanged();
4960ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        }
4970ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
4980ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        @Override
4990ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        public int getCount() {
5000ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            return mAdapter.getChildrenCount(mSelectedGroup);
5010ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        }
5020ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
5030ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        @Override
5040ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        public Object getItem(int position) {
5050ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            return null;
5060ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        }
5070ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
5080ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        @Override
5090ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        public long getItemId(int position) {
5100ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            return position;
5110ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        }
5120ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
5130ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        @Override
5140ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        public View getView(int position, View convertView, ViewGroup parent) {
5150ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            return mAdapter.getChildView(mSelectedGroup, position,
5160ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                    false, convertView, parent);
5170ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        }
5180ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
5190ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck    }
5200ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
5216fd2ed751dc2efcdaed50631bd0f78f9eb0308fbLeon Scroggins    private class HistoryAdapter extends DateSortedExpandableListAdapter {
5220ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck
5239fed39185e23c71afced2f4176d0d859630dbdc5John Reck        private Cursor mMostVisited, mHistoryCursor;
5240ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck        Drawable mFaviconBackground;
5259fed39185e23c71afced2f4176d0d859630dbdc5John Reck
5268ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton        HistoryAdapter(Context context) {
5278ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton            super(context, HistoryQuery.INDEX_DATE_LAST_VISITED);
5280ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck            mFaviconBackground = BookmarkUtils.createListFaviconBackground(context);
5290c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
5300c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project
5318ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton        @Override
5329fed39185e23c71afced2f4176d0d859630dbdc5John Reck        public void changeCursor(Cursor cursor) {
5339fed39185e23c71afced2f4176d0d859630dbdc5John Reck            mHistoryCursor = cursor;
5349fed39185e23c71afced2f4176d0d859630dbdc5John Reck            super.changeCursor(cursor);
5359fed39185e23c71afced2f4176d0d859630dbdc5John Reck        }
5369fed39185e23c71afced2f4176d0d859630dbdc5John Reck
5379fed39185e23c71afced2f4176d0d859630dbdc5John Reck        void changeMostVisitedCursor(Cursor cursor) {
5389fed39185e23c71afced2f4176d0d859630dbdc5John Reck            if (mMostVisited == cursor) {
5399fed39185e23c71afced2f4176d0d859630dbdc5John Reck                return;
5409fed39185e23c71afced2f4176d0d859630dbdc5John Reck            }
5419fed39185e23c71afced2f4176d0d859630dbdc5John Reck            if (mMostVisited != null) {
5429fed39185e23c71afced2f4176d0d859630dbdc5John Reck                mMostVisited.unregisterDataSetObserver(mDataSetObserver);
5439fed39185e23c71afced2f4176d0d859630dbdc5John Reck                mMostVisited.close();
5449fed39185e23c71afced2f4176d0d859630dbdc5John Reck            }
5459fed39185e23c71afced2f4176d0d859630dbdc5John Reck            mMostVisited = cursor;
54606e49cecf9b2d0dbae6adb637a719d1885bf92a2John Reck            if (mMostVisited != null) {
54706e49cecf9b2d0dbae6adb637a719d1885bf92a2John Reck                mMostVisited.registerDataSetObserver(mDataSetObserver);
54806e49cecf9b2d0dbae6adb637a719d1885bf92a2John Reck            }
54906e49cecf9b2d0dbae6adb637a719d1885bf92a2John Reck            notifyDataSetChanged();
5509fed39185e23c71afced2f4176d0d859630dbdc5John Reck        }
5519fed39185e23c71afced2f4176d0d859630dbdc5John Reck
5529fed39185e23c71afced2f4176d0d859630dbdc5John Reck        @Override
5539fed39185e23c71afced2f4176d0d859630dbdc5John Reck        public long getChildId(int groupPosition, int childPosition) {
5549fed39185e23c71afced2f4176d0d859630dbdc5John Reck            if (moveCursorToChildPosition(groupPosition, childPosition)) {
5559fed39185e23c71afced2f4176d0d859630dbdc5John Reck                Cursor cursor = getCursor(groupPosition);
5569fed39185e23c71afced2f4176d0d859630dbdc5John Reck                return cursor.getLong(HistoryQuery.INDEX_ID);
5579fed39185e23c71afced2f4176d0d859630dbdc5John Reck            }
5589fed39185e23c71afced2f4176d0d859630dbdc5John Reck            return 0;
5599fed39185e23c71afced2f4176d0d859630dbdc5John Reck        }
5609fed39185e23c71afced2f4176d0d859630dbdc5John Reck
5619fed39185e23c71afced2f4176d0d859630dbdc5John Reck        @Override
5629fed39185e23c71afced2f4176d0d859630dbdc5John Reck        public int getGroupCount() {
563956f1f2da9635878cdaeda3794ff1b41ed4bdcf9John Reck            return super.getGroupCount() + (!isMostVisitedEmpty() ? 1 : 0);
5649fed39185e23c71afced2f4176d0d859630dbdc5John Reck        }
5659fed39185e23c71afced2f4176d0d859630dbdc5John Reck
5669fed39185e23c71afced2f4176d0d859630dbdc5John Reck        @Override
5679fed39185e23c71afced2f4176d0d859630dbdc5John Reck        public int getChildrenCount(int groupPosition) {
5689fed39185e23c71afced2f4176d0d859630dbdc5John Reck            if (groupPosition >= super.getGroupCount()) {
569956f1f2da9635878cdaeda3794ff1b41ed4bdcf9John Reck                if (isMostVisitedEmpty()) {
5700ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                    return 0;
5710ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                }
5729fed39185e23c71afced2f4176d0d859630dbdc5John Reck                return mMostVisited.getCount();
5739fed39185e23c71afced2f4176d0d859630dbdc5John Reck            }
5749fed39185e23c71afced2f4176d0d859630dbdc5John Reck            return super.getChildrenCount(groupPosition);
5759fed39185e23c71afced2f4176d0d859630dbdc5John Reck        }
5769fed39185e23c71afced2f4176d0d859630dbdc5John Reck
5779fed39185e23c71afced2f4176d0d859630dbdc5John Reck        @Override
5789fed39185e23c71afced2f4176d0d859630dbdc5John Reck        public boolean isEmpty() {
5799fed39185e23c71afced2f4176d0d859630dbdc5John Reck            if (!super.isEmpty()) {
5809fed39185e23c71afced2f4176d0d859630dbdc5John Reck                return false;
5819fed39185e23c71afced2f4176d0d859630dbdc5John Reck            }
582956f1f2da9635878cdaeda3794ff1b41ed4bdcf9John Reck            return isMostVisitedEmpty();
583956f1f2da9635878cdaeda3794ff1b41ed4bdcf9John Reck        }
584956f1f2da9635878cdaeda3794ff1b41ed4bdcf9John Reck
585956f1f2da9635878cdaeda3794ff1b41ed4bdcf9John Reck        private boolean isMostVisitedEmpty() {
5869fed39185e23c71afced2f4176d0d859630dbdc5John Reck            return mMostVisited == null
5879fed39185e23c71afced2f4176d0d859630dbdc5John Reck                    || mMostVisited.isClosed()
5889fed39185e23c71afced2f4176d0d859630dbdc5John Reck                    || mMostVisited.getCount() == 0;
5899fed39185e23c71afced2f4176d0d859630dbdc5John Reck        }
5909fed39185e23c71afced2f4176d0d859630dbdc5John Reck
5919fed39185e23c71afced2f4176d0d859630dbdc5John Reck        Cursor getCursor(int groupPosition) {
5929fed39185e23c71afced2f4176d0d859630dbdc5John Reck            if (groupPosition >= super.getGroupCount()) {
5939fed39185e23c71afced2f4176d0d859630dbdc5John Reck                return mMostVisited;
5949fed39185e23c71afced2f4176d0d859630dbdc5John Reck            }
5959fed39185e23c71afced2f4176d0d859630dbdc5John Reck            return mHistoryCursor;
5969fed39185e23c71afced2f4176d0d859630dbdc5John Reck        }
5979fed39185e23c71afced2f4176d0d859630dbdc5John Reck
5989fed39185e23c71afced2f4176d0d859630dbdc5John Reck        @Override
5999fed39185e23c71afced2f4176d0d859630dbdc5John Reck        public View getGroupView(int groupPosition, boolean isExpanded,
6009fed39185e23c71afced2f4176d0d859630dbdc5John Reck                View convertView, ViewGroup parent) {
6019fed39185e23c71afced2f4176d0d859630dbdc5John Reck            if (groupPosition >= super.getGroupCount()) {
60259280307b381a247a2f6a5299a5893f5f5337306John Reck                if (mMostVisited == null || mMostVisited.isClosed()) {
60359280307b381a247a2f6a5299a5893f5f5337306John Reck                    throw new IllegalStateException("Data is not valid");
60459280307b381a247a2f6a5299a5893f5f5337306John Reck                }
6059fed39185e23c71afced2f4176d0d859630dbdc5John Reck                TextView item;
6069fed39185e23c71afced2f4176d0d859630dbdc5John Reck                if (null == convertView || !(convertView instanceof TextView)) {
6079fed39185e23c71afced2f4176d0d859630dbdc5John Reck                    LayoutInflater factory = LayoutInflater.from(getContext());
6089fed39185e23c71afced2f4176d0d859630dbdc5John Reck                    item = (TextView) factory.inflate(R.layout.history_header, null);
6099fed39185e23c71afced2f4176d0d859630dbdc5John Reck                } else {
6109fed39185e23c71afced2f4176d0d859630dbdc5John Reck                    item = (TextView) convertView;
6119fed39185e23c71afced2f4176d0d859630dbdc5John Reck                }
6129fed39185e23c71afced2f4176d0d859630dbdc5John Reck                item.setText(R.string.tab_most_visited);
6139fed39185e23c71afced2f4176d0d859630dbdc5John Reck                return item;
6149fed39185e23c71afced2f4176d0d859630dbdc5John Reck            }
6159fed39185e23c71afced2f4176d0d859630dbdc5John Reck            return super.getGroupView(groupPosition, isExpanded, convertView, parent);
6169fed39185e23c71afced2f4176d0d859630dbdc5John Reck        }
6179fed39185e23c71afced2f4176d0d859630dbdc5John Reck
6189fed39185e23c71afced2f4176d0d859630dbdc5John Reck        @Override
6199fed39185e23c71afced2f4176d0d859630dbdc5John Reck        boolean moveCursorToChildPosition(
6209fed39185e23c71afced2f4176d0d859630dbdc5John Reck                int groupPosition, int childPosition) {
6219fed39185e23c71afced2f4176d0d859630dbdc5John Reck            if (groupPosition >= super.getGroupCount()) {
62259280307b381a247a2f6a5299a5893f5f5337306John Reck                if (mMostVisited != null && !mMostVisited.isClosed()) {
6239fed39185e23c71afced2f4176d0d859630dbdc5John Reck                    mMostVisited.moveToPosition(childPosition);
6249fed39185e23c71afced2f4176d0d859630dbdc5John Reck                    return true;
6259fed39185e23c71afced2f4176d0d859630dbdc5John Reck                }
6269fed39185e23c71afced2f4176d0d859630dbdc5John Reck                return false;
6279fed39185e23c71afced2f4176d0d859630dbdc5John Reck            }
6289fed39185e23c71afced2f4176d0d859630dbdc5John Reck            return super.moveCursorToChildPosition(groupPosition, childPosition);
6299fed39185e23c71afced2f4176d0d859630dbdc5John Reck        }
6309fed39185e23c71afced2f4176d0d859630dbdc5John Reck
6319fed39185e23c71afced2f4176d0d859630dbdc5John Reck        @Override
6320c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
6330c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                View convertView, ViewGroup parent) {
634772927a9fa4acaafdef4ae3bde91cf0bb822ebd7Michael Kolb            HistoryItem item;
635772927a9fa4acaafdef4ae3bde91cf0bb822ebd7Michael Kolb            if (null == convertView || !(convertView instanceof HistoryItem)) {
636772927a9fa4acaafdef4ae3bde91cf0bb822ebd7Michael Kolb                item = new HistoryItem(getContext());
6370c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                // Add padding on the left so it will be indented from the
6380c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                // arrows on the group views.
6390c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                item.setPadding(item.getPaddingLeft() + 10,
6400c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        item.getPaddingTop(),
6410c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        item.getPaddingRight(),
6420c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project                        item.getPaddingBottom());
6430ce8a942a895cfe1d432076a95f3ed3798ccb002John Reck                item.setFaviconBackground(mFaviconBackground);
6440c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            } else {
645772927a9fa4acaafdef4ae3bde91cf0bb822ebd7Michael Kolb                item = (HistoryItem) convertView;
6460c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
6478ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton
64822807d1975984667829138d7d47d2020f8632f11Leon Scroggins            // Bail early if the Cursor is closed.
6496fd2ed751dc2efcdaed50631bd0f78f9eb0308fbLeon Scroggins            if (!moveCursorToChildPosition(groupPosition, childPosition)) {
6506fd2ed751dc2efcdaed50631bd0f78f9eb0308fbLeon Scroggins                return item;
6510c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            }
6528ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton
6539fed39185e23c71afced2f4176d0d859630dbdc5John Reck            Cursor cursor = getCursor(groupPosition);
6549fed39185e23c71afced2f4176d0d859630dbdc5John Reck            item.setName(cursor.getString(HistoryQuery.INDEX_TITE));
6559fed39185e23c71afced2f4176d0d859630dbdc5John Reck            String url = cursor.getString(HistoryQuery.INDEX_URL);
6560c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            item.setUrl(url);
6579fed39185e23c71afced2f4176d0d859630dbdc5John Reck            byte[] data = cursor.getBlob(HistoryQuery.INDEX_FAVICON);
6588f0076b720c9ee1e9ef9d29910c261634fd5fb25Patrick Scott            if (data != null) {
6598f0076b720c9ee1e9ef9d29910c261634fd5fb25Patrick Scott                item.setFavicon(BitmapFactory.decodeByteArray(data, 0,
6608f0076b720c9ee1e9ef9d29910c261634fd5fb25Patrick Scott                        data.length));
6618f0076b720c9ee1e9ef9d29910c261634fd5fb25Patrick Scott            }
6624b59db8bc6b609307dfcb346283378c5ea993d7cJohn Reck            item.setIsBookmark(cursor.getInt(HistoryQuery.INDEX_IS_BOOKMARK) == 1);
6630c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project            return item;
6640c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project        }
6650c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project    }
6660c90888c75eed12f6e2e14a9044faf50bd4af8edThe Android Open Source Project}
667