diff options
-rw-r--r-- | AndroidManifest.xml | 3 | ||||
-rw-r--r-- | src/com/android/settings/SettingsLicenseActivity.java | 193 |
2 files changed, 147 insertions, 49 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 54c29c1..1b322ea 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -479,7 +479,8 @@ <activity android:name="SettingsLicenseActivity" android:label="@string/settings_license_activity_title" - android:theme="@*android:style/Theme.Holo.Dialog.Alert"> + android:theme="@*android:style/Theme.Holo.Dialog.Alert" + android:configChanges="orientation"> <intent-filter> <action android:name="android.settings.LICENSE" /> <category android:name="android.intent.category.DEFAULT" /> 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(); } - } |