From 3c28a4b2eca8dd48de2bec40736f14ce7f251867 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 22 Jan 2019 12:50:36 -0600 Subject: [PATCH] Count accounts off main thread --- .../todoroo/astrid/activity/MainActivity.java | 11 +++++++- .../main/java/org/tasks/data/CaldavDao.java | 4 +++ .../org/tasks/data/GoogleTaskListDao.java | 4 +++ .../tasks/gtasks/GtaskSyncAdapterHelper.java | 27 ++++++++++++------ .../main/java/org/tasks/jobs/WorkManager.java | 28 ++++++++++++++----- .../java/org/tasks/sync/SyncAdapters.java | 5 ++-- 6 files changed, 61 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/todoroo/astrid/activity/MainActivity.java b/app/src/main/java/com/todoroo/astrid/activity/MainActivity.java index c1c24d58f..f5907a12a 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/MainActivity.java +++ b/app/src/main/java/com/todoroo/astrid/activity/MainActivity.java @@ -39,6 +39,7 @@ import com.todoroo.astrid.subtasks.SubtasksHelper; import com.todoroo.astrid.subtasks.SubtasksListFragment; import com.todoroo.astrid.subtasks.SubtasksTagListFragment; import com.todoroo.astrid.timers.TimerControlSet; +import io.reactivex.disposables.CompositeDisposable; import javax.inject.Inject; import org.tasks.LocalBroadcastManager; import org.tasks.R; @@ -115,6 +116,7 @@ public class MainActivity extends InjectingAppCompatActivity @BindView(R.id.detail) FrameLayout detail; + private CompositeDisposable disposables = new CompositeDisposable(); private NavigationDrawerFragment navigationDrawer; private int currentNightMode; @@ -317,7 +319,14 @@ public class MainActivity extends InjectingAppCompatActivity localBroadcastManager.registerRepeatReceiver(repeatConfirmationReceiver); - syncAdapters.checkPlayServices(this); + disposables.add(syncAdapters.checkPlayServices(this)); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + + disposables.dispose(); } public void restart() { diff --git a/app/src/main/java/org/tasks/data/CaldavDao.java b/app/src/main/java/org/tasks/data/CaldavDao.java index b8103f2d0..f96b813d6 100644 --- a/app/src/main/java/org/tasks/data/CaldavDao.java +++ b/app/src/main/java/org/tasks/data/CaldavDao.java @@ -6,6 +6,7 @@ import androidx.room.Delete; import androidx.room.Insert; import androidx.room.Query; import androidx.room.Update; +import io.reactivex.Single; import java.util.List; @Dao @@ -20,6 +21,9 @@ public interface CaldavDao { @Query("SELECT * FROM caldav_account WHERE uuid = :uuid LIMIT 1") CaldavAccount getAccountByUuid(String uuid); + @Query("SELECT COUNT(*) FROM caldav_account") + Single accountCount(); + @Query("SELECT * FROM caldav_account ORDER BY UPPER(name) ASC") List getAccounts(); diff --git a/app/src/main/java/org/tasks/data/GoogleTaskListDao.java b/app/src/main/java/org/tasks/data/GoogleTaskListDao.java index 0ac2bacaa..2deb0c59b 100644 --- a/app/src/main/java/org/tasks/data/GoogleTaskListDao.java +++ b/app/src/main/java/org/tasks/data/GoogleTaskListDao.java @@ -6,11 +6,15 @@ import androidx.room.Insert; import androidx.room.OnConflictStrategy; import androidx.room.Query; import androidx.room.Update; +import io.reactivex.Single; import java.util.List; @Dao public abstract class GoogleTaskListDao { + @Query("SELECT COUNT(*) FROM google_task_accounts") + public abstract Single accountCount(); + @Query("SELECT * FROM google_task_accounts") public abstract List getAccounts(); diff --git a/app/src/main/java/org/tasks/gtasks/GtaskSyncAdapterHelper.java b/app/src/main/java/org/tasks/gtasks/GtaskSyncAdapterHelper.java index 904480bad..7a34c317f 100644 --- a/app/src/main/java/org/tasks/gtasks/GtaskSyncAdapterHelper.java +++ b/app/src/main/java/org/tasks/gtasks/GtaskSyncAdapterHelper.java @@ -1,6 +1,9 @@ package org.tasks.gtasks; import android.app.Activity; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; import javax.inject.Inject; import org.tasks.R; import org.tasks.analytics.Tracker; @@ -35,13 +38,21 @@ public class GtaskSyncAdapterHelper { return !googleTaskListDao.getAccounts().isEmpty(); } - public void checkPlayServices(Activity activity) { - if (hasAccounts() - && !playServices.refreshAndCheck() - && !preferences.getBoolean(R.string.warned_play_services, false)) { - preferences.setBoolean(R.string.warned_play_services, true); - playServices.resolve(activity); - tracker.reportEvent(Tracking.Events.PLAY_SERVICES_WARNING, playServices.getStatus()); - } + public Disposable checkPlayServices(Activity activity) { + return googleTaskListDao + .accountCount() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + count -> { + if (count > 0 + && !playServices.refreshAndCheck() + && !preferences.getBoolean(R.string.warned_play_services, false)) { + preferences.setBoolean(R.string.warned_play_services, true); + playServices.resolve(activity); + tracker.reportEvent( + Tracking.Events.PLAY_SERVICES_WARNING, playServices.getStatus()); + } + }); } } diff --git a/app/src/main/java/org/tasks/jobs/WorkManager.java b/app/src/main/java/org/tasks/jobs/WorkManager.java index a015dba39..a8a084776 100644 --- a/app/src/main/java/org/tasks/jobs/WorkManager.java +++ b/app/src/main/java/org/tasks/jobs/WorkManager.java @@ -4,11 +4,14 @@ import static com.todoroo.andlib.utility.AndroidUtilities.atLeastKitKat; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastMarshmallow; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastOreo; import static com.todoroo.andlib.utility.DateUtilities.now; +import static io.reactivex.Single.just; +import static io.reactivex.Single.zip; import static org.tasks.date.DateTimeUtils.midnight; import static org.tasks.date.DateTimeUtils.newDateTime; import static org.tasks.time.DateTimeUtils.currentTimeMillis; import static org.tasks.time.DateTimeUtils.printTimestamp; +import android.annotation.SuppressLint; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; @@ -26,6 +29,8 @@ import androidx.work.PeriodicWorkRequest; import androidx.work.Worker; import com.google.common.primitives.Longs; import com.todoroo.astrid.data.Task; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; import java.util.List; import java.util.Random; import java.util.concurrent.TimeUnit; @@ -109,6 +114,7 @@ public class WorkManager { updateBackgroundSync(null, null, null); } + @SuppressLint("CheckResult") public void updateBackgroundSync( @Nullable Boolean forceAccountPresent, @Nullable Boolean forceBackgroundEnabled, @@ -117,18 +123,26 @@ public class WorkManager { forceBackgroundEnabled == null ? preferences.getBoolean(R.string.p_background_sync, true) : forceBackgroundEnabled; - boolean accountsPresent = - forceAccountPresent == null - ? (googleTaskListDao.getAccounts().size() > 0 || caldavDao.getAccounts().size() > 0) - : forceAccountPresent; boolean onlyOnWifi = forceOnlyOnUnmetered == null ? preferences.getBoolean(R.string.p_background_sync_unmetered_only, false) : forceOnlyOnUnmetered; - scheduleBackgroundSynchronization(backgroundEnabled && accountsPresent, onlyOnWifi); - } - private void scheduleBackgroundSynchronization(boolean enabled, boolean onlyOnUnmetered) { + //noinspection ResultOfMethodCallIgnored + (forceAccountPresent == null + ? zip( + googleTaskListDao.accountCount(), + caldavDao.accountCount(), + (googleCount, caldavCount) -> googleCount > 0 || caldavCount > 0) + : just(forceAccountPresent)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + accountsPresent -> + scheduleBackgroundSync(backgroundEnabled && accountsPresent, onlyOnWifi)); + } + + private void scheduleBackgroundSync(boolean enabled, boolean onlyOnUnmetered) { Timber.d("background sync enabled: %s, onlyOnUnmetered: %s", enabled, onlyOnUnmetered); if (enabled) { workManager.enqueueUniquePeriodicWork( diff --git a/app/src/main/java/org/tasks/sync/SyncAdapters.java b/app/src/main/java/org/tasks/sync/SyncAdapters.java index 9f3e4e668..9d8e87ce5 100644 --- a/app/src/main/java/org/tasks/sync/SyncAdapters.java +++ b/app/src/main/java/org/tasks/sync/SyncAdapters.java @@ -1,6 +1,7 @@ package org.tasks.sync; import android.app.Activity; +import io.reactivex.disposables.Disposable; import javax.inject.Inject; import org.tasks.data.CaldavDao; import org.tasks.gtasks.GtaskSyncAdapterHelper; @@ -40,7 +41,7 @@ public class SyncAdapters { return caldavDao.getAccounts().size() > 0; } - public void checkPlayServices(Activity activity) { - gtaskSyncAdapterHelper.checkPlayServices(activity); + public Disposable checkPlayServices(Activity activity) { + return gtaskSyncAdapterHelper.checkPlayServices(activity); } }