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