/* * 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.database.Cursor; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.webkit.WebView; import com.android.browser.provider.SnapshotProvider.Snapshots; import java.io.ByteArrayInputStream; 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.getContentResolver()); 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; getWebView().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.TITLE, // 1 Snapshots.URL, // 2 Snapshots.FAVICON, // 3 Snapshots.VIEWSTATE, // 4 Snapshots.BACKGROUND, // 5 Snapshots.DATE_CREATED, // 6 }; private SnapshotTab mTab; private ContentResolver mContentResolver; public LoadData(SnapshotTab t, ContentResolver cr) { mTab = t; mContentResolver = cr; } @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); } @Override protected void onPostExecute(Cursor result) { try { if (result.moveToFirst()) { mTab.mCurrentState.mTitle = result.getString(1); mTab.mCurrentState.mUrl = result.getString(2); byte[] favicon = result.getBlob(3); if (favicon != null) { mTab.mCurrentState.mFavicon = BitmapFactory .decodeByteArray(favicon, 0, favicon.length); } WebView web = mTab.getWebView(); if (web != null) { byte[] data = result.getBlob(4); ByteArrayInputStream bis = new ByteArrayInputStream(data); GZIPInputStream stream = new GZIPInputStream(bis); web.loadViewState(stream); } mTab.mBackgroundColor = result.getInt(5); mTab.mDateCreated = result.getLong(6); 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(); } } }