Count accounts off main thread

pull/795/head
Alex Baker 6 years ago
parent 3d05aa54ae
commit 3c28a4b2ec

@ -39,6 +39,7 @@ import com.todoroo.astrid.subtasks.SubtasksHelper;
import com.todoroo.astrid.subtasks.SubtasksListFragment; import com.todoroo.astrid.subtasks.SubtasksListFragment;
import com.todoroo.astrid.subtasks.SubtasksTagListFragment; import com.todoroo.astrid.subtasks.SubtasksTagListFragment;
import com.todoroo.astrid.timers.TimerControlSet; import com.todoroo.astrid.timers.TimerControlSet;
import io.reactivex.disposables.CompositeDisposable;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.LocalBroadcastManager; import org.tasks.LocalBroadcastManager;
import org.tasks.R; import org.tasks.R;
@ -115,6 +116,7 @@ public class MainActivity extends InjectingAppCompatActivity
@BindView(R.id.detail) @BindView(R.id.detail)
FrameLayout detail; FrameLayout detail;
private CompositeDisposable disposables = new CompositeDisposable();
private NavigationDrawerFragment navigationDrawer; private NavigationDrawerFragment navigationDrawer;
private int currentNightMode; private int currentNightMode;
@ -317,7 +319,14 @@ public class MainActivity extends InjectingAppCompatActivity
localBroadcastManager.registerRepeatReceiver(repeatConfirmationReceiver); localBroadcastManager.registerRepeatReceiver(repeatConfirmationReceiver);
syncAdapters.checkPlayServices(this); disposables.add(syncAdapters.checkPlayServices(this));
}
@Override
protected void onDestroy() {
super.onDestroy();
disposables.dispose();
} }
public void restart() { public void restart() {

@ -6,6 +6,7 @@ import androidx.room.Delete;
import androidx.room.Insert; import androidx.room.Insert;
import androidx.room.Query; import androidx.room.Query;
import androidx.room.Update; import androidx.room.Update;
import io.reactivex.Single;
import java.util.List; import java.util.List;
@Dao @Dao
@ -20,6 +21,9 @@ public interface CaldavDao {
@Query("SELECT * FROM caldav_account WHERE uuid = :uuid LIMIT 1") @Query("SELECT * FROM caldav_account WHERE uuid = :uuid LIMIT 1")
CaldavAccount getAccountByUuid(String uuid); CaldavAccount getAccountByUuid(String uuid);
@Query("SELECT COUNT(*) FROM caldav_account")
Single<Integer> accountCount();
@Query("SELECT * FROM caldav_account ORDER BY UPPER(name) ASC") @Query("SELECT * FROM caldav_account ORDER BY UPPER(name) ASC")
List<CaldavAccount> getAccounts(); List<CaldavAccount> getAccounts();

@ -6,11 +6,15 @@ import androidx.room.Insert;
import androidx.room.OnConflictStrategy; import androidx.room.OnConflictStrategy;
import androidx.room.Query; import androidx.room.Query;
import androidx.room.Update; import androidx.room.Update;
import io.reactivex.Single;
import java.util.List; import java.util.List;
@Dao @Dao
public abstract class GoogleTaskListDao { public abstract class GoogleTaskListDao {
@Query("SELECT COUNT(*) FROM google_task_accounts")
public abstract Single<Integer> accountCount();
@Query("SELECT * FROM google_task_accounts") @Query("SELECT * FROM google_task_accounts")
public abstract List<GoogleTaskAccount> getAccounts(); public abstract List<GoogleTaskAccount> getAccounts();

@ -1,6 +1,9 @@
package org.tasks.gtasks; package org.tasks.gtasks;
import android.app.Activity; 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 javax.inject.Inject;
import org.tasks.R; import org.tasks.R;
import org.tasks.analytics.Tracker; import org.tasks.analytics.Tracker;
@ -35,13 +38,21 @@ public class GtaskSyncAdapterHelper {
return !googleTaskListDao.getAccounts().isEmpty(); return !googleTaskListDao.getAccounts().isEmpty();
} }
public void checkPlayServices(Activity activity) { public Disposable checkPlayServices(Activity activity) {
if (hasAccounts() return googleTaskListDao
&& !playServices.refreshAndCheck() .accountCount()
&& !preferences.getBoolean(R.string.warned_play_services, false)) { .subscribeOn(Schedulers.io())
preferences.setBoolean(R.string.warned_play_services, true); .observeOn(AndroidSchedulers.mainThread())
playServices.resolve(activity); .subscribe(
tracker.reportEvent(Tracking.Events.PLAY_SERVICES_WARNING, playServices.getStatus()); 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());
}
});
} }
} }

@ -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.atLeastMarshmallow;
import static com.todoroo.andlib.utility.AndroidUtilities.atLeastOreo; import static com.todoroo.andlib.utility.AndroidUtilities.atLeastOreo;
import static com.todoroo.andlib.utility.DateUtilities.now; 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.midnight;
import static org.tasks.date.DateTimeUtils.newDateTime; import static org.tasks.date.DateTimeUtils.newDateTime;
import static org.tasks.time.DateTimeUtils.currentTimeMillis; import static org.tasks.time.DateTimeUtils.currentTimeMillis;
import static org.tasks.time.DateTimeUtils.printTimestamp; import static org.tasks.time.DateTimeUtils.printTimestamp;
import android.annotation.SuppressLint;
import android.app.AlarmManager; import android.app.AlarmManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
@ -26,6 +29,8 @@ import androidx.work.PeriodicWorkRequest;
import androidx.work.Worker; import androidx.work.Worker;
import com.google.common.primitives.Longs; import com.google.common.primitives.Longs;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -109,6 +114,7 @@ public class WorkManager {
updateBackgroundSync(null, null, null); updateBackgroundSync(null, null, null);
} }
@SuppressLint("CheckResult")
public void updateBackgroundSync( public void updateBackgroundSync(
@Nullable Boolean forceAccountPresent, @Nullable Boolean forceAccountPresent,
@Nullable Boolean forceBackgroundEnabled, @Nullable Boolean forceBackgroundEnabled,
@ -117,18 +123,26 @@ public class WorkManager {
forceBackgroundEnabled == null forceBackgroundEnabled == null
? preferences.getBoolean(R.string.p_background_sync, true) ? preferences.getBoolean(R.string.p_background_sync, true)
: forceBackgroundEnabled; : forceBackgroundEnabled;
boolean accountsPresent =
forceAccountPresent == null
? (googleTaskListDao.getAccounts().size() > 0 || caldavDao.getAccounts().size() > 0)
: forceAccountPresent;
boolean onlyOnWifi = boolean onlyOnWifi =
forceOnlyOnUnmetered == null forceOnlyOnUnmetered == null
? preferences.getBoolean(R.string.p_background_sync_unmetered_only, false) ? preferences.getBoolean(R.string.p_background_sync_unmetered_only, false)
: forceOnlyOnUnmetered; : 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); Timber.d("background sync enabled: %s, onlyOnUnmetered: %s", enabled, onlyOnUnmetered);
if (enabled) { if (enabled) {
workManager.enqueueUniquePeriodicWork( workManager.enqueueUniquePeriodicWork(

@ -1,6 +1,7 @@
package org.tasks.sync; package org.tasks.sync;
import android.app.Activity; import android.app.Activity;
import io.reactivex.disposables.Disposable;
import javax.inject.Inject; import javax.inject.Inject;
import org.tasks.data.CaldavDao; import org.tasks.data.CaldavDao;
import org.tasks.gtasks.GtaskSyncAdapterHelper; import org.tasks.gtasks.GtaskSyncAdapterHelper;
@ -40,7 +41,7 @@ public class SyncAdapters {
return caldavDao.getAccounts().size() > 0; return caldavDao.getAccounts().size() > 0;
} }
public void checkPlayServices(Activity activity) { public Disposable checkPlayServices(Activity activity) {
gtaskSyncAdapterHelper.checkPlayServices(activity); return gtaskSyncAdapterHelper.checkPlayServices(activity);
} }
} }

Loading…
Cancel
Save