package com.pluscubed.plustimer.ui.basedrawer;
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.os.Build;
import android.support.annotation.NonNull;
import com.auth0.core.Token;
import com.auth0.core.UserProfile;
import com.auth0.identity.IdentityProvider;
import com.auth0.identity.IdentityProviderCallback;
import com.auth0.identity.WebIdentityProvider;
import com.auth0.identity.web.CallbackParser;
import com.couchbase.lite.CouchbaseLiteException;
import com.pluscubed.plustimer.base.Presenter;
import com.pluscubed.plustimer.base.PresenterFactory;
import com.pluscubed.plustimer.model.CouchbaseInstance;
import java.io.IOException;
import java.util.HashMap;
import rx.SingleSubscriber;
import rx.android.schedulers.AndroidSchedulers;
public class DrawerPresenter<V extends DrawerView> extends Presenter<V> {
private UserProfile mDisplayedUser;
private WebIdentityProvider mProvider;
public DrawerPresenter() {
}
@Override
public void onViewAttached(V view) {
super.onViewAttached(view);
try {
CouchbaseInstance instance = CouchbaseInstance.get(getView().getContextCompat());
instance.getLoggedInUser()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(onUserLoaded(instance));
} catch (CouchbaseLiteException | IOException e) {
e.printStackTrace();
if (isViewAttached())
getView().displayToast(e.getMessage());
}
}
@NonNull
private SingleSubscriber<UserProfile> onUserLoaded(final CouchbaseInstance instance) {
return new SingleSubscriber<UserProfile>() {
@Override
public void onSuccess(UserProfile user) {
mDisplayedUser = user;
if (mDisplayedUser != null) {
updateView();
instance.startReplication();
}
}
@Override
public void onError(Throwable error) {
error.printStackTrace();
if (isViewAttached())
getView().displayToast(error.getMessage());
}
};
}
@SuppressWarnings("ConstantConditions")
private void signIn() throws CouchbaseLiteException, IOException {
if (!isViewAttached()) {
return;
}
CouchbaseInstance instance = CouchbaseInstance.get(getView().getContextCompat());
//getView().getContextCompat().startActivity(new Intent(getView().getContextCompat(), LockActivity.class));
mProvider = new WebIdentityProvider(
new CallbackParser(),
instance.getAuth0().getClientId(),
instance.getAuth0().getAuthorizeUrl()
);
HashMap<String, Object> parameters = new HashMap<>();
parameters.put("scope", "openid roles offline_access");
parameters.put("device", Build.MODEL);
mProvider.setParameters(parameters);
mProvider.setCallback(new IdentityProviderCallback() {
@Override
public void onFailure(Dialog dialog) {
}
@Override
public void onFailure(int titleResource, int messageResource, Throwable cause) {
getView().displayToast(getView().getContextCompat().getString(titleResource));
}
@Override
public void onSuccess(String serviceName, String accessToken) {
}
@Override
public void onSuccess(Token token) {
instance.signIn(token.getIdToken(), token.getRefreshToken())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(onUserLoaded(instance));
}
});
mProvider.start(getView().getContextCompat(), "WCA");
}
@SuppressWarnings("ConstantConditions")
private void updateView() {
if (!isViewAttached()) {
return;
}
getView().setProfileImage(mDisplayedUser.getPictureURL());
getView().setHeaderText(mDisplayedUser.getName(), mDisplayedUser.getEmail());
}
@SuppressWarnings("ConstantConditions")
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (isViewAttached() && mProvider != null)
mProvider.authorize(getView().getContextCompat(), requestCode, resultCode, data);
}
@SuppressWarnings("ConstantConditions")
public void onNewIntent(Intent intent) {
if (isViewAttached() && mProvider != null)
mProvider.authorize(getView().getContextCompat(), IdentityProvider.WEBVIEW_AUTH_REQUEST_CODE, Activity.RESULT_OK, intent);
}
@Override
public void onViewDetached() {
mDisplayedUser = null;
CouchbaseInstance.getDeferred(getView().getContextCompat())
.subscribe(new SingleSubscriber<CouchbaseInstance>() {
@Override
public void onSuccess(CouchbaseInstance value) {
value.stopReplication();
}
@Override
public void onError(Throwable error) {
}
});
super.onViewDetached();
}
@Override
public void onDestroyed() {
super.onDestroyed();
}
public void onNavDrawerHeaderClicked() {
if (mDisplayedUser == null) {
try {
signIn();
} catch (CouchbaseLiteException | IOException e) {
e.printStackTrace();
if (isViewAttached())
getView().displayToast(e.getMessage());
}
} else {
//signOutFlow();
}
//getView().displayToast("Coming very soon!");
}
public static class Factory<V extends DrawerView> implements PresenterFactory<DrawerPresenter<V>> {
@Override
public DrawerPresenter<V> create() {
return new DrawerPresenter<>();
}
}
}