Stop background processes if TrustedCredentialSettings fragment gets detached

Otherwise getActivity() returns null and other nasty null pointer dereferencings happen.

Bug: 17976307
Change-Id: If867785f991217267e0bf0ad3058a62177509852
This commit is contained in:
Zoltan Szatmary-Ban
2014-10-15 13:01:05 +01:00
parent 3a84d40133
commit cfe521e6e3

View File

@@ -59,6 +59,7 @@ import java.security.cert.X509Certificate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.HashMap;
public class TrustedCredentialsSettings extends Fragment { public class TrustedCredentialsSettings extends Fragment {
@@ -162,6 +163,9 @@ public class TrustedCredentialsSettings extends Fragment {
} }
private TabHost mTabHost; private TabHost mTabHost;
private AliasOperation mAliasOperation;
private HashMap<Tab, AdapterData.AliasLoader>
mAliasLoaders = new HashMap<Tab, AdapterData.AliasLoader>(2);
private final SparseArray<KeyChainConnection> private final SparseArray<KeyChainConnection>
mKeyChainConnectionByProfileId = new SparseArray<KeyChainConnection>(); mKeyChainConnectionByProfileId = new SparseArray<KeyChainConnection>();
@@ -187,6 +191,13 @@ public class TrustedCredentialsSettings extends Fragment {
} }
@Override @Override
public void onDestroy() { public void onDestroy() {
for (AdapterData.AliasLoader aliasLoader : mAliasLoaders.values()) {
aliasLoader.cancel(true);
}
if (mAliasOperation != null) {
mAliasOperation.cancel(true);
mAliasOperation = null;
}
closeKeyChainConnections(); closeKeyChainConnections();
super.onDestroy(); super.onDestroy();
} }
@@ -405,6 +416,12 @@ public class TrustedCredentialsSettings extends Fragment {
private class AliasLoader extends AsyncTask<Void, Integer, SparseArray<List<CertHolder>>> { private class AliasLoader extends AsyncTask<Void, Integer, SparseArray<List<CertHolder>>> {
private ProgressBar mProgressBar; private ProgressBar mProgressBar;
private View mList; private View mList;
private Context mContext;
public AliasLoader() {
mContext = getActivity();
mAliasLoaders.put(mTab, this);
}
@Override protected void onPreExecute() { @Override protected void onPreExecute() {
View content = mTabHost.getTabContentView(); View content = mTabHost.getTabContentView();
@@ -428,12 +445,15 @@ public class TrustedCredentialsSettings extends Fragment {
for (int i = 0; i < n; ++i) { for (int i = 0; i < n; ++i) {
UserHandle profile = profiles.get(i); UserHandle profile = profiles.get(i);
int profileId = profile.getIdentifier(); int profileId = profile.getIdentifier();
KeyChainConnection keyChainConnection = KeyChain.bindAsUser(getActivity(), KeyChainConnection keyChainConnection = KeyChain.bindAsUser(mContext,
profile); profile);
// Saving the connection for later use on the certificate dialog. // Saving the connection for later use on the certificate dialog.
mKeyChainConnectionByProfileId.put(profileId, keyChainConnection); mKeyChainConnectionByProfileId.put(profileId, keyChainConnection);
IKeyChainService service = keyChainConnection.getService(); IKeyChainService service = keyChainConnection.getService();
List<ParcelableString> aliases = mTab.getAliases(service); List<ParcelableString> aliases = mTab.getAliases(service);
if (isCancelled()) {
return new SparseArray<List<CertHolder>>();
}
max += aliases.size(); max += aliases.size();
aliasesByProfileId.put(profileId, aliases); aliasesByProfileId.put(profileId, aliases);
} }
@@ -441,6 +461,9 @@ public class TrustedCredentialsSettings extends Fragment {
UserHandle profile = profiles.get(i); UserHandle profile = profiles.get(i);
int profileId = profile.getIdentifier(); int profileId = profile.getIdentifier();
List<ParcelableString> aliases = aliasesByProfileId.get(profileId); List<ParcelableString> aliases = aliasesByProfileId.get(profileId);
if (isCancelled()) {
return new SparseArray<List<CertHolder>>();
}
IKeyChainService service = mKeyChainConnectionByProfileId.get(profileId) IKeyChainService service = mKeyChainConnectionByProfileId.get(profileId)
.getService(); .getService();
List<CertHolder> certHolders = new ArrayList<CertHolder>(max); List<CertHolder> certHolders = new ArrayList<CertHolder>(max);
@@ -484,6 +507,7 @@ public class TrustedCredentialsSettings extends Fragment {
mProgressBar.setVisibility(View.GONE); mProgressBar.setVisibility(View.GONE);
mList.setVisibility(View.VISIBLE); mList.setVisibility(View.VISIBLE);
mProgressBar.setProgress(0); mProgressBar.setProgress(0);
mAliasLoaders.remove(mTab);
} }
} }
@@ -724,6 +748,7 @@ public class TrustedCredentialsSettings extends Fragment {
private AliasOperation(CertHolder certHolder) { private AliasOperation(CertHolder certHolder) {
mCertHolder = certHolder; mCertHolder = certHolder;
mAliasOperation = this;
} }
@Override @Override
@@ -756,6 +781,7 @@ public class TrustedCredentialsSettings extends Fragment {
@Override @Override
protected void onPostExecute(Boolean ok) { protected void onPostExecute(Boolean ok) {
mCertHolder.mTab.postOperationUpdate(ok, mCertHolder); mCertHolder.mTab.postOperationUpdate(ok, mCertHolder);
mAliasOperation = null;
} }
} }
} }