blob: 12945de68756ec2ee1bd789d6efd648e69569176 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.email.view;
import android.content.Context;
import android.content.res.Resources;
import android.os.Parcel;
import android.os.Parcelable;
import android.security.KeyChain;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.android.email.R;
import com.android.email.activity.UiUtilities;
/**
* A simple view that can be used to select a certificate from the system {@link KeyChain}.
*
* Host activities must register themselves view {@link #setHostCallback} for this selector to work.
*/
public class CertificateSelector extends RelativeLayout implements OnClickListener {
/** Button to select or remove the certificate. */
private Button mSelectButton;
private TextView mAliasText;
/** The value of the cert selected, if any. Null, otherwise. */
private String mValue;
/** The host activity. */
private HostCallback mHost;
public interface HostCallback {
void onCertificateRequested();
}
public CertificateSelector(Context context) {
super(context);
}
public CertificateSelector(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CertificateSelector(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public void setHostCallback(HostCallback host) {
mHost = host;
}
public void setDelegate(String uri) {
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mAliasText = UiUtilities.getView(this, R.id.certificate_alias);
mSelectButton = UiUtilities.getView(this, R.id.select_button);
mSelectButton.setOnClickListener(this);
setCertificate(null);
}
public void setCertificate(String alias) {
Resources res = getResources();
mValue = alias;
mAliasText.setText(
TextUtils.isEmpty(alias)
? res.getString(R.string.account_setup_exchange_no_certificate)
: alias);
mSelectButton.setText(res.getString(
TextUtils.isEmpty(alias)
? R.string.account_setup_exchange_select_certificate
: R.string.account_setup_exchange_remove_certificate));
}
public boolean hasCertificate() {
return mValue != null;
}
/**
* Gets the alias for the currently selected certificate, or null if one is not selected.
*/
public String getCertificate() {
return mValue;
}
@Override
public void onClick(View target) {
if (target == mSelectButton && mHost != null) {
if (hasCertificate()) {
// Handle the click on the button when it says "Remove"
setCertificate(null);
} else {
mHost.onCertificateRequested();
}
}
}
@Override
protected void onRestoreInstanceState(Parcelable parcel) {
SavedState savedState = (SavedState) parcel;
super.onRestoreInstanceState(savedState.getSuperState());
setCertificate(savedState.mValue);
}
@Override
protected Parcelable onSaveInstanceState() {
return new SavedState(super.onSaveInstanceState(), getCertificate());
}
public static class SavedState extends BaseSavedState {
final String mValue;
SavedState(Parcelable superState, String value) {
super(superState);
mValue = value;
}
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeString(mValue);
}
@SuppressWarnings("hiding")
public static final Parcelable.Creator<SavedState> CREATOR
= new Parcelable.Creator<SavedState>() {
@Override
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
@Override
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
private SavedState(Parcel in) {
super(in);
mValue = in.readString();
}
}
}