From 675755f28c39e89d37a3d138562ec186532a7750 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 20 Sep 2022 11:24:01 +0200 Subject: [PATCH 1/8] refactor ObserverServices.scanLocalFiles to clean code and make it more readable --- .../e/drive/services/ObserverService.java | 94 +++++++------------ 1 file changed, 32 insertions(+), 62 deletions(-) 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 e964278c..c94e0030 100644 --- a/app/src/main/java/foundation/e/drive/services/ObserverService.java +++ b/app/src/main/java/foundation/e/drive/services/ObserverService.java @@ -404,100 +404,70 @@ public class ObserverService extends Service implements OnRemoteOperationListene */ private void scanLocalFiles(){ Log.i( TAG, "scanLocalFiles()" ); - List fileList = new ArrayList<>(); - List folderIdList= new ArrayList<>(); + final List fileList = new ArrayList<>(); + final List folderIdList= new ArrayList<>(); boolean contentToSyncFound = false; - //Regenere list of application's package - if (CommonUtils.isSettingsSyncEnabled(mAccount)) generateAppListFile(); - + if (CommonUtils.isSettingsSyncEnabled(mAccount)) generateAppListFile(); final ListIterator iterator = mSyncedFolders.listIterator() ; - //Loop through folders + while(iterator.hasNext()) { final SyncedFolder syncedFolder = iterator.next(); Log.d(TAG, "SyncedFolder :"+syncedFolder.getLibelle()+", "+syncedFolder.getLocalFolder()+", "+syncedFolder.getLastModified()+", "+syncedFolder.isScanLocal()+", "+syncedFolder.getId() ); //Check it's not a hidden file - String fileName = CommonUtils.getFileNameFromPath(syncedFolder.getLocalFolder()); - if (fileName == null) { - Log.e(TAG, "getFileNameFromPath() returned null. Returning to prevent a NPE"); - return; - } - - if (syncedFolder.isMediaType() && fileName.startsWith(".")){ - iterator.remove(); - continue; - } - - //Check it can be scann from local - if (!syncedFolder.isScanLocal()){ + final String fileName = CommonUtils.getFileNameFromPath(syncedFolder.getLocalFolder()); + if (fileName == null || fileName.startsWith(".") || !syncedFolder.isScanLocal()) { iterator.remove(); continue; } - //Check if it's a new folder - if ( syncedFolder.getId() == -1) { - Log.v(TAG, "This is a new folder, we must register it"); - //persist new syncedFolder - int syncedFolder_id = (int) DbHelper.insertSyncedFolder(syncedFolder, this); //It will return -1 if there is an error, like an already existing folder with same value - if (syncedFolder_id > 0) { - Log.v(TAG, "Folder has been registered in DB"); - syncedFolder.setId(syncedFolder_id); - } else { - Log.w(TAG, "syncedFolder " + syncedFolder.getLocalFolder() + " remove iterator because it hasn't been registered in DB or already stored"); + if (syncedFolder.getId() == -1) { + final int syncedFolder_id = (int) DbHelper.insertSyncedFolder(syncedFolder, this); //It will return -1 if there is an error, like an already existing folder with same value + if (syncedFolder_id <= 0) { iterator.remove(); continue; } + syncedFolder.setId(syncedFolder_id); } - //Get local folder corresponding - File localFolder = new File(syncedFolder.getLocalFolder()); //Obtention du fichier local - Log.d(TAG, "Local Folder (last modified / exists): "+localFolder.lastModified()+", "+localFolder.exists() ); - //Check if local folder exists - if (!localFolder.exists()){ - Log.v(TAG, "local folder doesn't exist anymore . So content has change"); + + final File localDirectory = new File(syncedFolder.getLocalFolder()); //Obtention du fichier local + Log.d(TAG, "Local Folder (last modified / exists): "+localDirectory.lastModified()+", "+localDirectory.exists() ); + + if (!localDirectory.exists()) { contentToSyncFound = true; folderIdList.add( (long) syncedFolder.getId() ); continue; } - boolean folderHasChange = false; //consider by default that file hadn't change + boolean directoryHasChange = false; - //Check if folder had change - if (localFolder.lastModified() > syncedFolder.getLastModified() ) { //compare last modified date - Log.v(TAG, "local folder has changed"); - syncedFolder.setLastModified( localFolder.lastModified() ); //@Todo: it would be better to set it after all it's content has been synced - contentToSyncFound = true; //at least one dir has changed - folderHasChange = true; //The folder has change - folderIdList.add( (long) syncedFolder.getId() ); //add id into list of modified folder + if (localDirectory.lastModified() > syncedFolder.getLastModified() ) { //compare last modified date + syncedFolder.setLastModified(localDirectory.lastModified()); //@Todo: it would be better to set it after all it's content has been synced + contentToSyncFound = true; + directoryHasChange = true; + folderIdList.add((long) syncedFolder.getId()); } - //Get sub files final FileFilter filter = FileFilterFactory.getFileFilter( (syncedFolder.isMediaType()) ? "media" : syncedFolder.getLibelle() ); - File[] subElements = localFolder.listFiles(filter); //hiden media files are being ignored - - Log.v(TAG, "loop through subfiles"); - for (int i = -1, subEltSize = (subElements != null)? subElements.length: 0; ++i < subEltSize; ) { - File subElt = subElements[i]; - if (subElt == null) continue; - if (subElt.isDirectory()) { //if its a subfolder add it to syncedFolder list - //if a subfolder is found, add it to syncedFolder list - Log.v(TAG, "subfile "+subElt.getAbsolutePath()+" is a directory."); - SyncedFolder subSyncedFolder = new SyncedFolder(syncedFolder, subElt.getName() + FileUtils.PATH_SEPARATOR, 0L, "");//Need to put 0 into to be handled on next iterati + final File[] subFiles = localDirectory.listFiles(filter); //skip hidden media files + + for (File subFile : subFiles) { + if (subFile.isDirectory()) { + final SyncedFolder subSyncedFolder = new SyncedFolder(syncedFolder, subFile.getName() + FileUtils.PATH_SEPARATOR, 0L, "");//Need to set lastModified to 0 to handle it on next iteration iterator.add(subSyncedFolder); iterator.previous(); - - } else { - if (folderHasChange) { //only consider files if folder had change - Log.v(TAG, "subfile " + subElt.getAbsolutePath() + " is a file added to list of file to sync"); - fileList.add(subElt); - } + } else if (directoryHasChange) { + Log.v(TAG, "added subfile " + subFile.getAbsolutePath() + " into list of file to sync"); + fileList.add(subFile); } } - } //end of iterator loop + } + if (contentToSyncFound) { DbHelper.updateSyncedFolders(mSyncedFolders, this); //@ToDo: maybe do this when all contents will be synced. - List syncedFileStates = DbHelper.getSyncedFileStatesByFolders(this, + final List syncedFileStates = DbHelper.getSyncedFileStatesByFolders(this, folderIdList); if (!syncedFileStates.isEmpty() || !fileList.isEmpty() ) { -- GitLab From c3bab780feaa9b118f0c58e7ee61588bb6921f0c Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 20 Sep 2022 12:12:17 +0200 Subject: [PATCH 2/8] implement SQL request to check if there is content to upload in an unchanged directory - Add new method in SyncedFileStateDAO - Add new method in DBHelper which calls the one from SyncedFileStateDAO - Call the new method of DbHelper in ObserverService --- .../foundation/e/drive/database/DbHelper.java | 10 ++++++ .../e/drive/database/SyncedFileStateDAO.java | 33 +++++++++++++++---- .../e/drive/services/ObserverService.java | 10 +++--- 3 files changed, 42 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/foundation/e/drive/database/DbHelper.java b/app/src/main/java/foundation/e/drive/database/DbHelper.java index 77a58421..c55c841b 100644 --- a/app/src/main/java/foundation/e/drive/database/DbHelper.java +++ b/app/src/main/java/foundation/e/drive/database/DbHelper.java @@ -298,6 +298,16 @@ public final class DbHelper extends SQLiteOpenHelper { return result; } + public static boolean syncedFolderHasContentToUpload(long syncedFolderID, Context context) { + final SyncedFileStateDAO dao; + try { + dao = openSyncedFileStateDAO(context, false); + return dao.countFileWaitingForUploadForSyncedFolder(syncedFolderID) > 0; + } catch (SQLiteException e) { + Log.e(TAG, "SQlite error", e); + } + return false; + } /** * Copy database file into user accessible directory for debuging purpose diff --git a/app/src/main/java/foundation/e/drive/database/SyncedFileStateDAO.java b/app/src/main/java/foundation/e/drive/database/SyncedFileStateDAO.java index fffc4da0..58b7ff62 100644 --- a/app/src/main/java/foundation/e/drive/database/SyncedFileStateDAO.java +++ b/app/src/main/java/foundation/e/drive/database/SyncedFileStateDAO.java @@ -15,6 +15,8 @@ import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteDoneException; +import android.database.sqlite.SQLiteStatement; import android.util.Log; import java.util.ArrayList; @@ -140,12 +142,31 @@ class SyncedFileStateDAO { return result; } + + /** + * Count number of SyncedFileState's entry with an empty eTAG for the given syncedFolder. + * ONLY list file that can be scan on device side + * @param syncedFolderId ID of the given synced folder + * @return number of file waiting to be uploaded + * @throws SQLiteDoneException SQL return 0 row + */ + long countFileWaitingForUploadForSyncedFolder(long syncedFolderId) throws SQLiteDoneException { + final String query = "SELECT COUNT(*) FROM " + + TABLE_NAME + + " WHERE " + SCANNABLE + " >= 2" + + " AND " + LAST_ETAG + " = \"\"" + + " AND " + SYNCEDFOLDER_ID + " = "+syncedFolderId; + + final SQLiteStatement statement = mDB.compileStatement(query); + return statement.simpleQueryForLong(); + } + /** - * Fetch many SyncedFileState by its localPath - * @param syncedFolderids List of path to filter. Need to be directory path + * Fetch many SyncedFileState by their syncedFolder's id + * @param syncedFolderIds List of id of parent syncedFolder. * @return List List of SyncedFileState filtered on syncedFolder ID. */ - List getBySyncedFolderID(List syncedFolderids) { + List getBySyncedFolderID(List syncedFolderIds) { String query = "Select " +SyncedFileStateContract._ID+", " +FILE_NAME+", " @@ -158,11 +179,11 @@ class SyncedFileStateDAO { + SCANNABLE +" FROM " +TABLE_NAME; - if (syncedFolderids.size() > 0) { + if (syncedFolderIds.size() > 0) { query+=" WHERE "; - for (int i = -1, idsSize = syncedFolderids.size(); ++i < idsSize; ) { - query += SYNCEDFOLDER_ID + " = " + syncedFolderids.get(i); + for (int i = -1, idsSize = syncedFolderIds.size(); ++i < idsSize; ) { + query += SYNCEDFOLDER_ID + " = " + syncedFolderIds.get(i); if (i < idsSize - 1) { query += " OR "; } 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 c94e0030..9756a22a 100644 --- a/app/src/main/java/foundation/e/drive/services/ObserverService.java +++ b/app/src/main/java/foundation/e/drive/services/ObserverService.java @@ -441,24 +441,24 @@ public class ObserverService extends Service implements OnRemoteOperationListene continue; } - boolean directoryHasChange = false; - - if (localDirectory.lastModified() > syncedFolder.getLastModified() ) { //compare last modified date + if (localDirectory.lastModified() > syncedFolder.getLastModified() + || DbHelper.syncedFolderHasContentToUpload(syncedFolder.getId(), getApplicationContext())) { syncedFolder.setLastModified(localDirectory.lastModified()); //@Todo: it would be better to set it after all it's content has been synced contentToSyncFound = true; - directoryHasChange = true; folderIdList.add((long) syncedFolder.getId()); } + final FileFilter filter = FileFilterFactory.getFileFilter( (syncedFolder.isMediaType()) ? "media" : syncedFolder.getLibelle() ); final File[] subFiles = localDirectory.listFiles(filter); //skip hidden media files + if (subFiles == null) continue; for (File subFile : subFiles) { if (subFile.isDirectory()) { final SyncedFolder subSyncedFolder = new SyncedFolder(syncedFolder, subFile.getName() + FileUtils.PATH_SEPARATOR, 0L, "");//Need to set lastModified to 0 to handle it on next iteration iterator.add(subSyncedFolder); iterator.previous(); - } else if (directoryHasChange) { + } else if (contentToSyncFound) { Log.v(TAG, "added subfile " + subFile.getAbsolutePath() + " into list of file to sync"); fileList.add(subFile); } -- GitLab From 9d5415cdf23f7934996213928d854c34c5e5094f Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Tue, 20 Sep 2022 15:20:42 +0200 Subject: [PATCH 3/8] Implement to unchanged directory for which there is some files to download --- .../foundation/e/drive/database/DbHelper.java | 23 +++++++++++++++++++ .../e/drive/database/SyncedFileStateDAO.java | 23 ++++++++++++++++++- .../operations/ListFileRemoteOperation.java | 3 ++- 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/foundation/e/drive/database/DbHelper.java b/app/src/main/java/foundation/e/drive/database/DbHelper.java index c55c841b..4ad1f148 100644 --- a/app/src/main/java/foundation/e/drive/database/DbHelper.java +++ b/app/src/main/java/foundation/e/drive/database/DbHelper.java @@ -298,6 +298,12 @@ public final class DbHelper extends SQLiteOpenHelper { return result; } + /** + * Look if there is some known file that need to be uploaded for the given syncedFolder + * @param syncedFolderID id of the syncedFolder + * @param context context + * @return true if there is at least one file that need to be uploaded + */ public static boolean syncedFolderHasContentToUpload(long syncedFolderID, Context context) { final SyncedFileStateDAO dao; try { @@ -309,6 +315,23 @@ public final class DbHelper extends SQLiteOpenHelper { return false; } + /** + * Look if there us some known file that need to be downloaded for the given syncedFolder + * @param syncedFolderId SyncedFolderId + * @param context context + * @return true if there is at least one file to download + */ + public static boolean syncedFolderHasContentToDownload(int syncedFolderId, Context context) { + final SyncedFileStateDAO dao; + try { + dao = openSyncedFileStateDAO(context, false); + return dao.countFileWaitingForDownloadForSyncedFolder(syncedFolderId) > 0; + } catch (SQLiteException e) { + Log.e(TAG, "SQLite error", e); + } + return false; + } + /** * Copy database file into user accessible directory for debuging purpose * @return path to the dump or null if failure diff --git a/app/src/main/java/foundation/e/drive/database/SyncedFileStateDAO.java b/app/src/main/java/foundation/e/drive/database/SyncedFileStateDAO.java index 58b7ff62..1d1c27df 100644 --- a/app/src/main/java/foundation/e/drive/database/SyncedFileStateDAO.java +++ b/app/src/main/java/foundation/e/drive/database/SyncedFileStateDAO.java @@ -148,7 +148,7 @@ class SyncedFileStateDAO { * ONLY list file that can be scan on device side * @param syncedFolderId ID of the given synced folder * @return number of file waiting to be uploaded - * @throws SQLiteDoneException SQL return 0 row + * @throws SQLiteDoneException SQL return 0 rows */ long countFileWaitingForUploadForSyncedFolder(long syncedFolderId) throws SQLiteDoneException { final String query = "SELECT COUNT(*) FROM " @@ -161,6 +161,25 @@ class SyncedFileStateDAO { return statement.simpleQueryForLong(); } + /** + * Count number of syncedFileState's entry with an eTag but no value for local last modified + * Only file that can be scan on cloud are listed + * @param syncedFolderId The id of the syncedFolder + * @return number of file waiting to be downloaded + * @throws SQLiteDoneException SQL return 0 rows + */ + long countFileWaitingForDownloadForSyncedFolder(int syncedFolderId) throws SQLiteDoneException{ + final String query = "SELECT COUNT(*) FROM " + + TABLE_NAME + + " WHERE " + SCANNABLE + " IN (1,3)" + + " AND " + LOCAL_LAST_MODIFIED + " = 0" + + " AND length(" + LAST_ETAG + ") > 0" + + " AND " + SYNCEDFOLDER_ID + " = "+syncedFolderId; + + final SQLiteStatement statement = mDB.compileStatement(query); + return statement.simpleQueryForLong(); + } + /** * Fetch many SyncedFileState by their syncedFolder's id * @param syncedFolderIds List of id of parent syncedFolder. @@ -254,4 +273,6 @@ class SyncedFileStateDAO { cursor.getInt(8) //scannable ); } + + } 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 e1e139db..4867176e 100644 --- a/app/src/main/java/foundation/e/drive/operations/ListFileRemoteOperation.java +++ b/app/src/main/java/foundation/e/drive/operations/ListFileRemoteOperation.java @@ -113,7 +113,8 @@ public class ListFileRemoteOperation extends RemoteOperation Date: Wed, 21 Sep 2022 11:48:39 +0200 Subject: [PATCH 4/8] fix inverted if statement in FileDiffUtils --- app/src/main/java/foundation/e/drive/utils/FileDiffUtils.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/foundation/e/drive/utils/FileDiffUtils.java b/app/src/main/java/foundation/e/drive/utils/FileDiffUtils.java index 2880ec2a..3e9410fe 100644 --- a/app/src/main/java/foundation/e/drive/utils/FileDiffUtils.java +++ b/app/src/main/java/foundation/e/drive/utils/FileDiffUtils.java @@ -43,7 +43,6 @@ public class FileDiffUtils { if (isRemoteSizeSameAsLocalSize(remoteFile, localFile)) { return Action.updateDB; } - return Action.Download; } @@ -80,7 +79,7 @@ public class FileDiffUtils { * @return true if localLastModified store in Database == 0 */ private static boolean hasAlreadyBeenDownloaded(SyncedFileState fileState) { - return fileState.getLocalLastModified() == 0L; + return fileState.getLocalLastModified() > 0L; } /** -- GitLab From 5b97a6ecb93ed2c89eecc020f7cd7b2c487c6d88 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Thu, 22 Sep 2022 14:29:40 +0000 Subject: [PATCH 5/8] Apply 1 suggestion(s) to 1 file(s) --- app/src/main/java/foundation/e/drive/database/DbHelper.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/foundation/e/drive/database/DbHelper.java b/app/src/main/java/foundation/e/drive/database/DbHelper.java index 4ad1f148..aa79e838 100644 --- a/app/src/main/java/foundation/e/drive/database/DbHelper.java +++ b/app/src/main/java/foundation/e/drive/database/DbHelper.java @@ -322,9 +322,8 @@ public final class DbHelper extends SQLiteOpenHelper { * @return true if there is at least one file to download */ public static boolean syncedFolderHasContentToDownload(int syncedFolderId, Context context) { - final SyncedFileStateDAO dao; try { - dao = openSyncedFileStateDAO(context, false); + SyncedFileStateDAO dao = openSyncedFileStateDAO(context, false); return dao.countFileWaitingForDownloadForSyncedFolder(syncedFolderId) > 0; } catch (SQLiteException e) { Log.e(TAG, "SQLite error", e); -- GitLab From 8fbd8facc87290994dd3e42c688fe41fd5097b67 Mon Sep 17 00:00:00 2001 From: Fahim Salam Chowdhury Date: Thu, 22 Sep 2022 14:29:46 +0000 Subject: [PATCH 6/8] Apply 1 suggestion(s) to 1 file(s) --- app/src/main/java/foundation/e/drive/database/DbHelper.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/foundation/e/drive/database/DbHelper.java b/app/src/main/java/foundation/e/drive/database/DbHelper.java index aa79e838..4895b3e2 100644 --- a/app/src/main/java/foundation/e/drive/database/DbHelper.java +++ b/app/src/main/java/foundation/e/drive/database/DbHelper.java @@ -305,9 +305,8 @@ public final class DbHelper extends SQLiteOpenHelper { * @return true if there is at least one file that need to be uploaded */ public static boolean syncedFolderHasContentToUpload(long syncedFolderID, Context context) { - final SyncedFileStateDAO dao; try { - dao = openSyncedFileStateDAO(context, false); + SyncedFileStateDAO dao = openSyncedFileStateDAO(context, false); return dao.countFileWaitingForUploadForSyncedFolder(syncedFolderID) > 0; } catch (SQLiteException e) { Log.e(TAG, "SQlite error", e); -- GitLab From 5d45467963318737a3f091fa85bd6fc319f03e37 Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 22 Sep 2022 16:31:42 +0200 Subject: [PATCH 7/8] Fix missing DB closure --- .../foundation/e/drive/database/DbHelper.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/foundation/e/drive/database/DbHelper.java b/app/src/main/java/foundation/e/drive/database/DbHelper.java index 4895b3e2..c0d2d9cb 100644 --- a/app/src/main/java/foundation/e/drive/database/DbHelper.java +++ b/app/src/main/java/foundation/e/drive/database/DbHelper.java @@ -305,13 +305,15 @@ public final class DbHelper extends SQLiteOpenHelper { * @return true if there is at least one file that need to be uploaded */ public static boolean syncedFolderHasContentToUpload(long syncedFolderID, Context context) { + boolean result = false; try { - SyncedFileStateDAO dao = openSyncedFileStateDAO(context, false); - return dao.countFileWaitingForUploadForSyncedFolder(syncedFolderID) > 0; + final SyncedFileStateDAO dao = openSyncedFileStateDAO(context, false); + result = dao.countFileWaitingForUploadForSyncedFolder(syncedFolderID) > 0; + dao.close(); } catch (SQLiteException e) { Log.e(TAG, "SQlite error", e); } - return false; + return result; } /** @@ -321,13 +323,15 @@ public final class DbHelper extends SQLiteOpenHelper { * @return true if there is at least one file to download */ public static boolean syncedFolderHasContentToDownload(int syncedFolderId, Context context) { + boolean result = false; try { - SyncedFileStateDAO dao = openSyncedFileStateDAO(context, false); - return dao.countFileWaitingForDownloadForSyncedFolder(syncedFolderId) > 0; + final SyncedFileStateDAO dao = openSyncedFileStateDAO(context, false); + result = dao.countFileWaitingForDownloadForSyncedFolder(syncedFolderId) > 0; + dao.close(); } catch (SQLiteException e) { Log.e(TAG, "SQLite error", e); } - return false; + return result; } /** -- GitLab From 05a08adcfb7452286644365ea01d5dadece575cf Mon Sep 17 00:00:00 2001 From: vincent Bourgmayer Date: Thu, 22 Sep 2022 16:34:11 +0200 Subject: [PATCH 8/8] remove empty line and bump version number --- app/build.gradle | 2 +- .../java/foundation/e/drive/database/SyncedFileStateDAO.java | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 8d11cf62..db4f90bc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ plugins { def versionMajor = 1 def versionMinor = 2 -def versionPatch = 2 +def versionPatch = 3 diff --git a/app/src/main/java/foundation/e/drive/database/SyncedFileStateDAO.java b/app/src/main/java/foundation/e/drive/database/SyncedFileStateDAO.java index 1d1c27df..9f93de59 100644 --- a/app/src/main/java/foundation/e/drive/database/SyncedFileStateDAO.java +++ b/app/src/main/java/foundation/e/drive/database/SyncedFileStateDAO.java @@ -273,6 +273,4 @@ class SyncedFileStateDAO { cursor.getInt(8) //scannable ); } - - -} +} \ No newline at end of file -- GitLab