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:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user