package com.byoutline.kickmaterial.managers;
import com.byoutline.cachedfield.CachedFieldWithArg;
import com.byoutline.kickmaterial.api.KickMaterialService;
import com.byoutline.kickmaterial.dagger.GlobalScope;
import com.byoutline.kickmaterial.events.AccessTokenFetchedEvent;
import com.byoutline.kickmaterial.events.AccessTokenFetchingFailedEvent;
import com.byoutline.kickmaterial.model.AccessToken;
import com.byoutline.kickmaterial.model.EmailAndPass;
import com.byoutline.ottocachedfield.OttoCachedFieldWithArgBuilder;
import com.squareup.otto.Subscribe;
import javax.inject.Inject;
import static com.byoutline.ibuscachedfield.util.RetrofitHelper.apiValueProv;
/**
* Created by Sebastian Kacprzak <sebastian.kacprzak at byoutline.com> on 31.03.15.
*/
@GlobalScope
public class LoginManager {
private CachedFieldWithArg<AccessToken, EmailAndPass> accessToken;
private final AccessTokenProvider accessTokenProvider;
@Inject
public LoginManager(KickMaterialService service, AccessTokenProvider accessTokenProvider) {
this.accessTokenProvider = accessTokenProvider;
accessToken = new OttoCachedFieldWithArgBuilder<AccessToken, EmailAndPass>()
.withValueProvider(apiValueProv(service::postGetAccessToken))
.withSuccessEvent(new AccessTokenFetchedEvent())
.withResponseErrorEvent(new AccessTokenFetchingFailedEvent())
.withCustomSessionIdProvider(() -> "") // should be valid between sessions
.build();
}
public void logIn(EmailAndPass emailAndPass) {
accessToken.postValue(emailAndPass);
}
public void logOff() {
accessTokenProvider.set("");
accessToken.drop();
}
@Subscribe
public void onAccessTokenFetched(AccessTokenFetchedEvent event) {
accessTokenProvider.set(event.getResponse().accessToken);
}
}