aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIván Ávalos <avalos@disroot.org>2022-03-10 21:23:09 -0600
committerIván Ávalos <avalos@disroot.org>2022-03-10 21:23:09 -0600
commit9df32de8d2d26b8ebb6c6fb3f0bed10831947293 (patch)
tree81106acd83a93665850af40aca61fc145ae34dde
parent440399490ec8874ed5295ca6b5770c94d47d4f3d (diff)
parent620cd5b1e2782adfd57660017878013f2fb896bd (diff)
downloadetbsa-trackermap-mobile-9df32de8d2d26b8ebb6c6fb3f0bed10831947293.tar.gz
etbsa-trackermap-mobile-9df32de8d2d26b8ebb6c6fb3f0bed10831947293.tar.bz2
etbsa-trackermap-mobile-9df32de8d2d26b8ebb6c6fb3f0bed10831947293.zip
Merge branch 'main' of https://git.sr.ht/~avalos/trackermap-mobile
-rw-r--r--androidApp/build.gradle.kts8
-rw-r--r--androidApp/libs/WhirlyGlobeMaply.aarbin7091003 -> 7331207 bytes
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesAdapter.kt11
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesDiffCallback.kt20
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesFragment.kt7
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt19
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/session/LoginFragment.kt10
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt3
-rw-r--r--androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt44
9 files changed, 87 insertions, 35 deletions
diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts
index 42db9be..fd1acf5 100644
--- a/androidApp/build.gradle.kts
+++ b/androidApp/build.gradle.kts
@@ -49,13 +49,13 @@ dependencies {
implementation("androidx.constraintlayout:constraintlayout:2.1.3")
implementation("com.squareup.okhttp3:okhttp:4.9.1")
implementation("com.github.Zhuinden:live-event:1.2.0")
- implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0")
- implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.4.0")
- implementation("androidx.preference:preference-ktx:1.1.1")
+ implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1")
+ implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.4.1")
+ implementation("androidx.preference:preference-ktx:1.2.0")
implementation("io.insert-koin:koin-android:3.1.4")
implementation("androidx.core:core-ktx:1.7.0")
implementation("androidx.activity:activity-ktx:1.4.0")
- implementation("androidx.fragment:fragment-ktx:1.4.0")
+ implementation("androidx.fragment:fragment-ktx:1.4.1")
implementation("io.ktor:ktor-client-serialization:1.6.6")
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.3.1")
implementation("com.github.zerobranch:SwipeLayout:1.3.1")
diff --git a/androidApp/libs/WhirlyGlobeMaply.aar b/androidApp/libs/WhirlyGlobeMaply.aar
index 644e8ad..46aa91d 100644
--- a/androidApp/libs/WhirlyGlobeMaply.aar
+++ b/androidApp/libs/WhirlyGlobeMaply.aar
Binary files differ
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesAdapter.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesAdapter.kt
index 4cfd6b5..0fbf597 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesAdapter.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesAdapter.kt
@@ -20,6 +20,7 @@ package mx.trackermap.TrackerMap.android.devices
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.core.view.updateLayoutParams
+import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView
import mx.trackermap.TrackerMap.android.R
import mx.trackermap.TrackerMap.android.databinding.UnitItemBinding
@@ -28,10 +29,18 @@ import mx.trackermap.TrackerMap.android.shared.UnitRenderData
import mx.trackermap.TrackerMap.client.models.UnitInformation
class DevicesAdapter(
- private val units: List<UnitInformation>,
+ private val units: MutableList<UnitInformation>,
private val actionCallback: ActionCallback?
) : RecyclerView.Adapter<DevicesAdapter.ViewHolder>() {
+ fun setData(units: List<UnitInformation>) {
+ val diffCallback = DevicesDiffCallback(this.units, units)
+ val diffResult = DiffUtil.calculateDiff(diffCallback)
+ this.units.clear()
+ this.units.addAll(units)
+ diffResult.dispatchUpdatesTo(this)
+ }
+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding = UnitItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesDiffCallback.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesDiffCallback.kt
new file mode 100644
index 0000000..40e6e9c
--- /dev/null
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesDiffCallback.kt
@@ -0,0 +1,20 @@
+package mx.trackermap.TrackerMap.android.devices
+
+import androidx.recyclerview.widget.DiffUtil
+import mx.trackermap.TrackerMap.client.models.UnitInformation
+
+class DevicesDiffCallback(
+ private val oldList: List<UnitInformation>,
+ private val newList: List<UnitInformation>
+): DiffUtil.Callback() {
+ override fun getOldListSize() = oldList.size
+
+ override fun getNewListSize() = newList.size
+
+ override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int) =
+ oldList[oldItemPosition].device.id == newList[newItemPosition].device.id
+
+ override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int) =
+ (oldList[oldItemPosition].position?.id == newList[newItemPosition].position?.id) && newItemPosition != 0
+
+} \ No newline at end of file
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesFragment.kt
index ad93429..e5143cb 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesFragment.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/devices/DevicesFragment.kt
@@ -83,7 +83,7 @@ class DevicesFragment : Fragment() {
context, LinearLayoutManager.VERTICAL,
false
)
- binding.devicesList.adapter = DevicesAdapter(emptyList(), null)
+ binding.devicesList.adapter = DevicesAdapter(mutableListOf(), this::itemAction)
binding.infoLoading.root.visibility = View.VISIBLE
}
@@ -93,10 +93,7 @@ class DevicesFragment : Fragment() {
unitsViewModel.units.observe(viewLifecycleOwner) { units ->
Log.d("DevicesFragment", "Success $units")
binding.infoLoading.root.visibility = View.GONE
- binding.devicesList.swapAdapter(
- DevicesAdapter(units, this::itemAction),
- false
- )
+ (binding.devicesList.adapter as DevicesAdapter).setData(units)
}
}
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt
index e7e5ce0..5e2224b 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/map/UnitMapFragment.kt
@@ -85,7 +85,7 @@ class UnitMapFragment : Fragment() {
childFragmentManager.commit {
replace(R.id.unitsMap, mapFragment)
}
- mapFragment.setMarkerCallback(unitsViewModel::selectUnitWith)
+ mapFragment.setMarkerCallback(unitsViewModel::selectUnitWithPositionId)
}
private fun setupObservers() {
@@ -132,14 +132,16 @@ class UnitMapFragment : Fragment() {
), binding.mapUnitCard.context, unit, this::itemAction
)
- unitsViewModel.moveCamera(
- UnitsViewModel.Camera(
- point = Point2d(
- unit.position!!.longitude!!, unit.position!!.latitude!!
- ),
- animated = true
+ if (selectedUnit.device.id != unitsViewModel.oldSelectedUnit.value?.device?.id) {
+ unitsViewModel.moveCamera(
+ UnitsViewModel.Camera(
+ point = Point2d(
+ unit.position!!.longitude!!, unit.position!!.latitude!!
+ ),
+ animated = true
+ )
)
- )
+ }
}
}
@@ -178,6 +180,7 @@ class UnitMapFragment : Fragment() {
unitsViewModel.selectedUnit.removeObservers(viewLifecycleOwner)
unitsViewModel.mapLayerType.removeObservers(viewLifecycleOwner)
unitsViewModel.geofences.removeObservers(viewLifecycleOwner)
+ unitsViewModel.camera.removeObservers(viewLifecycleOwner)
}
private fun itemAction(unit: UnitInformation, action: UnitRenderData.Action) {
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/session/LoginFragment.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/session/LoginFragment.kt
index c855f44..6a30789 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/session/LoginFragment.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/session/LoginFragment.kt
@@ -58,10 +58,10 @@ class LoginFragment : Fragment() {
setupEvents()
setupObservers()
- broadcastManager = LocalBroadcastManager.getInstance(activity!!)
+ broadcastManager = LocalBroadcastManager.getInstance(requireActivity())
binding.urlEditText.setText(
PreferenceManager
- .getDefaultSharedPreferences(activity)
+ .getDefaultSharedPreferences(requireActivity())
.getString(
PREFERENCE_SERVER_URL,
getString(R.string.default_server_url)
@@ -93,7 +93,7 @@ class LoginFragment : Fragment() {
binding.passwordEditText.text.toString(),
binding.urlEditText.text.toString(),
PreferenceManager
- .getDefaultSharedPreferences(activity)
+ .getDefaultSharedPreferences(requireActivity())
.getString(PREFERENCE_TOKEN, null)
)
}
@@ -127,7 +127,7 @@ class LoginFragment : Fragment() {
}
SessionController.LoginState.Success -> {
PreferenceManager
- .getDefaultSharedPreferences(activity)
+ .getDefaultSharedPreferences(requireActivity())
.edit()
.putString(PREFERENCE_SERVER_URL, binding.urlEditText.text.toString())
.apply()
@@ -148,7 +148,7 @@ class LoginFragment : Fragment() {
override fun onReceive(p0: Context?, p1: Intent?) {
p1?.getStringExtra(KEY_TOKEN)?.let { token ->
PreferenceManager
- .getDefaultSharedPreferences(activity)
+ .getDefaultSharedPreferences(requireActivity())
.edit()
.putString(PREFERENCE_TOKEN, token)
.apply()
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt
index 4371eed..09bedbb 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsActivity.kt
@@ -128,9 +128,6 @@ class UnitsActivity : AppCompatActivity() {
}
private fun setupObservers() {
- unitsViewModel.units.observe(this) {
- Toast.makeText(this, getString(R.string.shared_loading), Toast.LENGTH_SHORT).show()
- }
unitsViewModel.unitsDisplayMode.observe(this) { displayMode ->
binding.displayModeToggle.setImageResource(
when (displayMode) {
diff --git a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt
index ba29090..174d55e 100644
--- a/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt
+++ b/androidApp/src/main/java/mx/trackermap/TrackerMap/android/units/UnitsViewModel.kt
@@ -54,6 +54,7 @@ class UnitsViewModel(
private var _searchQuery = savedStateHandle.getLiveData("searchQuery", "")
private var _unitsDisplayMode = MutableLiveData(UnitsDisplayMode.MAP)
private var _units = MutableLiveData<List<UnitInformation>>()
+ private var _oldSelectedUnit = MutableLiveData<UnitInformation?>()
private var _selectedUnit = MutableLiveData<UnitInformation?>()
private var _mapLayerType = MutableLiveData<MapLayer.Type>()
private var _geofences = MutableLiveData<Map<Int, Geofence>>()
@@ -62,6 +63,7 @@ class UnitsViewModel(
val searchQuery: LiveData<String> get() = _searchQuery
val unitsDisplayMode: LiveData<UnitsDisplayMode> get() = _unitsDisplayMode
val units: LiveData<List<UnitInformation>> get() = _units
+ val oldSelectedUnit: LiveData<UnitInformation?> get() = _oldSelectedUnit
val selectedUnit: LiveData<UnitInformation?> get() = _selectedUnit
val mapLayerType: LiveData<MapLayer.Type> get() = _mapLayerType
val geofences: LiveData<Map<Int, Geofence>> get() = _geofences
@@ -82,6 +84,7 @@ class UnitsViewModel(
Log.d("UnitsViewModel", "Setup observers")
unitsController.displayedUnitsFlow.collect { units ->
this._units.value = units
+ updateSelectedUnit()
}
}
@@ -91,22 +94,45 @@ class UnitsViewModel(
}
}
- fun selectUnit(unit: UnitInformation) {
- Log.d("UnitsViewModel", "Selecting unit ${unit.device.name}")
+ fun selectUnit(unit: UnitInformation?, switchToMap: Boolean = true) {
+ Log.d("UnitsViewModel", "Selecting unit ${unit?.device?.name}")
+ _oldSelectedUnit.postValue(_selectedUnit.value)
_selectedUnit.postValue(unit)
- setDisplayMode(UnitsDisplayMode.MAP)
+ if (unit != null && switchToMap) {
+ setDisplayMode(UnitsDisplayMode.MAP)
+ }
}
- fun selectUnitWith(positionId: Int?) {
- if (positionId == null) {
+ fun selectUnitWithPositionId(id: Int?, switchToMap: Boolean = true) {
+ if (id == null) {
Log.d("UnitsViewModel", "Deselecting unit")
- _selectedUnit.postValue(null)
+ selectUnit(null, switchToMap = switchToMap)
return
}
- Log.d("UnitsViewModel", "Selecting unit with position id: $positionId")
- val unit = _units.value?.find { it.position?.id == positionId }
- _selectedUnit.postValue(unit)
+ Log.d("UnitsViewModel", "Selecting unit with position id: $id")
+ val unit = _units.value?.find { it.position?.id == id }
+ selectUnit(unit, switchToMap = switchToMap)
+ }
+
+ private fun selectUnitWithUnitId(id: Int?, switchToMap: Boolean = true) {
+ if (id == null) {
+ Log.d("UnitsViewModel", "Deselecting unit")
+ selectUnit(null, switchToMap = switchToMap)
+ return
+ }
+
+ Log.d("UnitsViewModel", "Selecting unit with device id: $id")
+ val unit = _units.value?.find { it.device.id == id }
+ selectUnit(unit, switchToMap = switchToMap)
+ }
+
+ private fun updateSelectedUnit() {
+ selectedUnit.value?.let { selected ->
+ Log.d("UnitsViewModel", "Updating selected unit with id: ${selected.device.id}")
+ selectUnitWithUnitId(selected.device.id, switchToMap = false)
+ }
+
}
fun setDisplayMode(displayMode: UnitsDisplayMode) {