DownloadTouchIcon.java revision a74f6963e548b7552d25fc4f851360dc74248958
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 193918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.content.ContentResolver; 203918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.content.ContentUris; 213918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.content.ContentValues; 223918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.database.Cursor; 233918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.graphics.Bitmap; 243918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.graphics.BitmapFactory; 253918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.net.http.AndroidHttpClient; 263918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.os.AsyncTask; 273918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.provider.Browser; 283918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport android.webkit.WebView; 293918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 303918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport org.apache.http.HttpEntity; 313918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport org.apache.http.HttpResponse; 323918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport org.apache.http.client.methods.HttpGet; 333918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport org.apache.http.client.params.HttpClientParams; 343918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 353918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport java.io.ByteArrayOutputStream; 363918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport java.io.IOException; 373918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scottimport java.io.InputStream; 383918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 39a74f6963e548b7552d25fc4f851360dc74248958Patrick Scottclass DownloadTouchIcon extends AsyncTask<String, Void, Void> { 403918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott private final ContentResolver mContentResolver; 413918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott private final Cursor mCursor; 423918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott private final String mOriginalUrl; 433918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott private final String mUrl; 443918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott private final String mUserAgent; 4522ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba /* package */ Tab mTab; 463918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 4722ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba public DownloadTouchIcon(Tab tab, ContentResolver cr, Cursor c, WebView view) { 4822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTab = tab; 493918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mContentResolver = cr; 503918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mCursor = c; 513918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott // Store these in case they change. 523918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mOriginalUrl = view.getOriginalUrl(); 533918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mUrl = view.getUrl(); 543918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mUserAgent = view.getSettings().getUserAgentString(); 553918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 563918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 573918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott public DownloadTouchIcon(ContentResolver cr, Cursor c, String url) { 5822ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTab = null; 593918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mContentResolver = cr; 603918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mCursor = c; 613918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mOriginalUrl = null; 623918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mUrl = url; 633918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mUserAgent = null; 643918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 653918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 663918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott @Override 67a74f6963e548b7552d25fc4f851360dc74248958Patrick Scott public Void doInBackground(String... values) { 683918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott String url = values[0]; 693918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 703918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott AndroidHttpClient client = AndroidHttpClient.newInstance( 713918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mUserAgent); 723918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott HttpGet request = new HttpGet(url); 733918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 743918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott // Follow redirects 753918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott HttpClientParams.setRedirecting(client.getParams(), true); 763918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 773918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott try { 783918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott HttpResponse response = client.execute(request); 793918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 803918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott if (response.getStatusLine().getStatusCode() == 200) { 813918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott HttpEntity entity = response.getEntity(); 823918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott if (entity != null) { 833918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott InputStream content = entity.getContent(); 843918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott if (content != null) { 853918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott Bitmap icon = BitmapFactory.decodeStream( 863918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott content, null, null); 87a74f6963e548b7552d25fc4f851360dc74248958Patrick Scott storeIcon(icon); 883918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 893918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 903918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 913918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } catch (IllegalArgumentException ex) { 923918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott request.abort(); 933918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } catch (IOException ex) { 943918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott request.abort(); 953918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } finally { 963918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott client.close(); 973918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 983918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott return null; 993918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 1003918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 1013918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott @Override 10259ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott protected void onCancelled() { 10359ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott if (mCursor != null) { 10459ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott mCursor.close(); 10559ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott } 10659ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott } 10759ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott 108a74f6963e548b7552d25fc4f851360dc74248958Patrick Scott private void storeIcon(Bitmap icon) { 10959ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott // Do this first in case the download failed. 11022ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba if (mTab != null) { 11159ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott // Remove the touch icon loader from the BrowserActivity. 11222ac16eab0b62d24a99fc360f2ccea14837f4127Grace Kloba mTab.mTouchIconLoader = null; 11359ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott } 11459ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott 11559ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott if (icon == null || mCursor == null || isCancelled()) { 1163918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott return; 1173918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 11859ce830c6eab58171b727abe5282c4abadb1a040Patrick Scott 1193918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott final ByteArrayOutputStream os = new ByteArrayOutputStream(); 1203918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott icon.compress(Bitmap.CompressFormat.PNG, 100, os); 1213918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott ContentValues values = new ContentValues(); 1223918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott values.put(Browser.BookmarkColumns.TOUCH_ICON, 1233918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott os.toByteArray()); 1243918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott 1253918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott if (mCursor.moveToFirst()) { 1263918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott do { 1273918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mContentResolver.update(ContentUris.withAppendedId( 1283918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott Browser.BOOKMARKS_URI, mCursor.getInt(0)), 1293918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott values, null, null); 1303918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } while (mCursor.moveToNext()); 1313918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 1323918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott mCursor.close(); 1333918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott } 1343918d4443ff38ef1870e02aa51a8b29f8352bb1aPatrick Scott} 135