package com.kickstarter.libs;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.google.gson.Gson;
import com.kickstarter.libs.preferences.StringPreferenceType;
import com.kickstarter.models.User;
import rx.Observable;
import rx.subjects.BehaviorSubject;
import timber.log.Timber;
public class CurrentUser extends CurrentUserType {
private final StringPreferenceType accessTokenPreference;
private final DeviceRegistrarType deviceRegistrar;
private final StringPreferenceType userPreference;
private final BehaviorSubject<User> user = BehaviorSubject.create();
public CurrentUser(final @NonNull StringPreferenceType accessTokenPreference,
final @NonNull DeviceRegistrarType deviceRegistrar,
final @NonNull Gson gson,
final @NonNull StringPreferenceType userPreference) {
this.accessTokenPreference = accessTokenPreference;
this.deviceRegistrar = deviceRegistrar;
this.userPreference = userPreference;
user
.skip(1)
.filter(user -> user != null)
.subscribe(user -> userPreference.set(gson.toJson(user, User.class)));
user.onNext(gson.fromJson(userPreference.get(), User.class));
}
@Override
public @Nullable User getUser() {
return user.getValue();
}
@Override
public boolean exists() {
return getUser() != null;
}
public String getAccessToken() {
return accessTokenPreference.get();
}
@Override
public void login(final @NonNull User newUser, final @NonNull String accessToken) {
Timber.d("Login user %s", newUser.name());
accessTokenPreference.set(accessToken);
user.onNext(newUser);
deviceRegistrar.registerDevice();
}
@Override
public void logout() {
Timber.d("Logout current user");
userPreference.delete();
accessTokenPreference.delete();
user.onNext(null);
deviceRegistrar.unregisterDevice();
}
@Override
public void refresh(final @NonNull User freshUser) {
user.onNext(freshUser);
}
@Override
public @NonNull Observable<User> observable() {
return user;
}
}