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 728f7bec9f64ff69a8202ee8c7c883a77b6d71dc..57663546ac2d4d956c3920614f37e32cf1e08be6 100644 --- a/app/src/main/java/foundation/e/drive/fileFilters/FileFilterFactory.java +++ b/app/src/main/java/foundation/e/drive/fileFilters/FileFilterFactory.java @@ -24,8 +24,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 79% 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 53d0f98f5ff21cb0eee29f674f4d4246a4818e5d..47cdb3aae26ade7496eabf431b7d6d8622ffe33c 100644 --- a/app/src/main/java/foundation/e/drive/fileFilters/ImagesFileFilter.java +++ b/app/src/main/java/foundation/e/drive/fileFilters/MediaFileFilter.java @@ -13,9 +13,11 @@ import java.io.FileFilter; /** * @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/operations/ListFileRemoteOperation.java b/app/src/main/java/foundation/e/drive/operations/ListFileRemoteOperation.java index 751503adddf9b7bc1fe827ce36df5952ba1c6c6e..cb632fb6d41464fdce10605b4e8d6e15fc0fbb71 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; /** @@ -62,81 +64,90 @@ 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()){ + mSyncedFolderIterator.remove(); + 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"); + continue; } - 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.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; - } - }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; + } + + //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() ); - }//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(); + //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); 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 1835ee6a37ab743592208777c4196c53bae4d895..79ad0ae488f8869a4b512893ace320667fae0b96 100644 --- a/app/src/main/java/foundation/e/drive/services/ObserverService.java +++ b/app/src/main/java/foundation/e/drive/services/ObserverService.java @@ -330,16 +330,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( TAG, "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(TAG, "syncedFileState.getRemotePath() :"+syncedFileState.getRemotePath() ); if( !mOperationManagerService.isSyncingFile( syncedFileState.getLocalPath() ) ) { @@ -514,8 +521,13 @@ 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.isScanLocal() ) { + 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) { @@ -543,7 +555,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"); @@ -617,6 +629,13 @@ public class ObserverService extends Service implements OnRemoteOperationListene 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é if (mBoundToOperationManager && !mOperationManagerService.isSyncingFile( syncedFileState.getLocalPath() ) ){ //le fichier n'est pas actuellement en train d'être chargé 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 800019ed54be4723817c47136c8bde4192e11776..523e4556015ae84b050ba89e22f01a0bd18862cb 100644 --- a/app/src/main/java/foundation/e/drive/utils/CommonUtils.java +++ b/app/src/main/java/foundation/e/drive/utils/CommonUtils.java @@ -156,7 +156,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];