Advertisement
Guest User

Untitled

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