From 9862992f8601f6f8bc4150a04e72af2e781aea64 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Fri, 18 Nov 2022 20:17:37 +0100 Subject: Omogucenom klikom na dugme dodaj novu lokaciju da se otvara mapa. Omogucenja pretraga , gps lociranje, klikom bilo gde na mapi se postavlja marker. --- .../app/src/main/AndroidManifest.xml | 55 +++- .../brzodolokacije/Activities/MapsActivity.kt | 358 ++++++++++++++++++--- .../res/drawable/ic_baseline_add_location_24.xml | 5 + .../app/src/main/res/layout/activity_maps.xml | 73 ++++- 4 files changed, 431 insertions(+), 60 deletions(-) create mode 100644 Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_add_location_24.xml (limited to 'Client') diff --git a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml index 56bdb58..1f19b5c 100644 --- a/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml +++ b/Client/BrzoDoLokacije/app/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ - + xmlns:tools="http://schemas.android.com/tools" > @@ -15,9 +14,7 @@ android:name="android.permission.CAMERA" android:required="true" android:requiredFeature="true" /> - - - + @@ -38,16 +35,31 @@ android:supportsRtl="true" android:theme="@style/Theme.BrzoDoLokacije" android:usesCleartextTraffic="true" - tools:targetApi="31"> + tools:targetApi="31" > + + + - - - - + + + + - - - - - - + + + + + + android:grantUriPermissions="true" > diff --git a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/MapsActivity.kt b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/MapsActivity.kt index b9205f6..8762d4e 100644 --- a/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/MapsActivity.kt +++ b/Client/BrzoDoLokacije/app/src/main/java/com/example/brzodolokacije/Activities/MapsActivity.kt @@ -1,49 +1,331 @@ package com.example.brzodolokacije.Activities -import androidx.appcompat.app.AppCompatActivity +import android.Manifest +import android.content.Context +import android.content.pm.PackageManager +import android.graphics.Canvas +import android.location.Location +import android.location.LocationManager +import android.os.Build import android.os.Bundle - -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.MarkerOptions +import android.os.Looper +import android.os.StrictMode +import android.preference.PreferenceManager +import android.util.DisplayMetrics +import android.view.KeyEvent +import android.view.MotionEvent +import android.view.View +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat import com.example.brzodolokacije.R -import com.example.brzodolokacije.databinding.ActivityMapsBinding +import com.example.brzodolokacije.Services.GeocoderHelper +import com.google.android.gms.location.* +import com.google.android.material.button.MaterialButton +import com.google.android.material.floatingactionbutton.FloatingActionButton +import com.google.android.material.textfield.TextInputEditText +import org.osmdroid.config.Configuration +import org.osmdroid.tileprovider.tilesource.TileSourceFactory +import org.osmdroid.util.GeoPoint +import org.osmdroid.views.MapView +import org.osmdroid.views.Projection +import org.osmdroid.views.overlay.* +import org.osmdroid.views.overlay.compass.CompassOverlay +import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider +import org.osmdroid.views.overlay.gestures.RotationGestureOverlay +import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider +import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay -class MapsActivity : AppCompatActivity(), OnMapReadyCallback { - - private lateinit var mMap: GoogleMap - private lateinit var binding: ActivityMapsBinding +class MapsActivity : AppCompatActivity() { + var map: MapView? = null + var mLocationOverlay: MyLocationNewOverlay?=null + var mRotationGestureOverlay: RotationGestureOverlay?=null + var mScaleBarOverlay: ScaleBarOverlay?=null + var mCompassOverlay: CompassOverlay?=null + private lateinit var locationManager: LocationManager + private lateinit var searchButton: MaterialButton + private lateinit var gpsButton: FloatingActionButton + private lateinit var searchBar: TextInputEditText + var client: FusedLocationProviderClient? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + setContentView(R.layout.activity_maps) + + val ctx: Context = this + Configuration.getInstance().load(ctx, PreferenceManager.getDefaultSharedPreferences(ctx)); + map= findViewById(R.id.ActivityMapsMapView) + map!!.setTileSource(TileSourceFactory.MAPNIK); + setUpMap() + searchButton=findViewById(R.id.ActivityMapsSearchButton) as MaterialButton + gpsButton=findViewById(R.id.ActivityMapsMyLocation) as FloatingActionButton + searchBar=findViewById(R.id.ActivityMapsSearchBar) as TextInputEditText + client= LocationServices.getFusedLocationProviderClient(this) + searchButton.setOnClickListener{ + searchMap() + + } + gpsButton.setOnClickListener{ + getLocation() + } + searchBar.setOnKeyListener(View.OnKeyListener { v1, keyCode, event -> // If the event is a key-down event on the "enter" button + if (event.action === KeyEvent.ACTION_DOWN && + keyCode == KeyEvent.KEYCODE_ENTER + ) { + // Perform action on key press + searchMap() + return@OnKeyListener true + } + false + }) + + + + } + + + override fun onResume() { + super.onResume() + map!!.onResume() + } + override fun onPause() { + super.onPause() + map!!.onPause() + } + fun setUpMap(){ + //Set up controlls and startPoint + map!!.setBuiltInZoomControls(true); + map!!.setMultiTouchControls(true); + val mapController = map!!.controller + mapController.setZoom(15) + fixNetworkPolicy() + + //my location + //checkLocPerm() + mLocationOverlay = MyLocationNewOverlay(GpsMyLocationProvider(this), map) + mLocationOverlay!!.enableMyLocation() + map!!.getOverlays().add(this.mLocationOverlay) + + //start point + val startPoint = GeoPoint(44.0107,20.9181)//dodati nasu lokaciju TODO + mapController.setCenter(startPoint) + + //rotation gestures + mRotationGestureOverlay = RotationGestureOverlay(this, map) + mRotationGestureOverlay!!.setEnabled(true) + map!!.setMultiTouchControls(true) + map!!.getOverlays().add(this.mRotationGestureOverlay) + //Map scale bar + val dm: DisplayMetrics =this.resources.displayMetrics + mScaleBarOverlay = ScaleBarOverlay(map); + mScaleBarOverlay!!.setCentred(true); + mScaleBarOverlay!!.setScaleBarOffset(dm.widthPixels / 2, 10); + map!!.getOverlays().add(this.mScaleBarOverlay); + + //Compass + this.mCompassOverlay = + CompassOverlay(this, InternalCompassOrientationProvider(this), map) + mCompassOverlay!!.enableCompass() + map!!.getOverlays().add(this.mCompassOverlay) + + + val touchOverlay: Overlay = object : Overlay(this) { + var anotherItemizedIconOverlay: ItemizedIconOverlay? = null + override fun onSingleTapConfirmed(e: MotionEvent, mapView: MapView): Boolean { + val marker = ContextCompat.getDrawable(this@MapsActivity, R.drawable.ic_baseline_add_location_24); + val proj: Projection = mapView.projection + val loc = proj.fromPixels(e.x.toInt(), e.y.toInt()) + val longitude = java.lang.Double.toString(loc.longitudeE6.toDouble() / 1000000) + val latitude = java.lang.Double.toString(loc.latitudeE6.toDouble() / 1000000) + val overlayArray = ArrayList() + val mapItem = OverlayItem( + "", "", GeoPoint( + loc.latitudeE6.toDouble() / 1000000, + loc.longitudeE6.toDouble() / 1000000 + ) + ) + mapItem.setMarker(marker) + overlayArray.add(mapItem) + if (anotherItemizedIconOverlay == null) { + anotherItemizedIconOverlay = + ItemizedIconOverlay(applicationContext, overlayArray, null) + mapView.overlays.add(anotherItemizedIconOverlay) + mapView.invalidate() + } else { + mapView.overlays.remove(anotherItemizedIconOverlay) + mapView.invalidate() + anotherItemizedIconOverlay = + ItemizedIconOverlay(applicationContext, overlayArray, null) + mapView.overlays.add(anotherItemizedIconOverlay) + } + // dlgThread(); + return true + } + } + map!!.getOverlays().add(touchOverlay) + } + fun checkLocPerm(){ + if (ContextCompat.checkSelfPermission( + this, + Manifest.permission.ACCESS_FINE_LOCATION + ) + != PackageManager.PERMISSION_GRANTED + ) { + ActivityCompat.requestPermissions( + this, + arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), + 101 + ) + } + } + + fun fixNetworkPolicy(){ + val SDK_INT = Build.VERSION.SDK_INT + if (SDK_INT > 8) { + val policy = StrictMode.ThreadPolicy.Builder() + .permitAll().build() + StrictMode.setThreadPolicy(policy) + //your codes here + } + } + fun searchMap(){ + var geocoder= GeocoderHelper.getInstance() + //Log.d("Main",geocoder!!.getFromLocationName("Paris",1)[0].countryName) + var locString=searchBar.text.toString().trim() + if(locString==null || locString=="") + Toast.makeText(this,"Unesite naziv lokacije", Toast.LENGTH_SHORT) + else{ + var result=geocoder!!.getFromLocationName(locString,1)[0] + if(result==null) + Toast.makeText(this,"Nepostojeca lokacija", Toast.LENGTH_SHORT) + else{ + //move to spot + val searchPoint = GeoPoint(result.latitude,result.longitude) + val startMarker = Marker(map) + startMarker.setPosition(searchPoint) + startMarker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM) + map!!.getOverlays().add(startMarker) + map!!.controller.animateTo(searchPoint) + + + } + } + } + private fun getLocation() { + if (ContextCompat.checkSelfPermission( + this, + Manifest.permission + .ACCESS_FINE_LOCATION) + == PackageManager + .PERMISSION_GRANTED + && ContextCompat.checkSelfPermission( + this, + Manifest.permission + .ACCESS_COARSE_LOCATION) + == PackageManager + .PERMISSION_GRANTED) { + // When permission is granted + // Call method + getCurrentLocation() + } + else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + requestPermissions( + arrayOf( + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.ACCESS_COARSE_LOCATION + ), + 111 + ) + } + + } + } + override fun onRequestPermissionsResult( + requestCode: Int, permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult( + requestCode, permissions, grantResults + ) + // Check condition + if (requestCode == 111 && grantResults.size > 0 + && (grantResults[0] + grantResults[1] + == PackageManager.PERMISSION_GRANTED) + ) { + // When permission are granted + // Call method + getCurrentLocation() + } else { + // When permission are denied + // Display toast + Toast + .makeText( + this, + "Permission denied", + Toast.LENGTH_SHORT + ) + .show() + } + } + @Suppress("MissingPermission") + private fun getCurrentLocation() { + val locationManager = this + .getSystemService( + Context.LOCATION_SERVICE + ) as LocationManager + checkLocPerm() + if (locationManager.isProviderEnabled( + LocationManager.GPS_PROVIDER + ) + || locationManager.isProviderEnabled( + LocationManager.NETWORK_PROVIDER + ) + ) { + + client!!.getLastLocation().addOnCompleteListener { task -> + var location = task.result + if (location == null) { + val locationRequest: LocationRequest = LocationRequest() + .setPriority( + LocationRequest.PRIORITY_HIGH_ACCURACY + ) + .setInterval(10000) + .setFastestInterval( + 1000 + ) + .setNumUpdates(1) + + val locationCallback: LocationCallback = object : LocationCallback() { + override fun onLocationResult( + locationResult: LocationResult + ) { + // Initialize + // location + val location1: Location? = locationResult + .lastLocation + // Set latitude + map!!.controller.animateTo( + GeoPoint( + location1!!.latitude, + location1!!.longitude + ) + ) + + } + } + client!!.requestLocationUpdates( + locationRequest, + locationCallback, + Looper.myLooper() + ); + } else { + map!!.controller.animateTo(GeoPoint(location!!.latitude, location!!.longitude)) + } + - binding = ActivityMapsBinding.inflate(layoutInflater) - setContentView(binding.root) - - // Obtain the SupportMapFragment and get notified when the map is ready to be used. - val mapFragment = supportFragmentManager - .findFragmentById(R.id.map) as SupportMapFragment - mapFragment.getMapAsync(this) - } - - /** - * Manipulates the map once available. - * This callback is triggered when the map is ready to be used. - * This is where we can add markers or lines, add listeners or move the camera. In this case, - * we just add a marker near Sydney, Australia. - * If Google Play services is not installed on the device, the user will be prompted to install - * it inside the SupportMapFragment. This method will only be triggered once the user has - * installed Google Play services and returned to the app. - */ - override fun onMapReady(googleMap: GoogleMap) { - mMap = googleMap - - // Add a marker in Sydney and move the camera - val sydney = LatLng(-34.0, 151.0) - mMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney")) - mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)) + } + } } } \ No newline at end of file diff --git a/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_add_location_24.xml b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_add_location_24.xml new file mode 100644 index 0000000..8f88131 --- /dev/null +++ b/Client/BrzoDoLokacije/app/src/main/res/drawable/ic_baseline_add_location_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_maps.xml b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_maps.xml index 01c8abd..b45e1f0 100644 --- a/Client/BrzoDoLokacije/app/src/main/res/layout/activity_maps.xml +++ b/Client/BrzoDoLokacije/app/src/main/res/layout/activity_maps.xml @@ -1,9 +1,72 @@ - \ No newline at end of file + tools:context=".Activities.MapsActivity"> + + + + + + + + + + + + + + + + \ No newline at end of file -- cgit v1.2.3