1a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville/* 2a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville * Copyright (C) 2009 The Android Open Source Project 3a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville * 4a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 5a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville * you may not use this file except in compliance with the License. 6a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville * You may obtain a copy of the License at 7a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville * 8a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 9a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville * 10a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville * Unless required by applicable law or agreed to in writing, software 11a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 12a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville * See the License for the specific language governing permissions and 14a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville * limitations under the License. 15a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville */ 16a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 17a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Savillepackage com.android.settings; 18a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 19a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Savilleimport android.app.AlertDialog; 20a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Savilleimport android.content.Context; 21a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Savilleimport android.content.res.Configuration; 22a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Savilleimport android.os.Build; 23a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Savilleimport android.os.Bundle; 24a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Savilleimport android.os.SystemProperties; 25a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Savilleimport android.telephony.TelephonyManager; 26a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Savilleimport android.text.TextUtils; 27be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasaniimport android.view.KeyEvent; 28a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Savilleimport android.webkit.WebView; 29a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Savilleimport android.webkit.WebViewClient; 30a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Savilleimport com.android.internal.app.AlertActivity; 31a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Savilleimport com.android.internal.app.AlertController; 32a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Savilleimport android.content.DialogInterface; 33a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 34a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville/** 35a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville * The "dialog" that shows from "Safety information" in the Settings app. 36a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville */ 37be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasanipublic class SettingsSafetyLegalActivity extends AlertActivity 38be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani implements DialogInterface.OnCancelListener, DialogInterface.OnClickListener { 39a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville private static final String PROPERTY_LSAFETYLEGAL_URL = "ro.url.safetylegal"; 40a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 41be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani private WebView mWebView; 42be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani 4320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai private AlertDialog mErrorDialog = null; 4420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai 45a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville @Override 46a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville protected void onCreate(Bundle savedInstanceState) { 47a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville super.onCreate(savedInstanceState); 48a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 49a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville String userSafetylegalUrl = SystemProperties.get(PROPERTY_LSAFETYLEGAL_URL); 50a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 51a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville final Configuration configuration = getResources().getConfiguration(); 52a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville final String language = configuration.locale.getLanguage(); 53a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville final String country = configuration.locale.getCountry(); 54a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 55a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville String loc = String.format("locale=%s-%s", language, country); 56a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 57a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville userSafetylegalUrl = String.format("%s&%s", userSafetylegalUrl, loc); 58a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 59be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani mWebView = new WebView(this); 60a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 61a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville // Begin accessing 62be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani mWebView.getSettings().setJavaScriptEnabled(true); 633c9f79ba35c29ee6988f5b0b8a7bb7e59614088aAmith Yamasani if (savedInstanceState == null) { 643c9f79ba35c29ee6988f5b0b8a7bb7e59614088aAmith Yamasani mWebView.loadUrl(userSafetylegalUrl); 653c9f79ba35c29ee6988f5b0b8a7bb7e59614088aAmith Yamasani } else { 663c9f79ba35c29ee6988f5b0b8a7bb7e59614088aAmith Yamasani mWebView.restoreState(savedInstanceState); 673c9f79ba35c29ee6988f5b0b8a7bb7e59614088aAmith Yamasani } 68be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani mWebView.setWebViewClient(new WebViewClient() { 69a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville @Override 70a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville public void onPageFinished(WebView view, String url) { 71a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville // Change from 'Loading...' to the real title 72a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville mAlert.setTitle(getString(R.string.settings_safetylegal_activity_title)); 73a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 74be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani 75be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani @Override 76be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani public void onReceivedError(WebView view, int errorCode, 77be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani String description, String failingUrl) { 78be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani showErrorAndFinish(failingUrl); 79be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani } 80a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville }); 81a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 82a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville final AlertController.AlertParams p = mAlertParams; 83a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville p.mTitle = getString(R.string.settings_safetylegal_activity_loading); 84be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani p.mView = mWebView; 85a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville p.mForceInverseBackground = true; 86a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville setupAlert(); 87a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 88a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 89a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville private void showErrorAndFinish(String url) { 9020108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai if (mErrorDialog == null) { 9120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai mErrorDialog = new AlertDialog.Builder(this) 9220108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai .setTitle(R.string.settings_safetylegal_activity_title) 9320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai .setPositiveButton(android.R.string.ok, this) 9420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai .setOnCancelListener(this) 9520108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai .setCancelable(true) 9620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai .create(); 9720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai } else { 9820108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai if (mErrorDialog.isShowing()) { 9920108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai mErrorDialog.dismiss(); 10020108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai } 10120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai } 10220108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai mErrorDialog.setMessage(getResources() 10320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai .getString(R.string.settings_safetylegal_activity_unreachable, url)); 10420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai mErrorDialog.show(); 10520108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai } 10620108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai 10720108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai @Override 10820108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai protected void onDestroy() { 10920108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai super.onDestroy(); 11020108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai 11120108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai if (mErrorDialog != null) { 11220108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai mErrorDialog.dismiss(); 11320108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai mErrorDialog = null; 11420108e2ed6d7fdc889d85702f7cbda906db141cfJiehua.Dai } 115a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 116a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 117be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani @Override 118be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani public boolean dispatchKeyEvent(KeyEvent event) { 119be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani if (event.getKeyCode() == KeyEvent.KEYCODE_BACK 120be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani && event.getAction() == KeyEvent.ACTION_DOWN) { 121be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani if (mWebView.canGoBack()) { 122be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani mWebView.goBack(); 123be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani return true; 124be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani } 125a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 126be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani return super.dispatchKeyEvent(event); 127a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville } 128a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville 129be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani public void onClick(DialogInterface dialog, int whichButton) { 130be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani finish(); 131be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani } 132be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani 133be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani public void onCancel(DialogInterface dialog) { 134be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani finish(); 135be023c8a75567f66b41fb3b11a08b37c68a2e0acAmith Yamasani } 1363c9f79ba35c29ee6988f5b0b8a7bb7e59614088aAmith Yamasani 1373c9f79ba35c29ee6988f5b0b8a7bb7e59614088aAmith Yamasani @Override 1383c9f79ba35c29ee6988f5b0b8a7bb7e59614088aAmith Yamasani public void onSaveInstanceState(Bundle icicle) { 1393c9f79ba35c29ee6988f5b0b8a7bb7e59614088aAmith Yamasani mWebView.saveState(icicle); 1403c9f79ba35c29ee6988f5b0b8a7bb7e59614088aAmith Yamasani super.onSaveInstanceState(icicle); 1413c9f79ba35c29ee6988f5b0b8a7bb7e59614088aAmith Yamasani } 142a40fb23734cc5d5ac6e69a060cbb488269ad8af3Wink Saville} 143