diff options
author | John Reck <jreck@google.com> | 2011-01-14 19:57:09 -0800 |
---|---|---|
committer | John Reck <jreck@google.com> | 2011-01-18 13:03:12 -0800 |
commit | 0ce8a942a895cfe1d432076a95f3ed3798ccb002 (patch) | |
tree | 85c5afd69fc37dd683c3a7f9d32c66f51148cd04 /src/com/android/browser/BrowserHistoryPage.java | |
parent | 0e64d3c230a0fafff311d39c52b043ef137bf318 (diff) | |
download | android_packages_apps_Gello-0ce8a942a895cfe1d432076a95f3ed3798ccb002.tar.gz android_packages_apps_Gello-0ce8a942a895cfe1d432076a95f3ed3798ccb002.tar.bz2 android_packages_apps_Gello-0ce8a942a895cfe1d432076a95f3ed3798ccb002.zip |
History UI update
Change-Id: If4af6e37252f297bc1744af65df4bc2f123f41dd
Diffstat (limited to 'src/com/android/browser/BrowserHistoryPage.java')
-rw-r--r-- | src/com/android/browser/BrowserHistoryPage.java | 193 |
1 files changed, 168 insertions, 25 deletions
diff --git a/src/com/android/browser/BrowserHistoryPage.java b/src/com/android/browser/BrowserHistoryPage.java index 87649d48..f3c7a7f4 100644 --- a/src/com/android/browser/BrowserHistoryPage.java +++ b/src/com/android/browser/BrowserHistoryPage.java @@ -20,6 +20,7 @@ import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.app.Fragment; +import android.app.FragmentBreadCrumbs; import android.app.LoaderManager.LoaderCallbacks; import android.content.ClipboardManager; import android.content.ContentResolver; @@ -32,8 +33,10 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.database.Cursor; +import android.database.DataSetObserver; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; @@ -49,10 +52,15 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.view.ViewStub; import android.webkit.WebIconDatabase.IconListener; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.BaseAdapter; import android.widget.ExpandableListView; import android.widget.ExpandableListView.ExpandableListContextMenuInfo; import android.widget.ExpandableListView.OnChildClickListener; +import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; @@ -67,12 +75,14 @@ public class BrowserHistoryPage extends Fragment static final int LOADER_MOST_VISITED = 2; BookmarksHistoryCallbacks mCallbacks; - ExpandableListView mList; - View mEmptyView; HistoryAdapter mAdapter; + HistoryChildWrapper mChildWrapper; boolean mDisableNewWindow; HistoryItem mContextHeader; String mMostVisitsLimit; + ListView mGroupList, mChildList; + private ViewGroup mPrefsContainer; + private FragmentBreadCrumbs mFragmentBreadCrumbs; // Implementation of WebIconDatabase.IconListener class IconReceiver implements IconListener { @@ -84,6 +94,7 @@ public class BrowserHistoryPage extends Fragment // Instance of IconReceiver final IconReceiver mIconReceiver = new IconReceiver(); + private View mRoot; static interface HistoryQuery { static final String[] PROJECTION = new String[] { @@ -153,24 +164,48 @@ public class BrowserHistoryPage extends Fragment } } + void selectGroup(int position) { + mGroupItemClickListener.onItemClick(null, + mAdapter.getGroupView(position, false, null, null), + position, position); + } + + void checkIfEmpty() { + if (mAdapter.mMostVisited != null && mAdapter.mHistoryCursor != null) { + // Both cursors have loaded - check to see if we have data + if (mAdapter.isEmpty()) { + mRoot.findViewById(R.id.history).setVisibility(View.GONE); + mRoot.findViewById(android.R.id.empty).setVisibility(View.VISIBLE); + } else { + mRoot.findViewById(R.id.history).setVisibility(View.VISIBLE); + mRoot.findViewById(android.R.id.empty).setVisibility(View.GONE); + } + } + } + @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { switch (loader.getId()) { case LOADER_HISTORY: { mAdapter.changeCursor(data); + if (mAdapter.getGroupCount() > 0) { + selectGroup(0); + } - // Add an empty view late, so it does not claim an empty - // history before the adapter is present - mList.setEmptyView(mEmptyView); + checkIfEmpty(); break; } case LOADER_MOST_VISITED: { + int preCount = mAdapter.getGroupCount(); mAdapter.changeMostVisitedCursor(data); + if (mAdapter.mHistoryCursor != null + && preCount == 0 + && mAdapter.getGroupCount() > 0) { + selectGroup(0); + } - // Add an empty view late, so it does not claim an empty - // history before the adapter is present - mList.setEmptyView(mEmptyView); + checkIfEmpty(); break; } @@ -180,6 +215,7 @@ public class BrowserHistoryPage extends Fragment } } + @Override public void onLoaderReset(Loader<Cursor> loader) { } @@ -198,25 +234,44 @@ public class BrowserHistoryPage extends Fragment @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View root = inflater.inflate(R.layout.history, container, false); - mList = (ExpandableListView) root.findViewById(android.R.id.list); - mList.setCacheColorHint(0); - mList.setOnCreateContextMenuListener(this); - mList.setOnChildClickListener(this); + mRoot = inflater.inflate(R.layout.history, container, false); + ViewStub stub = (ViewStub) mRoot.findViewById(R.id.pref_stub); + stub.setLayoutResource(com.android.internal.R.layout.preference_list_content); + stub.inflate(); + mGroupList = (ListView) mRoot.findViewById(android.R.id.list); + mPrefsContainer = (ViewGroup) mRoot.findViewById(com.android.internal.R.id.prefs_frame); + mFragmentBreadCrumbs = (FragmentBreadCrumbs) mRoot.findViewById(android.R.id.title); + mFragmentBreadCrumbs.setMaxVisible(1); + mFragmentBreadCrumbs.setActivity(getActivity()); + mPrefsContainer.setVisibility(View.VISIBLE); mAdapter = new HistoryAdapter(getActivity()); - mList.setAdapter(mAdapter); - - mEmptyView = root.findViewById(android.R.id.empty); - - // Start the loader + mGroupList.setAdapter(new HistoryGroupWrapper(mAdapter)); + mGroupList.setOnItemClickListener(mGroupItemClickListener); + mChildWrapper = new HistoryChildWrapper(mAdapter); + mChildList = new ListView(getActivity()); + mChildList.setAdapter(mChildWrapper); + ViewGroup prefs = (ViewGroup) mRoot.findViewById(com.android.internal.R.id.prefs); + prefs.addView(mChildList); + + // Start the loaders getLoaderManager().restartLoader(LOADER_HISTORY, null, this); getLoaderManager().restartLoader(LOADER_MOST_VISITED, null, this); // Register to receive icons in case they haven't all been loaded. CombinedBookmarkHistoryView.getIconListenerSet().addListener(mIconReceiver); - return root; + return mRoot; } + private OnItemClickListener mGroupItemClickListener = new OnItemClickListener() { + @Override + public void onItemClick( + AdapterView<?> parent, View view, int position, long id) { + CharSequence title = ((TextView) view).getText(); + mFragmentBreadCrumbs.setTitle(title, title); + mChildWrapper.setSelectedGroup(position); + } + }; + @Override public void onDestroy() { super.onDestroy(); @@ -231,12 +286,6 @@ public class BrowserHistoryPage extends Fragment } @Override - public void onPrepareOptionsMenu(Menu menu) { - menu.findItem(R.id.clear_history_menu_id).setVisible( - mAdapter != null && !mAdapter.isEmpty()); - } - - @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.clear_history_menu_id: @@ -385,11 +434,101 @@ public class BrowserHistoryPage extends Fragment return false; } + private static abstract class HistoryWrapper extends BaseAdapter { + + protected HistoryAdapter mAdapter; + private DataSetObserver mObserver = new DataSetObserver() { + @Override + public void onChanged() { + super.onChanged(); + notifyDataSetChanged(); + } + + @Override + public void onInvalidated() { + super.onInvalidated(); + notifyDataSetInvalidated(); + } + }; + + public HistoryWrapper(HistoryAdapter adapter) { + mAdapter = adapter; + mAdapter.registerDataSetObserver(mObserver); + } + + } + private static class HistoryGroupWrapper extends HistoryWrapper { + + public HistoryGroupWrapper(HistoryAdapter adapter) { + super(adapter); + } + + @Override + public int getCount() { + return mAdapter.getGroupCount(); + } + + @Override + public Object getItem(int position) { + return null; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + return mAdapter.getGroupView(position, false, convertView, parent); + } + + } + + private static class HistoryChildWrapper extends HistoryWrapper { + + private int mSelectedGroup; + + public HistoryChildWrapper(HistoryAdapter adapter) { + super(adapter); + } + + void setSelectedGroup(int groupPosition) { + mSelectedGroup = groupPosition; + notifyDataSetChanged(); + } + + @Override + public int getCount() { + return mAdapter.getChildrenCount(mSelectedGroup); + } + + @Override + public Object getItem(int position) { + return null; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + return mAdapter.getChildView(mSelectedGroup, position, + false, convertView, parent); + } + + } + private class HistoryAdapter extends DateSortedExpandableListAdapter { + private Cursor mMostVisited, mHistoryCursor; + Drawable mFaviconBackground; HistoryAdapter(Context context) { super(context, HistoryQuery.INDEX_DATE_LAST_VISITED); + mFaviconBackground = BookmarkUtils.createListFaviconBackground(context); } @Override @@ -430,6 +569,9 @@ public class BrowserHistoryPage extends Fragment @Override public int getChildrenCount(int groupPosition) { if (groupPosition >= super.getGroupCount()) { + if (mMostVisited == null) { + return 0; + } return mMostVisited.getCount(); } return super.getChildrenCount(groupPosition); @@ -497,6 +639,7 @@ public class BrowserHistoryPage extends Fragment item.getPaddingTop(), item.getPaddingRight(), item.getPaddingBottom()); + item.setFaviconBackground(mFaviconBackground); } else { item = (HistoryItem) convertView; } |