Skip to content
Merged
Prev Previous commit
Next Next commit
Use non nullable account in session mix
Signed-off-by: alperozturk <[email protected]>
  • Loading branch information
alperozturk96 authored and backportbot[bot] committed Jun 13, 2024
commit 1744c54c797346dcf35ae023ccf6e1015ab476bb
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public interface CurrentAccountProvider {
* @return Currently selected {@link Account} or first valid {@link Account} registered in OS or null, if not available at all.
*/
@Deprecated
@Nullable
@NonNull
Account getCurrentAccount();

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,10 @@
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

import javax.inject.Inject;

Expand All @@ -50,6 +52,7 @@ public class UserAccountManagerImpl implements UserAccountManager {

private static final String TAG = UserAccountManagerImpl.class.getSimpleName();
private static final String PREF_SELECT_OC_ACCOUNT = "select_oc_account";
@Inject ArbitraryDataProvider arbitraryDataProvider;

private Context context;
private AccountManager accountManager;
Expand Down Expand Up @@ -131,37 +134,28 @@ public boolean exists(Account account) {
}

@Override
@Nullable
@NonNull
public Account getCurrentAccount() {
Account[] ocAccounts = getAccounts();
Account defaultAccount = null;

ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProviderImpl(context);

SharedPreferences appPreferences = PreferenceManager.getDefaultSharedPreferences(context);
String accountName = appPreferences.getString(PREF_SELECT_OC_ACCOUNT, null);

// account validation: the saved account MUST be in the list of ownCloud Accounts known by the AccountManager
if (accountName != null) {
for (Account account : ocAccounts) {
if (account.name.equals(accountName)) {
defaultAccount = account;
break;
}
}
Account defaultAccount = Arrays.stream(ocAccounts)
.filter(account -> account.name.equals(accountName))
.findFirst()
.orElse(null);

// take first which is not pending for removal account as fallback
if (defaultAccount == null) {
defaultAccount = Arrays.stream(ocAccounts)
.filter(account -> !arbitraryDataProvider.getBooleanValue(account.name, PENDING_FOR_REMOVAL))
.findFirst()
.orElse(null);
}

if (defaultAccount == null && ocAccounts.length > 0) {
// take first which is not pending for removal account as fallback
for (Account account: ocAccounts) {
boolean pendingForRemoval = arbitraryDataProvider.getBooleanValue(account.name,
PENDING_FOR_REMOVAL);

if (!pendingForRemoval) {
defaultAccount = account;
break;
}
}
if (defaultAccount == null) {
defaultAccount = ocAccounts[0];
}

return defaultAccount;
Expand Down
28 changes: 7 additions & 21 deletions app/src/main/java/com/nextcloud/client/mixins/SessionMixin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,16 @@ class SessionMixin(
private val activity: Activity,
private val accountManager: UserAccountManager
) : ActivityMixin {
var currentAccount: Account? = null
lateinit var currentAccount: Account
private set

val capabilities: OCCapability?
get() = getUser()
.map { CapabilityUtils.getCapability(it, activity) }
.orElse(null)

fun setAccount(account: Account?) {
val validAccount = (account != null && accountManager.setCurrentOwnCloudAccount(account.name))
fun setAccount(account: Account) {
val validAccount = (accountManager.setCurrentOwnCloudAccount(account.name))

currentAccount = if (validAccount) {
account
Expand All @@ -51,7 +51,6 @@ class SessionMixin(
}

fun getUser(): Optional<User> = when (val it = this.currentAccount) {
null -> Optional.empty()
else -> accountManager.getUser(it.name)
}

Expand All @@ -61,15 +60,9 @@ class SessionMixin(
* If no valid ownCloud [Account] exists, then the user is requested
* to create a new ownCloud [Account].
*/
private fun getDefaultAccount(): Account? {
private fun getDefaultAccount(): Account {
// default to the most recently used account
val newAccount = accountManager.currentAccount
if (newAccount == null) {
// no account available: force account creation
startAccountCreation()
}

return newAccount
return accountManager.currentAccount
}

/**
Expand All @@ -83,7 +76,7 @@ class SessionMixin(
super.onNewIntent(intent)
val current = accountManager.currentAccount
val currentAccount = this.currentAccount
if (current != null && currentAccount != null && !currentAccount.name.equals(current.name)) {
if (!currentAccount.name.equals(current.name)) {
this.currentAccount = current
}
}
Expand All @@ -94,7 +87,7 @@ class SessionMixin(
*/
override fun onRestart() {
super.onRestart()
val validAccount = currentAccount != null && accountManager.exists(currentAccount)
val validAccount = accountManager.exists(currentAccount)
if (!validAccount) {
getDefaultAccount()
}
Expand All @@ -105,11 +98,4 @@ class SessionMixin(
val account = accountManager.currentAccount
setAccount(account)
}

override fun onResume() {
super.onResume()
if (currentAccount == null) {
getDefaultAccount()
}
}
}