package cgeo.geocaching.settings;
import cgeo.geocaching.CgeoApplication;
import cgeo.geocaching.Intents;
import cgeo.geocaching.R;
import cgeo.geocaching.connector.capability.ICredentials;
import cgeo.geocaching.connector.ec.ECConnector;
import cgeo.geocaching.connector.gc.GCConnector;
import cgeo.geocaching.gcvote.GCVote;
import cgeo.geocaching.network.Cookies;
import cgeo.geocaching.network.HtmlImage;
import android.content.Context;
import android.content.Intent;
import android.preference.Preference;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import butterknife.ButterKnife;
import org.apache.commons.lang3.StringUtils;
public class CredentialsPreference extends AbstractClickablePreference {
private static final int NO_KEY = -1;
private LayoutInflater inflater;
private final CredentialActivityMapping credentialsMapping;
private enum CredentialActivityMapping {
GEOCACHING(R.string.pref_fakekey_gc_authorization, GCAuthorizationActivity.class, GCConnector.getInstance()),
EXTREMCACHING(R.string.pref_fakekey_ec_authorization, ECAuthorizationActivity.class, ECConnector.getInstance()),
GCVOTE(R.string.pref_fakekey_gcvote_authorization, GCVoteAuthorizationActivity.class, GCVote.getInstance());
public final int prefKeyId;
private final Class<?> authActivity;
private final ICredentials connector;
CredentialActivityMapping(final int prefKeyId, @NonNull final Class<?> authActivity, @NonNull final ICredentials connector) {
this.prefKeyId = prefKeyId;
this.authActivity = authActivity;
this.connector = connector;
}
public Class<?> getAuthActivity() {
return authActivity;
}
public ICredentials getConnector() {
return connector;
}
}
private CredentialActivityMapping getAuthorization() {
final String prefKey = getKey();
for (final CredentialActivityMapping auth : CredentialActivityMapping.values()) {
if (auth.prefKeyId != NO_KEY && prefKey.equals(CgeoApplication.getInstance().getString(auth.prefKeyId))) {
return auth;
}
}
throw new IllegalStateException("Invalid authorization preference");
}
public CredentialsPreference(final Context context, final AttributeSet attrs) {
super(context, attrs);
this.credentialsMapping = getAuthorization();
init(context);
}
public CredentialsPreference(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
this.credentialsMapping = getAuthorization();
init(context);
}
private void init(final Context context) {
inflater = LayoutInflater.from(context);
}
@Override
protected OnPreferenceClickListener getOnPreferenceClickListener(final SettingsActivity settingsActivity) {
settingsActivity.setAuthTitle(credentialsMapping.prefKeyId);
return new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(final Preference preference) {
final Intent checkIntent = new Intent(preference.getContext(), credentialsMapping.getAuthActivity());
final Credentials credentials = credentialsMapping.getConnector().getCredentials();
checkIntent.putExtra(Intents.EXTRA_CREDENTIALS_AUTH_USERNAME, credentials.getUsernameRaw());
checkIntent.putExtra(Intents.EXTRA_CREDENTIALS_AUTH_PASSWORD, credentials.getPasswordRaw());
settingsActivity.startActivityForResult(checkIntent, credentialsMapping.prefKeyId);
return false; // no shared preference has to be changed
}
};
}
@Override
protected View onCreateView(final ViewGroup parent) {
super.onCreateView(parent);
return addInfoIcon(parent);
}
/**
* Display avatar image if present
*/
private View addInfoIcon(final ViewGroup parent) {
final View preferenceView = super.onCreateView(parent);
final String avatarUrl = Settings.getAvatarUrl(credentialsMapping.getConnector());
if (StringUtils.isEmpty(avatarUrl)) {
return preferenceView;
}
final ImageView iconView = (ImageView) inflater.inflate(R.layout.preference_info_icon, parent, false);
final HtmlImage imgGetter = new HtmlImage(HtmlImage.SHARED, false, false, false);
iconView.setImageDrawable(imgGetter.getDrawable(avatarUrl));
final LinearLayout frame = ButterKnife.findById(preferenceView, android.R.id.widget_frame);
frame.setVisibility(View.VISIBLE);
frame.addView(iconView);
return preferenceView;
}
@Override
protected boolean isAuthorized() {
return Settings.getCredentials(credentialsMapping.getConnector()).isValid();
}
@Override
protected void revokeAuthorization() {
if (credentialsMapping == CredentialActivityMapping.GEOCACHING) {
Cookies.clearCookies();
}
Settings.setCredentials(credentialsMapping.getConnector(), Credentials.EMPTY);
Settings.setAvatarUrl(credentialsMapping.getConnector(), StringUtils.EMPTY);
}
}