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"
tools:targetApi="31" >
<activity
android:name=".MainWindow"
android:name=".ui.activity.MainWindow"
android:exported="true" >
<intent-filter>
<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 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

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

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

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

@ -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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Map">
tools:context=".ui.fragment.Map">
<org.osmdroid.views.MapView
android:id="@+id/mapView"
@ -12,4 +12,12 @@
android:clickable="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>

@ -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"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".List">
tools:context=".ui.fragment.RoadTrip">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="List" />
android:text="Mes voyages !" />
</FrameLayout>

@ -1,18 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<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
android:id="@+id/map"
android:enabled="true"
android:title="@string/carte"
android:icon="@drawable/map"/>
<item
android:id="@+id/list"
android:id="@+id/roadTrip"
android:enabled="true"
android:title="@string/liste"
android:icon="@drawable/list" />
android:title="@string/voyages"
android:icon="@drawable/road_trip" />
</menu>

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