Loading app/src/main/java/foundation/e/drive/services/InitializerService.java +43 −34 Original line number Diff line number Diff line Loading @@ -11,15 +11,18 @@ package foundation.e.drive.services; import android.accounts.Account; import android.accounts.AccountManager; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.IBinder; import android.support.annotation.Nullable; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.operations.OnRemoteOperationListener; Loading @@ -28,15 +31,18 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import foundation.e.drive.backgroundServices.CreateInitialRemoteFoldersIntentService; import foundation.e.drive.models.SyncedFolder; import foundation.e.drive.operations.CreateInitialFolderRemoteOperation; import foundation.e.drive.receivers.ScreenOffReceiver; import foundation.e.drive.utils.AppConstants; import foundation.e.drive.utils.CommonUtils; import foundation.e.drive.utils.JobUtils; import foundation.e.drive.utils.ServiceExceptionHandler; import static com.owncloud.android.lib.resources.files.FileUtils.PATH_SEPARATOR; import static foundation.e.drive.backgroundServices.CreateInitialRemoteFoldersIntentService.createFullPathKey; import static foundation.e.drive.backgroundServices.CreateInitialRemoteFoldersIntentService.syncedFolderKey; import static foundation.e.drive.utils.AppConstants.INITIALFOLDERS_NUMBER; import static foundation.e.drive.utils.AppConstants.MEDIA_SYNCABLE_CATEGORIES; import static foundation.e.drive.utils.AppConstants.SETTINGS_SYNCABLE_CATEGORIES; Loading @@ -44,7 +50,7 @@ import static foundation.e.drive.utils.AppConstants.SETTINGS_SYNCABLE_CATEGORIES /** * @author Vincent Bourgmayer */ public class InitializerService extends Service implements OnRemoteOperationListener { public class InitializerService extends Service { final private String TAG = InitializerService.class.getSimpleName(); //Complex properties private int existingRemoteFolderCounter; //@dev-only; Temporarily used to know if all remotePath exist Loading @@ -60,6 +66,9 @@ public class InitializerService extends Service implements OnRemoteOperationList super.onCreate(); this.existingRemoteFolderCounter = 0; //JobUtils.scheduleInitializerJob(getApplicationContext()); IntentFilter intentFilter = new IntentFilter(AppConstants.resultIntentActionKey); LocalBroadcastManager.getInstance(this).registerReceiver( folderCreationReceiver, intentFilter); } @Override Loading Loading @@ -110,7 +119,6 @@ public class InitializerService extends Service implements OnRemoteOperationList /** * start to do its job */ public void start() { Log.i(TAG, "start"); if (mCloudClient == null){ Loading Loading @@ -217,53 +225,40 @@ public class InitializerService extends Service implements OnRemoteOperationList if( this.mHandler == null ) this.mHandler = new Handler(); CreateInitialFolderRemoteOperation createFolderOperation = new CreateInitialFolderRemoteOperation( this.mSyncedFolders.get( this.existingRemoteFolderCounter ), true, this); Intent createFolderIntent = new Intent(this, CreateInitialRemoteFoldersIntentService.class); createFolderOperation.execute(this.mCloudClient, this, this.mHandler); createFolderIntent.putExtra(syncedFolderKey, mSyncedFolders.get(this.existingRemoteFolderCounter)); createFolderIntent.putExtra(createFullPathKey, true); createFolderIntent.putExtra(AppConstants.ACCOUNT_KEY_CODE, mAccount); startService(createFolderIntent); }else if(this.existingRemoteFolderCounter == this.mSyncedFolders.size() ){ doLastStep(); }else{ Log.e(TAG, "this.existingRemoteFolderCounter : "+this.existingRemoteFolderCounter+" > this.mSyncedFolders.size() : "+this.mSyncedFolders.size() ); this.stopSelf(); } } @Override public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) { Log.i(TAG, "onRemoteOperationFinish()"); if(operation instanceof CreateInitialFolderRemoteOperation){ if(result.isSuccess() || result.getCode() == RemoteOperationResult.ResultCode.FOLDER_ALREADY_EXISTS){ public void onFolderCreationResult(String resultCode, int httpResultCode){ if(resultCode.equals(RemoteOperationResult.ResultCode.OK) || resultCode.equals(RemoteOperationResult.ResultCode.FOLDER_ALREADY_EXISTS)){ this.existingRemoteFolderCounter+=1; CreateNextRemoteFolder(); }else if( result.getHttpCode() == 423 || result.getHttpCode() == 409){//file locked or conflict in result Log.e( TAG, result.getLogMessage() ); }else if(httpResultCode == 423 || httpResultCode == 409){ if( this.restartFolderCreationCounter < 3) { Log.w( TAG, " restart operation" ); operation.execute( this.mCloudClient, this, this.mHandler ); //operation.execute( this.mCloudClient, this, this.mHandler ); this.restartFolderCreationCounter+=1; }else{ Log.e(TAG, "Remote folder's creation failed due to conflict with server"); stopSelf(); } }else{ Log.e(TAG, result.getLogMessage()+" "+result.getHttpCode() ); Log.e(TAG, resultCode+" "+httpResultCode ); stopSelf(); } } } /** * Function to check if all remote folder have been created Loading Loading @@ -308,4 +303,18 @@ public class InitializerService extends Service implements OnRemoteOperationList public IBinder onBind(Intent intent) { return null; } private BroadcastReceiver folderCreationReceiver = new BroadcastReceiver(){ @Override public void onReceive(Context context, Intent intent) { Bundle extras; if(intent == null || (extras = intent.getExtras()) == null) { return; } String resultCode = extras.getString(AppConstants.resultCodeKey); int httpResultCode = extras.getInt(AppConstants.resultIntentHttpCodeKey); onFolderCreationResult(resultCode, httpResultCode); } }; } No newline at end of file app/src/main/java/foundation/e/drive/utils/AppConstants.java +15 −6 Original line number Diff line number Diff line Loading @@ -27,4 +27,13 @@ public abstract class AppConstants { public static final String[] MEDIA_SYNCABLE_CATEGORIES = new String[]{"Images", "Movies", "Music", "Ringtones", "Documents", "Podcasts"}; public static final String[] SETTINGS_SYNCABLE_CATEGORIES = new String[]{"Rom settings"}; //Initializer public static final String resultCodeKey = "result_code"; public static final String resultIntentActionKey = "CreateInitialFolderResult"; public static final String resultIntentHttpCodeKey = "result_http_code"; public static final String ACCOUNT_KEY_CODE = "account"; } Loading
app/src/main/java/foundation/e/drive/services/InitializerService.java +43 −34 Original line number Diff line number Diff line Loading @@ -11,15 +11,18 @@ package foundation.e.drive.services; import android.accounts.Account; import android.accounts.AccountManager; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.IBinder; import android.support.annotation.Nullable; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.operations.OnRemoteOperationListener; Loading @@ -28,15 +31,18 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import foundation.e.drive.backgroundServices.CreateInitialRemoteFoldersIntentService; import foundation.e.drive.models.SyncedFolder; import foundation.e.drive.operations.CreateInitialFolderRemoteOperation; import foundation.e.drive.receivers.ScreenOffReceiver; import foundation.e.drive.utils.AppConstants; import foundation.e.drive.utils.CommonUtils; import foundation.e.drive.utils.JobUtils; import foundation.e.drive.utils.ServiceExceptionHandler; import static com.owncloud.android.lib.resources.files.FileUtils.PATH_SEPARATOR; import static foundation.e.drive.backgroundServices.CreateInitialRemoteFoldersIntentService.createFullPathKey; import static foundation.e.drive.backgroundServices.CreateInitialRemoteFoldersIntentService.syncedFolderKey; import static foundation.e.drive.utils.AppConstants.INITIALFOLDERS_NUMBER; import static foundation.e.drive.utils.AppConstants.MEDIA_SYNCABLE_CATEGORIES; import static foundation.e.drive.utils.AppConstants.SETTINGS_SYNCABLE_CATEGORIES; Loading @@ -44,7 +50,7 @@ import static foundation.e.drive.utils.AppConstants.SETTINGS_SYNCABLE_CATEGORIES /** * @author Vincent Bourgmayer */ public class InitializerService extends Service implements OnRemoteOperationListener { public class InitializerService extends Service { final private String TAG = InitializerService.class.getSimpleName(); //Complex properties private int existingRemoteFolderCounter; //@dev-only; Temporarily used to know if all remotePath exist Loading @@ -60,6 +66,9 @@ public class InitializerService extends Service implements OnRemoteOperationList super.onCreate(); this.existingRemoteFolderCounter = 0; //JobUtils.scheduleInitializerJob(getApplicationContext()); IntentFilter intentFilter = new IntentFilter(AppConstants.resultIntentActionKey); LocalBroadcastManager.getInstance(this).registerReceiver( folderCreationReceiver, intentFilter); } @Override Loading Loading @@ -110,7 +119,6 @@ public class InitializerService extends Service implements OnRemoteOperationList /** * start to do its job */ public void start() { Log.i(TAG, "start"); if (mCloudClient == null){ Loading Loading @@ -217,53 +225,40 @@ public class InitializerService extends Service implements OnRemoteOperationList if( this.mHandler == null ) this.mHandler = new Handler(); CreateInitialFolderRemoteOperation createFolderOperation = new CreateInitialFolderRemoteOperation( this.mSyncedFolders.get( this.existingRemoteFolderCounter ), true, this); Intent createFolderIntent = new Intent(this, CreateInitialRemoteFoldersIntentService.class); createFolderOperation.execute(this.mCloudClient, this, this.mHandler); createFolderIntent.putExtra(syncedFolderKey, mSyncedFolders.get(this.existingRemoteFolderCounter)); createFolderIntent.putExtra(createFullPathKey, true); createFolderIntent.putExtra(AppConstants.ACCOUNT_KEY_CODE, mAccount); startService(createFolderIntent); }else if(this.existingRemoteFolderCounter == this.mSyncedFolders.size() ){ doLastStep(); }else{ Log.e(TAG, "this.existingRemoteFolderCounter : "+this.existingRemoteFolderCounter+" > this.mSyncedFolders.size() : "+this.mSyncedFolders.size() ); this.stopSelf(); } } @Override public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) { Log.i(TAG, "onRemoteOperationFinish()"); if(operation instanceof CreateInitialFolderRemoteOperation){ if(result.isSuccess() || result.getCode() == RemoteOperationResult.ResultCode.FOLDER_ALREADY_EXISTS){ public void onFolderCreationResult(String resultCode, int httpResultCode){ if(resultCode.equals(RemoteOperationResult.ResultCode.OK) || resultCode.equals(RemoteOperationResult.ResultCode.FOLDER_ALREADY_EXISTS)){ this.existingRemoteFolderCounter+=1; CreateNextRemoteFolder(); }else if( result.getHttpCode() == 423 || result.getHttpCode() == 409){//file locked or conflict in result Log.e( TAG, result.getLogMessage() ); }else if(httpResultCode == 423 || httpResultCode == 409){ if( this.restartFolderCreationCounter < 3) { Log.w( TAG, " restart operation" ); operation.execute( this.mCloudClient, this, this.mHandler ); //operation.execute( this.mCloudClient, this, this.mHandler ); this.restartFolderCreationCounter+=1; }else{ Log.e(TAG, "Remote folder's creation failed due to conflict with server"); stopSelf(); } }else{ Log.e(TAG, result.getLogMessage()+" "+result.getHttpCode() ); Log.e(TAG, resultCode+" "+httpResultCode ); stopSelf(); } } } /** * Function to check if all remote folder have been created Loading Loading @@ -308,4 +303,18 @@ public class InitializerService extends Service implements OnRemoteOperationList public IBinder onBind(Intent intent) { return null; } private BroadcastReceiver folderCreationReceiver = new BroadcastReceiver(){ @Override public void onReceive(Context context, Intent intent) { Bundle extras; if(intent == null || (extras = intent.getExtras()) == null) { return; } String resultCode = extras.getString(AppConstants.resultCodeKey); int httpResultCode = extras.getInt(AppConstants.resultIntentHttpCodeKey); onFolderCreationResult(resultCode, httpResultCode); } }; } No newline at end of file
app/src/main/java/foundation/e/drive/utils/AppConstants.java +15 −6 Original line number Diff line number Diff line Loading @@ -27,4 +27,13 @@ public abstract class AppConstants { public static final String[] MEDIA_SYNCABLE_CATEGORIES = new String[]{"Images", "Movies", "Music", "Ringtones", "Documents", "Podcasts"}; public static final String[] SETTINGS_SYNCABLE_CATEGORIES = new String[]{"Rom settings"}; //Initializer public static final String resultCodeKey = "result_code"; public static final String resultIntentActionKey = "CreateInitialFolderResult"; public static final String resultIntentHttpCodeKey = "result_http_code"; public static final String ACCOUNT_KEY_CODE = "account"; }