package org.estgroup.phphub.common.transformer; import android.text.TextUtils; import com.github.pwittchen.prefser.library.Prefser; import org.estgroup.phphub.api.entity.element.Token; import org.estgroup.phphub.common.util.Utils; import org.estgroup.phphub.model.TokenModel; import rx.Notification; import rx.Observable; import rx.functions.Action1; import rx.functions.Func1; import rx.functions.Func2; import static org.estgroup.phphub.common.Constant.*; public class TokenGeneratorTransformer<T> extends RetryTransformer implements Observable.Transformer<T, T> { private TokenModel tokenModel; private Prefser prefser; public TokenGeneratorTransformer(TokenModel tokenModel, Prefser prefser) { this.tokenModel = tokenModel; this.prefser = prefser; } @Override public Observable<T> call(Observable<T> observable) { return observable.retry(new Func2<Integer, Throwable, Boolean>() { @Override public Boolean call(Integer retryCount, Throwable throwable) { final boolean[] needRetry = {false}; if (retryCount <= RETRY_COUNT && Utils.hasUnauthorized(throwable)) { tokenModel.tokenGenerator() .materialize() .filter(new Func1<Notification<Token>, Boolean>() { @Override public Boolean call(Notification<Token> notification) { return !notification.isOnCompleted(); } }) .filter(new Func1<Notification<Token>, Boolean>() { @Override public Boolean call(Notification<Token> notification) { Token token = notification.getValue(); return (token != null && !TextUtils.isEmpty(token.getToken())); } }) .doOnNext(new Action1<Notification<Token>>() { @Override public void call(Notification<Token> notification) { prefser.put(GUEST_TOKEN_KEY, notification.getValue().getToken()); } }) .toBlocking() .forEach(new Action1<Notification<Token>>() { @Override public void call(Notification<Token> notification) { needRetry[0] = true; } }); } return needRetry[0]; } }); } }