// Path: impala/src/main/java/hainguyen/impala/application/ApplicationBus.java
// public class ApplicationBus {
// 
//     private boolean login;
// 
//     public boolean isLogin() {
//         return login;
//     }
// 
//     public void setLogin(boolean login) {
//         this.login = login;
//     }
// }
// 
// Path: impala/src/main/java/hainguyen/impala/application/scheduler/ImpalaScheduler.java
// public class ImpalaScheduler {
//     public interface SchedulerProvider {
//         Scheduler mainThread();
// 
//         Scheduler io();
//     }
// 
//     public static SchedulerProvider instance = new DefaultSchedulerProvider();
// 
//     public static Scheduler mainThread() {
//         return instance.mainThread();
//     }
// 
//     public static Scheduler io() {
//         return instance.io();
//     }
// 
//     public static class DefaultSchedulerProvider implements SchedulerProvider {
//         @Override public Scheduler mainThread() {
//             return AndroidSchedulers.mainThread();
//         }
// 
//         @Override public Scheduler io() {
//             return Schedulers.io();
//         }
//     }
// }
// 
// Path: impala/src/main/java/hainguyen/impala/appsenum/Enums.java
// public class Enums {
//     public enum EmailErrorType {
//         EMPTY(0),
//         INVALID(1);
// 
//         private final int id;
// 
//         EmailErrorType(int id) {
//             this.id = id;
//         }
// 
//         public int getId() {
//             return id;
//         }
//     }
// }
// 
// Path: impala/src/main/java/hainguyen/impala/data/UserProfile.java
// public class UserProfile {
// 
//     private LoginRepository loginRepository;
// 
//     @Inject
//     public UserProfile(LoginRepository loginRepository) {
//         this.loginRepository = loginRepository;
//     }
// 
//     public Observable<User> login(String email, String password) {
//         LoginRequest request = LoginRequest.builder().setEmail(email).setPassword(password).build();
//         return loginRepository.login(request).flatMap(new Func1<LoginResponse, Observable<User>>() {
//             @Override
//             public Observable<User> call(LoginResponse response) {
//                 User user = new User();
//                 user.transformFrom(response);
//                 return Observable.just(user);
//             }
//         });
//     }
// }
// 
// Path: impala/src/main/java/hainguyen/impala/feature/login/view/LoginView.java
// public interface LoginView extends ImpalaView {
//     void showProgress(final boolean show);
// 
//     boolean mayRequestContacts();
// 
//     void setEmailViewError(Enums.EmailErrorType errorType);
// 
//     void clearError();
// 
//     void setPasswordError();
// 
//     void addEmailsToAutoComplete(List<String> emailAddressCollection);
// 
//     void goToDetailsPage();
// }
// 
// Path: impala/src/main/java/hainguyen/impala/injection/helper/ScopeHelper.java
// public interface ScopeHelper {
//      void initUserScope(User user);
// }
// 
// Path: impala/src/main/java/hainguyen/impala/model/User.java
// public class User {
// 
//     @SerializedName("FullName")
//     public String fullName;
// 
//     @SerializedName("DateOfBirth")
//     public String dateOfBirth;
// 
//     @SerializedName("Gender")
//     public String gender;
// 
//     @SerializedName("Address")
//     public String address;
// 
//     @SerializedName("Phone")
//     public String phone;
// 
//     public String getFullName() {
//         return fullName;
//     }
// 
//     public void setFullName(String fullName) {
//         this.fullName = fullName;
//     }
// 
//     public String getDateOfBirth() {
//         return dateOfBirth;
//     }
// 
//     public void setDateOfBirth(String dateOfBirth) {
//         this.dateOfBirth = dateOfBirth;
//     }
// 
//     public String getGender() {
//         return gender;
//     }
// 
//     public void setGender(String gender) {
//         this.gender = gender;
//     }
// 
//     public String getAddress() {
//         return address;
//     }
// 
//     public void setAddress(String address) {
//         this.address = address;
//     }
// 
//     public String getPhone() {
//         return phone;
//     }
// 
//     public void setPhone(String phone) {
//         this.phone = phone;
//     }
// 
//     public User transformFrom(LoginResponse response) {
//         this.fullName = response.fullName();
//         this.address = response.address();
//         this.dateOfBirth = response.dateOfBirth();
//         this.gender = response.gender();
//         this.phone = response.phone();
//         return null;
//     }
// }
// 
// Path: impala/src/main/java/hainguyen/impala/util/ContactUtil.java
// public interface ContactUtil {
//     Observable<List<String>> getEmailList(ContentResolver resolver);
// }


import android.content.ContentResolver;
import java.util.List;
import javax.inject.Inject;
import hainguyen.impala.application.ApplicationBus;
import hainguyen.impala.application.scheduler.ImpalaScheduler;
import hainguyen.impala.appsenum.Enums;
import hainguyen.impala.data.UserProfile;
import hainguyen.impala.feature.login.view.LoginView;
import hainguyen.impala.injection.helper.ScopeHelper;
import hainguyen.impala.model.User;
import hainguyen.impala.util.ContactUtil;
import rx.Subscriber;
import rx.Subscription;
import rx.subscriptions.CompositeSubscription;
                    }

                    @Override
                    public void onNext(List<String> emails) {
                        loginView.addEmailsToAutoComplete(emails);
                        loginView.showProgress(false);
                    }
                });
        loginSubscriptions.add(contactSubscription);
    }

    @Override
    public void attemptLogin(String email, String password) {
        loginView.clearError();
        loginView.showProgress(true);
        Subscription loginServiceSubscription = userProfile.login(email, password)
                .subscribeOn(ImpalaScheduler.io())
                .observeOn(ImpalaScheduler.mainThread())
                .subscribe(new Subscriber<User>() {
                    @Override
                    public void onCompleted() {
                        //Do nothing
                    }

                    @Override
                    public void onError(Throwable e) {
                        loginView.showProgress(false);
                    }

                    @Override
// Path: impala/src/main/java/hainguyen/impala/application/ApplicationBus.java
// public class ApplicationBus {
// 
//     private boolean login;
// 
//     public boolean isLogin() {
//         return login;
//     }
// 
//     public void setLogin(boolean login) {
//         this.login = login;
//     }
// }
// 
// Path: impala/src/main/java/hainguyen/impala/application/scheduler/ImpalaScheduler.java
// public class ImpalaScheduler {
//     public interface SchedulerProvider {
//         Scheduler mainThread();
// 
//         Scheduler io();
//     }
// 
//     public static SchedulerProvider instance = new DefaultSchedulerProvider();
// 
//     public static Scheduler mainThread() {
//         return instance.mainThread();
//     }
// 
//     public static Scheduler io() {
//         return instance.io();
//     }
// 
//     public static class DefaultSchedulerProvider implements SchedulerProvider {
//         @Override public Scheduler mainThread() {
//             return AndroidSchedulers.mainThread();
//         }
// 
//         @Override public Scheduler io() {
//             return Schedulers.io();
//         }
//     }
// }
// 
// Path: impala/src/main/java/hainguyen/impala/appsenum/Enums.java
// public class Enums {
//     public enum EmailErrorType {
//         EMPTY(0),
//         INVALID(1);
// 
//         private final int id;
// 
//         EmailErrorType(int id) {
//             this.id = id;
//         }
// 
//         public int getId() {
//             return id;
//         }
//     }
// }
// 
// Path: impala/src/main/java/hainguyen/impala/data/UserProfile.java
// public class UserProfile {
// 
//     private LoginRepository loginRepository;
// 
//     @Inject
//     public UserProfile(LoginRepository loginRepository) {
//         this.loginRepository = loginRepository;
//     }
// 
//     public Observable<User> login(String email, String password) {
//         LoginRequest request = LoginRequest.builder().setEmail(email).setPassword(password).build();
//         return loginRepository.login(request).flatMap(new Func1<LoginResponse, Observable<User>>() {
//             @Override
//             public Observable<User> call(LoginResponse response) {
//                 User user = new User();
//                 user.transformFrom(response);
//                 return Observable.just(user);
//             }
//         });
//     }
// }
// 
// Path: impala/src/main/java/hainguyen/impala/feature/login/view/LoginView.java
// public interface LoginView extends ImpalaView {
//     void showProgress(final boolean show);
// 
//     boolean mayRequestContacts();
// 
//     void setEmailViewError(Enums.EmailErrorType errorType);
// 
//     void clearError();
// 
//     void setPasswordError();
// 
//     void addEmailsToAutoComplete(List<String> emailAddressCollection);
// 
//     void goToDetailsPage();
// }
// 
// Path: impala/src/main/java/hainguyen/impala/injection/helper/ScopeHelper.java
// public interface ScopeHelper {
//      void initUserScope(User user);
// }
// 
// Path: impala/src/main/java/hainguyen/impala/model/User.java
// public class User {
// 
//     @SerializedName("FullName")
//     public String fullName;
// 
//     @SerializedName("DateOfBirth")
//     public String dateOfBirth;
// 
//     @SerializedName("Gender")
//     public String gender;
// 
//     @SerializedName("Address")
//     public String address;
// 
//     @SerializedName("Phone")
//     public String phone;
// 
//     public String getFullName() {
//         return fullName;
//     }
// 
//     public void setFullName(String fullName) {
//         this.fullName = fullName;
//     }
// 
//     public String getDateOfBirth() {
//         return dateOfBirth;
//     }
// 
//     public void setDateOfBirth(String dateOfBirth) {
//         this.dateOfBirth = dateOfBirth;
//     }
// 
//     public String getGender() {
//         return gender;
//     }
// 
//     public void setGender(String gender) {
//         this.gender = gender;
//     }
// 
//     public String getAddress() {
//         return address;
//     }
// 
//     public void setAddress(String address) {
//         this.address = address;
//     }
// 
//     public String getPhone() {
//         return phone;
//     }
// 
//     public void setPhone(String phone) {
//         this.phone = phone;
//     }
// 
//     public User transformFrom(LoginResponse response) {
//         this.fullName = response.fullName();
//         this.address = response.address();
//         this.dateOfBirth = response.dateOfBirth();
//         this.gender = response.gender();
//         this.phone = response.phone();
//         return null;
//     }
// }
// 
// Path: impala/src/main/java/hainguyen/impala/util/ContactUtil.java
// public interface ContactUtil {
//     Observable<List<String>> getEmailList(ContentResolver resolver);
// }


// Path: impala/src/main/java/hainguyen/impala/feature/login/presenter/LoginPresenterImpl.java
import android.content.ContentResolver;
import java.util.List;
import javax.inject.Inject;
import hainguyen.impala.application.ApplicationBus;
import hainguyen.impala.application.scheduler.ImpalaScheduler;
import hainguyen.impala.appsenum.Enums;
import hainguyen.impala.data.UserProfile;
import hainguyen.impala.feature.login.view.LoginView;
import hainguyen.impala.injection.helper.ScopeHelper;
import hainguyen.impala.model.User;
import hainguyen.impala.util.ContactUtil;
import rx.Subscriber;
import rx.Subscription;
import rx.subscriptions.CompositeSubscription;

                    }

                    @Override
                    public void onNext(List<String> emails) {
                        loginView.addEmailsToAutoComplete(emails);
                        loginView.showProgress(false);
                    }
                });
        loginSubscriptions.add(contactSubscription);
    }

    @Override
    public void attemptLogin(String email, String password) {
        loginView.clearError();
        loginView.showProgress(true);
        Subscription loginServiceSubscription = userProfile.login(email, password)
                .subscribeOn(ImpalaScheduler.io())
                .observeOn(ImpalaScheduler.mainThread())
                .subscribe(new Subscriber<User>() {
                    @Override
                    public void onCompleted() {
                        //Do nothing
                    }

                    @Override
                    public void onError(Throwable e) {
                        loginView.showProgress(false);
                    }

                    @Override
                    public void onNext(User user) {