Browse Source

Improve media folders detection

Signed-off-by: Mario Danic <mario@lovelyhq.com>
Mario Danic 7 years ago
parent
commit
d2b2a3f57c

+ 18 - 0
src/main/java/com/owncloud/android/datamodel/SyncedFolderProvider.java

@@ -78,6 +78,24 @@ public class SyncedFolderProvider extends Observable {
         }
         }
     }
     }
 
 
+    public int countEnabledSyncedFolders() {
+        int count = 0;
+        Cursor cursor = mContentResolver.query(
+                ProviderMeta.ProviderTableMeta.CONTENT_URI_SYNCED_FOLDERS,
+                new String[]{ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_ENABLED},
+                ProviderMeta.ProviderTableMeta.SYNCED_FOLDER_ENABLED + " == 1",
+                null,
+                null
+        );
+
+        if (cursor != null) {
+             count = cursor.getCount();
+             cursor.close();
+        }
+
+        return count;
+    }
+
     /**
     /**
      * get all synced folder entries.
      * get all synced folder entries.
      *
      *

+ 16 - 11
src/main/java/com/owncloud/android/jobs/NContentObserverJob.java

@@ -28,11 +28,13 @@ import android.support.annotation.RequiresApi;
 
 
 import com.evernote.android.job.JobRequest;
 import com.evernote.android.job.JobRequest;
 import com.evernote.android.job.util.support.PersistableBundleCompat;
 import com.evernote.android.job.util.support.PersistableBundleCompat;
+import com.owncloud.android.datamodel.SyncedFolderProvider;
 import com.owncloud.android.utils.FilesSyncHelper;
 import com.owncloud.android.utils.FilesSyncHelper;
 import com.owncloud.android.utils.PowerUtils;
 import com.owncloud.android.utils.PowerUtils;
 
 
 /*
 /*
     Job that triggers new FilesSyncJob in case new photo or video were detected
     Job that triggers new FilesSyncJob in case new photo or video were detected
+    and starts a job to find new media folders
  */
  */
 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 public class NContentObserverJob extends JobService {
 public class NContentObserverJob extends JobService {
@@ -42,18 +44,21 @@ public class NContentObserverJob extends JobService {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             if (params.getJobId() == FilesSyncHelper.ContentSyncJobId && params.getTriggeredContentAuthorities()
             if (params.getJobId() == FilesSyncHelper.ContentSyncJobId && params.getTriggeredContentAuthorities()
                     != null && params.getTriggeredContentUris() != null
                     != null && params.getTriggeredContentUris() != null
-                    && params.getTriggeredContentUris().length > 0
-                    && !PowerUtils.isPowerSaveMode(getApplicationContext())) {
+                    && params.getTriggeredContentUris().length > 0) {
 
 
-                PersistableBundleCompat persistableBundleCompat = new PersistableBundleCompat();
-                persistableBundleCompat.putBoolean(FilesSyncJob.SKIP_CUSTOM, true);
+                SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider(getContentResolver());
+                if (!PowerUtils.isPowerSaveMode(getApplicationContext()) && syncedFolderProvider
+                        .countEnabledSyncedFolders() > 0) {
+                    PersistableBundleCompat persistableBundleCompat = new PersistableBundleCompat();
+                    persistableBundleCompat.putBoolean(FilesSyncJob.SKIP_CUSTOM, true);
 
 
-                new JobRequest.Builder(FilesSyncJob.TAG)
-                        .startNow()
-                        .setExtras(persistableBundleCompat)
-                        .setUpdateCurrent(false)
-                        .build()
-                        .schedule();
+                    new JobRequest.Builder(FilesSyncJob.TAG)
+                            .startNow()
+                            .setExtras(persistableBundleCompat)
+                            .setUpdateCurrent(false)
+                            .build()
+                            .schedule();
+                }
 
 
                 new JobRequest.Builder(MediaFoldersDetectionJob.TAG)
                 new JobRequest.Builder(MediaFoldersDetectionJob.TAG)
                         .startNow()
                         .startNow()
@@ -63,7 +68,7 @@ public class NContentObserverJob extends JobService {
 
 
             }
             }
 
 
-            FilesSyncHelper.scheduleNJobs(true, getApplicationContext());
+            FilesSyncHelper.scheduleJobOnN();
         }
         }
 
 
         return true;
         return true;

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

@@ -60,7 +60,6 @@ import org.lukhnos.nnio.file.attribute.BasicFileAttributes;
 
 
 import java.io.File;
 import java.io.File;
 import java.io.IOException;
 import java.io.IOException;
-import java.util.List;
 import java.util.Set;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
 
 
@@ -241,51 +240,6 @@ public class FilesSyncHelper {
     }
     }
 
 
     @RequiresApi(api = Build.VERSION_CODES.N)
     @RequiresApi(api = Build.VERSION_CODES.N)
-    public static boolean isContentObserverJobScheduled() {
-        JobScheduler js = MainApp.getAppContext().getSystemService(JobScheduler.class);
-        List<JobInfo> jobs = js.getAllPendingJobs();
-
-        if (jobs == null || jobs.size() == 0) {
-            return false;
-        }
-
-        for (int i = 0; i < jobs.size(); i++) {
-            if (jobs.get(i).getId() == ContentSyncJobId) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public static void scheduleNJobs(boolean force, Context context) {
-        SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider(context.getContentResolver());
-
-
-        boolean hasVideoFolders = false;
-        boolean hasImageFolders = false;
-
-        if (syncedFolderProvider.getSyncedFolders() != null) {
-            for (SyncedFolder syncedFolder : syncedFolderProvider.getSyncedFolders()) {
-                if (MediaFolderType.VIDEO == syncedFolder.getType()) {
-                    hasVideoFolders = true;
-                } else if (MediaFolderType.IMAGE == syncedFolder.getType()) {
-                    hasImageFolders = true;
-                }
-            }
-        }
-
-        if (hasImageFolders || hasVideoFolders) {
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-                scheduleJobOnN(hasImageFolders, hasVideoFolders, force);
-            }
-        } else {
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-                cancelJobOnN();
-            }
-        }
-    }
-
     public static void scheduleFilesSyncIfNeeded(Context context) {
     public static void scheduleFilesSyncIfNeeded(Context context) {
         // always run this because it also allows us to perform retries of manual uploads
         // always run this because it also allows us to perform retries of manual uploads
         new JobRequest.Builder(FilesSyncJob.TAG)
         new JobRequest.Builder(FilesSyncJob.TAG)
@@ -295,7 +249,9 @@ public class FilesSyncHelper {
                 .schedule();
                 .schedule();
 
 
         if (context != null) {
         if (context != null) {
-            scheduleNJobs(false, context);
+            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+                scheduleJobOnN();
+            }
         }
         }
     }
     }
 
 
@@ -310,21 +266,11 @@ public class FilesSyncHelper {
         }
         }
     }
     }
 
 
-
-    @RequiresApi(api = Build.VERSION_CODES.N)
-    private static void cancelJobOnN() {
-        JobScheduler jobScheduler = MainApp.getAppContext().getSystemService(JobScheduler.class);
-        if (isContentObserverJobScheduled()) {
-            jobScheduler.cancel(ContentSyncJobId);
-        }
-    }
-
     @RequiresApi(api = Build.VERSION_CODES.N)
     @RequiresApi(api = Build.VERSION_CODES.N)
-    private static void scheduleJobOnN(boolean hasImageFolders, boolean hasVideoFolders,
-                                       boolean force) {
+    public static void scheduleJobOnN() {
         JobScheduler jobScheduler = MainApp.getAppContext().getSystemService(JobScheduler.class);
         JobScheduler jobScheduler = MainApp.getAppContext().getSystemService(JobScheduler.class);
 
 
-        if ((hasImageFolders || hasVideoFolders) && (!isContentObserverJobScheduled() || force)) {
+        if (jobScheduler != null) {
             JobInfo.Builder builder = new JobInfo.Builder(ContentSyncJobId, new ComponentName(MainApp.getAppContext(),
             JobInfo.Builder builder = new JobInfo.Builder(ContentSyncJobId, new ComponentName(MainApp.getAppContext(),
                     NContentObserverJob.class.getName()));
                     NContentObserverJob.class.getName()));
             builder.addTriggerContentUri(new JobInfo.TriggerContentUri(android.provider.MediaStore.
             builder.addTriggerContentUri(new JobInfo.TriggerContentUri(android.provider.MediaStore.