1931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project/*
2931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project *
4931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * you may not use this file except in compliance with the License.
6931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * You may obtain a copy of the License at
7931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project *
8931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project *
10931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * See the License for the specific language governing permissions and
14931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * limitations under the License.
15931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project */
16931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
17931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectpackage com.android.htmlviewer;
18931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
19931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport android.app.Activity;
20931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport android.content.Intent;
21931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport android.net.Uri;
22931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport android.os.Bundle;
23931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport android.util.Log;
24931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport android.view.Window;
25931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport android.webkit.CookieSyncManager;
26931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport android.webkit.WebChromeClient;
27931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport android.webkit.WebSettings;
28931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport android.webkit.WebView;
29931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
30931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport java.io.File;
31931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport java.io.FileInputStream;
32931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport java.io.FileNotFoundException;
33931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport java.io.IOException;
34931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectimport java.io.InputStream;
35931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
36931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project/**
37931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * Wraps a WebView widget within an Activity. When launched, it uses the
38931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * URI from the intent as the URL to load into the WebView.
39931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * It supports all URLs schemes that a standard WebView supports, as well as
40931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * loading the top level markup using the file scheme.
41931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * The WebView default settings are used with the exception of normal layout
42931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * is set.
43931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * This activity shows a loading progress bar in the window title and sets
44931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project * the window title to the title of the content.
45931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project *
46931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project */
47931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Projectpublic class HTMLViewerActivity extends Activity {
48931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
49931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    /*
50931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project     * The WebView that is placed in this Activity
51931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project     */
52931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    private WebView mWebView;
53931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
54931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    /*
55931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project     * As the file content is loaded completely into RAM first, set
56931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project     * a limitation on the file size so we don't use too much RAM. If someone
57931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project     * wants to load content that is larger than this, then a content
58931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project     * provider should be used.
59931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project     */
60931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    static final int MAXFILESIZE = 8096;
61931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
62931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    static final String LOGTAG = "HTMLViewerActivity";
63931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
64931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    @Override
65931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    protected void onCreate(Bundle savedInstanceState) {
66931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        super.onCreate(savedInstanceState);
67931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
68931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // Call createInstance() explicitly. createInstance() is called in
69931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // BrowserFrame by WebView. As it is called in WebCore thread, it can
70931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // happen after onResume() is called. To use getInstance() in onResume,
71931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // createInstance() needs to be called first.
72931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        CookieSyncManager.createInstance(this);
73931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
74931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        requestWindowFeature(Window.FEATURE_PROGRESS);
75931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
76931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        mWebView = new WebView(this);
77931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        setContentView(mWebView);
78931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
79931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // Setup callback support for title and progress bar
80931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        mWebView.setWebChromeClient( new WebChrome() );
81931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
82931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // Configure the webview
83931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        WebSettings s = mWebView.getSettings();
84931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        s.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
85931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        s.setUseWideViewPort(true);
86931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        s.setSavePassword(false);
87931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        s.setSaveFormData(false);
88931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        s.setBlockNetworkLoads(true);
89931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
90931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // Javascript is purposely disabled, so that nothing can be
91931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // automatically run.
92931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        s.setJavaScriptEnabled(false);
93931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
94931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // Restore a webview if we are meant to restore
95931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        if (savedInstanceState != null) {
96931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            mWebView.restoreState(savedInstanceState);
97931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        } else {
98931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            // Check the intent for the content to view
99931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            Intent intent = getIntent();
100931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            if (intent.getData() != null) {
101931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project                Uri uri = intent.getData();
10289c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark                String contentUri = "file".equals(uri.getScheme())
10389c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark                        ? FileContentProvider.BASE_URI + uri.getEncodedPath()
10489c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark                        : uri.toString();
10589c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark                String intentType = intent.getType();
10689c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark                if (intentType != null) {
10789c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark                    contentUri += "?" + intentType;
108931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project                }
10989c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark                mWebView.loadUrl(contentUri);
110931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            }
111931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        }
112931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    }
113931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
114931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    @Override
115931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    protected void onResume() {
116931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        super.onResume();
117931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        CookieSyncManager.getInstance().startSync();
118931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    }
119931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
120931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    @Override
121931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    protected void onSaveInstanceState(Bundle outState) {
122931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // the default implementation requires each view to have an id. As the
123931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // browser handles the state itself and it doesn't use id for the views,
124931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // don't call the default implementation. Otherwise it will trigger the
125931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // warning like this, "couldn't save which view has focus because the
126931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // focused view XXX has no id".
127931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        mWebView.saveState(outState);
128931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    }
129931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
130931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    @Override
131931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    protected void onStop() {
132931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        super.onStop();
133931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
134931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        CookieSyncManager.getInstance().stopSync();
135931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        mWebView.stopLoading();
136931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    }
137931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
138931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    @Override
139931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    protected void onDestroy() {
140931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        super.onDestroy();
141931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        mWebView.destroy();
142931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    }
143931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
144931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    class WebChrome extends WebChromeClient {
145931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
146931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        @Override
147931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        public void onReceivedTitle(WebView view, String title) {
148931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            HTMLViewerActivity.this.setTitle(title);
149931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        }
150931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
151931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        @Override
152931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        public void onProgressChanged(WebView view, int newProgress) {
153931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            getWindow().setFeatureInt(
154931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project                    Window.FEATURE_PROGRESS, newProgress*100);
155931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            if (newProgress == 100) {
156931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project                CookieSyncManager.getInstance().sync();
157931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            }
158931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        }
159931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    }
160931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
161931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project}
162