1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17
18package com.android.email.view;
19
20import android.content.Context;
21import android.content.res.Resources;
22import android.os.Parcel;
23import android.os.Parcelable;
24import android.security.KeyChain;
25import android.util.AttributeSet;
26import android.view.View;
27import android.view.View.OnClickListener;
28import android.widget.Button;
29import android.widget.RelativeLayout;
30import android.widget.TextView;
31
32import com.android.email.R;
33import com.android.email.activity.UiUtilities;
34
35/**
36 * A simple view that can be used to select a certificate from the system {@link KeyChain}.
37 *
38 * Host activities must register themselves view {@link #setHostActivity} for this selector to work.
39 */
40public class CertificateSelector extends RelativeLayout implements OnClickListener {
41
42    /** Button to select or remove the certificate. */
43    private Button mSelectButton;
44    private TextView mAliasText;
45
46    /** The value of the cert selected, if any. Null, otherwise. */
47    private String mValue;
48
49    /** The host activity. */
50    private HostCallback mHost;
51
52    public interface HostCallback {
53        void onCertificateRequested();
54    }
55
56    public CertificateSelector(Context context) {
57        super(context);
58    }
59    public CertificateSelector(Context context, AttributeSet attrs) {
60        super(context, attrs);
61    }
62    public CertificateSelector(Context context, AttributeSet attrs, int defStyle) {
63        super(context, attrs, defStyle);
64    }
65
66    public void setHostActivity(HostCallback host) {
67        mHost = host;
68    }
69
70    public void setDelegate(String uri) {
71    }
72
73    @Override
74    protected void onFinishInflate() {
75        super.onFinishInflate();
76
77        mAliasText = UiUtilities.getView(this, R.id.certificate_alias);
78        mSelectButton = UiUtilities.getView(this, R.id.select_button);
79        mSelectButton.setOnClickListener(this);
80        setCertificate(null);
81    }
82
83    public void setCertificate(String alias) {
84        Resources res = getResources();
85        mValue = alias;
86        mAliasText.setText(
87                (alias == null)
88                ? res.getString(R.string.account_setup_exchange_no_certificate)
89                : alias);
90        mSelectButton.setText(res.getString(
91                (alias == null)
92                ? R.string.account_setup_exchange_select_certificate
93                : R.string.account_setup_exchange_remove_certificate));
94    }
95
96    public boolean hasCertificate() {
97        return mValue != null;
98    }
99
100    /**
101     * Gets the alias for the currently selected certificate, or null if one is not selected.
102     */
103    public String getCertificate() {
104        return mValue;
105    }
106
107
108    @Override
109    public void onClick(View target) {
110        if (target == mSelectButton && mHost != null) {
111            if (hasCertificate()) {
112                // Handle the click on the button when it says "Remove"
113                setCertificate(null);
114            } else {
115                mHost.onCertificateRequested();
116            }
117        }
118    }
119
120    @Override
121    protected void onRestoreInstanceState(Parcelable parcel) {
122        SavedState savedState = (SavedState) parcel;
123        super.onRestoreInstanceState(savedState.getSuperState());
124        setCertificate(savedState.mValue);
125    }
126
127    @Override
128    protected Parcelable onSaveInstanceState() {
129        return new SavedState(super.onSaveInstanceState(), getCertificate());
130    }
131
132    public static class SavedState extends BaseSavedState {
133        final String mValue;
134
135        SavedState(Parcelable superState, String value) {
136            super(superState);
137            mValue = value;
138        }
139
140        @Override
141        public void writeToParcel(Parcel out, int flags) {
142            super.writeToParcel(out, flags);
143            out.writeString(mValue);
144        }
145
146        @SuppressWarnings("hiding")
147        public static final Parcelable.Creator<SavedState> CREATOR
148                = new Parcelable.Creator<SavedState>() {
149            public SavedState createFromParcel(Parcel in) {
150                return new SavedState(in);
151            }
152
153            public SavedState[] newArray(int size) {
154                return new SavedState[size];
155            }
156        };
157
158        private SavedState(Parcel in) {
159            super(in);
160            mValue = in.readString();
161        }
162    }
163}
164