DownloadTouchIcon.java revision bc92285a27fa629d630d3ea0d0608f13a6de5dee
13918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott/* 23918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott * Copyright (C) 2009 The Android Open Source Project 33918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott * 43918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott * Licensed under the Apache License, Version 2.0 (the "License"); 53918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott * you may not use this file except in compliance with the License. 63918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott * You may obtain a copy of the License at 73918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott * 83918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott * http://www.apache.org/licenses/LICENSE-2.0 93918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott * 103918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott * Unless required by applicable law or agreed to in writing, software 113918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott * distributed under the License is distributed on an "AS IS" BASIS, 123918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott * See the License for the specific language governing permissions and 143918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott * limitations under the License. 153918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott */ 163918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 173918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottpackage com.android.browser; 183918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 198ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamiltonimport org.apache.http.HttpEntity; 208ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamiltonimport org.apache.http.HttpHost; 218ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamiltonimport org.apache.http.HttpResponse; 228ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamiltonimport org.apache.http.client.methods.HttpGet; 238ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamiltonimport org.apache.http.client.params.HttpClientParams; 248ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamiltonimport org.apache.http.conn.params.ConnRouteParams; 258ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton 263918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.content.ContentResolver; 273918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.content.ContentValues; 28980e99536e2fc6f305432387fe92c9916fa6e7b6Henrik Baardimport android.content.Context; 293918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.database.Cursor; 303918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.graphics.Bitmap; 313918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.graphics.BitmapFactory; 32d159ec534823b87f9896843e95912b0df8c27e16Andreas Sandbladimport android.net.Proxy; 338ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamiltonimport android.net.http.AndroidHttpClient; 343918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.os.AsyncTask; 35e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdochimport android.os.Bundle; 36e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdochimport android.os.Message; 37bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scrogginsimport android.provider.BrowserContract; 381a805652e389d9404ee0fda7c993a6202332e92bJeff Hamiltonimport android.provider.BrowserContract.Images; 393918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.webkit.WebView; 403918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 413918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport java.io.ByteArrayOutputStream; 423918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport java.io.IOException; 433918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport java.io.InputStream; 443918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 45a74f6963e548b7552d25fc4f851360dc74248958Patrick Scottclass DownloadTouchIcon extends AsyncTask<String, Void, Void> { 463918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott private final ContentResolver mContentResolver; 47c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins private Cursor mCursor; 483918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott private final String mOriginalUrl; 493918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott private final String mUrl; 50e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch private final String mUserAgent; // Sites may serve a different icon to different UAs 51e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch private Message mMessage; 52e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch 53980e99536e2fc6f305432387fe92c9916fa6e7b6Henrik Baard private final Context mContext; 5422ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba /* package */ Tab mTab; 553918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 56e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch /** 57e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch * Use this ctor to store the touch icon in the bookmarks database for 58e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch * the originalUrl so we take account of redirects. Used when the user 59e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch * bookmarks a page from outside the bookmarks activity. 60e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch */ 61980e99536e2fc6f305432387fe92c9916fa6e7b6Henrik Baard public DownloadTouchIcon(Tab tab, Context ctx, ContentResolver cr, WebView view) { 6222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTab = tab; 63980e99536e2fc6f305432387fe92c9916fa6e7b6Henrik Baard mContext = ctx; 643918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mContentResolver = cr; 653918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott // Store these in case they change. 663918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mOriginalUrl = view.getOriginalUrl(); 673918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mUrl = view.getUrl(); 683918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mUserAgent = view.getSettings().getUserAgentString(); 693918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 703918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 71e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch /** 72e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch * Use this ctor to download the touch icon and update the bookmarks database 73e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch * entry for the given url. Used when the user creates a bookmark from 74e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch * within the bookmarks activity and there haven't been any redirects. 75e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch * TODO: Would be nice to set the user agent here so that there is no 76e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch * potential for the three different ctors here to return different icons. 77e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch */ 78980e99536e2fc6f305432387fe92c9916fa6e7b6Henrik Baard public DownloadTouchIcon(Context ctx, ContentResolver cr, String url) { 7922ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTab = null; 80980e99536e2fc6f305432387fe92c9916fa6e7b6Henrik Baard mContext = ctx; 813918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mContentResolver = cr; 823918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mOriginalUrl = null; 833918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mUrl = url; 843918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mUserAgent = null; 853918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 863918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 87e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch /** 88e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch * Use this ctor to not store the touch icon in a database, rather add it to 89bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins * the passed Message's data bundle with the key 90bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins * {@link BrowserContract.Bookmarks#TOUCH_ICON} and then send the message. 91e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch */ 9267832037dbba03f34873878d3f8080ded2ec1017Bjorn Bringert public DownloadTouchIcon(Context context, Message msg, String userAgent) { 93e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch mMessage = msg; 9467832037dbba03f34873878d3f8080ded2ec1017Bjorn Bringert mContext = context; 95e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch mContentResolver = null; 96e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch mOriginalUrl = null; 97e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch mUrl = null; 98e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch mUserAgent = userAgent; 99e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch } 100e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch 1013918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott @Override 102a74f6963e548b7552d25fc4f851360dc74248958Patrick Scott public Void doInBackground(String... values) { 103e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch if (mContentResolver != null) { 1041a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton mCursor = Bookmarks.queryCombinedForUrl(mContentResolver, 1058ce956c6076a89aae85856f35b94bad7fc8fa1f1Jeff Hamilton mOriginalUrl, mUrl); 106e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch } 107e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch 1081a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton boolean inDatabase = mCursor != null && mCursor.getCount() > 0; 1093918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 110e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch String url = values[0]; 111e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch 1121a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton if (inDatabase || mMessage != null) { 113e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch AndroidHttpClient client = AndroidHttpClient.newInstance(mUserAgent); 114980e99536e2fc6f305432387fe92c9916fa6e7b6Henrik Baard HttpHost httpHost = Proxy.getPreferredHttpHost(mContext, url); 115d159ec534823b87f9896843e95912b0df8c27e16Andreas Sandblad if (httpHost != null) { 116d159ec534823b87f9896843e95912b0df8c27e16Andreas Sandblad ConnRouteParams.setDefaultProxy(client.getParams(), httpHost); 117d159ec534823b87f9896843e95912b0df8c27e16Andreas Sandblad } 118d159ec534823b87f9896843e95912b0df8c27e16Andreas Sandblad 119c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins HttpGet request = new HttpGet(url); 1203918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 121c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins // Follow redirects 122c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins HttpClientParams.setRedirecting(client.getParams(), true); 1233918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 124c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins try { 125c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins HttpResponse response = client.execute(request); 126c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins if (response.getStatusLine().getStatusCode() == 200) { 127c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins HttpEntity entity = response.getEntity(); 128c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins if (entity != null) { 129c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins InputStream content = entity.getContent(); 130c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins if (content != null) { 131c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins Bitmap icon = BitmapFactory.decodeStream( 132c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins content, null, null); 1331a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton if (inDatabase) { 134e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch storeIcon(icon); 135e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch } else if (mMessage != null) { 136e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch Bundle b = mMessage.getData(); 137bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins b.putParcelable(BrowserContract.Bookmarks.TOUCH_ICON, icon); 138e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch } 139c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins } 1403918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 1413918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 142c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins } catch (IllegalArgumentException ex) { 143c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins request.abort(); 144c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins } catch (IOException ex) { 145c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins request.abort(); 146c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins } finally { 147c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins client.close(); 1483918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 1493918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 150e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch 1518e9fe327af19df2df03a2546c97604b095acd5e1Patrick Scott if (mCursor != null) { 1528e9fe327af19df2df03a2546c97604b095acd5e1Patrick Scott mCursor.close(); 1538e9fe327af19df2df03a2546c97604b095acd5e1Patrick Scott } 154e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch 155e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch if (mMessage != null) { 156e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch mMessage.sendToTarget(); 157e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch } 158e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch 1593918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott return null; 1603918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 1613918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 1623918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott @Override 16359ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott protected void onCancelled() { 16459ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott if (mCursor != null) { 16559ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott mCursor.close(); 16659ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott } 16759ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott } 16859ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott 169a74f6963e548b7552d25fc4f851360dc74248958Patrick Scott private void storeIcon(Bitmap icon) { 17059ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott // Do this first in case the download failed. 17122ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mTab != null) { 17259ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott // Remove the touch icon loader from the BrowserActivity. 17322ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTab.mTouchIconLoader = null; 17459ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott } 17559ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott 17659ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott if (icon == null || mCursor == null || isCancelled()) { 1773918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott return; 1783918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 17959ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott 1803918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott if (mCursor.moveToFirst()) { 1811a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton final ByteArrayOutputStream os = new ByteArrayOutputStream(); 1821a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton icon.compress(Bitmap.CompressFormat.PNG, 100, os); 1831a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton 1841a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton ContentValues values = new ContentValues(); 1851a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton values.put(Images.TOUCH_ICON, os.toByteArray()); 1861a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton values.put(Images.URL, mCursor.getString(0)); 1871a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton 1883918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott do { 1891a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton mContentResolver.update(Images.CONTENT_URI, values, null, null); 1903918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } while (mCursor.moveToNext()); 1913918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 1923918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 1933918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott} 194