Advertisement
Guest User

Untitled

a guest
Oct 9th, 2020
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.41 KB | None | 0 0
  1. import android.content.Intent
  2. import android.graphics.BitmapFactory
  3. import android.os.AsyncTask
  4. import android.os.Bundle
  5. import android.view.View
  6. import android.widget.Toast
  7. import androidx.appcompat.app.AppCompatActivity
  8. import androidx.core.content.ContextCompat
  9. import androidx.drawerlayout.widget.DrawerLayout
  10. import com.getbase.floatingactionbutton.FloatingActionButton
  11. import com.google.android.gms.auth.api.signin.GoogleSignInOptions
  12. import com.mapbox.android.core.permissions.PermissionsListener
  13. import com.mapbox.android.core.permissions.PermissionsManager
  14. import com.mapbox.geojson.FeatureCollection
  15. import com.mapbox.mapboxsdk.Mapbox
  16. import com.mapbox.mapboxsdk.camera.CameraPosition
  17. import com.mapbox.mapboxsdk.camera.CameraUpdateFactory
  18. import com.mapbox.mapboxsdk.geometry.LatLng
  19. import com.mapbox.mapboxsdk.location.LocationComponentActivationOptions
  20. import com.mapbox.mapboxsdk.location.LocationComponentOptions
  21. import com.mapbox.mapboxsdk.location.modes.CameraMode
  22. import com.mapbox.mapboxsdk.location.modes.RenderMode
  23. import com.mapbox.mapboxsdk.maps.*
  24. import com.mapbox.mapboxsdk.style.layers.PropertyFactory
  25. import com.mapbox.mapboxsdk.style.layers.SymbolLayer
  26. import com.mapbox.mapboxsdk.style.sources.GeoJsonSource
  27. import java.io.InputStream
  28. import java.lang.ref.WeakReference
  29. import java.util.*
  30.  
  31. /**
  32. * Use Kotlin to add a map into a fragment container.
  33. */
  34. class HostActivity : AppCompatActivity(), PermissionsListener {
  35.  
  36. lateinit var googleSignInClient: GoogleSignInClient
  37. private lateinit var navController: NavController
  38. private val mAuth: FirebaseAuth = FirebaseAuth.getInstance()
  39. private val db: FirebaseFirestore = FirebaseFirestore.getInstance()
  40. private lateinit var drawerLayout: DrawerLayout
  41. private lateinit var navViewBinding: DrawerHeaderLayoutBinding
  42.  
  43. private val mapView: MapView? = null
  44. private var permissionsManager: PermissionsManager = PermissionsManager(this)
  45. private lateinit var mapboxMap: MapboxMap
  46.  
  47. override fun onCreate(savedInstanceState: Bundle?) {
  48. super.onCreate(savedInstanceState)
  49. setTheme(R.style.AppTheme)
  50. super.onCreate(savedInstanceState)
  51. setContentView(R.layout.activity_basic_kotlin_support_map_frag)
  52.  
  53. // Mapbox access token is configured here. This needs to be called either in your application
  54. // object or in the same activity which contains the mapview.
  55. Mapbox.getInstance(this, getString(R.string.access_token))
  56.  
  57. // Create supportMapFragment
  58. val mapFragment: SupportMapFragment
  59. if (savedInstanceState == null) {
  60.  
  61. // Create fragment
  62. val transaction = supportFragmentManager.beginTransaction()
  63.  
  64. // Build mapboxMap
  65. val options = MapboxMapOptions.createFromAttributes(this, null)
  66. options.camera(CameraPosition.Builder()
  67. .zoom(9.0)
  68. .build())
  69.  
  70. // Create map fragment
  71. mapFragment = SupportMapFragment.newInstance(options)
  72.  
  73. // Add map fragment to parent container
  74. transaction.add(R.id.container, mapFragment, "com.mapbox.map")
  75. transaction.commit()
  76. } else {
  77. mapFragment = supportFragmentManager.findFragmentByTag("com.mapbox.map") as SupportMapFragment
  78. }
  79.  
  80. mapFragment.getMapAsync { mapboxMap ->
  81. this.mapboxMap = mapboxMap
  82. mapboxMap.setStyle(Style.Builder().fromUri(Style.MAPBOX_STREETS)
  83. .withImage(ICON_ID, BitmapFactory.decodeResource(
  84. resources, R.drawable.mapbox_marker_icon_default))
  85. .withSource(GeoJsonSource(GEOJSON_SOURCE_ID))
  86. .withLayer(SymbolLayer(LAYER_ID, GEOJSON_SOURCE_ID)
  87. .withProperties(
  88. PropertyFactory.iconImage(ICON_ID),
  89. PropertyFactory.iconAllowOverlap(true),
  90. PropertyFactory.iconIgnorePlacement(true)
  91. )
  92. )) {
  93. // Map is set up and the style has loaded. Now you can add data or make other map adjustments
  94. enableLocationComponent(it)
  95.  
  96. val toolbar = customToolbar
  97. setSupportActionBar(toolbar)
  98.  
  99. val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
  100. .requestIdToken(getString(R.string.default_web_client_id))
  101. .requestEmail()
  102. .build()
  103. googleSignInClient = GoogleSignIn.getClient(this, gso)
  104.  
  105. drawerLayout = drawer_layout
  106. navViewBinding = DrawerHeaderLayoutBinding.inflate(layoutInflater, navView, true)
  107.  
  108. navController.addOnDestinationChangedListener { _, destination, _ ->
  109. if (destination.id == R.id.onBoarding ||
  110. destination.id == R.id.authFragment ||
  111. destination.id == R.id.loginFragment ||
  112. destination.id == R.id.signUpFragment
  113. ) {
  114. toolbar.visibility = View.GONE
  115. drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
  116. } else {
  117. toolbar.visibility = View.VISIBLE
  118. drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
  119. }
  120. }
  121. if (!Prefs.getInstance(this)!!.hasCompletedWalkthrough!!) {
  122. if (mAuth.currentUser == null) {
  123. graph.startDestination = R.id.authFragment
  124. } else {
  125. getUserData()
  126. graph.startDestination = R.id.homeFragment
  127. }
  128. } else {
  129. graph.startDestination = R.id.onBoarding
  130.  
  131. }
  132. navController.graph = graph
  133.  
  134. NavigationUI.setupActionBarWithNavController(this, navController, drawerLayout)
  135. navView.setupWithNavController(navController)
  136. navView.setNavigationItemSelectedListener {
  137. it.isChecked
  138. drawerLayout.closeDrawers()
  139. when (it.itemId) {
  140. R.id.action_logout -> {
  141. MyApplication.currentUser!!.active = false
  142. FirestoreUtil.updateUser(MyApplication.currentUser!!) {
  143. mAuth.signOut()
  144. }
  145. googleSignInClient.signOut()
  146. MyApplication.currentUser = null
  147. navController.navigate(R.id.action_logout)
  148. }
  149. }
  150. true
  151. }
  152.  
  153. val fragmentReturnToDeviceLocationButton = findViewById<FloatingActionButton>(R.id.fragmentReturnToDeviceLocationButton)
  154. fragmentReturnToDeviceLocationButton.setOnClickListener {
  155. mapboxMap.locationComponent.lastKnownLocation?.let {
  156. mapboxMap.animateCamera(CameraUpdateFactory
  157. .newCameraPosition(CameraPosition.Builder()
  158. .target(LatLng(it.latitude, it.longitude))
  159. .zoom(15.0)
  160. .build()), 1000)
  161. }
  162. }
  163.  
  164. LoadGeoJson(this).execute()
  165. }
  166. }
  167. }
  168.  
  169. fun addMarkers(featureCollection: FeatureCollection) {
  170. mapboxMap.getStyle {
  171. val geoJsonSource = it.getSourceAs<GeoJsonSource>(GEOJSON_SOURCE_ID)
  172. geoJsonSource?.let {
  173. geoJsonSource.setGeoJson(featureCollection)
  174. }
  175. }
  176. }
  177.  
  178. private fun enableLocationComponent(loadedMapStyle: Style) {
  179. // Check if permissions are enabled and if not request
  180. if (PermissionsManager.areLocationPermissionsGranted(this)) {
  181.  
  182. // Create and customize the LocationComponent's options
  183. val customLocationComponentOptions = LocationComponentOptions.builder(this)
  184. .trackingGesturesManagement(true)
  185. .accuracyColor(ContextCompat.getColor(this, R.color.mapboxGreen))
  186. .build()
  187.  
  188. val locationComponentActivationOptions = LocationComponentActivationOptions.builder(this, loadedMapStyle)
  189. .locationComponentOptions(customLocationComponentOptions)
  190. .build()
  191.  
  192. // Get an instance of the LocationComponent and then adjust its settings
  193. mapboxMap.locationComponent.apply {
  194.  
  195. // Activate the LocationComponent with options
  196. activateLocationComponent(locationComponentActivationOptions)
  197.  
  198. // Enable to make the LocationComponent visible
  199. isLocationComponentEnabled = true
  200.  
  201. // Set the LocationComponent's camera mode
  202. cameraMode = CameraMode.TRACKING
  203.  
  204. // Set the LocationComponent's render mode
  205. renderMode = RenderMode.COMPASS
  206. }
  207. } else {
  208. permissionsManager = PermissionsManager(this)
  209. permissionsManager.requestLocationPermissions(this)
  210. }
  211. }
  212.  
  213. override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
  214. permissionsManager.onRequestPermissionsResult(requestCode, permissions, grantResults)
  215. }
  216.  
  217. override fun onExplanationNeeded(permissionsToExplain: List<String>) {
  218. Toast.makeText(this, "This app needs location permissions in order to show its functionality.", Toast.LENGTH_LONG).show()
  219. }
  220.  
  221. override fun onPermissionResult(granted: Boolean) {
  222. if (granted) {
  223. enableLocationComponent(mapboxMap.style!!)
  224. } else {
  225. Toast.makeText(this, "You didn't grant location permissions", Toast.LENGTH_LONG).show()
  226. finish()
  227. }
  228. }
  229.  
  230. private fun getUserData() {
  231.  
  232. val ref = db.collection("users").document(mAuth.currentUser!!.uid)
  233.  
  234. ref.get().addOnSuccessListener {
  235. val userInfo = it.toObject(UserModel::class.java)
  236. navViewBinding.user = userInfo
  237. MyApplication.currentUser = userInfo
  238. MyApplication.currentUser!!.active = true
  239. FirestoreUtil.updateUser(MyApplication.currentUser!!) {
  240. }
  241. }.addOnFailureListener {
  242. val intent = Intent(this, MyApplication::class.java)
  243. startActivity(intent)
  244. finish()
  245. }
  246. }
  247.  
  248. override fun onSupportNavigateUp(): Boolean {
  249. return NavigationUI.navigateUp(navController, drawerLayout)
  250. }
  251.  
  252.  
  253. private open class LoadGeoJson internal constructor(activity: HostActivity) : AsyncTask<Void?, Void?, FeatureCollection?>() {
  254. private val weakReference: WeakReference<HostActivity> = WeakReference(activity)
  255. override fun doInBackground(vararg params: Void?): FeatureCollection? {
  256. try {
  257. val activity = weakReference.get()
  258. if (activity != null) {
  259. val inputStream = activity.assets.open("LOCAL_GEOJSON_FILENAME.geojson")
  260. return FeatureCollection.fromJson(convertStreamToString(inputStream))
  261. }
  262. } catch (exception: Exception) {
  263. }
  264. return null
  265. }
  266.  
  267. override fun onPostExecute(featureCollection: FeatureCollection?) {
  268. super.onPostExecute(featureCollection)
  269. val activity = weakReference.get()
  270. if (activity != null && featureCollection != null) {
  271. activity.addMarkers(featureCollection)
  272. }
  273. }
  274.  
  275. companion object {
  276. fun convertStreamToString(`is`: InputStream?): String {
  277. val scanner = Scanner(`is`).useDelimiter("\\A")
  278. return if (scanner.hasNext()) scanner.next() else ""
  279. }
  280. }
  281.  
  282. }
  283.  
  284. companion object {
  285. private const val GEOJSON_SOURCE_ID = "GEOJSON_SOURCE_ID"
  286. private const val ICON_ID = "ICON_ID"
  287. private const val LAYER_ID = "LAYER_ID"
  288. }
  289. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement