Choose location service based on gplay availablity

pull/1376/head
Alex Baker 5 years ago
parent 856cd04621
commit 815648ea8c

@ -1,26 +0,0 @@
package org.tasks.gtasks
import android.app.Activity
import com.todoroo.astrid.activity.MainActivity
import io.reactivex.disposables.Disposable
import io.reactivex.disposables.Disposables
import javax.inject.Inject
@Suppress("UNUSED_PARAMETER")
class PlayServices @Inject constructor() {
val isPlayServicesAvailable: Boolean
get() = false
fun refreshAndCheck(): Boolean {
return false
}
fun resolve(activity: Activity?) {}
val status: String?
get() = null
fun check(mainActivity: MainActivity?): Disposable {
return Disposables.empty()
}
}

@ -7,5 +7,4 @@
<string name="manage_subscription_url">%s</string> <string name="manage_subscription_url">%s</string>
<string name="support_email">support@tasks.org</string> <string name="support_email">support@tasks.org</string>
<string name="default_reverse_geocoder">1</string> <!-- Nominatim --> <string name="default_reverse_geocoder">1</string> <!-- Nominatim -->
<string name="default_geofence_service">1</string> <!-- Android LocationManager -->
</resources> </resources>

@ -1,65 +1,12 @@
package org.tasks.gtasks package org.tasks.gtasks
import android.app.Activity
import android.content.Context import android.content.Context
import android.widget.Toast
import com.google.android.gms.common.ConnectionResult import com.google.android.gms.common.ConnectionResult
import com.google.android.gms.common.GoogleApiAvailability import com.google.android.gms.common.GoogleApiAvailability.getInstance
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import org.tasks.R
import org.tasks.data.LocationDao
import org.tasks.preferences.Preferences
import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
class PlayServices @Inject constructor( object PlayServices {
@param:ApplicationContext private val context: Context, fun isAvailable(context: Context) =
private val preferences: Preferences, getInstance().isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS
private val locationDao: LocationDao) {
suspend fun check(activity: Activity?) {
val playServicesAvailable = locationDao.geofenceCount() == 0 || refreshAndCheck()
if (!playServicesAvailable && !preferences.getBoolean(R.string.warned_play_services, false)) {
preferences.setBoolean(R.string.warned_play_services, true)
resolve(activity)
}
}
fun refreshAndCheck(): Boolean {
refresh()
return isPlayServicesAvailable
}
val isPlayServicesAvailable: Boolean
get() = result == ConnectionResult.SUCCESS
private fun refresh() {
val instance = GoogleApiAvailability.getInstance()
val googlePlayServicesAvailable = instance.isGooglePlayServicesAvailable(context)
preferences.setInt(R.string.play_services_available, googlePlayServicesAvailable)
if (googlePlayServicesAvailable == ConnectionResult.SUCCESS) {
preferences.setBoolean(R.string.warned_play_services, false)
}
Timber.d(status)
}
fun resolve(activity: Activity?) {
val googleApiAvailability = GoogleApiAvailability.getInstance()
val error = preferences.getInt(R.string.play_services_available, -1)
if (googleApiAvailability.isUserResolvableError(error)) {
googleApiAvailability.getErrorDialog(activity, error, REQUEST_RESOLUTION).show()
} else {
Toast.makeText(activity, status, Toast.LENGTH_LONG).show()
}
}
private val status: String
get() = GoogleApiAvailability.getInstance().getErrorString(result)
private val result: Int
get() = preferences.getInt(R.string.play_services_available, -1)
companion object {
private const val REQUEST_RESOLUTION = 10000
}
} }

@ -1,9 +1,11 @@
package org.tasks.injection package org.tasks.injection
import android.content.Context
import dagger.Lazy import dagger.Lazy
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import dagger.hilt.InstallIn import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import org.tasks.gtasks.PlayServices import org.tasks.gtasks.PlayServices
import org.tasks.location.* import org.tasks.location.*
@ -12,12 +14,16 @@ import org.tasks.location.*
@InstallIn(SingletonComponent::class) @InstallIn(SingletonComponent::class)
class FlavorModule { class FlavorModule {
@Provides @Provides
fun getLocationService(service: LocationServiceGooglePlay): LocationService = service fun getLocationService(
@ApplicationContext context: Context,
google: Lazy<LocationServiceGooglePlay>,
android: Lazy<LocationServiceAndroid>
): LocationService = if (PlayServices.isAvailable(context)) google.get() else android.get()
@Provides @Provides
fun getMapFragment( fun getMapFragment(
playServices: PlayServices, @ApplicationContext context: Context,
osm: Lazy<OsmMapFragment>, osm: Lazy<OsmMapFragment>,
google: Lazy<GoogleMapFragment>, google: Lazy<GoogleMapFragment>,
): MapFragment = if (playServices.isPlayServicesAvailable) google.get() else osm.get() ): MapFragment = if (PlayServices.isAvailable(context)) google.get() else osm.get()
} }

@ -1,11 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="gp_key">MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk8mXRE3dDXwtinUILCEzKjov2rxs3kZbLRzNrcjFWXpG9OEsUzRGLzqEN+WwibVuMRpZLj/+IxbU2sJWq/M0q+90rOhmXn46ZPeNyr77IqX2pWKIAWpzBoWq/mshRwtm9m1FIiGdBNlXrhSE7u3TGB5FuEuuSqKWvWzxeqQ7fHmlM04Lqrh1mN3FaMne8rWv+DWVHDbLrtnXBuC36glOAj17HxrzaE2v6Pv7Df3QefJ3rM1+0fAp/5jNInaP0qHAlG8WTbUmDShQ5kG3urbv3HLByyx6TSqhmNudXUK/6TusvIj50OptAG7x+UFYf956dD3diXhY3yoICvyFWx1sNwIDAQAB</string> <string name="gp_key">MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk8mXRE3dDXwtinUILCEzKjov2rxs3kZbLRzNrcjFWXpG9OEsUzRGLzqEN+WwibVuMRpZLj/+IxbU2sJWq/M0q+90rOhmXn46ZPeNyr77IqX2pWKIAWpzBoWq/mshRwtm9m1FIiGdBNlXrhSE7u3TGB5FuEuuSqKWvWzxeqQ7fHmlM04Lqrh1mN3FaMne8rWv+DWVHDbLrtnXBuC36glOAj17HxrzaE2v6Pv7Df3QefJ3rM1+0fAp/5jNInaP0qHAlG8WTbUmDShQ5kG3urbv3HLByyx6TSqhmNudXUK/6TusvIj50OptAG7x+UFYf956dD3diXhY3yoICvyFWx1sNwIDAQAB</string>
<string name="play_services_available">play_services_available</string>
<string name="market_url">market://details?id=org.tasks</string> <string name="market_url">market://details?id=org.tasks</string>
<string name="p_purchases">purchases</string> <string name="p_purchases">purchases</string>
<string name="manage_subscription_url">https://play.google.com/store/account/subscriptions?sku=%s&amp;package=org.tasks</string> <string name="manage_subscription_url">https://play.google.com/store/account/subscriptions?sku=%s&amp;package=org.tasks</string>
<string name="support_email">play-support@tasks.org</string> <string name="support_email">play-support@tasks.org</string>
<string name="default_reverse_geocoder">0</string> <!-- Mapbox --> <string name="default_reverse_geocoder">0</string> <!-- Mapbox -->
<string name="default_geofence_service">0</string> <!-- Google Play Location Services -->
</resources> </resources>

@ -41,7 +41,6 @@ import org.tasks.dialogs.SortDialog.SortDialogCallback
import org.tasks.dialogs.WhatsNewDialog import org.tasks.dialogs.WhatsNewDialog
import org.tasks.filters.PlaceFilter import org.tasks.filters.PlaceFilter
import org.tasks.fragments.CommentBarFragment.CommentBarFragmentCallback import org.tasks.fragments.CommentBarFragment.CommentBarFragmentCallback
import org.tasks.gtasks.PlayServices
import org.tasks.injection.InjectingAppCompatActivity import org.tasks.injection.InjectingAppCompatActivity
import org.tasks.intents.TaskIntents.getTaskListIntent import org.tasks.intents.TaskIntents.getTaskListIntent
import org.tasks.location.LocationPickerActivity import org.tasks.location.LocationPickerActivity
@ -66,7 +65,6 @@ class MainActivity : InjectingAppCompatActivity(), TaskListFragmentCallbackHandl
@Inject lateinit var taskDao: TaskDao @Inject lateinit var taskDao: TaskDao
@Inject lateinit var localBroadcastManager: LocalBroadcastManager @Inject lateinit var localBroadcastManager: LocalBroadcastManager
@Inject lateinit var taskCreator: TaskCreator @Inject lateinit var taskCreator: TaskCreator
@Inject lateinit var playServices: PlayServices
@Inject lateinit var inventory: Inventory @Inject lateinit var inventory: Inventory
@Inject lateinit var colorProvider: ColorProvider @Inject lateinit var colorProvider: ColorProvider
@Inject lateinit var locationDao: LocationDao @Inject lateinit var locationDao: LocationDao
@ -489,12 +487,6 @@ class MainActivity : InjectingAppCompatActivity(), TaskListFragmentCallbackHandl
taskEditFragment!!.onRemoteListChanged(filter) taskEditFragment!!.onRemoteListChanged(filter)
} }
init {
lifecycleScope.launchWhenResumed {
playServices.check(this@MainActivity)
}
}
companion object { companion object {
/** For indicating the new list screen should be launched at fragment setup time */ /** For indicating the new list screen should be launched at fragment setup time */
const val TOKEN_CREATE_NEW_LIST_NAME = "newListName" // $NON-NLS-1$ const val TOKEN_CREATE_NEW_LIST_NAME = "newListName" // $NON-NLS-1$

@ -13,8 +13,6 @@ class GeofenceApi @Inject constructor(
) { ) {
suspend fun registerAll() = locationDao.getPlacesWithGeofences().forEach { update(it) } suspend fun registerAll() = locationDao.getPlacesWithGeofences().forEach { update(it) }
suspend fun cancelAll() = locationDao.getPlacesWithGeofences().forEach { cancel(it) }
suspend fun update(taskId: Long) = update(locationDao.getPlaceForTask(taskId)) suspend fun update(taskId: Long) = update(locationDao.getPlaceForTask(taskId))
suspend fun update(place: String) = update(locationDao.getPlace(place)) suspend fun update(place: String) = update(locationDao.getPlace(place))
@ -28,11 +26,9 @@ class GeofenceApi @Inject constructor(
Timber.d("Adding geofence for %s", it) Timber.d("Adding geofence for %s", it)
locationService.addGeofences(it) locationService.addGeofences(it)
} }
?: cancel(place) ?: place.let {
} Timber.d("Removing geofence for %s", it)
locationService.removeGeofences(it)
private fun cancel(place: Place?) = place?.let { }
Timber.d("Removing geofence for %s", place)
locationService.removeGeofences(place)
} }
} }

@ -2,44 +2,25 @@ package org.tasks.preferences.fragments
import android.content.Intent import android.content.Intent
import android.os.Bundle import android.os.Bundle
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference
import androidx.preference.SwitchPreference import androidx.preference.SwitchPreference
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.tasks.R import org.tasks.R
import org.tasks.Tasks.Companion.IS_GOOGLE_PLAY
import org.tasks.billing.Inventory import org.tasks.billing.Inventory
import org.tasks.gtasks.PlayServices
import org.tasks.injection.InjectingPreferenceFragment import org.tasks.injection.InjectingPreferenceFragment
import org.tasks.location.GeofenceApi
import org.tasks.location.LocationPermissionDialog.Companion.newLocationPermissionDialog import org.tasks.location.LocationPermissionDialog.Companion.newLocationPermissionDialog
import org.tasks.preferences.PermissionChecker import org.tasks.preferences.PermissionChecker
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import org.tasks.ui.Toaster
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
class LocationPreferences : InjectingPreferenceFragment() { class LocationPreferences : InjectingPreferenceFragment() {
@Inject lateinit var playServices: PlayServices
@Inject lateinit var inventory: Inventory
@Inject lateinit var toaster: Toaster
@Inject lateinit var geofenceApi: GeofenceApi
@Inject lateinit var permissionChecker: PermissionChecker @Inject lateinit var permissionChecker: PermissionChecker
@Inject lateinit var preferences: Preferences @Inject lateinit var preferences: Preferences
override fun getPreferenceXml() = R.xml.preferences_location override fun getPreferenceXml() = R.xml.preferences_location
override suspend fun setupPreferences(savedInstanceState: Bundle?) { override suspend fun setupPreferences(savedInstanceState: Bundle?) {
if (IS_GOOGLE_PLAY) {
findPreference(R.string.p_geofence_service)
.setOnPreferenceChangeListener(this::onGeofenceServiceChanged)
} else {
disable(R.string.p_geofence_service)
}
} }
override fun onResume() { override fun onResume() {
@ -62,29 +43,6 @@ class LocationPreferences : InjectingPreferenceFragment() {
false false
} }
} }
findPreference(R.string.p_geofence_service).isEnabled = hasPermissions && IS_GOOGLE_PLAY
}
private fun onGeofenceServiceChanged(preference: Preference, newValue: Any): Boolean =
if (newValue.toString().toIntOrNull() ?: 0 == 1) {
if (!playServices.refreshAndCheck()) {
playServices.resolve(activity)
false
} else {
geofenceChanged()
}
} else {
geofenceChanged()
}
private fun geofenceChanged(): Boolean {
lifecycleScope.launch {
withContext(NonCancellable) {
geofenceApi.cancelAll()
}
showRestartDialog()
}
return true
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) = override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) =

@ -697,9 +697,6 @@
<string name="tasks_org_account">Tasks.org cuenta</string> <string name="tasks_org_account">Tasks.org cuenta</string>
<string name="subscription">Suscripción</string> <string name="subscription">Suscripción</string>
<string name="widget_show_title">Mostrar título</string> <string name="widget_show_title">Mostrar título</string>
<string name="android_location_services">Servicio de localización de Android</string>
<string name="google_play_location_service">Servicio de localización de Google Play</string>
<string name="geofence_service">Servicio de geovallas</string>
<string name="location_based_reminders">Recordatorios basados en la ubicación</string> <string name="location_based_reminders">Recordatorios basados en la ubicación</string>
<string name="map_theme_use_app_theme">Utilizar el tema de la aplicación</string> <string name="map_theme_use_app_theme">Utilizar el tema de la aplicación</string>
<string name="maps">Mapas</string> <string name="maps">Mapas</string>

@ -694,9 +694,6 @@
<string name="widget_show_title">Afficher le titre</string> <string name="widget_show_title">Afficher le titre</string>
<string name="reverse_geocoder">Géocodeur inversé</string> <string name="reverse_geocoder">Géocodeur inversé</string>
<string name="map_theme">Thème de la carte</string> <string name="map_theme">Thème de la carte</string>
<string name="android_location_services">Service de localisation Android</string>
<string name="google_play_location_service">Service de localisation Google Play</string>
<string name="geofence_service">Service Geofence</string>
<string name="location_based_reminders">Rappels basés sur la localisation</string> <string name="location_based_reminders">Rappels basés sur la localisation</string>
<string name="map_theme_use_app_theme">Utiliser le thème de lapplication</string> <string name="map_theme_use_app_theme">Utiliser le thème de lapplication</string>
<string name="maps">Cartes</string> <string name="maps">Cartes</string>

@ -695,9 +695,6 @@
<string name="default_start_date">Alapértelmezett kezdő dátum</string> <string name="default_start_date">Alapértelmezett kezdő dátum</string>
<string name="SSD_sort_start">Kezdés dátuma szerint</string> <string name="SSD_sort_start">Kezdés dátuma szerint</string>
<string name="widget_show_title">Cím megjelenítése</string> <string name="widget_show_title">Cím megjelenítése</string>
<string name="android_location_services">Android hely szolgáltatás</string>
<string name="google_play_location_service">Google Play hely szolgáltatás</string>
<string name="geofence_service">Geokerítés szolgáltatás</string>
<string name="location_based_reminders">Hely alapú emlékeztetők</string> <string name="location_based_reminders">Hely alapú emlékeztetők</string>
<string name="reverse_geocoder">Fordított geokódoló</string> <string name="reverse_geocoder">Fordított geokódoló</string>
<string name="map_theme_use_app_theme">Alkalmazás témájának használata</string> <string name="map_theme_use_app_theme">Alkalmazás témájának használata</string>

@ -693,9 +693,6 @@
<string name="subscription">Abonnement</string> <string name="subscription">Abonnement</string>
<string name="widget_show_title">Toon titel</string> <string name="widget_show_title">Toon titel</string>
<string name="reverse_geocoder">Omgekeerde geocoder</string> <string name="reverse_geocoder">Omgekeerde geocoder</string>
<string name="android_location_services">Android-locatieservice</string>
<string name="google_play_location_service">Google Play-locatieservice</string>
<string name="geofence_service">Geofence-service</string>
<string name="location_based_reminders">Locatiegebaseerde herinneringen</string> <string name="location_based_reminders">Locatiegebaseerde herinneringen</string>
<string name="map_theme">Kaartthema</string> <string name="map_theme">Kaartthema</string>
<string name="map_theme_use_app_theme">Gebruik app-thema</string> <string name="map_theme_use_app_theme">Gebruik app-thema</string>

@ -717,9 +717,6 @@
<string name="tasks_org_account">Обліковий запис Tasks.org</string> <string name="tasks_org_account">Обліковий запис Tasks.org</string>
<string name="subscription">Підписка</string> <string name="subscription">Підписка</string>
<string name="widget_show_title">Показати заголовок</string> <string name="widget_show_title">Показати заголовок</string>
<string name="android_location_services">Служба визначення розташування Android</string>
<string name="google_play_location_service">Служба розташування Google Play</string>
<string name="geofence_service">Служба геозон</string>
<string name="location_based_reminders">Нагадування на основі розташування</string> <string name="location_based_reminders">Нагадування на основі розташування</string>
<string name="map_theme_use_app_theme">Використовувати тему застосунку</string> <string name="map_theme_use_app_theme">Використовувати тему застосунку</string>
<string name="maps">Карти</string> <string name="maps">Карти</string>

@ -687,9 +687,6 @@
<string name="tasks_org_account">Tasks.org 账户</string> <string name="tasks_org_account">Tasks.org 账户</string>
<string name="subscription">订阅</string> <string name="subscription">订阅</string>
<string name="widget_show_title">显示标题</string> <string name="widget_show_title">显示标题</string>
<string name="android_location_services">安卓位置服务</string>
<string name="google_play_location_service">Google Play 位置服务</string>
<string name="geofence_service">地理围栏服务</string>
<string name="location_based_reminders">基于位置的提醒</string> <string name="location_based_reminders">基于位置的提醒</string>
<string name="map_theme_use_app_theme">使用应用主题</string> <string name="map_theme_use_app_theme">使用应用主题</string>
<string name="maps">地图</string> <string name="maps">地图</string>

@ -281,14 +281,4 @@
<item>1</item> <item>1</item>
<item>2</item> <item>2</item>
</string-array> </string-array>
<string-array name="geofence_service_names">
<item>@string/google_play_location_service</item>
<item>@string/android_location_services</item>
</string-array>
<string-array name="geofence_service_values">
<item>0</item>
<item>1</item>
</string-array>
</resources> </resources>

@ -382,7 +382,6 @@
<string name="p_flipper">p_flipper</string> <string name="p_flipper">p_flipper</string>
<string name="p_debug_pro">debug_pro</string> <string name="p_debug_pro">debug_pro</string>
<string name="p_crash_main_queries">debug_crash_main_queries</string> <string name="p_crash_main_queries">debug_crash_main_queries</string>
<string name="warned_play_services">warned_play_services</string>
<string name="p_sync_ongoing_google_tasks">sync_ongoing_google_tasks</string> <string name="p_sync_ongoing_google_tasks">sync_ongoing_google_tasks</string>
<string name="p_sync_ongoing_caldav">sync_ongoing_caldav</string> <string name="p_sync_ongoing_caldav">sync_ongoing_caldav</string>
<string name="p_sync_ongoing_etesync">sync_ongoing_etesync</string> <string name="p_sync_ongoing_etesync">sync_ongoing_etesync</string>
@ -399,7 +398,6 @@
<string name="nominatim">Nominatim</string> <string name="nominatim">Nominatim</string>
<string name="android">Android</string> <string name="android">Android</string>
<string name="p_location_based_reminders">location_based_reminders</string> <string name="p_location_based_reminders">location_based_reminders</string>
<string name="p_geofence_service">geofence_service</string>
<string name="preference_screen">preference_screen</string> <string name="preference_screen">preference_screen</string>
<string name="p_add_to_top">google_tasks_add_to_top</string> <string name="p_add_to_top">google_tasks_add_to_top</string>
<string name="p_google_tasks_position_hack">google_tasks_position_hack</string> <string name="p_google_tasks_position_hack">google_tasks_position_hack</string>

@ -703,7 +703,4 @@ File %1$s contained %2$s.\n\n
<string name="maps">Maps</string> <string name="maps">Maps</string>
<string name="map_theme_use_app_theme">Use app theme</string> <string name="map_theme_use_app_theme">Use app theme</string>
<string name="location_based_reminders">Location-based reminders</string> <string name="location_based_reminders">Location-based reminders</string>
<string name="geofence_service">Geofence service</string>
<string name="google_play_location_service">Google Play location service</string>
<string name="android_location_services">Android location service</string>
</resources> </resources>

@ -10,14 +10,6 @@
android:key="@string/p_location_based_reminders" android:key="@string/p_location_based_reminders"
android:title="@string/enabled" /> android:title="@string/enabled" />
<ListPreference
android:defaultValue="@string/default_geofence_service"
android:key="@string/p_geofence_service"
android:title="@string/geofence_service"
android:entries="@array/geofence_service_names"
android:entryValues="@array/geofence_service_values"
android:summary="%s" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory <PreferenceCategory

Loading…
Cancel
Save