am c88cdea2
: Merge "Migrate license display to HTMLViewer." into lmp-mr1-dev
* commit 'c88cdea2bb6f830abb8f1fe3b422368d3275f88c': Migrate license display to HTMLViewer.
This commit is contained in:
@@ -692,17 +692,6 @@
|
|||||||
android:value="true" />
|
android:value="true" />
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
<activity android:name="SettingsSafetyLegalActivity"
|
|
||||||
android:label="@string/settings_safetylegal_activity_title"
|
|
||||||
android:theme="@*android:style/Theme.Material.Light.Dialog.Alert">
|
|
||||||
<intent-filter>
|
|
||||||
<action android:name="android.settings.SAFETY" />
|
|
||||||
<category android:name="android.intent.category.DEFAULT" />
|
|
||||||
</intent-filter>
|
|
||||||
<meta-data android:name="com.android.settings.PRIMARY_PROFILE_CONTROLLED"
|
|
||||||
android:value="true" />
|
|
||||||
</activity>
|
|
||||||
|
|
||||||
<activity android:name="Settings$ManageApplicationsActivity"
|
<activity android:name="Settings$ManageApplicationsActivity"
|
||||||
android:label="@string/applications_settings"
|
android:label="@string/applications_settings"
|
||||||
android:taskAffinity="">
|
android:taskAffinity="">
|
||||||
|
@@ -80,12 +80,6 @@
|
|||||||
|
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
|
||||||
<PreferenceScreen
|
|
||||||
android:key="safetylegal"
|
|
||||||
android:title="@string/settings_safetylegal_title">
|
|
||||||
<intent android:action="android.settings.SAFETY" />
|
|
||||||
</PreferenceScreen>
|
|
||||||
|
|
||||||
<PreferenceScreen
|
<PreferenceScreen
|
||||||
android:key="regulatory_info"
|
android:key="regulatory_info"
|
||||||
android:title="@string/regulatory_information">
|
android:title="@string/regulatory_information">
|
||||||
|
@@ -16,205 +16,64 @@
|
|||||||
|
|
||||||
package com.android.settings;
|
package com.android.settings;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.ActivityNotFoundException;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.Message;
|
|
||||||
import android.os.SystemProperties;
|
import android.os.SystemProperties;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.webkit.WebView;
|
|
||||||
import android.webkit.WebViewClient;
|
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import android.app.Activity;
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.app.ProgressDialog;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.content.DialogInterface.OnDismissListener;
|
|
||||||
import android.content.res.Configuration;
|
|
||||||
|
|
||||||
import java.io.FileInputStream;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.FileReader;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.util.zip.GZIPInputStream;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "dialog" that shows from "License" in the Settings app.
|
* The "dialog" that shows from "License" in the Settings app.
|
||||||
*/
|
*/
|
||||||
public class SettingsLicenseActivity extends Activity {
|
public class SettingsLicenseActivity extends Activity {
|
||||||
|
|
||||||
private static final String TAG = "SettingsLicenseActivity";
|
private static final String TAG = "SettingsLicenseActivity";
|
||||||
private static final boolean LOGV = false || false;
|
|
||||||
|
|
||||||
private static final String DEFAULT_LICENSE_PATH = "/system/etc/NOTICE.html.gz";
|
private static final String DEFAULT_LICENSE_PATH = "/system/etc/NOTICE.html.gz";
|
||||||
private static final String PROPERTY_LICENSE_PATH = "ro.config.license_path";
|
private static final String PROPERTY_LICENSE_PATH = "ro.config.license_path";
|
||||||
|
|
||||||
private Handler mHandler;
|
|
||||||
private WebView mWebView;
|
|
||||||
private ProgressDialog mSpinnerDlg;
|
|
||||||
private AlertDialog mTextDlg;
|
|
||||||
|
|
||||||
private class LicenseFileLoader implements Runnable {
|
|
||||||
|
|
||||||
private static final String INNER_TAG = "SettingsLicenseActivity.LicenseFileLoader";
|
|
||||||
public static final int STATUS_OK = 0;
|
|
||||||
public static final int STATUS_NOT_FOUND = 1;
|
|
||||||
public static final int STATUS_READ_ERROR = 2;
|
|
||||||
public static final int STATUS_EMPTY_FILE = 3;
|
|
||||||
|
|
||||||
private String mFileName;
|
|
||||||
private Handler mHandler;
|
|
||||||
|
|
||||||
public LicenseFileLoader(String fileName, Handler handler) {
|
|
||||||
mFileName = fileName;
|
|
||||||
mHandler = handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void run() {
|
|
||||||
|
|
||||||
int status = STATUS_OK;
|
|
||||||
|
|
||||||
InputStreamReader inputReader = null;
|
|
||||||
StringBuilder data = new StringBuilder(2048);
|
|
||||||
try {
|
|
||||||
char[] tmp = new char[2048];
|
|
||||||
int numRead;
|
|
||||||
if (mFileName.endsWith(".gz")) {
|
|
||||||
inputReader = new InputStreamReader(
|
|
||||||
new GZIPInputStream(new FileInputStream(mFileName)));
|
|
||||||
} else {
|
|
||||||
inputReader = new FileReader(mFileName);
|
|
||||||
}
|
|
||||||
|
|
||||||
while ((numRead = inputReader.read(tmp)) >= 0) {
|
|
||||||
data.append(tmp, 0, numRead);
|
|
||||||
}
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
Log.e(INNER_TAG, "License HTML file not found at " + mFileName, e);
|
|
||||||
status = STATUS_NOT_FOUND;
|
|
||||||
} catch (IOException e) {
|
|
||||||
Log.e(INNER_TAG, "Error reading license HTML file at " + mFileName, e);
|
|
||||||
status = STATUS_READ_ERROR;
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
if (inputReader != null) {
|
|
||||||
inputReader.close();
|
|
||||||
}
|
|
||||||
} catch (IOException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((status == STATUS_OK) && TextUtils.isEmpty(data)) {
|
|
||||||
Log.e(INNER_TAG, "License HTML is empty (from " + mFileName + ")");
|
|
||||||
status = STATUS_EMPTY_FILE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tell the UI thread that we are finished.
|
|
||||||
Message msg = mHandler.obtainMessage(status, null);
|
|
||||||
if (status == STATUS_OK) {
|
|
||||||
msg.obj = data.toString();
|
|
||||||
}
|
|
||||||
mHandler.sendMessage(msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public SettingsLicenseActivity() {
|
|
||||||
super();
|
|
||||||
mHandler = null;
|
|
||||||
mWebView = null;
|
|
||||||
mSpinnerDlg = null;
|
|
||||||
mTextDlg = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
String fileName = SystemProperties.get(PROPERTY_LICENSE_PATH, DEFAULT_LICENSE_PATH);
|
final String path = SystemProperties.get(PROPERTY_LICENSE_PATH, DEFAULT_LICENSE_PATH);
|
||||||
if (TextUtils.isEmpty(fileName)) {
|
if (TextUtils.isEmpty(path)) {
|
||||||
Log.e(TAG, "The system property for the license file is empty.");
|
Log.e(TAG, "The system property for the license file is empty");
|
||||||
showErrorAndFinish();
|
showErrorAndFinish();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The activity does not have any view itself,
|
final File file = new File(path);
|
||||||
// so set it invisible to avoid displaying the title text in the background.
|
if (!file.exists() || file.length() == 0) {
|
||||||
setVisible(false);
|
Log.e(TAG, "License file " + path + " does not exist");
|
||||||
|
showErrorAndFinish();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
mWebView = new WebView(this);
|
// Kick off external viewer due to WebView security restrictions; we
|
||||||
|
// carefully point it at HTMLViewer, since it offers to decompress
|
||||||
|
// before viewing.
|
||||||
|
final Intent intent = new Intent(Intent.ACTION_VIEW);
|
||||||
|
intent.setDataAndType(Uri.fromFile(file), "text/html");
|
||||||
|
intent.putExtra(Intent.EXTRA_TITLE, getString(R.string.settings_license_activity_title));
|
||||||
|
intent.addCategory(Intent.CATEGORY_DEFAULT);
|
||||||
|
intent.setPackage("com.android.htmlviewer");
|
||||||
|
|
||||||
mHandler = new Handler() {
|
try {
|
||||||
|
startActivity(intent);
|
||||||
@Override
|
finish();
|
||||||
public void handleMessage(Message msg) {
|
} catch (ActivityNotFoundException e) {
|
||||||
super.handleMessage(msg);
|
Log.e(TAG, "Failed to find viewer", e);
|
||||||
|
|
||||||
if (msg.what == LicenseFileLoader.STATUS_OK) {
|
|
||||||
String text = (String) msg.obj;
|
|
||||||
showPageOfText(text);
|
|
||||||
} else {
|
|
||||||
showErrorAndFinish();
|
showErrorAndFinish();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
CharSequence title = getText(R.string.settings_license_activity_title);
|
|
||||||
CharSequence msg = getText(R.string.settings_license_activity_loading);
|
|
||||||
|
|
||||||
ProgressDialog pd = ProgressDialog.show(this, title, msg, true, false);
|
|
||||||
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
|
|
||||||
mSpinnerDlg = pd;
|
|
||||||
|
|
||||||
// Start separate thread to do the actual loading.
|
|
||||||
Thread thread = new Thread(new LicenseFileLoader(fileName, mHandler));
|
|
||||||
thread.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDestroy() {
|
|
||||||
if (mTextDlg != null && mTextDlg.isShowing()) {
|
|
||||||
mTextDlg.dismiss();
|
|
||||||
}
|
|
||||||
if (mSpinnerDlg != null && mSpinnerDlg.isShowing()) {
|
|
||||||
mSpinnerDlg.dismiss();
|
|
||||||
}
|
|
||||||
super.onDestroy();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void showPageOfText(String text) {
|
|
||||||
// Create an AlertDialog to display the WebView in.
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(SettingsLicenseActivity.this);
|
|
||||||
builder.setCancelable(true)
|
|
||||||
.setView(mWebView)
|
|
||||||
.setTitle(R.string.settings_license_activity_title);
|
|
||||||
|
|
||||||
mTextDlg = builder.create();
|
|
||||||
mTextDlg.setOnDismissListener(new OnDismissListener() {
|
|
||||||
|
|
||||||
public void onDismiss(DialogInterface dlgi) {
|
|
||||||
SettingsLicenseActivity.this.finish();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Begin the loading. This will be done in a separate thread in WebView.
|
|
||||||
mWebView.loadDataWithBaseURL(null, text, "text/html", "utf-8", null);
|
|
||||||
mWebView.setWebViewClient(new WebViewClient() {
|
|
||||||
@Override
|
|
||||||
public void onPageFinished(WebView view, String url) {
|
|
||||||
mSpinnerDlg.dismiss();
|
|
||||||
if (SettingsLicenseActivity.this.isResumed()) {
|
|
||||||
mTextDlg.show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
mWebView = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void showErrorAndFinish() {
|
private void showErrorAndFinish() {
|
||||||
mSpinnerDlg.dismiss();
|
|
||||||
mSpinnerDlg = null;
|
|
||||||
Toast.makeText(this, R.string.settings_license_activity_unavailable, Toast.LENGTH_LONG)
|
Toast.makeText(this, R.string.settings_license_activity_unavailable, Toast.LENGTH_LONG)
|
||||||
.show();
|
.show();
|
||||||
finish();
|
finish();
|
||||||
|
@@ -1,142 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2009 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.settings;
|
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Configuration;
|
|
||||||
import android.os.Build;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import android.os.SystemProperties;
|
|
||||||
import android.telephony.TelephonyManager;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.view.KeyEvent;
|
|
||||||
import android.webkit.WebView;
|
|
||||||
import android.webkit.WebViewClient;
|
|
||||||
import com.android.internal.app.AlertActivity;
|
|
||||||
import com.android.internal.app.AlertController;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The "dialog" that shows from "Safety information" in the Settings app.
|
|
||||||
*/
|
|
||||||
public class SettingsSafetyLegalActivity extends AlertActivity
|
|
||||||
implements DialogInterface.OnCancelListener, DialogInterface.OnClickListener {
|
|
||||||
private static final String PROPERTY_LSAFETYLEGAL_URL = "ro.url.safetylegal";
|
|
||||||
|
|
||||||
private WebView mWebView;
|
|
||||||
|
|
||||||
private AlertDialog mErrorDialog = null;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
|
|
||||||
String userSafetylegalUrl = SystemProperties.get(PROPERTY_LSAFETYLEGAL_URL);
|
|
||||||
|
|
||||||
final Configuration configuration = getResources().getConfiguration();
|
|
||||||
final String language = configuration.locale.getLanguage();
|
|
||||||
final String country = configuration.locale.getCountry();
|
|
||||||
|
|
||||||
String loc = String.format("locale=%s-%s", language, country);
|
|
||||||
|
|
||||||
userSafetylegalUrl = String.format("%s&%s", userSafetylegalUrl, loc);
|
|
||||||
|
|
||||||
mWebView = new WebView(this);
|
|
||||||
|
|
||||||
// Begin accessing
|
|
||||||
mWebView.getSettings().setJavaScriptEnabled(true);
|
|
||||||
if (savedInstanceState == null) {
|
|
||||||
mWebView.loadUrl(userSafetylegalUrl);
|
|
||||||
} else {
|
|
||||||
mWebView.restoreState(savedInstanceState);
|
|
||||||
}
|
|
||||||
mWebView.setWebViewClient(new WebViewClient() {
|
|
||||||
@Override
|
|
||||||
public void onPageFinished(WebView view, String url) {
|
|
||||||
// Change from 'Loading...' to the real title
|
|
||||||
mAlert.setTitle(getString(R.string.settings_safetylegal_activity_title));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onReceivedError(WebView view, int errorCode,
|
|
||||||
String description, String failingUrl) {
|
|
||||||
showErrorAndFinish(failingUrl);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
final AlertController.AlertParams p = mAlertParams;
|
|
||||||
p.mTitle = getString(R.string.settings_safetylegal_activity_loading);
|
|
||||||
p.mView = mWebView;
|
|
||||||
p.mForceInverseBackground = true;
|
|
||||||
setupAlert();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void showErrorAndFinish(String url) {
|
|
||||||
if (mErrorDialog == null) {
|
|
||||||
mErrorDialog = new AlertDialog.Builder(this)
|
|
||||||
.setTitle(R.string.settings_safetylegal_activity_title)
|
|
||||||
.setPositiveButton(android.R.string.ok, this)
|
|
||||||
.setOnCancelListener(this)
|
|
||||||
.setCancelable(true)
|
|
||||||
.create();
|
|
||||||
} else {
|
|
||||||
if (mErrorDialog.isShowing()) {
|
|
||||||
mErrorDialog.dismiss();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mErrorDialog.setMessage(getResources()
|
|
||||||
.getString(R.string.settings_safetylegal_activity_unreachable, url));
|
|
||||||
mErrorDialog.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onDestroy() {
|
|
||||||
super.onDestroy();
|
|
||||||
|
|
||||||
if (mErrorDialog != null) {
|
|
||||||
mErrorDialog.dismiss();
|
|
||||||
mErrorDialog = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean dispatchKeyEvent(KeyEvent event) {
|
|
||||||
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK
|
|
||||||
&& event.getAction() == KeyEvent.ACTION_DOWN) {
|
|
||||||
if (mWebView.canGoBack()) {
|
|
||||||
mWebView.goBack();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return super.dispatchKeyEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onClick(DialogInterface dialog, int whichButton) {
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onCancel(DialogInterface dialog) {
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onSaveInstanceState(Bundle icicle) {
|
|
||||||
mWebView.saveState(icicle);
|
|
||||||
super.onSaveInstanceState(icicle);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -16,11 +16,7 @@
|
|||||||
|
|
||||||
package com.android.settings;
|
package com.android.settings;
|
||||||
|
|
||||||
import com.android.settings.wifi.WifiApEnabler;
|
|
||||||
import com.android.settings.wifi.WifiApDialog;
|
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.bluetooth.BluetoothAdapter;
|
import android.bluetooth.BluetoothAdapter;
|
||||||
import android.bluetooth.BluetoothPan;
|
import android.bluetooth.BluetoothPan;
|
||||||
@@ -31,7 +27,6 @@ import android.content.DialogInterface;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.content.res.AssetManager;
|
|
||||||
import android.hardware.usb.UsbManager;
|
import android.hardware.usb.UsbManager;
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
import android.net.wifi.WifiConfiguration;
|
import android.net.wifi.WifiConfiguration;
|
||||||
@@ -44,16 +39,13 @@ import android.os.UserManager;
|
|||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.PreferenceScreen;
|
import android.preference.PreferenceScreen;
|
||||||
import android.preference.SwitchPreference;
|
import android.preference.SwitchPreference;
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.view.ViewParent;
|
|
||||||
import android.webkit.WebView;
|
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import java.io.InputStream;
|
import com.android.settings.wifi.WifiApDialog;
|
||||||
|
import com.android.settings.wifi.WifiApEnabler;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Displays preferences for Tethering.
|
* Displays preferences for Tethering.
|
||||||
@@ -69,7 +61,6 @@ public class TetherSettings extends SettingsPreferenceFragment
|
|||||||
|
|
||||||
private static final int DIALOG_AP_SETTINGS = 1;
|
private static final int DIALOG_AP_SETTINGS = 1;
|
||||||
|
|
||||||
private WebView mView;
|
|
||||||
private SwitchPreference mUsbTether;
|
private SwitchPreference mUsbTether;
|
||||||
|
|
||||||
private WifiApEnabler mWifiApEnabler;
|
private WifiApEnabler mWifiApEnabler;
|
||||||
@@ -182,8 +173,6 @@ public class TetherSettings extends SettingsPreferenceFragment
|
|||||||
|
|
||||||
mProvisionApp = getResources().getStringArray(
|
mProvisionApp = getResources().getStringArray(
|
||||||
com.android.internal.R.array.config_mobile_hotspot_provision_app);
|
com.android.internal.R.array.config_mobile_hotspot_provision_app);
|
||||||
|
|
||||||
mView = new WebView(activity);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
Reference in New Issue
Block a user