diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7804d9a..0fdc512 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,7 +21,7 @@ android:theme="@style/Theme.Geocaching" tools:targetApi="31" > diff --git a/app/src/main/java/uca/baptistearthur/geocaching/Profile.kt b/app/src/main/java/uca/baptistearthur/geocaching/Profile.kt deleted file mode 100644 index 5cca43b..0000000 --- a/app/src/main/java/uca/baptistearthur/geocaching/Profile.kt +++ /dev/null @@ -1,59 +0,0 @@ -package uca.baptistearthur.geocaching - -import android.os.Bundle -import androidx.fragment.app.Fragment -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup - -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [Profile.newInstance] factory method to - * create an instance of this fragment. - */ -class Profile : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } - } - - override fun onCreateView( - inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? - ): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_profile, container, false) - } - - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment Profile. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - Profile().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/uca/baptistearthur/geocaching/model/Place.kt b/app/src/main/java/uca/baptistearthur/geocaching/model/Place.kt new file mode 100644 index 0000000..6904b27 --- /dev/null +++ b/app/src/main/java/uca/baptistearthur/geocaching/model/Place.kt @@ -0,0 +1,6 @@ +package uca.baptistearthur.geocaching.model + +data class Place( + val latitude : Long, + val longitude : Long +) diff --git a/app/src/main/java/uca/baptistearthur/geocaching/model/RoadTrip.kt b/app/src/main/java/uca/baptistearthur/geocaching/model/RoadTrip.kt new file mode 100644 index 0000000..cbabb74 --- /dev/null +++ b/app/src/main/java/uca/baptistearthur/geocaching/model/RoadTrip.kt @@ -0,0 +1,14 @@ +package uca.baptistearthur.geocaching.model + +import java.util.Date + +class RoadTrip( + val name: String, + val date: Date, + val places: ArrayList +){ + + fun addPlaceToRoadTripList(place: Place) = places.add(place) + fun addPlaceToRoadTripList(latitude: Long, longitude: Long) = places.add(Place(latitude, longitude)) + +} \ No newline at end of file diff --git a/app/src/main/java/uca/baptistearthur/geocaching/MainWindow.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/activity/MainWindow.kt similarity index 68% rename from app/src/main/java/uca/baptistearthur/geocaching/MainWindow.kt rename to app/src/main/java/uca/baptistearthur/geocaching/ui/activity/MainWindow.kt index 0774e7a..ceb0f0c 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/MainWindow.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/activity/MainWindow.kt @@ -1,14 +1,18 @@ -package uca.baptistearthur.geocaching +package uca.baptistearthur.geocaching.ui.activity import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import com.google.android.material.bottomnavigation.BottomNavigationView -import org.osmdroid.config.Configuration +import uca.baptistearthur.geocaching.R +import uca.baptistearthur.geocaching.ui.fragment.Map + class MainWindow: AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { + val map = Map(); + super.onCreate(savedInstanceState) setContentView(R.layout.main_window) @@ -17,16 +21,16 @@ class MainWindow: AppCompatActivity() { navigation.selectedItemId= R.id.map navigation.setOnItemSelectedListener { when (it.itemId) { - R.id.profile -> { - loadFragment(Profile()) - true - } +// R.id.profile -> { +// loadFragment(Profile()) +// true +// } R.id.map -> { - loadFragment(Map()) + loadFragment(map) true } - R.id.list -> { - loadFragment(List()) + R.id.roadTrip -> { + loadFragment(uca.baptistearthur.geocaching.ui.fragment.RoadTrip()) true } else -> false diff --git a/app/src/main/java/uca/baptistearthur/geocaching/Map.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/Map.kt similarity index 79% rename from app/src/main/java/uca/baptistearthur/geocaching/Map.kt rename to app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/Map.kt index 5d66bc5..b93786c 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/Map.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/Map.kt @@ -1,4 +1,4 @@ -package uca.baptistearthur.geocaching +package uca.baptistearthur.geocaching.ui.fragment import android.content.Context import android.content.pm.PackageManager @@ -14,18 +14,22 @@ import org.osmdroid.util.GeoPoint import org.osmdroid.views.MapView import org.osmdroid.views.overlay.ScaleBarOverlay import android.Manifest.permission.ACCESS_FINE_LOCATION -import android.hardware.SensorManager import android.location.Location import android.location.LocationListener +import android.util.Log +import android.widget.ProgressBar import androidx.activity.result.contract.ActivityResultContracts import org.osmdroid.views.overlay.compass.CompassOverlay import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay - +import uca.baptistearthur.geocaching.R +import uca.baptistearthur.geocaching.ui.overlay.RecenterOverlay class Map : Fragment() { private lateinit var map : MapView + private lateinit var spinner: ProgressBar; + private lateinit var locationManager: LocationManager; val defaultPoint = GeoPoint(48.8583, 2.2944) var isMapCentered = false; val locationListener = object : LocationListener { @@ -33,12 +37,15 @@ class Map : Fragment() { val geoPoint = GeoPoint(location.latitude, location.longitude) if(!isMapCentered){ map.controller.setCenter(geoPoint) + spinner.visibility=View.GONE; isMapCentered=true; } map.invalidate() } } + + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Configuration.getInstance().userAgentValue = "Geocaching" @@ -46,11 +53,15 @@ class Map : Fragment() { } val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) - { map.controller.setCenter(defaultPoint); } + { map.controller.setCenter(defaultPoint) } private fun configureMap(view: View){ + Log.d("GeoMap", "MAP CONFIGURE") map = view.findViewById(R.id.mapView) - map.controller.setZoom(20.0); + spinner = view.findViewById(R.id.mapLoading); + spinner.visibility=View.VISIBLE; + map.minZoomLevel = 10.0 + map.controller.setZoom(21.0); if (ContextCompat.checkSelfPermission(requireActivity(), ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissionLauncher.launch(ACCESS_FINE_LOCATION) } @@ -65,7 +76,6 @@ class Map : Fragment() { map.overlays.add(scaleBarOverlay) val myLocation = MyLocationNewOverlay(GpsMyLocationProvider(context), map) - myLocation.enableFollowLocation() myLocation.enableMyLocation() map.overlays.add(myLocation) @@ -79,6 +89,7 @@ class Map : Fragment() { inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { + Log.d("GeoMap", "MAP ON CREATE VIEW") // Inflate the layout for this fragment val view = inflater.inflate(R.layout.fragment_map, container, false) configureMap(view) @@ -87,8 +98,9 @@ class Map : Fragment() { override fun onResume() { super.onResume() + Log.d("GeoMap", "MAP RESUME") if (ContextCompat.checkSelfPermission(requireActivity(), ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { - val locationManager = requireActivity().getSystemService(Context.LOCATION_SERVICE) as LocationManager + locationManager = requireActivity().getSystemService(Context.LOCATION_SERVICE) as LocationManager locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, locationListener) } map.onResume() //needed for compass, my location overlays, v6.0.0 and up @@ -96,8 +108,9 @@ class Map : Fragment() { override fun onPause() { super.onPause() + Log.d("GeoMap", "MAP PAUSE") if (ContextCompat.checkSelfPermission(requireActivity(), ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { - val locationManager = requireActivity().getSystemService(Context.LOCATION_SERVICE) as LocationManager + locationManager = requireActivity().getSystemService(Context.LOCATION_SERVICE) as LocationManager locationManager.removeUpdates(locationListener) isMapCentered=false; } diff --git a/app/src/main/java/uca/baptistearthur/geocaching/List.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/RoadTrip.kt similarity index 85% rename from app/src/main/java/uca/baptistearthur/geocaching/List.kt rename to app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/RoadTrip.kt index d082f99..4dce937 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/List.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/fragment/RoadTrip.kt @@ -1,10 +1,11 @@ -package uca.baptistearthur.geocaching +package uca.baptistearthur.geocaching.ui.fragment import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import uca.baptistearthur.geocaching.R // TODO: Rename parameter arguments, choose names that match // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER @@ -13,10 +14,10 @@ private const val ARG_PARAM2 = "param2" /** * A simple [Fragment] subclass. - * Use the [List.newInstance] factory method to + * Use the [RoadTrip.newInstance] factory method to * create an instance of this fragment. */ -class List : Fragment() { +class RoadTrip : Fragment() { // TODO: Rename and change types of parameters private var param1: String? = null private var param2: String? = null @@ -34,7 +35,7 @@ class List : Fragment() { savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_list, container, false) + return inflater.inflate(R.layout.fragment_roadtrip, container, false) } companion object { @@ -49,7 +50,7 @@ class List : Fragment() { // TODO: Rename and change types and number of parameters @JvmStatic fun newInstance(param1: String, param2: String) = - List().apply { + RoadTrip().apply { arguments = Bundle().apply { putString(ARG_PARAM1, param1) putString(ARG_PARAM2, param2) diff --git a/app/src/main/java/uca/baptistearthur/geocaching/RecenterOverlay.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/RecenterOverlay.kt similarity index 61% rename from app/src/main/java/uca/baptistearthur/geocaching/RecenterOverlay.kt rename to app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/RecenterOverlay.kt index 47aae20..a647f94 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/RecenterOverlay.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/RecenterOverlay.kt @@ -1,25 +1,22 @@ -package uca.baptistearthur.geocaching +package uca.baptistearthur.geocaching.ui.overlay import android.graphics.* -import android.graphics.drawable.shapes.Shape import android.location.Location -import android.view.GestureDetector import android.view.MotionEvent -import androidx.appcompat.widget.AppCompatDrawableManager import androidx.core.content.ContextCompat import org.osmdroid.util.GeoPoint import org.osmdroid.views.MapView import org.osmdroid.views.overlay.Overlay import org.osmdroid.views.overlay.mylocation.IMyLocationConsumer import org.osmdroid.views.overlay.mylocation.IMyLocationProvider +import uca.baptistearthur.geocaching.R -class RecenterOverlay(val myLocationProvider: IMyLocationProvider, val mapView: MapView) : Overlay(), GestureDetector.OnGestureListener, IMyLocationConsumer { - - private val gestureDetector: GestureDetector = GestureDetector(mapView.context, this) - private var circleRectF=RectF(); - +class RecenterOverlay(val myLocationProvider: IMyLocationProvider, val mapView: MapView) : Overlay(), IMyLocationConsumer { + private var circleRectF=RectF() + private var mIsFollowing = false + private var mLocation: Location? = null override fun draw(canvas: Canvas, mapView: MapView, shadow: Boolean) { val circleSize = 300f @@ -49,20 +46,46 @@ class RecenterOverlay(val myLocationProvider: IMyLocationProvider, val mapView: icon?.draw(canvas) } + override fun onLocationChanged(location: Location, source: IMyLocationProvider) { + mLocation = myLocationProvider.lastKnownLocation + if (mIsFollowing) { + mapView.controller.animateTo(GeoPoint(location.latitude, location.longitude)); + } else { + mapView.postInvalidate(); + } + } + fun enableMyLocation() { + mLocation = myLocationProvider.lastKnownLocation + mIsFollowing = true; + if(mLocation!=null) { + mapView.controller?.animateTo(GeoPoint(mLocation!!.latitude, mLocation!!.longitude)) + } myLocationProvider.startLocationProvider(this); } fun disableMyLocation(){ + mapView.controller?.stopAnimation(false) + mIsFollowing = false myLocationProvider.stopLocationProvider(); } + override fun onTouchEvent(event: MotionEvent?, mapView: MapView?): Boolean { + val isSingleFingerDrag = event!!.action == MotionEvent.ACTION_MOVE && event.pointerCount == 1 + if (event.action == MotionEvent.ACTION_DOWN) { + disableMyLocation() + } else if (isSingleFingerDrag && mIsFollowing) { + return true // prevent the pan + } + return super.onTouchEvent(event, mapView) + } + override fun onSingleTapConfirmed(e: MotionEvent?, mapView: MapView?) = myLocationProvider.lastKnownLocation?.let { if (e != null && circleRectF.contains(e.x, e.y)) { mapView?.controller?.setCenter(GeoPoint(it.latitude, it.longitude)) - mapView?.controller?.setZoom(20.0); - + mapView?.controller?.setZoom(21.0); + enableMyLocation() } true } ?: false @@ -82,12 +105,4 @@ class RecenterOverlay(val myLocationProvider: IMyLocationProvider, val mapView: disableMyLocation() super.onDetach(mapView) } - - override fun onDown(p0: MotionEvent) = true - override fun onShowPress(p0: MotionEvent) = Unit - override fun onSingleTapUp(p0: MotionEvent) = true - override fun onScroll(p0: MotionEvent, p1: MotionEvent, p2: Float, p3: Float) = true; - override fun onLongPress(p0: MotionEvent) = Unit - override fun onFling(p0: MotionEvent, p1: MotionEvent, p2: Float, p3: Float) = true - override fun onLocationChanged(location: Location?, source: IMyLocationProvider?) = Unit } diff --git a/app/src/main/res/drawable/profile.xml b/app/src/main/res/drawable/profile.xml deleted file mode 100644 index d36b73c..0000000 --- a/app/src/main/res/drawable/profile.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/list.xml b/app/src/main/res/drawable/road_trip.xml similarity index 100% rename from app/src/main/res/drawable/list.xml rename to app/src/main/res/drawable/road_trip.xml diff --git a/app/src/main/res/layout/fragment_map.xml b/app/src/main/res/layout/fragment_map.xml index 6ebeadb..c6879a7 100644 --- a/app/src/main/res/layout/fragment_map.xml +++ b/app/src/main/res/layout/fragment_map.xml @@ -3,7 +3,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".Map"> + tools:context=".ui.fragment.Map"> + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml deleted file mode 100644 index 491bbff..0000000 --- a/app/src/main/res/layout/fragment_profile.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_list.xml b/app/src/main/res/layout/fragment_roadtrip.xml similarity index 78% rename from app/src/main/res/layout/fragment_list.xml rename to app/src/main/res/layout/fragment_roadtrip.xml index a037be3..23cccd5 100644 --- a/app/src/main/res/layout/fragment_list.xml +++ b/app/src/main/res/layout/fragment_roadtrip.xml @@ -3,11 +3,11 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".List"> + tools:context=".ui.fragment.RoadTrip"> + android:text="Mes voyages !" /> \ No newline at end of file diff --git a/app/src/main/res/menu/bottom_tabs.xml b/app/src/main/res/menu/bottom_tabs.xml index d8469db..0fabe7a 100644 --- a/app/src/main/res/menu/bottom_tabs.xml +++ b/app/src/main/res/menu/bottom_tabs.xml @@ -1,18 +1,13 @@ - + android:title="@string/voyages" + android:icon="@drawable/road_trip" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 24696d9..101072f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,8 +1,7 @@ - Geocaching - Profil + RoadTrip Carte - Liste + Voyages Hello blank fragment \ No newline at end of file