Add the android-maps-utils library and use the Cluster functionality to display a nice item amount when the markers are too close.
This commit is contained in:
parent
8c56250d1a
commit
6abcf6ed13
3 changed files with 32 additions and 21 deletions
|
@ -66,6 +66,7 @@ dependencies {
|
||||||
implementation 'com.google.code.gson:gson:2.8.5'
|
implementation 'com.google.code.gson:gson:2.8.5'
|
||||||
implementation 'com.google.android.material:material:1.0.0'
|
implementation 'com.google.android.material:material:1.0.0'
|
||||||
implementation 'com.google.android.gms:play-services-maps:16.0.0'
|
implementation 'com.google.android.gms:play-services-maps:16.0.0'
|
||||||
|
implementation 'com.google.maps.android:android-maps-utils:0.5+'
|
||||||
// AAC Lifecycle
|
// AAC Lifecycle
|
||||||
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
|
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
|
||||||
kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
|
kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
|
||||||
|
|
|
@ -3,6 +3,8 @@ package cy.agorise.bitsybitshareswallet.database.entities
|
||||||
import androidx.room.ColumnInfo
|
import androidx.room.ColumnInfo
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
import androidx.room.PrimaryKey
|
import androidx.room.PrimaryKey
|
||||||
|
import com.google.android.gms.maps.model.LatLng
|
||||||
|
import com.google.maps.android.clustering.ClusterItem
|
||||||
|
|
||||||
@Entity(tableName = "merchants")
|
@Entity(tableName = "merchants")
|
||||||
data class Merchant(
|
data class Merchant(
|
||||||
|
@ -10,9 +12,22 @@ data class Merchant(
|
||||||
@ColumnInfo(name = "id") val _id: String,
|
@ColumnInfo(name = "id") val _id: String,
|
||||||
@ColumnInfo(name = "name") val name: String,
|
@ColumnInfo(name = "name") val name: String,
|
||||||
@ColumnInfo(name = "address") val address: String?,
|
@ColumnInfo(name = "address") val address: String?,
|
||||||
@ColumnInfo(name = "lat") val lat: Float,
|
@ColumnInfo(name = "lat") val lat: Double,
|
||||||
@ColumnInfo(name = "lon") val lon: Float,
|
@ColumnInfo(name = "lon") val lon: Double,
|
||||||
@ColumnInfo(name = "phone") val phone: String?,
|
@ColumnInfo(name = "phone") val phone: String?,
|
||||||
@ColumnInfo(name = "telegram") val telegram: String?,
|
@ColumnInfo(name = "telegram") val telegram: String?,
|
||||||
@ColumnInfo(name = "website") val website: String?
|
@ColumnInfo(name = "website") val website: String?
|
||||||
)
|
) : ClusterItem {
|
||||||
|
override fun getSnippet(): String {
|
||||||
|
return address ?: ""
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getTitle(): String {
|
||||||
|
return name
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getPosition(): LatLng {
|
||||||
|
return LatLng(lat, lon)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -21,13 +21,13 @@ import retrofit2.Call
|
||||||
import retrofit2.Response
|
import retrofit2.Response
|
||||||
import retrofit2.Retrofit
|
import retrofit2.Retrofit
|
||||||
import retrofit2.converter.gson.GsonConverterFactory
|
import retrofit2.converter.gson.GsonConverterFactory
|
||||||
import java.io.IOException
|
|
||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.graphics.Canvas
|
import android.graphics.Canvas
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import android.preference.PreferenceManager
|
import android.preference.PreferenceManager
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import com.google.android.gms.maps.model.*
|
import com.google.android.gms.maps.model.*
|
||||||
|
import com.google.maps.android.clustering.ClusterManager
|
||||||
import cy.agorise.bitsybitshareswallet.database.entities.Merchant
|
import cy.agorise.bitsybitshareswallet.database.entities.Merchant
|
||||||
import cy.agorise.bitsybitshareswallet.utils.Constants
|
import cy.agorise.bitsybitshareswallet.utils.Constants
|
||||||
import cy.agorise.bitsybitshareswallet.utils.toast
|
import cy.agorise.bitsybitshareswallet.utils.toast
|
||||||
|
@ -44,7 +44,7 @@ class MerchantsFragment : Fragment(), OnMapReadyCallback, retrofit2.Callback<Fea
|
||||||
|
|
||||||
private lateinit var mMap: GoogleMap
|
private lateinit var mMap: GoogleMap
|
||||||
|
|
||||||
private var merchants: List<Merchant>? = null
|
private var mClusterManager: ClusterManager<Merchant>? = null
|
||||||
|
|
||||||
private lateinit var merchantIcon: BitmapDescriptor
|
private lateinit var merchantIcon: BitmapDescriptor
|
||||||
|
|
||||||
|
@ -107,6 +107,13 @@ class MerchantsFragment : Fragment(), OnMapReadyCallback, retrofit2.Callback<Fea
|
||||||
|
|
||||||
verifyLocationPermission()
|
verifyLocationPermission()
|
||||||
|
|
||||||
|
// Setup clusters to group markers when possible
|
||||||
|
mClusterManager = ClusterManager(context, mMap)
|
||||||
|
|
||||||
|
// Point the map's listeners at the listeners implemented by the cluster manager.
|
||||||
|
mMap.setOnCameraIdleListener(mClusterManager)
|
||||||
|
mMap.setOnMarkerClickListener(mClusterManager)
|
||||||
|
|
||||||
val gson = GsonBuilder()
|
val gson = GsonBuilder()
|
||||||
.setLenient()
|
.setLenient()
|
||||||
.create()
|
.create()
|
||||||
|
@ -142,26 +149,14 @@ class MerchantsFragment : Fragment(), OnMapReadyCallback, retrofit2.Callback<Fea
|
||||||
override fun onResponse(call: Call<FeathersResponse<Merchant>>, response: Response<FeathersResponse<Merchant>>) {
|
override fun onResponse(call: Call<FeathersResponse<Merchant>>, response: Response<FeathersResponse<Merchant>>) {
|
||||||
if (response.isSuccessful) {
|
if (response.isSuccessful) {
|
||||||
val res: FeathersResponse<Merchant>? = response.body()
|
val res: FeathersResponse<Merchant>? = response.body()
|
||||||
merchants = res!!.data
|
val merchants = res?.data ?: return
|
||||||
for (mer in merchants!!) {
|
mClusterManager?.addItems(merchants)
|
||||||
val location = LatLng(mer.lat.toDouble(), mer.lon.toDouble())
|
|
||||||
mMap.addMarker(
|
|
||||||
MarkerOptions().position(location).title(mer.name).snippet(mer.address).icon(merchantIcon)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
try {
|
Log.e("error_bitsy", response.errorBody()?.string())
|
||||||
Log.e("error_bitsy", response.errorBody()?.string())
|
|
||||||
} catch (e: IOException) {
|
|
||||||
e.printStackTrace()
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFailure(call: Call<FeathersResponse<Merchant>>, t: Throwable) {
|
override fun onFailure(call: Call<FeathersResponse<Merchant>>, t: Throwable) { /* Do nothing */ }
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getMarkerIconFromDrawable(drawable: Drawable): BitmapDescriptor {
|
private fun getMarkerIconFromDrawable(drawable: Drawable): BitmapDescriptor {
|
||||||
val canvas = Canvas()
|
val canvas = Canvas()
|
||||||
|
|
Loading…
Reference in a new issue