17014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo/*
27014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo * Copyright (C) 2011 The Android Open Source Project
37014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo *
47014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo * Licensed under the Apache License, Version 2.0 (the "License");
57014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo * you may not use this file except in compliance with the License.
67014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo * You may obtain a copy of the License at
77014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo *
87014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo *      http://www.apache.org/licenses/LICENSE-2.0
97014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo *
107014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo * Unless required by applicable law or agreed to in writing, software
117014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo * distributed under the License is distributed on an "AS IS" BASIS,
127014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo * See the License for the specific language governing permissions and
147014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo * limitations under the License.
157014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo */
167014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
177014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
187014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalopackage com.android.email.view;
197014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
207014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komaloimport android.content.Context;
2151dc9593bb8a708f269834b8a4be955aee06ac1eBen Komaloimport android.content.res.Resources;
227014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komaloimport android.os.Parcel;
237014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komaloimport android.os.Parcelable;
247014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komaloimport android.security.KeyChain;
25f1789afa535b113047ef20623d79fdfb257537aaTony Mantlerimport android.text.TextUtils;
267014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komaloimport android.util.AttributeSet;
277014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komaloimport android.view.View;
287014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komaloimport android.view.View.OnClickListener;
297014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komaloimport android.widget.Button;
3051dc9593bb8a708f269834b8a4be955aee06ac1eBen Komaloimport android.widget.RelativeLayout;
317014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komaloimport android.widget.TextView;
327014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
33994343b14bfba216969a9d9e86b53312686f7832Ben Komaloimport com.android.email.R;
34994343b14bfba216969a9d9e86b53312686f7832Ben Komaloimport com.android.email.activity.UiUtilities;
35994343b14bfba216969a9d9e86b53312686f7832Ben Komalo
367014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo/**
377014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo * A simple view that can be used to select a certificate from the system {@link KeyChain}.
387014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo *
39719097387788a32256cfcc3c0a96eff7f170078fMartin Hibdon * Host activities must register themselves view {@link #setHostCallback} for this selector to work.
407014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo */
4151dc9593bb8a708f269834b8a4be955aee06ac1eBen Komalopublic class CertificateSelector extends RelativeLayout implements OnClickListener {
427014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
437014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    /** Button to select or remove the certificate. */
447014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    private Button mSelectButton;
457014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    private TextView mAliasText;
467014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
4751dc9593bb8a708f269834b8a4be955aee06ac1eBen Komalo    /** The value of the cert selected, if any. Null, otherwise. */
4851dc9593bb8a708f269834b8a4be955aee06ac1eBen Komalo    private String mValue;
4951dc9593bb8a708f269834b8a4be955aee06ac1eBen Komalo
507014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    /** The host activity. */
51994343b14bfba216969a9d9e86b53312686f7832Ben Komalo    private HostCallback mHost;
527014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
53994343b14bfba216969a9d9e86b53312686f7832Ben Komalo    public interface HostCallback {
54994343b14bfba216969a9d9e86b53312686f7832Ben Komalo        void onCertificateRequested();
55994343b14bfba216969a9d9e86b53312686f7832Ben Komalo    }
567014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
577014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    public CertificateSelector(Context context) {
587014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        super(context);
597014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    }
607014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    public CertificateSelector(Context context, AttributeSet attrs) {
617014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        super(context, attrs);
627014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    }
637014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    public CertificateSelector(Context context, AttributeSet attrs, int defStyle) {
647014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        super(context, attrs, defStyle);
657014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    }
667014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
67d23fa61a014fc567592592eac629680764f042b5Martin Hibdon    public void setHostCallback(HostCallback host) {
68994343b14bfba216969a9d9e86b53312686f7832Ben Komalo        mHost = host;
69994343b14bfba216969a9d9e86b53312686f7832Ben Komalo    }
70994343b14bfba216969a9d9e86b53312686f7832Ben Komalo
71994343b14bfba216969a9d9e86b53312686f7832Ben Komalo    public void setDelegate(String uri) {
727014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    }
737014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
747014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    @Override
757014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    protected void onFinishInflate() {
767014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        super.onFinishInflate();
777014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
787014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        mAliasText = UiUtilities.getView(this, R.id.certificate_alias);
797014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        mSelectButton = UiUtilities.getView(this, R.id.select_button);
807014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        mSelectButton.setOnClickListener(this);
817014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        setCertificate(null);
827014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    }
837014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
847014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    public void setCertificate(String alias) {
8551dc9593bb8a708f269834b8a4be955aee06ac1eBen Komalo        Resources res = getResources();
8651dc9593bb8a708f269834b8a4be955aee06ac1eBen Komalo        mValue = alias;
8751dc9593bb8a708f269834b8a4be955aee06ac1eBen Komalo        mAliasText.setText(
88f1789afa535b113047ef20623d79fdfb257537aaTony Mantler                TextUtils.isEmpty(alias)
8951dc9593bb8a708f269834b8a4be955aee06ac1eBen Komalo                ? res.getString(R.string.account_setup_exchange_no_certificate)
9051dc9593bb8a708f269834b8a4be955aee06ac1eBen Komalo                : alias);
9151dc9593bb8a708f269834b8a4be955aee06ac1eBen Komalo        mSelectButton.setText(res.getString(
92f1789afa535b113047ef20623d79fdfb257537aaTony Mantler                TextUtils.isEmpty(alias)
9351dc9593bb8a708f269834b8a4be955aee06ac1eBen Komalo                ? R.string.account_setup_exchange_select_certificate
947014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo                : R.string.account_setup_exchange_remove_certificate));
957014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    }
967014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
977014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    public boolean hasCertificate() {
9851dc9593bb8a708f269834b8a4be955aee06ac1eBen Komalo        return mValue != null;
997014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    }
1007014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
1017014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    /**
1027014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo     * Gets the alias for the currently selected certificate, or null if one is not selected.
1037014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo     */
1047014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    public String getCertificate() {
10551dc9593bb8a708f269834b8a4be955aee06ac1eBen Komalo        return mValue;
1067014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    }
1077014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
1087014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
1097014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    @Override
1107014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    public void onClick(View target) {
111994343b14bfba216969a9d9e86b53312686f7832Ben Komalo        if (target == mSelectButton && mHost != null) {
1127014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo            if (hasCertificate()) {
1137014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo                // Handle the click on the button when it says "Remove"
1147014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo                setCertificate(null);
1157014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo            } else {
116994343b14bfba216969a9d9e86b53312686f7832Ben Komalo                mHost.onCertificateRequested();
1177014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo            }
1187014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        }
1197014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    }
1207014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
1217014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    @Override
1227014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    protected void onRestoreInstanceState(Parcelable parcel) {
1237014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        SavedState savedState = (SavedState) parcel;
1247014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        super.onRestoreInstanceState(savedState.getSuperState());
1257014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        setCertificate(savedState.mValue);
1267014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    }
1277014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
1287014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    @Override
1297014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    protected Parcelable onSaveInstanceState() {
1307014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        return new SavedState(super.onSaveInstanceState(), getCertificate());
1317014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    }
1327014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
1337014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    public static class SavedState extends BaseSavedState {
1347014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        final String mValue;
1357014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
1367014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        SavedState(Parcelable superState, String value) {
1377014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo            super(superState);
1387014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo            mValue = value;
1397014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        }
1407014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
1417014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        @Override
1427014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        public void writeToParcel(Parcel out, int flags) {
1437014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo            super.writeToParcel(out, flags);
1447014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo            out.writeString(mValue);
1457014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        }
1467014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
1477014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        @SuppressWarnings("hiding")
1487014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        public static final Parcelable.Creator<SavedState> CREATOR
1497014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo                = new Parcelable.Creator<SavedState>() {
1509e521deb6bb525b33365cc2926cb2d0faa7095e2Scott Kennedy            @Override
1517014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo            public SavedState createFromParcel(Parcel in) {
1527014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo                return new SavedState(in);
1537014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo            }
1547014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
1559e521deb6bb525b33365cc2926cb2d0faa7095e2Scott Kennedy            @Override
1567014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo            public SavedState[] newArray(int size) {
1577014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo                return new SavedState[size];
1587014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo            }
1597014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        };
1607014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo
1617014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        private SavedState(Parcel in) {
1627014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo            super(in);
1637014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo            mValue = in.readString();
1647014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo        }
1657014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo    }
1667014f7d3299203bd83fa893ab2d850b129ec6dc7Ben Komalo}
167