From 00f331a18fcf1aa8d866256554067eac0f13ac3c Mon Sep 17 00:00:00 2001 From: Shinokuni Date: Thu, 23 May 2019 10:16:44 +0200 Subject: [PATCH] Put account logic in the view model --- .../readrops/app/activities/MainActivity.java | 104 +++++++++--------- .../readrops/app/database/dao/AccountDao.java | 5 +- .../com/readrops/app/utils/DrawerManager.java | 38 +++++-- .../app/viewmodels/MainViewModel.java | 96 +++++++++++++--- 4 files changed, 169 insertions(+), 74 deletions(-) diff --git a/app/src/main/java/com/readrops/app/activities/MainActivity.java b/app/src/main/java/com/readrops/app/activities/MainActivity.java index 830050e5..47eeb1f7 100644 --- a/app/src/main/java/com/readrops/app/activities/MainActivity.java +++ b/app/src/main/java/com/readrops/app/activities/MainActivity.java @@ -48,7 +48,6 @@ import com.readrops.app.viewmodels.MainViewModel; import com.readrops.app.views.MainItemListAdapter; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; @@ -94,9 +93,6 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou private ActionMode actionMode; - private Account currentAccount; - private List accounts; - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -144,43 +140,46 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou }); drawerManager.setHeaderListener((view, profile, current) -> { - int id = (int) profile.getIdentifier(); + if (!current) { + int id = (int) profile.getIdentifier(); - switch (id) { - case DrawerManager.ADD_ACCOUNT_ID: - Intent intent = new Intent(this, AccountTypeListActivity.class); - startActivityForResult(intent, ADD_ACCOUNT_REQUEST); - break; - case DrawerManager.ACCOUNT_SETTINGS_ID: - break; - } - - return true; - }); - - currentAccount = getIntent().getParcelableExtra(ACCOUNT_KEY); - - if (currentAccount != null) { // first account created - drawer = drawerManager.buildDrawer(Collections.singletonList(currentAccount)); - viewModel.setRepository(currentAccount.getAccountType(), getApplication()); - - refreshLayout.setRefreshing(true); - onRefresh(); - - } else { // last current account - viewModel.getAllAccounts().observe(this, accounts -> { - this.accounts = accounts; - - for (Account account1 : accounts) { - if (account1.isCurrentAccount()) { - currentAccount = account1; - break; + switch (id) { + case DrawerManager.ADD_ACCOUNT_ID: + Intent intent = new Intent(this, AccountTypeListActivity.class); + startActivityForResult(intent, ADD_ACCOUNT_REQUEST); + break; + case DrawerManager.ACCOUNT_SETTINGS_ID: + break; + default: + viewModel.setCurrentAccount(id); + updateDrawerFeeds(); + break; } } - viewModel.setRepository(currentAccount.getAccountType(), getApplication()); + return true; + }); - drawerManager.buildDrawer(accounts); + Account currentAccount = getIntent().getParcelableExtra(ACCOUNT_KEY); + + if (currentAccount != null) { // first account created + List accounts = new ArrayList<>(); + accounts.add(currentAccount); + + viewModel.setAccounts(accounts); + + drawer = drawerManager.buildDrawer(accounts); + + if (!viewModel.isAccountLocal()) { + refreshLayout.setRefreshing(true); + onRefresh(); + } + + } else { // last current account + viewModel.getAllAccounts().observe(this, accounts -> { + viewModel.setAccounts(accounts); + + drawer = drawerManager.buildDrawer(accounts); updateDrawerFeeds(); }); } @@ -494,13 +493,15 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou Account newAccount = data.getParcelableExtra(ACCOUNT_KEY); if (newAccount != null) { - currentAccount = newAccount; + viewModel.addAccount(newAccount); - viewModel.setRepository(currentAccount.getAccountType(), getApplication()); - refreshLayout.setRefreshing(true); - onRefresh(); + if (!viewModel.isAccountLocal()) { + refreshLayout.setRefreshing(true); + onRefresh(); + } - //drawerManager. + drawerManager.resetItems(); + drawerManager.addAccount(newAccount); } } @@ -510,19 +511,20 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou } private void sync(List feeds) { - if (currentAccount.getLogin() == null) - currentAccount.setLogin(SharedPreferencesManager.readString(this, currentAccount.getLoginKey())); + Account account = viewModel.getCurrentAccount(); + if (account.getLogin() == null) + account.setLogin(SharedPreferencesManager.readString(this, account.getLoginKey())); - if (currentAccount.getPassword() == null) - currentAccount.setPassword(SharedPreferencesManager.readString(this, currentAccount.getPasswordKey())); + if (viewModel.getCurrentAccount().getPassword() == null) + account.setPassword(SharedPreferencesManager.readString(this, account.getPasswordKey())); - viewModel.sync(feeds, currentAccount) + viewModel.sync(feeds, account) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer() { @Override public void onSubscribe(Disposable d) { - if (isAccountLocal() && feedNb > 0) { + if (viewModel.isAccountLocal() && feedNb > 0) { syncProgressLayout.setVisibility(View.VISIBLE); syncProgressBar.setProgress(0); } @@ -530,7 +532,7 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou @Override public void onNext(Feed feed) { - if (isAccountLocal() && feedNb > 0) { + if (viewModel.isAccountLocal() && feedNb > 0) { syncProgress.setText(getString(R.string.updating_feed, feed.getName())); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { syncProgressBar.setProgress((feedCount * 100) / feedNb, true); @@ -551,7 +553,7 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou @Override public void onComplete() { - if (isAccountLocal() && feedNb > 0) { + if (viewModel.isAccountLocal() && feedNb > 0) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) syncProgressBar.setProgress(100, true); else @@ -570,9 +572,7 @@ public class MainActivity extends AppCompatActivity implements SwipeRefreshLayou }); } - private boolean isAccountLocal() { - return currentAccount.getAccountType() == Account.AccountType.LOCAL; - } + @Override public boolean onCreateOptionsMenu(Menu menu) { diff --git a/app/src/main/java/com/readrops/app/database/dao/AccountDao.java b/app/src/main/java/com/readrops/app/database/dao/AccountDao.java index c4f6d3ac..a3827916 100644 --- a/app/src/main/java/com/readrops/app/database/dao/AccountDao.java +++ b/app/src/main/java/com/readrops/app/database/dao/AccountDao.java @@ -28,7 +28,10 @@ public interface AccountDao { void updateLastModified(int accountId, long lastModified); @Query("Update Account set current_account = 0 Where id Not In (:accountId)") - void setCurrentAccountsToFalse(int accountId); + void deselectOldCurrentAccount(int accountId); + + @Query("Update Account set current_account = 1 Where id = :accountId") + void setCurrentAccount(int accountId); @Query("Select count(*) From Account Where account_type = :accounType") Integer getAccountCountByType(int accounType); diff --git a/app/src/main/java/com/readrops/app/utils/DrawerManager.java b/app/src/main/java/com/readrops/app/utils/DrawerManager.java index 41ed728e..61a0a6cd 100644 --- a/app/src/main/java/com/readrops/app/utils/DrawerManager.java +++ b/app/src/main/java/com/readrops/app/utils/DrawerManager.java @@ -29,10 +29,10 @@ import static com.readrops.app.utils.Utils.drawableWithColor; public class DrawerManager { - public static final int ARTICLES_ITEM_ID = 1; - public static final int READ_LATER_ID = 2; - public static final int ACCOUNT_SETTINGS_ID = 3; - public static final int ADD_ACCOUNT_ID = 4; + public static final int ARTICLES_ITEM_ID = -1; + public static final int READ_LATER_ID = -2; + public static final int ACCOUNT_SETTINGS_ID = -3; + public static final int ADD_ACCOUNT_ID = -4; private Activity activity; private Toolbar toolbar; @@ -125,15 +125,15 @@ public class DrawerManager { private void createAccountHeader(List accounts) { ProfileDrawerItem[] profileItems = new ProfileDrawerItem[accounts.size()]; + int currentAccountId = 1; for (int i = 0; i < accounts.size(); i++) { Account account = accounts.get(i); - ProfileDrawerItem profileItem = new ProfileDrawerItem() - .withIcon(Account.getLogoFromAccountType(account.getAccountType())) - .withName(account.getDisplayedName()) - .withEmail(account.getAccountName()); + if (account.isCurrentAccount()) + currentAccountId = account.getId(); + ProfileDrawerItem profileItem = createProfileItem(account); profileItems[i] = profileItem; } @@ -159,6 +159,16 @@ public class DrawerManager { .withHeaderBackgroundScaleType(ImageView.ScaleType.CENTER_CROP) .withOnAccountHeaderListener(headerListener) .build(); + + header.setActiveProfile(currentAccountId); + } + + private ProfileDrawerItem createProfileItem(Account account) { + return new ProfileDrawerItem() + .withIcon(Account.getLogoFromAccountType(account.getAccountType())) + .withName(account.getDisplayedName()) + .withEmail(account.getAccountName()) + .withIdentifier(account.getId()); } private void addDefaultPlaces() { @@ -178,4 +188,16 @@ public class DrawerManager { drawer.addItem(toReadLater); drawer.addItem(new DividerDrawerItem()); } + + public void addAccount(Account account) { + ProfileDrawerItem profileItem = createProfileItem(account); + + header.addProfiles(profileItem); + header.setActiveProfile(profileItem.getIdentifier()); + } + + public void resetItems() { + drawer.removeAllItems(); + addDefaultPlaces(); + } } diff --git a/app/src/main/java/com/readrops/app/viewmodels/MainViewModel.java b/app/src/main/java/com/readrops/app/viewmodels/MainViewModel.java index d19fee72..16f0e4a7 100644 --- a/app/src/main/java/com/readrops/app/viewmodels/MainViewModel.java +++ b/app/src/main/java/com/readrops/app/viewmodels/MainViewModel.java @@ -21,6 +21,7 @@ import com.readrops.app.repositories.LocalFeedRepository; import com.readrops.app.repositories.NextNewsRepository; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -28,6 +29,8 @@ import java.util.TreeMap; import io.reactivex.Completable; import io.reactivex.Observable; import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; public class MainViewModel extends AndroidViewModel { @@ -38,6 +41,9 @@ public class MainViewModel extends AndroidViewModel { private ItemsListQueryBuilder queryBuilder; + private Account currentAccount; + private List accounts; + public MainViewModel(@NonNull Application application) { super(application); @@ -52,13 +58,15 @@ public class MainViewModel extends AndroidViewModel { itemsWithFeed = new MediatorLiveData<>(); } - public void setRepository(Account.AccountType accountType, Application application) { + //region main query + + private void setRepository(Account.AccountType accountType) { switch (accountType) { case LOCAL: - repository = new LocalFeedRepository(application); + repository = new LocalFeedRepository(getApplication()); break; case NEXTCLOUD_NEWS: - repository = new NextNewsRepository(application); + repository = new NextNewsRepository(getApplication()); break; } } @@ -69,10 +77,10 @@ public class MainViewModel extends AndroidViewModel { lastFetch = new LivePagedListBuilder<>(db.itemDao().selectAll(queryBuilder.getQuery()), new PagedList.Config.Builder() - .setPageSize(40) - .setPrefetchDistance(80) - .setEnablePlaceholders(false) - .build()) + .setPageSize(40) + .setPrefetchDistance(80) + .setEnablePlaceholders(false) + .build()) .build(); itemsWithFeed.addSource(lastFetch, itemWithFeeds -> itemsWithFeed.setValue(itemWithFeeds)); @@ -109,7 +117,7 @@ public class MainViewModel extends AndroidViewModel { public void setFilterFeedId(int filterFeedId) { queryBuilder.setFilterFeedId(filterFeedId); } - + public MediatorLiveData> getItemsWithFeed() { return itemsWithFeed; } @@ -142,21 +150,81 @@ public class MainViewModel extends AndroidViewModel { }); } - public LiveData getCurrentAccount() { - return db.accountDao().selectCurrentAccount(); - } + //endregion + + //region Account public LiveData> getAllAccounts() { return db.accountDao().selectAll(); } - public Completable setCurrentAccountsToFalse(int accountId) { + private Completable deselectOldCurrentAccount(int accountId) { return Completable.create(emitter -> { - db.accountDao().setCurrentAccountsToFalse(accountId); + db.accountDao().deselectOldCurrentAccount(accountId); emitter.onComplete(); }); } + private Account getAccount(int id) { + for (Account account : accounts) { + if (account.getId() == id) + return account; + } + + return null; + } + + public void addAccount(Account account) { + accounts.add(account); + setCurrentAccount(account); + } + + public Account getCurrentAccount() { + return currentAccount; + } + + public void setCurrentAccount(Account currentAccount) { + this.currentAccount = currentAccount; + setRepository(currentAccount.getAccountType()); + + // set the new account as the current one + Completable setCurrentAccount = Completable.create(emitter -> { + db.accountDao().setCurrentAccount(currentAccount.getId()); + emitter.onComplete(); + }); + + Completable.concat(Arrays.asList(setCurrentAccount, deselectOldCurrentAccount(currentAccount.getId()))) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(); + } + + public void setCurrentAccount(int id) { + setCurrentAccount(getAccount(id)); + } + + + public void setAccounts(List accounts) { + this.accounts = accounts; + + for (Account account1 : accounts) { + if (account1.isCurrentAccount()) { + currentAccount = account1; + setRepository(currentAccount.getAccountType()); + break; + } + } + } + + public boolean isAccountLocal() { + return currentAccount.getAccountType() == Account.AccountType.LOCAL; + } + + //endregion + + + //region Item read state + public Completable setItemReadState(int itemId, boolean read, boolean readChanged) { return Completable.create(emitter -> { db.itemDao().setReadState(itemId, read ? 1 : 0, readChanged ? 1 : 0); @@ -197,4 +265,6 @@ public class MainViewModel extends AndroidViewModel { READ_IT_LATER_FILTER, NO_FILTER } + + //endregion }