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="support_email">support@tasks.org</string>
<string name="default_reverse_geocoder">1</string> <!-- Nominatim -->
<string name="default_geofence_service">1</string> <!-- Android LocationManager -->
</resources>

@ -1,65 +1,12 @@
package org.tasks.gtasks
import android.app.Activity
import android.content.Context
import android.widget.Toast
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 org.tasks.R
import org.tasks.data.LocationDao
import org.tasks.preferences.Preferences
import timber.log.Timber
import javax.inject.Inject
class PlayServices @Inject constructor(
@param:ApplicationContext private val context: Context,
private val preferences: Preferences,
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
}
object PlayServices {
fun isAvailable(context: Context) =
getInstance().isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS
}

@ -1,9 +1,11 @@
package org.tasks.injection
import android.content.Context
import dagger.Lazy
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import org.tasks.gtasks.PlayServices
import org.tasks.location.*
@ -12,12 +14,16 @@ import org.tasks.location.*
@InstallIn(SingletonComponent::class)
class FlavorModule {
@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
fun getMapFragment(
playServices: PlayServices,
@ApplicationContext context: Context,
osm: Lazy<OsmMapFragment>,
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"?>
<resources>
<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="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="support_email">play-support@tasks.org</string>
<string name="default_reverse_geocoder">0</string> <!-- Mapbox -->
<string name="default_geofence_service">0</string> <!-- Google Play Location Services -->
</resources>

@ -41,7 +41,6 @@ import org.tasks.dialogs.SortDialog.SortDialogCallback
import org.tasks.dialogs.WhatsNewDialog
import org.tasks.filters.PlaceFilter
import org.tasks.fragments.CommentBarFragment.CommentBarFragmentCallback
import org.tasks.gtasks.PlayServices
import org.tasks.injection.InjectingAppCompatActivity
import org.tasks.intents.TaskIntents.getTaskListIntent
import org.tasks.location.LocationPickerActivity
@ -66,7 +65,6 @@ class MainActivity : InjectingAppCompatActivity(), TaskListFragmentCallbackHandl
@Inject lateinit var taskDao: TaskDao
@Inject lateinit var localBroadcastManager: LocalBroadcastManager
@Inject lateinit var taskCreator: TaskCreator
@Inject lateinit var playServices: PlayServices
@Inject lateinit var inventory: Inventory
@Inject lateinit var colorProvider: ColorProvider
@Inject lateinit var locationDao: LocationDao
@ -489,12 +487,6 @@ class MainActivity : InjectingAppCompatActivity(), TaskListFragmentCallbackHandl
taskEditFragment!!.onRemoteListChanged(filter)
}
init {
lifecycleScope.launchWhenResumed {
playServices.check(this@MainActivity)
}
}
companion object {
/** For indicating the new list screen should be launched at fragment setup time */
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 cancelAll() = locationDao.getPlacesWithGeofences().forEach { cancel(it) }
suspend fun update(taskId: Long) = update(locationDao.getPlaceForTask(taskId))
suspend fun update(place: String) = update(locationDao.getPlace(place))
@ -28,11 +26,9 @@ class GeofenceApi @Inject constructor(
Timber.d("Adding geofence for %s", it)
locationService.addGeofences(it)
}
?: cancel(place)
}
private fun cancel(place: Place?) = place?.let {
Timber.d("Removing geofence for %s", place)
locationService.removeGeofences(place)
?: place.let {
Timber.d("Removing geofence for %s", it)
locationService.removeGeofences(it)
}
}
}

@ -2,44 +2,25 @@ package org.tasks.preferences.fragments
import android.content.Intent
import android.os.Bundle
import androidx.lifecycle.lifecycleScope
import androidx.preference.Preference
import androidx.preference.SwitchPreference
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.NonCancellable
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.tasks.R
import org.tasks.Tasks.Companion.IS_GOOGLE_PLAY
import org.tasks.billing.Inventory
import org.tasks.gtasks.PlayServices
import org.tasks.injection.InjectingPreferenceFragment
import org.tasks.location.GeofenceApi
import org.tasks.location.LocationPermissionDialog.Companion.newLocationPermissionDialog
import org.tasks.preferences.PermissionChecker
import org.tasks.preferences.Preferences
import org.tasks.ui.Toaster
import javax.inject.Inject
@AndroidEntryPoint
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 preferences: Preferences
override fun getPreferenceXml() = R.xml.preferences_location
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() {
@ -62,29 +43,6 @@ class LocationPreferences : InjectingPreferenceFragment() {
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?) =

@ -697,9 +697,6 @@
<string name="tasks_org_account">Tasks.org cuenta</string>
<string name="subscription">Suscripción</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="map_theme_use_app_theme">Utilizar el tema de la aplicación</string>
<string name="maps">Mapas</string>

@ -694,9 +694,6 @@
<string name="widget_show_title">Afficher le titre</string>
<string name="reverse_geocoder">Géocodeur inversé</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="map_theme_use_app_theme">Utiliser le thème de lapplication</string>
<string name="maps">Cartes</string>

@ -695,9 +695,6 @@
<string name="default_start_date">Alapértelmezett kezdő dátum</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="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="reverse_geocoder">Fordított geokódoló</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="widget_show_title">Toon titel</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="map_theme">Kaartthema</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="subscription">Підписка</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="map_theme_use_app_theme">Використовувати тему застосунку</string>
<string name="maps">Карти</string>

@ -687,9 +687,6 @@
<string name="tasks_org_account">Tasks.org 账户</string>
<string name="subscription">订阅</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="map_theme_use_app_theme">使用应用主题</string>
<string name="maps">地图</string>

@ -281,14 +281,4 @@
<item>1</item>
<item>2</item>
</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>

@ -382,7 +382,6 @@
<string name="p_flipper">p_flipper</string>
<string name="p_debug_pro">debug_pro</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_caldav">sync_ongoing_caldav</string>
<string name="p_sync_ongoing_etesync">sync_ongoing_etesync</string>
@ -399,7 +398,6 @@
<string name="nominatim">Nominatim</string>
<string name="android">Android</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="p_add_to_top">google_tasks_add_to_top</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="map_theme_use_app_theme">Use app theme</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>

@ -10,14 +10,6 @@
android:key="@string/p_location_based_reminders"
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

Loading…
Cancel
Save