Advertisement
Guest User

Untitled

a guest
Oct 18th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 31.04 KB | None | 0 0
  1. package com.leavingstone.kazbegi.ui.screens.main
  2.  
  3. import android.Manifest
  4. import android.animation.ValueAnimator
  5. import android.annotation.SuppressLint
  6. import android.app.Activity
  7. import android.content.Intent
  8. import android.graphics.Color
  9. import android.location.Location
  10. import android.os.Build
  11. import android.os.Bundle
  12. import android.os.Looper.getMainLooper
  13. import android.provider.Settings
  14. import androidx.core.content.ContextCompat
  15. import android.text.Editable
  16. import android.text.TextUtils
  17. import android.text.TextWatcher
  18. import android.util.Log
  19. import android.view.LayoutInflater
  20. import android.view.View
  21. import android.view.ViewGroup
  22. import android.view.animation.AccelerateInterpolator
  23. import android.view.animation.AlphaAnimation
  24. import android.view.animation.LinearInterpolator
  25. import android.view.inputmethod.EditorInfo
  26. import android.widget.Toast
  27. import com.leavingstone.kazbegi.R
  28. import com.leavingstone.kazbegi.database.RealmHelper
  29. import com.leavingstone.kazbegi.extensions.hideKeyboard
  30. import com.leavingstone.kazbegi.networking.api.response.GetCategoriesResult
  31. import com.leavingstone.kazbegi.networking.api.response.GetLocationsResult
  32. import com.leavingstone.kazbegi.ui.base.BaseActivity
  33. import com.leavingstone.kazbegi.ui.base.BaseMvpFragment
  34. import com.leavingstone.kazbegi.ui.screens.filterfragment.FilterFragment
  35. import com.leavingstone.kazbegi.ui.screens.general.GeneralDescriptionFragment
  36. import com.leavingstone.kazbegi.ui.screens.menu.MenuFragment
  37. import com.leavingstone.kazbegi.ui.screens.tab.TabFragment
  38. import com.leavingstone.kazbegi.ui.widgets.DoubleClickListener
  39. import com.leavingstone.kazbegi.ui.widgets.adapters.SearchAdapter
  40. import com.leavingstone.kazbegi.utils.FilterHelper
  41. import com.leavingstone.kazbegi.utils.MapViewMarker
  42. import com.leavingstone.kazbegi.view.ext.setDebounceOnClickListener
  43. import com.mapbox.android.core.location.*
  44. import com.mapbox.android.core.permissions.PermissionsManager
  45. //import com.mapbox.android.core.location.LocationEngineListener
  46. //import com.mapbox.android.core.location.LocationEnginePriority
  47. import com.mapbox.api.directions.v5.DirectionsCriteria
  48. import com.mapbox.api.directions.v5.models.DirectionsResponse
  49. import com.mapbox.api.directions.v5.models.DirectionsRoute
  50. import com.mapbox.core.constants.Constants.PRECISION_6
  51. import com.mapbox.geojson.Feature
  52. import com.mapbox.geojson.FeatureCollection
  53. import com.mapbox.geojson.LineString
  54. import com.mapbox.geojson.Point
  55. import com.mapbox.mapboxsdk.Mapbox
  56. import com.mapbox.mapboxsdk.camera.CameraPosition
  57. import com.mapbox.mapboxsdk.camera.CameraUpdateFactory
  58. //import com.mapbox.mapboxsdk.constants.Style
  59. import com.mapbox.mapboxsdk.geometry.LatLng
  60. import com.mapbox.mapboxsdk.geometry.LatLngBounds
  61. import com.mapbox.mapboxsdk.location.LocationComponentActivationOptions
  62. import com.mapbox.mapboxsdk.location.modes.CameraMode
  63. import com.mapbox.mapboxsdk.location.modes.RenderMode
  64. import com.mapbox.mapboxsdk.maps.MapboxMap
  65. import com.mapbox.mapboxsdk.maps.Style
  66. //import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerMode
  67. //import com.mapbox.mapboxsdk.plugins.locationlayer.LocationLayerPlugin
  68. import com.mapbox.mapboxsdk.style.layers.LineLayer
  69. import com.mapbox.mapboxsdk.style.layers.Property
  70. import com.mapbox.mapboxsdk.style.layers.PropertyFactory
  71. import com.mapbox.mapboxsdk.style.layers.PropertyFactory.*
  72. import com.mapbox.mapboxsdk.style.sources.GeoJsonSource
  73. import com.mapbox.mapboxsdk.style.sources.Source
  74. import com.mapbox.services.android.navigation.ui.v5.NavigationView
  75. //import com.mapbox.services.android.location.LostLocationEngine
  76. import com.mapbox.services.android.navigation.ui.v5.route.NavigationMapRoute
  77. import com.mapbox.services.android.navigation.v5.navigation.NavigationRoute
  78. //import com.mapbox.services.api.directions.v5.models.DirectionsRoute
  79. import io.realm.Realm
  80. import kotlinx.android.synthetic.main.fragment_main_layout.*
  81. import pub.devrel.easypermissions.AfterPermissionGranted
  82. import pub.devrel.easypermissions.EasyPermissions
  83. import retrofit2.Call
  84. import retrofit2.Callback
  85. import retrofit2.Response
  86. import java.lang.Exception
  87. import kotlin.collections.ArrayList
  88.  
  89.  
  90. /**
  91.  * Created by Giorgi on 12/20/17.
  92.  */
  93. class MainFragment
  94.   : BaseMvpFragment<MainContract.View, MainContract.Presenter>(),
  95.   MainContract.View,
  96.   MapViewMarker.MarkerClickListener,
  97.   EasyPermissions.PermissionCallbacks {
  98.  
  99.   companion object {
  100.  
  101.     const val TAG = "MainFragment"
  102.  
  103.     private val PERMISSIONS = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION)
  104.     private const val LOCATION_PERMISSION_REQUEST_CODE = 1
  105.  
  106.     private const val FILTER_FRAGMENT_REQUEST_CODE = 100
  107.     private const val GENERAL_FRAGMENT_PATH_REQUEST_CODE = 101
  108.  
  109.     fun newInstance(): MainFragment {
  110.       return MainFragment()
  111.     }
  112.   }
  113.  
  114.   var diractionShow: Boolean = false
  115.   private var mapBoxMap: MapboxMap? = null
  116.  
  117.   private var locationEngine: LocationEngine? = null
  118.  
  119.   //  private var locationPlugin: LocationLayerPlugin? = null
  120.   private var originLocation: Location? = null
  121.  
  122.   private lateinit var originPosition: Point
  123.   private lateinit var destinationPosition: Point
  124.   private var navigationMapRoute: NavigationMapRoute? = null
  125.  
  126.   private var markersList: ArrayList<GetLocationsResult.Params>? = null
  127.   private var filteredLIst: ArrayList<GetLocationsResult.Params>? = null
  128.   private var filtersList: ArrayList<Any>? = null
  129.  
  130.   private var tabFragment: TabFragment? = null
  131.  
  132.   private var cameraBearingAnimator: ValueAnimator? = null
  133.  
  134.   private lateinit var realm: Realm
  135.   private lateinit var realmHelper: RealmHelper
  136.  
  137.   private var afterLanguageChangedAction: ((Unit) -> Unit)? = null
  138.  
  139.   override fun onCreate(savedInstanceState: Bundle?) {
  140.     super.onCreate(savedInstanceState)
  141.  
  142.     realm = Realm.getDefaultInstance()
  143.     realmHelper = RealmHelper(realm)
  144.  
  145.   }
  146.  
  147.   override fun onCreateView(inflater: LayoutInflater,
  148.                             container: ViewGroup?,
  149.                             savedInstanceState: Bundle?)
  150.     : View? {
  151.     return bind(inflater, R.layout.fragment_main_layout, false)
  152.   }
  153.  
  154.   override fun onViewCreated(view: View,
  155.                              savedInstanceState: Bundle?) {
  156.     super.onViewCreated(view, savedInstanceState)
  157.  
  158.     if (activity?.intent?.hasExtra(BaseActivity.EXTRA_FROM_CHANGE_LANGUAGE) == true) {
  159.       afterLanguageChangedAction = {
  160.         showMenuAfterLanguageChanged()
  161.       }
  162.     }
  163.  
  164.     mapView.onCreate(savedInstanceState)
  165.  
  166.     mapView.getMapAsync {
  167.       onMapReady(it)
  168.     }
  169.  
  170.     presenter.getCategories(realm)
  171.     presenter.getLocationItem(realm)
  172.  
  173.     burger_btn_id.setOnClickListener {
  174.       hideKeyboard()
  175.       val fr = MenuFragment.newInstance()
  176.       fragmentManager?.beginTransaction()
  177.         ?.setCustomAnimations(R.anim.slide_enter, 0, 0, R.anim.slide_exit)
  178.         ?.replace(R.id.root, fr)
  179.         ?.addToBackStack("menu")
  180.         ?.commit()
  181.     }
  182.  
  183.     ic_navigation_btn_id.setOnClickListener(object : DoubleClickListener() {
  184.  
  185.       override fun onSingleClick(v: View) {
  186.         requestLocationPermissions()
  187.       }
  188.  
  189.       override fun onDoubleClick(v: View) {
  190.         val map = mapBoxMap ?: return
  191.  
  192.         val degree = if (map.cameraPosition.bearing.toFloat() > 180) {
  193.           -(360 - map.cameraPosition.bearing.toFloat())
  194.         } else {
  195.           map.cameraPosition.bearing.toFloat()
  196.         }
  197.  
  198.         cameraBearingAnimator?.cancel()
  199.         cameraBearingAnimator = ValueAnimator.ofFloat(degree, 0.toFloat())
  200.  
  201.         val anim = requireNotNull(cameraBearingAnimator)
  202.         anim.interpolator = LinearInterpolator()
  203.         anim.duration = 300L
  204.         anim.addUpdateListener {
  205.           val bearing = it.animatedValue as Float
  206.           map.moveCamera(CameraUpdateFactory
  207.             .newCameraPosition(CameraPosition.Builder()
  208.               .target(LatLng(
  209.                 map.cameraPosition.target.latitude,
  210.                 map.cameraPosition.target.longitude))
  211.               .bearing(bearing.toDouble())
  212.               .build()))
  213.         }
  214.         anim.start()
  215.       }
  216.     })
  217.  
  218.     direction_btn_calear.setOnClickListener {
  219.       navigationMapRoute?.removeRoute()
  220.  
  221.       addMarkers()
  222.  
  223.       direction_btn_container_id.clearAnimation()
  224.       direction_btn_container_id.visibility = View.GONE
  225.       filter_container_id.clearAnimation()
  226.       filter_container_id.visibility = View.VISIBLE
  227.  
  228.       diractionShow = false
  229.     }
  230.  
  231.     direction_btn_container_id.setDebounceOnClickListener {
  232.       updateCamera()
  233.     }
  234.  
  235.     initSearchView()
  236.   }
  237.  
  238.  
  239.   override fun filterListReady(filter: List<GetLocationsResult.Params>) {
  240.     filteredLIst = ArrayList(filter)
  241.     addMarkers()
  242.   }
  243.  
  244.   private fun initSearchView() {
  245.  
  246.     main_search_id.addTextChangedListener(object : TextWatcher {
  247.  
  248.       override fun afterTextChanged(s: Editable?) {
  249.       }
  250.  
  251.       override fun beforeTextChanged(s: CharSequence?,
  252.                                      start: Int,
  253.                                      count: Int,
  254.                                      after: Int) {
  255.       }
  256.  
  257.       override fun onTextChanged(s: CharSequence?,
  258.                                  start: Int,
  259.                                  before: Int,
  260.                                  count: Int) {
  261.         if (count == 0) {
  262.           presenter.searchMarkers("", markersList)
  263.           search_cancel_btn.visibility = View.INVISIBLE
  264.         } else {
  265.           search_cancel_btn.visibility = View.VISIBLE
  266.         }
  267.       }
  268.     })
  269.  
  270.     search_cancel_btn.setOnClickListener {
  271.       main_search_id.text = null
  272.       presenter.searchMarkers("", markersList)
  273.       it.visibility = View.INVISIBLE
  274.     }
  275.  
  276.     main_search_id.setOnEditorActionListener { v, actionId, _ ->
  277.       if (actionId == EditorInfo.IME_ACTION_SEARCH) {
  278.         val term = v.text.toString()
  279.         if (!term.isEmpty()) {
  280.           realmHelper.saveSearchedString(v.text.toString(),
  281.             object : RealmHelper.UpdateSuggestedSearchListener {
  282.               override fun update() {
  283.                 activity?.runOnUiThread {
  284.                   createSearchAdapter()
  285.                 }
  286.               }
  287.             })
  288.         }
  289.         presenter.searchMarkers(v.text, markersList)
  290.         createSearchAdapter()
  291.         hideKeyboard()
  292.       }
  293.       return@setOnEditorActionListener true
  294.     }
  295.  
  296.     createSearchAdapter()
  297.   }
  298.  
  299.   private fun createSearchAdapter() {
  300.     val list = realmHelper.readSearchedString()
  301.     val adapter = SearchAdapter(requireNotNull(context), list, R.layout.search_adapter_item,
  302.       true)
  303.     if (list.isNullOrEmpty()) {
  304.       main_search_id.setAdapter(null)
  305.     } else {
  306.       main_search_id.setAdapter(adapter)
  307.     }
  308.     main_search_id.threshold = 0
  309.   }
  310.  
  311.   private fun removeSearchAdapter() {
  312.     main_search_id.setAdapter(null)
  313.   }
  314.  
  315.   override fun filteredList(filteredLIst: ArrayList<GetLocationsResult.Params>) {
  316.     this.filteredLIst = filteredLIst
  317.     addMarkers()
  318.     tabFragment?.setFilteredList(filteredLIst)
  319.   }
  320.  
  321.   @SuppressLint("MissingPermission")
  322.   private fun requestLocation() {
  323.     if (hasPermission()) {
  324.       initLocationEngine()
  325.       initializeLocationPlugin()
  326.     } else {
  327.       requestLocationPermissions()
  328.     }
  329.   }
  330.  
  331.  
  332.   override fun onMarkerClickListener(idMarker: String) {
  333.     val transaction = fragmentManager?.beginTransaction()
  334.  
  335.     markersList?.let {
  336.       val category = filtersList?.find { it is GetCategoriesResult } as GetCategoriesResult
  337.       val fragment = GeneralDescriptionFragment.newInstance(idMarker, it, category)
  338.       fragment.setTargetFragment(this, GENERAL_FRAGMENT_PATH_REQUEST_CODE)
  339.       transaction?.replace(R.id.tab_fragment_container_id,
  340.         fragment, "tag")?.addToBackStack("stack")?.commit()
  341.       hideBtbAnimation()
  342.       hideKeyboard()
  343.     }
  344.   }
  345.  
  346.   private fun hideBtbAnimation() {
  347.     val alphaAnimation = AlphaAnimation(1f, 0f)
  348.     alphaAnimation.duration = 220
  349.     alphaAnimation.fillAfter = true
  350.     ic_navigation_btn_id.startAnimation(alphaAnimation)
  351.     menu_buton_id.startAnimation(alphaAnimation)
  352.     menu_buton_id.visibility = View.GONE
  353.     filter_container_id.startAnimation(alphaAnimation)
  354.     if (direction_btn_container_id.visibility == View.VISIBLE) {
  355.       direction_btn_container_id.clearAnimation()
  356.       direction_btn_container_id.startAnimation(alphaAnimation)
  357.     }
  358.   }
  359.  
  360.  
  361.   fun showBtbAnimation() {
  362.     val alphaAnimation = AlphaAnimation(0f, 1f)
  363.     alphaAnimation.interpolator = AccelerateInterpolator()
  364.     alphaAnimation.duration = 250
  365.     alphaAnimation.fillAfter = true
  366.     ic_navigation_btn_id.startAnimation(alphaAnimation)
  367.     menu_buton_id.startAnimation(alphaAnimation)
  368.     menu_buton_id.visibility = View.VISIBLE
  369.     filter_container_id.startAnimation(alphaAnimation)
  370.     if (direction_btn_container_id.visibility == View.VISIBLE) {
  371.       direction_btn_container_id.clearAnimation()
  372.       direction_btn_container_id.startAnimation(alphaAnimation)
  373.     }
  374.   }
  375.  
  376.   fun showDirection() {
  377.     if (diractionShow) {
  378.       direction_btn_container_id.clearAnimation()
  379.       direction_btn_container_id.visibility = View.VISIBLE
  380.       filter_container_id.clearAnimation()
  381.       filter_container_id.visibility = View.GONE
  382.     }
  383.   }
  384.  
  385.   override fun loadDataFromBase(params: ArrayList<GetLocationsResult.Params>) {
  386.     this.markersList = params
  387.     addMarkers()
  388.  
  389.     menu_buton_id.setDebounceOnClickListener {
  390.       tabFragment = TabFragment.newInstance(markersList!!)
  391.       val transaction = fragmentManager?.beginTransaction()
  392.       transaction?.setCustomAnimations(R.anim.slide_enter, 0, 0, R.anim.slide_exit)
  393.       transaction?.add(R.id.tab_fragment_container_id, tabFragment!!)?.addToBackStack(null)?.commit()
  394.       hideKeyboard()
  395.       direction_btn_container_id.clearAnimation()
  396.       direction_btn_container_id.visibility = View.GONE
  397.       filter_container_id.clearAnimation()
  398.       filter_container_id.visibility = View.VISIBLE
  399.     }
  400.   }
  401.  
  402.   private fun addMarkers(wayPointFor: GetLocationsResult.Params? = null) {
  403.     val list = filteredLIst?.toList() ?: markersList?.toList() ?: return
  404.     mapBoxMap?.let { map ->
  405.       map.clear()
  406.       MapViewMarker(requireNotNull(context),
  407.         map,
  408.         list,
  409.         wayPointFor,
  410.         this)
  411.     }
  412.   }
  413.  
  414.   @SuppressLint("ResourceType")
  415.   override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
  416.     super.onActivityResult(requestCode, resultCode, data)
  417. //        filter_container_id.isClickable = true
  418.     if (resultCode == Activity.RESULT_OK) {
  419.       if (requestCode == FILTER_FRAGMENT_REQUEST_CODE) {
  420.         changeFilter()
  421. //                filter_container_id.isClickable = true
  422.       }
  423.       if (requestCode == GENERAL_FRAGMENT_PATH_REQUEST_CODE) {
  424.         data?.let {
  425.           if (checkLocationSwich()) {
  426.             mapBoxMap?.style?.let {
  427.               val coords = data.extras?.getSerializable("line") as GetLocationsResult.Params
  428.               val points = coords.coordinates?.coordinatesList?.map {
  429.                 if (it.latitude != null && it.longitude != null) {
  430.                   Point.fromLngLat(it.latitude!!.toDouble(), it.longitude!!.toDouble())
  431.                 } else
  432.                   Point.fromLngLat(40.000, 40.100)
  433.               }
  434. //              addCoordinatesSource(it, points!!)
  435.             }
  436.             drawPath(it.extras?.getSerializable("line") as GetLocationsResult.Params)
  437.           } else Toast.makeText(context, resources.getString(R.string.location_warning_text), Toast.LENGTH_SHORT).show()
  438.         }
  439.       }
  440.     }
  441.     if (resultCode == Activity.RESULT_CANCELED) {
  442.       filter_container_id.background = ContextCompat.getDrawable(context!!, R.drawable.non_selected_filter_btn_background)
  443.     }
  444.   }
  445.  
  446.   private fun checkLocationSwich(): Boolean {
  447.     val locationMode: Int
  448.     val locationProviders: String
  449.  
  450.     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
  451.       try {
  452.         locationMode = Settings.Secure.getInt(context?.contentResolver, Settings.Secure.LOCATION_MODE)
  453.  
  454.       } catch (e: Settings.SettingNotFoundException) {
  455.         e.printStackTrace()
  456.         return false
  457.       }
  458.       return locationMode != Settings.Secure.LOCATION_MODE_OFF
  459.     } else {
  460.       locationProviders = Settings.Secure.getString(context?.contentResolver, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)
  461.       return !TextUtils.isEmpty(locationProviders)
  462.     }
  463.  
  464.   }
  465.  
  466.   private fun changeFilter() {
  467.     filter_container_id.background = ContextCompat.getDrawable(context!!, R.drawable.filter_bachgraund)
  468.     filter_clear_btn.visibility = View.VISIBLE
  469.     filter_clear_btn.setOnClickListener {
  470.       filter_container_id.background = ContextCompat.getDrawable(context!!, R.drawable.non_selected_filter_btn_background)
  471.       filter_clear_btn.visibility = View.GONE
  472.       FilterHelper.resetFilter()
  473.  
  474.       filteredLIst = null
  475.       addMarkers()
  476.       tabFragment?.setFilteredList(markersList!!)
  477.     }
  478.     presenter.filterMarkers(markersList)
  479.  
  480.   }
  481.  
  482.  
  483.   private fun showDirectionBtn() {
  484.     diractionShow = true
  485.     direction_btn_container_id.clearAnimation()
  486.     direction_btn_container_id.visibility = View.VISIBLE
  487.     filter_container_id.clearAnimation()
  488.     filter_container_id.visibility = View.GONE
  489.   }
  490.  
  491.   private fun hasPermission(): Boolean = EasyPermissions.hasPermissions(
  492.     requireNotNull(context), *PERMISSIONS)
  493.  
  494.   private fun drawPath(params: GetLocationsResult.Params) {
  495.     if (hasPermission()) {
  496.       if (params.coordinates?.coordinatesList?.isNotEmpty() == true) {
  497.         if (params.coordinates?.coordinatesList?.get(0)?.latitude != null &&
  498.           params.coordinates?.coordinatesList?.get(0)?.longitude != null)
  499.           destinationPosition = Point.fromLngLat(params.coordinates?.coordinatesList?.get(0)?.longitude?.toDouble()!!,
  500.             params.coordinates?.coordinatesList?.get(0)?.latitude?.toDouble()!!)
  501.       }
  502.       originLocation?.let {
  503.         originPosition = Point.fromLngLat(it.longitude, it.latitude)
  504.         getRoute(originPosition, destinationPosition, params)
  505.       }
  506.     } else requestLocationPermissions()
  507.   }
  508.  
  509.  
  510.   private fun getRoute(origin: Point,
  511.                        destination: Point,
  512.                        params: GetLocationsResult.Params) {
  513.     addMarkers(params)
  514.  
  515.     NavigationRoute.builder(context)
  516.       .profile(DirectionsCriteria.PROFILE_WALKING)
  517.       .accessToken(Mapbox.getAccessToken()!!)
  518.       .origin(origin)
  519.       .destination(destination)
  520.       .also { builder ->
  521.         val pints = ArrayList<Point>()
  522.         params.coordinates?.coordinatesList
  523.           ?.filter {
  524.             it.longitude != null && it.latitude != null
  525.           }?.onEach {
  526.             println("---> | ${it.longitude} ${it.latitude}")
  527.             pints.add(Point.fromLngLat(
  528.               requireNotNull(it.longitude).toDouble(),
  529.               requireNotNull(it.latitude).toDouble()))
  530.  
  531. //            builder.addWaypoint(Point.fromLngLat(
  532. //              requireNotNull(it.longitude).toDouble(),
  533. //              requireNotNull(it.latitude).toDouble()))
  534.           }
  535.         addCoordinates(pints)
  536.       }
  537.       .build().getRoute(object : Callback<DirectionsResponse> {
  538.         override fun onResponse(call: Call<DirectionsResponse>, response: Response<DirectionsResponse>) {
  539.           val res = response.body()
  540.  
  541.           res?.routes()?.forEach {
  542.             println("---> ${it.routeOptions()?.coordinates()}")
  543.           }
  544.           mapBoxMap?.style?.let { s ->
  545.             res?.routes()?.let {
  546. //              addCoordinates(res.routes()[0])
  547.             }
  548.           }
  549.           if (res == null) {
  550.             Log.e(TAG, "No routes found, make sure you set the right user and access token.")
  551.             return
  552.           } else if (response.body()!!.routes().size < 1) {
  553.             Log.e(TAG, "No routes found")
  554.             return
  555.           }
  556.  
  557.           val currentRoute = response.body()?.routes()?.get(0)
  558.  
  559.           // Draw the route on the map
  560.           if (navigationMapRoute != null) {
  561.             navigationMapRoute!!.removeRoute()
  562.           } else {
  563.             navigationMapRoute = NavigationMapRoute(null, mapView, mapBoxMap!!, R.style.NavigationMapRoute)
  564.           }
  565.           navigationMapRoute!!.addRoute(currentRoute)
  566.  
  567.           updateCamera()
  568.           showDirectionBtn()
  569.         }
  570.  
  571.         override fun onFailure(call: Call<DirectionsResponse>, throwable: Throwable) {
  572.           Log.e(TAG, "Error: " + throwable.message)
  573.         }
  574.       })
  575.   }
  576.  
  577.   private lateinit var dashedLineDirectionsFeatureCollection: FeatureCollection
  578.  
  579.   fun addCoordinates(route: DirectionsRoute){
  580.     val directionsRouteFeatureList =  ArrayList<Feature>()
  581.     val lineString = LineString.fromPolyline(route.geometry()!!, PRECISION_6)
  582.     val coords = lineString.coordinates()
  583.     directionsRouteFeatureList.add(Feature.fromGeometry(LineString.fromLngLats(coords)))
  584.     dashedLineDirectionsFeatureCollection = FeatureCollection.fromFeatures(directionsRouteFeatureList)
  585.     val source:GeoJsonSource? = mapBoxMap?.style?.getSourceAs("line-source1")
  586.     source?.setGeoJson(dashedLineDirectionsFeatureCollection)
  587.   }
  588.  
  589.   private fun addCoordinates(route: List<Point>){
  590.     val directionsRouteFeatureList =  ArrayList<Feature>()
  591.     val lineString = LineString.fromLngLats(route)
  592.     val coords = lineString.coordinates()
  593.     directionsRouteFeatureList.add(Feature.fromGeometry(LineString.fromLngLats(coords)))
  594.     dashedLineDirectionsFeatureCollection = FeatureCollection.fromFeatures(directionsRouteFeatureList)
  595.     val source:GeoJsonSource? = mapBoxMap?.style?.getSourceAs("line-source1")
  596.     source?.setGeoJson(dashedLineDirectionsFeatureCollection)
  597.   }
  598.  
  599.  
  600.   private fun addCoordinatesSource(style: Style) {
  601.     dashedLineDirectionsFeatureCollection = FeatureCollection.fromFeatures(emptyArray<Feature>())
  602.     style.addSource(GeoJsonSource("line-source1", dashedLineDirectionsFeatureCollection))
  603.     addLayer(style)
  604.   }
  605.  
  606.   private fun addLayer(style: Style) {
  607.     // The layer properties for our line. This is where we make the line dotted, set the
  608.     // color, etc.
  609.     style.addLayer(LineLayer("dashedlayer", "line-source1").withProperties(
  610.       lineDasharray(arrayOf(0.01f, 2f)),
  611.       lineCap(Property.LINE_CAP_ROUND),
  612.       lineJoin(Property.LINE_JOIN_ROUND),
  613.       lineWidth(5f),
  614.       lineColor(Color.parseColor("#e55e5e"))
  615.     ))
  616.   }
  617.  
  618.   fun drawDashedLineRoute(style: Style) {
  619.     style.addLayer(LineLayer("linelayer", "line-source1").withProperties(
  620.       lineCap(Property.LINE_CAP_ROUND),
  621.       lineJoin(Property.LINE_JOIN_ROUND),
  622.       lineWidth(2f),
  623.       lineColor(Color.parseColor("#e44e4e"))
  624.     ))
  625.   }
  626.  
  627.  
  628.  
  629.  
  630.   fun initDottedLineSourceAndLayer(loadedMapStyle: Style) {
  631. //    dashedLineDirectionsFeatureCollection = FeatureCollection.fromFeatures(arrayOf<Feature>());
  632. //    loadedMapStyle.addSource( GeoJsonSource ("SOURCE_ID", dashedLineDirectionsFeatureCollection));
  633.  
  634.  
  635.     loadedMapStyle.addLayerBelow(
  636.       LineLayer(
  637.         "DIRECTIONS_LAYER_ID", "SOURCE_ID").withProperties(
  638.         lineWidth(4.5f),
  639.         lineColor(Color.BLACK),
  640.         lineTranslate(arrayOf(0f, 4f)),
  641.         lineDasharray(arrayOf(1.2f, 1.2f))
  642.       ), "road-label-small")
  643.   }
  644.  
  645.   private fun drawNavigationPolylineRoute(route: DirectionsRoute) {
  646.     if (mapBoxMap != null) {
  647.       mapBoxMap?.getStyle { style ->
  648.         val directionsRouteFeatureList = ArrayList<Feature>()
  649.         val lineString = LineString.fromPolyline(route.geometry()!!, PRECISION_6)
  650.         val coordinates = lineString.coordinates()
  651.         coordinates.forEach {
  652.           directionsRouteFeatureList.add(Feature.fromGeometry(LineString.fromLngLats(coordinates)))
  653.         }
  654. //        dashedLineDirectionsFeatureCollection = FeatureCollection.fromFeatures(directionsRouteFeatureList);
  655. //        style.getSourceAs<GeoJsonSource>("SOURCE_ID")?.setGeoJson(dashedLineDirectionsFeatureCollection)
  656.       }
  657.     }
  658.   }
  659.  
  660.   @SuppressLint("MissingPermission")
  661.   @AfterPermissionGranted(LOCATION_PERMISSION_REQUEST_CODE)
  662.   private fun requestLocationPermissions() {
  663.     if (hasPermission()) {
  664.       requestLocation()
  665.       originLocation?.let { setCameraPosition(it) }
  666.     } else {
  667.       EasyPermissions.requestPermissions(this,
  668.         getString(R.string.offline_map),
  669.         LOCATION_PERMISSION_REQUEST_CODE, *PERMISSIONS)
  670.     }
  671.   }
  672.  
  673.  
  674.   override fun onPermissionsDenied(requestCode: Int,
  675.                                    perms: MutableList<String>) {
  676.   }
  677.  
  678.   @SuppressLint("MissingPermission")
  679.   override fun onPermissionsGranted(requestCode: Int,
  680.                                     perms: MutableList<String>) {
  681.     requestLocation()
  682.   }
  683.  
  684.   override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
  685.     super.onRequestPermissionsResult(requestCode, permissions, grantResults)
  686.     EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this)
  687.   }
  688.  
  689.   @SuppressLint("MissingPermission")
  690.   private fun initLocationEngine() {
  691.     locationEngine = LocationEngineProvider.getBestLocationEngine(context!!)
  692.  
  693.     val request = LocationEngineRequest.Builder(1000)
  694.       .setPriority(LocationEngineRequest.PRIORITY_HIGH_ACCURACY)
  695.       .setMaxWaitTime(10000).build()
  696.  
  697.     locationEngine?.requestLocationUpdates(request, locListenerEngine, getMainLooper())
  698.     locationEngine?.getLastLocation(locListenerEngine)
  699.   }
  700.  
  701.   private val locListenerEngine = object : LocationEngineCallback<LocationEngineResult> {
  702.     override fun onSuccess(result: LocationEngineResult?) {
  703.       originLocation = result?.lastLocation
  704.       println("location->>> ${result?.lastLocation}")
  705.     }
  706.  
  707.     override fun onFailure(exception: Exception) {
  708.       exception.printStackTrace()
  709.     }
  710.  
  711.   }
  712.  
  713.   private fun initializeLocationPlugin() {
  714. //    var lp = locationPlugin
  715. //    if (lp == null) {
  716. //      lp = LocationLayerPlugin(mapView, mapBoxMap!!, locationEngine)
  717. //      lp.setLocationLayerEnabled(LocationLayerMode.TRACKING)
  718. //      locationPlugin = lp
  719. //    }
  720.   }
  721.  
  722. //  override fun onLocationChanged(location: Location?) {
  723. //    if (location != null) {
  724. //      originLocation = location
  725. //      locationEngine?.removeLocationEngineListener(this)
  726. //    }
  727. //  }
  728.  
  729.  
  730. //  @SuppressLint("MissingPermission")
  731. //  override fun onConnected() {
  732. //    locationEngine?.requestLocationUpdates()
  733. //  }
  734.  
  735.   private fun showMenuAfterLanguageChanged() {
  736.     val fr = MenuFragment.newInstance()
  737.     fragmentManager?.beginTransaction()
  738.       ?.setCustomAnimations(0, 0, 0, R.anim.slide_exit)
  739.       ?.replace(R.id.root, fr)
  740.       ?.addToBackStack("menu")
  741.       ?.commit()
  742.   }
  743.  
  744.   private fun setCameraPosition(location: Location) {
  745.     mapBoxMap?.animateCamera(CameraUpdateFactory.newLatLngZoom(
  746.       LatLng(location.latitude, location.longitude), 13.0))
  747.   }
  748.  
  749.   private fun updateCamera() {
  750.     originLocation?.let {
  751.  
  752.       val latLngBounds = LatLngBounds.Builder()
  753.         .include(LatLng(
  754.           destinationPosition.latitude(),
  755.           destinationPosition.longitude()))
  756.         .include(LatLng(
  757.           it.latitude,
  758.           it.longitude))
  759.         .build()
  760.  
  761.       val padding = requireNotNull(context).resources.getDimension(
  762.         R.dimen.map_camera_bounds_padding).toInt()
  763.       mapBoxMap?.animateCamera(
  764.         CameraUpdateFactory.newLatLngBounds(latLngBounds,
  765.           padding,
  766.           padding,
  767.           padding,
  768.           padding), 1000, null)
  769.     }
  770.   }
  771.  
  772.   private fun onMapReady(map: MapboxMap) {
  773.     mapBoxMap = map
  774.     mapBoxMap?.setStyle(Style.MAPBOX_STREETS) {
  775.       enableLocationComponent()
  776.       initLocationEngine()
  777.       addCoordinatesSource(it)
  778.     }
  779.     mapBoxMap?.addOnMapClickListener {
  780.       view?.requestFocus()
  781.       hideKeyboard()
  782.       return@addOnMapClickListener true
  783.     }
  784.     addMarkers()
  785.     requestLocation()
  786.   }
  787.  
  788.   @SuppressWarnings("MissingPermission")
  789.   private fun enableLocationComponent() {
  790.  
  791.     // Check if permissions are enabled and if not request
  792.     if (PermissionsManager.areLocationPermissionsGranted(context)) {
  793.  
  794.       // Get an instance of the component
  795.       val locationComponent = mapBoxMap?.locationComponent
  796.  
  797.       // Activate with a built LocationComponentActivationOptions object
  798.       locationComponent?.activateLocationComponent(LocationComponentActivationOptions.builder(context!!, mapBoxMap?.style!!).build())
  799.  
  800.       // Enable to make component visible
  801.       locationComponent?.isLocationComponentEnabled = true
  802.  
  803.       // Set the component's camera mode
  804.       locationComponent?.cameraMode = CameraMode.TRACKING
  805.  
  806.       // Set the component's render mode
  807.       locationComponent?.renderMode = RenderMode.COMPASS
  808.  
  809.  
  810.     } else {
  811.  
  812. //         permissionsManager = PermissionsManager(this)
  813.  
  814. //         permissionsManager?.requestLocationPermissions(this)
  815.  
  816.     }
  817.   }
  818.  
  819.   override fun onLocationItemLoaded(params: ArrayList<GetLocationsResult.Params>) {
  820.     this.markersList = params
  821. //        RealmHelper(realm).saveLocations(params)
  822.     addMarkers()
  823.  
  824.     menu_buton_id.setDebounceOnClickListener {
  825.       tabFragment = TabFragment.newInstance(markersList!!)
  826.       val transaction = fragmentManager?.beginTransaction()
  827.       transaction?.setCustomAnimations(R.anim.slide_enter, 0, R.anim.slide_enter, R.anim.slide_exit)
  828.       transaction?.add(R.id.tab_fragment_container_id, tabFragment!!)?.addToBackStack(null)?.commit()
  829.       hideKeyboard()
  830.       direction_btn_container_id.clearAnimation()
  831.       direction_btn_container_id.visibility = View.GONE
  832.       filter_container_id.clearAnimation()
  833.       filter_container_id.visibility = View.VISIBLE
  834.     }
  835.   }
  836.  
  837.  
  838.   override fun onCategoriesLoad(body: ArrayList<Any>) {
  839.     filtersList = body
  840.     filter_container_id.setDebounceOnClickListener {
  841.       val transaction = fragmentManager?.beginTransaction()
  842.       transaction?.setCustomAnimations(R.anim.slide_up, 0, 0, R.anim.slide_down)
  843.       val fragment = FilterFragment.newInstance(body)
  844.       fragment.setTargetFragment(this@MainFragment, FILTER_FRAGMENT_REQUEST_CODE)
  845.       transaction?.replace(R.id.root, fragment)?.addToBackStack(FilterFragment.newInstance(body).tag)?.commit()
  846.       hideKeyboard()
  847.     }
  848.   }
  849.  
  850.   override val presenter: MainContract.Presenter = MainPresenterImpl()
  851.  
  852.   @SuppressLint("MissingPermission")
  853.   override fun onStart() {
  854.     super.onStart()
  855. //    locationEngine?.requestLocationUpdates()
  856. //    locationPlugin?.onStart()
  857.     mapView.onStart()
  858.   }
  859.  
  860.   override fun onResume() {
  861.     super.onResume()
  862.     mapView.onResume()
  863.  
  864.     val action = afterLanguageChangedAction
  865.     afterLanguageChangedAction = null
  866.     action?.invoke(Unit)
  867.   }
  868.  
  869.   override fun onPause() {
  870.     super.onPause()
  871.     mapView.onPause()
  872.   }
  873.  
  874.   override fun onStop() {
  875.     super.onStop()
  876. //    locationEngine?.removeLocationUpdates()
  877. //    locationPlugin?.onStop()
  878.     mapView.onStop()
  879.   }
  880.  
  881.   override fun onLowMemory() {
  882.     super.onLowMemory()
  883.     mapView.onLowMemory()
  884.   }
  885.  
  886.   override fun onDestroy() {
  887.     super.onDestroy()
  888. //    locationEngine?.deactivate()
  889.     realm.close()
  890.   }
  891.  
  892.   override fun onDestroyView() {
  893.     mapView?.onDestroy()
  894.     super.onDestroyView()
  895.  
  896.   }
  897.  
  898.   override fun onSaveInstanceState(outState: Bundle) {
  899.     super.onSaveInstanceState(outState)
  900.     mapView.onSaveInstanceState(outState)
  901.   }
  902.  
  903.  
  904. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement