From daca60c2875c55eebbcd48f61bc1b51b698c1eb4 Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Fri, 16 Sep 2022 21:03:02 +0900 Subject: [PATCH 01/99] =?UTF-8?q?=E3=83=93=E3=83=AB=E3=83=89=E3=81=AB?= =?UTF-8?q?=E3=83=9E=E3=83=83=E3=83=97=E9=96=A2=E9=80=A3=E3=81=AE=E4=BE=9D?= =?UTF-8?q?=E5=AD=98=E9=96=A2=E4=BF=82=E3=81=AA=E3=81=A9=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 6 +++++- build.gradle | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e8c8382..6afea0b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,7 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' + id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' } android { @@ -12,7 +13,6 @@ android { targetSdk 32 versionCode 1 versionName "1.0" - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -50,6 +50,10 @@ dependencies { implementation 'androidx.navigation:navigation-fragment-ktx:2.5.1' implementation 'androidx.navigation:navigation-ui-ktx:2.5.1' + implementation 'com.google.android.gms:play-services-maps:18.1.0' + implementation "com.google.maps:google-maps-services:0.2.11" + implementation 'com.google.maps.android:android-maps-utils:2.2.0' + testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' diff --git a/build.gradle b/build.gradle index 64f119e..6d184ae 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,7 @@ plugins { id 'com.android.application' version '7.2.2' apply false id 'com.android.library' version '7.2.2' apply false id 'org.jetbrains.kotlin.android' version '1.7.10' apply false + id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' version '2.0.1' apply false } task clean(type: Delete) { From 2668460f603dd1259640e5995b4cf7baa93ac598 Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Fri, 16 Sep 2022 23:07:21 +0900 Subject: [PATCH 02/99] =?UTF-8?q?map=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97?= =?UTF-8?q?=E3=81=A6Manifest=E3=81=8C=E5=B0=91=E3=81=97=E3=81=A0=E3=81=91?= =?UTF-8?q?=E5=81=8F=E5=90=91=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 75e3fbc..dbfc5b7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,12 +13,17 @@ android:supportsRtl="true" android:theme="@style/Theme.AROA" tools:targetApi="31"> + + + - - + + From ce0cbc8446871a5966efed32050994f24f11047a Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Fri, 16 Sep 2022 23:15:41 +0900 Subject: [PATCH 03/99] =?UTF-8?q?MapsFragment=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=81=97=E3=80=81viewModel=E3=82=82=E8=BF=BD=E5=8A=A0=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aroa/ui/addtrial/AddTrialMapsFragment.kt | 156 ++++++++++++++++++ .../aroa/ui/addtrial/AddTrialMapsViewModel.kt | 106 ++++++++++++ .../res/layout/fragment_add_trial_maps.xml | 8 + 3 files changed, 270 insertions(+) create mode 100644 app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt create mode 100644 app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt create mode 100644 app/src/main/res/layout/fragment_add_trial_maps.xml diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt new file mode 100644 index 0000000..cf0c55d --- /dev/null +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt @@ -0,0 +1,156 @@ +package jp.ac.okinawa_ct.nitoc_ict.aroa.ui.addtrial + +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.google.android.gms.maps.CameraUpdateFactory +import com.google.android.gms.maps.GoogleMap +import com.google.android.gms.maps.OnMapReadyCallback +import com.google.android.gms.maps.SupportMapFragment +import com.google.android.gms.maps.model.* +import com.google.maps.android.PolyUtil +import com.google.maps.model.DirectionsResult +import jp.ac.okinawa_ct.nitoc_ict.aroa.R +import java.util.* + +class AddTrialMapsFragment : Fragment() { + companion object { + private const val ZOOM_SIZE = 14f + private const val POLYLINE_WIDTH = 12f + } + + private var map: GoogleMap? = null + private var polyline: Polyline? = null + private val overview = 0 + private lateinit var viewModel: AddTrialMapsViewModel + + private val callback = OnMapReadyCallback { googleMap -> + viewModel.execute() + moveCamera() + setMapLongClick(googleMap) + setMarkerClick(googleMap) + setOnMarkerDrag(googleMap) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val viewModel = ViewModelProvider(this).get(AddTrialMapsViewModel::class.java) + return inflater.inflate(R.layout.fragment_add_trial_maps, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment? + mapFragment?.getMapAsync(callback) + observeLiveData() + } + + private fun observeLiveData() { + viewModel.directionsResult.observe(viewLifecycleOwner, Observer{ + updatePolyline(it, map) + }) + } + + private fun moveCamera() { + // Add a marker in Sydney and move the camera + val okinawa = LatLng(26.387409,127.729753) + map?.apply { + addMarker(MarkerOptions().position(okinawa).title("Marker in Okinawa")) + // moveCamera(CameraUpdateFactory.newLatLng(tokyo)) + moveCamera(CameraUpdateFactory.newLatLngZoom(okinawa, ZOOM_SIZE)) + } + } + + private fun setMapLongClick(map: GoogleMap) { + map.setOnMapLongClickListener{latLng -> + val snippet = String.format( + Locale.getDefault(), + "Lat: %1$.5f, Long: %2$.5f", + latLng.latitude, + latLng.longitude + ) + + val marker = map.addMarker( + MarkerOptions() + .position(latLng) + .title("drop") + .snippet(snippet) + .draggable(true) + ) + + Log.i("MapsActivity","doAddMarker") + if (marker != null) { + viewModel.addWaypointMarker(marker) + } + Log.i("MapsActivity","didAddMarker") + } + } + + private fun setMarkerClick(map: GoogleMap) { + map.setOnMarkerClickListener{marker -> + viewModel.removeWaypointMarker(marker) + marker.remove() + return@setOnMarkerClickListener true + } + } + + private fun setOnMarkerDrag(map: GoogleMap) { + map.setOnMarkerDragListener(object : GoogleMap.OnMarkerDragListener { + private var start: com.google.maps.model.LatLng? = null + private var end: com.google.maps.model.LatLng? = null + + override fun onMarkerDragStart(marker: Marker) { + marker.position.let { start = + com.google.maps.model.LatLng(it.latitude, it.longitude) + } + Log.i("MapsActivity","StartMarker:${start.toString()}") + } + + override fun onMarkerDrag(marker: Marker) { + // Do Nothing. + } + + override fun onMarkerDragEnd(marker: Marker) { + marker.position.let { end = + com.google.maps.model.LatLng(it.latitude, it.longitude) + } + Log.i("MapsActivity","EndMarker:${end.toString()}") + viewModel.changeWaypointMarker(marker) + } + }) + } + + private fun updatePolyline(directionsResult: DirectionsResult?, googleMap: GoogleMap?) { + googleMap ?: return + directionsResult ?: return + removePolyline() + Log.i("MapsActivity","doUpdatePolyline") + addPolyline(directionsResult, googleMap) + Log.i("MapsActivity","didUpdatePolyline") + } + + // 線を消す. + private fun removePolyline() { + if (map != null && polyline != null) { + polyline?.remove() + } + } + + // 線を引く + private fun addPolyline(directionsResult: DirectionsResult, map: GoogleMap) { + val polylineOptions = PolylineOptions() + polylineOptions.width(POLYLINE_WIDTH) + // ARGB32bit形式. + polylineOptions.color(R.color.map_polyline_stroke) + val decodedPath = PolyUtil.decode(directionsResult.routes[overview].overviewPolyline.encodedPath) + polyline = map.addPolyline(polylineOptions.addAll(decodedPath)) + } +} \ No newline at end of file diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt new file mode 100644 index 0000000..8d60aef --- /dev/null +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt @@ -0,0 +1,106 @@ +package jp.ac.okinawa_ct.nitoc_ict.aroa.ui.addtrial + +import android.app.Application +import android.util.Log +import androidx.lifecycle.* +import com.google.maps.model.LatLng +import com.google.android.gms.maps.model.Marker +import com.google.maps.model.DirectionsResult +import kotlinx.coroutines.launch +import java.lang.StringBuilder + +class AddTrialMapsViewModel(application: Application) : AndroidViewModel(application) { + private val _directionsResult = MutableLiveData() + val directionsResult: LiveData = _directionsResult + + private val _origin = MutableLiveData() + val origin: LiveData get() = _origin + + private val _dest = MutableLiveData() + val dest: LiveData get() = _dest + + private val _waypoints = MutableLiveData>().apply { + value = ArrayList() + } + val waypoints: LiveData> get() = _waypoints + + private val _waypointMarkers = MutableLiveData>().apply { + value = ArrayList() + } + val waypointMarkers: LiveData> get() = _waypointMarkers + + + init { + _origin.value = LatLng(26.387409, 127.729753) + _dest.value = LatLng(26.387409, 127.729753) +// _dest.value = LatLng(26.52486985103984, 128.0300908585622) +// _waypoints.value?.add(LatLng(26.313224610295485, 127.79608257031921)) + } + + fun setOrigin(lat: Double, lng: Double) { + _origin.value = LatLng(lat,lng) + } + + fun setDest(lat: Double, lng: Double) { + _dest.value = LatLng(lat,lng) + } + + + fun addWaypointMarker(marker: Marker) { + _waypointMarkers.value?.add(marker) + Log.i("MapsActivity", "addWaypointMarker:${_waypointMarkers.value.toString()}") + execute() + } + + fun removeWaypointMarker(marker: Marker) { + Log.i("MapsActivity","removeMarkerLatLng:${marker.position}") + _waypointMarkers.value?.remove(marker) + Log.i("MapsActivity", "removeWaypointMarker:${_waypointMarkers.value.toString()}") + execute() + } + + fun changeWaypointMarker(marker: Marker) { + val markersId = ArrayList() + for (id in _waypointMarkers.value!!) { + markersId.add(id.id) + } + val index = markersId.indexOf(marker.id) + _waypointMarkers.value?.set(index,marker) + Log.i("MapsActivity", "changeWaypointMarker:${_waypointMarkers.value!!.get(index).position}") + execute() + } + + private fun markersToString(): String { + Log.i("MapsActivity","do1:") + val sb = StringBuilder() + Log.i("MapsActivity","do2:") + if (_waypointMarkers != null) { + Log.i("MapsActivity","do3:") + for (waypoint in _waypointMarkers.value!!) { +// sb.append(waypoint.lat.toString() + "," + waypoint.lng.toString() + "|") + Log.i("MapsActivity","waypointsString: ${waypoint.position.latitude.toString() + "," + waypoint.position.longitude.toString() + "|"}") + sb.append(waypoint.position.latitude.toString() + "," + waypoint.position.longitude.toString() + "|") + } + } + val waypointsString = sb.toString() +// waypointsString.drop(1) +// waypointsString.dropLast(2) +// waypointsString.replace("[", "").replace("]", "") + Log.i("MapsActivity","waypointsString: $waypointsString") + return waypointsString + } + + + + fun execute() { + viewModelScope.launch { + val waypointsString = markersToString() + Log.i("MapsActivity", "execute:${_waypoints.value.toString()}") + val result = DirectionsApiHelper().execute(getApplication(), + _origin.value, _dest.value, waypointsString + ) + Log.i("MapsActivity", "executed:${result.toString()}") + _directionsResult.value = result + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_add_trial_maps.xml b/app/src/main/res/layout/fragment_add_trial_maps.xml new file mode 100644 index 0000000..fb0c88d --- /dev/null +++ b/app/src/main/res/layout/fragment_add_trial_maps.xml @@ -0,0 +1,8 @@ + + \ No newline at end of file From dcd36b074887a5c3b6bfaf048092f03f8e556bde Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Sat, 17 Sep 2022 23:30:06 +0900 Subject: [PATCH 04/99] =?UTF-8?q?DirectionAPI=E3=81=AE=E5=87=A6=E7=90=86?= =?UTF-8?q?=E3=82=92=E8=A1=8C=E3=81=86=E3=82=AF=E3=83=A9=E3=82=B9=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aroa/ui/addtrial/DirectionsApiHelper.kt | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/DirectionsApiHelper.kt diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/DirectionsApiHelper.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/DirectionsApiHelper.kt new file mode 100644 index 0000000..2846832 --- /dev/null +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/DirectionsApiHelper.kt @@ -0,0 +1,47 @@ +package jp.ac.okinawa_ct.nitoc_ict.aroa.ui.addtrial + +import android.content.Context +import androidx.annotation.Nullable +import com.google.maps.DirectionsApi +import com.google.maps.GeoApiContext +import com.google.maps.model.DirectionsResult +import com.google.maps.model.LatLng +import com.google.maps.model.TravelMode +import com.google.maps.model.Unit +import jp.ac.okinawa_ct.nitoc_ict.aroa.BuildConfig +import jp.ac.okinawa_ct.nitoc_ict.aroa.R +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import java.util.* + +class DirectionsApiHelper { + /** + * 経路APIを実行する. + * + * @param context コンテキスト + * @param origin 出発地点 + * @param destination 到着地点 + * @return 取得成功: [com.google.maps.model.DirectionsResult] 失敗: null + */ + @Nullable + suspend fun execute(context: Context, origin: LatLng?, destination: LatLng?, waypoints: String): DirectionsResult? { + return withContext(Dispatchers.IO) { + // Mapキーの取得. + val apiContext = GeoApiContext.Builder() + .apiKey(BuildConfig.API_KEY).build() + + // API実行. + kotlin.runCatching { + DirectionsApi + .newRequest(apiContext) + .mode(TravelMode.WALKING) + .units(Unit.METRIC) + .language(Locale.JAPAN.language) + .origin(origin) + .destination(destination) + .waypoints(waypoints) + .await() + }.getOrNull() + } + } +} \ No newline at end of file From 9e7929658b2f017e959f11b4d918bc56ca991b38 Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Sun, 18 Sep 2022 21:59:03 +0900 Subject: [PATCH 05/99] =?UTF-8?q?=E5=BE=AE=E4=BF=AE=E6=AD=A3=EF=BC=86?= =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aroa/ui/addtrial/AddTrialMapsFragment.kt | 26 +++++++------- .../aroa/ui/addtrial/AddTrialMapsViewModel.kt | 36 +++++-------------- 2 files changed, 22 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt index cf0c55d..166582d 100644 --- a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt @@ -24,13 +24,13 @@ class AddTrialMapsFragment : Fragment() { private const val POLYLINE_WIDTH = 12f } - private var map: GoogleMap? = null - private var polyline: Polyline? = null + private lateinit var map: GoogleMap + private lateinit var polyline: Polyline private val overview = 0 private lateinit var viewModel: AddTrialMapsViewModel private val callback = OnMapReadyCallback { googleMap -> - viewModel.execute() + viewModel.directionApiExecute() moveCamera() setMapLongClick(googleMap) setMarkerClick(googleMap) @@ -42,7 +42,7 @@ class AddTrialMapsFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View? { - val viewModel = ViewModelProvider(this).get(AddTrialMapsViewModel::class.java) + viewModel = ViewModelProvider(this).get(AddTrialMapsViewModel::class.java) return inflater.inflate(R.layout.fragment_add_trial_maps, container, false) } @@ -59,16 +59,17 @@ class AddTrialMapsFragment : Fragment() { }) } + //カメラを移動 private fun moveCamera() { // Add a marker in Sydney and move the camera - val okinawa = LatLng(26.387409,127.729753) - map?.apply { - addMarker(MarkerOptions().position(okinawa).title("Marker in Okinawa")) - // moveCamera(CameraUpdateFactory.newLatLng(tokyo)) - moveCamera(CameraUpdateFactory.newLatLngZoom(okinawa, ZOOM_SIZE)) + val origin = LatLng(viewModel.origin.value!!.lat, viewModel.origin.value!!.lng) + map.apply { + addMarker(MarkerOptions().position(origin).title("Marker in Origin")) + moveCamera(CameraUpdateFactory.newLatLngZoom(origin, ZOOM_SIZE)) } } + //マップをロングクリック時にマーカーを追加 private fun setMapLongClick(map: GoogleMap) { map.setOnMapLongClickListener{latLng -> val snippet = String.format( @@ -94,6 +95,7 @@ class AddTrialMapsFragment : Fragment() { } } + //マーカーをクリック時にそのマーカーを削除 private fun setMarkerClick(map: GoogleMap) { map.setOnMarkerClickListener{marker -> viewModel.removeWaypointMarker(marker) @@ -102,6 +104,7 @@ class AddTrialMapsFragment : Fragment() { } } + //マーカーをドラッグ時に、マーカーのLatLngを更新 private fun setOnMarkerDrag(map: GoogleMap) { map.setOnMarkerDragListener(object : GoogleMap.OnMarkerDragListener { private var start: com.google.maps.model.LatLng? = null @@ -111,7 +114,6 @@ class AddTrialMapsFragment : Fragment() { marker.position.let { start = com.google.maps.model.LatLng(it.latitude, it.longitude) } - Log.i("MapsActivity","StartMarker:${start.toString()}") } override fun onMarkerDrag(marker: Marker) { @@ -122,19 +124,17 @@ class AddTrialMapsFragment : Fragment() { marker.position.let { end = com.google.maps.model.LatLng(it.latitude, it.longitude) } - Log.i("MapsActivity","EndMarker:${end.toString()}") viewModel.changeWaypointMarker(marker) } }) } + //Polylineを更新 private fun updatePolyline(directionsResult: DirectionsResult?, googleMap: GoogleMap?) { googleMap ?: return directionsResult ?: return removePolyline() - Log.i("MapsActivity","doUpdatePolyline") addPolyline(directionsResult, googleMap) - Log.i("MapsActivity","didUpdatePolyline") } // 線を消す. diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt index 8d60aef..1dd80a0 100644 --- a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt @@ -30,13 +30,6 @@ class AddTrialMapsViewModel(application: Application) : AndroidViewModel(applica val waypointMarkers: LiveData> get() = _waypointMarkers - init { - _origin.value = LatLng(26.387409, 127.729753) - _dest.value = LatLng(26.387409, 127.729753) -// _dest.value = LatLng(26.52486985103984, 128.0300908585622) -// _waypoints.value?.add(LatLng(26.313224610295485, 127.79608257031921)) - } - fun setOrigin(lat: Double, lng: Double) { _origin.value = LatLng(lat,lng) } @@ -45,20 +38,19 @@ class AddTrialMapsViewModel(application: Application) : AndroidViewModel(applica _dest.value = LatLng(lat,lng) } - + //waypointを追加する fun addWaypointMarker(marker: Marker) { _waypointMarkers.value?.add(marker) - Log.i("MapsActivity", "addWaypointMarker:${_waypointMarkers.value.toString()}") - execute() + directionApiExecute() } + //waypointを削除する fun removeWaypointMarker(marker: Marker) { - Log.i("MapsActivity","removeMarkerLatLng:${marker.position}") _waypointMarkers.value?.remove(marker) - Log.i("MapsActivity", "removeWaypointMarker:${_waypointMarkers.value.toString()}") - execute() + directionApiExecute() } + //waypointの値を変更する(ドラッグ&ドロップ) fun changeWaypointMarker(marker: Marker) { val markersId = ArrayList() for (id in _waypointMarkers.value!!) { @@ -66,40 +58,30 @@ class AddTrialMapsViewModel(application: Application) : AndroidViewModel(applica } val index = markersId.indexOf(marker.id) _waypointMarkers.value?.set(index,marker) - Log.i("MapsActivity", "changeWaypointMarker:${_waypointMarkers.value!!.get(index).position}") - execute() + directionApiExecute() } + //Marker型のwaypointsをDirectionAPIにリクエストを送る用のString型に変更する private fun markersToString(): String { - Log.i("MapsActivity","do1:") val sb = StringBuilder() - Log.i("MapsActivity","do2:") if (_waypointMarkers != null) { - Log.i("MapsActivity","do3:") for (waypoint in _waypointMarkers.value!!) { // sb.append(waypoint.lat.toString() + "," + waypoint.lng.toString() + "|") - Log.i("MapsActivity","waypointsString: ${waypoint.position.latitude.toString() + "," + waypoint.position.longitude.toString() + "|"}") sb.append(waypoint.position.latitude.toString() + "," + waypoint.position.longitude.toString() + "|") } } val waypointsString = sb.toString() -// waypointsString.drop(1) -// waypointsString.dropLast(2) -// waypointsString.replace("[", "").replace("]", "") - Log.i("MapsActivity","waypointsString: $waypointsString") return waypointsString } - - fun execute() { + //DirectionAPIを実行 + fun directionApiExecute() { viewModelScope.launch { val waypointsString = markersToString() - Log.i("MapsActivity", "execute:${_waypoints.value.toString()}") val result = DirectionsApiHelper().execute(getApplication(), _origin.value, _dest.value, waypointsString ) - Log.i("MapsActivity", "executed:${result.toString()}") _directionsResult.value = result } } From 7fbaad879b2c0578050a100223473a4f27d53141 Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Fri, 16 Sep 2022 21:03:02 +0900 Subject: [PATCH 06/99] =?UTF-8?q?=E3=83=93=E3=83=AB=E3=83=89=E3=81=AB?= =?UTF-8?q?=E3=83=9E=E3=83=83=E3=83=97=E9=96=A2=E9=80=A3=E3=81=AE=E4=BE=9D?= =?UTF-8?q?=E5=AD=98=E9=96=A2=E4=BF=82=E3=81=AA=E3=81=A9=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index adecd88..a5b0ffa 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ plugins { id 'com.android.application' version '7.2.2' apply false id 'com.android.library' version '7.2.2' apply false id 'org.jetbrains.kotlin.android' version '1.7.10' apply false + id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' version '2.0.1' apply false } task clean(type: Delete) { From 90c131978b1e9782ef8d8ae202c877b8df9eb0b1 Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Fri, 16 Sep 2022 23:15:41 +0900 Subject: [PATCH 07/99] =?UTF-8?q?MapsFragment=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=81=97=E3=80=81viewModel=E3=82=82=E8=BF=BD=E5=8A=A0=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aroa/ui/addtrial/AddTrialMapsFragment.kt | 156 ++++++++++++++++++ .../aroa/ui/addtrial/AddTrialMapsViewModel.kt | 106 ++++++++++++ .../res/layout/fragment_add_trial_maps.xml | 8 + 3 files changed, 270 insertions(+) create mode 100644 app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt create mode 100644 app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt create mode 100644 app/src/main/res/layout/fragment_add_trial_maps.xml diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt new file mode 100644 index 0000000..cf0c55d --- /dev/null +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt @@ -0,0 +1,156 @@ +package jp.ac.okinawa_ct.nitoc_ict.aroa.ui.addtrial + +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.google.android.gms.maps.CameraUpdateFactory +import com.google.android.gms.maps.GoogleMap +import com.google.android.gms.maps.OnMapReadyCallback +import com.google.android.gms.maps.SupportMapFragment +import com.google.android.gms.maps.model.* +import com.google.maps.android.PolyUtil +import com.google.maps.model.DirectionsResult +import jp.ac.okinawa_ct.nitoc_ict.aroa.R +import java.util.* + +class AddTrialMapsFragment : Fragment() { + companion object { + private const val ZOOM_SIZE = 14f + private const val POLYLINE_WIDTH = 12f + } + + private var map: GoogleMap? = null + private var polyline: Polyline? = null + private val overview = 0 + private lateinit var viewModel: AddTrialMapsViewModel + + private val callback = OnMapReadyCallback { googleMap -> + viewModel.execute() + moveCamera() + setMapLongClick(googleMap) + setMarkerClick(googleMap) + setOnMarkerDrag(googleMap) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + val viewModel = ViewModelProvider(this).get(AddTrialMapsViewModel::class.java) + return inflater.inflate(R.layout.fragment_add_trial_maps, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment? + mapFragment?.getMapAsync(callback) + observeLiveData() + } + + private fun observeLiveData() { + viewModel.directionsResult.observe(viewLifecycleOwner, Observer{ + updatePolyline(it, map) + }) + } + + private fun moveCamera() { + // Add a marker in Sydney and move the camera + val okinawa = LatLng(26.387409,127.729753) + map?.apply { + addMarker(MarkerOptions().position(okinawa).title("Marker in Okinawa")) + // moveCamera(CameraUpdateFactory.newLatLng(tokyo)) + moveCamera(CameraUpdateFactory.newLatLngZoom(okinawa, ZOOM_SIZE)) + } + } + + private fun setMapLongClick(map: GoogleMap) { + map.setOnMapLongClickListener{latLng -> + val snippet = String.format( + Locale.getDefault(), + "Lat: %1$.5f, Long: %2$.5f", + latLng.latitude, + latLng.longitude + ) + + val marker = map.addMarker( + MarkerOptions() + .position(latLng) + .title("drop") + .snippet(snippet) + .draggable(true) + ) + + Log.i("MapsActivity","doAddMarker") + if (marker != null) { + viewModel.addWaypointMarker(marker) + } + Log.i("MapsActivity","didAddMarker") + } + } + + private fun setMarkerClick(map: GoogleMap) { + map.setOnMarkerClickListener{marker -> + viewModel.removeWaypointMarker(marker) + marker.remove() + return@setOnMarkerClickListener true + } + } + + private fun setOnMarkerDrag(map: GoogleMap) { + map.setOnMarkerDragListener(object : GoogleMap.OnMarkerDragListener { + private var start: com.google.maps.model.LatLng? = null + private var end: com.google.maps.model.LatLng? = null + + override fun onMarkerDragStart(marker: Marker) { + marker.position.let { start = + com.google.maps.model.LatLng(it.latitude, it.longitude) + } + Log.i("MapsActivity","StartMarker:${start.toString()}") + } + + override fun onMarkerDrag(marker: Marker) { + // Do Nothing. + } + + override fun onMarkerDragEnd(marker: Marker) { + marker.position.let { end = + com.google.maps.model.LatLng(it.latitude, it.longitude) + } + Log.i("MapsActivity","EndMarker:${end.toString()}") + viewModel.changeWaypointMarker(marker) + } + }) + } + + private fun updatePolyline(directionsResult: DirectionsResult?, googleMap: GoogleMap?) { + googleMap ?: return + directionsResult ?: return + removePolyline() + Log.i("MapsActivity","doUpdatePolyline") + addPolyline(directionsResult, googleMap) + Log.i("MapsActivity","didUpdatePolyline") + } + + // 線を消す. + private fun removePolyline() { + if (map != null && polyline != null) { + polyline?.remove() + } + } + + // 線を引く + private fun addPolyline(directionsResult: DirectionsResult, map: GoogleMap) { + val polylineOptions = PolylineOptions() + polylineOptions.width(POLYLINE_WIDTH) + // ARGB32bit形式. + polylineOptions.color(R.color.map_polyline_stroke) + val decodedPath = PolyUtil.decode(directionsResult.routes[overview].overviewPolyline.encodedPath) + polyline = map.addPolyline(polylineOptions.addAll(decodedPath)) + } +} \ No newline at end of file diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt new file mode 100644 index 0000000..8d60aef --- /dev/null +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt @@ -0,0 +1,106 @@ +package jp.ac.okinawa_ct.nitoc_ict.aroa.ui.addtrial + +import android.app.Application +import android.util.Log +import androidx.lifecycle.* +import com.google.maps.model.LatLng +import com.google.android.gms.maps.model.Marker +import com.google.maps.model.DirectionsResult +import kotlinx.coroutines.launch +import java.lang.StringBuilder + +class AddTrialMapsViewModel(application: Application) : AndroidViewModel(application) { + private val _directionsResult = MutableLiveData() + val directionsResult: LiveData = _directionsResult + + private val _origin = MutableLiveData() + val origin: LiveData get() = _origin + + private val _dest = MutableLiveData() + val dest: LiveData get() = _dest + + private val _waypoints = MutableLiveData>().apply { + value = ArrayList() + } + val waypoints: LiveData> get() = _waypoints + + private val _waypointMarkers = MutableLiveData>().apply { + value = ArrayList() + } + val waypointMarkers: LiveData> get() = _waypointMarkers + + + init { + _origin.value = LatLng(26.387409, 127.729753) + _dest.value = LatLng(26.387409, 127.729753) +// _dest.value = LatLng(26.52486985103984, 128.0300908585622) +// _waypoints.value?.add(LatLng(26.313224610295485, 127.79608257031921)) + } + + fun setOrigin(lat: Double, lng: Double) { + _origin.value = LatLng(lat,lng) + } + + fun setDest(lat: Double, lng: Double) { + _dest.value = LatLng(lat,lng) + } + + + fun addWaypointMarker(marker: Marker) { + _waypointMarkers.value?.add(marker) + Log.i("MapsActivity", "addWaypointMarker:${_waypointMarkers.value.toString()}") + execute() + } + + fun removeWaypointMarker(marker: Marker) { + Log.i("MapsActivity","removeMarkerLatLng:${marker.position}") + _waypointMarkers.value?.remove(marker) + Log.i("MapsActivity", "removeWaypointMarker:${_waypointMarkers.value.toString()}") + execute() + } + + fun changeWaypointMarker(marker: Marker) { + val markersId = ArrayList() + for (id in _waypointMarkers.value!!) { + markersId.add(id.id) + } + val index = markersId.indexOf(marker.id) + _waypointMarkers.value?.set(index,marker) + Log.i("MapsActivity", "changeWaypointMarker:${_waypointMarkers.value!!.get(index).position}") + execute() + } + + private fun markersToString(): String { + Log.i("MapsActivity","do1:") + val sb = StringBuilder() + Log.i("MapsActivity","do2:") + if (_waypointMarkers != null) { + Log.i("MapsActivity","do3:") + for (waypoint in _waypointMarkers.value!!) { +// sb.append(waypoint.lat.toString() + "," + waypoint.lng.toString() + "|") + Log.i("MapsActivity","waypointsString: ${waypoint.position.latitude.toString() + "," + waypoint.position.longitude.toString() + "|"}") + sb.append(waypoint.position.latitude.toString() + "," + waypoint.position.longitude.toString() + "|") + } + } + val waypointsString = sb.toString() +// waypointsString.drop(1) +// waypointsString.dropLast(2) +// waypointsString.replace("[", "").replace("]", "") + Log.i("MapsActivity","waypointsString: $waypointsString") + return waypointsString + } + + + + fun execute() { + viewModelScope.launch { + val waypointsString = markersToString() + Log.i("MapsActivity", "execute:${_waypoints.value.toString()}") + val result = DirectionsApiHelper().execute(getApplication(), + _origin.value, _dest.value, waypointsString + ) + Log.i("MapsActivity", "executed:${result.toString()}") + _directionsResult.value = result + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_add_trial_maps.xml b/app/src/main/res/layout/fragment_add_trial_maps.xml new file mode 100644 index 0000000..fb0c88d --- /dev/null +++ b/app/src/main/res/layout/fragment_add_trial_maps.xml @@ -0,0 +1,8 @@ + + \ No newline at end of file From c355f0b3a0426912b2eb25268bddaf6ac07203c2 Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Sat, 17 Sep 2022 23:30:06 +0900 Subject: [PATCH 08/99] =?UTF-8?q?DirectionAPI=E3=81=AE=E5=87=A6=E7=90=86?= =?UTF-8?q?=E3=82=92=E8=A1=8C=E3=81=86=E3=82=AF=E3=83=A9=E3=82=B9=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aroa/ui/addtrial/DirectionsApiHelper.kt | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/DirectionsApiHelper.kt diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/DirectionsApiHelper.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/DirectionsApiHelper.kt new file mode 100644 index 0000000..2846832 --- /dev/null +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/DirectionsApiHelper.kt @@ -0,0 +1,47 @@ +package jp.ac.okinawa_ct.nitoc_ict.aroa.ui.addtrial + +import android.content.Context +import androidx.annotation.Nullable +import com.google.maps.DirectionsApi +import com.google.maps.GeoApiContext +import com.google.maps.model.DirectionsResult +import com.google.maps.model.LatLng +import com.google.maps.model.TravelMode +import com.google.maps.model.Unit +import jp.ac.okinawa_ct.nitoc_ict.aroa.BuildConfig +import jp.ac.okinawa_ct.nitoc_ict.aroa.R +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import java.util.* + +class DirectionsApiHelper { + /** + * 経路APIを実行する. + * + * @param context コンテキスト + * @param origin 出発地点 + * @param destination 到着地点 + * @return 取得成功: [com.google.maps.model.DirectionsResult] 失敗: null + */ + @Nullable + suspend fun execute(context: Context, origin: LatLng?, destination: LatLng?, waypoints: String): DirectionsResult? { + return withContext(Dispatchers.IO) { + // Mapキーの取得. + val apiContext = GeoApiContext.Builder() + .apiKey(BuildConfig.API_KEY).build() + + // API実行. + kotlin.runCatching { + DirectionsApi + .newRequest(apiContext) + .mode(TravelMode.WALKING) + .units(Unit.METRIC) + .language(Locale.JAPAN.language) + .origin(origin) + .destination(destination) + .waypoints(waypoints) + .await() + }.getOrNull() + } + } +} \ No newline at end of file From e52fa2279f5e7f43f19b9b839dbb18abe6baec65 Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Sun, 18 Sep 2022 21:59:03 +0900 Subject: [PATCH 09/99] =?UTF-8?q?=E5=BE=AE=E4=BF=AE=E6=AD=A3=EF=BC=86?= =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aroa/ui/addtrial/AddTrialMapsFragment.kt | 26 +++++++------- .../aroa/ui/addtrial/AddTrialMapsViewModel.kt | 36 +++++-------------- 2 files changed, 22 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt index cf0c55d..166582d 100644 --- a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt @@ -24,13 +24,13 @@ class AddTrialMapsFragment : Fragment() { private const val POLYLINE_WIDTH = 12f } - private var map: GoogleMap? = null - private var polyline: Polyline? = null + private lateinit var map: GoogleMap + private lateinit var polyline: Polyline private val overview = 0 private lateinit var viewModel: AddTrialMapsViewModel private val callback = OnMapReadyCallback { googleMap -> - viewModel.execute() + viewModel.directionApiExecute() moveCamera() setMapLongClick(googleMap) setMarkerClick(googleMap) @@ -42,7 +42,7 @@ class AddTrialMapsFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View? { - val viewModel = ViewModelProvider(this).get(AddTrialMapsViewModel::class.java) + viewModel = ViewModelProvider(this).get(AddTrialMapsViewModel::class.java) return inflater.inflate(R.layout.fragment_add_trial_maps, container, false) } @@ -59,16 +59,17 @@ class AddTrialMapsFragment : Fragment() { }) } + //カメラを移動 private fun moveCamera() { // Add a marker in Sydney and move the camera - val okinawa = LatLng(26.387409,127.729753) - map?.apply { - addMarker(MarkerOptions().position(okinawa).title("Marker in Okinawa")) - // moveCamera(CameraUpdateFactory.newLatLng(tokyo)) - moveCamera(CameraUpdateFactory.newLatLngZoom(okinawa, ZOOM_SIZE)) + val origin = LatLng(viewModel.origin.value!!.lat, viewModel.origin.value!!.lng) + map.apply { + addMarker(MarkerOptions().position(origin).title("Marker in Origin")) + moveCamera(CameraUpdateFactory.newLatLngZoom(origin, ZOOM_SIZE)) } } + //マップをロングクリック時にマーカーを追加 private fun setMapLongClick(map: GoogleMap) { map.setOnMapLongClickListener{latLng -> val snippet = String.format( @@ -94,6 +95,7 @@ class AddTrialMapsFragment : Fragment() { } } + //マーカーをクリック時にそのマーカーを削除 private fun setMarkerClick(map: GoogleMap) { map.setOnMarkerClickListener{marker -> viewModel.removeWaypointMarker(marker) @@ -102,6 +104,7 @@ class AddTrialMapsFragment : Fragment() { } } + //マーカーをドラッグ時に、マーカーのLatLngを更新 private fun setOnMarkerDrag(map: GoogleMap) { map.setOnMarkerDragListener(object : GoogleMap.OnMarkerDragListener { private var start: com.google.maps.model.LatLng? = null @@ -111,7 +114,6 @@ class AddTrialMapsFragment : Fragment() { marker.position.let { start = com.google.maps.model.LatLng(it.latitude, it.longitude) } - Log.i("MapsActivity","StartMarker:${start.toString()}") } override fun onMarkerDrag(marker: Marker) { @@ -122,19 +124,17 @@ class AddTrialMapsFragment : Fragment() { marker.position.let { end = com.google.maps.model.LatLng(it.latitude, it.longitude) } - Log.i("MapsActivity","EndMarker:${end.toString()}") viewModel.changeWaypointMarker(marker) } }) } + //Polylineを更新 private fun updatePolyline(directionsResult: DirectionsResult?, googleMap: GoogleMap?) { googleMap ?: return directionsResult ?: return removePolyline() - Log.i("MapsActivity","doUpdatePolyline") addPolyline(directionsResult, googleMap) - Log.i("MapsActivity","didUpdatePolyline") } // 線を消す. diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt index 8d60aef..1dd80a0 100644 --- a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt @@ -30,13 +30,6 @@ class AddTrialMapsViewModel(application: Application) : AndroidViewModel(applica val waypointMarkers: LiveData> get() = _waypointMarkers - init { - _origin.value = LatLng(26.387409, 127.729753) - _dest.value = LatLng(26.387409, 127.729753) -// _dest.value = LatLng(26.52486985103984, 128.0300908585622) -// _waypoints.value?.add(LatLng(26.313224610295485, 127.79608257031921)) - } - fun setOrigin(lat: Double, lng: Double) { _origin.value = LatLng(lat,lng) } @@ -45,20 +38,19 @@ class AddTrialMapsViewModel(application: Application) : AndroidViewModel(applica _dest.value = LatLng(lat,lng) } - + //waypointを追加する fun addWaypointMarker(marker: Marker) { _waypointMarkers.value?.add(marker) - Log.i("MapsActivity", "addWaypointMarker:${_waypointMarkers.value.toString()}") - execute() + directionApiExecute() } + //waypointを削除する fun removeWaypointMarker(marker: Marker) { - Log.i("MapsActivity","removeMarkerLatLng:${marker.position}") _waypointMarkers.value?.remove(marker) - Log.i("MapsActivity", "removeWaypointMarker:${_waypointMarkers.value.toString()}") - execute() + directionApiExecute() } + //waypointの値を変更する(ドラッグ&ドロップ) fun changeWaypointMarker(marker: Marker) { val markersId = ArrayList() for (id in _waypointMarkers.value!!) { @@ -66,40 +58,30 @@ class AddTrialMapsViewModel(application: Application) : AndroidViewModel(applica } val index = markersId.indexOf(marker.id) _waypointMarkers.value?.set(index,marker) - Log.i("MapsActivity", "changeWaypointMarker:${_waypointMarkers.value!!.get(index).position}") - execute() + directionApiExecute() } + //Marker型のwaypointsをDirectionAPIにリクエストを送る用のString型に変更する private fun markersToString(): String { - Log.i("MapsActivity","do1:") val sb = StringBuilder() - Log.i("MapsActivity","do2:") if (_waypointMarkers != null) { - Log.i("MapsActivity","do3:") for (waypoint in _waypointMarkers.value!!) { // sb.append(waypoint.lat.toString() + "," + waypoint.lng.toString() + "|") - Log.i("MapsActivity","waypointsString: ${waypoint.position.latitude.toString() + "," + waypoint.position.longitude.toString() + "|"}") sb.append(waypoint.position.latitude.toString() + "," + waypoint.position.longitude.toString() + "|") } } val waypointsString = sb.toString() -// waypointsString.drop(1) -// waypointsString.dropLast(2) -// waypointsString.replace("[", "").replace("]", "") - Log.i("MapsActivity","waypointsString: $waypointsString") return waypointsString } - - fun execute() { + //DirectionAPIを実行 + fun directionApiExecute() { viewModelScope.launch { val waypointsString = markersToString() - Log.i("MapsActivity", "execute:${_waypoints.value.toString()}") val result = DirectionsApiHelper().execute(getApplication(), _origin.value, _dest.value, waypointsString ) - Log.i("MapsActivity", "executed:${result.toString()}") _directionsResult.value = result } } From b2115a7ecdc760b56998b11ff4872c1d6041207c Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Mon, 19 Sep 2022 02:36:18 +0900 Subject: [PATCH 10/99] =?UTF-8?q?build.gradle=E3=81=AE=E4=BE=9D=E5=AD=98?= =?UTF-8?q?=E9=96=A2=E4=BF=82=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=BE?= =?UTF-8?q?=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + build.gradle | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2b7dd00..17d969e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -60,6 +60,7 @@ dependencies { // Google Maps SDK implementation 'com.google.android.gms:play-services-maps:18.1.0' + implementation "com.google.maps:google-maps-services:0.2.11" // Firebase implementation platform('com.google.firebase:firebase-bom:30.2.0') // Firebase BoM diff --git a/build.gradle b/build.gradle index a5b0ffa..48e08e8 100644 --- a/build.gradle +++ b/build.gradle @@ -8,8 +8,8 @@ buildscript { } plugins { - id 'com.android.application' version '7.2.2' apply false - id 'com.android.library' version '7.2.2' apply false + id 'com.android.application' version '7.3.0' apply false + id 'com.android.library' version '7.3.0' apply false id 'org.jetbrains.kotlin.android' version '1.7.10' apply false id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin' version '2.0.1' apply false } From 107a0899df1016abb8469a861528618f644a2123 Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Mon, 19 Sep 2022 02:44:46 +0900 Subject: [PATCH 11/99] =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E3=81=97=E5=BF=98?= =?UTF-8?q?=E3=82=8C=E3=81=A6=E3=81=84=E3=81=9Fbuild.gradle=E3=81=AE?= =?UTF-8?q?=E4=BE=9D=E5=AD=98=E9=96=A2=E4=BF=82=E3=82=92=E8=BF=BD=E5=8A=A0?= =?UTF-8?q?=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/app/build.gradle b/app/build.gradle index 17d969e..116d205 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -61,6 +61,7 @@ dependencies { // Google Maps SDK implementation 'com.google.android.gms:play-services-maps:18.1.0' implementation "com.google.maps:google-maps-services:0.2.11" + implementation 'com.google.maps.android:android-maps-utils:2.2.0' // Firebase implementation platform('com.google.firebase:firebase-bom:30.2.0') // Firebase BoM From 4c27e6f5a8b614bbc263c48fc692e1f9d940af1c Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Tue, 20 Sep 2022 17:07:52 +0900 Subject: [PATCH 12/99] =?UTF-8?q?DirectionsApiHelper.kt=E3=81=AEimport?= =?UTF-8?q?=E3=82=92=E6=9C=80=E9=81=A9=E5=8C=96=E3=81=97=E3=81=BE=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../okinawa_ct/nitoc_ict/aroa/ui/addtrial/DirectionsApiHelper.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/DirectionsApiHelper.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/DirectionsApiHelper.kt index 2846832..03dbaad 100644 --- a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/DirectionsApiHelper.kt +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/DirectionsApiHelper.kt @@ -9,7 +9,6 @@ import com.google.maps.model.LatLng import com.google.maps.model.TravelMode import com.google.maps.model.Unit import jp.ac.okinawa_ct.nitoc_ict.aroa.BuildConfig -import jp.ac.okinawa_ct.nitoc_ict.aroa.R import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.util.* From 381f0af36e98f30d1cbd9a6c7d0f81701a1879b5 Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Sat, 24 Sep 2022 20:36:40 +0900 Subject: [PATCH 13/99] =?UTF-8?q?AddTrialMapsViewModel.kt=E3=81=A7?= =?UTF-8?q?=E3=83=AA=E3=83=9D=E3=82=B8=E3=83=88=E3=83=AA=E3=81=AEcreatTria?= =?UTF-8?q?l=E3=83=A1=E3=82=BD=E3=83=83=E3=83=89=E3=82=92=E5=91=BC?= =?UTF-8?q?=E3=81=B3=E5=87=BA=E3=81=99=E3=82=88=E3=81=86=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aroa/ui/addtrial/AddTrialMapsViewModel.kt | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt index 1dd80a0..72dd0a4 100644 --- a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt @@ -1,29 +1,31 @@ package jp.ac.okinawa_ct.nitoc_ict.aroa.ui.addtrial import android.app.Application -import android.util.Log -import androidx.lifecycle.* -import com.google.maps.model.LatLng +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope import com.google.android.gms.maps.model.Marker +import com.google.maps.android.PolyUtil import com.google.maps.model.DirectionsResult +import com.google.maps.model.LatLng +import jp.ac.okinawa_ct.nitoc_ict.aroa.data.dto.Trial +import jp.ac.okinawa_ct.nitoc_ict.aroa.data.repository.TrialRepositoryDummy import kotlinx.coroutines.launch -import java.lang.StringBuilder +import jp.ac.okinawa_ct.nitoc_ict.aroa.data.dto.Result as Result class AddTrialMapsViewModel(application: Application) : AndroidViewModel(application) { private val _directionsResult = MutableLiveData() val directionsResult: LiveData = _directionsResult + private val trialRepositoryDummy = TrialRepositoryDummy() + private val _origin = MutableLiveData() val origin: LiveData get() = _origin private val _dest = MutableLiveData() val dest: LiveData get() = _dest - private val _waypoints = MutableLiveData>().apply { - value = ArrayList() - } - val waypoints: LiveData> get() = _waypoints - private val _waypointMarkers = MutableLiveData>().apply { value = ArrayList() } @@ -38,6 +40,11 @@ class AddTrialMapsViewModel(application: Application) : AndroidViewModel(applica _dest.value = LatLng(lat,lng) } + init { + _origin.value = LatLng(26.387409, 127.729753) + _dest.value = LatLng(26.387409, 127.729753) + } + //waypointを追加する fun addWaypointMarker(marker: Marker) { _waypointMarkers.value?.add(marker) @@ -85,4 +92,22 @@ class AddTrialMapsViewModel(application: Application) : AndroidViewModel(applica _directionsResult.value = result } } + + fun createNewTrial() { + val trialCourse = PolyUtil.decode(directionsResult.value!!.routes[0].overviewPolyline.encodedPath) + val trial = Trial.Marathon("","",trialCourse[0],trialCourse,) + viewModelScope.launch { + trialRepositoryDummy.createTrial(trial).collect{ + when(it) { + is Result.Loading -> "Loading" + is Result.Success -> { + //navigationを実装 + } + is Result.Error -> { + + } + } + } + } + } } \ No newline at end of file From 660a6e3b248688c5b7cac69c1f790acbe264f3b0 Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Sat, 1 Oct 2022 18:07:31 +0900 Subject: [PATCH 14/99] =?UTF-8?q?activity=5Fmain.xml=E3=81=AEpaddingTop?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_main.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index df23f2e..39d13e9 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,8 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/container" android:layout_width="match_parent" - android:layout_height="match_parent" - android:paddingTop="?attr/actionBarSize"> + android:layout_height="match_parent"> Date: Sat, 1 Oct 2022 18:08:43 +0900 Subject: [PATCH 15/99] =?UTF-8?q?Trial=E3=81=AEorigin=E3=82=92=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=81=99=E3=82=8BAddTrialOriginFragment=E3=81=A8ViewM?= =?UTF-8?q?odel=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=BE=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/addtrial/AddTrialOriginFragment.kt | 147 ++++++++++++++++++ .../ui/addtrial/AddTrialOriginViewModel.kt | 33 ++++ 2 files changed, 180 insertions(+) create mode 100644 app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialOriginFragment.kt create mode 100644 app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialOriginViewModel.kt diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialOriginFragment.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialOriginFragment.kt new file mode 100644 index 0000000..61a2548 --- /dev/null +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialOriginFragment.kt @@ -0,0 +1,147 @@ +package jp.ac.okinawa_ct.nitoc_ict.aroa.ui.addtrial + +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import androidx.navigation.fragment.findNavController +import com.google.android.gms.maps.CameraUpdateFactory +import com.google.android.gms.maps.GoogleMap +import com.google.android.gms.maps.OnMapReadyCallback +import com.google.android.gms.maps.SupportMapFragment +import com.google.android.gms.maps.model.LatLng +import com.google.android.gms.maps.model.Marker +import com.google.android.gms.maps.model.MarkerOptions +import jp.ac.okinawa_ct.nitoc_ict.aroa.R +import jp.ac.okinawa_ct.nitoc_ict.aroa.databinding.FragmentAddTrialOriginBinding +import java.util.* + +class AddTrialOriginFragment : Fragment() { + + companion object { + private const val ZOOM_SIZE = 14f + } + + private var map: GoogleMap? = null + private lateinit var viewModel: AddTrialOriginViewModel + + private lateinit var _binding: FragmentAddTrialOriginBinding + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding + + private var currentMarker: Marker? = null + + private val callback = OnMapReadyCallback { googleMap -> + map = googleMap + moveCamera() + setMapLongClick(googleMap) + setMarkerClick(googleMap) + setOnMarkerDrag(googleMap) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentAddTrialOriginBinding.inflate(inflater,container, false) + viewModel = ViewModelProvider(this).get(AddTrialOriginViewModel::class.java) + binding.nextButton.setOnClickListener { viewModel.navStart() } + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment? + mapFragment?.getMapAsync(callback) + observeLiveData() + } + + private fun observeLiveData() { + viewModel.navFrag.observe(viewLifecycleOwner, androidx.lifecycle.Observer { + if (it == true) { + Log.i("originValue",viewModel.origin.value.toString()) + val action = + AddTrialOriginFragmentDirections + .actionNavigationAddTrialOriginToNavigationAddTrialDest( + LatLng(viewModel.origin.value!!.latitude,viewModel.origin.value!!.longitude)) + this.findNavController().navigate(action) + viewModel.navCompleted() + } + }) + } + + //カメラを移動 + private fun moveCamera() { + // Add a marker in Sydney and move the camera + val okinawa = LatLng(26.39987724386553, 127.74766655445417) + map?.apply { + moveCamera(CameraUpdateFactory.newLatLngZoom(okinawa, ZOOM_SIZE)) + } + } + + //マップをロングクリック時にマーカーを追加 + private fun setMapLongClick(map: GoogleMap) { + map.setOnMapLongClickListener{latLng -> + val snippet = String.format( + Locale.getDefault(), + "Lat: %1$.5f, Long: %2$.5f", + latLng.latitude, + latLng.longitude + ) + + map.clear() + + val marker = map.addMarker( + MarkerOptions() + .position(latLng) + .title("drop") + .snippet(snippet) + .draggable(true) + ) + + if (marker != null) { + viewModel.setOrigin(marker.position) + } + } + } + + //マーカーをクリック時にそのマーカーを削除 + private fun setMarkerClick(map: GoogleMap) { + map.setOnMarkerClickListener{marker -> + viewModel.removeOrigin() + marker.remove() + return@setOnMarkerClickListener true + } + } + + //マーカーをドラッグ時に、マーカーのLatLngを更新 + private fun setOnMarkerDrag(map: GoogleMap) { + map.setOnMarkerDragListener(object : GoogleMap.OnMarkerDragListener { + private var start: com.google.maps.model.LatLng? = null + private var end: com.google.maps.model.LatLng? = null + + override fun onMarkerDragStart(marker: Marker) { + marker.position.let { start = + com.google.maps.model.LatLng(it.latitude, it.longitude) + } + } + + override fun onMarkerDrag(marker: Marker) { + // Do Nothing. + } + + override fun onMarkerDragEnd(marker: Marker) { + marker.position.let { end = + com.google.maps.model.LatLng(it.latitude, it.longitude) + } + viewModel.setOrigin(marker.position) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialOriginViewModel.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialOriginViewModel.kt new file mode 100644 index 0000000..4eec909 --- /dev/null +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialOriginViewModel.kt @@ -0,0 +1,33 @@ +package jp.ac.okinawa_ct.nitoc_ict.aroa.ui.addtrial + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import com.google.android.gms.maps.model.LatLng + +class AddTrialOriginViewModel(application: Application) : AndroidViewModel(application) { + private val _origin = MutableLiveData() + val origin: LiveData get() = _origin + + private val _navFrag = MutableLiveData() + val navFrag: LiveData get() = _navFrag + + fun setOrigin(latLng: LatLng) { + _origin.value = latLng + } + + fun removeOrigin() { + if (_origin != null) { +// _origin.value = null + } + } + + fun navStart() { + _navFrag.value = true + } + + fun navCompleted() { + _navFrag.value = false + } +} \ No newline at end of file From 78b8a16162ed64a0b9d64809a1a634f2fa6ed72e Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Sat, 1 Oct 2022 18:42:10 +0900 Subject: [PATCH 16/99] =?UTF-8?q?Trial=E3=81=AEdest=E3=82=92=E8=A8=AD?= =?UTF-8?q?=E5=AE=9A=E3=81=99=E3=82=8BAddTrialDestFragment=E3=81=A8ViewMod?= =?UTF-8?q?el=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=BE=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aroa/ui/addtrial/AddTrialDestFragment.kt | 185 ++++++++++++++++++ .../aroa/ui/addtrial/AddTrialDestViewModel.kt | 62 ++++++ 2 files changed, 247 insertions(+) create mode 100644 app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialDestFragment.kt create mode 100644 app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialDestViewModel.kt diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialDestFragment.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialDestFragment.kt new file mode 100644 index 0000000..8a2b6a1 --- /dev/null +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialDestFragment.kt @@ -0,0 +1,185 @@ +package jp.ac.okinawa_ct.nitoc_ict.aroa.ui.addtrial + +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import androidx.navigation.fragment.findNavController +import com.google.android.gms.maps.CameraUpdateFactory +import com.google.android.gms.maps.GoogleMap +import com.google.android.gms.maps.OnMapReadyCallback +import com.google.android.gms.maps.SupportMapFragment +import com.google.android.gms.maps.model.* +import com.google.maps.android.PolyUtil +import com.google.maps.model.DirectionsResult +import jp.ac.okinawa_ct.nitoc_ict.aroa.R +import jp.ac.okinawa_ct.nitoc_ict.aroa.databinding.FragmentAddTrialDestBinding +import java.util.* + +class AddTrialDestFragment : Fragment() { + + companion object { + private const val ZOOM_SIZE = 14f + private const val POLYLINE_WIDTH = 12f + } + + private var map: GoogleMap? = null + private lateinit var viewModel: AddTrialDestViewModel + private var polyline: Polyline? = null + + private lateinit var _binding: FragmentAddTrialDestBinding + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding + + private val callback = OnMapReadyCallback { googleMap -> + map = googleMap + moveCamera() + setMapLongClick(googleMap) + setMarkerClick(googleMap) + setOnMarkerDrag(googleMap) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentAddTrialDestBinding.inflate(inflater,container, false) + val args = AddTrialDestFragmentArgs.fromBundle(requireArguments()) + viewModel = ViewModelProvider(this).get(AddTrialDestViewModel::class.java) + viewModel.setOrigin(args.originLatLng) + binding.nextButton.setOnClickListener { viewModel.navStart() } + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val mapFragment = childFragmentManager.findFragmentById(R.id.map) as SupportMapFragment? + mapFragment?.getMapAsync(callback) + observeLiveData() + } + + private fun observeLiveData() { + viewModel.directionsResult.observe(viewLifecycleOwner, androidx.lifecycle.Observer{ + Log.i("DestFragment","directionsResult:${it.toString()}") + updatePolyline(it, map) + }) + + viewModel.navFrag.observe(viewLifecycleOwner, androidx.lifecycle.Observer { + if (it) { + val action = AddTrialDestFragmentDirections + .actionNavigationAddTrialDestToNavigationAddTrialMaps( + LatLng(viewModel.origin.value!!.latitude,viewModel.origin.value!!.longitude), + LatLng(viewModel.dest.value!!.latitude,viewModel.dest.value!!.longitude)) + this.findNavController().navigate(action) + viewModel.navCompleted() + } + }) + } + + //カメラを移動 + private fun moveCamera() { + // Add a marker in Sydney and move the camera + val origin = LatLng(viewModel.origin.value!!.latitude,viewModel.origin.value!!.longitude) + map?.apply { + addMarker(MarkerOptions().position(origin).title("Marker in Origin")) + moveCamera(CameraUpdateFactory.newLatLngZoom(origin, ZOOM_SIZE)) + } + } + + //マップをロングクリック時にマーカーを追加 + private fun setMapLongClick(map: GoogleMap) { + map.setOnMapLongClickListener{latLng -> + val snippet = String.format( + Locale.getDefault(), + "Lat: %1$.5f, Long: %2$.5f", + latLng.latitude, + latLng.longitude + ) + + map.clear() + + map.addMarker(MarkerOptions() + .position(LatLng(viewModel.origin.value!!.latitude,viewModel.origin.value!!.longitude)) + .title("Marker in Origin")) + + val marker = map.addMarker( + MarkerOptions() + .position(latLng) + .title("drop") + .snippet(snippet) + .draggable(true) + ) + + + if (marker != null) { + Log.i("DestFragment","addMarker:${marker.position.toString()}") + viewModel.setDest(marker.position) + } + } + } + + //マーカーをクリック時にそのマーカーを削除 + private fun setMarkerClick(map: GoogleMap) { + map.setOnMarkerClickListener{marker -> + viewModel.removeDest() + marker.remove() + return@setOnMarkerClickListener true + } + } + + //マーカーをドラッグ時に、マーカーのLatLngを更新 + private fun setOnMarkerDrag(map: GoogleMap) { + map.setOnMarkerDragListener(object : GoogleMap.OnMarkerDragListener { + private var start: com.google.maps.model.LatLng? = null + private var end: com.google.maps.model.LatLng? = null + + override fun onMarkerDragStart(marker: Marker) { + marker.position.let { start = + com.google.maps.model.LatLng(it.latitude, it.longitude) + } + } + + override fun onMarkerDrag(marker: Marker) { + // Do Nothing. + } + + override fun onMarkerDragEnd(marker: Marker) { + marker.position.let { end = + com.google.maps.model.LatLng(it.latitude, it.longitude) + } + viewModel.setDest(marker.position) + } + }) + } + + //Polylineを更新 + private fun updatePolyline(directionsResult: DirectionsResult?, googleMap: GoogleMap?) { + googleMap ?: return + directionsResult ?: return + removePolyline() + addPolyline(directionsResult, googleMap) + } + + // 線を消す. + private fun removePolyline() { + if (map != null && polyline != null) { + polyline?.remove() + } + } + + // 線を引く + private fun addPolyline(directionsResult: DirectionsResult, map: GoogleMap) { + val polylineOptions = PolylineOptions() + polylineOptions.width(AddTrialDestFragment.POLYLINE_WIDTH) + // ARGB32bit形式. + polylineOptions.color(R.color.map_polyline_stroke) + val decodedPath = PolyUtil.decode(directionsResult.routes[0].overviewPolyline.encodedPath) + polyline = map.addPolyline(polylineOptions.addAll(decodedPath)) + } +} \ No newline at end of file diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialDestViewModel.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialDestViewModel.kt new file mode 100644 index 0000000..1d47748 --- /dev/null +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialDestViewModel.kt @@ -0,0 +1,62 @@ +package jp.ac.okinawa_ct.nitoc_ict.aroa.ui.addtrial + +import android.app.Application +import android.util.Log +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.viewModelScope +import com.google.android.gms.maps.model.LatLng +import com.google.maps.model.DirectionsResult +import com.google.maps.model.LatLng as MapsLatLng +import kotlinx.coroutines.launch + +class AddTrialDestViewModel(application: Application) : AndroidViewModel(application) { + private val _directionsResult = MutableLiveData() + val directionsResult: LiveData = _directionsResult + + private val _origin = MutableLiveData() + val origin: LiveData get() = _origin + + private val _dest = MutableLiveData() + val dest: LiveData get() = _dest + + private val _navFrag = MutableLiveData() + val navFrag: LiveData get() = _navFrag + + fun setOrigin(latLng: LatLng) { + _origin.value = latLng + } + + fun setDest(latLng: LatLng) { + Log.i("DestViewModel","setDest:${latLng.toString()}") + _dest.value = latLng + directionApiExecute() + } + + fun removeDest() { + if (_dest != null) { +// _dest.value = null + } + } + + fun navStart() { + _navFrag.value = true + } + + fun navCompleted() { + _navFrag.value = false + } + + //DirectionAPIを実行 + fun directionApiExecute() { + viewModelScope.launch { + val result = DirectionsApiHelper().onlyOriginDestExecute( + MapsLatLng(_origin.value!!.latitude, _origin.value!!.longitude), + MapsLatLng(_dest.value!!.latitude, _dest.value!!.longitude) + ) + Log.i("DestViewModel","result:${result.toString()}") + _directionsResult.value = result + } + } +} \ No newline at end of file From 1a7ab69dbb8e089e9384cdf437b3e5026faad720 Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Sat, 1 Oct 2022 18:46:06 +0900 Subject: [PATCH 17/99] =?UTF-8?q?AddTrialFragment.kt=E3=81=A8AddTrialViewM?= =?UTF-8?q?odel.kt=E3=82=92=E3=83=88=E3=83=A9=E3=82=A4=E3=82=A2=E3=83=AB?= =?UTF-8?q?=E5=88=B6=E4=BD=9C=E7=94=BB=E9=9D=A2=E3=81=AB=E9=81=B7=E7=A7=BB?= =?UTF-8?q?=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=83=9C?= =?UTF-8?q?=E3=82=BF=E3=83=B3=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=BE?= =?UTF-8?q?=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aroa/ui/addtrial/AddTrialFragment.kt | 30 +++++++++++-------- .../aroa/ui/addtrial/AddTrialViewModel.kt | 11 +++++-- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialFragment.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialFragment.kt index 3e88349..d4fd0d0 100644 --- a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialFragment.kt +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialFragment.kt @@ -4,39 +4,43 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.TextView import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider +import androidx.navigation.fragment.findNavController import jp.ac.okinawa_ct.nitoc_ict.aroa.databinding.FragmentAddTrialBinding class AddTrialFragment : Fragment() { - private var _binding: FragmentAddTrialBinding? = null - // This property is only valid between onCreateView and // onDestroyView. - private val binding get() = _binding!! + private lateinit var binding: FragmentAddTrialBinding override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { - val dashboardViewModel = + val viewModel = ViewModelProvider(this).get(AddTrialViewModel::class.java) +// binding = FragmentAddTrialBinding.inflate(inflater, container, false) + binding = FragmentAddTrialBinding.inflate(layoutInflater) + + viewModel.navFrag.observe(viewLifecycleOwner, Observer { + if (it == true) { + this.findNavController().navigate( + AddTrialFragmentDirections.actionNavigationAddTrialToNavigationAddTrialOrigin()) + viewModel.navCompleted() + } + }) - _binding = FragmentAddTrialBinding.inflate(inflater, container, false) - val root: View = binding.root + binding.startButton.setOnClickListener { viewModel.navStart() } - val textView: TextView = binding.textAddTrial - dashboardViewModel.text.observe(viewLifecycleOwner) { - textView.text = it - } - return root + return binding.root } override fun onDestroyView() { super.onDestroyView() - _binding = null +// binding = null } } \ No newline at end of file diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialViewModel.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialViewModel.kt index dc12d43..3b77a50 100644 --- a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialViewModel.kt +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialViewModel.kt @@ -5,9 +5,14 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel class AddTrialViewModel : ViewModel() { + private val _navFrag = MutableLiveData() + val navFrag: LiveData get() = _navFrag - private val _text = MutableLiveData().apply { - value = "This is addTrial Fragment" + fun navStart() { + _navFrag.value = true + } + + fun navCompleted() { + _navFrag.value = null } - val text: LiveData = _text } \ No newline at end of file From 4eaf762a9e94604e0f178e5ac106a30427a2046c Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Sat, 1 Oct 2022 18:48:03 +0900 Subject: [PATCH 18/99] =?UTF-8?q?AddTrialMapsFragment.kt=E3=81=A8AddTrialM?= =?UTF-8?q?apsViewModel.kt=E3=82=92=E3=83=88=E3=83=A9=E3=82=A4=E3=82=A2?= =?UTF-8?q?=E3=83=AB=E3=81=AE=E3=83=AA=E3=83=9D=E3=82=B8=E3=83=88=E3=83=AA?= =?UTF-8?q?=E3=81=B8=E3=81=AE=E8=BF=BD=E5=8A=A0=E3=80=81=E3=82=B9=E3=82=BF?= =?UTF-8?q?=E3=83=BC=E3=83=88=E7=94=BB=E9=9D=A2=E3=81=B8=E3=81=AE=E9=81=B7?= =?UTF-8?q?=E7=A7=BB=E3=81=8C=E5=8F=AF=E8=83=BD=E3=81=AB=E3=81=97=E3=81=BE?= =?UTF-8?q?=E3=81=97=E3=81=9F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aroa/ui/addtrial/AddTrialMapsFragment.kt | 35 ++++++++++++++++--- .../aroa/ui/addtrial/AddTrialMapsViewModel.kt | 31 ++++++++++------ 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt index 166582d..2bb4325 100644 --- a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsFragment.kt @@ -8,6 +8,7 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProvider +import androidx.navigation.fragment.findNavController import com.google.android.gms.maps.CameraUpdateFactory import com.google.android.gms.maps.GoogleMap import com.google.android.gms.maps.OnMapReadyCallback @@ -16,6 +17,7 @@ import com.google.android.gms.maps.model.* import com.google.maps.android.PolyUtil import com.google.maps.model.DirectionsResult import jp.ac.okinawa_ct.nitoc_ict.aroa.R +import jp.ac.okinawa_ct.nitoc_ict.aroa.databinding.FragmentAddTrialMapsBinding import java.util.* class AddTrialMapsFragment : Fragment() { @@ -24,12 +26,19 @@ class AddTrialMapsFragment : Fragment() { private const val POLYLINE_WIDTH = 12f } - private lateinit var map: GoogleMap - private lateinit var polyline: Polyline + private var map: GoogleMap? = null + private var polyline: Polyline? = null private val overview = 0 private lateinit var viewModel: AddTrialMapsViewModel + private lateinit var _binding: FragmentAddTrialMapsBinding + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding + private val callback = OnMapReadyCallback { googleMap -> + map = googleMap viewModel.directionApiExecute() moveCamera() setMapLongClick(googleMap) @@ -42,8 +51,13 @@ class AddTrialMapsFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View? { + _binding = FragmentAddTrialMapsBinding.inflate(inflater,container, false) viewModel = ViewModelProvider(this).get(AddTrialMapsViewModel::class.java) - return inflater.inflate(R.layout.fragment_add_trial_maps, container, false) + val args = AddTrialMapsFragmentArgs.fromBundle(requireArguments()) + viewModel.setOrigin(args.originLatLng) + viewModel.setDest(args.destLatLng) + binding.saveButton.setOnClickListener { viewModel.createNewTrial() } + return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -57,14 +71,24 @@ class AddTrialMapsFragment : Fragment() { viewModel.directionsResult.observe(viewLifecycleOwner, Observer{ updatePolyline(it, map) }) + + viewModel.navFrag.observe(viewLifecycleOwner, Observer { + if (it) { + val action = AddTrialMapsFragmentDirections.actionNavigationAddTrialMapsToNavigationAddTrial() + this.findNavController().navigate(action) + viewModel.navCompleted() + } + }) } //カメラを移動 private fun moveCamera() { // Add a marker in Sydney and move the camera - val origin = LatLng(viewModel.origin.value!!.lat, viewModel.origin.value!!.lng) - map.apply { + val origin = LatLng(viewModel.origin.value!!.latitude, viewModel.origin.value!!.longitude) + val dest = LatLng(viewModel.dest.value!!.latitude, viewModel.dest.value!!.longitude) + map?.apply { addMarker(MarkerOptions().position(origin).title("Marker in Origin")) + addMarker(MarkerOptions().position(dest).title("Marker in Dest")) moveCamera(CameraUpdateFactory.newLatLngZoom(origin, ZOOM_SIZE)) } } @@ -87,6 +111,7 @@ class AddTrialMapsFragment : Fragment() { .draggable(true) ) + Log.i("MapsActivity","doAddMarker") if (marker != null) { viewModel.addWaypointMarker(marker) diff --git a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt index 72dd0a4..cf9a4b7 100644 --- a/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt +++ b/app/src/main/java/jp/ac/okinawa_ct/nitoc_ict/aroa/ui/addtrial/AddTrialMapsViewModel.kt @@ -5,10 +5,11 @@ import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope +import com.google.android.gms.maps.model.LatLng import com.google.android.gms.maps.model.Marker import com.google.maps.android.PolyUtil import com.google.maps.model.DirectionsResult -import com.google.maps.model.LatLng +import com.google.maps.model.LatLng as MapsLatLng import jp.ac.okinawa_ct.nitoc_ict.aroa.data.dto.Trial import jp.ac.okinawa_ct.nitoc_ict.aroa.data.repository.TrialRepositoryDummy import kotlinx.coroutines.launch @@ -20,6 +21,9 @@ class AddTrialMapsViewModel(application: Application) : AndroidViewModel(applica private val trialRepositoryDummy = TrialRepositoryDummy() + private val _navFrag = MutableLiveData() + val navFrag: LiveData get() = _navFrag + private val _origin = MutableLiveData() val origin: LiveData get() = _origin @@ -32,17 +36,17 @@ class AddTrialMapsViewModel(application: Application) : AndroidViewModel(applica val waypointMarkers: LiveData> get() = _waypointMarkers - fun setOrigin(lat: Double, lng: Double) { - _origin.value = LatLng(lat,lng) + init { + _origin.value = LatLng(26.387409, 127.729753) + _dest.value = LatLng(26.387409, 127.729753) } - fun setDest(lat: Double, lng: Double) { - _dest.value = LatLng(lat,lng) + fun setOrigin(latLng: LatLng) { + _origin.value = latLng } - init { - _origin.value = LatLng(26.387409, 127.729753) - _dest.value = LatLng(26.387409, 127.729753) + fun setDest(latLng: LatLng) { + _dest.value = latLng } //waypointを追加する @@ -86,8 +90,10 @@ class AddTrialMapsViewModel(application: Application) : AndroidViewModel(applica fun directionApiExecute() { viewModelScope.launch { val waypointsString = markersToString() - val result = DirectionsApiHelper().execute(getApplication(), - _origin.value, _dest.value, waypointsString + val result = DirectionsApiHelper().execute( + MapsLatLng(_origin.value!!.latitude, _origin.value!!.longitude), + MapsLatLng(_dest.value!!.latitude, _dest.value!!.longitude), + waypointsString ) _directionsResult.value = result } @@ -102,6 +108,7 @@ class AddTrialMapsViewModel(application: Application) : AndroidViewModel(applica is Result.Loading -> "Loading" is Result.Success -> { //navigationを実装 + _navFrag.value = true } is Result.Error -> { @@ -110,4 +117,8 @@ class AddTrialMapsViewModel(application: Application) : AndroidViewModel(applica } } } + + fun navCompleted() { + _navFrag.value = false + } } \ No newline at end of file From 6414561fd7b2888725bfebc25ea01b732acbd780 Mon Sep 17 00:00:00 2001 From: scitheAX <80904538+scitheAX@users.noreply.github.com> Date: Sat, 1 Oct 2022 18:49:25 +0900 Subject: [PATCH 19/99] =?UTF-8?q?AddTrialOriginFragment=E3=81=A8AddTrialDe?= =?UTF-8?q?stFragment=E3=81=AElayout=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../res/layout/fragment_add_trial_dest.xml | 29 +++++++++++++++++++ .../res/layout/fragment_add_trial_origin.xml | 29 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 app/src/main/res/layout/fragment_add_trial_dest.xml create mode 100644 app/src/main/res/layout/fragment_add_trial_origin.xml diff --git a/app/src/main/res/layout/fragment_add_trial_dest.xml b/app/src/main/res/layout/fragment_add_trial_dest.xml new file mode 100644 index 0000000..a749858 --- /dev/null +++ b/app/src/main/res/layout/fragment_add_trial_dest.xml @@ -0,0 +1,29 @@ + + + + + + + +