diff --git a/app/src/main/java/foundation/e/drive/models/FileObserver.java b/app/src/main/java/foundation/e/drive/models/FileObserver.java new file mode 100644 index 0000000000000000000000000000000000000000..9b5e76fc2cc3509c1fd0d9e5e3dc4d2df3a20d50 --- /dev/null +++ b/app/src/main/java/foundation/e/drive/models/FileObserver.java @@ -0,0 +1,33 @@ +package foundation.e.drive.models; + +import java.io.File; +import java.io.Serializable; +import java.util.List; + +public class FileObserver implements Serializable { + + private List files; + + //private List syncedFileStatesList; + + public FileObserver(List files) { + this.files = files; + + } + + public List getFiles() { + return files; + } + + public void setFiles(List files) { + this.files = files; + } + +// public List getSyncedFileStatesList() { +// return syncedFileStatesList; +// } +// +// public void setSyncedFileStatesList(List syncedFileStatesList) { +// this.syncedFileStatesList = syncedFileStatesList; +// } +} diff --git a/app/src/main/java/foundation/e/drive/models/SyncedFileState.java b/app/src/main/java/foundation/e/drive/models/SyncedFileState.java index 42c76a102482a4681845082e752f1edf57211f3d..e91d379013a20aa4e2dcbca215c9b83b315063cf 100644 --- a/app/src/main/java/foundation/e/drive/models/SyncedFileState.java +++ b/app/src/main/java/foundation/e/drive/models/SyncedFileState.java @@ -11,6 +11,8 @@ package foundation.e.drive.models; import android.os.Parcel; import android.os.Parcelable; +import java.io.Serializable; + /** * @author Vincent Bourgmayer * Describe a file state which will be Synchronized (= Synced) or which has already been synced one times diff --git a/app/src/main/java/foundation/e/drive/operations/UploadFileOperation.java b/app/src/main/java/foundation/e/drive/operations/UploadFileOperation.java index 88276a6b9703b773b4bdaf40e115b3b11e4e59e0..0ded25fa7bcceb59710911da088f84dcde6eae60 100644 --- a/app/src/main/java/foundation/e/drive/operations/UploadFileOperation.java +++ b/app/src/main/java/foundation/e/drive/operations/UploadFileOperation.java @@ -25,6 +25,7 @@ import java.io.File; import java.util.ArrayList; import foundation.e.drive.database.DbHelper; import foundation.e.drive.models.SyncedFileState; +import foundation.e.drive.services.InitializerService; import foundation.e.drive.utils.CommonUtils; /** @@ -136,6 +137,17 @@ public class UploadFileOperation extends RemoteOperation implements ComparableOp //if upload is a success if( uploadResult.isSuccess() ){ + Log.e(TAG, "upload is success ........................."+file.getName() + +" "+file.getAbsolutePath()); + + + Log.e(TAG, "files size before remove ........................."+InitializerService.files.size()); + + InitializerService.files.remove(file); + + Log.e(TAG, "files size after remove ........................."+InitializerService.files.size()); + + Object data = uploadResult.getSingleData(); if(data != null){ mSyncedState.setLastETAG((String) data); diff --git a/app/src/main/java/foundation/e/drive/services/FileObserverService.java b/app/src/main/java/foundation/e/drive/services/FileObserverService.java index 964fe206b7cd220036261c42b8bd0d8b04887164..ac48298fc213da722cc1a59f174a04ef423f0888 100644 --- a/app/src/main/java/foundation/e/drive/services/FileObserverService.java +++ b/app/src/main/java/foundation/e/drive/services/FileObserverService.java @@ -5,6 +5,7 @@ import android.app.Service; import android.content.Intent; import android.os.AsyncTask; import android.os.Build; +import android.os.Bundle; import android.os.Environment; import android.os.FileObserver; @@ -16,14 +17,20 @@ import android.support.annotation.Nullable; import android.util.Log; import java.io.File; +import java.util.ArrayList; +import java.util.List; +import foundation.e.drive.utils.CommonUtils; import foundation.e.drive.utils.RecursiveFileObserver; -public class FileObserverService extends Service { +public class FileObserverService extends Service { + + private final static String TAG = FileObserverService.class.getSimpleName(); RecursiveFileObserver mFileObserver = null; private int observerFlag=-1; + //List syncedFileStatesList=new ArrayList<>(); @Override @@ -53,7 +60,41 @@ public class FileObserverService extends Service { //Modify =2, create =256, delete =512, movedTo =128 if(event== FileObserver.CREATE || event==FileObserver.MODIFY || event== FileObserver.DELETE || event ==FileObserver.MOVED_TO){ - Log.d("OnEvent", "...Event ..." + event+"...file ..." + file); + Log.e("OnEvent", "...Event ..." + event+"...file ..." + file); + + //getting null + +// +// SyncedFileState syncedFileStates = DbHelper.loadSyncedFile(getApplicationContext(), file.getPath(), true); +// +// if(null==syncedFileStates){ +// syncedFileStates = new SyncedFileState(-1, file.getName(), file.getPath(), file.getRemoteFolder() + localFile.getName(), "", 0, syncedFolder.getId(), syncedFolder.isMediaType()); +// +// //Store it in DB +// int storedId = DbHelper.manageSyncedFileStateDB(newSyncedFileState, "INSERT", this); +// if(storedId > 0){ +// newSyncedFileState.setId( storedId ); +// Log.i(TAG, "Add upload operation for new file "+storedId); +// //create UploadOperation and add it into bundle +// UploadFileOperation uploadOperation = new UploadFileOperation(newSyncedFileState, syncedFolder.isScanRemote()); +// this.operationsForIntent.put(storedId, uploadOperation); +// }else{ +// Log.w(TAG, "The new file to synced cannot be store in DB. Ignore it"); +// } +// } +// syncedFileStatesList.add(syncedFileStates); + + if(!InitializerService.files.contains(file)){ + Log.e(TAG, "adding new file into files list "+file.getName() +" .... "+file.getAbsolutePath()); + InitializerService.files.add(file); + } + + + //Check internet + + // Add event in List + //InitializerService.fileObserver.add(file); + //call to ObserverService >> getSyncedFileState >> HandleLocal File try { @@ -110,21 +151,38 @@ public class FileObserverService extends Service { super.onPostExecute(s); // Log.d("onPostExecute", "...ObserverService Intent...post Execute " ); - final Handler handler = new Handler(); - handler.postDelayed(new Runnable() { - @Override - public void run() { - // Log.e("onPostExecute", "...ObserverService Intent..." ); - // Do something after 20s = 20000ms - Intent observersServiceIntent = new Intent(getApplicationContext(), foundation.e.drive.services.ObserverService.class); - startService(observersServiceIntent); - - observerFlag=-1; - } - }, 20000); + try { + Log.e("TAG", "========================================="); + Log.e("TAG", "File Observer to Observer services....."); + Intent observersServiceIntent = new Intent(getApplicationContext(), foundation.e.drive.services.ObserverService.class); + + Bundle mBundle = new Bundle(); + mBundle.putBoolean("isFileObserverService", true); + // mBundle.putByteArray("fileObserverObject", CommonUtils.convertToBytes(new foundation.e.drive.models.FileObserver(files))); + observersServiceIntent.putExtras(mBundle); + startService(observersServiceIntent); + }catch (Exception exception){ + exception.printStackTrace(); + } + observerFlag=-1; + +// final Handler handler = new Handler(); +// handler.postDelayed(new Runnable() { +// @Override +// public void run() { +// // Log.e("onPostExecute", "...ObserverService Intent..." ); +// // Do something after 20s = 20000ms +// +// +// +// +// +// } +// }, 20000); } + } diff --git a/app/src/main/java/foundation/e/drive/services/InitializerService.java b/app/src/main/java/foundation/e/drive/services/InitializerService.java index 36a1256cca6647e9a866e769e1f0ef64c7f9daf7..e6b204559998273d802fbb36329cfd083793ddad 100644 --- a/app/src/main/java/foundation/e/drive/services/InitializerService.java +++ b/app/src/main/java/foundation/e/drive/services/InitializerService.java @@ -28,6 +28,7 @@ import com.owncloud.android.lib.common.operations.OnRemoteOperationListener; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; +import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -61,6 +62,9 @@ public class InitializerService extends Service private int restartFolderCreationCounter =0; private ConnectivityReceiver connectivityReceiver; + public static List files=new ArrayList<>(); + // public static List fileObserver=new ArrayList<>(); + @Override public void onCreate() { Log.i(TAG, "onCreate()"); 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 dfd2873ebef992f461c2e242e31883bf3dd283f5..ab2dff787c92e38c1b1ba0be74002155eee70e97 100644 --- a/app/src/main/java/foundation/e/drive/services/ObserverService.java +++ b/app/src/main/java/foundation/e/drive/services/ObserverService.java @@ -15,6 +15,7 @@ import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageInfo; +import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Parcelable; @@ -69,6 +70,8 @@ public class ObserverService extends Service implements OnRemoteOperationListene private int initialFolderCounter; private Account mAccount; private HashMap operationsForIntent; + private Boolean isFileObserverService=false; + // private foundation.e.drive.models.FileObserver fileObserverObject; /* Lifecycle Methods */ @Override @@ -82,6 +85,16 @@ public class ObserverService extends Service implements OnRemoteOperationListene public int onStartCommand(Intent intent, int flags, int startId) { Log.i(TAG, "onStartCommand("+startId+")"); + try { + Bundle bundle = intent.getExtras(); + if(null!=bundle){ + isFileObserverService = bundle.getBoolean("isFileObserverService"); + // fileObserverObject = (foundation.e.drive.models.FileObserver)CommonUtils.convertFromBytes(bundle.getByteArray("fileObserverObject")); + } + }catch (Exception ex){ + ex.printStackTrace(); + } + CommonUtils.setServiceUnCaughtExceptionHandler(this); SharedPreferences prefs = this.getSharedPreferences(AppConstants.SHARED_PREFERENCE_NAME, Context.MODE_PRIVATE); @@ -239,7 +252,24 @@ public class ObserverService extends Service implements OnRemoteOperationListene return; } } else { - scanLocalFiles(); + if(isFileObserverService){ + + // List files = fileObserverObject.getFiles(); + DbHelper.updateSyncedFolders(mSyncedFolders, this); //@ToDo: maybe do this when all contents will be synced. + + List syncedFileStates = DbHelper.getSyncedFileStatesByFolders(this, + getIdsFromFolderToScan()); + + if(!syncedFileStates.isEmpty() || !InitializerService.files.isEmpty() ) { + handleLocalFiles(InitializerService.files, syncedFileStates); + } + + // handleLocalFiles(fileObserverObject.getFiles(), fileObserverObject.getSyncedFileStatesList()); + + }else { + scanLocalFiles(); + } + } } @@ -529,7 +559,8 @@ public class ObserverService extends Service implements OnRemoteOperationListene * Prepare the list of files and SyncedFileState for synchronisation */ private void scanLocalFiles(){ - Log.i( TAG, "scanLocalFiles()" ); + Log.e( TAG, "========================================================" ); + Log.e( TAG, "scanLocalFiles()" ); List fileList = new ArrayList<>(); List folderIdList= new ArrayList<>(); boolean contentToSyncFound = false; @@ -619,6 +650,7 @@ public class ObserverService extends Service implements OnRemoteOperationListene if(contentToSyncFound) { DbHelper.updateSyncedFolders(mSyncedFolders, this); //@ToDo: maybe do this when all contents will be synced. + List syncedFileStates = DbHelper.getSyncedFileStatesByFolders(this, folderIdList); @@ -637,7 +669,8 @@ public class ObserverService extends Service implements OnRemoteOperationListene * @param syncedFileStates List of SyncedFileState to scan */ private void handleLocalFiles(List localFileList, List syncedFileStates ){ - Log.i(TAG, "handleLocalFiles()"); + Log.e( TAG, "========================================================" ); + Log.e(TAG, "handleLocalFiles()"); Log.d(TAG, "Loop through local file list"); Log.v(TAG, "format: filePath, exist, lastModified) :"); 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 2d1c16e2075583f573ec17e3d5845d66938b3a93..98a9841bc5c894ba87c2e51e23e9297a9ee1a805 100644 --- a/app/src/main/java/foundation/e/drive/utils/CommonUtils.java +++ b/app/src/main/java/foundation/e/drive/utils/CommonUtils.java @@ -30,7 +30,12 @@ import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; import com.owncloud.android.lib.common.accounts.AccountUtils; import com.owncloud.android.lib.resources.files.FileUtils; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import foundation.e.drive.receivers.ScreenOffReceiver; @@ -291,4 +296,26 @@ public abstract class CommonUtils { + "\n File can be read?: " + f.canRead() + "\n File can be written?: " + f.canWrite(); } + + /* + this function convert object to bytes + */ + public static byte[] convertToBytes(Object object) throws IOException { + try (ByteArrayOutputStream bos = new ByteArrayOutputStream(); + ObjectOutputStream out = new ObjectOutputStream(bos)) { + out.writeObject(object); + return bos.toByteArray(); + } + } + + /* + this function convert bytes to Object + */ + public static Object convertFromBytes(byte[] bytes) throws IOException, ClassNotFoundException { + try (ByteArrayInputStream bis = new ByteArrayInputStream(bytes); + ObjectInputStream in = new ObjectInputStream(bis)) { + return in.readObject(); + } + } + } \ No newline at end of file