Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save mhd-zulqarnain/56823bd60199825b3c31ee8846bde3a4 to your computer and use it in GitHub Desktop.
Save mhd-zulqarnain/56823bd60199825b3c31ee8846bde3a4 to your computer and use it in GitHub Desktop.
Interactiveinfowindow using InteractiveInfoWindowAndroid with fragment and multiple formview .Marker coordinates will be fetch from server
package com.reactivelogix.nefsy.nearby
import android.location.Location
import android.os.Bundle
import android.support.v4.app.Fragment
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.appolica.interactiveinfowindow.InfoWindow
import com.appolica.interactiveinfowindow.InfoWindow.MarkerSpecification
import com.appolica.interactiveinfowindow.InfoWindowManager
import com.appolica.interactiveinfowindow.fragment.MapInfoWindowFragment
import com.google.android.gms.location.LocationCallback
import com.google.android.gms.location.LocationRequest
import com.google.android.gms.location.LocationResult
import com.google.android.gms.location.LocationServices
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.GoogleMap.OnCameraMoveStartedListener.REASON_API_ANIMATION
import com.google.android.gms.maps.GoogleMap.OnMarkerClickListener
import com.google.android.gms.maps.OnMapReadyCallback
import com.google.android.gms.maps.model.LatLng
import com.google.android.gms.maps.model.Marker
import com.google.android.gms.maps.model.MarkerOptions
import com.google.gson.Gson
import com.google.gson.JsonObject
import com.google.maps.android.SphericalUtil
import com.reactivelogix.nefsy.R
import com.reactivelogix.nefsy.models.StoreNearBy
import com.reactivelogix.nefsy.utilities.NetworkUtils
import com.reactivelogix.nefsy.utilities.ServiceError
import com.reactivelogix.nefsy.utilities.ServiceListener
import com.reactivelogix.nefsy.utilities.Utils
import com.reactivelogix.nefsy.webservices.ServiceHandler
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
class NearByMapViewFragment : Fragment(),
OnMarkerClickListener,
GoogleMap.OnCameraMoveStartedListener {
var mMap: GoogleMap? = null
val TAG = "MapViewFragment"
var onceaniamte = true
private var infoWindowManager: InfoWindowManager? = null
private var mapInfoWindowFragment: MapInfoWindowFragment? = null
private var infoMap = HashMap<String, InfoWindow>()
private var lastLatLng: LatLng? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_near_by_map_view, container, false)
mapInfoWindowFragment = childFragmentManager.findFragmentById(R.id.infoWindowMap) as MapInfoWindowFragment
infoWindowManager = mapInfoWindowFragment!!.infoWindowManager()
onMapReady()
return view
}
fun onMapReady() {
mapInfoWindowFragment!!.getMapAsync(object : OnMapReadyCallback {
override fun onMapReady(p0: GoogleMap?) {
mMap = p0
mMap!!.getUiSettings().setMapToolbarEnabled(false)
mMap!!.getUiSettings().setZoomControlsEnabled(false);
mMap!!.setMinZoomPreference(11f)
// getStores("55.3847480379045 25.172754325291166")
}
})
}
fun getStores(latlng:LatLng) {
//hit the api and get the reponse
//StoreNearBy
showLocationsOnMap(serverResponse)
mMap!!.setOnCameraMoveStartedListener(this)
}
private fun showLocationsOnMap(serverResponse: List<StoreNearBy>) {
val mLocations: ArrayList<StoreNearBy> = ArrayList()
mLocations.addAll(serverResponse)
if (onceaniamte) {
mMap!!.animateCamera(
CameraUpdateFactory.newLatLngZoom(
LatLng(serverResponse[0].branchLat,
serverResponse[0].branchLong),
12.0f))
onceaniamte = false
}
onceaniamte = false
var latitude: Float
var longitude: Float
for (location in mLocations) {
latitude = location.branchLat.toFloat()
longitude = location.branchLong.toFloat()
val latlang = LatLng(latitude.toDouble(), longitude.toDouble())
val marker2: Marker = mMap!!.addMarker(MarkerOptions().position(latlang).snippet(location.rowId.toString()))
val offsetX = resources.getDimension(R.dimen.marker_offset_x).toInt()
val offsetY = resources.getDimension(R.dimen.marker_offset_y).toInt()
val markerSpec = MarkerSpecification(offsetX, offsetY)
//setting up formfragement
val obj = Gson().toJson(location)
val latLongStr = "$latitude $longitude"
val formWindow = InfoWindow(
marker2,
markerSpec,
FormFragment.newInstance(obj, latLongStr))
infoMap.put(location.rowId!!.toString(), formWindow)
mMap!!.setOnMarkerClickListener(this@NearByMapViewFragment)
}
}
override fun onMarkerClick(p0: Marker?): Boolean {
val infoWindow: InfoWindow? = infoMap.get(p0!!.snippet)
if (infoWindow != null) {
infoWindowManager!!.toggle(infoWindow, true)
}
return false
}
override fun onCameraMoveStarted(p0: Int) {
Log.e(TAG, "OnCameraMoveStartedListener $p0")
if (p0 != REASON_API_ANIMATION) {
val lat = mMap!!.getCameraPosition().target.latitude
val long = mMap!!.getCameraPosition().target.longitude
val newLatLng = LatLng(lat, long)
val distance = SphericalUtil.computeDistanceBetween(lastLatLng, newLatLng)
Log.e(TAG, "Distance $distance")
if (distance > 2000) { //refresh when the pointer has distance of 2km
mMap!!.clear()
val point = "$long $lat"
if (!onceaniamte)
getStores(newLatLng)
lastLatLng= newLatLng
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment