summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/SettingsLicenseActivity.java
diff options
context:
space:
mode:
authorHenrik Carlsson <henrik1.carlsson@sonyericsson.com>2010-09-03 11:08:19 +0200
committerKenny Root <kroot@google.com>2011-03-29 15:02:44 -0700
commit2cb19ab9e2a8d3de5695037b236ad00cde603808 (patch)
tree429f2ee4061bed3072df7d56c366e3b360a43f4a /src/com/android/settings/SettingsLicenseActivity.java
parent255fa0e96298da0f2ad1788fb79dfc353c8fc60a (diff)
downloadpackages_apps_Settings-2cb19ab9e2a8d3de5695037b236ad00cde603808.zip
packages_apps_Settings-2cb19ab9e2a8d3de5695037b236ad00cde603808.tar.gz
packages_apps_Settings-2cb19ab9e2a8d3de5695037b236ad00cde603808.tar.bz2
Settings: Improved UX when viewing open source license info.
Added spinning progress indicator to the open source license dialog. The actual file loading is now handled by a separate thread, in order to provide user feedback and reduce risk for ANR. Change-Id: Ia12727ecc2fe8114e0d1384769b568142c8a1db6
Diffstat (limited to 'src/com/android/settings/SettingsLicenseActivity.java')
-rw-r--r--src/com/android/settings/SettingsLicenseActivity.java193
1 files changed, 145 insertions, 48 deletions
diff --git a/src/com/android/settings/SettingsLicenseActivity.java b/src/com/android/settings/SettingsLicenseActivity.java
index 0b809e1..99828ce 100644
--- a/src/com/android/settings/SettingsLicenseActivity.java
+++ b/src/com/android/settings/SettingsLicenseActivity.java
@@ -17,6 +17,8 @@
package com.android.settings;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
import android.os.SystemProperties;
import android.text.TextUtils;
import android.util.Config;
@@ -24,6 +26,12 @@ import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewClient;
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.FileNotFoundException;
@@ -32,13 +40,10 @@ import java.io.IOException;
import java.io.InputStreamReader;
import java.util.zip.GZIPInputStream;
-import com.android.internal.app.AlertActivity;
-import com.android.internal.app.AlertController;
-
/**
* The "dialog" that shows from "License" in the Settings app.
*/
-public class SettingsLicenseActivity extends AlertActivity {
+public class SettingsLicenseActivity extends Activity {
private static final String TAG = "SettingsLicenseActivity";
private static final boolean LOGV = false || Config.LOGV;
@@ -46,6 +51,83 @@ public class SettingsLicenseActivity extends AlertActivity {
private static final String DEFAULT_LICENSE_PATH = "/system/etc/NOTICE.html.gz";
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
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -57,67 +139,82 @@ public class SettingsLicenseActivity extends AlertActivity {
return;
}
- InputStreamReader inputReader = null;
- StringBuilder data = null;
- try {
- data = new StringBuilder(2048);
- char tmp[] = new char[2048];
- int numRead;
- if (fileName.endsWith(".gz")) {
- inputReader = new InputStreamReader(
- new GZIPInputStream(new FileInputStream(fileName)));
- } else {
- inputReader = new FileReader(fileName);
- }
- while ((numRead = inputReader.read(tmp)) >= 0) {
- data.append(tmp, 0, numRead);
- }
- } catch (FileNotFoundException e) {
- Log.e(TAG, "License HTML file not found at " + fileName, e);
- showErrorAndFinish();
- return;
- } catch (IOException e) {
- Log.e(TAG, "Error reading license HTML file at " + fileName, e);
- showErrorAndFinish();
- return;
- } finally {
- try {
- if (inputReader != null) {
- inputReader.close();
+ // The activity does not have any view itself,
+ // so set it invisible to avoid displaying the title text in the background.
+ setVisible(false);
+
+ mWebView = new WebView(this);
+
+ mHandler = new Handler() {
+
+ @Override
+ public void handleMessage(Message msg) {
+ super.handleMessage(msg);
+
+ if (msg.what == LicenseFileLoader.STATUS_OK) {
+ String text = (String) msg.obj;
+ showPageOfText(text);
+ } else {
+ showErrorAndFinish();
}
- } catch (IOException e) {
}
- }
+ };
- if (TextUtils.isEmpty(data)) {
- Log.e(TAG, "License HTML is empty (from " + fileName + ")");
- showErrorAndFinish();
- return;
+ 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() {
+ super.onDestroy();
+ if (mTextDlg != null) {
+ mTextDlg.dismiss();
}
+ }
+
+ 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() {
- WebView webView = new WebView(this);
+ public void onDismiss(DialogInterface dlgi) {
+ SettingsLicenseActivity.this.finish();
+ }
+ });
// Begin the loading. This will be done in a separate thread in WebView.
- webView.loadDataWithBaseURL(null, data.toString(), "text/html", "utf-8", null);
- webView.setWebViewClient(new WebViewClient() {
+ mWebView.loadDataWithBaseURL(null, text, "text/html", "utf-8", null);
+ 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_license_activity_title));
+ mSpinnerDlg.dismiss();
+ mSpinnerDlg = null;
+ mTextDlg.show();
+ mTextDlg = null;
}
});
- final AlertController.AlertParams p = mAlertParams;
- p.mTitle = getString(R.string.settings_license_activity_loading);
- p.mView = webView;
- p.mForceInverseBackground = true;
- setupAlert();
+ mWebView = null;
}
private void showErrorAndFinish() {
+ mSpinnerDlg.dismiss();
+ mSpinnerDlg = null;
Toast.makeText(this, R.string.settings_license_activity_unavailable, Toast.LENGTH_LONG)
.show();
finish();
}
-
}