浏览代码

Merge pull request #1675 from nextcloud/update-android-job-again

Update Android job
Andy Scherzinger 7 年之前
父节点
当前提交
f4a481140f

+ 6 - 8
build.gradle

@@ -14,7 +14,7 @@ buildscript {
         google()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.0.0'
+        classpath 'com.android.tools.build:gradle:3.0.1'
         classpath 'com.google.gms:google-services:3.0.0'
     }
 }
@@ -30,7 +30,7 @@ configurations.all {
 }
 
 ext {
-    supportLibraryVersion = '25.4.0'
+    supportLibraryVersion = '26.1.0'
     googleLibraryVersion = '11.2.2'
 
     travisBuild = System.getenv("TRAVIS") == "true"
@@ -42,9 +42,7 @@ ext {
 repositories {
     jcenter()
     maven { url "https://jitpack.io" }
-    maven {
-        url 'https://oss.sonatype.org/content/repositories/snapshots/'
-    }
+    maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
     google()
 
     flatDir {
@@ -64,7 +62,7 @@ android {
         javaMaxHeapSize "4g"
     }
 
-    compileSdkVersion 25
+    compileSdkVersion 26
     buildToolsVersion '26.0.2'
 
     defaultConfig {
@@ -194,7 +192,7 @@ dependencies {
     /// dependencies for app building
     implementation 'com.android.support:multidex:1.0.2'
     implementation 'com.github.nextcloud:android-library:1.0.32'
-    versionDevImplementation 'com.github.nextcloud:android-library:master-SNAPSHOT'
+    versionDevImplementation 'com.github.nextcloud:android-library:1.0.32'
     implementation "com.android.support:support-v4:${supportLibraryVersion}"
     implementation "com.android.support:design:${supportLibraryVersion}"
     implementation 'com.jakewharton:disklrucache:2.0.2'
@@ -205,7 +203,7 @@ dependencies {
     implementation 'com.github.albfernandez:juniversalchardet:v2.0.0'
     implementation 'com.google.code.findbugs:annotations:2.0.1'
     implementation 'commons-io:commons-io:2.5'
-    implementation 'com.github.evernote:android-job:v1.1.11'
+    implementation 'com.github.evernote:android-job:v1.2.0'
     implementation 'com.jakewharton:butterknife:8.5.1'
     annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
     implementation 'org.greenrobot:eventbus:3.0.0'

+ 1 - 1
scripts/lint/lint-results.txt

@@ -1,2 +1,2 @@
 DO NOT TOUCH; GENERATED BY DRONE
-      <span class="mdl-layout-title">Lint Report: 365 warnings</span>
+      <span class="mdl-layout-title">Lint Report: 363 warnings</span>

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

@@ -20,6 +20,7 @@
 package com.owncloud.android;
 
 import android.Manifest;
+import android.accounts.Account;
 import android.app.Activity;
 import android.content.ContentResolver;
 import android.content.Context;
@@ -38,7 +39,9 @@ import android.support.v7.app.AlertDialog;
 import android.view.WindowManager;
 
 import com.evernote.android.job.JobManager;
+import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.authentication.PassCodeManager;
+import com.owncloud.android.datamodel.ArbitraryDataProvider;
 import com.owncloud.android.datamodel.MediaFolder;
 import com.owncloud.android.datamodel.MediaFolderType;
 import com.owncloud.android.datamodel.MediaProvider;
@@ -50,6 +53,7 @@ import com.owncloud.android.jobs.NCJobCreator;
 import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
 import com.owncloud.android.lib.common.OwnCloudClientManagerFactory.Policy;
 import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.ui.activity.ContactsPreferenceActivity;
 import com.owncloud.android.ui.activity.Preferences;
 import com.owncloud.android.ui.activity.SyncedFoldersActivity;
 import com.owncloud.android.ui.activity.WhatsNewActivity;
@@ -66,6 +70,8 @@ import java.util.Map;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
+import static com.owncloud.android.ui.activity.ContactsPreferenceActivity.PREFERENCE_CONTACTS_AUTOMATIC_BACKUP;
+
 
 /**
  * Main Application of the project
@@ -139,6 +145,7 @@ public class MainApp extends MultiDexApplication {
         }
 
         initAutoUpload();
+        initContactsBackup();
 
         // register global protection with pass code
         registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@@ -184,6 +191,17 @@ public class MainApp extends MultiDexApplication {
         });
     }
 
+    public static void initContactsBackup() {
+        ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(mContext.getContentResolver());
+        Account[] accounts = AccountUtils.getAccounts(mContext);
+
+        for (Account account : accounts) {
+            if (arbitraryDataProvider.getBooleanValue(account, PREFERENCE_CONTACTS_AUTOMATIC_BACKUP)) {
+                ContactsPreferenceActivity.startContactBackupJob(account);
+            }
+        }
+
+    }
     public static void initAutoUpload() {
         updateToAutoUpload();
         cleanOldEntries();

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

@@ -53,6 +53,7 @@ public class BootupBroadcastReceiver extends BroadcastReceiver {
         context.startService(initObservers);
 
         MainApp.initAutoUpload();
+        MainApp.initContactsBackup();
     }
 
 }

+ 4 - 5
src/main/java/com/owncloud/android/files/services/FileUploader.java

@@ -72,8 +72,8 @@ import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.activity.UploadListActivity;
 import com.owncloud.android.ui.notifications.NotificationUtils;
 import com.owncloud.android.utils.ErrorMessageAdapter;
+import com.owncloud.android.utils.PowerUtils;
 import com.owncloud.android.utils.ThemeUtils;
-import com.owncloud.android.utils.UploadUtils;
 
 import java.io.File;
 import java.util.AbstractList;
@@ -922,12 +922,11 @@ public class FileUploader extends Service
                         cancel(mCurrentUpload.getAccount().name, mCurrentUpload.getFile().getRemotePath()
                                 , ResultCode.DELAYED_FOR_WIFI);
                     } else if (mCurrentUpload.getIsChargingRequired() &&
-                            !Device.isCharging(MainApp.getAppContext())) {
+                            !Device.getBatteryStatus(MainApp.getAppContext()).isCharging()) {
                         cancel(mCurrentUpload.getAccount().name, mCurrentUpload.getFile().getRemotePath()
                                 , ResultCode.DELAYED_FOR_CHARGING);
-                    } else if (
-                            !mCurrentUpload.getIsIgnoringPowerSaveMode() &&
-                            UploadUtils.isPowerSaveMode(MainApp.getAppContext())) {
+                    } else if (!mCurrentUpload.getIsIgnoringPowerSaveMode() &&
+                            PowerUtils.isPowerSaveMode(MainApp.getAppContext())) {
                         cancel(mCurrentUpload.getAccount().name, mCurrentUpload.getFile().getRemotePath()
                                 , ResultCode.DELAYED_IN_POWER_SAVE_MODE);
                     }

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

@@ -47,7 +47,7 @@ import com.owncloud.android.ui.activity.Preferences;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.FilesSyncHelper;
 import com.owncloud.android.utils.MimeTypeUtil;
-import com.owncloud.android.utils.UploadUtils;
+import com.owncloud.android.utils.PowerUtils;
 
 import java.io.File;
 import java.io.IOException;
@@ -86,7 +86,7 @@ public class FilesSyncJob extends Job {
         final boolean overridePowerSaving = bundle.getBoolean(OVERRIDE_POWER_SAVING, false);
 
         // If we are in power save mode, better to postpone upload
-        if (UploadUtils.isPowerSaveMode(context) && !overridePowerSaving) {
+        if (PowerUtils.isPowerSaveMode(context) && !overridePowerSaving) {
             return Result.SUCCESS;
         }
 

+ 4 - 6
src/main/java/com/owncloud/android/jobs/NContentObserverJob.java

@@ -29,9 +29,7 @@ import android.support.annotation.RequiresApi;
 import com.evernote.android.job.JobRequest;
 import com.evernote.android.job.util.support.PersistableBundleCompat;
 import com.owncloud.android.utils.FilesSyncHelper;
-import com.owncloud.android.utils.UploadUtils;
-
-import java.util.concurrent.TimeUnit;
+import com.owncloud.android.utils.PowerUtils;
 
 /*
     Job that triggers new FilesSyncJob in case new photo or video were detected
@@ -45,14 +43,14 @@ public class NContentObserverJob extends JobService {
             if (params.getJobId() == FilesSyncHelper.ContentSyncJobId && params.getTriggeredContentAuthorities()
                     != null && params.getTriggeredContentUris() != null
                     && params.getTriggeredContentUris().length > 0
-                    && !UploadUtils.isPowerSaveMode(getApplicationContext())) {
+                    && !PowerUtils.isPowerSaveMode(getApplicationContext())) {
 
                 PersistableBundleCompat persistableBundleCompat = new PersistableBundleCompat();
                 persistableBundleCompat.putBoolean(FilesSyncJob.SKIP_CUSTOM, true);
 
                 new JobRequest.Builder(FilesSyncJob.TAG)
-                        .setExecutionWindow(1, TimeUnit.SECONDS.toMillis(2))
-                        .setBackoffCriteria(TimeUnit.SECONDS.toMillis(5), JobRequest.BackoffPolicy.LINEAR)
+                        .addExtras(persistableBundleCompat)
+                        .startNow()
                         .setExtras(persistableBundleCompat)
                         .setUpdateCurrent(false)
                         .build()

+ 3 - 3
src/main/java/com/owncloud/android/operations/UploadFileOperation.java

@@ -48,7 +48,7 @@ import com.owncloud.android.operations.common.SyncOperation;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.MimeType;
 import com.owncloud.android.utils.MimeTypeUtil;
-import com.owncloud.android.utils.UploadUtils;
+import com.owncloud.android.utils.PowerUtils;
 import com.owncloud.android.utils.UriUtils;
 
 import org.apache.commons.httpclient.HttpStatus;
@@ -348,13 +348,13 @@ public class UploadFileOperation extends SyncOperation {
             }
 
             // Check if charging conditions are met and delays the upload otherwise
-            if (mWhileChargingOnly && !Device.isCharging(mContext)) {
+            if (mWhileChargingOnly && !Device.getBatteryStatus(mContext).isCharging()) {
                 Log_OC.d(TAG, "Upload delayed until the device is charging: " + getRemotePath());
                 return new RemoteOperationResult(ResultCode.DELAYED_FOR_CHARGING);
             }
 
             // Check that device is not in power save mode
-            if (!mIgnoringPowerSaveMode && UploadUtils.isPowerSaveMode(mContext)) {
+            if (!mIgnoringPowerSaveMode && PowerUtils.isPowerSaveMode(mContext)) {
                 Log_OC.d(TAG, "Upload delayed because device is in power save mode: " + getRemotePath());
                 return new RemoteOperationResult(ResultCode.DELAYED_IN_POWER_SAVE_MODE);
             }

+ 18 - 3
src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java

@@ -34,6 +34,7 @@ import android.view.View;
 import com.evernote.android.job.JobManager;
 import com.evernote.android.job.JobRequest;
 import com.evernote.android.job.util.support.PersistableBundleCompat;
+import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.lib.common.utils.Log_OC;
@@ -113,11 +114,10 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag
         PersistableBundleCompat bundle = new PersistableBundleCompat();
         bundle.putString(ContactsBackupJob.ACCOUNT, account.name);
 
+        cancelPreviousContactBackupJobForAccount(MainApp.getAppContext(), account);
+
         new JobRequest.Builder(ContactsBackupJob.TAG)
                 .setExtras(bundle)
-                .setRequiresCharging(false)
-                .setPersisted(true)
-                .setUpdateCurrent(true)
                 .setPeriodic(24 * 60 * 60 * 1000)
                 .build()
                 .schedule();
@@ -134,6 +134,21 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag
         }
     }
 
+    public static void cancelPreviousContactBackupJobForAccount(Context context, Account account) {
+        Log_OC.d(TAG, "disabling existing contacts backup job for account: " + account.name);
+
+        JobManager jobManager = JobManager.create(context);
+        Set<JobRequest> jobs = jobManager.getAllJobRequestsForTag(ContactsBackupJob.TAG);
+
+        for (JobRequest jobRequest : jobs) {
+            PersistableBundleCompat extras = jobRequest.getExtras();
+            if (extras.getString(ContactsBackupJob.ACCOUNT, "").equalsIgnoreCase(account.name) &&
+                    jobRequest.isPeriodic()) {
+                jobManager.cancel(jobRequest.getJobId());
+            }
+        }
+    }
+
     public static void cancelContactBackupJobForAccount(Context context, Account account) {
         Log_OC.d(TAG, "disabling contacts backup job for account: " + account.name);
 

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

@@ -420,9 +420,8 @@ public class ManageAccountsActivity extends FileActivity
         bundle.putString(AccountRemovalJob.ACCOUNT, account.name);
 
         new JobRequest.Builder(AccountRemovalJob.TAG)
-                .setExecutionWindow(1_000L, 10_000L)
+                .startNow()
                 .setExtras(bundle)
-                .setPersisted(false)
                 .setUpdateCurrent(false)
                 .build()
                 .schedule();

+ 1 - 2
src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactListFragment.java

@@ -357,9 +357,8 @@ public class ContactListFragment extends FileFragment {
 
         new JobRequest.Builder(ContactsImportJob.TAG)
                 .setExtras(bundle)
-                .setExecutionWindow(3_000L, 10_000L)
+                .startNow()
                 .setRequiresCharging(false)
-                .setPersisted(false)
                 .setUpdateCurrent(false)
                 .build()
                 .schedule();

+ 1 - 3
src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java

@@ -315,9 +315,7 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi
 
         new JobRequest.Builder(ContactsBackupJob.TAG)
                 .setExtras(bundle)
-                .setExecutionWindow(3_000L, 10_000L)
-                .setRequiresCharging(false)
-                .setPersisted(false)
+                .startNow()
                 .setUpdateCurrent(false)
                 .build()
                 .schedule();

+ 24 - 0
src/main/java/com/owncloud/android/utils/PowerUtils.java

@@ -0,0 +1,24 @@
+package com.owncloud.android.utils;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.os.Build;
+import android.os.PowerManager;
+
+public class PowerUtils {
+
+    /**
+     * Checks if device is in power save mode. For older devices that do not support this API, returns false.
+     * @return true if it is, false otherwise.
+     */
+    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+    public static boolean isPowerSaveMode(Context context) {
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+            return powerManager != null && powerManager.isPowerSaveMode();
+        }
+
+        // For older versions, we just say that device is not in power save mode
+        return false;
+    }
+}

+ 2 - 2
src/main/java/com/owncloud/android/utils/ReceiversHelper.java

@@ -63,7 +63,7 @@ public class ReceiversHelper {
         BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
             @Override
             public void onReceive(Context context, Intent intent) {
-                if (intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
+                if (intent.getAction() != null && intent.getAction().equals(Intent.ACTION_POWER_CONNECTED)) {
                     FilesSyncHelper.restartJobsIfNeeded();
                 }
             }
@@ -81,7 +81,7 @@ public class ReceiversHelper {
         BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
             @Override
             public void onReceive(Context context, Intent intent) {
-                if (!UploadUtils.isPowerSaveMode(context)) {
+                if (!PowerUtils.isPowerSaveMode(context)) {
                     FilesSyncHelper.restartJobsIfNeeded();
                 }
             }

+ 0 - 71
src/main/java/com/owncloud/android/utils/UploadUtils.java

@@ -1,71 +0,0 @@
-/**
- * ownCloud Android client application
- *
- * @author LukeOwncloud
- * Copyright (C) 2016 ownCloud Inc.
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package com.owncloud.android.utils;
-
-import android.annotation.TargetApi;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo.State;
-import android.os.BatteryManager;
-import android.os.Build;
-import android.os.PowerManager;
-
-
-public class UploadUtils {
-
-    public static boolean isCharging(Context context) {
-        IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
-        Intent batteryStatus = context.registerReceiver(null, ifilter);
-
-        int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
-        return status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;
-    }
-
-    public static boolean isOnline(Context context) {
-        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
-        return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected();
-    }
-
-    public static boolean isConnectedViaWiFi(Context context) {
-        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
-        return cm != null && cm.getActiveNetworkInfo() != null
-                && cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI
-                && cm.getActiveNetworkInfo().getState() == State.CONNECTED;
-    }
-
-    /**
-     * Checks if device is in power save mode. For older devices that do not support this API, returns false.
-     * @return true if it is, false otherwise.
-     */
-    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
-    public static boolean isPowerSaveMode(Context context)
-    {
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
-        {
-            PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
-            return powerManager.isPowerSaveMode();
-        }
-
-        // For older versions, we just say that device is not in power save mode
-        return false;
-    }
-}