Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a706db55 authored by Fahim Salam Chowdhury's avatar Fahim Salam Chowdhury 👽
Browse files

Merge branch '6684-Automatically_pick_murena_account' into 'main'

6684-Automatically_pick_murena_account

See merge request !35
parents 4eb2f7c4 17464134
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -56,7 +56,7 @@ dependencies {
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.6'

    // Nextcloud SSO
    implementation 'foundation.e.lib:Android-SingleSignOn:1.0.3-alpha'
    implementation 'foundation.e.lib:Android-SingleSignOn:1.0.4-alpha'
    implementation ('com.github.stefan-niedermann:android-commons:0.2.7') {
        exclude group: 'com.github.nextcloud', module: 'Android-SingleSignOn'
    }
+39 −0
Original line number Diff line number Diff line
@@ -3,6 +3,8 @@ package it.niedermann.owncloud.notes.importaccount;
import android.accounts.NetworkErrorException;
import android.content.Intent;
import android.os.Bundle;

import it.niedermann.owncloud.notes.main.MainActivity;
import trikita.log.Log;
import android.view.View;

@@ -14,7 +16,9 @@ import androidx.preference.PreferenceManager;
import com.nextcloud.android.sso.AccountImporter;
import com.nextcloud.android.sso.exceptions.AccountImportCancelledException;
import com.nextcloud.android.sso.exceptions.AndroidGetAccountsPermissionNotGranted;
import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountPermissionNotGrantedException;
import com.nextcloud.android.sso.exceptions.NextcloudFilesAppNotInstalledException;
import com.nextcloud.android.sso.exceptions.NextcloudFilesAppNotSupportedException;
import com.nextcloud.android.sso.exceptions.NextcloudHttpRequestFailedException;
import com.nextcloud.android.sso.exceptions.UnknownErrorException;
import com.nextcloud.android.sso.helper.SingleAccountHelper;
@@ -44,6 +48,8 @@ public class ImportAccountActivity extends AppCompatActivity {
    private final ExecutorService executor = Executors.newSingleThreadExecutor();

    private ImportAccountViewModel importAccountViewModel;
    private ImportMurenaAccountViewModel importMurenaAccountViewModel;

    private ActivityImportAccountBinding binding;

    @Override
@@ -54,6 +60,7 @@ public class ImportAccountActivity extends AppCompatActivity {

        binding = ActivityImportAccountBinding.inflate(getLayoutInflater());
        importAccountViewModel = new ViewModelProvider(this).get(ImportAccountViewModel.class);
        importMurenaAccountViewModel = new ViewModelProvider(this).get(ImportMurenaAccountViewModel.class);

        setContentView(binding.getRoot());

@@ -75,6 +82,8 @@ public class ImportAccountActivity extends AppCompatActivity {
                AccountImporter.requestAndroidAccountPermissionsAndPickAccount(this);
            }
        });

        handleAutoMurenaAccountSetup();
    }

    @Override
@@ -111,6 +120,9 @@ public class ImportAccountActivity extends AppCompatActivity {
                                    Log.i(TAG, capabilities.toString());
                                    BrandingUtil.saveBrandColors(ImportAccountActivity.this, capabilities.getColor(), capabilities.getTextColor());
                                    setResult(RESULT_OK);
                                    Intent intent = new Intent(ImportAccountActivity.this, MainActivity.class);
                                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
                                    startActivity(intent);
                                    finish();
                                });
                                SyncWorker.update(ImportAccountActivity.this, PreferenceManager.getDefaultSharedPreferences(ImportAccountActivity.this)
@@ -178,4 +190,31 @@ public class ImportAccountActivity extends AppCompatActivity {
            binding.progressText.setVisibility(View.GONE);
        });
    }

    private void handleAutoMurenaAccountSetup() {
        if (importMurenaAccountViewModel.isMurenaAccountPresent()) {
            binding.addButton.setEnabled(false);
            binding.addButton.setVisibility(View.INVISIBLE);
            binding.status.setVisibility(View.GONE);

            pickMurenaAccount();
        }
    }

    private void pickMurenaAccount() {
        try {
            AccountImporter.pickAccount(this, importMurenaAccountViewModel.getMurenaAccount());
        } catch (NextcloudFilesAppNotInstalledException |
                 NextcloudFilesAppNotSupportedException e) {
            UiExceptionManager.showDialogForException(this, e);
            Log.w(TAG, "=============================================================");
            Log.w(TAG, "Nextcloud app is not installed. Cannot choose account");
            e.printStackTrace();
        } catch (AndroidGetAccountsPermissionNotGranted |
                 NextcloudFilesAppAccountPermissionNotGrantedException e) {
            binding.addButton.setEnabled(true);
            binding.addButton.setVisibility(View.VISIBLE);
            AccountImporter.requestAndroidAccountPermissionsAndPickAccount(this);
        }
    }
}
 No newline at end of file
+70 −0
Original line number Diff line number Diff line
/*
 * Copyright MURENA SAS 2023
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

package it.niedermann.owncloud.notes.importaccount;

import android.accounts.Account;
import android.app.Application;

import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;

import java.util.List;
import java.util.Objects;

import it.niedermann.owncloud.notes.shared.util.AccountSyncUtil;

public class ImportMurenaAccountViewModel extends AndroidViewModel {

    private Account account;

    public ImportMurenaAccountViewModel(@NonNull Application application) {
        super(application);
        retrieveAccount();
    }

    private void retrieveAccount() {
        List<Account> accounts = AccountSyncUtil.getMurenaAccounts(getApplication());

        if (accounts.isEmpty()) {
            return;
        }

        Account murenaAccount = accounts.get(0); // retrieve the first account, as we have policy that one murena account per device

        if (AccountSyncUtil.isSyncEnable(murenaAccount)) {
            account = murenaAccount;
        }
    }

    public boolean isMurenaAccountPresent() {
        return account != null;
    }

    public Account getMurenaAccount() {
        return account;
    }

    public boolean shouldLoadMurenaAccount(List<it.niedermann.owncloud.notes.persistence.entity.Account> noteAccounts) {
        if (!isMurenaAccountPresent()) {
            return false;
        }

        return noteAccounts.stream()
                .filter(Objects::nonNull)
                .noneMatch(noteAccount -> noteAccount.getAccountName().equals(account.name));
    }
}
+11 −3
Original line number Diff line number Diff line
@@ -23,6 +23,8 @@ import android.graphics.PorterDuff;
import android.net.Uri;
import android.os.Bundle;
import android.text.TextUtils;

import it.niedermann.owncloud.notes.importaccount.ImportMurenaAccountViewModel;
import trikita.log.Log;
import android.view.View;

@@ -107,6 +109,8 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
    protected final ExecutorService executor = Executors.newCachedThreadPool();

    protected MainViewModel mainViewModel;

    private ImportMurenaAccountViewModel importMurenaAccountViewModel;
    private CategoryViewModel categoryViewModel;

    private boolean gridView = true;
@@ -142,6 +146,7 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
        super.onCreate(savedInstanceState);

        mainViewModel = new ViewModelProvider(this).get(MainViewModel.class);
        importMurenaAccountViewModel = new ViewModelProvider(this).get(ImportMurenaAccountViewModel.class);
        categoryViewModel = new ViewModelProvider(this).get(CategoryViewModel.class);
        CapabilitiesWorker.update(this);
        binding = DrawerLayoutBinding.inflate(getLayoutInflater());
@@ -160,9 +165,12 @@ public class MainActivity extends LockedActivity implements NoteClickListener, A
        setupNavigationList();
        setupNotesList();

        mainViewModel.getAccountsCount().observe(this, (count) -> {
            if (count == 0) {
                startActivityForResult(new Intent(this, ImportAccountActivity.class), ImportAccountActivity.REQUEST_CODE_IMPORT_ACCOUNT);
        mainViewModel.getAccounts$().observe(this, (accounts) -> {
            if (accounts.isEmpty() || importMurenaAccountViewModel.shouldLoadMurenaAccount(accounts)) {
                Intent intent = new Intent(this, ImportAccountActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
                finish();
            } else {
                executor.submit(() -> {
                    try {
+2 −2
Original line number Diff line number Diff line
@@ -603,8 +603,8 @@ public class MainViewModel extends AndroidViewModel {
        return repo.getLocalModifiedNotes(accountId);
    }

    public LiveData<Integer> getAccountsCount() {
        return repo.countAccounts$();
    public LiveData<List<Account>> getAccounts$() {
        return repo.getAccounts$();
    }

    @WorkerThread
Loading