diff --git a/app/src/main/java/fi/bitrite/android/ws/auth/AccountManager.java b/app/src/main/java/fi/bitrite/android/ws/auth/AccountManager.java index 30ad2c96..e87e97aa 100644 --- a/app/src/main/java/fi/bitrite/android/ws/auth/AccountManager.java +++ b/app/src/main/java/fi/bitrite/android/ws/auth/AccountManager.java @@ -22,6 +22,7 @@ import fi.bitrite.android.ws.api.WarmshowersWebservice; import fi.bitrite.android.ws.api.response.LoginResponse; import fi.bitrite.android.ws.di.AppScope; +import fi.bitrite.android.ws.repository.UserRepository; import fi.bitrite.android.ws.ui.MainActivity; import fi.bitrite.android.ws.util.MaybeNull; import io.reactivex.Maybe; @@ -44,8 +45,9 @@ public class AccountManager { private final WarmshowersWebservice mGeneralWebservice; private final android.accounts.AccountManager mAndroidAccountManager; - private final ReentrantReadWriteLock mLock = new ReentrantReadWriteLock(); + private final UserRepository.AppUserRepository mAppUserRepository; + private final ReentrantReadWriteLock mLock = new ReentrantReadWriteLock(); private final BehaviorSubject mAccounts = BehaviorSubject.create(); private final BehaviorSubject> mCurrentAccount = BehaviorSubject.create(); private final Observable mCurrentUserId; @@ -55,9 +57,11 @@ public class AccountManager { @Inject AccountManager(WarmshowersWebservice generalWebservice, - android.accounts.AccountManager androidAccountManager) { + android.accounts.AccountManager androidAccountManager, + UserRepository.AppUserRepository appUserRepository) { mGeneralWebservice = generalWebservice; mAndroidAccountManager = androidAccountManager; + mAppUserRepository = appUserRepository; mAndroidAccountManager.addOnAccountsUpdatedListener( accounts_unused -> handleAccountUpdate(), null, false); @@ -304,6 +308,18 @@ private void dismissEventuallyCreateOrAuth() { public Observable login(String username, String password) { return mGeneralWebservice.login(username, password) .subscribeOn(Schedulers.io()) + .flatMap(response -> { + if (response.isSuccessful()) { + // Stores the account in the repository. With this it is already available + // without the need of any further network accesses. + return mAppUserRepository.save(response.body().user.toUser()) + .toSingle(() -> response) + .toObservable(); + + } else { + return Observable.just(response); + } + }) .map(response -> { if (!response.isSuccessful()) { return new LoginResult(response); diff --git a/app/src/main/java/fi/bitrite/android/ws/repository/UserRepository.java b/app/src/main/java/fi/bitrite/android/ws/repository/UserRepository.java index 7a125cd1..27555508 100644 --- a/app/src/main/java/fi/bitrite/android/ws/repository/UserRepository.java +++ b/app/src/main/java/fi/bitrite/android/ws/repository/UserRepository.java @@ -53,7 +53,7 @@ public Observable> get(int userId, Repository.ShouldSaveInDb shou } public Completable save(@NonNull User user) { - return getAppUserRepository().saveRx(user.id, user); + return getAppUserRepository().save(user); } public Observable> searchByKeyword(String keyword) { @@ -81,7 +81,7 @@ private AppUserRepository getAppUserRepository() { * users. */ @AppScope - static class AppUserRepository extends Repository { + public static class AppUserRepository extends Repository { @Inject UserDao mUserDao; WarmshowersAccountWebservice mLastWebservice; @@ -98,6 +98,10 @@ List>> get(@NonNull Collection userIds, return users; } + public Completable save(@NonNull User user) { + return saveRx(user.id, user); + } + @Override void saveInDb(int id, @NonNull User user) { mUserDao.save(user);