package cgeo.geocaching.settings;
import cgeo.geocaching.CgeoApplication;
import cgeo.geocaching.R;
import cgeo.geocaching.activity.TokenAuthorizationActivity.TokenAuthParameters;
import cgeo.geocaching.connector.trackable.GeokretyAuthorizationActivity;
import android.content.Context;
import android.content.Intent;
import android.preference.Preference;
import android.util.AttributeSet;
import org.apache.commons.lang3.StringUtils;
public class TokenPreference extends AbstractClickablePreference {
private static final int NO_KEY = -1;
private enum TokenActivityMapping {
NONE(NO_KEY, null, null),
GEOKRETY(R.string.pref_fakekey_geokrety_authorization, GeokretyAuthorizationActivity.class, GeokretyAuthorizationActivity.GEOKRETY_TOKEN_AUTH_PARAMS);
public final int prefKeyId;
public final Class<?> authActivity;
public final TokenAuthParameters authParams;
TokenActivityMapping(final int prefKeyId, final Class<?> authActivity, final TokenAuthParameters authParams) {
this.prefKeyId = prefKeyId;
this.authActivity = authActivity;
this.authParams = authParams;
}
}
private final TokenActivityMapping tokenMapping;
private TokenActivityMapping getAuthorization() {
final String prefKey = getKey();
for (final TokenActivityMapping auth : TokenActivityMapping.values()) {
if (auth.prefKeyId != NO_KEY && prefKey.equals(CgeoApplication.getInstance().getString(auth.prefKeyId))) {
return auth;
}
}
return TokenActivityMapping.NONE;
}
public TokenPreference(final Context context, final AttributeSet attrs) {
super(context, attrs);
this.tokenMapping = getAuthorization();
}
public TokenPreference(final Context context, final AttributeSet attrs, final int defStyle) {
super(context, attrs, defStyle);
this.tokenMapping = getAuthorization();
}
@Override
protected OnPreferenceClickListener getOnPreferenceClickListener(final SettingsActivity activity) {
activity.setAuthTitle(tokenMapping.prefKeyId);
return new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(final Preference preference) {
if (tokenMapping.authActivity != null) {
final Intent authIntent = new Intent(preference.getContext(),
tokenMapping.authActivity);
tokenMapping.authParams.setTokenAuthExtras(authIntent);
activity.startActivityForResult(authIntent,
tokenMapping.prefKeyId);
}
return false; // no shared preference has to be changed
}
};
}
@Override
protected boolean isAuthorized() {
return !StringUtils.isEmpty(Settings.getTokenSecret(tokenMapping.prefKeyId));
}
@Override
protected void revokeAuthorization() {
Settings.setTokenSecret(tokenMapping.prefKeyId, StringUtils.EMPTY);
}
}