diff options
Diffstat (limited to 'src/com/android/swe/browser/SnapshotTab.java')
-rw-r--r-- | src/com/android/swe/browser/SnapshotTab.java | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/src/com/android/swe/browser/SnapshotTab.java b/src/com/android/swe/browser/SnapshotTab.java new file mode 100644 index 00000000..e14f0959 --- /dev/null +++ b/src/com/android/swe/browser/SnapshotTab.java @@ -0,0 +1,243 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.browser; + +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Bundle; +import android.text.TextUtils; +import android.util.Log; +import android.webkit.WebView; +import android.webkit.WebViewClassic; + +import com.android.browser.provider.SnapshotProvider.Snapshots; + +import java.io.ByteArrayInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.util.Map; +import java.util.zip.GZIPInputStream; + + +public class SnapshotTab extends Tab { + + private static final String LOGTAG = "SnapshotTab"; + + private long mSnapshotId; + private LoadData mLoadTask; + private WebViewFactory mWebViewFactory; + private int mBackgroundColor; + private long mDateCreated; + private boolean mIsLive; + + public SnapshotTab(WebViewController wvcontroller, long snapshotId) { + super(wvcontroller, null, null); + mSnapshotId = snapshotId; + mWebViewFactory = mWebViewController.getWebViewFactory(); + WebView web = mWebViewFactory.createWebView(false); + setWebView(web); + loadData(); + } + + @Override + void putInForeground() { + if (getWebView() == null) { + WebView web = mWebViewFactory.createWebView(false); + if (mBackgroundColor != 0) { + web.setBackgroundColor(mBackgroundColor); + } + setWebView(web); + loadData(); + } + super.putInForeground(); + } + + @Override + void putInBackground() { + if (getWebView() == null) return; + super.putInBackground(); + } + + void loadData() { + if (mLoadTask == null) { + mLoadTask = new LoadData(this, mContext); + mLoadTask.execute(); + } + } + + @Override + void addChildTab(Tab child) { + if (mIsLive) { + super.addChildTab(child); + } else { + throw new IllegalStateException("Snapshot tabs cannot have child tabs!"); + } + } + + @Override + public boolean isSnapshot() { + return !mIsLive; + } + + public long getSnapshotId() { + return mSnapshotId; + } + + @Override + public ContentValues createSnapshotValues() { + if (mIsLive) { + return super.createSnapshotValues(); + } + return null; + } + + @Override + public Bundle saveState() { + if (mIsLive) { + return super.saveState(); + } + return null; + } + + public long getDateCreated() { + return mDateCreated; + } + + @Override + public void loadUrl(String url, Map<String, String> headers) { + if (!mIsLive) { + mIsLive = true; + getWebViewClassic().clearViewState(); + } + super.loadUrl(url, headers); + } + + @Override + public boolean canGoBack() { + return super.canGoBack() || mIsLive; + } + + @Override + public boolean canGoForward() { + return mIsLive && super.canGoForward(); + } + + @Override + public void goBack() { + if (super.canGoBack()) { + super.goBack(); + } else { + mIsLive = false; + getWebView().stopLoading(); + loadData(); + } + } + + static class LoadData extends AsyncTask<Void, Void, Cursor> { + + static final String[] PROJECTION = new String[] { + Snapshots._ID, // 0 + Snapshots.URL, // 1 + Snapshots.TITLE, // 2 + Snapshots.FAVICON, // 3 + Snapshots.VIEWSTATE, // 4 + Snapshots.BACKGROUND, // 5 + Snapshots.DATE_CREATED, // 6 + Snapshots.VIEWSTATE_PATH, // 7 + }; + static final int SNAPSHOT_ID = 0; + static final int SNAPSHOT_URL = 1; + static final int SNAPSHOT_TITLE = 2; + static final int SNAPSHOT_FAVICON = 3; + static final int SNAPSHOT_VIEWSTATE = 4; + static final int SNAPSHOT_BACKGROUND = 5; + static final int SNAPSHOT_DATE_CREATED = 6; + static final int SNAPSHOT_VIEWSTATE_PATH = 7; + + private SnapshotTab mTab; + private ContentResolver mContentResolver; + private Context mContext; + + public LoadData(SnapshotTab t, Context context) { + mTab = t; + mContentResolver = context.getContentResolver(); + mContext = context; + } + + @Override + protected Cursor doInBackground(Void... params) { + long id = mTab.mSnapshotId; + Uri uri = ContentUris.withAppendedId(Snapshots.CONTENT_URI, id); + return mContentResolver.query(uri, PROJECTION, null, null, null); + } + + private InputStream getInputStream(Cursor c) throws FileNotFoundException { + String path = c.getString(SNAPSHOT_VIEWSTATE_PATH); + if (!TextUtils.isEmpty(path)) { + return mContext.openFileInput(path); + } + byte[] data = c.getBlob(SNAPSHOT_VIEWSTATE); + ByteArrayInputStream bis = new ByteArrayInputStream(data); + return bis; + } + + @Override + protected void onPostExecute(Cursor result) { + try { + if (result.moveToFirst()) { + mTab.mCurrentState.mTitle = result.getString(SNAPSHOT_TITLE); + mTab.mCurrentState.mUrl = result.getString(SNAPSHOT_URL); + byte[] favicon = result.getBlob(SNAPSHOT_FAVICON); + if (favicon != null) { + mTab.mCurrentState.mFavicon = BitmapFactory + .decodeByteArray(favicon, 0, favicon.length); + } + WebViewClassic web = mTab.getWebViewClassic(); + if (web != null) { + InputStream ins = getInputStream(result); + GZIPInputStream stream = new GZIPInputStream(ins); + web.loadViewState(stream); + } + mTab.mBackgroundColor = result.getInt(SNAPSHOT_BACKGROUND); + mTab.mDateCreated = result.getLong(SNAPSHOT_DATE_CREATED); + mTab.mWebViewController.onPageFinished(mTab); + } + } catch (Exception e) { + Log.w(LOGTAG, "Failed to load view state, closing tab", e); + mTab.mWebViewController.closeTab(mTab); + } finally { + if (result != null) { + result.close(); + } + mTab.mLoadTask = null; + } + } + + } + + @Override + protected void persistThumbnail() { + if (mIsLive) { + super.persistThumbnail(); + } + } +} |