/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.browser; import android.app.Activity; import android.app.ListActivity; import android.content.Intent; import android.database.ContentObserver; import android.database.Cursor; import android.database.DataSetObserver; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.provider.Browser; import android.webkit.WebIconDatabase.IconListener; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.SimpleCursorAdapter; import android.widget.TextView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewStub; import java.util.Vector; public class MostVisitedActivity extends ListActivity { private MyAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mAdapter = new MyAdapter(); CombinedBookmarkHistoryActivity.getIconListenerSet(getContentResolver()) .addListener(new IconReceiver()); setListAdapter(mAdapter); ListView list = getListView(); View v = new ViewStub(this, R.layout.empty_history); addContentView(v, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); list.setEmptyView(v); } private class IconReceiver implements IconListener { public void onReceivedIcon(String url, Bitmap icon) { setListAdapter(mAdapter); } } protected void onListItemClick(ListView l, View v, int position, long id) { TextView tv = (TextView) v.findViewById(R.id.url); String url = tv.getText().toString(); loadUrl(url, false); } private void loadUrl(String url, boolean newWindow) { Intent intent = new Intent().setAction(url); if (newWindow) { Bundle b = new Bundle(); b.putBoolean("new_window", true); intent.putExtras(b); } setResultToParent(RESULT_OK, intent); finish(); } private class MyAdapter implements ListAdapter { private Vector mObservers; private Cursor mCursor; // These correspond with projection below. private static final int mUrlIndex = 0; private static final int mTitleIndex = 1; private static final int mBookmarkIndex = 2; MyAdapter() { mObservers = new Vector(); String[] projection = new String[] { Browser.BookmarkColumns.URL, Browser.BookmarkColumns.TITLE, Browser.BookmarkColumns.BOOKMARK }; String whereClause = Browser.BookmarkColumns.VISITS + " != 0"; String orderBy = Browser.BookmarkColumns.VISITS + " DESC"; mCursor = managedQuery(Browser.BOOKMARKS_URI, projection, whereClause, null, orderBy); mCursor.registerContentObserver(new ChangeObserver()); } private class ChangeObserver extends ContentObserver { public ChangeObserver() { super(new Handler()); } @Override public boolean deliverSelfNotifications() { return true; } @Override public void onChange(boolean selfChange) { MyAdapter.this.refreshData(); } } void refreshData() { mCursor.requery(); for (DataSetObserver o : mObservers) { o.onChanged(); } } public View getView(int position, View convertView, ViewGroup parent) { HistoryItem item; if (null == convertView) { item = new HistoryItem(MostVisitedActivity.this); } else { item = (HistoryItem) convertView; } mCursor.moveToPosition(position); item.setName(mCursor.getString(mTitleIndex)); String url = mCursor.getString(mUrlIndex); item.setUrl(url); item.setFavicon(CombinedBookmarkHistoryActivity.getIconListenerSet( getContentResolver()).getFavicon(url)); item.setIsBookmark(1 == mCursor.getInt(mBookmarkIndex)); return item; } public boolean areAllItemsEnabled() { return true; } public boolean isEnabled(int position) { return true; } public int getCount() { return mCursor.getCount(); } public Object getItem(int position) { return null; } public long getItemId(int position) { return position; } // Always a HistoryItem public int getItemViewType(int position) { return 0; } public int getViewTypeCount() { return 1; } public boolean hasStableIds() { return true; } public void registerDataSetObserver(DataSetObserver observer) { mObservers.add(observer); } public void unregisterDataSetObserver(DataSetObserver observer) { mObservers.remove(observer); } public boolean isEmpty() { return getCount() == 0; } } // This Activity is generally a sub-Activity of CombinedHistoryActivity. In // that situation, we need to pass our result code up to our parent. // However, if someone calls this Activity directly, then this has no // parent, and it needs to set it on itself. private void setResultToParent(int resultCode, Intent data) { Activity a = getParent() == null ? this : getParent(); a.setResult(resultCode, data); } }