Loading app/src/main/java/foundation/e/drive/periodicScan/FullScanWorker.kt +10 −3 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ class FullScanWorker(private val context: Context, private val workerParams: Wor } override fun doWork(): Result { Timber.d("Fahim: FullScanWorker.doWork()") try { val requestCollector: SyncRequestCollector = SyncProxy Loading @@ -58,27 +59,31 @@ class FullScanWorker(private val context: Context, private val workerParams: Wor return Result.failure() } // Get list of syncable folders from Database val syncFolders = loadSyncedFolders(account!!) if (syncFolders.isEmpty()) { requestCollector.startListeningFiles(applicationContext as Application) return Result.success() } //Run scanning process for remote files val remoteSyncRequests = scanRemoteFiles(account, syncFolders.toMutableList()) syncRequests.putAll(remoteSyncRequests) Timber.d("${remoteSyncRequests.size} request collected from cloud") Timber.d("Fahim: ${remoteSyncRequests.size} request collected from cloud") //Run scanning process for local files val localSyncRequests = scanLocalFiles(syncFolders.toMutableList()) syncRequests.putAll(localSyncRequests) Timber.d("${localSyncRequests.size} request collected from device") Timber.d("Fahim: ${localSyncRequests.size} request collected from device") prefs.edit() .putLong(KEY_LAST_SCAN_TIME, System.currentTimeMillis()) .apply(); if (syncRequests.isEmpty()) { Timber.d("Nothing to sync") Timber.d("Fahim: FullScanWorker.doWork(): Nothing to sync") requestCollector.startListeningFiles(applicationContext as Application) return Result.success() } Loading Loading @@ -184,6 +189,7 @@ class FullScanWorker(private val context: Context, private val workerParams: Wor * generate SyncRequest for files on the cloud */ private fun scanRemoteFiles(account: Account, syncedFolders: List<SyncedFolder>): HashMap<Int, SyncRequest> { Timber.d("--> Fahim: FullScanWorker.scanRemoteFiles") val ocClient = DavClientProvider.getInstance().getClientInstance(account, context)?: return HashMap() val listRemoteFilesOperation = ListFileRemoteOperation( Loading @@ -193,6 +199,7 @@ class FullScanWorker(private val context: Context, private val workerParams: Wor try { @Suppress("DEPRECATION") //List all files from remote Folder val result = listRemoteFilesOperation.execute(ocClient) as RemoteOperationResult<ArrayList<RemoteFile>> if (!result.isSuccess) { Timber.d("Fails to check remote files") Loading app/src/main/java/foundation/e/drive/periodicScan/ListFileRemoteOperation.java +2 −0 Original line number Diff line number Diff line Loading @@ -52,6 +52,8 @@ public class ListFileRemoteOperation extends RemoteOperation<ArrayList<RemoteFil @Override @NonNull protected RemoteOperationResult<ArrayList<RemoteFile>> run(@NonNull OwnCloudClient ownCloudClient) { Timber.d("----> Fahim: ListFileRemoteOperation.run()"); final RemoteFileLister fileLister = new RemoteFileLister(syncedFolders, ownCloudClient); final boolean isContentToScan = fileLister.listContentToScan(context); Loading app/src/main/java/foundation/e/drive/periodicScan/PeriodicScanWorker.java +2 −1 Original line number Diff line number Diff line Loading @@ -39,12 +39,13 @@ public class PeriodicScanWorker extends Worker { @NonNull @Override public Result doWork() { Timber.d("Fahim: PeriodicScanWorker: doWork() "); try { final WorkManager workManager = WorkManager.getInstance(getApplicationContext()); final WorkRequestFactory workRequestFactory = WorkRequestFactory.INSTANCE; final List<OneTimeWorkRequest> workRequestsLists = new ArrayList<>(); workRequestsLists.add(workRequestFactory.createOneTimeWorkRequest(OneTimeWorkType.LIST_APPS, null)); //workRequestsLists.add(workRequestFactory.createOneTimeWorkRequest(OneTimeWorkType.LIST_APPS, null)); workRequestsLists.add(workRequestFactory.createOneTimeWorkRequest(OneTimeWorkType.FULL_SCAN, null)); workManager.beginUniqueWork(FullScanWorker.UNIQUE_WORK_NAME, ExistingWorkPolicy.KEEP, workRequestsLists) Loading app/src/main/java/foundation/e/drive/periodicScan/contentScanner/AbstractFileLister.java +23 −2 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.owncloud.android.lib.resources.files.FileUtils; import com.owncloud.android.lib.resources.files.model.RemoteFile; import java.util.ArrayList; import java.util.List; Loading Loading @@ -92,16 +93,20 @@ public abstract class AbstractFileLister <T> { * @return */ public boolean listContentToScan(@NonNull Context context) { //List files that need to be synchronized final ListIterator<SyncedFolder> iterator = folders.listIterator() ; boolean isSomeContentToSync = false; //Loop over synced folder while (iterator.hasNext()) { final SyncedFolder syncedFolder = iterator.next(); if (syncedFolder == null) continue; Timber.v("SyncedFolder : %s, %s, %s, %s, %s", syncedFolder.getLibelle(), syncedFolder.getLocalFolder(), syncedFolder.getLastModified(), syncedFolder.isScanLocal(), syncedFolder.getId()); //check if the given synced Folder need to be synced or has subfiles that need to be synced isSomeContentToSync = hasDirectoryContentToScan(syncedFolder, iterator, context) || isSomeContentToSync; } if (isSomeContentToSync) { Timber.d("Fahim: Found some content to sync"); DbHelper.updateSyncedFolders(folders, context); //@todo: maybe do this when all contents will be synced. } return isSomeContentToSync; Loading @@ -116,21 +121,34 @@ public abstract class AbstractFileLister <T> { */ private boolean hasDirectoryContentToScan(@NonNull SyncedFolder folder, @NonNull ListIterator<SyncedFolder> iterator, @NonNull Context context) { final FolderLoader<T> dirLoader = createFolderLoader(); final FolderLoader<T> dirLoader = createFolderLoader(); //mechanism that read the folder //check if data in DB say to skip the given syncable folder if (skipSyncedFolder(folder) || !isSyncedFolderInDb(folder, context) || !dirLoader.load(folder)) { // I try to get the real directory (File or RemoteFile). Timber.d("------> Fahim: skip SyncedFolder: %s", folder.getLibelle()); iterator.remove(); return false; } final FolderWrapper<T> currentDirectory = dirLoader.getFolderWrapper(); // load real directory corresponding to syncable directory depending on implementation final FolderWrapper<T> currentDirectory = dirLoader.getFolderWrapper(); //folder wrapper is like a "Future" // check if real directory is missing (would mean it has been deleted) if (currentDirectory.isMissing()) { if ( currentDirectory instanceof RemoteFileLister.FolderLoader ) { Timber.d("------> Fahim: Cannot find remote directory : %s", ((RemoteFile) currentDirectory.getFolder()).getRemotePath()); } return true; } //Check if we must skip the real directory (reasp, depends on implementation) if (skipDirectory(currentDirectory.getFolder(), folder, context)) { if ( currentDirectory instanceof RemoteFileLister.FolderLoader ) { Timber.d("------> Fahim: skip remote directory : %s", ((RemoteFile) currentDirectory.getFolder()).getRemotePath()); } iterator.remove(); folder.setToSync(false); /** Loading @@ -146,8 +164,11 @@ public abstract class AbstractFileLister <T> { //todo: look where to put in subclasses : syncedFolder.setLastEtag(directory.getEtag()).setToSync(true); //Get subfiles & sub directory final List<T> dirContent = currentDirectory.getContent(); if (dirContent != null && !dirContent.isEmpty()) { //add them to file to sync if there are some Timber.d("Fahim: adding %d files to scan from directory %s", dirContent.size(), folder.getLibelle()); contentToScan.addAll(sortContent(iterator, folder, dirContent)); } return true; Loading app/src/main/java/foundation/e/drive/receivers/DebugCmdReceiver.java +1 −1 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ public class DebugCmdReceiver extends BroadcastReceiver { switch (intent.getAction()) { case ACTION_FORCE_SCAN: Timber.d("Force Sync intent received"); Timber.d("Fahim: Force Sync intent received"); WorkLauncher.getInstance(context).enqueueOneTimeFullScan(true); break; case ACTION_DUMP_DATABASE: Loading Loading
app/src/main/java/foundation/e/drive/periodicScan/FullScanWorker.kt +10 −3 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ class FullScanWorker(private val context: Context, private val workerParams: Wor } override fun doWork(): Result { Timber.d("Fahim: FullScanWorker.doWork()") try { val requestCollector: SyncRequestCollector = SyncProxy Loading @@ -58,27 +59,31 @@ class FullScanWorker(private val context: Context, private val workerParams: Wor return Result.failure() } // Get list of syncable folders from Database val syncFolders = loadSyncedFolders(account!!) if (syncFolders.isEmpty()) { requestCollector.startListeningFiles(applicationContext as Application) return Result.success() } //Run scanning process for remote files val remoteSyncRequests = scanRemoteFiles(account, syncFolders.toMutableList()) syncRequests.putAll(remoteSyncRequests) Timber.d("${remoteSyncRequests.size} request collected from cloud") Timber.d("Fahim: ${remoteSyncRequests.size} request collected from cloud") //Run scanning process for local files val localSyncRequests = scanLocalFiles(syncFolders.toMutableList()) syncRequests.putAll(localSyncRequests) Timber.d("${localSyncRequests.size} request collected from device") Timber.d("Fahim: ${localSyncRequests.size} request collected from device") prefs.edit() .putLong(KEY_LAST_SCAN_TIME, System.currentTimeMillis()) .apply(); if (syncRequests.isEmpty()) { Timber.d("Nothing to sync") Timber.d("Fahim: FullScanWorker.doWork(): Nothing to sync") requestCollector.startListeningFiles(applicationContext as Application) return Result.success() } Loading Loading @@ -184,6 +189,7 @@ class FullScanWorker(private val context: Context, private val workerParams: Wor * generate SyncRequest for files on the cloud */ private fun scanRemoteFiles(account: Account, syncedFolders: List<SyncedFolder>): HashMap<Int, SyncRequest> { Timber.d("--> Fahim: FullScanWorker.scanRemoteFiles") val ocClient = DavClientProvider.getInstance().getClientInstance(account, context)?: return HashMap() val listRemoteFilesOperation = ListFileRemoteOperation( Loading @@ -193,6 +199,7 @@ class FullScanWorker(private val context: Context, private val workerParams: Wor try { @Suppress("DEPRECATION") //List all files from remote Folder val result = listRemoteFilesOperation.execute(ocClient) as RemoteOperationResult<ArrayList<RemoteFile>> if (!result.isSuccess) { Timber.d("Fails to check remote files") Loading
app/src/main/java/foundation/e/drive/periodicScan/ListFileRemoteOperation.java +2 −0 Original line number Diff line number Diff line Loading @@ -52,6 +52,8 @@ public class ListFileRemoteOperation extends RemoteOperation<ArrayList<RemoteFil @Override @NonNull protected RemoteOperationResult<ArrayList<RemoteFile>> run(@NonNull OwnCloudClient ownCloudClient) { Timber.d("----> Fahim: ListFileRemoteOperation.run()"); final RemoteFileLister fileLister = new RemoteFileLister(syncedFolders, ownCloudClient); final boolean isContentToScan = fileLister.listContentToScan(context); Loading
app/src/main/java/foundation/e/drive/periodicScan/PeriodicScanWorker.java +2 −1 Original line number Diff line number Diff line Loading @@ -39,12 +39,13 @@ public class PeriodicScanWorker extends Worker { @NonNull @Override public Result doWork() { Timber.d("Fahim: PeriodicScanWorker: doWork() "); try { final WorkManager workManager = WorkManager.getInstance(getApplicationContext()); final WorkRequestFactory workRequestFactory = WorkRequestFactory.INSTANCE; final List<OneTimeWorkRequest> workRequestsLists = new ArrayList<>(); workRequestsLists.add(workRequestFactory.createOneTimeWorkRequest(OneTimeWorkType.LIST_APPS, null)); //workRequestsLists.add(workRequestFactory.createOneTimeWorkRequest(OneTimeWorkType.LIST_APPS, null)); workRequestsLists.add(workRequestFactory.createOneTimeWorkRequest(OneTimeWorkType.FULL_SCAN, null)); workManager.beginUniqueWork(FullScanWorker.UNIQUE_WORK_NAME, ExistingWorkPolicy.KEEP, workRequestsLists) Loading
app/src/main/java/foundation/e/drive/periodicScan/contentScanner/AbstractFileLister.java +23 −2 Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.owncloud.android.lib.resources.files.FileUtils; import com.owncloud.android.lib.resources.files.model.RemoteFile; import java.util.ArrayList; import java.util.List; Loading Loading @@ -92,16 +93,20 @@ public abstract class AbstractFileLister <T> { * @return */ public boolean listContentToScan(@NonNull Context context) { //List files that need to be synchronized final ListIterator<SyncedFolder> iterator = folders.listIterator() ; boolean isSomeContentToSync = false; //Loop over synced folder while (iterator.hasNext()) { final SyncedFolder syncedFolder = iterator.next(); if (syncedFolder == null) continue; Timber.v("SyncedFolder : %s, %s, %s, %s, %s", syncedFolder.getLibelle(), syncedFolder.getLocalFolder(), syncedFolder.getLastModified(), syncedFolder.isScanLocal(), syncedFolder.getId()); //check if the given synced Folder need to be synced or has subfiles that need to be synced isSomeContentToSync = hasDirectoryContentToScan(syncedFolder, iterator, context) || isSomeContentToSync; } if (isSomeContentToSync) { Timber.d("Fahim: Found some content to sync"); DbHelper.updateSyncedFolders(folders, context); //@todo: maybe do this when all contents will be synced. } return isSomeContentToSync; Loading @@ -116,21 +121,34 @@ public abstract class AbstractFileLister <T> { */ private boolean hasDirectoryContentToScan(@NonNull SyncedFolder folder, @NonNull ListIterator<SyncedFolder> iterator, @NonNull Context context) { final FolderLoader<T> dirLoader = createFolderLoader(); final FolderLoader<T> dirLoader = createFolderLoader(); //mechanism that read the folder //check if data in DB say to skip the given syncable folder if (skipSyncedFolder(folder) || !isSyncedFolderInDb(folder, context) || !dirLoader.load(folder)) { // I try to get the real directory (File or RemoteFile). Timber.d("------> Fahim: skip SyncedFolder: %s", folder.getLibelle()); iterator.remove(); return false; } final FolderWrapper<T> currentDirectory = dirLoader.getFolderWrapper(); // load real directory corresponding to syncable directory depending on implementation final FolderWrapper<T> currentDirectory = dirLoader.getFolderWrapper(); //folder wrapper is like a "Future" // check if real directory is missing (would mean it has been deleted) if (currentDirectory.isMissing()) { if ( currentDirectory instanceof RemoteFileLister.FolderLoader ) { Timber.d("------> Fahim: Cannot find remote directory : %s", ((RemoteFile) currentDirectory.getFolder()).getRemotePath()); } return true; } //Check if we must skip the real directory (reasp, depends on implementation) if (skipDirectory(currentDirectory.getFolder(), folder, context)) { if ( currentDirectory instanceof RemoteFileLister.FolderLoader ) { Timber.d("------> Fahim: skip remote directory : %s", ((RemoteFile) currentDirectory.getFolder()).getRemotePath()); } iterator.remove(); folder.setToSync(false); /** Loading @@ -146,8 +164,11 @@ public abstract class AbstractFileLister <T> { //todo: look where to put in subclasses : syncedFolder.setLastEtag(directory.getEtag()).setToSync(true); //Get subfiles & sub directory final List<T> dirContent = currentDirectory.getContent(); if (dirContent != null && !dirContent.isEmpty()) { //add them to file to sync if there are some Timber.d("Fahim: adding %d files to scan from directory %s", dirContent.size(), folder.getLibelle()); contentToScan.addAll(sortContent(iterator, folder, dirContent)); } return true; Loading
app/src/main/java/foundation/e/drive/receivers/DebugCmdReceiver.java +1 −1 Original line number Diff line number Diff line Loading @@ -55,7 +55,7 @@ public class DebugCmdReceiver extends BroadcastReceiver { switch (intent.getAction()) { case ACTION_FORCE_SCAN: Timber.d("Force Sync intent received"); Timber.d("Fahim: Force Sync intent received"); WorkLauncher.getInstance(context).enqueueOneTimeFullScan(true); break; case ACTION_DUMP_DATABASE: Loading