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

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

Only one syncRequest per file in SynchronizationService's queue [Part 1]

parent 839d55ff
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -32,7 +32,9 @@ public class SyncRequest {
    @Override
    public boolean equals(@Nullable Object obj) {
        if (obj instanceof SyncRequest) {
            return (syncedFileState.getId() == ((SyncRequest) obj).syncedFileState.getId() );
            final SyncedFileState objFileState = ((SyncRequest) obj).syncedFileState;
            return (syncedFileState.getLocalPath().equals(objFileState.getLocalPath()) ||
                    syncedFileState.getRemotePath().equals(objFileState.getRemotePath()));
        }
        return super.equals(obj);
    }
+22 −23
Original line number Diff line number Diff line
@@ -9,9 +9,6 @@ package foundation.e.drive.services;

import android.accounts.Account;
import android.accounts.AccountManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
@@ -24,7 +21,6 @@ import android.os.Message;
import android.util.Log;

import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;

import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
@@ -37,7 +33,6 @@ import java.util.Collection;
import java.util.Hashtable;
import java.util.concurrent.ConcurrentLinkedDeque;

import foundation.e.drive.R;
import foundation.e.drive.database.DbHelper;
import foundation.e.drive.models.DownloadRequest;
import foundation.e.drive.models.SyncRequest;
@@ -56,7 +51,7 @@ public class SynchronizationService extends Service implements OnRemoteOperation
    private final static String TAG = SynchronizationService.class.getSimpleName();
    private final SynchronizationBinder binder = new SynchronizationBinder();

    private ConcurrentLinkedDeque<SyncRequest> syncedRequestQueue;
    private ConcurrentLinkedDeque<SyncRequest> syncRequestQueue;
    private Hashtable<RemoteOperation, Integer> startedOperations; //Operations which are running
    private Account account;
    private final int workerAmount = 4;
@@ -80,7 +75,7 @@ public class SynchronizationService extends Service implements OnRemoteOperation
            return START_NOT_STICKY;
        }

        syncedRequestQueue = new ConcurrentLinkedDeque<>();
        syncRequestQueue = new ConcurrentLinkedDeque<>();
        startedOperations = new Hashtable<>();
        threadPool = new Thread[workerAmount];
        threadWorkingState = new boolean[workerAmount];
@@ -101,12 +96,14 @@ public class SynchronizationService extends Service implements OnRemoteOperation
        Log.w(TAG, "System is low on memory. Service might get killed.");
    }

    public boolean queueOperation(SyncRequest request){
        return syncedRequestQueue.add(request);
    public void queueOperation(SyncRequest request){
            syncRequestQueue.remove(request);
            syncRequestQueue.add(request);
    }

    public boolean queueOperations(Collection<SyncRequest> requests){
        return syncedRequestQueue.addAll(requests);
    public void queueOperations(Collection<SyncRequest> requests){
            syncRequestQueue.removeAll(requests);
            syncRequestQueue.addAll(requests);
    }

    public void startSynchronization(){
@@ -117,11 +114,14 @@ public class SynchronizationService extends Service implements OnRemoteOperation
    }

    private void startWorker(int threadIndex){
        if (syncedRequestQueue.isEmpty()) return;
        final boolean meteredNetworkAllowed = CommonUtils.isMeteredNetworkAllowed(account);
        if (!threadWorkingState[threadIndex] && CommonUtils.haveNetworkConnection(getApplicationContext(), meteredNetworkAllowed)) { //check if the thread corresponding to threadIndex isn't already working
        if (threadWorkingState[threadIndex]
                || !CommonUtils.haveNetworkConnection(getApplicationContext(), meteredNetworkAllowed)) {
            return;
        }

            final SyncRequest request = this.syncedRequestQueue.poll(); //return null if deque is empty
        final SyncRequest request = this.syncRequestQueue.poll(); //return null if empty
        if (request == null)  return;

        final RemoteOperation operation = this.createRemoteOperation(request);

@@ -136,7 +136,6 @@ public class SynchronizationService extends Service implements OnRemoteOperation
            }
        }
    }
    }

    @Override
    public void onRemoteOperationFinish(RemoteOperation callerOperation, RemoteOperationResult result) {