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