DownloadTouchIcon.java revision bf6b54db8f42a42c218f17ec358563e66e8e95ba
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.InputStream; 433918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 44a74f6963e548b7552d25fc4f851360dc74248958Patrick Scottclass DownloadTouchIcon extends AsyncTask<String, Void, Void> { 45bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck 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) { 113bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck AndroidHttpClient client = null; 114bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck HttpGet request = null; 115bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck 116bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck try { 117bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck client = AndroidHttpClient.newInstance(mUserAgent); 118bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck HttpHost httpHost = Proxy.getPreferredHttpHost(mContext, url); 119bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck if (httpHost != null) { 120bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck ConnRouteParams.setDefaultProxy(client.getParams(), httpHost); 121bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck } 122d159ec534823b87f9896843e95912b0df8c27e16Andreas Sandblad 123bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck request = new HttpGet(url); 1243918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 125bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck // Follow redirects 126bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck HttpClientParams.setRedirecting(client.getParams(), true); 1273918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 128c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins HttpResponse response = client.execute(request); 129c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins if (response.getStatusLine().getStatusCode() == 200) { 130c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins HttpEntity entity = response.getEntity(); 131c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins if (entity != null) { 132c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins InputStream content = entity.getContent(); 133c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins if (content != null) { 134c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins Bitmap icon = BitmapFactory.decodeStream( 135c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins content, null, null); 1361a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton if (inDatabase) { 137e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch storeIcon(icon); 138e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch } else if (mMessage != null) { 139e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch Bundle b = mMessage.getData(); 140bc92285a27fa629d630d3ea0d0608f13a6de5deeLeon Scroggins b.putParcelable(BrowserContract.Bookmarks.TOUCH_ICON, icon); 141e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch } 142c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins } 1433918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 1443918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 145bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck } catch (Exception ex) { 146bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck if (request != null) { 147bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck request.abort(); 148bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck } 149c8393d9cfa47e3f5f279b17c412fd363e7ea94bdLeon Scroggins } finally { 150bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck if (client != null) { 151bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck client.close(); 152bf6b54db8f42a42c218f17ec358563e66e8e95baJohn Reck } 1533918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 1543918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 155e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch 1568e9fe327af19df2df03a2546c97604b095acd5e1Patrick Scott if (mCursor != null) { 1578e9fe327af19df2df03a2546c97604b095acd5e1Patrick Scott mCursor.close(); 1588e9fe327af19df2df03a2546c97604b095acd5e1Patrick Scott } 159e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch 160e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch if (mMessage != null) { 161e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch mMessage.sendToTarget(); 162e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch } 163e322f56ac6f425e08018319fb00df2bbaf569e33Ben Murdoch 1643918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott return null; 1653918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 1663918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 1673918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott @Override 16859ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott protected void onCancelled() { 16959ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott if (mCursor != null) { 17059ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott mCursor.close(); 17159ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott } 17259ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott } 17359ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott 174a74f6963e548b7552d25fc4f851360dc74248958Patrick Scott private void storeIcon(Bitmap icon) { 17559ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott // Do this first in case the download failed. 17622ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mTab != null) { 17759ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott // Remove the touch icon loader from the BrowserActivity. 17822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTab.mTouchIconLoader = null; 17959ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott } 18059ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott 18159ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott if (icon == null || mCursor == null || isCancelled()) { 1823918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott return; 1833918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 18459ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott 1853918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott if (mCursor.moveToFirst()) { 1861a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton final ByteArrayOutputStream os = new ByteArrayOutputStream(); 1871a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton icon.compress(Bitmap.CompressFormat.PNG, 100, os); 1881a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton 1891a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton ContentValues values = new ContentValues(); 1901a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton values.put(Images.TOUCH_ICON, os.toByteArray()); 1911a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton 1923918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott do { 1939e7686e110d3fd1e3ad7742ec27a1c7d54cf9408John Reck values.put(Images.URL, mCursor.getString(0)); 1941a805652e389d9404ee0fda7c993a6202332e92bJeff Hamilton mContentResolver.update(Images.CONTENT_URI, values, null, null); 1953918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } while (mCursor.moveToNext()); 1963918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 1973918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 1983918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott} 199