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

Commit a0304e74 authored by Vincent Bourgmayer's avatar Vincent Bourgmayer
Browse files

[eDrive] Prevent NPE & refactoring

parent 34292dfe
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ public class AccountsActivity extends AppCompatActivity {
        final AccountManager accountManager = AccountManager.get(this);
        final Account account = CommonUtils.getAccount(getString(R.string.eelo_account_type),
                accountManager);
        final OwnCloudClient client = DavClientProvider.getInstance().getClientInstance(account, this);


        final String usedQuota = accountManager.getUserData(account, ACCOUNT_DATA_USED_QUOTA_KEY);
        final String totalQuota = accountManager.getUserData(account, ACCOUNT_DATA_TOTAL_QUOTA_KEY);
@@ -156,6 +156,8 @@ public class AccountsActivity extends AppCompatActivity {
            }
        });

        final OwnCloudClient client = DavClientProvider.getInstance().getClientInstance(account, this);
        if (client != null) {
            Glide.with(this)
                    .load(client.getBaseUri() + NON_OFFICIAL_AVATAR_PATH
                            + client.getCredentials().getUsername() + "/" + 300)
@@ -164,3 +166,4 @@ public class AccountsActivity extends AppCompatActivity {
            binding.avatar.setVisibility(View.VISIBLE);
        }
    }
}
 No newline at end of file
+4 −0
Original line number Diff line number Diff line
@@ -159,6 +159,10 @@ public class UploadFileOperation extends RemoteOperation {
        }

        final NextcloudClient ncClient = DavClientProvider.getInstance().getNcClientInstance(account, context);
        if (ncClient == null) {
            return ResultCode.ACCOUNT_EXCEPTION;
        }

        final RemoteOperationResult checkQuotaResult = checkAvailableSpace(ncClient, file.length());
        if (checkQuotaResult.getCode() != ResultCode.OK) {
            Timber.d("Impossible to check quota. Cancels upload of %s", syncedState.getLocalPath());
+10 −1
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ public class SynchronizationService extends Service implements OnRemoteOperation
        Timber.tag(SynchronizationService.class.getSimpleName());
    }

    @SuppressWarnings("deprecation") //for OwnCloudClient
    @Override
    public int onStartCommand(@NonNull Intent intent, int flags, int startId) {
        Timber.v("onStartCommand()");
@@ -89,8 +90,11 @@ public class SynchronizationService extends Service implements OnRemoteOperation
        syncRequestQueue = new ConcurrentLinkedDeque<>();
        startedSync = new ConcurrentHashMap<>();
        threadPool = new Thread[workerAmount];
        //noinspection deprecation

        ocClient = DavClientProvider.getInstance().getClientInstance(account, getApplicationContext());
        if (ocClient == null) {
            Timber.w("ocClient is null");
        }

        handlerThread = new HandlerThread("syncService_onResponse");
        handlerThread.start();
@@ -224,6 +228,11 @@ public class SynchronizationService extends Service implements OnRemoteOperation
    }

    private void startWorker(int threadIndex) {
        if (ocClient == null) {
            Timber.w("Can't start sync thread: ocClient is null"); 
            return;
        }

        if (!isNetworkAvailable()) {
            Timber.d("No network available: Clear syncRequestQueue");
            syncRequestQueue.clear();
+67 −42
Original line number Diff line number Diff line
/*
 * Copyright © CLEUS SAS 2019.
 * Copyright © MURENA SAS 2023
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Public License v3.0
@@ -30,6 +31,7 @@ import timber.log.Timber;
/**
 * @author Vincent Bourgmayer
 */
@SuppressWarnings({"deprecation", "DeprecatedIsStillUsed"})
public class DavClientProvider {

    private final static DavClientProvider instance = new DavClientProvider();
@@ -43,67 +45,90 @@ public class DavClientProvider {
    private NextcloudClient ncClientInstance;

    @Nullable
    public OwnCloudClient getClientInstance(@Nullable final Account account, @NonNull final Context ctx) {
    public OwnCloudClient getClientInstance(@Nullable final Account account, @NonNull final Context context) {
        if (account == null) return null;

        if (ocClientInstance == null) {
            try {
                //Not sure below if code is used...
                if (!AppConstants.USER_AGENT.equals(OwnCloudClientManagerFactory.getUserAgent())) {
                    OwnCloudClientManagerFactory.setUserAgent(AppConstants.USER_AGENT);
            ocClientInstance = createOcClient(account, context);
        }
                final Uri serverUri = Uri.parse(AccountUtils.getBaseUrlForAccount(ctx, account));

                ocClientInstance = OwnCloudClientFactory.createOwnCloudClient(serverUri, ctx, true);
                final String pwd = getAcountPwd(account, ctx);
                Timber.v("name: %s \n%s", account.name, AccountManager.get(ctx).getUserData(account, AccountUtils.Constants.KEY_USER_ID));
        return ocClientInstance;
    }

                ocClientInstance.setCredentials(new OwnCloudBasicCredentials(account.name, pwd));
            } catch (AccountUtils.AccountNotFoundException exception) {
                Timber.e(exception);
                return null;

    @Nullable
    public NextcloudClient getNcClientInstance(@Nullable final Account account, @NonNull final Context context) {
        if (account == null) return null;

        if (ncClientInstance == null) {
            ncClientInstance = createNcClient(account, context);
        }
        return ncClientInstance;
    }

        if (ocClientInstance.getUserId() == null ) {
            final String userId = AccountManager.get(ctx).getUserData(account, AppConstants.ACCOUNT_USER_ID_KEY);
            ocClientInstance.setUserId(userId);
    public void cleanUp() {
        ncClientInstance = null;
        ocClientInstance = null;
    }

        return ocClientInstance;
    @NonNull
    public static DavClientProvider getInstance() {
        return instance;
    }

    @Nullable
    private OwnCloudBasicCredentials getOcCredentials(@NonNull Account account, @NonNull Context context) throws AccountUtils.AccountNotFoundException {
        final String pwd = AccountManager.get(context).getPassword(account);
        if (pwd == null) return null;
        return new OwnCloudBasicCredentials(account.name, pwd);
    }

    @Nullable
    public NextcloudClient getNcClientInstance(@Nullable final Account account, @NonNull final Context ctx) {
        Timber.v("getNcClientInstance()");
        if (ncClientInstance == null) {
    private OwnCloudClient createOcClient(@NonNull Account account, @NonNull Context context) {
        OwnCloudClientManagerFactory.setUserAgent(AppConstants.USER_AGENT);
        final OwnCloudClient result;
        try {
                final Uri serverUri = Uri.parse(AccountUtils.getBaseUrlForAccount(ctx, account));
                final String credentials = OkHttpCredentialsUtil.basic(account.name, getAcountPwd(account, ctx));
            final OwnCloudBasicCredentials credentials = getOcCredentials(account, context);
            if (credentials == null) return null;

                ncClientInstance = OwnCloudClientFactory.createNextcloudClient(serverUri, account.name, credentials, ctx, true);
            final Uri serverUri = Uri.parse(AccountUtils.getBaseUrlForAccount(context, account));
            result = OwnCloudClientFactory.createOwnCloudClient(serverUri, context, true);
            result.setCredentials(credentials);
        } catch (AccountUtils.AccountNotFoundException exception) {
                Timber.e("Can't get server URI for account: %s\n%s", account.name,exception.getMessage());
            Timber.e(exception);
            return null;
        }
            ncClientInstance.setUserId(account.name);
        }
        return ncClientInstance;

        if (result.getUserId() == null) {
            final String userId = AccountManager.get(context).getUserData(account, AppConstants.ACCOUNT_USER_ID_KEY);
            result.setUserId(userId);
        }

    public void cleanUp() {
        ncClientInstance = null;
        ocClientInstance = null;
        return result;
    }


    @Nullable
    private static String getAcountPwd(Account account, Context ctx) throws AccountUtils.AccountNotFoundException {
        return AccountManager.get(ctx).getPassword(account);
    private String getNcCredentials(@NonNull Account account, @NonNull Context context) throws AccountUtils.AccountNotFoundException {
        final String pwd = AccountManager.get(context).getPassword(account);
        if (pwd == null) return null;
        return OkHttpCredentialsUtil.basic(account.name, pwd);
    }

    /** Point d'accès pour l'instance unique du singleton */
    @NonNull
    public static DavClientProvider getInstance()
    {
        return instance;
    @Nullable
    private NextcloudClient createNcClient(@NonNull Account account, @NonNull Context context) {
        final NextcloudClient result;
        try {
            final String credentials = getNcCredentials(account, context);
            if (credentials == null) return null;

            final Uri serverUri = Uri.parse(AccountUtils.getBaseUrlForAccount(context, account));
            result = OwnCloudClientFactory.createNextcloudClient(serverUri, account.name, credentials, context, true);
        } catch (AccountUtils.AccountNotFoundException exception) {
            Timber.e("Can't get server URI for account: %s\n%s", account.name, exception.getMessage());
            return null;
        }
        result.setUserId(account.name);
        return result;
    }
}
 No newline at end of file
+8 −7
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ public class ServiceExceptionHandler implements UncaughtExceptionHandler{
    public final static String CRASH_LOG_FOLDER = "crash-logs";
    public final static String LOG_FILE_NAME_PREFIX = "eDrive-crash-";
    public final static String LOG_FILE_EXTENSION = ".log";
    private UncaughtExceptionHandler defaultUEH;
    private final UncaughtExceptionHandler defaultUEH;

    Service service;

@@ -51,7 +51,7 @@ public class ServiceExceptionHandler implements UncaughtExceptionHandler{

        if (isExternalStorageAvailable() && !isExternalStorageReadOnly()) {

            final Long timestamp = System.currentTimeMillis();
            final long timestamp = System.currentTimeMillis();

            final String fileName = LOG_FILE_NAME_PREFIX+timestamp+LOG_FILE_EXTENSION;

@@ -90,6 +90,7 @@ public class ServiceExceptionHandler implements UncaughtExceptionHandler{
     * @param exception the exception
     * @return the Stacktrace as a string
     */
    @NonNull
    private String getStackTraceAsString(Throwable exception) {
        final StringWriter sw = new StringWriter();
        final PrintWriter pw = new PrintWriter(sw);
Loading