Vassa007

AreaDetail

Jun 3rd, 2024 (edited)
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 14.86 KB | None | 0 0
  1. package id.agrimart.agriino.activity.area
  2.  
  3. import android.app.Activity
  4. import android.content.Intent
  5. import android.content.pm.PackageManager
  6. import android.graphics.Color
  7. import android.location.Location
  8. import android.net.Uri
  9. import android.os.Bundle
  10. import android.util.Log
  11. import android.view.LayoutInflater
  12. import android.view.View
  13. import android.view.ViewGroup
  14. import android.widget.Toast
  15. import androidx.appcompat.app.AppCompatActivity
  16. import androidx.core.app.ActivityCompat
  17. import androidx.core.content.ContextCompat
  18. import androidx.navigation.findNavController
  19. import androidx.navigation.fragment.findNavController
  20. import com.google.android.gms.location.FusedLocationProviderClient
  21. import com.google.android.gms.location.LocationServices
  22. import com.google.android.gms.maps.CameraUpdateFactory
  23. import com.google.android.gms.maps.GoogleMap
  24. import com.google.android.gms.maps.MapView
  25. import com.google.android.gms.maps.OnMapReadyCallback
  26. import com.google.android.gms.maps.model.LatLng
  27. import com.google.android.gms.maps.model.Marker
  28. import com.google.android.gms.maps.model.MarkerOptions
  29. import com.google.android.gms.maps.model.Polygon
  30. import com.google.android.gms.maps.model.PolygonOptions
  31. import com.google.maps.android.data.kml.KmlLayer
  32. import id.agrimart.agriino.R
  33. import id.agrimart.agriino.base.BaseFragment
  34. import id.agrimart.agriino.config.connection.Resource
  35. import id.agrimart.agriino.config.endpoint.AreaEndpont
  36. import id.agrimart.agriino.config.util.Dialog
  37. import id.agrimart.agriino.databinding.FragmentAreaDetailBinding
  38. import kotlinx.coroutines.flow.first
  39. import kotlinx.coroutines.runBlocking
  40. import org.json.JSONArray
  41. import org.json.JSONObject
  42. import java.io.InputStream
  43.  
  44. class AreaDetail : BaseFragment<AreaDetailViewModel, FragmentAreaDetailBinding, AreaDetailRepo>(),
  45.     OnMapReadyCallback {
  46.  
  47.     private lateinit var fusedLocationClient: FusedLocationProviderClient
  48.     private lateinit var mapViews: MapView
  49.     private var currentLocation: LatLng? = null
  50.     private lateinit var googleMap: GoogleMap
  51.  
  52.     private var polygon: Polygon? = null
  53.     private var listLatLang = mutableListOf<LatLng>()
  54.     private var listMarker = mutableListOf<Marker>()
  55.     private var closedListLatLang = mutableListOf<LatLng>()
  56.     private var latitude = 0.0
  57.     private var longitude = 0.0
  58.  
  59.     private var marker: Marker? = null
  60.  
  61.     private val red = 0
  62.     private val green = 0
  63.     private val blue = 0
  64.     override fun onActivityCreated(savedInstanceState: Bundle?) {
  65.         super.onActivityCreated(savedInstanceState)
  66.         with(binding) {
  67.             (activity as AppCompatActivity).setSupportActionBar(topAppBar)
  68.             topAppBar.apply {
  69.                 navigationIcon = ContextCompat.getDrawable(context, R.drawable.baseline_arrow_back_24)
  70.                 setNavigationOnClickListener {
  71.                     findNavController().popBackStack()
  72.                 }
  73.             }
  74.  
  75.             Log.e(TAG, "SAPI >> : ${arguments?.getString("status")}", )
  76.  
  77.             //mapview
  78.             mapViews = mapView
  79.             mapView.onCreate(savedInstanceState)
  80.             mapView.getMapAsync(this@AreaDetail)
  81.  
  82.             fusedLocationClient = LocationServices.getFusedLocationProviderClient(requireActivity())
  83.  
  84.             if (ActivityCompat.checkSelfPermission(requireContext(),
  85.                     android.Manifest.permission.ACCESS_FINE_LOCATION) !=
  86.                 PackageManager.PERMISSION_GRANTED) {
  87.                 ActivityCompat.requestPermissions(requireActivity(),
  88.                     arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION), 1)
  89.             } else {
  90.                 getLastLocation()
  91.             }
  92.         }
  93.     }
  94.  
  95.     override fun onMapReady(map: GoogleMap) {
  96.         googleMap = map
  97.  
  98.  
  99.  
  100.         when (arguments?.getString("status")) {
  101.             "B" -> { //new
  102.                 Toast.makeText(context, "BARU", Toast.LENGTH_SHORT).show()
  103.                 currentLocation?.let { it ->
  104.                 val markerOptions = MarkerOptions()
  105.                     .position(it)
  106.                     .title("You in here")
  107.  
  108.                 googleMap.uiSettings.isZoomControlsEnabled = true
  109.  
  110.                 googleMap.addMarker(markerOptions)
  111.                 googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(it, 18.5f))
  112.  
  113.                 latitude = it.latitude
  114.                 longitude = it.longitude
  115.  
  116.                 binding.apply {
  117.                     fbUploadKml.visibility = View.INVISIBLE
  118.                     googleMap.setOnMapClickListener {
  119.                         fabClearPoint.visibility = View.VISIBLE
  120.                         val markerOpts = MarkerOptions().position(it)
  121.                         marker = googleMap.addMarker(markerOpts)
  122.                         listLatLang.add(it)
  123.                         marker?.let { mk -> listMarker.add(mk) }
  124.                     }
  125.  
  126.                     // my location
  127.                     fbMylocation.setOnClickListener{
  128.                         googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(LatLng(latitude, longitude), 18.5f))
  129.                     }
  130.  
  131.                     // gambar line
  132.                     fbDraw.setOnClickListener {
  133.                         try {
  134.                             if (listLatLang.isNotEmpty()) {
  135.                                 closedListLatLang = ArrayList(listLatLang)
  136.                                 closedListLatLang.add(listLatLang[0])
  137.  
  138.                                 polygon?.remove()
  139.                                 val polygonOpts: PolygonOptions = PolygonOptions().addAll(listLatLang).clickable(true)
  140.                                 polygon = googleMap.addPolygon(polygonOpts)
  141.                                 polygon!!.strokeColor = Color.rgb(red, green, blue)
  142.                                 polygon!!.fillColor = Color.BLUE
  143.  
  144.                             } else {
  145.                                 Toast.makeText(requireContext(), "Maaf gambar dulu", Toast.LENGTH_SHORT).show()
  146.                             }
  147.                         } catch (e: Exception) {
  148.                             e.printStackTrace()
  149.                         }
  150.                     }
  151.  
  152.                     // hapus semua line
  153.                     fabClearPoint.setOnClickListener {
  154.                         for (marker in listMarker) {
  155.                             marker.remove()
  156.                         }
  157.                         listMarker.clear()
  158.  
  159.                         polygon?.remove()
  160.                         listLatLang.clear()
  161.                         fabClearPoint.visibility = View.INVISIBLE
  162.                     }
  163.  
  164.                     btnSimpanBoundary.setOnClickListener {
  165.                         getSupportTypeFarm()
  166.                     }
  167.                 }
  168.             }
  169.             }
  170.             "I" -> { // import KML
  171.                 Toast.makeText(context, "IMPORT", Toast.LENGTH_SHORT).show()
  172.                 // rt
  173.                 binding.apply {
  174.                     fbUploadKml.visibility = View.VISIBLE
  175.                     fbUploadKml.setOnClickListener {
  176.                         val intent = Intent(Intent.ACTION_GET_CONTENT)
  177.                         intent.type = "*/*"
  178.                         startActivityForResult(intent, KML_FILE_REQUEST_CODE)
  179.                     }
  180.                 }
  181.             }
  182.         }
  183.  
  184.  
  185.     }
  186.  
  187.     private fun formatLatLngList(list: List<LatLng>): String {
  188.         return list.joinToString(", ") { latLng ->
  189.             "${latLng.longitude} ${latLng.latitude}"
  190.         }
  191.     }
  192.  
  193.     fun getCountry() {
  194.         viewModel.getCountry()
  195.         viewModel.countryResponse.observe(viewLifecycleOwner) {
  196.             when(it) {
  197.                 is Resource.Loading -> {}
  198.                 is Resource.Success -> {
  199.                     val response = it.value
  200.  
  201. //                    val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_list_item_1, response.streams)
  202. //                    binding.atCountry.adapter = adapter
  203.  
  204.                 }
  205.                 is Resource.Failure -> {
  206.                     val responseBody = it.errorBody
  207.                     val jsonErr = JSONObject(responseBody!!.string())
  208.                     val msgErr = jsonErr.getString("message")
  209.  
  210.                     context?.let {
  211.                         Dialog(it).setDialog("Oops!!", msgErr)
  212.                             .setPositiveButton("OKE") { dialog, which ->
  213.                                 dialog.dismiss()
  214.                             }.show()
  215.                     }
  216.                 }
  217.             }
  218.         }
  219.     }
  220.  
  221.     fun getSupportTypeFarm() {
  222.         viewModel.getSupportTypeFarm()
  223.         viewModel.supportTypeFarmResponse.observe(viewLifecycleOwner) {
  224.             when(it) {
  225.                 is Resource.Loading -> {}
  226.                 is Resource.Success -> {
  227.                     val response = it.value
  228.                     val jsonArray = JSONArray(response.streams.toString())
  229.                     for (i in 0 until jsonArray.length()) {
  230.                         val jsonObject = jsonArray.getJSONObject(i)
  231.  
  232.                         if (jsonObject.getString("farm_type_code") == "1") {
  233.                             val paramInsert = InsertAreaBoundary(
  234.                                 farm_id = arguments?.getString("farm_id")!!,
  235.                                 farm_boundary = arguments?.getString("farm_desc")!!,
  236.                                 country_code = "ID",
  237.                                 farm_type_code = "0${jsonObject.getString("farm_type_code")}",
  238.                                 shape = "POLYGON ((${formatLatLngList(closedListLatLang)}))"
  239.                             )
  240.  
  241.                             insertBoundaryArea(paramInsert)
  242.                         }
  243.                     }
  244.                 }
  245.  
  246.                 is Resource.Failure -> {
  247.                     val responseBody = it.errorBody
  248.                     val jsonErr = JSONObject(responseBody!!.string())
  249.                     val msgErr = jsonErr.getString("message")
  250.  
  251.                     context?.let {
  252.                         Dialog(it).setDialog("Oops!!", msgErr).show()
  253.                     }
  254.                 }
  255.             }
  256.         }
  257.     }
  258.  
  259.     private fun insertBoundaryArea(paramInsert: InsertAreaBoundary) {
  260.         viewModel.insertBoundaryFarm(paramInsert)
  261.         viewModel.insertAreaBoundary.observe(viewLifecycleOwner) {
  262.             when(it) {
  263.                 is Resource.Loading -> {}
  264.                 is Resource.Success -> {
  265.                     val response = it.value
  266.                     context?.let {
  267.                         Dialog(it).setDialog("Insert New Boundary Area", response.message)
  268.                             .setPositiveButton("Oke") { dialog, which ->
  269.                                 findNavController().popBackStack()
  270.                             }
  271.                             .show()
  272.                     }
  273.                 }
  274.                 is Resource.Failure -> {
  275.                     val responseBody = it.errorBody
  276.                     val jsonErr = JSONObject(responseBody!!.string())
  277.                     val msgErr = jsonErr.getString("message")
  278.  
  279.                     context?.let {
  280.                         Dialog(it).setDialog("Oops!!", msgErr).show()
  281.                     }
  282.                 }
  283.             }
  284.         }
  285.     }
  286.  
  287.     private fun getLastLocation() {
  288.         if (ActivityCompat.checkSelfPermission(
  289.                 requireActivity(),
  290.                 android.Manifest.permission.ACCESS_FINE_LOCATION
  291.             ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
  292.                 requireActivity(),
  293.                 android.Manifest.permission.ACCESS_COARSE_LOCATION
  294.             ) != PackageManager.PERMISSION_GRANTED
  295.         ) {
  296.             // TODO: Consider calling
  297.             //    ActivityCompat#requestPermissions
  298.             // here to request the missing permissions, and then overriding
  299.             //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
  300.             //                                          int[] grantResults)
  301.             // to handle the case where the user grants the permission. See the documentation
  302.             // for ActivityCompat#requestPermissions for more details.
  303.             return
  304.         }
  305.         fusedLocationClient.lastLocation
  306.             .addOnSuccessListener { location: Location? ->
  307.                 if (location != null) {
  308.                     currentLocation = LatLng(location.latitude, location.longitude)
  309.                     mapViews.getMapAsync(this)
  310.                 }
  311.             }
  312.             .addOnFailureListener { e ->
  313.                 e.printStackTrace()
  314.             }
  315.     }
  316.  
  317.     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
  318.         super.onActivityResult(requestCode, resultCode, data)
  319.         if (requestCode == KML_FILE_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
  320.             data?.data?.let { uri ->
  321.                 println("OPO IKI >> $uri")
  322.                 displayKmlOnMap(uri)
  323.             }
  324.         }
  325.     }
  326.  
  327.     private fun displayKmlOnMap(uri: Uri) {
  328.         try {
  329.             val inputStream: InputStream? = requireActivity().contentResolver.openInputStream(uri)
  330.             Log.e(TAG, "displayKmlOnMap: $inputStream", )
  331.             if (inputStream != null) {
  332.                 val kmlLayer = KmlLayer(googleMap, inputStream, requireContext())
  333.                 kmlLayer.addLayerToMap()
  334.             }
  335.         } catch (e: Exception) {
  336.             e.printStackTrace()
  337.         }
  338.     }
  339.  
  340.     override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
  341.         super.onRequestPermissionsResult(requestCode, permissions, grantResults)
  342.         if (requestCode == 1) {
  343.             if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  344.                 getLastLocation()
  345.             } else {
  346.                 // Handle permission denied
  347.             }
  348.         }
  349.     }
  350.  
  351.     override fun onResume() {
  352.         super.onResume()
  353.         mapViews.onResume()
  354.     }
  355.  
  356.     override fun onPause() {
  357.         super.onPause()
  358.         mapViews.onPause()
  359.     }
  360.  
  361.     override fun onDestroy() {
  362.         super.onDestroy()
  363.         mapViews.onDestroy()
  364.     }
  365.  
  366.     override fun onLowMemory() {
  367.         super.onLowMemory()
  368.         mapViews.onLowMemory()
  369.     }
  370.  
  371.     override fun getViewModel() = AreaDetailViewModel::class.java
  372.  
  373.     override fun getFragmentBinding(
  374.         inflater: LayoutInflater,
  375.         container: ViewGroup?
  376.     ) = FragmentAreaDetailBinding.inflate(layoutInflater, container, false)
  377.  
  378.     override fun getFragmentRepository(): AreaDetailRepo{
  379.         var token = runBlocking { userPrefrences.tokenFlow.first() }
  380.         val api = clientRemote.buildApi(AreaEndpont::class.java, token)
  381.         return AreaDetailRepo(api)
  382.     }
  383.  
  384.     companion object {
  385.         private const val TAG = "DETAIL-AREA"
  386.         private val KML_FILE_REQUEST_CODE = 1
  387.     }
  388. }
Add Comment
Please, Sign In to add comment