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/**
377609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch * Wraps a WebView widget within an Activity. When launched, it uses the
387609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch * 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.
417609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch * 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 {
487609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch
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;
537609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch
54931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    /*
557609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch     * 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;
617609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch
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
687609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch        // Call createInstance() explicitly. createInstance() is called in
697609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch        // 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);
757609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch
76931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        mWebView = new WebView(this);
77931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        setContentView(mWebView);
787609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch
79931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // Setup callback support for title and progress bar
80931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        mWebView.setWebChromeClient( new WebChrome() );
817609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch
82931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // Configure the webview
83931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        WebSettings s = mWebView.getSettings();
84931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        s.setUseWideViewPort(true);
859715e7c99a3a86162718d7932aaa174090abc381Mikhail Naganov        s.setSupportZoom(true);
869715e7c99a3a86162718d7932aaa174090abc381Mikhail Naganov        s.setBuiltInZoomControls(true);
87931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        s.setSavePassword(false);
88931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        s.setSaveFormData(false);
89931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        s.setBlockNetworkLoads(true);
907609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch
917609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch        // Javascript is purposely disabled, so that nothing can be
92931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // automatically run.
93931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        s.setJavaScriptEnabled(false);
947609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch
957871a62ee3373100f62f13db906bca9825d6fbe7Ben Murdoch        s.setDefaultTextEncodingName("utf-8");
967871a62ee3373100f62f13db906bca9825d6fbe7Ben Murdoch
97931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // Restore a webview if we are meant to restore
98931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        if (savedInstanceState != null) {
99931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            mWebView.restoreState(savedInstanceState);
100931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        } else {
101931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            // Check the intent for the content to view
102931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            Intent intent = getIntent();
103931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            if (intent.getData() != null) {
104931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project                Uri uri = intent.getData();
10589c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark                String contentUri = "file".equals(uri.getScheme())
10689c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark                        ? FileContentProvider.BASE_URI + uri.getEncodedPath()
10789c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark                        : uri.toString();
10889c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark                mWebView.loadUrl(contentUri);
109931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            }
110931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        }
111931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    }
1127609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch
113931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    @Override
114931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    protected void onResume() {
115931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        super.onResume();
1167609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch        CookieSyncManager.getInstance().startSync();
117931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    }
1187609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch
119931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    @Override
120931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    protected void onSaveInstanceState(Bundle outState) {
121931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // the default implementation requires each view to have an id. As the
122931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // browser handles the state itself and it doesn't use id for the views,
123931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // don't call the default implementation. Otherwise it will trigger the
1247609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch        // warning like this, "couldn't save which view has focus because the
125931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        // focused view XXX has no id".
126931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        mWebView.saveState(outState);
127931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    }
128931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project
129931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    @Override
130931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    protected void onStop() {
131931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        super.onStop();
1327609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch
1337609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch        CookieSyncManager.getInstance().stopSync();
134931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    }
1357609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch
136931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    @Override
137931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    protected void onDestroy() {
138931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        super.onDestroy();
139931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        mWebView.destroy();
140931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    }
1417609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch
142931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    class WebChrome extends WebChromeClient {
1437609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch
144931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        @Override
145931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        public void onReceivedTitle(WebView view, String title) {
146931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            HTMLViewerActivity.this.setTitle(title);
147931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        }
1487609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch
149931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        @Override
150931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        public void onProgressChanged(WebView view, int newProgress) {
151931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            getWindow().setFeatureInt(
152931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project                    Window.FEATURE_PROGRESS, newProgress*100);
153931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            if (newProgress == 100) {
154931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project                CookieSyncManager.getInstance().sync();
155931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project            }
156931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project        }
157931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project    }
1587609f0f74a1b93ae5964d1d31a51fd25cca5d72bBen Murdoch
159931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project}
160