// Path: app/src/main/java/info/izumin/android/sunazuri/Sunazuri.java
// public class Sunazuri extends Application {
//     public static final String TAG = Sunazuri.class.getSimpleName();
// 
//     public static Sunazuri get(Context context) {
//         return (Sunazuri) context.getApplicationContext();
//     }
// 
//     @Inject RootStore store;
//     @Inject UserActionCreator userActionCreator;
// 
//     @Inject Picasso picasso;
// 
//     private AppComponent component;
//     private CompositeSubscription subscriptions;
// 
//     @Override
//     public void onCreate() {
//         super.onCreate();
//         LeakCanary.install(this);
//         setupStetho();
//         setupComponent();
//         setupTimber();
//         setupPicasso();
//         initialize();
//     }
// 
//     @Override
//     public void onTerminate() {
//         subscriptions.clear();
//         super.onTerminate();
//     }
// 
//     public AppComponent getComponent() {
//         return component;
//     }
// 
//     private void initialize() {
//         subscriptions = new CompositeSubscription();
//         subscriptions.add(
//                 store.dispatch(userActionCreator.createLoadLoginInfoAction())
//                         .subscribeOn(Schedulers.io())
//                         .subscribe()
//         );
//     }
// 
//     private void setupTimber() {
//         if (BuildConfig.DEBUG) {
//             Timber.plant(new Timber.DebugTree());
//         }
//     }
// 
//     private void setupComponent() {
//         component = DaggerAppComponent.builder()
//                 .appModule(createAppModule())
//                 .dataComponent(getDataComponent())
//                 .build();
//         component.inject(this);
//     }
// 
//     @VisibleForTesting
//     protected void setupStetho() {
//         new StethoWrapper(this).setup();
//     }
// 
//     @VisibleForTesting
//     protected void setupPicasso() {
//         Picasso.setSingletonInstance(picasso);
//     }
// 
//     private DataComponent getDataComponent() {
//         return DaggerDataComponent.builder()
//                 .infrastructureComponent(getInfrastructureComponent())
//                 .build();
//     }
// 
//     private InfrastructureComponent getInfrastructureComponent() {
//         return DaggerInfrastructureComponent.builder()
//                 .infrastructureModule(new InfrastructureModule(this, BuildConfig.KEYSTORE_ALIAS))
//                 .apiModule(new ApiModule(BuildConfig.ESA_API_ENDPOINT, getOauthParams(), getResponseEnvelopeKeys()))
//                 .build();
//     }
// 
//     private AppModule createAppModule() {
//         return new AppModule(this);
//     }
// 
//     private OauthParams getOauthParams() {
//         return new OauthParams(
//                 BuildConfig.ESA_API_ENDPOINT,
//                 BuildConfig.ESA_CLIENT_ID,
//                 BuildConfig.ESA_CLIENT_SECRET,
//                 BuildConfig.ESA_CALLBACK_URI,
//                 BuildConfig.ESA_OAUTH_SCOPE,
//                 "code",
//                 "/oauth/authorize",
//                 BuildConfig.ESA_OAUTH_GRANT_TYPE
//         );
//     }
// 
//     private List<String> getResponseEnvelopeKeys() {
//         return new ArrayList<String>(){{
//             add("teams");
//         }};
//     }
// }
// 
// Path: app/src/main/java/info/izumin/android/sunazuri/domain/RootStore.java
// @Store({
//         AuthorizedUsersReducer.class,
//         LoginInfoReducer.class,
//         TeamsReducer.class
// })
// public interface RootStore extends BaseStore {
//     AuthorizedUsers getAuthorizedUsers();
//     Teams getTeams();
//     LoginInfo getLoginInfo();
// }
// 
// Path: app/src/main/java/info/izumin/android/sunazuri/infrastructure/entity/OauthParams.java
// public class OauthParams {
//     public static final String TAG = OauthParams.class.getSimpleName();
// 
//     public final String endpoint;
//     public final String clientId;
//     public final String clientSecret;
//     public final String redirectUri;
//     public final String scope;
//     public final String responseType;
//     public final String authorizePath;
//     public final String grantType;
// 
//     public OauthParams(String endpoint, String clientId, String clientSecret, String redirectUri, String scope, String responseType, String authorizePath, String grantType) {
//         this.endpoint = endpoint;
//         this.clientId = clientId;
//         this.clientSecret = clientSecret;
//         this.redirectUri = redirectUri;
//         this.scope = scope;
//         this.responseType = responseType;
//         this.authorizePath = authorizePath;
//         this.grantType = grantType;
//     }
// 
//     public String getAuthorizeUri() {
//         return endpoint + authorizePath
//                 + "?client_id="     + clientId
//                 + "&redirect_uri="  + redirectUri
//                 + "&scope="         + scope
//                 + "&response_type=" + responseType;
//     }
// }


import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.customtabs.CustomTabsIntent;
import android.support.v7.app.AppCompatActivity;
import info.izumin.android.sunazuri.R;
import info.izumin.android.sunazuri.Sunazuri;
import info.izumin.android.sunazuri.data.action.user.UserActionCreator;
import info.izumin.android.sunazuri.domain.RootStore;
import info.izumin.android.sunazuri.infrastructure.entity.OauthParams;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import javax.inject.Inject;
        if (store.getAuthorizedUsers().isEmpty()) {
            CustomTabsIntent intent = new CustomTabsIntent.Builder().build();
            intent.launchUrl(this, Uri.parse(oauthParams.getAuthorizeUri()));
        }
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        inject();
        store.dispatch(userActionCreator.createAuthAction(intent.getDataString()))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        _a -> returnToMain(),
                        this::returnToMain
                );
    }

    private void returnToMain() {
        setResult(Activity.RESULT_OK);
        finish();
    }

    private void returnToMain(Throwable throwable) {
        setResult(Activity.RESULT_CANCELED);
        finish();
    }

    private void inject() {
// Path: app/src/main/java/info/izumin/android/sunazuri/Sunazuri.java
// public class Sunazuri extends Application {
//     public static final String TAG = Sunazuri.class.getSimpleName();
// 
//     public static Sunazuri get(Context context) {
//         return (Sunazuri) context.getApplicationContext();
//     }
// 
//     @Inject RootStore store;
//     @Inject UserActionCreator userActionCreator;
// 
//     @Inject Picasso picasso;
// 
//     private AppComponent component;
//     private CompositeSubscription subscriptions;
// 
//     @Override
//     public void onCreate() {
//         super.onCreate();
//         LeakCanary.install(this);
//         setupStetho();
//         setupComponent();
//         setupTimber();
//         setupPicasso();
//         initialize();
//     }
// 
//     @Override
//     public void onTerminate() {
//         subscriptions.clear();
//         super.onTerminate();
//     }
// 
//     public AppComponent getComponent() {
//         return component;
//     }
// 
//     private void initialize() {
//         subscriptions = new CompositeSubscription();
//         subscriptions.add(
//                 store.dispatch(userActionCreator.createLoadLoginInfoAction())
//                         .subscribeOn(Schedulers.io())
//                         .subscribe()
//         );
//     }
// 
//     private void setupTimber() {
//         if (BuildConfig.DEBUG) {
//             Timber.plant(new Timber.DebugTree());
//         }
//     }
// 
//     private void setupComponent() {
//         component = DaggerAppComponent.builder()
//                 .appModule(createAppModule())
//                 .dataComponent(getDataComponent())
//                 .build();
//         component.inject(this);
//     }
// 
//     @VisibleForTesting
//     protected void setupStetho() {
//         new StethoWrapper(this).setup();
//     }
// 
//     @VisibleForTesting
//     protected void setupPicasso() {
//         Picasso.setSingletonInstance(picasso);
//     }
// 
//     private DataComponent getDataComponent() {
//         return DaggerDataComponent.builder()
//                 .infrastructureComponent(getInfrastructureComponent())
//                 .build();
//     }
// 
//     private InfrastructureComponent getInfrastructureComponent() {
//         return DaggerInfrastructureComponent.builder()
//                 .infrastructureModule(new InfrastructureModule(this, BuildConfig.KEYSTORE_ALIAS))
//                 .apiModule(new ApiModule(BuildConfig.ESA_API_ENDPOINT, getOauthParams(), getResponseEnvelopeKeys()))
//                 .build();
//     }
// 
//     private AppModule createAppModule() {
//         return new AppModule(this);
//     }
// 
//     private OauthParams getOauthParams() {
//         return new OauthParams(
//                 BuildConfig.ESA_API_ENDPOINT,
//                 BuildConfig.ESA_CLIENT_ID,
//                 BuildConfig.ESA_CLIENT_SECRET,
//                 BuildConfig.ESA_CALLBACK_URI,
//                 BuildConfig.ESA_OAUTH_SCOPE,
//                 "code",
//                 "/oauth/authorize",
//                 BuildConfig.ESA_OAUTH_GRANT_TYPE
//         );
//     }
// 
//     private List<String> getResponseEnvelopeKeys() {
//         return new ArrayList<String>(){{
//             add("teams");
//         }};
//     }
// }
// 
// Path: app/src/main/java/info/izumin/android/sunazuri/domain/RootStore.java
// @Store({
//         AuthorizedUsersReducer.class,
//         LoginInfoReducer.class,
//         TeamsReducer.class
// })
// public interface RootStore extends BaseStore {
//     AuthorizedUsers getAuthorizedUsers();
//     Teams getTeams();
//     LoginInfo getLoginInfo();
// }
// 
// Path: app/src/main/java/info/izumin/android/sunazuri/infrastructure/entity/OauthParams.java
// public class OauthParams {
//     public static final String TAG = OauthParams.class.getSimpleName();
// 
//     public final String endpoint;
//     public final String clientId;
//     public final String clientSecret;
//     public final String redirectUri;
//     public final String scope;
//     public final String responseType;
//     public final String authorizePath;
//     public final String grantType;
// 
//     public OauthParams(String endpoint, String clientId, String clientSecret, String redirectUri, String scope, String responseType, String authorizePath, String grantType) {
//         this.endpoint = endpoint;
//         this.clientId = clientId;
//         this.clientSecret = clientSecret;
//         this.redirectUri = redirectUri;
//         this.scope = scope;
//         this.responseType = responseType;
//         this.authorizePath = authorizePath;
//         this.grantType = grantType;
//     }
// 
//     public String getAuthorizeUri() {
//         return endpoint + authorizePath
//                 + "?client_id="     + clientId
//                 + "&redirect_uri="  + redirectUri
//                 + "&scope="         + scope
//                 + "&response_type=" + responseType;
//     }
// }


// Path: app/src/main/java/info/izumin/android/sunazuri/presentation/activity/oauth/OauthActivity.java
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.customtabs.CustomTabsIntent;
import android.support.v7.app.AppCompatActivity;
import info.izumin.android.sunazuri.R;
import info.izumin.android.sunazuri.Sunazuri;
import info.izumin.android.sunazuri.data.action.user.UserActionCreator;
import info.izumin.android.sunazuri.domain.RootStore;
import info.izumin.android.sunazuri.infrastructure.entity.OauthParams;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;
import javax.inject.Inject;

        if (store.getAuthorizedUsers().isEmpty()) {
            CustomTabsIntent intent = new CustomTabsIntent.Builder().build();
            intent.launchUrl(this, Uri.parse(oauthParams.getAuthorizeUri()));
        }
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        inject();
        store.dispatch(userActionCreator.createAuthAction(intent.getDataString()))
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        _a -> returnToMain(),
                        this::returnToMain
                );
    }

    private void returnToMain() {
        setResult(Activity.RESULT_OK);
        finish();
    }

    private void returnToMain(Throwable throwable) {
        setResult(Activity.RESULT_CANCELED);
        finish();
    }

    private void inject() {
        Sunazuri.get(this).getComponent().inject(this);