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