From 955791891abb9cdb80552d6eaa5a38731fec5c43 Mon Sep 17 00:00:00 2001 From: vince-bourgmayer Date: Mon, 19 Aug 2019 15:08:17 +0200 Subject: [PATCH 1/7] When scanning remote check if subfile (and folder) of a 'media' folder are hidden files --- .../e/drive/operations/ListFileRemoteOperation.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/foundation/e/drive/operations/ListFileRemoteOperation.java b/app/src/main/java/foundation/e/drive/operations/ListFileRemoteOperation.java index 20451a72..8f2f4bde 100644 --- a/app/src/main/java/foundation/e/drive/operations/ListFileRemoteOperation.java +++ b/app/src/main/java/foundation/e/drive/operations/ListFileRemoteOperation.java @@ -21,6 +21,8 @@ import java.util.List; import java.util.ListIterator; import foundation.e.drive.database.DbHelper; import foundation.e.drive.models.SyncedFolder; +import foundation.e.drive.utils.CommonUtils; + import static org.apache.jackrabbit.webdav.DavConstants.DEPTH_1; /** @@ -88,6 +90,12 @@ public class ListFileRemoteOperation extends RemoteOperation { for (int i = -1, remoteFilesSize = remoteFiles.size(); ++i < remoteFilesSize; ){ RemoteFile remoteFile = (RemoteFile) remoteFiles.get(i); + //if remoteFile is in a "media" folder and its name start with "." + // then ignore it + if(syncedFolder.isMediaType() + && CommonUtils.getFileNameFromPath( remoteFile.getRemotePath() ).startsWith(".") ){ + continue; + } if( remoteFile.getMimeType().equals("DIR") ) { String suffixPath = remoteFile.getRemotePath().substring( syncedFolder.getRemoteFolder().length() ); @@ -147,7 +155,7 @@ public class ListFileRemoteOperation extends RemoteOperation { Log.v(TAG, "end of run()"); return finalResult; } - + /** * * @return list of syncedFolder -- GitLab From 6de07962aeaa84658e9644a6221d1b02e03ceccc Mon Sep 17 00:00:00 2001 From: vince-bourgmayer Date: Mon, 19 Aug 2019 16:13:27 +0200 Subject: [PATCH 2/7] Disable synchronisation of new locale hidden files & folders --- .../e/drive/fileFilters/FileFilterFactory.java | 4 ++-- .../{ImagesFileFilter.java => MediaFileFilter.java} | 9 +++++++-- .../foundation/e/drive/services/ObserverService.java | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) rename app/src/main/java/foundation/e/drive/fileFilters/{ImagesFileFilter.java => MediaFileFilter.java} (73%) diff --git a/app/src/main/java/foundation/e/drive/fileFilters/FileFilterFactory.java b/app/src/main/java/foundation/e/drive/fileFilters/FileFilterFactory.java index c99a6d54..dbbff679 100644 --- a/app/src/main/java/foundation/e/drive/fileFilters/FileFilterFactory.java +++ b/app/src/main/java/foundation/e/drive/fileFilters/FileFilterFactory.java @@ -23,8 +23,8 @@ public class FileFilterFactory { case "Applications": filter = new AppSettingsFileFilter(); break; - case "Images": - filter = new ImagesFileFilter(); + case "media": + filter = new MediaFileFilter(); break; default: filter = new NoCacheFileFilter(); diff --git a/app/src/main/java/foundation/e/drive/fileFilters/ImagesFileFilter.java b/app/src/main/java/foundation/e/drive/fileFilters/MediaFileFilter.java similarity index 73% rename from app/src/main/java/foundation/e/drive/fileFilters/ImagesFileFilter.java rename to app/src/main/java/foundation/e/drive/fileFilters/MediaFileFilter.java index 53d0f98f..5f55a22e 100644 --- a/app/src/main/java/foundation/e/drive/fileFilters/ImagesFileFilter.java +++ b/app/src/main/java/foundation/e/drive/fileFilters/MediaFileFilter.java @@ -10,12 +10,17 @@ package foundation.e.drive.fileFilters; import java.io.File; import java.io.FileFilter; + +import foundation.e.drive.utils.CommonUtils; + /** * @author Vincent Bourgmayer */ -class ImagesFileFilter implements FileFilter { +class MediaFileFilter implements FileFilter { @Override public boolean accept(File file) { - return !file.isDirectory() || !file.getName().equals( ".thumbnails" ); + //Return true if it's not a hidden file + + return !file.isHidden(); } } diff --git a/app/src/main/java/foundation/e/drive/services/ObserverService.java b/app/src/main/java/foundation/e/drive/services/ObserverService.java index 3a2c1c87..4ab01fb5 100644 --- a/app/src/main/java/foundation/e/drive/services/ObserverService.java +++ b/app/src/main/java/foundation/e/drive/services/ObserverService.java @@ -551,7 +551,7 @@ public class ObserverService extends Service implements OnRemoteOperationListene folderIdList.add( (long) syncedFolder.getId() ); } - final FileFilter filter = FileFilterFactory.getFileFilter( syncedFolder.getLibelle() ); + final FileFilter filter = FileFilterFactory.getFileFilter( (syncedFolder.isMediaType()) ? "media" : syncedFolder.getLibelle() ); File[] subElements = folder.listFiles(filter); Log.v(TAG, "loop through subfiles"); for (int i = -1, subEltSize = (subElements != null)? subElements.length: 0; ++i < subEltSize; ) { -- GitLab From 2cf1ffc59e624092ef81a8464aec4c124fa5661e Mon Sep 17 00:00:00 2001 From: vince-bourgmayer Date: Mon, 19 Aug 2019 17:30:26 +0200 Subject: [PATCH 3/7] reorganise run code of listFileRemoteOperation --- .../operations/ListFileRemoteOperation.java | 148 +++++++++--------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/app/src/main/java/foundation/e/drive/operations/ListFileRemoteOperation.java b/app/src/main/java/foundation/e/drive/operations/ListFileRemoteOperation.java index 8f2f4bde..c56abb60 100644 --- a/app/src/main/java/foundation/e/drive/operations/ListFileRemoteOperation.java +++ b/app/src/main/java/foundation/e/drive/operations/ListFileRemoteOperation.java @@ -64,86 +64,86 @@ public class ListFileRemoteOperation extends RemoteOperation { //Get CurrentSyncedFolder SyncedFolder syncedFolder = mSyncedFolderIterator.next(); - if(syncedFolder.isScanRemote()) { - - if(syncedFolder.getId() == -1) { - //persist new syncedFolder - int syncedFolderId = (int) DbHelper.insertSyncedFolder(syncedFolder, mContext); - if (syncedFolderId > 0) { - syncedFolder.setId(syncedFolderId); - } + //If folder isn't to be scan remotly, ignore it + if(!syncedFolder.isScanRemote()) continue; + + if(syncedFolder.getId() == -1) { + //persist new syncedFolder + int syncedFolderId = (int) DbHelper.insertSyncedFolder(syncedFolder, mContext); + if (syncedFolderId > 0) { + syncedFolder.setId(syncedFolderId); + }else{ + mSyncedFolderIterator.remove(); + Log.w(TAG, "syncedFolder "+syncedFolder.getRemoteFolder()+" doesn't have a valid ID"); } - if(syncedFolder.getId() > 0){ - //Create ReadRemoteOperation - LightReadFolderRemoteOperation operation = new LightReadFolderRemoteOperation(syncedFolder.getRemoteFolder(), DEPTH_1, false); - RemoteOperationResult result = operation.execute(ownCloudClient); - - if(result.isSuccess() ){ - //is success then data can't be null - int dataSize = result.getData().size(); - if(dataSize > 1){ //There is at least one subfiles - RemoteFile directory = (RemoteFile) result.getData().get(0); - if(!directory.getEtag().equals(syncedFolder.getLastEtag() )){ //if etag differs - List remoteFiles = result.getData().subList( 1, dataSize ); //get list of subfiles - - //loop through subelements - for (int i = -1, remoteFilesSize = remoteFiles.size(); ++i < remoteFilesSize; ){ - RemoteFile remoteFile = (RemoteFile) remoteFiles.get(i); - - //if remoteFile is in a "media" folder and its name start with "." - // then ignore it - if(syncedFolder.isMediaType() - && CommonUtils.getFileNameFromPath( remoteFile.getRemotePath() ).startsWith(".") ){ - continue; - } - if( remoteFile.getMimeType().equals("DIR") ) { - String suffixPath = remoteFile.getRemotePath().substring( syncedFolder.getRemoteFolder().length() ); - - //but is it already known as SyncedFolder? - SyncedFolder subSyncedFolder = new SyncedFolder(syncedFolder, suffixPath, 0L, "" ); //need to set empty etag to allow it to be scan - mSyncedFolderIterator.add(subSyncedFolder); - mSyncedFolderIterator.previous(); - - }else { - //If it's a file just add it to mRemoteFiles. - mRemoteFiles.add(remoteFile); - } - } - syncedFolder.setLastEtag(directory.getEtag() ).setToSync(true); - atLeastOneDirAsChanged = true; + } + + //Create ReadRemoteOperation + LightReadFolderRemoteOperation operation = new LightReadFolderRemoteOperation(syncedFolder.getRemoteFolder(), DEPTH_1, false); + RemoteOperationResult result = operation.execute(ownCloudClient); + + if(result.isSuccess() ){ + //is success then data can't be null + int dataSize = result.getData().size(); + if(dataSize > 1){ //There is at least one subfiles + RemoteFile directory = (RemoteFile) result.getData().get(0); + if(!directory.getEtag().equals(syncedFolder.getLastEtag() )){ //if etag differs + List remoteFiles = result.getData().subList( 1, dataSize ); //get list of subfiles + + //loop through subelements + for (int i = -1, remoteFilesSize = remoteFiles.size(); ++i < remoteFilesSize; ){ + RemoteFile remoteFile = (RemoteFile) remoteFiles.get(i); + + //if remoteFile is in a "media" folder and its name start with "." + // then ignore it + if(syncedFolder.isMediaType() + && CommonUtils.getFileNameFromPath( remoteFile.getRemotePath() ).startsWith(".") ){ + continue; } - }else if(dataSize == 1){ //Empty folder - RemoteFile directory = (RemoteFile) result.getData().get(0); - if(!directory.getEtag().equals(syncedFolder.getLastEtag())) { - syncedFolder.setLastEtag(directory.getEtag()).setToSync(true); - atLeastOneDirAsChanged = true; - } - }//Last else correspond to error 404 at LightReadFolderRemoteOperation (see below) - }else{ //Result isn't a success - if(result.getHttpCode() == 404){ //File not found - atLeastOneDirAsChanged = true; - syncedFolder.setToSync(true); - //If there is no remote file, then try to delete local one if empty. Finally remove Synced Folder from DB. - File localFolder = new File(syncedFolder.getLocalFolder()); - if(localFolder.exists() && localFolder.listFiles().length == 0){ - localFolder.delete(); - } - if( !localFolder.exists() ) { - if (syncedFolder.getId() > this.initialFolderNumber/*-1*/) { //does the synced folder has been persisted? - //remove it from DB - int deleteResult = DbHelper.deleteSyncedFolder(syncedFolder.getId(), mContext); - Log.d(TAG, "syncedFolder Id: "+syncedFolder.getId() + " deletion from db return " + deleteResult + " row affected"); - } - mSyncedFolderIterator.remove(); + if( remoteFile.getMimeType().equals("DIR") ) { + String suffixPath = remoteFile.getRemotePath().substring( syncedFolder.getRemoteFolder().length() ); + + //but is it already known as SyncedFolder? + SyncedFolder subSyncedFolder = new SyncedFolder(syncedFolder, suffixPath, 0L, "" ); //need to set empty etag to allow it to be scan + mSyncedFolderIterator.add(subSyncedFolder); + mSyncedFolderIterator.previous(); + + }else { + //If it's a file just add it to mRemoteFiles. + mRemoteFiles.add(remoteFile); } } - Log.w(TAG, "LightReadFolderRemoteOperation failed : http " + result.getHttpCode() + ", " + result.getLogMessage()+" => Ignored"); + syncedFolder.setLastEtag(directory.getEtag() ).setToSync(true); + atLeastOneDirAsChanged = true; + } + }else if(dataSize == 1){ //Empty folder + RemoteFile directory = (RemoteFile) result.getData().get(0); + if(!directory.getEtag().equals(syncedFolder.getLastEtag())) { + syncedFolder.setLastEtag(directory.getEtag()).setToSync(true); + atLeastOneDirAsChanged = true; + } + }//Last else correspond to error 404 at LightReadFolderRemoteOperation (see below) + }else{ //Result isn't a success + if(result.getHttpCode() == 404){ //File not found + atLeastOneDirAsChanged = true; + syncedFolder.setToSync(true); + //If there is no remote file, then try to delete local one if empty. Finally remove Synced Folder from DB. + File localFolder = new File(syncedFolder.getLocalFolder()); + if(localFolder.exists() && localFolder.listFiles().length == 0){ + localFolder.delete(); + } + if( !localFolder.exists() ) { + if (syncedFolder.getId() > this.initialFolderNumber/*-1*/) { //does the synced folder has been persisted? + //remove it from DB + int deleteResult = DbHelper.deleteSyncedFolder(syncedFolder.getId(), mContext); + Log.d(TAG, "syncedFolder Id: "+syncedFolder.getId() + " deletion from db return " + deleteResult + " row affected"); + } + mSyncedFolderIterator.remove(); } - }else{ - mSyncedFolderIterator.remove(); - Log.w(TAG, "syncedFolder "+syncedFolder.getRemoteFolder()+" doesn't have a valid ID"); } - } //Then its folder is not scanRemote + Log.w(TAG, "LightReadFolderRemoteOperation failed : http " + result.getHttpCode() + ", " + result.getLogMessage()+" => Ignored"); + } + } //End of loop finalResult = new RemoteOperationResult(RemoteOperationResult.ResultCode.OK); -- GitLab From 8c9d0f28324ce747e161e326169cff9ef1a69abb Mon Sep 17 00:00:00 2001 From: vince-bourgmayer Date: Mon, 19 Aug 2019 17:53:38 +0200 Subject: [PATCH 4/7] add filter on already store folder to prevent sync of hidden media folder --- .../e/drive/operations/ListFileRemoteOperation.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/foundation/e/drive/operations/ListFileRemoteOperation.java b/app/src/main/java/foundation/e/drive/operations/ListFileRemoteOperation.java index c56abb60..03d6b706 100644 --- a/app/src/main/java/foundation/e/drive/operations/ListFileRemoteOperation.java +++ b/app/src/main/java/foundation/e/drive/operations/ListFileRemoteOperation.java @@ -64,8 +64,18 @@ public class ListFileRemoteOperation extends RemoteOperation { //Get CurrentSyncedFolder SyncedFolder syncedFolder = mSyncedFolderIterator.next(); + //if folder is media type() && is an hidden folder then ignore it + if(syncedFolder.isMediaType() + && CommonUtils.getFileNameFromPath(syncedFolder.getRemoteFolder()).startsWith(".")){ + mSyncedFolderIterator.remove(); + continue; + } + //If folder isn't to be scan remotly, ignore it - if(!syncedFolder.isScanRemote()) continue; + if(!syncedFolder.isScanRemote()) { + mSyncedFolderIterator.remove(); + continue; + } if(syncedFolder.getId() == -1) { //persist new syncedFolder @@ -75,6 +85,7 @@ public class ListFileRemoteOperation extends RemoteOperation { }else{ mSyncedFolderIterator.remove(); Log.w(TAG, "syncedFolder "+syncedFolder.getRemoteFolder()+" doesn't have a valid ID"); + continue; } } -- GitLab From 53c76f49af7f625fe852af09297d61c336ab79c9 Mon Sep 17 00:00:00 2001 From: vince-bourgmayer Date: Mon, 19 Aug 2019 17:59:04 +0200 Subject: [PATCH 5/7] add filter on already store folder to prevent sync of hidden media folder (from local) --- .../java/foundation/e/drive/services/ObserverService.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/foundation/e/drive/services/ObserverService.java b/app/src/main/java/foundation/e/drive/services/ObserverService.java index 4ab01fb5..e1807267 100644 --- a/app/src/main/java/foundation/e/drive/services/ObserverService.java +++ b/app/src/main/java/foundation/e/drive/services/ObserverService.java @@ -524,6 +524,11 @@ public class ObserverService extends Service implements OnRemoteOperationListene SyncedFolder syncedFolder = iterator.next(); Log.v(TAG, "SyncedFolder :"+syncedFolder.getLibelle()+", "+syncedFolder.getLocalFolder()+", "+syncedFolder.getLastModified()+", "+syncedFolder.isScanLocal()+", "+syncedFolder.getId() ); + if(syncedFolder.isMediaType() && CommonUtils.getFileNameFromPath(syncedFolder.getLocalFolder()).startsWith(".")){ + iterator.remove(); + continue; + } + if(syncedFolder.isScanLocal() ) { Log.v(TAG, "We must sync local modification of this folder"); if ( syncedFolder.getId() == -1) { -- GitLab From 006f82a2a2dcf425cd37c58fdf84cd9c6fa5bd04 Mon Sep 17 00:00:00 2001 From: vince-bourgmayer Date: Tue, 20 Aug 2019 11:34:55 +0200 Subject: [PATCH 6/7] ignore hidden media files data from DB --- .../e/drive/services/ObserverService.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/foundation/e/drive/services/ObserverService.java b/app/src/main/java/foundation/e/drive/services/ObserverService.java index e1807267..3a6f7c3c 100644 --- a/app/src/main/java/foundation/e/drive/services/ObserverService.java +++ b/app/src/main/java/foundation/e/drive/services/ObserverService.java @@ -341,16 +341,23 @@ public class ObserverService extends Service implements OnRemoteOperationListene ListIterator syncedFileListIterator; for( int i =-1, size = remoteFiles.size(); ++i < size; ){ - syncedFileListIterator = syncedFileStates.listIterator(); //reset listiterator boolean correspondant_found = false; final RemoteFile remoteFile = (RemoteFile) remoteFiles.get(i); final String remoteFilePath = remoteFile.getRemotePath(); Log.v( CURRENTTAG, "start to loop through syncedFileListIterator for: "+remoteFilePath); + // hidden file from server has already been filtered in previous step + while( syncedFileListIterator.hasNext() && !correspondant_found ){ SyncedFileState syncedFileState = syncedFileListIterator.next(); + //ignore hidden file from db + if(syncedFileState.isMediaType() && syncedFileState.getName().startsWith(".")){ + syncedFileListIterator.remove(); + continue; + } + Log.d(CURRENTTAG, "syncedFileState.getRemotePath() :"+syncedFileState.getRemotePath() ); if( !mOperationManagerService.isSyncingFile( syncedFileState.getLocalPath() ) ) { @@ -628,6 +635,13 @@ public class ObserverService extends Service implements OnRemoteOperationListene Log.v(TAG, "Loop through syncedFileState (Path, Id, last Modified):"); while( syncedFileListIterator.hasNext() && !correspondant_found ) { SyncedFileState syncedFileState = syncedFileListIterator.next(); + + //Ignore hidden media file store in DB + if(syncedFileState.isMediaType() && syncedFileState.getName().startsWith(".")){ + syncedFileListIterator.remove(); + continue; + } + Log.v(TAG, syncedFileState.getLocalPath()+", "+syncedFileState.getId()+", "+syncedFileState.getLocalLastModified()); //Si le fichier n'est pas en train d'ĂȘtre synchronisĂ© -- GitLab From 3472701fb6a457e23c04cee39fe24aac3ed8d45a Mon Sep 17 00:00:00 2001 From: vince-bourgmayer Date: Tue, 20 Aug 2019 12:25:53 +0200 Subject: [PATCH 7/7] remove a logcat entry for method which return file name from path --- app/src/main/java/foundation/e/drive/utils/CommonUtils.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/foundation/e/drive/utils/CommonUtils.java b/app/src/main/java/foundation/e/drive/utils/CommonUtils.java index b99cd20d..421a58bc 100644 --- a/app/src/main/java/foundation/e/drive/utils/CommonUtils.java +++ b/app/src/main/java/foundation/e/drive/utils/CommonUtils.java @@ -132,7 +132,6 @@ public abstract class CommonUtils { * @return String, the last part after separator of path or null if invalid path has been provided */ public static String getFileNameFromPath(String path) { - Log.i(TAG, "getFileNameFromPath("+path+")"); try{ String[] splittedString = path.split(FileUtils.PATH_SEPARATOR); return splittedString[splittedString.length - 1]; -- GitLab