diff --git a/app/src/googleplay/java/org/tasks/FlavorSetup.java b/app/src/googleplay/java/org/tasks/FlavorSetup.java index 93b572c75..bf1c298c5 100644 --- a/app/src/googleplay/java/org/tasks/FlavorSetup.java +++ b/app/src/googleplay/java/org/tasks/FlavorSetup.java @@ -2,21 +2,17 @@ package org.tasks; import javax.inject.Inject; import org.tasks.billing.BillingClient; -import org.tasks.gtasks.PlayServices; public class FlavorSetup { - private final PlayServices playServices; private final BillingClient billingClient; @Inject - public FlavorSetup(PlayServices playServices, BillingClient billingClient) { - this.playServices = playServices; + public FlavorSetup(BillingClient billingClient) { this.billingClient = billingClient; } public void setup() { billingClient.initialize(); - playServices.refresh(); } } diff --git a/app/src/googleplay/java/org/tasks/gtasks/PlayServices.java b/app/src/googleplay/java/org/tasks/gtasks/PlayServices.java index 8ae94ca2b..ef07fadd1 100644 --- a/app/src/googleplay/java/org/tasks/gtasks/PlayServices.java +++ b/app/src/googleplay/java/org/tasks/gtasks/PlayServices.java @@ -1,5 +1,7 @@ package org.tasks.gtasks; +import static io.reactivex.Single.fromCallable; + import android.accounts.Account; import android.app.Activity; import android.content.Context; @@ -12,9 +14,15 @@ import com.google.android.gms.common.GoogleApiAvailability; import com.google.api.services.drive.DriveScopes; import com.google.api.services.tasks.TasksScopes; import com.todoroo.astrid.gtasks.auth.GtasksLoginActivity; +import io.reactivex.Single; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; +import io.reactivex.schedulers.Schedulers; import java.io.IOException; import javax.inject.Inject; import org.tasks.R; +import org.tasks.data.GoogleTaskListDao; +import org.tasks.data.LocationDao; import org.tasks.injection.ForApplication; import org.tasks.play.AuthResultHandler; import org.tasks.preferences.Preferences; @@ -27,15 +35,39 @@ public class PlayServices { private final Context context; private final Preferences preferences; private final GoogleAccountManager accountManager; + private final GoogleTaskListDao googleTaskListDao; + private final LocationDao locationDao; @Inject public PlayServices( @ForApplication Context context, Preferences preferences, - GoogleAccountManager googleAccountManager) { + GoogleAccountManager googleAccountManager, + GoogleTaskListDao googleTaskListDao, + LocationDao locationDao) { this.context = context; this.preferences = preferences; this.accountManager = googleAccountManager; + this.googleTaskListDao = googleTaskListDao; + this.locationDao = locationDao; + } + + public Disposable check(Activity activity) { + return Single.zip( + googleTaskListDao.accountCount(), + locationDao.geofenceCount(), + fromCallable(() -> preferences.getBoolean(R.string.p_google_drive_backup, false)), + (gtaskCount, geofenceCount, gdrive) -> gtaskCount > 0 || geofenceCount > 0 || gdrive) + .subscribeOn(Schedulers.io()) + .map(needsCheck -> !needsCheck || refreshAndCheck()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + success -> { + if (!success && !preferences.getBoolean(R.string.warned_play_services, false)) { + preferences.setBoolean(R.string.warned_play_services, true); + resolve(activity); + } + }); } public boolean refreshAndCheck() { @@ -43,11 +75,11 @@ public class PlayServices { return isPlayServicesAvailable(); } - public boolean isPlayServicesAvailable() { + boolean isPlayServicesAvailable() { return getResult() == ConnectionResult.SUCCESS; } - public void refresh() { + private void refresh() { GoogleApiAvailability instance = GoogleApiAvailability.getInstance(); int googlePlayServicesAvailable = instance.isGooglePlayServicesAvailable(context); preferences.setInt(R.string.play_services_available, googlePlayServicesAvailable); @@ -63,9 +95,7 @@ public class PlayServices { if (googleApiAvailability.isUserResolvableError(error)) { googleApiAvailability.getErrorDialog(activity, error, REQUEST_RESOLUTION).show(); } else { - Toast.makeText( - activity, R.string.common_google_play_services_notification_ticker, Toast.LENGTH_LONG) - .show(); + Toast.makeText(activity, getStatus(), Toast.LENGTH_LONG).show(); } } 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 48a7c142b..05c634343 100644 --- a/app/src/main/java/com/todoroo/astrid/activity/MainActivity.java +++ b/app/src/main/java/com/todoroo/astrid/activity/MainActivity.java @@ -61,6 +61,7 @@ import org.tasks.data.TagData; import org.tasks.data.TagDataDao; import org.tasks.dialogs.SortDialog; import org.tasks.fragments.CommentBarFragment; +import org.tasks.gtasks.PlayServices; import org.tasks.injection.ActivityComponent; import org.tasks.injection.InjectingAppCompatActivity; import org.tasks.intents.TaskIntents; @@ -113,6 +114,7 @@ public class MainActivity extends InjectingAppCompatActivity @Inject CaldavDao caldavDao; @Inject LocalBroadcastManager localBroadcastManager; @Inject TaskCreator taskCreator; + @Inject PlayServices playServices; @BindView(R.id.drawer_layout) DrawerLayout drawerLayout; @@ -344,7 +346,7 @@ public class MainActivity extends InjectingAppCompatActivity localBroadcastManager.registerRepeatReceiver(repeatConfirmationReceiver); - disposables.add(syncAdapters.checkPlayServices(this)); + disposables.add(playServices.check(this)); } public void restart() { diff --git a/app/src/main/java/org/tasks/data/LocationDao.java b/app/src/main/java/org/tasks/data/LocationDao.java index 894060e3c..104a11c3c 100644 --- a/app/src/main/java/org/tasks/data/LocationDao.java +++ b/app/src/main/java/org/tasks/data/LocationDao.java @@ -4,6 +4,7 @@ import androidx.room.Dao; import androidx.room.Delete; import androidx.room.Insert; import androidx.room.Query; +import io.reactivex.Single; import java.util.List; @Dao @@ -23,6 +24,9 @@ public interface LocationDao { "SELECT locations.* FROM locations INNER JOIN tasks ON tasks._id = locations.task WHERE tasks.deleted = 0 AND tasks.completed = 0") List getActiveGeofences(); + @Query("SELECT COUNT(*) FROM locations") + Single geofenceCount(); + @Delete void delete(Location location); diff --git a/app/src/main/java/org/tasks/gtasks/GtaskSyncAdapterHelper.java b/app/src/main/java/org/tasks/gtasks/GtaskSyncAdapterHelper.java index 7a34c317f..721489e96 100644 --- a/app/src/main/java/org/tasks/gtasks/GtaskSyncAdapterHelper.java +++ b/app/src/main/java/org/tasks/gtasks/GtaskSyncAdapterHelper.java @@ -1,58 +1,20 @@ 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; -import org.tasks.analytics.Tracking; import org.tasks.data.GoogleTaskListDao; -import org.tasks.preferences.Preferences; public class GtaskSyncAdapterHelper { - private final Preferences preferences; private final PlayServices playServices; private final GoogleTaskListDao googleTaskListDao; - private final Tracker tracker; @Inject - public GtaskSyncAdapterHelper( - Preferences preferences, - PlayServices playServices, - GoogleTaskListDao googleTaskListDao, - Tracker tracker) { - this.preferences = preferences; + public GtaskSyncAdapterHelper(PlayServices playServices, GoogleTaskListDao googleTaskListDao) { this.playServices = playServices; this.googleTaskListDao = googleTaskListDao; - this.tracker = tracker; } public boolean isEnabled() { - return hasAccounts() && playServices.isPlayServicesAvailable(); - } - - private boolean hasAccounts() { - return !googleTaskListDao.getAccounts().isEmpty(); - } - - 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()); - } - }); + return !googleTaskListDao.getAccounts().isEmpty() && playServices.isPlayServicesAvailable(); } } diff --git a/app/src/main/java/org/tasks/sync/SyncAdapters.java b/app/src/main/java/org/tasks/sync/SyncAdapters.java index 9d8e87ce5..c28a4586f 100644 --- a/app/src/main/java/org/tasks/sync/SyncAdapters.java +++ b/app/src/main/java/org/tasks/sync/SyncAdapters.java @@ -40,8 +40,4 @@ public class SyncAdapters { public boolean isCaldavSyncEnabled() { return caldavDao.getAccounts().size() > 0; } - - public Disposable checkPlayServices(Activity activity) { - return gtaskSyncAdapterHelper.checkPlayServices(activity); - } }