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.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() {

@ -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<Integer> accountCount();
@Query("SELECT * FROM caldav_account ORDER BY UPPER(name) ASC")
List<CaldavAccount> getAccounts();

@ -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<Integer> accountCount();
@Query("SELECT * FROM google_task_accounts")
public abstract List<GoogleTaskAccount> getAccounts();

@ -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());
}
});
}
}

@ -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(

@ -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);
}
}

Loading…
Cancel
Save