summaryrefslogtreecommitdiffstats
path: root/src/com/android/settings/TrustedCredentialsSettings.java
diff options
context:
space:
mode:
authorZoltan Szatmary-Ban <szatmz@google.com>2014-10-15 13:01:05 +0100
committerZoltan Szatmary-Ban <szatmz@google.com>2014-11-18 18:02:48 +0000
commitcfe521e6e3e989dc861453c733b220dcdf2357fc (patch)
tree5ebe5303c7a704e3456b454a4bcc536903ddec7b /src/com/android/settings/TrustedCredentialsSettings.java
parent3a84d40133e7a4f74fd1df091ba43fb85859b169 (diff)
downloadpackages_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.java28
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;
}
}
}