diff options
author | Henrik Carlsson <henrik1.carlsson@sonyericsson.com> | 2010-09-03 11:08:19 +0200 |
---|---|---|
committer | Kenny Root <kroot@google.com> | 2011-03-29 15:02:44 -0700 |
commit | 2cb19ab9e2a8d3de5695037b236ad00cde603808 (patch) | |
tree | 429f2ee4061bed3072df7d56c366e3b360a43f4a /src/com/android/settings/SettingsLicenseActivity.java | |
parent | 255fa0e96298da0f2ad1788fb79dfc353c8fc60a (diff) | |
download | packages_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.java | 193 |
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(); } - } |