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