diff options
-rw-r--r-- | AndroidManifest.xml | 9 | ||||
-rw-r--r-- | src/com/android/browser/widget/BookmarkWidgetProvider.java | 49 | ||||
-rw-r--r-- | src/com/android/browser/widget/BookmarkWidgetService.java | 385 |
3 files changed, 0 insertions, 443 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 0a69fde..a3d54c4 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -198,15 +198,6 @@ android:configChanges="orientation|keyboardHidden" android:windowSoftInputMode="stateHidden"> </activity> - <!--receiver android:name=".widget.BookmarkWidgetProvider" android:label="@string/bookmarks"> - <intent-filter> - <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> - </intent-filter> - <meta-data android:name="android.appwidget.provider" android:resource="@xml/bookmarkwidget"/> - </receiver> - - <service android:name=".widget.BookmarkWidgetService" /--> - <receiver android:name=".widget.BookmarkStackWidgetProvider" android:label="@string/bookmarks"> diff --git a/src/com/android/browser/widget/BookmarkWidgetProvider.java b/src/com/android/browser/widget/BookmarkWidgetProvider.java deleted file mode 100644 index 62b48c0..0000000 --- a/src/com/android/browser/widget/BookmarkWidgetProvider.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2010 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.widget; - -import android.app.PendingIntent; -import android.appwidget.AppWidgetManager; -import android.appwidget.AppWidgetProvider; -import android.content.Context; -import android.content.Intent; -import android.util.Log; - -/** - * Widget that shows a preview of the user's bookmarks. - */ -public class BookmarkWidgetProvider extends AppWidgetProvider { - - static final String TAG = "BookmarkWidgetProvider"; - - @Override - public void onUpdate(Context context, AppWidgetManager mngr, int[] ids) { - context.startService(new Intent(BookmarkWidgetService.UPDATE, null, - context, BookmarkWidgetService.class)); - } - - @Override - public void onEnabled(Context context) { - context.startService(new Intent(context, BookmarkWidgetService.class)); - } - - @Override - public void onDisabled(Context context) { - context.stopService(new Intent(context, BookmarkWidgetService.class)); - } -} - diff --git a/src/com/android/browser/widget/BookmarkWidgetService.java b/src/com/android/browser/widget/BookmarkWidgetService.java deleted file mode 100644 index 1fd9163..0000000 --- a/src/com/android/browser/widget/BookmarkWidgetService.java +++ /dev/null @@ -1,385 +0,0 @@ -/* - * Copyright (C) 2010 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.widget; - -import android.app.PendingIntent; -import android.app.Service; -import android.appwidget.AppWidgetManager; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; -import android.os.Handler; -import android.os.IBinder; -import android.os.Message; -import android.os.ParcelFileDescriptor; -import android.provider.Browser; -import android.provider.Browser.BookmarkColumns; -import android.service.urlrenderer.UrlRenderer; -import android.service.urlrenderer.UrlRendererService; -import android.util.Log; -import android.view.View; -import android.widget.RemoteViews; - -import com.android.browser.R; - -import java.io.InputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; - -public class BookmarkWidgetService extends Service - implements UrlRenderer.Callback { - - private static final String TAG = "BookmarkWidgetService"; - - /** Force the bookmarks to be re-renderer. */ - public static final String UPDATE = "com.android.browser.widget.UPDATE"; - - /** Change the widget to the next bookmark. */ - private static final String NEXT = "com.android.browser.widget.NEXT"; - - /** Change the widget to the previous bookmark. */ - private static final String PREV = "com.android.browser.widget.PREV"; - - /** Id of the current item displayed in the widget. */ - private static final String EXTRA_ID = - "com.android.browser.widget.extra.ID"; - - // XXX: Remove these magic numbers once the dimensions of the widget can be - // queried. - private static final int WIDTH = 306; - private static final int HEIGHT = 386; - - // Limit the number of connection attempts. - private static final int MAX_SERVICE_RETRY_COUNT = 5; - - // No id specified. - private static final int NO_ID = -1; - - private static final int MSG_UPDATE = 0; - private final Handler mHandler = new Handler() { - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_UPDATE: - if (mRenderer != null) { - queryCursorAndRender(); - } else { - if (++mServiceRetryCount <= MAX_SERVICE_RETRY_COUNT) { - // Service is not connected, try again in a second. - mHandler.sendEmptyMessageDelayed(MSG_UPDATE, 1000); - } - } - break; - default: - break; - } - } - }; - - private final ServiceConnection mConnection = new ServiceConnection() { - public void onServiceConnected(ComponentName className, - IBinder service) { - mRenderer = new UrlRenderer(service); - } - - public void onServiceDisconnected(ComponentName className) { - mRenderer = null; - } - }; - - // Id -> information map storing db ids and their result. - private final HashMap<Integer, RenderResult> mIdsToResults = - new HashMap<Integer, RenderResult>(); - - // List of ids in order - private final ArrayList<Integer> mIdList = new ArrayList<Integer>(); - - // Map of urls to ids for when a url is complete. - private final HashMap<String, Integer> mUrlsToIds = - new HashMap<String, Integer>(); - - // The current id used by the widget during an update. - private int mCurrentId = NO_ID; - // Class that contacts the service on the phone to render bookmarks. - private UrlRenderer mRenderer; - // Number of service retries. Stop trying to connect after - // MAX_SERVICE_RETRY_COUNT - private int mServiceRetryCount; - - @Override - public void onCreate() { - bindService(new Intent(UrlRendererService.SERVICE_INTERFACE), - mConnection, Context.BIND_AUTO_CREATE); - } - - @Override - public void onDestroy() { - unbindService(mConnection); - } - - @Override - public android.os.IBinder onBind(Intent intent) { - return null; - } - - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - final String action = intent.getAction(); - if (UPDATE.equals(action)) { - mHandler.sendEmptyMessage(MSG_UPDATE); - } else if (PREV.equals(action) && mIdList.size() > 1) { - int prev = getPreviousId(intent); - if (prev == NO_ID) { - Log.d(TAG, "Could not determine previous id"); - return START_NOT_STICKY; - } - RenderResult res = mIdsToResults.get(prev); - if (res != null) { - updateWidget(res); - } - } else if (NEXT.equals(action) && mIdList.size() > 1) { - int next = getNextId(intent); - if (next == NO_ID) { - Log.d(TAG, "Could not determine next id"); - return START_NOT_STICKY; - } - RenderResult res = mIdsToResults.get(next); - if (res != null) { - updateWidget(res); - } - } - return START_STICKY; - } - - private int getPreviousId(Intent intent) { - int listSize = mIdList.size(); - // If the list contains 1 or fewer entries, return NO_ID so that the - // widget does not update. - if (listSize <= 1) { - return NO_ID; - } - - int curr = intent.getIntExtra(EXTRA_ID, NO_ID); - if (curr == NO_ID) { - return NO_ID; - } - - // Check if the current id is the beginning of the list so we can skip - // iterating through. - if (mIdList.get(0) == curr) { - return mIdList.get(listSize - 1); - } - - // Search for the current id and remember the previous id. - int prev = NO_ID; - for (int id : mIdList) { - if (id == curr) { - break; - } - prev = id; - } - return prev; - } - - private int getNextId(Intent intent) { - int listSize = mIdList.size(); - // If the list contains 1 or fewer entries, return NO_ID so that the - // widget does not update. - if (listSize <= 1) { - return NO_ID; - } - - int curr = intent.getIntExtra(EXTRA_ID, NO_ID); - if (curr == NO_ID) { - return NO_ID; - } - - // Check if the current id is at the end of the list so we can skip - // iterating through. - if (mIdList.get(listSize - 1) == curr) { - return mIdList.get(0); - } - - // Iterate through the ids. i is set to the current index + 1. - int i = 1; - for (int id : mIdList) { - if (id == curr) { - break; - } - i++; - } - return mIdList.get(i); - } - - private void updateWidget(RenderResult res) { - RemoteViews views = new RemoteViews(getPackageName(), - R.layout.bookmarkwidget); - - Intent prev = new Intent(PREV, null, this, BookmarkWidgetService.class); - prev.putExtra(EXTRA_ID, res.mId); - views.setOnClickPendingIntent(R.id.previous, - PendingIntent.getService(this, 0, prev, - PendingIntent.FLAG_CANCEL_CURRENT)); - - Intent next = new Intent(NEXT, null, this, BookmarkWidgetService.class); - next.putExtra(EXTRA_ID, res.mId); - views.setOnClickPendingIntent(R.id.next, - PendingIntent.getService(this, 0, next, - PendingIntent.FLAG_CANCEL_CURRENT)); - - // Set the title of the bookmark. Use the url as a backup. - String displayTitle = res.mTitle; - if (displayTitle == null) { - displayTitle = res.mUrl; - } - views.setTextViewText(R.id.title, displayTitle); - - // Set the image or revert to the progress indicator. - if (res.mBitmap != null) { - views.setImageViewBitmap(R.id.image, res.mBitmap); - views.setViewVisibility(R.id.image, View.VISIBLE); - views.setViewVisibility(R.id.progress, View.GONE); - } else { - views.setViewVisibility(R.id.progress, View.VISIBLE); - views.setViewVisibility(R.id.image, View.GONE); - } - - // Update the current id. - mCurrentId = res.mId; - - AppWidgetManager.getInstance(this).updateAppWidget( - new ComponentName(this, BookmarkWidgetProvider.class), - views); - } - - // Default WHERE clause is all bookmarks. - private static final String QUERY_WHERE = - BookmarkColumns.BOOKMARK + " == 1"; - private static final String[] PROJECTION = new String[] { - BookmarkColumns._ID, BookmarkColumns.TITLE, BookmarkColumns.URL }; - - // Class containing the rendering information for a specific bookmark. - private static class RenderResult { - final int mId; - final String mTitle; - final String mUrl; - Bitmap mBitmap; - - RenderResult(int id, String title, String url) { - mId = id; - mTitle = title; - mUrl = url; - } - } - - private void queryCursorAndRender() { - // Clear the ordered list of ids and the map of ids to bitmaps. - mIdList.clear(); - mIdsToResults.clear(); - - // Look up all the bookmarks - Cursor c = getContentResolver().query(Browser.BOOKMARKS_URI, PROJECTION, - QUERY_WHERE, null, null); - if (c != null) { - if (c.moveToFirst()) { - ArrayList<String> urls = new ArrayList<String>(c.getCount()); - boolean sawCurrentId = false; - do { - int id = c.getInt(0); - String title = c.getString(1); - String url = c.getString(2); - - // Linear list of ids to obtain the previous and next. - mIdList.add(id); - - // Map the url to its db id for lookup when complete. - mUrlsToIds.put(url, id); - - // Is this the current id? - if (mCurrentId == id) { - sawCurrentId = true; - } - - // Store the current information to at least display the - // title. - RenderResult res = new RenderResult(id, title, url); - mIdsToResults.put(id, res); - - // Add the url to our list to render. - urls.add(url); - } while (c.moveToNext()); - - // Request a rendering of the urls. XXX: Hard-coded dimensions - // until the view's orientation and size can be determined. Or - // in the future the image will be a picture that can be - // scaled/zoomed arbitrarily. - mRenderer.render(urls, WIDTH, HEIGHT, this); - - // Set the current id to the very first id if we did not see - // the current id in the list (the bookmark could have been - // deleted or this is the first update). - if (!sawCurrentId) { - mCurrentId = mIdList.get(0); - } - } - c.close(); - } - } - - // UrlRenderer.Callback implementation - public void complete(String url, ParcelFileDescriptor result) { - int id = mUrlsToIds.get(url); - if (id == NO_ID) { - Log.d(TAG, "No matching id found during completion of " - + url); - return; - } - - RenderResult res = mIdsToResults.get(id); - if (res == null) { - Log.d(TAG, "No result found during completion of " - + url); - return; - } - - // Set the result. - if (result != null) { - InputStream input = - new ParcelFileDescriptor.AutoCloseInputStream(result); - Bitmap orig = BitmapFactory.decodeStream(input, null, null); - // XXX: Hard-coded scaled bitmap until I can query the image - // dimensions. - res.mBitmap = Bitmap.createScaledBitmap(orig, WIDTH, HEIGHT, true); - try { - input.close(); - } catch (IOException e) { - // oh well... - } - } - - // If we are currently looking at the bookmark that just finished, - // update the widget. - if (mCurrentId == id) { - updateWidget(res); - } - } -} |