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.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); 90931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project 91931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project // Javascript is purposely disabled, so that nothing can be 92931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project // automatically run. 93931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project s.setJavaScriptEnabled(false); 94931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project 95931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project // Restore a webview if we are meant to restore 96931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project if (savedInstanceState != null) { 97931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project mWebView.restoreState(savedInstanceState); 98931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project } else { 99931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project // Check the intent for the content to view 100931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project Intent intent = getIntent(); 101931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project if (intent.getData() != null) { 102931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project Uri uri = intent.getData(); 10389c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark String contentUri = "file".equals(uri.getScheme()) 10489c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark ? FileContentProvider.BASE_URI + uri.getEncodedPath() 10589c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark : uri.toString(); 10689c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark String intentType = intent.getType(); 10789c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark if (intentType != null) { 10889c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark contentUri += "?" + intentType; 109931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project } 11089c5a7db771a601adf20ad3e3a7a979ccacbd0d9Cary Clark mWebView.loadUrl(contentUri); 111931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project } 112931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project } 113931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project } 114931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project 115931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project @Override 116931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project protected void onResume() { 117931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project super.onResume(); 118931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project CookieSyncManager.getInstance().startSync(); 119931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project } 120931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project 121931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project @Override 122931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project protected void onSaveInstanceState(Bundle outState) { 123931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project // the default implementation requires each view to have an id. As the 124931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project // browser handles the state itself and it doesn't use id for the views, 125931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project // don't call the default implementation. Otherwise it will trigger the 126931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project // warning like this, "couldn't save which view has focus because the 127931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project // focused view XXX has no id". 128931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project mWebView.saveState(outState); 129931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project } 130931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project 131931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project @Override 132931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project protected void onStop() { 133931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project super.onStop(); 134931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project 135931fd3728855b03bcab825ce10475d7447e9097aThe Android Open Source Project CookieSyncManager.getInstance().stopSync(); 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