@@ -2,30 +2,47 @@ package com.google.samples.quickstart.canonical
2
2
3
3
import android.Manifest
4
4
import android.app.Activity
5
+ import android.content.ContentValues.TAG
5
6
import android.content.pm.PackageManager
6
7
import android.location.Location
7
8
import androidx.fragment.app.Fragment
8
9
9
10
import android.os.Bundle
11
+ import android.util.Log
10
12
import android.view.LayoutInflater
11
13
import android.view.View
12
14
import android.view.ViewGroup
15
+ import android.widget.LinearLayout
13
16
import androidx.core.content.ContextCompat.checkSelfPermission
14
17
import com.google.android.gms.location.FusedLocationProviderClient
15
18
import com.google.android.gms.location.LocationServices
19
+ import com.google.android.gms.common.api.Status
16
20
17
21
import com.google.android.gms.maps.CameraUpdateFactory
18
22
import com.google.android.gms.maps.GoogleMap
19
23
import com.google.android.gms.maps.OnMapReadyCallback
20
24
import com.google.android.gms.maps.SupportMapFragment
21
25
import com.google.android.gms.maps.model.LatLng
26
+ import com.google.android.gms.maps.model.Marker
22
27
import com.google.android.gms.maps.model.MarkerOptions
28
+ import com.google.android.libraries.places.api.Places
29
+ import com.google.android.libraries.places.api.model.Place
30
+ import com.google.android.libraries.places.api.model.RectangularBounds
31
+ import com.google.android.libraries.places.api.net.PlacesClient
32
+ import com.google.android.libraries.places.widget.AutocompleteSupportFragment
33
+ import com.google.android.libraries.places.widget.listener.PlaceSelectionListener
23
34
24
35
class MapsFragment : Fragment () {
25
36
26
37
private lateinit var map: GoogleMap
27
38
private lateinit var fusedLocationClient: FusedLocationProviderClient
28
39
private lateinit var lastLocation: Location
40
+ private lateinit var placesClient : PlacesClient
41
+ private lateinit var autocompleteLayout : LinearLayout
42
+ private lateinit var targetLatLng : LatLng
43
+ private lateinit var targetName : String
44
+ private var currentLatLng : LatLng ? = null
45
+ private var targetMarker : Marker ? = null
29
46
30
47
companion object {
31
48
private const val LOCATION_PERMISSION_REQUEST_CODE = 1
@@ -51,27 +68,65 @@ class MapsFragment : Fragment() {
51
68
}
52
69
}
53
70
71
+ private fun initPlaces () {
72
+ context?.let { Places .initialize(it, getString(R .string.google_maps_key)) }
73
+ placesClient = context?.let { Places .createClient(it) }!!
74
+ }
75
+
76
+ private fun setPlacesSearchBias () {
77
+ val autocompleteFragment = childFragmentManager.findFragmentById(R .id.autocomplete_fragment) as AutocompleteSupportFragment
78
+ // Search nearby result
79
+ currentLatLng?.let {
80
+ Log .i(TAG , " currentLatLng" )
81
+ autocompleteFragment.setLocationBias(
82
+ RectangularBounds .newInstance(
83
+ LatLng (currentLatLng!! .latitude - 1 , currentLatLng!! .longitude - 1 ),
84
+ LatLng (currentLatLng!! .latitude + 1 , currentLatLng!! .longitude + 1 )
85
+ ))
86
+ }
87
+ }
88
+
54
89
private fun setUpMap () {
55
90
if (checkSelfPermission(context as Activity ,
56
91
Manifest .permission.ACCESS_FINE_LOCATION ) != PackageManager .PERMISSION_GRANTED ) {
57
92
requestPermissions(arrayOf(Manifest .permission.ACCESS_FINE_LOCATION ), LOCATION_PERMISSION_REQUEST_CODE )
58
93
return
59
94
}
60
95
96
+ // Add and adjust the position of MyLocation button.
61
97
map.isMyLocationEnabled = true
98
+ map.setPadding(0 ,(1.5 * autocompleteLayout.height).toInt(),0 ,0 )
62
99
63
100
fusedLocationClient.lastLocation.addOnSuccessListener(this .activity as Activity ) { location ->
64
101
// Got last known location. In some rare situations this can be null.
65
102
if (location != null ) {
66
103
lastLocation = location
67
- val currentLatLng = LatLng (location.latitude, location.longitude)
68
- map.animateCamera(CameraUpdateFactory .newLatLngZoom(currentLatLng, 12f ))
69
- map.addMarker(MarkerOptions ().position(currentLatLng).title(" My location" ))
70
- map.moveCamera(CameraUpdateFactory .newLatLng(currentLatLng))
104
+ currentLatLng = LatLng (location.latitude, location.longitude)
105
+ map.animateCamera(CameraUpdateFactory .newLatLngZoom(currentLatLng, 14f ))
106
+ map.addMarker(MarkerOptions ()
107
+ .position(currentLatLng!! )
108
+ .title(" My location" ))
109
+ map.moveCamera(CameraUpdateFactory .newLatLngZoom(currentLatLng, 14f ))
110
+ setPlacesSearchBias()
71
111
}
72
112
}
73
113
}
74
114
115
+ private fun setUpAutocomplete (autocompleteFragment : AutocompleteSupportFragment , mapFragment : SupportMapFragment ) {
116
+ autocompleteFragment.setPlaceFields(listOf (Place .Field .ID , Place .Field .NAME , Place .Field .LAT_LNG ))
117
+ autocompleteFragment.setOnPlaceSelectedListener(object : PlaceSelectionListener {
118
+ override fun onPlaceSelected (place : Place ) {
119
+ targetLatLng = place.latLng!!
120
+ targetName = place.name.toString()
121
+ mapFragment.getMapAsync(searchPlacesCallback)
122
+ }
123
+
124
+ override fun onError (status : Status ) {
125
+ Log .e(TAG , " An error occurred: $status " )
126
+ }
127
+ })
128
+ }
129
+
75
130
76
131
private val mapReadyCallback = OnMapReadyCallback { googleMap ->
77
132
/* *
@@ -86,6 +141,16 @@ class MapsFragment : Fragment() {
86
141
map = googleMap
87
142
map.uiSettings.isZoomControlsEnabled = true
88
143
setUpMap()
144
+
145
+ }
146
+
147
+ private val searchPlacesCallback = OnMapReadyCallback { map ->
148
+ targetMarker?.remove()
149
+ map.moveCamera(CameraUpdateFactory .newLatLngZoom(targetLatLng, 14f ))
150
+ targetMarker = map.addMarker(MarkerOptions ()
151
+ .position(targetLatLng)
152
+ .title(targetName)
153
+ .draggable(true ))
89
154
}
90
155
91
156
override fun onCreateView (
@@ -99,7 +164,13 @@ class MapsFragment : Fragment() {
99
164
100
165
override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
101
166
super .onViewCreated(view, savedInstanceState)
102
- val mapFragment = childFragmentManager.findFragmentById(R .id.map) as SupportMapFragment ?
103
- mapFragment?.getMapAsync(mapReadyCallback)
167
+ initPlaces()
168
+
169
+ val mapFragment = childFragmentManager.findFragmentById(R .id.map_fragment) as SupportMapFragment
170
+ val autocompleteFragment = childFragmentManager.findFragmentById(R .id.autocomplete_fragment) as AutocompleteSupportFragment
171
+ autocompleteLayout = view.findViewById(R .id.autocomplete_linearLayout)
172
+ mapFragment.getMapAsync(mapReadyCallback)
173
+
174
+ setUpAutocomplete(autocompleteFragment, mapFragment)
104
175
}
105
176
}
0 commit comments