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 c99a6d546e0fb7537c65edf9559be58764d18e32..dbbff679e330bb3a987ea4f2406de546d2d5b686 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 53d0f98f5ff21cb0eee29f674f4d4246a4818e5d..5f55a22ee38703f3499c3e0c4e29e39d13115e9a 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/operations/ListFileRemoteOperation.java b/app/src/main/java/foundation/e/drive/operations/ListFileRemoteOperation.java index 20451a72e6dd6234d5157984c03166493d50567e..03d6b70686b5b6bdba01194868c1985bedd9e9a6 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,80 +64,97 @@ 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 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()) { + 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; - } - }//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(); + } + + //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( !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); @@ -147,7 +166,7 @@ public class ListFileRemoteOperation extends RemoteOperation { Log.v(TAG, "end of run()"); return finalResult; } - + /** * * @return list of syncedFolder 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 3a2c1c8783399c7ad758f2b83d10ea888b015c05..3a6f7c3cc2e9795113de708d9fe1520d5eb3185f 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() ) ) { @@ -524,6 +531,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) { @@ -551,7 +563,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; ) { @@ -623,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Ă© 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 b99cd20d082c0ce16ca615f1e30de563ac4d2c4f..421a58bca137a35f522fe2344c1f2b71ca1303a7 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];