From 89e784b2673351e0d0a818124d02bcd5f81a14c0 Mon Sep 17 00:00:00 2001 From: Yorke Lee Date: Wed, 10 Jun 2015 13:36:15 -0700 Subject: Fix crash after rotation in SelectAccountDialogFragment * Refactor code so that the callback can be parcelled and persisted in the fragment after rotation. * Make callbacks inner static classes to avoid potential leaks Bug: 21650435 Change-Id: Ie7c640f580233256c99d0e9e1643153d4c599d20 --- src/com/android/dialer/SpecialCharSequenceMgr.java | 77 +++++++++++++--------- 1 file changed, 45 insertions(+), 32 deletions(-) (limited to 'src') diff --git a/src/com/android/dialer/SpecialCharSequenceMgr.java b/src/com/android/dialer/SpecialCharSequenceMgr.java index a57e2ee57..31aa5c3c7 100644 --- a/src/com/android/dialer/SpecialCharSequenceMgr.java +++ b/src/com/android/dialer/SpecialCharSequenceMgr.java @@ -90,6 +90,43 @@ public class SpecialCharSequenceMgr { */ private static QueryHandler sPreviousAdnQueryHandler; + public static class HandleAdnEntryAccountSelectedCallback extends SelectPhoneAccountListener{ + final private TelecomManager mTelecomManager; + final private QueryHandler mQueryHandler; + final private SimContactQueryCookie mCookie; + + public HandleAdnEntryAccountSelectedCallback(TelecomManager telecomManager, + QueryHandler queryHandler, SimContactQueryCookie cookie) { + mTelecomManager = telecomManager; + mQueryHandler = queryHandler; + mCookie = cookie; + } + + @Override + public void onPhoneAccountSelected(PhoneAccountHandle selectedAccountHandle, + boolean setDefault) { + Uri uri = mTelecomManager.getAdnUriForPhoneAccount(selectedAccountHandle); + handleAdnQuery(mQueryHandler, mCookie, uri); + // TODO: Show error dialog if result isn't valid. + } + + } + + public static class HandleMmiAccountSelectedCallback extends SelectPhoneAccountListener{ + final private Context mContext; + final private String mInput; + public HandleMmiAccountSelectedCallback(Context context, String input) { + mContext = context.getApplicationContext(); + mInput = input; + } + + @Override + public void onPhoneAccountSelected(PhoneAccountHandle selectedAccountHandle, + boolean setDefault) { + TelecomUtil.handleMmi(mContext, mInput, selectedAccountHandle); + } + } + /** This class is never instantiated. */ private SpecialCharSequenceMgr() { } @@ -155,9 +192,8 @@ public class SpecialCharSequenceMgr { * This code works alongside the Asynchronous query handler {@link QueryHandler} * and query cancel handler implemented in {@link SimContactQueryCookie}. */ - static boolean handleAdnEntry(final Context context, String input, EditText textField) { + static boolean handleAdnEntry(Context context, String input, EditText textField) { /* ADN entries are of the form "N(N)(N)#" */ - TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (telephonyManager == null @@ -221,23 +257,11 @@ public class SpecialCharSequenceMgr { Uri uri = telecomManager.getAdnUriForPhoneAccount(null); handleAdnQuery(handler, sc, uri); } else if (subscriptionAccountHandles.size() > 1){ - SelectPhoneAccountListener listener = new SelectPhoneAccountListener() { - @Override - public void onPhoneAccountSelected(PhoneAccountHandle selectedAccountHandle, - boolean setDefault) { - Uri uri = - telecomManager.getAdnUriForPhoneAccount(selectedAccountHandle); - handleAdnQuery(handler, sc, uri); - //TODO: show error dialog if result isn't valid - } - @Override - public void onDialogDismissed() {} - }; - - // NOTE: If you want to support rotation of this dialog need - // to refactor the listener and set it in DialpadFragment.onCreate() + SelectPhoneAccountListener callback = + new HandleAdnEntryAccountSelectedCallback(telecomManager, handler, sc); + DialogFragment dialogFragment = SelectPhoneAccountDialogFragment.newInstance( - subscriptionAccountHandles, listener); + subscriptionAccountHandles, callback); dialogFragment.show(((Activity) context).getFragmentManager(), TAG_SELECT_ACCT_FRAGMENT); } else { @@ -287,20 +311,9 @@ public class SpecialCharSequenceMgr { // a subscription account. return TelecomUtil.handleMmi(context, input, null); } else if (subscriptionAccountHandles.size() > 1){ - SelectPhoneAccountListener listener = new SelectPhoneAccountListener() { - @Override - public void onPhoneAccountSelected(PhoneAccountHandle selectedAccountHandle, - boolean setDefault) { - TelecomUtil.handleMmi(context.getApplicationContext(), - input, selectedAccountHandle); - //TODO: show error dialog if result isn't valid - } - @Override - public void onDialogDismissed() {} - }; - - // NOTE: If you want to support rotation of this dialog need - // to refactor the listener and set it in DialpadFragment.onCreate() + SelectPhoneAccountListener listener = + new HandleMmiAccountSelectedCallback(context, input); + DialogFragment dialogFragment = SelectPhoneAccountDialogFragment.newInstance( subscriptionAccountHandles, listener); dialogFragment.show(((Activity) context).getFragmentManager(), -- cgit v1.2.3