Convert Place to data class

pull/2266/head
Alex Baker 3 years ago
parent 2c697fd5b9
commit e41b9561dc

@ -20,7 +20,6 @@ import org.tasks.dialogs.IconPickerDialog
import org.tasks.dialogs.IconPickerDialog.IconPickerCallback import org.tasks.dialogs.IconPickerDialog.IconPickerCallback
import org.tasks.injection.ThemedInjectingAppCompatActivity import org.tasks.injection.ThemedInjectingAppCompatActivity
import org.tasks.themes.ColorProvider import org.tasks.themes.ColorProvider
import org.tasks.themes.CustomIcons
import org.tasks.themes.CustomIcons.getIconResId import org.tasks.themes.CustomIcons.getIconResId
import org.tasks.themes.DrawableUtil import org.tasks.themes.DrawableUtil
import org.tasks.themes.ThemeColor import org.tasks.themes.ThemeColor
@ -37,6 +36,7 @@ abstract class BaseListSettingsActivity : ThemedInjectingAppCompatActivity(), Ic
private lateinit var icon: TextView private lateinit var icon: TextView
protected lateinit var toolbar: Toolbar protected lateinit var toolbar: Toolbar
protected lateinit var colorRow: ViewGroup protected lateinit var colorRow: ViewGroup
protected abstract val defaultIcon: Int
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@ -149,10 +149,7 @@ abstract class BaseListSettingsActivity : ThemedInjectingAppCompatActivity(), Ic
clear.visibility = View.VISIBLE clear.visibility = View.VISIBLE
} }
themeColor.applyToNavigationBar(this) themeColor.applyToNavigationBar(this)
var icon = getIconResId(selectedIcon) val icon = getIconResId(selectedIcon) ?: getIconResId(defaultIcon)
if (icon == null) {
icon = getIconResId(CustomIcons.LIST)
}
DrawableUtil.setLeftDrawable(this, this.icon, icon!!) DrawableUtil.setLeftDrawable(this, this.icon, icon!!)
DrawableUtil.getLeftDrawable(this.icon).setTint(getColor(R.color.icon_tint_with_alpha)) DrawableUtil.getLeftDrawable(this.icon).setTint(getColor(R.color.icon_tint_with_alpha))
} }

@ -41,6 +41,7 @@ import org.tasks.databinding.FilterSettingsActivityBinding
import org.tasks.db.QueryUtils import org.tasks.db.QueryUtils
import org.tasks.extensions.Context.openUri import org.tasks.extensions.Context.openUri
import org.tasks.filters.FilterCriteriaProvider import org.tasks.filters.FilterCriteriaProvider
import org.tasks.themes.CustomIcons
import java.util.* import java.util.*
import javax.inject.Inject import javax.inject.Inject
import kotlin.math.max import kotlin.math.max
@ -60,6 +61,7 @@ class FilterSettingsActivity : BaseListSettingsActivity() {
private var filter: CustomFilter? = null private var filter: CustomFilter? = null
private lateinit var adapter: CustomFilterAdapter private lateinit var adapter: CustomFilterAdapter
private var criteria: MutableList<CriterionInstance> = ArrayList() private var criteria: MutableList<CriterionInstance> = ArrayList()
override val defaultIcon: Int = CustomIcons.FILTER
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
filter = intent.getParcelableExtra(TOKEN_FILTER) filter = intent.getParcelableExtra(TOKEN_FILTER)

@ -26,6 +26,7 @@ import org.tasks.data.CaldavCalendar
import org.tasks.data.GoogleTaskListDao import org.tasks.data.GoogleTaskListDao
import org.tasks.databinding.ActivityGoogleTaskListSettingsBinding import org.tasks.databinding.ActivityGoogleTaskListSettingsBinding
import org.tasks.extensions.Context.toast import org.tasks.extensions.Context.toast
import org.tasks.themes.CustomIcons
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
@ -42,6 +43,7 @@ class GoogleTaskListSettingsActivity : BaseListSettingsActivity() {
private val createListViewModel: CreateListViewModel by viewModels() private val createListViewModel: CreateListViewModel by viewModels()
private val renameListViewModel: RenameListViewModel by viewModels() private val renameListViewModel: RenameListViewModel by viewModels()
private val deleteListViewModel: DeleteListViewModel by viewModels() private val deleteListViewModel: DeleteListViewModel by viewModels()
override val defaultIcon: Int = CustomIcons.LIST
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
gtasksList = intent.getParcelableExtra(EXTRA_STORE_DATA) gtasksList = intent.getParcelableExtra(EXTRA_STORE_DATA)

@ -20,7 +20,8 @@ import org.tasks.extensions.formatNumber
import org.tasks.filters.PlaceFilter import org.tasks.filters.PlaceFilter
import org.tasks.location.MapFragment import org.tasks.location.MapFragment
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import java.util.* import org.tasks.themes.CustomIcons
import java.util.Locale
import javax.inject.Inject import javax.inject.Inject
import kotlin.math.roundToInt import kotlin.math.roundToInt
@ -46,6 +47,7 @@ class PlaceSettingsActivity : BaseListSettingsActivity(), MapFragment.MapFragmen
@Inject lateinit var localBroadcastManager: LocalBroadcastManager @Inject lateinit var localBroadcastManager: LocalBroadcastManager
private lateinit var place: Place private lateinit var place: Place
override val defaultIcon: Int = CustomIcons.PLACE
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
if (intent?.hasExtra(EXTRA_PLACE) != true) { if (intent?.hasExtra(EXTRA_PLACE) != true) {
@ -65,7 +67,7 @@ class PlaceSettingsActivity : BaseListSettingsActivity(), MapFragment.MapFragmen
if (savedInstanceState == null) { if (savedInstanceState == null) {
name.setText(place.displayName) name.setText(place.displayName)
selectedColor = place.color selectedColor = place.color
selectedIcon = place.getIcon() selectedIcon = place.icon
} }
val dark = preferences.mapTheme == 2 val dark = preferences.mapTheme == 2
@ -102,7 +104,7 @@ class PlaceSettingsActivity : BaseListSettingsActivity(), MapFragment.MapFragmen
override fun hasChanges() = name.text.toString() != place.displayName override fun hasChanges() = name.text.toString() != place.displayName
|| selectedColor != place.color || selectedColor != place.color
|| selectedIcon != place.getIcon() || selectedIcon != place.icon
override suspend fun save() { override suspend fun save() {
val newName: String = name.text.toString() val newName: String = name.text.toString()
@ -112,10 +114,12 @@ class PlaceSettingsActivity : BaseListSettingsActivity(), MapFragment.MapFragmen
return return
} }
place.name = newName place = place.copy(
place.color = selectedColor name = newName,
place.setIcon(selectedIcon) color = selectedColor,
place.radius = slider.value.toInt() icon = selectedIcon,
radius = slider.value.toInt(),
)
locationDao.update(place) locationDao.update(place)
setResult( setResult(
Activity.RESULT_OK, Activity.RESULT_OK,

@ -24,6 +24,7 @@ import org.tasks.data.TagDao
import org.tasks.data.TagData import org.tasks.data.TagData
import org.tasks.data.TagDataDao import org.tasks.data.TagDataDao
import org.tasks.databinding.ActivityTagSettingsBinding import org.tasks.databinding.ActivityTagSettingsBinding
import org.tasks.themes.CustomIcons
import javax.inject.Inject import javax.inject.Inject
@AndroidEntryPoint @AndroidEntryPoint
@ -36,6 +37,7 @@ class TagSettingsActivity : BaseListSettingsActivity() {
private var isNewTag = false private var isNewTag = false
private lateinit var tagData: TagData private lateinit var tagData: TagData
override val defaultIcon: Int = CustomIcons.LABEL
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
tagData = intent.getParcelableExtra(EXTRA_TAG_DATA) tagData = intent.getParcelableExtra(EXTRA_TAG_DATA)

@ -28,7 +28,7 @@ import org.tasks.data.CaldavTask
import org.tasks.data.FilterDao import org.tasks.data.FilterDao
import org.tasks.data.Geofence import org.tasks.data.Geofence
import org.tasks.data.LocationDao import org.tasks.data.LocationDao
import org.tasks.data.Place.Companion.newPlace import org.tasks.data.Place
import org.tasks.data.Tag import org.tasks.data.Tag
import org.tasks.data.TagDao import org.tasks.data.TagDao
import org.tasks.data.TagData import org.tasks.data.TagData
@ -214,13 +214,14 @@ class TasksJsonImporter @Inject constructor(
) )
} }
for (location in backup.locations) { for (location in backup.locations) {
val place = newPlace() val place = Place(
place.longitude = location.longitude longitude = location.longitude,
place.latitude = location.latitude latitude = location.latitude,
place.name = location.name name = location.name,
place.address = location.address address = location.address,
place.url = location.url url = location.url,
place.phone = location.phone phone = location.phone,
)
locationDao.insert(place) locationDao.insert(place)
locationDao.insert( locationDao.insert(
Geofence( Geofence(

@ -26,6 +26,7 @@ import org.tasks.data.CaldavAccount
import org.tasks.data.CaldavCalendar import org.tasks.data.CaldavCalendar
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.databinding.ActivityCaldavCalendarSettingsBinding import org.tasks.databinding.ActivityCaldavCalendarSettingsBinding
import org.tasks.themes.CustomIcons
import org.tasks.ui.DisplayableException import org.tasks.ui.DisplayableException
import java.net.ConnectException import java.net.ConnectException
import javax.inject.Inject import javax.inject.Inject
@ -42,6 +43,7 @@ abstract class BaseCaldavCalendarSettingsActivity : BaseListSettingsActivity() {
protected var caldavCalendar: CaldavCalendar? = null protected var caldavCalendar: CaldavCalendar? = null
protected lateinit var caldavAccount: CaldavAccount protected lateinit var caldavAccount: CaldavAccount
override val defaultIcon: Int = CustomIcons.LIST
override fun bind() = ActivityCaldavCalendarSettingsBinding.inflate(layoutInflater).let { override fun bind() = ActivityCaldavCalendarSettingsBinding.inflate(layoutInflater).let {
root = it.rootLayout root = it.rootLayout

@ -77,10 +77,15 @@ class iCalendar @Inject constructor(
} }
var place: Place? = locationDao.findPlace( var place: Place? = locationDao.findPlace(
geo.latitude.toLikeString(), geo.latitude.toLikeString(),
geo.longitude.toLikeString()) geo.longitude.toLikeString()
)
if (place == null) { if (place == null) {
place = Place.newPlace(geo) place = Place(
place.id = locationDao.insert(place) latitude = geo.latitude.toDouble(),
longitude = geo.longitude.toDouble(),
).let {
it.copy(id = locationDao.insert(it))
}
workManager.reverseGeocode(place) workManager.reverseGeocode(place)
} }
val existing = locationDao.getGeofences(taskId) val existing = locationDao.getGeofences(taskId)

@ -110,14 +110,14 @@ fun SampleLocation() {
LocationRow( LocationRow(
location = Location( location = Location(
Geofence(), Geofence(),
Place().apply { Place(
name = "Googleplex" name = "Googleplex",
address = "1600 Amphitheatre Pkwy, Mountain View, CA 94043" address = "1600 Amphitheatre Pkwy, Mountain View, CA 94043"
}, ),
), ),
hasPermissions = true, hasPermissions = true,
onClick = {}, onClick = {},
openGeofenceOptions = {}, openGeofenceOptions = {},
) )
} }
} }

@ -13,99 +13,83 @@ import androidx.room.PrimaryKey
import com.todoroo.andlib.data.Table import com.todoroo.andlib.data.Table
import com.todoroo.astrid.api.FilterListItem.NO_ORDER import com.todoroo.astrid.api.FilterListItem.NO_ORDER
import com.todoroo.astrid.helper.UUIDHelper import com.todoroo.astrid.helper.UUIDHelper
import net.fortuna.ical4j.model.property.Geo
import org.tasks.Strings import org.tasks.Strings
import org.tasks.extensions.Context.openUri import org.tasks.extensions.Context.openUri
import org.tasks.location.MapPosition import org.tasks.location.MapPosition
import org.tasks.themes.CustomIcons.PLACE
import java.io.Serializable import java.io.Serializable
import java.util.regex.Pattern import java.util.regex.Pattern
import kotlin.math.abs import kotlin.math.abs
@Entity(tableName = Place.TABLE_NAME, indices = [Index(name = "place_uid", value = ["uid"], unique = true)]) @Entity(
class Place : Serializable, Parcelable { tableName = Place.TABLE_NAME,
indices = [
Index(name = "place_uid", value = ["uid"], unique = true)
],
)
data class Place(
@PrimaryKey(autoGenerate = true) @PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "place_id") @ColumnInfo(name = "place_id")
@Transient @Transient
var id: Long = 0 val id: Long = 0,
@ColumnInfo(name = "uid") @ColumnInfo(name = "uid")
var uid: String? = null val uid: String? = UUIDHelper.newUUID(),
@ColumnInfo(name = "name") @ColumnInfo(name = "name")
var name: String? = null val name: String? = null,
@ColumnInfo(name = "address") @ColumnInfo(name = "address")
var address: String? = null val address: String? = null,
@ColumnInfo(name = "phone") @ColumnInfo(name = "phone")
var phone: String? = null val phone: String? = null,
@ColumnInfo(name = "url") @ColumnInfo(name = "url")
var url: String? = null val url: String? = null,
@ColumnInfo(name = "latitude") @ColumnInfo(name = "latitude")
var latitude = 0.0 val latitude: Double = 0.0,
@ColumnInfo(name = "longitude") @ColumnInfo(name = "longitude")
var longitude = 0.0 val longitude: Double = 0.0,
@ColumnInfo(name = "place_color") @ColumnInfo(name = "place_color")
var color = 0 val color: Int = 0,
@ColumnInfo(name = "place_icon") @ColumnInfo(name = "place_icon")
private var icon = -1 val icon: Int = -1,
@ColumnInfo(name = "place_order") @ColumnInfo(name = "place_order")
var order = NO_ORDER val order: Int = NO_ORDER,
@ColumnInfo(name = "radius", defaultValue = "250") @ColumnInfo(name = "radius", defaultValue = "250")
var radius = 250 val radius: Int = 250,
) : Serializable, Parcelable {
constructor()
@Ignore @Ignore
constructor(o: Place) { constructor(o: Place): this(
id = o.id id = o.id,
uid = o.uid uid = o.uid,
name = o.name name = o.name,
address = o.address address = o.address,
phone = o.phone phone = o.phone,
url = o.url url = o.url,
latitude = o.latitude latitude = o.latitude,
longitude = o.longitude longitude = o.longitude,
color = o.color color = o.color,
icon = o.icon icon = o.icon,
order = o.order order = o.order,
radius = o.radius radius = o.radius,
} )
@Ignore @Ignore
constructor(parcel: Parcel) { constructor(parcel: Parcel): this(
id = parcel.readLong() id = parcel.readLong(),
uid = parcel.readString() uid = parcel.readString(),
name = parcel.readString() name = parcel.readString(),
address = parcel.readString() address = parcel.readString(),
phone = parcel.readString() phone = parcel.readString(),
url = parcel.readString() url = parcel.readString(),
latitude = parcel.readDouble() latitude = parcel.readDouble(),
longitude = parcel.readDouble() longitude = parcel.readDouble(),
color = parcel.readInt() color = parcel.readInt(),
icon = parcel.readInt() icon = parcel.readInt(),
order = parcel.readInt() order = parcel.readInt(),
radius = parcel.readInt() radius = parcel.readInt(),
} )
fun getIcon(): Int = if (icon == -1) PLACE else icon
fun setIcon(icon: Int) {
this.icon = icon
}
val displayName: String val displayName: String
get() { get() {
if (!Strings.isNullOrEmpty(name) && !COORDS.matcher(name!!).matches()) { if (!Strings.isNullOrEmpty(name) && !COORDS.matcher(name!!).matches()) {
return name!! return name
} }
return if (!Strings.isNullOrEmpty(address)) { return if (!Strings.isNullOrEmpty(address)) {
address!! address!!
@ -142,48 +126,6 @@ class Place : Serializable, Parcelable {
} }
} }
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as Place
if (id != other.id) return false
if (uid != other.uid) return false
if (name != other.name) return false
if (address != other.address) return false
if (phone != other.phone) return false
if (url != other.url) return false
if (latitude != other.latitude) return false
if (longitude != other.longitude) return false
if (color != other.color) return false
if (icon != other.icon) return false
if (order != other.order) return false
if (radius != other.radius) return false
return true
}
override fun hashCode(): Int {
var result = id.hashCode()
result = 31 * result + (uid?.hashCode() ?: 0)
result = 31 * result + (name?.hashCode() ?: 0)
result = 31 * result + (address?.hashCode() ?: 0)
result = 31 * result + (phone?.hashCode() ?: 0)
result = 31 * result + (url?.hashCode() ?: 0)
result = 31 * result + latitude.hashCode()
result = 31 * result + longitude.hashCode()
result = 31 * result + color
result = 31 * result + icon
result = 31 * result + order
result = 31 * result + radius
return result
}
override fun toString(): String {
return "Place(id=$id, uid=$uid, name=$name, address=$address, phone=$phone, url=$url, latitude=$latitude, longitude=$longitude, color=$color, icon=$icon, order=$order, radius=$radius)"
}
companion object { companion object {
const val KEY = "place" const val KEY = "place"
const val TABLE_NAME = "places" const val TABLE_NAME = "places"
@ -213,16 +155,5 @@ class Place : Serializable, Parcelable {
} }
} }
@JvmStatic fun newPlace(geo: Geo): Place = newPlace().apply {
latitude = geo.latitude.toDouble()
longitude = geo.longitude.toDouble()
}
fun newPlace(mapPosition: MapPosition) = newPlace().apply {
latitude = mapPosition.latitude
longitude = mapPosition.longitude
}
@JvmStatic fun newPlace(): Place = Place().apply { uid = UUIDHelper.newUUID() }
} }
} }

@ -10,7 +10,7 @@ class PlaceUsage {
get() = place.color get() = place.color
val icon: Int val icon: Int
get() = place.getIcon() get() = place.icon
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
if (this === other) return true if (this === other) return true

@ -3,7 +3,9 @@ package org.tasks.filters;
import android.content.Context; import android.content.Context;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import com.todoroo.andlib.data.Table; import com.todoroo.andlib.data.Table;
import com.todoroo.andlib.sql.Criterion; import com.todoroo.andlib.sql.Criterion;
import com.todoroo.andlib.sql.Field; import com.todoroo.andlib.sql.Field;
@ -12,12 +14,15 @@ import com.todoroo.andlib.sql.QueryTemplate;
import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.Filter;
import com.todoroo.astrid.api.FilterListItem; import com.todoroo.astrid.api.FilterListItem;
import com.todoroo.astrid.data.Task; import com.todoroo.astrid.data.Task;
import java.util.HashMap;
import java.util.Map;
import org.tasks.R; import org.tasks.R;
import org.tasks.data.Geofence; import org.tasks.data.Geofence;
import org.tasks.data.Place; import org.tasks.data.Place;
import org.tasks.data.TaskDao; import org.tasks.data.TaskDao;
import org.tasks.themes.CustomIcons;
import java.util.HashMap;
import java.util.Map;
public class PlaceFilter extends Filter { public class PlaceFilter extends Filter {
@ -61,6 +66,9 @@ public class PlaceFilter extends Filter {
id = place.getId(); id = place.getId();
tint = place.getColor(); tint = place.getColor();
icon = place.getIcon(); icon = place.getIcon();
if (icon == -1) {
icon = CustomIcons.PLACE;
}
order = place.getOrder(); order = place.getOrder();
} }

@ -41,11 +41,14 @@ class ReverseGeocodeWork @AssistedInject constructor(
Timber.d("Ignoring $result - ${distanceBetween}m away") Timber.d("Ignoring $result - ${distanceBetween}m away")
return Result.failure() return Result.failure()
} }
place.name = result.name locationDao.update(
place.address = result.address place.copy(
place.phone = result.phone name = result.name,
place.url = result.url address = result.address,
locationDao.update(place) phone = result.phone,
url = result.url,
)
)
localBroadcastManager.broadcastRefresh() localBroadcastManager.broadcastRefresh()
Timber.d("found $result") Timber.d("found $result")
Result.success() Result.success()

@ -12,7 +12,6 @@ import okhttp3.Request
import org.tasks.DebugNetworkInterceptor import org.tasks.DebugNetworkInterceptor
import org.tasks.R import org.tasks.R
import org.tasks.data.Place import org.tasks.data.Place
import org.tasks.data.Place.Companion.newPlace
import org.tasks.extensions.JsonObject.getStringOrNull import org.tasks.extensions.JsonObject.getStringOrNull
import org.tasks.preferences.Preferences import org.tasks.preferences.Preferences
import java.io.IOException import java.io.IOException
@ -48,24 +47,23 @@ class GeocoderMapbox @Inject constructor(
.takeIf { it.size() > 0 }?.get(0)?.asJsonObject .takeIf { it.size() > 0 }?.get(0)?.asJsonObject
?.let { toPlace(it) } ?.let { toPlace(it) }
internal fun toPlace(feature: JsonObject): Place = internal fun toPlace(feature: JsonObject): Place {
newPlace().apply { val text = feature.get("text").asString
val types = feature.get("place_type").asStringList val coords = feature.get("center").asCoordinates
val text = feature.get("text").asString return Place(
name = if (types.contains("address")) { name = if (feature.get("place_type").asStringList.contains("address")) {
feature feature
.getStringOrNull("address") .getStringOrNull("address")
?.let { "$it $text" } ?.let { "$it $text" }
?: text ?: text
} else { } else {
text text
} },
address = feature.get("place_name").asString address = feature.get("place_name").asString,
feature.get("center").asCoordinates.let { longitude = coords.first,
longitude = it.first latitude = coords.second,
latitude = it.second )
} }
}
private val JsonElement.asStringList: List<String> private val JsonElement.asStringList: List<String>
get() = asJsonArray.map { it.asString } get() = asJsonArray.map { it.asString }

@ -10,7 +10,6 @@ import okhttp3.Request
import org.tasks.BuildConfig import org.tasks.BuildConfig
import org.tasks.R import org.tasks.R
import org.tasks.data.Place import org.tasks.data.Place
import org.tasks.data.Place.Companion.newPlace
import org.tasks.extensions.JsonObject.getOrNull import org.tasks.extensions.JsonObject.getOrNull
import org.tasks.extensions.JsonObject.getStringOrNull import org.tasks.extensions.JsonObject.getStringOrNull
import org.tasks.http.HttpClientFactory import org.tasks.http.HttpClientFactory
@ -50,16 +49,15 @@ class GeocoderNominatim @Inject constructor(
.get("properties").asJsonObject .get("properties").asJsonObject
.get("geocoding").asJsonObject .get("geocoding").asJsonObject
val geometry = feature.get("geometry").asJsonObject val geometry = feature.get("geometry").asJsonObject
newPlace().apply { val coords = geometry.get("coordinates").asCoordinates
return Place(
name = geocoding.getStringOrNull("name") name = geocoding.getStringOrNull("name")
?: geocoding.getStringOrNull("housenumber") ?: geocoding.getStringOrNull("housenumber")
?.let { "$it ${geocoding.get("street").asString}" } ?.let { "$it ${geocoding.get("street").asString}" },
address = geocoding.getOrNull("label")?.asString address = geocoding.getOrNull("label")?.asString,
geometry.get("coordinates").asCoordinates.let { longitude = coords.first,
longitude = it.first latitude = coords.second,
latitude = it.second )
}
}
} }
private val JsonElement.asCoordinates: Pair<Double, Double> private val JsonElement.asCoordinates: Pair<Double, Double>

@ -35,7 +35,6 @@ import org.tasks.billing.Inventory
import org.tasks.caldav.GeoUtils.toLikeString import org.tasks.caldav.GeoUtils.toLikeString
import org.tasks.data.LocationDao import org.tasks.data.LocationDao
import org.tasks.data.Place import org.tasks.data.Place
import org.tasks.data.Place.Companion.newPlace
import org.tasks.data.PlaceUsage import org.tasks.data.PlaceUsage
import org.tasks.databinding.ActivityLocationPickerBinding import org.tasks.databinding.ActivityLocationPickerBinding
import org.tasks.dialogs.DialogBuilder import org.tasks.dialogs.DialogBuilder
@ -231,7 +230,13 @@ class LocationPickerActivity : InjectingAppCompatActivity(), Toolbar.OnMenuItemC
loadingIndicator.visibility = View.VISIBLE loadingIndicator.visibility = View.VISIBLE
lifecycleScope.launch { lifecycleScope.launch {
try { try {
returnPlace(geocoder.reverseGeocode(mapPosition) ?: newPlace(mapPosition)) returnPlace(
geocoder.reverseGeocode(mapPosition)
?: Place(
latitude = mapPosition.latitude,
longitude = mapPosition.longitude,
)
)
} catch (e: Exception) { } catch (e: Exception) {
loadingIndicator.visibility = View.GONE loadingIndicator.visibility = View.GONE
firebase.reportException(e) firebase.reportException(e)
@ -268,14 +273,12 @@ class LocationPickerActivity : InjectingAppCompatActivity(), Toolbar.OnMenuItemC
lifecycleScope.launch { lifecycleScope.launch {
var place = place var place = place
if (place.id <= 0) { if (place.id <= 0) {
val existing = locationDao.findPlace( place = locationDao
.findPlace(
place.latitude.toLikeString(), place.latitude.toLikeString(),
place.longitude.toLikeString()) place.longitude.toLikeString()
if (existing == null) { )
place.id = locationDao.insert(place) ?: place.copy(id = locationDao.insert(place))
} else {
place = existing
}
} }
setResult(Activity.RESULT_OK, Intent().putExtra(EXTRA_PLACE, place as Parcelable?)) setResult(Activity.RESULT_OK, Intent().putExtra(EXTRA_PLACE, place as Parcelable?))
finish() finish()

@ -12,11 +12,10 @@ import org.tasks.R
import org.tasks.data.CaldavAccount.Companion.TYPE_TASKS import org.tasks.data.CaldavAccount.Companion.TYPE_TASKS
import org.tasks.data.CaldavDao import org.tasks.data.CaldavDao
import org.tasks.data.Place import org.tasks.data.Place
import org.tasks.data.Place.Companion.newPlace
import org.tasks.http.HttpClientFactory import org.tasks.http.HttpClientFactory
import org.tasks.http.HttpException import org.tasks.http.HttpException
import timber.log.Timber import timber.log.Timber
import java.util.* import java.util.UUID
import javax.inject.Inject import javax.inject.Inject
class PlaceSearchGoogle @Inject constructor( class PlaceSearchGoogle @Inject constructor(
@ -126,14 +125,14 @@ class PlaceSearchGoogle @Inject constructor(
internal fun toPlace(json: JsonObject): Place { internal fun toPlace(json: JsonObject): Place {
val result = json.get("result").asJsonObject val result = json.get("result").asJsonObject
val location = result.get("geometry").asJsonObject.get("location").asJsonObject val location = result.get("geometry").asJsonObject.get("location").asJsonObject
return newPlace().apply { return Place(
name = result.get("name").asString name = result.get("name").asString,
address = result.getString("formatted_address") address = result.getString("formatted_address"),
phone = result.getString("international_phone_number") phone = result.getString("international_phone_number"),
url = result.getString("website") url = result.getString("website"),
latitude = location.get("lat").asDouble latitude = location.get("lat").asDouble,
longitude = location.get("lng").asDouble longitude = location.get("lng").asDouble,
} )
} }
private fun JsonObject.getString(field: String): String? = if (has(field)) { private fun JsonObject.getString(field: String): String? = if (has(field)) {

Loading…
Cancel
Save