Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 20108e2e authored by Jiehua.Dai's avatar Jiehua.Dai Committed by Johan Redestig
Browse files

Fix window leak problems in settings.

There were window leak in the settings application.
These leak happens when an AlertDialog displays, rotate the phone,
then it would cause window leak.

Change-Id: I914897bf657933efea72eeea66076dc288098420
parent 05c2b96f
Loading
Loading
Loading
Loading
+52 −19
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.settings;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Intent;
@@ -51,6 +52,7 @@ public class ApnEditor extends PreferenceActivity
    private static final int MENU_DELETE = Menu.FIRST;
    private static final int MENU_SAVE = Menu.FIRST + 1;
    private static final int MENU_CANCEL = Menu.FIRST + 2;
    private static final int ERROR_DIALOG_ID = 0;

    private static String sNotSet;
    private EditTextPreference mName;
@@ -347,19 +349,8 @@ public class ApnEditor extends PreferenceActivity
        String mcc = checkNotSet(mMcc.getText());
        String mnc = checkNotSet(mMnc.getText());

        String errorMsg = null;
        if (name.length() < 1) {
            errorMsg = mRes.getString(R.string.error_name_empty);
        } else if (apn.length() < 1) {
            errorMsg = mRes.getString(R.string.error_apn_empty);
        } else if (mcc.length() != 3) {
            errorMsg = mRes.getString(R.string.error_mcc_not3);
        } else if ((mnc.length() & 0xFFFE) != 2) {
            errorMsg = mRes.getString(R.string.error_mnc_not23);
        }

        if (errorMsg != null && !force) {
            showErrorMessage(errorMsg);
        if (getErrorMsg() != null && !force) {
            showDialog(ERROR_DIALOG_ID);
            return false;
        }

@@ -414,12 +405,54 @@ public class ApnEditor extends PreferenceActivity
        return true;
    }

    private void showErrorMessage(String message) {
        new AlertDialog.Builder(this)
    private String getErrorMsg() {
        String errorMsg = null;

        String name = checkNotSet(mName.getText());
        String apn = checkNotSet(mApn.getText());
        String mcc = checkNotSet(mMcc.getText());
        String mnc = checkNotSet(mMnc.getText());

        if (name.length() < 1) {
            errorMsg = mRes.getString(R.string.error_name_empty);
        } else if (apn.length() < 1) {
            errorMsg = mRes.getString(R.string.error_apn_empty);
        } else if (mcc.length() != 3) {
            errorMsg = mRes.getString(R.string.error_mcc_not3);
        } else if ((mnc.length() & 0xFFFE) != 2) {
            errorMsg = mRes.getString(R.string.error_mnc_not23);
        }

        return errorMsg;
    }

    @Override
    protected Dialog onCreateDialog(int id) {

        if (id == ERROR_DIALOG_ID) {
            String msg = getErrorMsg();

            return new AlertDialog.Builder(this)
                    .setTitle(R.string.error_title)
            .setMessage(message)
                    .setPositiveButton(android.R.string.ok, null)
            .show();
                    .setMessage(msg)
                    .create();
        }

        return super.onCreateDialog(id);
    }

    @Override
    protected void onPrepareDialog(int id, Dialog dialog) {
        super.onPrepareDialog(id, dialog);

        if (id == ERROR_DIALOG_ID) {
            String msg = getErrorMsg();

            if (msg != null) {
                ((AlertDialog)dialog).setMessage(msg);
            }
        }
    }

    private void deleteApn() {
+40 −23
Original line number Diff line number Diff line
@@ -56,6 +56,8 @@ public class LanguageSettings extends PreferenceActivity {
    private String mLastInputMethodId;
    private String mLastTickedInputMethodId;

    private AlertDialog mDialog = null;
    
    static public String getInputMethodIdFromKey(String key) {
        return key;
    }
@@ -255,12 +257,10 @@ public class LanguageSettings extends PreferenceActivity {
                if (selImi == null) {
                    return super.onPreferenceTreeClick(preferenceScreen, preference);
                }
                AlertDialog d = (new AlertDialog.Builder(this))
                if (mDialog == null) {
                    mDialog = (new AlertDialog.Builder(this))
                            .setTitle(android.R.string.dialog_alert_title)
                            .setIcon(android.R.drawable.ic_dialog_alert)
                        .setMessage(getString(R.string.ime_security_warning,
                                selImi.getServiceInfo().applicationInfo.loadLabel(
                                        getPackageManager())))
                            .setCancelable(true)
                            .setPositiveButton(android.R.string.ok,
                                    new DialogInterface.OnClickListener() {
@@ -277,7 +277,15 @@ public class LanguageSettings extends PreferenceActivity {

                            })
                            .create();
                d.show();
                } else {
                    if (mDialog.isShowing()) {
                        mDialog.dismiss();
                    }
                }
                mDialog.setMessage(getString(R.string.ime_security_warning,
                        selImi.getServiceInfo().applicationInfo.loadLabel(
                                getPackageManager())));
                mDialog.show();
            } else if (id.equals(mLastTickedInputMethodId)) {
                mLastTickedInputMethodId = null;
            }
@@ -302,4 +310,13 @@ public class LanguageSettings extends PreferenceActivity {
        return super.onPreferenceTreeClick(preferenceScreen, preference);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mDialog != null) {
            mDialog.dismiss();
            mDialog = null;
        }
    }

}
+28 −7
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.settings;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.ContentResolver;
import android.content.Intent;
import android.net.Proxy;
@@ -73,6 +74,7 @@ public class ProxySelector extends Activity
        HOSTNAME_PATTERN = Pattern.compile(HOSTNAME_REGEXP);
    }

    private static final int ERROR_DIALOG_ID = 0;

    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
@@ -84,13 +86,32 @@ public class ProxySelector extends Activity
        populateFields(false);
    }

    protected void showError(int error) {
    @Override
    protected Dialog onCreateDialog(int id) {
        if (id == ERROR_DIALOG_ID) {
            String hostname = mHostnameField.getText().toString().trim();
            String portStr = mPortField.getText().toString().trim();
            String msg = getString(validate(hostname, portStr));

        new AlertDialog.Builder(this)
            return new AlertDialog.Builder(this)
                    .setTitle(R.string.proxy_error)
                .setMessage(error)
                    .setPositiveButton(R.string.proxy_error_dismiss, null)
                .show();
                    .setMessage(msg)
                    .create();
        }
        return super.onCreateDialog(id);
    }

    @Override
    protected void onPrepareDialog(int id, Dialog dialog) {
        super.onPrepareDialog(id, dialog);

        if (id == ERROR_DIALOG_ID) {
            String hostname = mHostnameField.getText().toString().trim();
            String portStr = mPortField.getText().toString().trim();
            String msg = getString(validate(hostname, portStr));
            ((AlertDialog)dialog).setMessage(msg);
        }
    }

    void initView() {
@@ -188,7 +209,7 @@ public class ProxySelector extends Activity

        int result = validate(hostname, portStr);
        if (result > 0) {
            showError(result);
            showDialog(ERROR_DIALOG_ID);
            return false;
        }

+27 −8
Original line number Diff line number Diff line
@@ -40,6 +40,8 @@ public class SettingsSafetyLegalActivity extends AlertActivity

    private WebView mWebView;

    private AlertDialog mErrorDialog = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
@@ -85,14 +87,31 @@ public class SettingsSafetyLegalActivity extends AlertActivity
    }

    private void showErrorAndFinish(String url) {
        new AlertDialog.Builder(this)
                .setMessage(getResources()
                        .getString(R.string.settings_safetylegal_activity_unreachable, 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)
                .show();
                    .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
+25 −6
Original line number Diff line number Diff line
@@ -71,6 +71,8 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>

    private final LocalBluetoothManager mLocalManager;

    private AlertDialog mDialog = null;

    private List<Callback> mCallbacks = new ArrayList<Callback>();

    /**
@@ -375,12 +377,29 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
            }
        };

        new AlertDialog.Builder(context)
                .setTitle(getName())
                .setMessage(message)
        if (mDialog == null) {
            mDialog = new AlertDialog.Builder(context)
                    .setPositiveButton(android.R.string.ok, disconnectListener)
                    .setNegativeButton(android.R.string.cancel, null)
                .show();
                    .create();
        } else {
            if (mDialog.isShowing()) {
                mDialog.dismiss();
            }
        }
        mDialog.setTitle(getName());
        mDialog.setMessage(message);
        mDialog.show();
    }

    @Override
    protected void finalize() throws Throwable {
        if (mDialog != null) {
            mDialog.dismiss();
            mDialog = null;
        }

        super.finalize();
    }

    public void connect() {
Loading