package com.ushahidi.platform.mobile.app.presentation.account;
import com.google.gson.Gson;
import com.ushahidi.platform.mobile.app.presentation.UshahidiApplication;
import com.ushahidi.platform.mobile.app.presentation.state.NoAccessTokenEvent;
import android.content.SharedPreferences;
import java.util.Calendar;
import de.rheinfabrik.heimdall.OAuth2AccessToken;
import de.rheinfabrik.heimdall.OAuth2AccessTokenStorage;
import rx.Observable;
/**
* A simple storage that saves the access token as plain text in the passed shared preferences.
* It is recommend to set the access mode to MODE_PRIVATE. It uses {@link Gson} as the
* serialization
* / deserialization class.
*
* @param <T> The access token type.
* @author Ushahidi Team <team@ushahidi.com>
*/
public class AccessTokenStorageManager<T extends OAuth2AccessToken> implements
OAuth2AccessTokenStorage<T> {
// Constants
private static final String ACCESS_TOKEN_PREFERENCES_KEY = "OAuth2AccessToken";
// Members
private final SharedPreferences mSharedPreferences;
private final Class mTokenClass;
// Constructor
/**
* Designated constructor.
*
* @param sharedPreferences The shared preferences used for saving the access token.
* @param tokenClass The actual class of the access token.
*/
public AccessTokenStorageManager(SharedPreferences sharedPreferences, Class tokenClass) {
super();
if (tokenClass == null) {
throw new RuntimeException("TokenClass MUST NOT be null.");
}
if (sharedPreferences == null) {
throw new RuntimeException("SharedPreferences MUST NOT be null.");
}
mTokenClass = tokenClass;
mSharedPreferences = sharedPreferences;
}
// OAuth2AccessTokenStorage
@SuppressWarnings("unchecked")
@Override
public Observable<T> getStoredAccessToken() {
return Observable
.just(mSharedPreferences.getString(ACCESS_TOKEN_PREFERENCES_KEY, null))
.filter(accessToken -> {
if (accessToken == null) {
// Send an event that there is no valid access token
UshahidiApplication.getRxEventBusInstance().send(new NoAccessTokenEvent());
}
return true;
})
.map(json -> (T) new Gson().fromJson(json, mTokenClass));
}
@Override
public void storeAccessToken(T accessToken) {
setExpiringDate(accessToken);
mSharedPreferences.edit().putString(ACCESS_TOKEN_PREFERENCES_KEY,
new Gson().toJson(accessToken)).apply();
}
@Override
public Observable<Boolean> hasAccessToken() {
return Observable.just(mSharedPreferences.contains(ACCESS_TOKEN_PREFERENCES_KEY));
}
@Override
public void removeAccessToken() {
mSharedPreferences.edit().remove(ACCESS_TOKEN_PREFERENCES_KEY).apply();
}
private void setExpiringDate(T accessToken) {
if (accessToken.expiresIn != null) {
Calendar expirationDate = Calendar.getInstance();
expirationDate.add(Calendar.SECOND, accessToken.expiresIn);
accessToken.expirationDate = expirationDate;
}
}
}