diff options
author | Zoltan Szatmary-Ban <szatmz@google.com> | 2014-10-15 13:01:05 +0100 |
---|---|---|
committer | Zoltan Szatmary-Ban <szatmz@google.com> | 2014-11-18 18:02:48 +0000 |
commit | cfe521e6e3e989dc861453c733b220dcdf2357fc (patch) | |
tree | 5ebe5303c7a704e3456b454a4bcc536903ddec7b /src/com/android/settings/TrustedCredentialsSettings.java | |
parent | 3a84d40133e7a4f74fd1df091ba43fb85859b169 (diff) | |
download | packages_apps_Settings-cfe521e6e3e989dc861453c733b220dcdf2357fc.zip packages_apps_Settings-cfe521e6e3e989dc861453c733b220dcdf2357fc.tar.gz packages_apps_Settings-cfe521e6e3e989dc861453c733b220dcdf2357fc.tar.bz2 |
Stop background processes if TrustedCredentialSettings fragment gets detached
Otherwise getActivity() returns null and other nasty null pointer dereferencings happen.
Bug: 17976307
Change-Id: If867785f991217267e0bf0ad3058a62177509852
Diffstat (limited to 'src/com/android/settings/TrustedCredentialsSettings.java')
-rw-r--r-- | src/com/android/settings/TrustedCredentialsSettings.java | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/com/android/settings/TrustedCredentialsSettings.java b/src/com/android/settings/TrustedCredentialsSettings.java index 427e9d3..31ce975 100644 --- a/src/com/android/settings/TrustedCredentialsSettings.java +++ b/src/com/android/settings/TrustedCredentialsSettings.java @@ -59,6 +59,7 @@ import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.HashMap; public class TrustedCredentialsSettings extends Fragment { @@ -162,6 +163,9 @@ public class TrustedCredentialsSettings extends Fragment { } private TabHost mTabHost; + private AliasOperation mAliasOperation; + private HashMap<Tab, AdapterData.AliasLoader> + mAliasLoaders = new HashMap<Tab, AdapterData.AliasLoader>(2); private final SparseArray<KeyChainConnection> mKeyChainConnectionByProfileId = new SparseArray<KeyChainConnection>(); @@ -187,6 +191,13 @@ public class TrustedCredentialsSettings extends Fragment { } @Override public void onDestroy() { + for (AdapterData.AliasLoader aliasLoader : mAliasLoaders.values()) { + aliasLoader.cancel(true); + } + if (mAliasOperation != null) { + mAliasOperation.cancel(true); + mAliasOperation = null; + } closeKeyChainConnections(); super.onDestroy(); } @@ -405,6 +416,12 @@ public class TrustedCredentialsSettings extends Fragment { private class AliasLoader extends AsyncTask<Void, Integer, SparseArray<List<CertHolder>>> { private ProgressBar mProgressBar; private View mList; + private Context mContext; + + public AliasLoader() { + mContext = getActivity(); + mAliasLoaders.put(mTab, this); + } @Override protected void onPreExecute() { View content = mTabHost.getTabContentView(); @@ -428,12 +445,15 @@ public class TrustedCredentialsSettings extends Fragment { for (int i = 0; i < n; ++i) { UserHandle profile = profiles.get(i); int profileId = profile.getIdentifier(); - KeyChainConnection keyChainConnection = KeyChain.bindAsUser(getActivity(), + KeyChainConnection keyChainConnection = KeyChain.bindAsUser(mContext, profile); // Saving the connection for later use on the certificate dialog. mKeyChainConnectionByProfileId.put(profileId, keyChainConnection); IKeyChainService service = keyChainConnection.getService(); List<ParcelableString> aliases = mTab.getAliases(service); + if (isCancelled()) { + return new SparseArray<List<CertHolder>>(); + } max += aliases.size(); aliasesByProfileId.put(profileId, aliases); } @@ -441,6 +461,9 @@ public class TrustedCredentialsSettings extends Fragment { UserHandle profile = profiles.get(i); int profileId = profile.getIdentifier(); List<ParcelableString> aliases = aliasesByProfileId.get(profileId); + if (isCancelled()) { + return new SparseArray<List<CertHolder>>(); + } IKeyChainService service = mKeyChainConnectionByProfileId.get(profileId) .getService(); List<CertHolder> certHolders = new ArrayList<CertHolder>(max); @@ -484,6 +507,7 @@ public class TrustedCredentialsSettings extends Fragment { mProgressBar.setVisibility(View.GONE); mList.setVisibility(View.VISIBLE); mProgressBar.setProgress(0); + mAliasLoaders.remove(mTab); } } @@ -724,6 +748,7 @@ public class TrustedCredentialsSettings extends Fragment { private AliasOperation(CertHolder certHolder) { mCertHolder = certHolder; + mAliasOperation = this; } @Override @@ -756,6 +781,7 @@ public class TrustedCredentialsSettings extends Fragment { @Override protected void onPostExecute(Boolean ok) { mCertHolder.mTab.postOperationUpdate(ok, mCertHolder); + mAliasOperation = null; } } } |