1f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom/* 2f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom * Copyright (C) 2011 The Android Open Source Project 3f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom * 4f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom * Licensed under the Apache License, Version 2.0 (the "License"); 5f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom * you may not use this file except in compliance with the License. 6f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom * You may obtain a copy of the License at 7f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom * 8f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom * http://www.apache.org/licenses/LICENSE-2.0 9f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom * 10f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom * Unless required by applicable law or agreed to in writing, software 11f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom * distributed under the License is distributed on an "AS IS" BASIS, 12f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom * See the License for the specific language governing permissions and 14f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom * limitations under the License. 15f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom */ 16f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 17f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrompackage com.android.settings; 18f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 196e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaardimport android.app.Activity; 20f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.app.AlertDialog; 21f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.app.Dialog; 22f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.app.Fragment; 236e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaardimport android.content.Context; 24f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.content.DialogInterface; 256e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaardimport android.content.Intent; 26f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.net.http.SslCertificate; 27f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.os.AsyncTask; 28f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.os.Bundle; 29f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.os.RemoteException; 306e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaardimport android.os.UserManager; 31f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.security.IKeyChainService; 32f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.security.KeyChain; 33f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.security.KeyChain.KeyChainConnection; 34f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.view.LayoutInflater; 35f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.view.View; 36f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.view.ViewGroup; 37f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.widget.AdapterView; 38f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.widget.BaseAdapter; 39f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.widget.Button; 40f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.widget.CheckBox; 41f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.widget.FrameLayout; 42f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.widget.ListView; 43729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstromimport android.widget.ProgressBar; 44f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.widget.TabHost; 45f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport android.widget.TextView; 46f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport java.security.cert.CertificateEncodingException; 47f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport java.security.cert.X509Certificate; 48f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport java.util.ArrayList; 49f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport java.util.Collections; 50f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport java.util.List; 51f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstromimport java.util.Set; 52d76bc2248e1c9db2496aac51cb48de9ed8af8a80Kenny Root 53d76bc2248e1c9db2496aac51cb48de9ed8af8a80Kenny Rootimport com.android.org.conscrypt.TrustedCertificateStore; 54f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 55ac45fb42b00f377e58f8dfd59e4807a3147cfb57Brian Carlstrompublic class TrustedCredentialsSettings extends Fragment { 56f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 57ac45fb42b00f377e58f8dfd59e4807a3147cfb57Brian Carlstrom private static final String TAG = "TrustedCredentialsSettings"; 58f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 596e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard private UserManager mUserManager; 606e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard 61fc6bc20161edea9e93a7abcd82af5c26870c58bbGeoffrey Borggaard private static final String USER_ACTION = "com.android.settings.TRUSTED_CREDENTIALS_USER"; 62fc6bc20161edea9e93a7abcd82af5c26870c58bbGeoffrey Borggaard 636e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard private static final int REQUEST_PIN_CHALLENGE = 12309; 646e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard // If the restriction PIN is entered correctly. 656e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard private boolean mChallengeSucceeded; 666e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard private boolean mChallengeRequested; 676e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard 686e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard 69f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private enum Tab { 70f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom SYSTEM("system", 71f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom R.string.trusted_credentials_system_tab, 72f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom R.id.system_tab, 73f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom R.id.system_progress, 74f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom R.id.system_list, 75f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom true), 76f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom USER("user", 77f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom R.string.trusted_credentials_user_tab, 78f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom R.id.user_tab, 79f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom R.id.user_progress, 80f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom R.id.user_list, 81f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom false); 82f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 83f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private final String mTag; 84f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private final int mLabel; 85f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private final int mView; 86f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private final int mProgress; 87f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private final int mList; 88f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private final boolean mCheckbox; 89f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private Tab(String tag, int label, int view, int progress, int list, boolean checkbox) { 90f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mTag = tag; 91f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mLabel = label; 92f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mView = view; 93f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mProgress = progress; 94f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mList = list; 95f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mCheckbox = checkbox; 96f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 97f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private Set<String> getAliases(TrustedCertificateStore store) { 98f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom switch (this) { 99f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom case SYSTEM: 100f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return store.allSystemAliases(); 101f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom case USER: 102f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return store.userAliases(); 103f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 104f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom throw new AssertionError(); 105f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 106f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private boolean deleted(TrustedCertificateStore store, String alias) { 107f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom switch (this) { 108f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom case SYSTEM: 109f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return !store.containsAlias(alias); 110f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom case USER: 111f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return false; 112f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 113f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom throw new AssertionError(); 114f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 115f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private int getButtonLabel(CertHolder certHolder) { 116f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom switch (this) { 117f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom case SYSTEM: 118f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom if (certHolder.mDeleted) { 119f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return R.string.trusted_credentials_enable_label; 120f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 121f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return R.string.trusted_credentials_disable_label; 122f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom case USER: 123f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return R.string.trusted_credentials_remove_label; 124f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 125f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom throw new AssertionError(); 126f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 127f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private int getButtonConfirmation(CertHolder certHolder) { 128f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom switch (this) { 129f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom case SYSTEM: 130f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom if (certHolder.mDeleted) { 131f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return R.string.trusted_credentials_enable_confirmation; 132f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 133f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return R.string.trusted_credentials_disable_confirmation; 134f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom case USER: 135f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return R.string.trusted_credentials_remove_confirmation; 136f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 137f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom throw new AssertionError(); 138f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 139f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private void postOperationUpdate(boolean ok, CertHolder certHolder) { 140f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom if (ok) { 141f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom if (certHolder.mTab.mCheckbox) { 142f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom certHolder.mDeleted = !certHolder.mDeleted; 143f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } else { 144f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom certHolder.mAdapter.mCertHolders.remove(certHolder); 145f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 146f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom certHolder.mAdapter.notifyDataSetChanged(); 147f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } else { 148f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom // bail, reload to reset to known state 149f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom certHolder.mAdapter.load(); 150f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 151f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 152f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 153f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 154f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom // be careful not to use this on the UI thread since it is does file operations 155f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private final TrustedCertificateStore mStore = new TrustedCertificateStore(); 156f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 157f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private TabHost mTabHost; 158f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 1596e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard @Override 1606e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard public void onCreate(Bundle savedInstanceState) { 1616e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard super.onCreate(savedInstanceState); 1626e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard mUserManager = (UserManager) getActivity().getSystemService(Context.USER_SERVICE); 1636e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard } 1646e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard 1656e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard 166f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override public View onCreateView( 167f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) { 168f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mTabHost = (TabHost) inflater.inflate(R.layout.trusted_credentials, parent, false); 169f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mTabHost.setup(); 170f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom addTab(Tab.SYSTEM); 171f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom // TODO add Install button on Tab.USER to go to CertInstaller like KeyChainActivity 172f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom addTab(Tab.USER); 173fc6bc20161edea9e93a7abcd82af5c26870c58bbGeoffrey Borggaard if (getActivity().getIntent() != null && 174fc6bc20161edea9e93a7abcd82af5c26870c58bbGeoffrey Borggaard USER_ACTION.equals(getActivity().getIntent().getAction())) { 175fc6bc20161edea9e93a7abcd82af5c26870c58bbGeoffrey Borggaard mTabHost.setCurrentTabByTag(Tab.USER.mTag); 176fc6bc20161edea9e93a7abcd82af5c26870c58bbGeoffrey Borggaard } 177f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return mTabHost; 178f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 179f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 180f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private void addTab(Tab tab) { 181f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom TabHost.TabSpec systemSpec = mTabHost.newTabSpec(tab.mTag) 182f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom .setIndicator(getActivity().getString(tab.mLabel)) 183f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom .setContent(tab.mView); 184f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mTabHost.addTab(systemSpec); 185f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 186f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom ListView lv = (ListView) mTabHost.findViewById(tab.mList); 187f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom final TrustedCertificateAdapter adapter = new TrustedCertificateAdapter(tab); 188f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom lv.setAdapter(adapter); 189f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 190f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override public void onItemClick(AdapterView<?> parent, View view, int pos, long id) { 191f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom showCertDialog(adapter.getItem(pos)); 192f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 193f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom }); 194f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 195f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 196f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private class TrustedCertificateAdapter extends BaseAdapter { 197f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private final List<CertHolder> mCertHolders = new ArrayList<CertHolder>(); 198f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private final Tab mTab; 199f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private TrustedCertificateAdapter(Tab tab) { 200f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mTab = tab; 201f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom load(); 202f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 203f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private void load() { 204f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom new AliasLoader().execute(); 205f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 206f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override public int getCount() { 207f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return mCertHolders.size(); 208f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 209f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override public CertHolder getItem(int position) { 210f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return mCertHolders.get(position); 211f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 212f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override public long getItemId(int position) { 213f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return position; 214f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 215f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override public View getView(int position, View view, ViewGroup parent) { 216f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom ViewHolder holder; 217f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom if (view == null) { 218f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom LayoutInflater inflater = LayoutInflater.from(getActivity()); 219f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom view = inflater.inflate(R.layout.trusted_credential, parent, false); 220f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom holder = new ViewHolder(); 22110cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom holder.mSubjectPrimaryView = (TextView) 22210cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom view.findViewById(R.id.trusted_credential_subject_primary); 22310cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom holder.mSubjectSecondaryView = (TextView) 22410cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom view.findViewById(R.id.trusted_credential_subject_secondary); 225f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom holder.mCheckBox = (CheckBox) view.findViewById(R.id.trusted_credential_status); 226f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom view.setTag(holder); 227f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } else { 228f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom holder = (ViewHolder) view.getTag(); 229f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 230f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom CertHolder certHolder = mCertHolders.get(position); 23110cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom holder.mSubjectPrimaryView.setText(certHolder.mSubjectPrimary); 23210cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom holder.mSubjectSecondaryView.setText(certHolder.mSubjectSecondary); 233f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom if (mTab.mCheckbox) { 234f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom holder.mCheckBox.setChecked(!certHolder.mDeleted); 235f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom holder.mCheckBox.setVisibility(View.VISIBLE); 236f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 237f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return view; 238f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom }; 239f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 240729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom private class AliasLoader extends AsyncTask<Void, Integer, List<CertHolder>> { 241729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom ProgressBar mProgressBar; 242729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom View mList; 243f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override protected void onPreExecute() { 244f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom View content = mTabHost.getTabContentView(); 245729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom mProgressBar = (ProgressBar) content.findViewById(mTab.mProgress); 246729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom mList = content.findViewById(mTab.mList); 247729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom mProgressBar.setVisibility(View.VISIBLE); 248729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom mList.setVisibility(View.GONE); 249f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 250f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override protected List<CertHolder> doInBackground(Void... params) { 251f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom Set<String> aliases = mTab.getAliases(mStore); 252729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom int max = aliases.size(); 253729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom int progress = 0; 254729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom List<CertHolder> certHolders = new ArrayList<CertHolder>(max); 255f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom for (String alias : aliases) { 256f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom X509Certificate cert = (X509Certificate) mStore.getCertificate(alias, true); 257f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom certHolders.add(new CertHolder(mStore, 258f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom TrustedCertificateAdapter.this, 259f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mTab, 260f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom alias, 261f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom cert)); 262729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom publishProgress(++progress, max); 263f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 264f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom Collections.sort(certHolders); 265f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return certHolders; 266f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 267729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom @Override protected void onProgressUpdate(Integer... progressAndMax) { 268729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom int progress = progressAndMax[0]; 269729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom int max = progressAndMax[1]; 270729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom if (max != mProgressBar.getMax()) { 271729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom mProgressBar.setMax(max); 272729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom } 273729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom mProgressBar.setProgress(progress); 274729c6d99e21856558f3631d31537b8dca6bb2314Brian Carlstrom } 275f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override protected void onPostExecute(List<CertHolder> certHolders) { 276f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mCertHolders.clear(); 277f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mCertHolders.addAll(certHolders); 278f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom notifyDataSetChanged(); 279f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom View content = mTabHost.getTabContentView(); 280945e383833c77101eb415b28bad4d1c6dfe85485Brian Carlstrom mProgressBar.setVisibility(View.GONE); 281945e383833c77101eb415b28bad4d1c6dfe85485Brian Carlstrom mList.setVisibility(View.VISIBLE); 282945e383833c77101eb415b28bad4d1c6dfe85485Brian Carlstrom mProgressBar.setProgress(0); 283f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 284f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 285f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 286f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 287f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private static class CertHolder implements Comparable<CertHolder> { 288f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private final TrustedCertificateStore mStore; 289f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private final TrustedCertificateAdapter mAdapter; 290f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private final Tab mTab; 291f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private final String mAlias; 292f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private final X509Certificate mX509Cert; 293f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 294f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private final SslCertificate mSslCert; 29510cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom private final String mSubjectPrimary; 29610cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom private final String mSubjectSecondary; 297f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private boolean mDeleted; 298f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 299f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private CertHolder(TrustedCertificateStore store, 300f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom TrustedCertificateAdapter adapter, 301f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom Tab tab, 302f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom String alias, 303f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom X509Certificate x509Cert) { 304f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mStore = store; 305f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mAdapter = adapter; 306f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mTab = tab; 307f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mAlias = alias; 308f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mX509Cert = x509Cert; 309f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 310f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mSslCert = new SslCertificate(x509Cert); 311f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 312f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom String cn = mSslCert.getIssuedTo().getCName(); 313f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom String o = mSslCert.getIssuedTo().getOName(); 314f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom String ou = mSslCert.getIssuedTo().getUName(); 31510cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom // if we have a O, use O as primary subject, secondary prefer CN over OU 31610cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom // if we don't have an O, use CN as primary, empty secondary 31710cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom // if we don't have O or CN, use DName as primary, empty secondary 318f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom if (!o.isEmpty()) { 31910cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom if (!cn.isEmpty()) { 32010cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom mSubjectPrimary = o; 32110cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom mSubjectSecondary = cn; 32210cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom } else { 32310cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom mSubjectPrimary = o; 32410cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom mSubjectSecondary = ou; 325f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 326f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } else { 32710cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom if (!cn.isEmpty()) { 32810cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom mSubjectPrimary = cn; 32910cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom mSubjectSecondary = ""; 33010cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom } else { 33110cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom mSubjectPrimary = mSslCert.getIssuedTo().getDName(); 33210cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom mSubjectSecondary = ""; 33310cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom } 334f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 335f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mDeleted = mTab.deleted(mStore, mAlias); 336f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 337f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override public int compareTo(CertHolder o) { 33810cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom int primary = this.mSubjectPrimary.compareToIgnoreCase(o.mSubjectPrimary); 33910cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom if (primary != 0) { 34010cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom return primary; 34110cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom } 34210cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom return this.mSubjectSecondary.compareToIgnoreCase(o.mSubjectSecondary); 343f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 344f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override public boolean equals(Object o) { 345f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom if (!(o instanceof CertHolder)) { 346f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return false; 347f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 348f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom CertHolder other = (CertHolder) o; 349f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return mAlias.equals(other.mAlias); 350f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 351f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override public int hashCode() { 352f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return mAlias.hashCode(); 353f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 354f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 355f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 356f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private static class ViewHolder { 35710cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom private TextView mSubjectPrimaryView; 35810cc989346e1beda02a0dc5e0ca257734bbd21fcBrian Carlstrom private TextView mSubjectSecondaryView; 359f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private CheckBox mCheckBox; 360f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 361f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 362f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private void showCertDialog(final CertHolder certHolder) { 36391615cfa9ead46769ad3adc624b3bacb4906e4b2Brian Carlstrom View view = certHolder.mSslCert.inflateCertificateView(getActivity()); 364f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 365f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom builder.setTitle(com.android.internal.R.string.ssl_certificate); 366f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom builder.setView(view); 367f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 368f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override public void onClick(DialogInterface dialog, int id) { 369f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom dialog.dismiss(); 370f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 371f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom }); 372f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom final Dialog certDialog = builder.create(); 373f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 37491615cfa9ead46769ad3adc624b3bacb4906e4b2Brian Carlstrom ViewGroup body = (ViewGroup) view.findViewById(com.android.internal.R.id.body); 37591615cfa9ead46769ad3adc624b3bacb4906e4b2Brian Carlstrom LayoutInflater inflater = LayoutInflater.from(getActivity()); 37691615cfa9ead46769ad3adc624b3bacb4906e4b2Brian Carlstrom Button removeButton = (Button) inflater.inflate(R.layout.trusted_credential_details, 37791615cfa9ead46769ad3adc624b3bacb4906e4b2Brian Carlstrom body, 37891615cfa9ead46769ad3adc624b3bacb4906e4b2Brian Carlstrom false); 37991615cfa9ead46769ad3adc624b3bacb4906e4b2Brian Carlstrom body.addView(removeButton); 380f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom removeButton.setText(certHolder.mTab.getButtonLabel(certHolder)); 381f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom removeButton.setOnClickListener(new View.OnClickListener() { 382f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override public void onClick(View v) { 38314912666d9bd56a4832234cf0866b76bb2cbf50cAmith Yamasani if (mUserManager.hasRestrictionsChallenge() && !mChallengeSucceeded) { 3846e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard ensurePin(); 3856e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard return; 3866e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard } 3876e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard 388f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 389f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom builder.setMessage(certHolder.mTab.getButtonConfirmation(certHolder)); 390f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom builder.setPositiveButton( 391f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom android.R.string.yes, new DialogInterface.OnClickListener() { 392f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override public void onClick(DialogInterface dialog, int id) { 393f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom new AliasOperation(certHolder).execute(); 394f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom dialog.dismiss(); 395f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom certDialog.dismiss(); 396f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 397f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom }); 398f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom builder.setNegativeButton( 399f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom android.R.string.no, new DialogInterface.OnClickListener() { 400f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override public void onClick(DialogInterface dialog, int id) { 401f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom dialog.cancel(); 402f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 403f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom }); 404f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom AlertDialog alert = builder.create(); 405f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom alert.show(); 406f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 407f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom }); 408f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 409f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom certDialog.show(); 410f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 411f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom 4126e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard @Override 4136e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard public void onActivityResult(int requestCode, int resultCode, Intent data) { 4146e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard if (requestCode == REQUEST_PIN_CHALLENGE) { 4156e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard mChallengeRequested = false; 4166e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard if (resultCode == Activity.RESULT_OK) { 4176e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard mChallengeSucceeded = true; 4186e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard } 4196e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard return; 4206e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard } 4216e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard 4226e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard super.onActivityResult(requestCode, resultCode, data); 4236e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard } 4246e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard 4256e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard private void ensurePin() { 4266e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard if (!mChallengeSucceeded) { 4276e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard final UserManager um = UserManager.get(getActivity()); 4286e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard if (!mChallengeRequested) { 42914912666d9bd56a4832234cf0866b76bb2cbf50cAmith Yamasani if (um.hasRestrictionsChallenge()) { 4306e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard Intent requestPin = 43114912666d9bd56a4832234cf0866b76bb2cbf50cAmith Yamasani new Intent(Intent.ACTION_RESTRICTIONS_CHALLENGE); 4326e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard startActivityForResult(requestPin, REQUEST_PIN_CHALLENGE); 4336e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard mChallengeRequested = true; 4346e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard } 4356e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard } 4366e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard } 4376e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard mChallengeSucceeded = false; 4386e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard } 4396e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard 4406e1102d9faf1b8f038857709412c291ef6140aa9Geoffrey Borggaard 441f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private class AliasOperation extends AsyncTask<Void, Void, Boolean> { 442f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private final CertHolder mCertHolder; 443f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom private AliasOperation(CertHolder certHolder) { 444f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mCertHolder = certHolder; 445f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 446f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override protected Boolean doInBackground(Void... params) { 447f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom try { 448f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom KeyChainConnection keyChainConnection = KeyChain.bind(getActivity()); 449f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom IKeyChainService service = keyChainConnection.getService(); 450f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom try { 451f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom if (mCertHolder.mDeleted) { 452f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom byte[] bytes = mCertHolder.mX509Cert.getEncoded(); 453f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom service.installCaCertificate(bytes); 454f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return true; 455f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } else { 456f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return service.deleteCaCertificate(mCertHolder.mAlias); 457f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 458f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } finally { 459f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom keyChainConnection.close(); 460f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 461f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } catch (CertificateEncodingException e) { 462f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return false; 463f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } catch (IllegalStateException e) { 464f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom // used by installCaCertificate to report errors 465f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return false; 466f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } catch (RemoteException e) { 467f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return false; 468f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } catch (InterruptedException e) { 469f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom Thread.currentThread().interrupt(); 470f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom return false; 471f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 472f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 473f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom @Override protected void onPostExecute(Boolean ok) { 474f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom mCertHolder.mTab.postOperationUpdate(ok, mCertHolder); 475f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 476f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom } 477f6f4e303abb8b7883713b0af8484c7767e6af84dBrian Carlstrom} 478