Move Android platform stuff out of data

pull/2898/head
Alex Baker 4 months ago
parent 2c5a497007
commit 7149308c97

@ -14,6 +14,7 @@ import org.tasks.LocalBroadcastManager
import org.tasks.R import org.tasks.R
import org.tasks.Strings.isNullOrEmpty import org.tasks.Strings.isNullOrEmpty
import org.tasks.data.dao.LocationDao import org.tasks.data.dao.LocationDao
import org.tasks.data.displayName
import org.tasks.data.entity.Place import org.tasks.data.entity.Place
import org.tasks.data.mapPosition import org.tasks.data.mapPosition
import org.tasks.databinding.ActivityLocationSettingsBinding import org.tasks.databinding.ActivityLocationSettingsBinding

@ -21,8 +21,9 @@ import com.google.android.material.composethemeadapter.MdcTheme
import org.tasks.R import org.tasks.R
import org.tasks.compose.DisabledText import org.tasks.compose.DisabledText
import org.tasks.compose.TaskEditRow import org.tasks.compose.TaskEditRow
import org.tasks.data.entity.Geofence
import org.tasks.data.Location import org.tasks.data.Location
import org.tasks.data.displayName
import org.tasks.data.entity.Geofence
import org.tasks.data.entity.Place import org.tasks.data.entity.Place
@Composable @Composable

@ -5,3 +5,6 @@ import android.content.Context
fun Location.open(context: Context?) { fun Location.open(context: Context?) {
place.open(context) place.open(context)
} }
val Location.displayName: String
get() = place.displayName

@ -1,13 +1,46 @@
package org.tasks.data package org.tasks.data
import android.content.Context import android.content.Context
import android.location.Location
import android.net.Uri import android.net.Uri
import org.tasks.data.entity.Place import org.tasks.data.entity.Place
import org.tasks.extensions.Context.openUri import org.tasks.extensions.Context.openUri
import org.tasks.location.MapPosition import org.tasks.location.MapPosition
import java.util.regex.Pattern
import kotlin.math.abs
private val pattern = Pattern.compile("(\\d+):(\\d+):(\\d+\\.\\d+)")
private val COORDS = Pattern.compile("^\\d+°\\d+'\\d+\\.\\d+\"[NS] \\d+°\\d+'\\d+\\.\\d+\"[EW]$")
fun Place.open(context: Context?) = fun Place.open(context: Context?) =
context?.openUri("geo:$latitude,$longitude?q=${Uri.encode(displayName)}") context?.openUri("geo:$latitude,$longitude?q=${Uri.encode(displayName)}")
val Place.mapPosition: MapPosition val Place.mapPosition: MapPosition
get() = MapPosition(latitude, longitude) get() = MapPosition(latitude, longitude)
val Place.displayName: String
get() {
if (!name.isNullOrEmpty() && !COORDS.matcher(name!!).matches()) {
return name!!
}
return if (!address.isNullOrEmpty()) {
address!!
} else {
"${formatCoordinate(latitude, true)} ${formatCoordinate(longitude, false)}"
}
}
private fun formatCoordinate(coordinates: Double, latitude: Boolean): String {
val output = Location.convert(abs(coordinates), Location.FORMAT_SECONDS)
val matcher = pattern.matcher(output)
return if (matcher.matches()) {
val direction = if (latitude) {
if (coordinates > 0) "N" else "S"
} else {
if (coordinates > 0) "E" else "W"
}
"${matcher.group(1)}°${matcher.group(2)}'${matcher.group(3)}\"$direction"
} else {
coordinates.toString()
}
}

@ -17,6 +17,7 @@ import androidx.fragment.app.DialogFragment;
import com.google.android.material.switchmaterial.SwitchMaterial; import com.google.android.material.switchmaterial.SwitchMaterial;
import org.tasks.R; import org.tasks.R;
import org.tasks.data.LocationExtensionsKt;
import org.tasks.data.entity.Geofence; import org.tasks.data.entity.Geofence;
import org.tasks.data.Location; import org.tasks.data.Location;
import org.tasks.databinding.LocationDetailsBinding; import org.tasks.databinding.LocationDetailsBinding;
@ -63,7 +64,7 @@ public class GeofenceDialog extends DialogFragment {
arrivalView.setChecked(geofence.isArrival()); arrivalView.setChecked(geofence.isArrival());
departureView.setChecked(geofence.isDeparture()); departureView.setChecked(geofence.isDeparture());
return dialogBuilder return dialogBuilder
.newDialog(original.getDisplayName()) .newDialog(LocationExtensionsKt.getDisplayName(original))
.setView(binding.getRoot()) .setView(binding.getRoot())
.setNegativeButton(R.string.cancel, null) .setNegativeButton(R.string.cancel, null)
.setOnCancelListener(this::sendResult) .setOnCancelListener(this::sendResult)

@ -1,20 +1,21 @@
package org.tasks.filters package org.tasks.filters
import android.content.Context import android.content.Context
import org.tasks.data.sql.Criterion.Companion.and
import org.tasks.data.sql.Field.Companion.field
import org.tasks.data.sql.Join.Companion.inner
import org.tasks.data.sql.QueryTemplate
import com.todoroo.andlib.utility.AndroidUtilities import com.todoroo.andlib.utility.AndroidUtilities
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 kotlinx.parcelize.Parcelize import kotlinx.parcelize.Parcelize
import org.tasks.data.entity.Geofence
import org.tasks.data.NO_COUNT import org.tasks.data.NO_COUNT
import org.tasks.data.dao.TaskDao.TaskCriteria.activeAndVisible
import org.tasks.data.displayName
import org.tasks.data.entity.Geofence
import org.tasks.data.entity.Place import org.tasks.data.entity.Place
import org.tasks.data.entity.Task import org.tasks.data.entity.Task
import org.tasks.data.dao.TaskDao.TaskCriteria.activeAndVisible
import org.tasks.data.open import org.tasks.data.open
import org.tasks.data.sql.Criterion.Companion.and
import org.tasks.data.sql.Field.Companion.field
import org.tasks.data.sql.Join.Companion.inner
import org.tasks.data.sql.QueryTemplate
import org.tasks.themes.CustomIcons import org.tasks.themes.CustomIcons
@Parcelize @Parcelize

@ -15,6 +15,7 @@ import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import org.tasks.R; import org.tasks.R;
import org.tasks.billing.Inventory; import org.tasks.billing.Inventory;
import org.tasks.data.PlaceExtensionsKt;
import org.tasks.data.entity.Place; import org.tasks.data.entity.Place;
import org.tasks.data.PlaceUsage; import org.tasks.data.PlaceUsage;
import org.tasks.location.LocationPickerAdapter.PlaceViewHolder; import org.tasks.location.LocationPickerAdapter.PlaceViewHolder;
@ -107,7 +108,7 @@ public class LocationPickerAdapter extends ListAdapter<PlaceUsage, PlaceViewHold
void bind(PlaceUsage placeUsage, int color, int icon) { void bind(PlaceUsage placeUsage, int color, int icon) {
place = placeUsage.place; place = placeUsage.place;
String name = place.getDisplayName(); String name = PlaceExtensionsKt.getDisplayName(place);
String address = place.getDisplayAddress(); String address = place.getDisplayAddress();
Drawable wrapped = DrawableUtil.getWrapped(itemView.getContext(), icon); Drawable wrapped = DrawableUtil.getWrapped(itemView.getContext(), icon);
this.icon.setImageDrawable(wrapped); this.icon.setImageDrawable(wrapped);

@ -16,6 +16,7 @@ import org.tasks.R
import org.tasks.data.dao.LocationDao import org.tasks.data.dao.LocationDao
import org.tasks.data.dao.NotificationDao import org.tasks.data.dao.NotificationDao
import org.tasks.data.dao.TaskDao import org.tasks.data.dao.TaskDao
import org.tasks.data.displayName
import org.tasks.data.entity.Alarm import org.tasks.data.entity.Alarm
import org.tasks.data.entity.Notification import org.tasks.data.entity.Notification
import org.tasks.intents.TaskIntents import org.tasks.intents.TaskIntents

@ -20,6 +20,7 @@ import org.tasks.data.dao.LocationDao
import org.tasks.data.entity.Place import org.tasks.data.entity.Place
import org.tasks.data.entity.TagData import org.tasks.data.entity.TagData
import org.tasks.data.dao.TagDataDao import org.tasks.data.dao.TagDataDao
import org.tasks.data.displayName
import org.tasks.dialogs.FilterPicker.Companion.newFilterPicker import org.tasks.dialogs.FilterPicker.Companion.newFilterPicker
import org.tasks.dialogs.FilterPicker.Companion.setFilterPickerResultListener import org.tasks.dialogs.FilterPicker.Companion.setFilterPickerResultListener
import org.tasks.injection.InjectingPreferenceFragment import org.tasks.injection.InjectingPreferenceFragment

@ -16,10 +16,11 @@ import org.tasks.R
import org.tasks.Strings.isNullOrEmpty import org.tasks.Strings.isNullOrEmpty
import org.tasks.compose.collectAsStateLifecycleAware import org.tasks.compose.collectAsStateLifecycleAware
import org.tasks.compose.edit.LocationRow import org.tasks.compose.edit.LocationRow
import org.tasks.data.entity.Geofence
import org.tasks.data.Location import org.tasks.data.Location
import org.tasks.data.entity.Place
import org.tasks.data.createGeofence import org.tasks.data.createGeofence
import org.tasks.data.displayName
import org.tasks.data.entity.Geofence
import org.tasks.data.entity.Place
import org.tasks.data.open import org.tasks.data.open
import org.tasks.dialogs.DialogBuilder import org.tasks.dialogs.DialogBuilder
import org.tasks.dialogs.GeofenceDialog import org.tasks.dialogs.GeofenceDialog

@ -43,9 +43,6 @@ data class Location(
val isDeparture: Boolean val isDeparture: Boolean
get() = geofence.isDeparture get() = geofence.isDeparture
val displayName: String
get() = place.displayName
val displayAddress: String? val displayAddress: String?
get() = place.displayAddress get() = place.displayAddress

@ -1,6 +1,6 @@
package org.tasks.data.entity package org.tasks.data.entity
import android.location.Location
import android.os.Parcelable import android.os.Parcelable
import androidx.room.ColumnInfo import androidx.room.ColumnInfo
import androidx.room.Entity import androidx.room.Entity
@ -12,8 +12,6 @@ import kotlinx.serialization.Transient
import org.tasks.data.NO_ORDER import org.tasks.data.NO_ORDER
import org.tasks.data.UUIDHelper import org.tasks.data.UUIDHelper
import org.tasks.data.db.Table import org.tasks.data.db.Table
import java.util.regex.Pattern
import kotlin.math.abs
@Serializable @Serializable
@Parcelize @Parcelize
@ -51,20 +49,8 @@ data class Place(
@ColumnInfo(name = "radius", defaultValue = "250") @ColumnInfo(name = "radius", defaultValue = "250")
val radius: Int = 250, val radius: Int = 250,
) : java.io.Serializable, Parcelable { ) : java.io.Serializable, Parcelable {
val displayName: String
get() {
if (!name.isNullOrEmpty() && !COORDS.matcher(name!!).matches()) {
return name
}
return if (!address.isNullOrEmpty()) {
address!!
} else {
"${formatCoordinate(latitude, true)} ${formatCoordinate(longitude, false)}"
}
}
val displayAddress: String? val displayAddress: String?
get() = if (address.isNullOrEmpty()) null else address!!.replace("$name, ", "") get() = if (address.isNullOrEmpty()) null else address.replace("$name, ", "")
companion object { companion object {
const val KEY = "place" const val KEY = "place"
@ -73,21 +59,5 @@ data class Place(
@JvmField val UID = TABLE.column("uid") @JvmField val UID = TABLE.column("uid")
@JvmField val NAME = TABLE.column("name") @JvmField val NAME = TABLE.column("name")
@JvmField val ADDRESS = TABLE.column("address") @JvmField val ADDRESS = TABLE.column("address")
private val pattern = Pattern.compile("(\\d+):(\\d+):(\\d+\\.\\d+)")
private val COORDS = Pattern.compile("^\\d+°\\d+'\\d+\\.\\d+\"[NS] \\d+°\\d+'\\d+\\.\\d+\"[EW]$")
private fun formatCoordinate(coordinates: Double, latitude: Boolean): String {
val output = Location.convert(abs(coordinates), Location.FORMAT_SECONDS)
val matcher = pattern.matcher(output)
return if (matcher.matches()) {
val direction = if (latitude) {
if (coordinates > 0) "N" else "S"
} else {
if (coordinates > 0) "E" else "W"
}
"${matcher.group(1)}°${matcher.group(2)}'${matcher.group(3)}\"$direction"
} else {
coordinates.toString()
}
}
} }
} }
Loading…
Cancel
Save