Browse Source

SyncedFolderProvider: pass Clock dependency via constructor instead of dagger

Signed-off-by: Alice Gaudon <alice@gaudon.pro>
Alice Gaudon 5 years ago
parent
commit
2e13212752

+ 6 - 3
src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt

@@ -26,6 +26,7 @@ import androidx.annotation.RequiresApi
 import androidx.work.ListenableWorker
 import androidx.work.WorkerFactory
 import androidx.work.WorkerParameters
+import com.nextcloud.client.core.Clock
 import com.nextcloud.client.device.DeviceInfo
 import com.nextcloud.client.device.PowerManagementService
 import com.nextcloud.client.preferences.AppPreferences
@@ -40,6 +41,7 @@ import javax.inject.Provider
 class BackgroundJobFactory @Inject constructor(
     private val preferences: AppPreferences,
     private val contentResolver: ContentResolver,
+    private val clock: Clock,
     private val powerManagerService: PowerManagementService,
     private val backgroundJobManager: Provider<BackgroundJobManager>,
     private val deviceInfo: DeviceInfo
@@ -58,13 +60,14 @@ class BackgroundJobFactory @Inject constructor(
         }
 
         return when (workerClass) {
-            ContentObserverWork::class -> createContentObserverJob(context, workerParameters)
+            ContentObserverWork::class -> createContentObserverJob(context, workerParameters, clock)
             else -> null // falls back to default factory
         }
     }
 
-    private fun createContentObserverJob(context: Context, workerParameters: WorkerParameters): ListenableWorker? {
-        val folderResolver = SyncedFolderProvider(contentResolver, preferences)
+    private fun createContentObserverJob(context: Context, workerParameters: WorkerParameters, clock: Clock):
+        ListenableWorker? {
+        val folderResolver = SyncedFolderProvider(contentResolver, preferences, clock)
         @RequiresApi(Build.VERSION_CODES.N)
         if (deviceInfo.apiLevel >= Build.VERSION_CODES.N) {
             return ContentObserverWork(

+ 22 - 15
src/main/java/com/owncloud/android/MainApp.java

@@ -45,6 +45,7 @@ import com.evernote.android.job.JobManager;
 import com.evernote.android.job.JobRequest;
 import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.appinfo.AppInfo;
+import com.nextcloud.client.core.Clock;
 import com.nextcloud.client.device.PowerManagementService;
 import com.nextcloud.client.di.ActivityInjector;
 import com.nextcloud.client.di.DaggerAppComponent;
@@ -161,6 +162,9 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
     @Inject
     BackgroundJobManager backgroundJobManager;
 
+    @Inject
+    Clock clock;
+
     private PassCodeManager passCodeManager;
 
     @SuppressWarnings("unused")
@@ -268,7 +272,8 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
                 preferences,
                 uploadsStorageManager,
                 connectivityService,
-                powerManagementService
+                powerManagementService,
+                clock
             )
         );
 
@@ -304,7 +309,8 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
                            accountManager,
                            connectivityService,
                            powerManagementService,
-                           backgroundJobManager);
+                           backgroundJobManager,
+                           clock);
         initContactsBackup(accountManager);
         notificationChannels();
 
@@ -462,23 +468,24 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
         final UserAccountManager accountManager,
         final ConnectivityService connectivityService,
         final PowerManagementService powerManagementService,
-        final BackgroundJobManager jobManager
+        final BackgroundJobManager jobManager,
+        final Clock clock
     ) {
         updateToAutoUpload();
-        cleanOldEntries();
-        updateAutoUploadEntries();
+        cleanOldEntries(clock);
+        updateAutoUploadEntries(clock);
 
         if (getAppContext() != null) {
             if (PermissionUtil.checkSelfPermission(getAppContext(),
                                                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
-                splitOutAutoUploadEntries();
+                splitOutAutoUploadEntries(clock);
             } else {
                 AppPreferences preferences = AppPreferencesImpl.fromContext(getAppContext());
                 preferences.setAutoUploadSplitEntriesEnabled(true);
             }
         }
 
-        initiateExistingAutoUploadEntries();
+        initiateExistingAutoUploadEntries(clock);
 
         FilesSyncHelper.scheduleFilesSyncIfNeeded(mContext, jobManager);
         FilesSyncHelper.restartJobsIfNeeded(
@@ -685,18 +692,18 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
         }
     }
 
-    private static void updateAutoUploadEntries() {
+    private static void updateAutoUploadEntries(Clock clock) {
         // updates entries to reflect their true paths
         Context context = getAppContext();
         AppPreferences preferences = AppPreferencesImpl.fromContext(context);
         if (!preferences.isAutoUploadPathsUpdateEnabled()) {
             SyncedFolderProvider syncedFolderProvider =
-                new SyncedFolderProvider(MainApp.getAppContext().getContentResolver(), preferences);
+                new SyncedFolderProvider(MainApp.getAppContext().getContentResolver(), preferences, clock);
             syncedFolderProvider.updateAutoUploadPaths(mContext);
         }
     }
 
-    private static void splitOutAutoUploadEntries() {
+    private static void splitOutAutoUploadEntries(Clock clock) {
         Context context = getAppContext();
         AppPreferences preferences = AppPreferencesImpl.fromContext(context);
         if (!preferences.isAutoUploadSplitEntriesEnabled()) {
@@ -705,7 +712,7 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
             Log_OC.i(TAG, "Migrate synced_folders records for image/video split");
             ContentResolver contentResolver = context.getContentResolver();
 
-            SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider(contentResolver, preferences);
+            SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider(contentResolver, preferences, clock);
 
             final List<MediaFolder> imageMediaFolders = MediaProvider.getImageFolders(contentResolver, 1, null, true);
             final List<MediaFolder> videoMediaFolders = MediaProvider.getVideoFolders(contentResolver, 1, null, true);
@@ -751,12 +758,12 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
         }
     }
 
-    private static void initiateExistingAutoUploadEntries() {
+    private static void initiateExistingAutoUploadEntries(Clock clock) {
         new Thread(() -> {
             AppPreferences preferences = AppPreferencesImpl.fromContext(getAppContext());
             if (!preferences.isAutoUploadInitialized()) {
                 SyncedFolderProvider syncedFolderProvider =
-                    new SyncedFolderProvider(MainApp.getAppContext().getContentResolver(), preferences);
+                    new SyncedFolderProvider(MainApp.getAppContext().getContentResolver(), preferences, clock);
 
                 for (SyncedFolder syncedFolder : syncedFolderProvider.getSyncedFolders()) {
                     if (syncedFolder.isEnabled()) {
@@ -770,7 +777,7 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
         }).start();
     }
 
-    private static void cleanOldEntries() {
+    private static void cleanOldEntries(Clock clock) {
         // previous versions of application created broken entries in the SyncedFolderProvider
         // database, and this cleans all that and leaves 1 (newest) entry per synced folder
 
@@ -779,7 +786,7 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
 
         if (!preferences.isLegacyClean()) {
             SyncedFolderProvider syncedFolderProvider =
-                new SyncedFolderProvider(context.getContentResolver(), preferences);
+                new SyncedFolderProvider(context.getContentResolver(), preferences, clock);
 
             List<SyncedFolder> syncedFolderList = syncedFolderProvider.getSyncedFolders();
             Map<Pair<String, String>, Long> syncedFolders = new HashMap<>();

+ 5 - 7
src/main/java/com/owncloud/android/datamodel/SyncedFolderProvider.java

@@ -38,8 +38,6 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Observable;
 
-import javax.inject.Inject;
-
 import androidx.annotation.NonNull;
 
 import static com.owncloud.android.datamodel.OCFile.PATH_SEPARATOR;
@@ -50,22 +48,22 @@ import static com.owncloud.android.datamodel.OCFile.PATH_SEPARATOR;
 public class SyncedFolderProvider extends Observable {
     static private final String TAG = SyncedFolderProvider.class.getSimpleName();
 
-    private ContentResolver mContentResolver;
-    private AppPreferences preferences;
-
-    @Inject protected Clock clock;
+    private final ContentResolver mContentResolver;
+    private final AppPreferences preferences;
+    private final Clock clock;
 
     /**
      * constructor.
      *
      * @param contentResolver the ContentResolver to work with.
      */
-    public SyncedFolderProvider(ContentResolver contentResolver, AppPreferences preferences) {
+    public SyncedFolderProvider(ContentResolver contentResolver, AppPreferences preferences, Clock clock) {
         if (contentResolver == null) {
             throw new IllegalArgumentException("Cannot create an instance with a NULL contentResolver");
         }
         mContentResolver = contentResolver;
         this.preferences = preferences;
+        this.clock = clock;
     }
 
     /**

+ 4 - 1
src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java

@@ -28,6 +28,7 @@ import android.content.Context;
 import android.content.Intent;
 
 import com.nextcloud.client.account.UserAccountManager;
+import com.nextcloud.client.core.Clock;
 import com.nextcloud.client.device.PowerManagementService;
 import com.nextcloud.client.jobs.BackgroundJobManager;
 import com.nextcloud.client.network.ConnectivityService;
@@ -53,6 +54,7 @@ public class BootupBroadcastReceiver extends BroadcastReceiver {
     @Inject ConnectivityService connectivityService;
     @Inject PowerManagementService powerManagementService;
     @Inject BackgroundJobManager backgroundJobManager;
+    @Inject Clock clock;
 
     /**
      * Receives broadcast intent reporting that the system was just boot up.
@@ -69,7 +71,8 @@ public class BootupBroadcastReceiver extends BroadcastReceiver {
                                        accountManager,
                                        connectivityService,
                                        powerManagementService,
-                                       backgroundJobManager);
+                                       backgroundJobManager,
+                                       clock);
             MainApp.initContactsBackup(accountManager);
         } else {
             Log_OC.d(TAG, "Getting wrong intent: " + intent.getAction());

+ 10 - 6
src/main/java/com/owncloud/android/jobs/AccountRemovalJob.java

@@ -38,6 +38,7 @@ import com.evernote.android.job.Job;
 import com.evernote.android.job.util.support.PersistableBundleCompat;
 import com.google.gson.Gson;
 import com.nextcloud.client.account.UserAccountManager;
+import com.nextcloud.client.core.Clock;
 import com.nextcloud.client.preferences.AppPreferencesImpl;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
@@ -80,12 +81,14 @@ public class AccountRemovalJob extends Job implements AccountManagerCallback<Boo
     public static final String ACCOUNT = "account";
     public static final String REMOTE_WIPE = "remote_wipe";
 
-    private UploadsStorageManager uploadsStorageManager;
-    private UserAccountManager userAccountManager;
+    private final UploadsStorageManager uploadsStorageManager;
+    private final UserAccountManager userAccountManager;
+    private final Clock clock;
 
-    public AccountRemovalJob(UploadsStorageManager uploadStorageManager, UserAccountManager accountManager) {
+    public AccountRemovalJob(UploadsStorageManager uploadStorageManager, UserAccountManager accountManager, Clock clock) {
         this.uploadsStorageManager = uploadStorageManager;
         this.userAccountManager = accountManager;
+        this.clock = clock;
     }
 
     @NonNull
@@ -128,7 +131,7 @@ public class AccountRemovalJob extends Job implements AccountManagerCallback<Boo
             arbitraryDataProvider.deleteKeyForAccount(account.name, PENDING_FOR_REMOVAL);
 
             // remove synced folders set for account
-            remoceSyncedFolders(context, account);
+            remoceSyncedFolders(context, account, clock);
 
             // delete all uploads for account
             uploadsStorageManager.removeAccountUploads(account);
@@ -173,9 +176,10 @@ public class AccountRemovalJob extends Job implements AccountManagerCallback<Boo
         }
     }
 
-    private void remoceSyncedFolders(Context context, Account account) {
+    private void remoceSyncedFolders(Context context, Account account, Clock clock) {
         SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider(context.getContentResolver(),
-                                                                             AppPreferencesImpl.fromContext(context));
+                                                                             AppPreferencesImpl.fromContext(context),
+                                                                             clock);
         List<SyncedFolder> syncedFolders = syncedFolderProvider.getSyncedFolders();
 
         List<Long> syncedFolderIds = new ArrayList<>();

+ 12 - 9
src/main/java/com/owncloud/android/jobs/FilesSyncJob.java

@@ -34,6 +34,7 @@ import android.text.TextUtils;
 import com.evernote.android.job.Job;
 import com.evernote.android.job.util.support.PersistableBundleCompat;
 import com.nextcloud.client.account.UserAccountManager;
+import com.nextcloud.client.core.Clock;
 import com.nextcloud.client.device.PowerManagementService;
 import com.nextcloud.client.network.ConnectivityService;
 import com.nextcloud.client.preferences.AppPreferences;
@@ -76,22 +77,25 @@ public class FilesSyncJob extends Job {
     public static final String OVERRIDE_POWER_SAVING = "overridePowerSaving";
     private static final String WAKELOCK_TAG_SEPARATION = ":";
 
-    private UserAccountManager userAccountManager;
-    private AppPreferences preferences;
-    private UploadsStorageManager uploadsStorageManager;
-    private ConnectivityService connectivityService;
-    private PowerManagementService powerManagementService;
+    private final UserAccountManager userAccountManager;
+    private final AppPreferences preferences;
+    private final UploadsStorageManager uploadsStorageManager;
+    private final ConnectivityService connectivityService;
+    private final PowerManagementService powerManagementService;
+    private final Clock clock;
 
     FilesSyncJob(final UserAccountManager userAccountManager,
                         final AppPreferences preferences,
                         final UploadsStorageManager uploadsStorageManager,
                         final ConnectivityService connectivityService,
-                        final PowerManagementService powerManagementService) {
+                        final PowerManagementService powerManagementService,
+                        final Clock clock) {
         this.userAccountManager = userAccountManager;
         this.preferences = preferences;
         this.uploadsStorageManager = uploadsStorageManager;
         this.connectivityService = connectivityService;
         this.powerManagementService = powerManagementService;
+        this.clock = clock;
     }
 
     @NonNull
@@ -126,13 +130,12 @@ public class FilesSyncJob extends Job {
                                             userAccountManager,
                                             connectivityService,
                                             powerManagementService);
-        FilesSyncHelper.insertAllDBEntries(preferences, skipCustom);
+        FilesSyncHelper.insertAllDBEntries(preferences, clock, skipCustom);
 
         // Create all the providers we'll need
         final ContentResolver contentResolver = context.getContentResolver();
         final FilesystemDataProvider filesystemDataProvider = new FilesystemDataProvider(contentResolver);
-        SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider(contentResolver,
-                                                                             preferences);
+        SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider(contentResolver, preferences, clock);
 
         Locale currentLocale = context.getResources().getConfiguration().locale;
         SimpleDateFormat sFormatter = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss", currentLocale);

+ 8 - 4
src/main/java/com/owncloud/android/jobs/MediaFoldersDetectionJob.java

@@ -39,6 +39,7 @@ import android.text.TextUtils;
 import com.evernote.android.job.Job;
 import com.google.gson.Gson;
 import com.nextcloud.client.account.UserAccountManager;
+import com.nextcloud.client.core.Clock;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.client.preferences.AppPreferencesImpl;
 import com.owncloud.android.R;
@@ -74,11 +75,13 @@ public class MediaFoldersDetectionJob extends Job {
 
     private static final String DISABLE_DETECTION_CLICK = "DISABLE_DETECTION_CLICK";
 
-    private UserAccountManager userAccountManager;
-    private Random randomId = new Random();
+    private final UserAccountManager userAccountManager;
+    private final Clock clock;
+    private final Random randomId = new Random();
 
-    MediaFoldersDetectionJob(UserAccountManager accountManager) {
+    MediaFoldersDetectionJob(UserAccountManager accountManager, Clock clock) {
         this.userAccountManager = accountManager;
+        this.clock = clock;
     }
 
     @NonNull
@@ -88,7 +91,8 @@ public class MediaFoldersDetectionJob extends Job {
         ContentResolver contentResolver = context.getContentResolver();
         ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(contentResolver);
         SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider(contentResolver,
-                                                                             AppPreferencesImpl.fromContext(context));
+                                                                             AppPreferencesImpl.fromContext(context),
+                                                                             clock);
         Gson gson = new Gson();
         String arbitraryDataString;
         MediaFoldersModel mediaFoldersModel;

+ 9 - 4
src/main/java/com/owncloud/android/jobs/NCJobCreator.java

@@ -29,6 +29,7 @@ import android.content.Context;
 import com.evernote.android.job.Job;
 import com.evernote.android.job.JobCreator;
 import com.nextcloud.client.account.UserAccountManager;
+import com.nextcloud.client.core.Clock;
 import com.nextcloud.client.device.PowerManagementService;
 import com.nextcloud.client.network.ConnectivityService;
 import com.nextcloud.client.preferences.AppPreferences;
@@ -48,6 +49,7 @@ public class NCJobCreator implements JobCreator {
     private final UploadsStorageManager uploadsStorageManager;
     private final ConnectivityService connectivityService;
     private final PowerManagementService powerManagementService;
+    private final Clock clock;
 
     public NCJobCreator(
         Context context,
@@ -55,7 +57,8 @@ public class NCJobCreator implements JobCreator {
         AppPreferences preferences,
         UploadsStorageManager uploadsStorageManager,
         ConnectivityService connectivityServices,
-        PowerManagementService powerManagementService
+        PowerManagementService powerManagementService,
+        Clock clock
     ) {
         this.context = context;
         this.accountManager = accountManager;
@@ -63,6 +66,7 @@ public class NCJobCreator implements JobCreator {
         this.uploadsStorageManager = uploadsStorageManager;
         this.connectivityService = connectivityServices;
         this.powerManagementService = powerManagementService;
+        this.clock = clock;
     }
 
     @Override
@@ -73,19 +77,20 @@ public class NCJobCreator implements JobCreator {
             case ContactsImportJob.TAG:
                 return new ContactsImportJob();
             case AccountRemovalJob.TAG:
-                return new AccountRemovalJob(uploadsStorageManager, accountManager);
+                return new AccountRemovalJob(uploadsStorageManager, accountManager, clock);
             case FilesSyncJob.TAG:
                 return new FilesSyncJob(accountManager,
                                         preferences,
                                         uploadsStorageManager,
                                         connectivityService,
-                                        powerManagementService);
+                                        powerManagementService,
+                                        clock);
             case OfflineSyncJob.TAG:
                 return new OfflineSyncJob(accountManager, connectivityService, powerManagementService);
             case NotificationJob.TAG:
                 return new NotificationJob(context, accountManager);
             case MediaFoldersDetectionJob.TAG:
-                return new MediaFoldersDetectionJob(accountManager);
+                return new MediaFoldersDetectionJob(accountManager, clock);
             default:
                 return null;
         }

+ 1 - 1
src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.java

@@ -225,7 +225,7 @@ public class SyncedFoldersActivity extends FileActivity implements SyncedFolderA
         final int gridWidth = getResources().getInteger(R.integer.media_grid_width);
         boolean lightVersion = getResources().getBoolean(R.bool.syncedFolder_light);
         mAdapter = new SyncedFolderAdapter(this, clock, gridWidth, this, lightVersion);
-        mSyncedFolderProvider = new SyncedFolderProvider(getContentResolver(), preferences);
+        mSyncedFolderProvider = new SyncedFolderProvider(getContentResolver(), preferences, clock);
 
         final GridLayoutManager lm = new GridLayoutManager(this, gridWidth);
         mAdapter.setLayoutManager(lm);

+ 3 - 3
src/main/java/com/owncloud/android/utils/FilesSyncHelper.java

@@ -35,6 +35,7 @@ import android.util.Log;
 import com.evernote.android.job.JobManager;
 import com.evernote.android.job.JobRequest;
 import com.nextcloud.client.account.UserAccountManager;
+import com.nextcloud.client.core.Clock;
 import com.nextcloud.client.device.PowerManagementService;
 import com.nextcloud.client.jobs.BackgroundJobManager;
 import com.nextcloud.client.network.ConnectivityService;
@@ -126,11 +127,10 @@ public final class FilesSyncHelper {
         }
     }
 
-    public static void insertAllDBEntries(AppPreferences preferences, boolean skipCustom) {
+    public static void insertAllDBEntries(AppPreferences preferences, Clock clock, boolean skipCustom) {
         final Context context = MainApp.getAppContext();
         final ContentResolver contentResolver = context.getContentResolver();
-        SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider(contentResolver,
-                                                                             preferences);
+        SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider(contentResolver, preferences, clock);
 
         for (SyncedFolder syncedFolder : syncedFolderProvider.getSyncedFolders()) {
             if (syncedFolder.isEnabled() && (MediaFolderType.CUSTOM != syncedFolder.getType() || !skipCustom)) {

+ 5 - 0
src/test/java/com/nextcloud/client/jobs/BackgroundJobFactoryTest.kt

@@ -24,6 +24,7 @@ import android.content.ContentResolver
 import android.content.Context
 import android.os.Build
 import androidx.work.WorkerParameters
+import com.nextcloud.client.core.Clock
 import com.nextcloud.client.device.DeviceInfo
 import com.nextcloud.client.device.PowerManagementService
 import com.nextcloud.client.preferences.AppPreferences
@@ -59,6 +60,9 @@ class BackgroundJobFactoryTest {
     @Mock
     private lateinit var deviceInfo: DeviceInfo
 
+    @Mock
+    private lateinit var clock: Clock
+
     private lateinit var factory: BackgroundJobFactory
 
     @Before
@@ -67,6 +71,7 @@ class BackgroundJobFactoryTest {
         factory = BackgroundJobFactory(
             preferences,
             contentResolver,
+            clock,
             powerManagementService,
             Provider { backgroundJobManager },
             deviceInfo