Merge pull request 'baptiste' (#5) from baptiste into master

Reviewed-on: baptiste.bonneau/Geocaching#5
pull/6/head
Baptiste BONNEAU 2 years ago
commit 7e03969c04

@ -21,7 +21,7 @@
android:theme="@style/Theme.Geocaching" android:theme="@style/Theme.Geocaching"
tools:targetApi="31" > tools:targetApi="31" >
<activity <activity
android:name=".MainWindow" android:name=".ui.activity.MainWindow"
android:exported="true" > android:exported="true" >
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />

@ -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)
}
}
}
}

@ -0,0 +1,6 @@
package uca.baptistearthur.geocaching.model
data class Place(
val latitude : Long,
val longitude : Long
)

@ -0,0 +1,14 @@
package uca.baptistearthur.geocaching.model
import java.util.Date
class RoadTrip(
val name: String,
val date: Date,
val places: ArrayList<Place>
){
fun addPlaceToRoadTripList(place: Place) = places.add(place)
fun addPlaceToRoadTripList(latitude: Long, longitude: Long) = places.add(Place(latitude, longitude))
}

@ -1,14 +1,18 @@
package uca.baptistearthur.geocaching package uca.baptistearthur.geocaching.ui.activity
import android.os.Bundle import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import com.google.android.material.bottomnavigation.BottomNavigationView 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() { class MainWindow: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
val map = Map();
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.main_window) setContentView(R.layout.main_window)
@ -17,16 +21,16 @@ class MainWindow: AppCompatActivity() {
navigation.selectedItemId= R.id.map navigation.selectedItemId= R.id.map
navigation.setOnItemSelectedListener { navigation.setOnItemSelectedListener {
when (it.itemId) { when (it.itemId) {
R.id.profile -> { // R.id.profile -> {
loadFragment(Profile()) // loadFragment(Profile())
true // true
} // }
R.id.map -> { R.id.map -> {
loadFragment(Map()) loadFragment(map)
true true
} }
R.id.list -> { R.id.roadTrip -> {
loadFragment(List()) loadFragment(uca.baptistearthur.geocaching.ui.fragment.RoadTrip())
true true
} }
else -> false else -> false

@ -1,4 +1,4 @@
package uca.baptistearthur.geocaching package uca.baptistearthur.geocaching.ui.fragment
import android.content.Context import android.content.Context
import android.content.pm.PackageManager import android.content.pm.PackageManager
@ -14,18 +14,22 @@ import org.osmdroid.util.GeoPoint
import org.osmdroid.views.MapView import org.osmdroid.views.MapView
import org.osmdroid.views.overlay.ScaleBarOverlay import org.osmdroid.views.overlay.ScaleBarOverlay
import android.Manifest.permission.ACCESS_FINE_LOCATION import android.Manifest.permission.ACCESS_FINE_LOCATION
import android.hardware.SensorManager
import android.location.Location import android.location.Location
import android.location.LocationListener import android.location.LocationListener
import android.util.Log
import android.widget.ProgressBar
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import org.osmdroid.views.overlay.compass.CompassOverlay import org.osmdroid.views.overlay.compass.CompassOverlay
import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider
import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider
import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay
import uca.baptistearthur.geocaching.R
import uca.baptistearthur.geocaching.ui.overlay.RecenterOverlay
class Map : Fragment() { class Map : Fragment() {
private lateinit var map : MapView private lateinit var map : MapView
private lateinit var spinner: ProgressBar;
private lateinit var locationManager: LocationManager;
val defaultPoint = GeoPoint(48.8583, 2.2944) val defaultPoint = GeoPoint(48.8583, 2.2944)
var isMapCentered = false; var isMapCentered = false;
val locationListener = object : LocationListener { val locationListener = object : LocationListener {
@ -33,12 +37,15 @@ class Map : Fragment() {
val geoPoint = GeoPoint(location.latitude, location.longitude) val geoPoint = GeoPoint(location.latitude, location.longitude)
if(!isMapCentered){ if(!isMapCentered){
map.controller.setCenter(geoPoint) map.controller.setCenter(geoPoint)
spinner.visibility=View.GONE;
isMapCentered=true; isMapCentered=true;
} }
map.invalidate() map.invalidate()
} }
} }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
Configuration.getInstance().userAgentValue = "Geocaching" Configuration.getInstance().userAgentValue = "Geocaching"
@ -46,11 +53,15 @@ class Map : Fragment() {
} }
val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission())
{ map.controller.setCenter(defaultPoint); } { map.controller.setCenter(defaultPoint) }
private fun configureMap(view: View){ private fun configureMap(view: View){
Log.d("GeoMap", "MAP CONFIGURE")
map = view.findViewById(R.id.mapView) 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) { if (ContextCompat.checkSelfPermission(requireActivity(), ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissionLauncher.launch(ACCESS_FINE_LOCATION) requestPermissionLauncher.launch(ACCESS_FINE_LOCATION)
} }
@ -65,7 +76,6 @@ class Map : Fragment() {
map.overlays.add(scaleBarOverlay) map.overlays.add(scaleBarOverlay)
val myLocation = MyLocationNewOverlay(GpsMyLocationProvider(context), map) val myLocation = MyLocationNewOverlay(GpsMyLocationProvider(context), map)
myLocation.enableFollowLocation()
myLocation.enableMyLocation() myLocation.enableMyLocation()
map.overlays.add(myLocation) map.overlays.add(myLocation)
@ -79,6 +89,7 @@ class Map : Fragment() {
inflater: LayoutInflater, container: ViewGroup?, inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
Log.d("GeoMap", "MAP ON CREATE VIEW")
// Inflate the layout for this fragment // Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_map, container, false) val view = inflater.inflate(R.layout.fragment_map, container, false)
configureMap(view) configureMap(view)
@ -87,8 +98,9 @@ class Map : Fragment() {
override fun onResume() { override fun onResume() {
super.onResume() super.onResume()
Log.d("GeoMap", "MAP RESUME")
if (ContextCompat.checkSelfPermission(requireActivity(), ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 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) locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, locationListener)
} }
map.onResume() //needed for compass, my location overlays, v6.0.0 and up map.onResume() //needed for compass, my location overlays, v6.0.0 and up
@ -96,8 +108,9 @@ class Map : Fragment() {
override fun onPause() { override fun onPause() {
super.onPause() super.onPause()
Log.d("GeoMap", "MAP PAUSE")
if (ContextCompat.checkSelfPermission(requireActivity(), ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 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) locationManager.removeUpdates(locationListener)
isMapCentered=false; isMapCentered=false;
} }

@ -1,10 +1,11 @@
package uca.baptistearthur.geocaching package uca.baptistearthur.geocaching.ui.fragment
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import uca.baptistearthur.geocaching.R
// TODO: Rename parameter arguments, choose names that match // TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
@ -13,10 +14,10 @@ private const val ARG_PARAM2 = "param2"
/** /**
* A simple [Fragment] subclass. * A simple [Fragment] subclass.
* Use the [List.newInstance] factory method to * Use the [RoadTrip.newInstance] factory method to
* create an instance of this fragment. * create an instance of this fragment.
*/ */
class List : Fragment() { class RoadTrip : Fragment() {
// TODO: Rename and change types of parameters // TODO: Rename and change types of parameters
private var param1: String? = null private var param1: String? = null
private var param2: String? = null private var param2: String? = null
@ -34,7 +35,7 @@ class List : Fragment() {
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View? {
// Inflate the layout for this fragment // 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 { companion object {
@ -49,7 +50,7 @@ class List : Fragment() {
// TODO: Rename and change types and number of parameters // TODO: Rename and change types and number of parameters
@JvmStatic @JvmStatic
fun newInstance(param1: String, param2: String) = fun newInstance(param1: String, param2: String) =
List().apply { RoadTrip().apply {
arguments = Bundle().apply { arguments = Bundle().apply {
putString(ARG_PARAM1, param1) putString(ARG_PARAM1, param1)
putString(ARG_PARAM2, param2) putString(ARG_PARAM2, param2)

@ -1,25 +1,22 @@
package uca.baptistearthur.geocaching package uca.baptistearthur.geocaching.ui.overlay
import android.graphics.* import android.graphics.*
import android.graphics.drawable.shapes.Shape
import android.location.Location import android.location.Location
import android.view.GestureDetector
import android.view.MotionEvent import android.view.MotionEvent
import androidx.appcompat.widget.AppCompatDrawableManager
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import org.osmdroid.util.GeoPoint import org.osmdroid.util.GeoPoint
import org.osmdroid.views.MapView import org.osmdroid.views.MapView
import org.osmdroid.views.overlay.Overlay import org.osmdroid.views.overlay.Overlay
import org.osmdroid.views.overlay.mylocation.IMyLocationConsumer import org.osmdroid.views.overlay.mylocation.IMyLocationConsumer
import org.osmdroid.views.overlay.mylocation.IMyLocationProvider import org.osmdroid.views.overlay.mylocation.IMyLocationProvider
import uca.baptistearthur.geocaching.R
class RecenterOverlay(val myLocationProvider: IMyLocationProvider, val mapView: MapView) : Overlay(), GestureDetector.OnGestureListener, IMyLocationConsumer { class RecenterOverlay(val myLocationProvider: IMyLocationProvider, val mapView: MapView) : Overlay(), IMyLocationConsumer {
private val gestureDetector: GestureDetector = GestureDetector(mapView.context, this)
private var circleRectF=RectF();
private var circleRectF=RectF()
private var mIsFollowing = false
private var mLocation: Location? = null
override fun draw(canvas: Canvas, mapView: MapView, shadow: Boolean) { override fun draw(canvas: Canvas, mapView: MapView, shadow: Boolean) {
val circleSize = 300f val circleSize = 300f
@ -49,20 +46,46 @@ class RecenterOverlay(val myLocationProvider: IMyLocationProvider, val mapView:
icon?.draw(canvas) 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() { fun enableMyLocation() {
mLocation = myLocationProvider.lastKnownLocation
mIsFollowing = true;
if(mLocation!=null) {
mapView.controller?.animateTo(GeoPoint(mLocation!!.latitude, mLocation!!.longitude))
}
myLocationProvider.startLocationProvider(this); myLocationProvider.startLocationProvider(this);
} }
fun disableMyLocation(){ fun disableMyLocation(){
mapView.controller?.stopAnimation(false)
mIsFollowing = false
myLocationProvider.stopLocationProvider(); 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?) = override fun onSingleTapConfirmed(e: MotionEvent?, mapView: MapView?) =
myLocationProvider.lastKnownLocation?.let { myLocationProvider.lastKnownLocation?.let {
if (e != null && circleRectF.contains(e.x, e.y)) { if (e != null && circleRectF.contains(e.x, e.y)) {
mapView?.controller?.setCenter(GeoPoint(it.latitude, it.longitude)) mapView?.controller?.setCenter(GeoPoint(it.latitude, it.longitude))
mapView?.controller?.setZoom(20.0); mapView?.controller?.setZoom(21.0);
enableMyLocation()
} }
true true
} ?: false } ?: false
@ -82,12 +105,4 @@ class RecenterOverlay(val myLocationProvider: IMyLocationProvider, val mapView:
disableMyLocation() disableMyLocation()
super.onDetach(mapView) 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
} }

@ -1,5 +0,0 @@
<vector android:height="24dp" android:tint="#FFFFFF"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M12,5.9c1.16,0 2.1,0.94 2.1,2.1s-0.94,2.1 -2.1,2.1S9.9,9.16 9.9,8s0.94,-2.1 2.1,-2.1m0,9c2.97,0 6.1,1.46 6.1,2.1v1.1L5.9,18.1L5.9,17c0,-0.64 3.13,-2.1 6.1,-2.1M12,4C9.79,4 8,5.79 8,8s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4zM12,13c-2.67,0 -8,1.34 -8,4v3h16v-3c0,-2.66 -5.33,-4 -8,-4z"/>
</vector>

@ -3,7 +3,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".Map"> tools:context=".ui.fragment.Map">
<org.osmdroid.views.MapView <org.osmdroid.views.MapView
android:id="@+id/mapView" android:id="@+id/mapView"
@ -12,4 +12,12 @@
android:clickable="true" android:clickable="true"
android:focusable="true" /> android:focusable="true" />
<ProgressBar
android:id="@+id/mapLoading"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"/>
</FrameLayout> </FrameLayout>

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Profile">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="PROFILE" />
</FrameLayout>

@ -3,11 +3,11 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
tools:context=".List"> tools:context=".ui.fragment.RoadTrip">
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:text="List" /> android:text="Mes voyages !" />
</FrameLayout> </FrameLayout>

@ -1,18 +1,13 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/profile"
android:enabled="true"
android:title="@string/profil"
android:icon="@drawable/profile"/>
<item <item
android:id="@+id/map" android:id="@+id/map"
android:enabled="true" android:enabled="true"
android:title="@string/carte" android:title="@string/carte"
android:icon="@drawable/map"/> android:icon="@drawable/map"/>
<item <item
android:id="@+id/list" android:id="@+id/roadTrip"
android:enabled="true" android:enabled="true"
android:title="@string/liste" android:title="@string/voyages"
android:icon="@drawable/list" /> android:icon="@drawable/road_trip" />
</menu> </menu>

@ -1,8 +1,7 @@
<resources> <resources>
<string name="app_name">Geocaching</string> <string name="app_name">RoadTrip</string>
<string name="profil">Profil</string>
<string name="carte">Carte</string> <string name="carte">Carte</string>
<string name="liste">Liste</string> <string name="voyages">Voyages</string>
<!-- TODO: Remove or change this placeholder text --> <!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string> <string name="hello_blank_fragment">Hello blank fragment</string>
</resources> </resources>
Loading…
Cancel
Save