SnapshotTab.java revision 8cc9235816ac9b3f1b3551d6234684f0455746dc
1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.browser;
17
18import android.content.ContentResolver;
19import android.content.ContentUris;
20import android.content.ContentValues;
21import android.database.Cursor;
22import android.graphics.BitmapFactory;
23import android.net.Uri;
24import android.os.AsyncTask;
25import android.util.Log;
26import android.webkit.WebView;
27
28import com.android.browser.provider.SnapshotProvider.Snapshots;
29
30import java.io.ByteArrayInputStream;
31import java.util.zip.GZIPInputStream;
32
33
34public class SnapshotTab extends Tab {
35
36    private static final String LOGTAG = "SnapshotTab";
37
38    private long mSnapshotId;
39    private LoadData mLoadTask;
40    private WebViewFactory mWebViewFactory;
41    // TODO: Support non-persistent webview's on phone
42    private boolean mPersistentWebview;
43    private int mBackgroundColor;
44
45    public SnapshotTab(WebViewController wvcontroller, long snapshotId) {
46        super(wvcontroller, null);
47        mSnapshotId = snapshotId;
48        mWebViewFactory = mWebViewController.getWebViewFactory();
49        mPersistentWebview = !BrowserActivity.isTablet(wvcontroller.getActivity());
50        if (mPersistentWebview) {
51            WebView web = mWebViewFactory.createWebView(false);
52            setWebView(web);
53        }
54        loadData();
55    }
56
57    @Override
58    void putInForeground() {
59        if (getWebView() == null) {
60            WebView web = mWebViewFactory.createWebView(false);
61            if (mBackgroundColor != 0) {
62                web.setBackgroundColor(mBackgroundColor);
63            }
64            setWebView(web);
65            loadData();
66        }
67        super.putInForeground();
68    }
69
70    @Override
71    void putInBackground() {
72        if (getWebView() == null) return;
73        super.putInBackground();
74        if (!mPersistentWebview) {
75            super.destroy();
76        }
77    }
78
79    void loadData() {
80        if (mLoadTask == null) {
81            mLoadTask = new LoadData(this, mContext.getContentResolver());
82            mLoadTask.execute();
83        }
84    }
85
86    @Override
87    void addChildTab(Tab child) {
88        throw new IllegalStateException("Snapshot tabs cannot have child tabs!");
89    }
90
91    @Override
92    public boolean isSnapshot() {
93        return true;
94    }
95
96    public long getSnapshotId() {
97        return mSnapshotId;
98    }
99
100    @Override
101    public ContentValues createSnapshotValues() {
102        return null;
103    }
104
105    @Override
106    boolean saveState() {
107        return false;
108    }
109
110    static class LoadData extends AsyncTask<Void, Void, Cursor> {
111
112        static final String[] PROJECTION = new String[] {
113            Snapshots._ID, // 0
114            Snapshots.TITLE, // 1
115            Snapshots.URL, // 2
116            Snapshots.FAVICON, // 3
117            Snapshots.VIEWSTATE, // 4
118            Snapshots.BACKGROUND, // 5
119        };
120
121        private SnapshotTab mTab;
122        private ContentResolver mContentResolver;
123
124        public LoadData(SnapshotTab t, ContentResolver cr) {
125            mTab = t;
126            mContentResolver = cr;
127        }
128
129        @Override
130        protected Cursor doInBackground(Void... params) {
131            long id = mTab.mSnapshotId;
132            Uri uri = ContentUris.withAppendedId(Snapshots.CONTENT_URI, id);
133            return mContentResolver.query(uri, PROJECTION, null, null, null);
134        }
135
136        @Override
137        protected void onPostExecute(Cursor result) {
138            try {
139                if (result.moveToFirst()) {
140                    mTab.mCurrentState.mTitle = result.getString(1);
141                    mTab.mCurrentState.mUrl = result.getString(2);
142                    byte[] favicon = result.getBlob(3);
143                    if (favicon != null) {
144                        mTab.mCurrentState.mFavicon = BitmapFactory
145                                .decodeByteArray(favicon, 0, favicon.length);
146                    }
147                    WebView web = mTab.getWebView();
148                    if (web != null) {
149                        byte[] data = result.getBlob(4);
150                        ByteArrayInputStream bis = new ByteArrayInputStream(data);
151                        try {
152                            GZIPInputStream stream = new GZIPInputStream(bis);
153                            web.loadViewState(stream);
154                        } catch (Exception e) {
155                            Log.w(LOGTAG, "Failed to load view state", e);
156                        }
157                    }
158                    mTab.mBackgroundColor = result.getInt(5);
159                    mTab.mWebViewController.onPageFinished(mTab);
160                }
161            } finally {
162                if (result != null) {
163                    result.close();
164                }
165                mTab.mLoadTask = null;
166            }
167        }
168
169    }
170}
171