location update acc to android 14
This commit is contained in:
parent
a77f993d78
commit
dfe3f2116f
|
@ -5,14 +5,19 @@
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
<uses-permission android:name="android.permission.INTERNET" />
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
<uses-permission android:name="android.permission.CAMERA" />
|
<uses-permission android:name="android.permission.CAMERA" />
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
|
||||||
|
android:maxSdkVersion="28"/>
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
||||||
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
|
||||||
|
|
||||||
<uses-feature android:name="android.hardware.camera" android:required="false" />
|
|
||||||
|
<uses-feature android:name="android.hardware.camera" />
|
||||||
|
<uses-feature android:name="android.hardware.camera.autofocus"
|
||||||
|
android:required="false" />
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:name=".AgentApplication"
|
android:name=".AgentApplication"
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
|
@ -25,7 +30,7 @@
|
||||||
android:usesCleartextTraffic="true"
|
android:usesCleartextTraffic="true"
|
||||||
android:localeConfig="@xml/locales_config"
|
android:localeConfig="@xml/locales_config"
|
||||||
android:theme="@style/Theme.FieldAgent"
|
android:theme="@style/Theme.FieldAgent"
|
||||||
tools:targetApi="31">
|
tools:targetApi="33">
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.SplashActivity"
|
android:name=".ui.SplashActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
|
@ -48,6 +53,7 @@
|
||||||
android:name=".ui.homescreen.HomeActivity"
|
android:name=".ui.homescreen.HomeActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
android:windowSoftInputMode="adjustResize"
|
android:windowSoftInputMode="adjustResize"
|
||||||
|
android:configChanges="orientation|screenSize"
|
||||||
android:screenOrientation="portrait"
|
android:screenOrientation="portrait"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|
|
@ -2,18 +2,23 @@ package com.example.fieldagent.ui.addsite
|
||||||
|
|
||||||
import android.Manifest
|
import android.Manifest
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
|
import android.app.Activity.RESULT_OK
|
||||||
import android.app.Dialog
|
import android.app.Dialog
|
||||||
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
import android.content.IntentSender
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.graphics.drawable.ColorDrawable
|
import android.graphics.drawable.ColorDrawable
|
||||||
import android.location.Geocoder
|
import android.location.Geocoder
|
||||||
import android.location.Location
|
import android.location.Location
|
||||||
|
import android.location.LocationManager
|
||||||
import android.location.LocationRequest
|
import android.location.LocationRequest
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.os.Environment
|
import android.os.Environment
|
||||||
|
import android.provider.Settings
|
||||||
import android.text.Editable
|
import android.text.Editable
|
||||||
import android.text.TextWatcher
|
import android.text.TextWatcher
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
@ -26,8 +31,11 @@ import android.view.Window
|
||||||
import android.widget.ArrayAdapter
|
import android.widget.ArrayAdapter
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.activity.result.ActivityResultLauncher
|
import androidx.activity.result.ActivityResultLauncher
|
||||||
|
import androidx.activity.result.IntentSenderRequest
|
||||||
import androidx.activity.result.PickVisualMediaRequest
|
import androidx.activity.result.PickVisualMediaRequest
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
|
import androidx.annotation.RequiresPermission
|
||||||
|
import androidx.core.app.ActivityCompat
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.core.content.FileProvider
|
import androidx.core.content.FileProvider
|
||||||
import androidx.fragment.app.viewModels
|
import androidx.fragment.app.viewModels
|
||||||
|
@ -59,10 +67,12 @@ import com.example.fieldagent.utils.showFullScreenImage
|
||||||
import com.example.fieldagent.utils.showSnackBar
|
import com.example.fieldagent.utils.showSnackBar
|
||||||
import com.example.fieldagent.utils.uriToFile
|
import com.example.fieldagent.utils.uriToFile
|
||||||
import com.example.fieldagent.utils.visible
|
import com.example.fieldagent.utils.visible
|
||||||
|
import com.google.android.gms.common.api.ResolvableApiException
|
||||||
import com.google.android.gms.location.FusedLocationProviderClient
|
import com.google.android.gms.location.FusedLocationProviderClient
|
||||||
import com.google.android.gms.location.LocationCallback
|
import com.google.android.gms.location.LocationCallback
|
||||||
import com.google.android.gms.location.LocationResult
|
import com.google.android.gms.location.LocationResult
|
||||||
import com.google.android.gms.location.LocationServices
|
import com.google.android.gms.location.LocationServices
|
||||||
|
import com.google.android.gms.location.LocationSettingsRequest
|
||||||
import com.google.android.gms.location.Priority
|
import com.google.android.gms.location.Priority
|
||||||
import com.google.android.gms.tasks.CancellationTokenSource
|
import com.google.android.gms.tasks.CancellationTokenSource
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
|
@ -78,7 +88,7 @@ import java.util.ArrayList
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
import com.google.android.gms.location.*
|
||||||
|
|
||||||
@AndroidEntryPoint
|
@AndroidEntryPoint
|
||||||
class AddSiteFragment : Fragment() {
|
class AddSiteFragment : Fragment() {
|
||||||
|
@ -135,6 +145,7 @@ class AddSiteFragment : Fragment() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun listener(){
|
private fun listener(){
|
||||||
|
|
||||||
|
|
||||||
|
@ -213,20 +224,12 @@ class AddSiteFragment : Fragment() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
locationPermissionLauncher = registerForActivityResult(
|
|
||||||
ActivityResultContracts.RequestMultiplePermissions()
|
|
||||||
) { permissions ->
|
|
||||||
val granted = permissions[Manifest.permission.ACCESS_FINE_LOCATION] == true
|
|
||||||
if (granted) {
|
|
||||||
getCurrentLocation()
|
|
||||||
} else {
|
|
||||||
Toast.makeText(requireActivity(), getString(R.string.location_permission_denied), Toast.LENGTH_SHORT).show()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
binding.ivClickGps.setOnClickListener {
|
binding.ivClickGps.setOnClickListener {
|
||||||
checkLocationPermissionAndFetch();
|
getCurrentLocation()
|
||||||
|
// checkLocationPermissionAndFetch();
|
||||||
}
|
}
|
||||||
binding.ivCloseImage.setOnClickListener {
|
binding.ivCloseImage.setOnClickListener {
|
||||||
|
|
||||||
|
@ -249,6 +252,15 @@ class AddSiteFragment : Fragment() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
locationPermissionLauncher = registerForActivityResult(
|
||||||
|
ActivityResultContracts.RequestMultiplePermissions()
|
||||||
|
) { permissions ->
|
||||||
|
if (permissions[Manifest.permission.ACCESS_FINE_LOCATION] == true) {
|
||||||
|
getCurrentLocation()
|
||||||
|
} else {
|
||||||
|
Toast.makeText(requireContext(), "Location permission denied", Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
binding.etMosqueArea.addTextChangedListener(object : TextWatcher {
|
binding.etMosqueArea.addTextChangedListener(object : TextWatcher {
|
||||||
private var isEditing = false
|
private var isEditing = false
|
||||||
|
@ -383,50 +395,60 @@ class AddSiteFragment : Fragment() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun checkLocationPermissionAndFetch() {
|
|
||||||
if (ContextCompat.checkSelfPermission(requireActivity(), Manifest.permission.ACCESS_FINE_LOCATION)
|
|
||||||
== PackageManager.PERMISSION_GRANTED) {
|
|
||||||
getCurrentLocation()
|
|
||||||
} else {
|
|
||||||
locationPermissionLauncher.launch(
|
|
||||||
arrayOf(
|
|
||||||
Manifest.permission.ACCESS_FINE_LOCATION,
|
|
||||||
Manifest.permission.ACCESS_COARSE_LOCATION
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("MissingPermission")
|
|
||||||
private fun getCurrentLocation() {
|
private fun getCurrentLocation() {
|
||||||
val locationRequest = LocationRequest.Builder(
|
|
||||||
Priority.PRIORITY_HIGH_ACCURACY,
|
|
||||||
5000 // interval in milliseconds
|
|
||||||
).build()
|
|
||||||
fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null)
|
|
||||||
/* fusedLocationClient.lastLocation.addOnSuccessListener { location ->
|
|
||||||
if (location != null) {
|
|
||||||
getAddressFromLocation(location.latitude, location.longitude)
|
|
||||||
} else {
|
|
||||||
Toast.makeText(requireActivity(), getString(R.string.could_not_fetch_location), Toast.LENGTH_SHORT).show()
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stop location updates
|
if (ActivityCompat.checkSelfPermission(
|
||||||
private fun stopLocationUpdates() {
|
requireActivity(),
|
||||||
fusedLocationClient.removeLocationUpdates(locationCallback)
|
Manifest.permission.ACCESS_FINE_LOCATION
|
||||||
}
|
) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
|
||||||
|
requireActivity(),
|
||||||
private val locationCallback = object : LocationCallback() {
|
Manifest.permission.ACCESS_COARSE_LOCATION
|
||||||
override fun onLocationResult(locationResult: LocationResult) {
|
) != PackageManager.PERMISSION_GRANTED
|
||||||
super.onLocationResult(locationResult)
|
) {
|
||||||
// Process the location data
|
requestLocationPermission()
|
||||||
val location: Location = locationResult.lastLocation!!
|
return
|
||||||
Log.e("ChecLofgggf==>","${location.longitude}")
|
|
||||||
// ... (Display location on map, etc.) ...
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isLocationEnabled()) {
|
||||||
|
openLocationSettings()
|
||||||
|
} else {
|
||||||
|
fetchLocation()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun isLocationEnabled(): Boolean {
|
||||||
|
val locationManager = requireContext().getSystemService(Context.LOCATION_SERVICE) as LocationManager
|
||||||
|
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) ||
|
||||||
|
locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun openLocationSettings() {
|
||||||
|
val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS)
|
||||||
|
startActivity(intent)
|
||||||
|
}
|
||||||
|
@RequiresPermission(allOf = [Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION])
|
||||||
|
private fun fetchLocation() {
|
||||||
|
val cancellationTokenSource = CancellationTokenSource()
|
||||||
|
|
||||||
|
fusedLocationClient.getCurrentLocation(
|
||||||
|
Priority.PRIORITY_HIGH_ACCURACY,
|
||||||
|
cancellationTokenSource.token
|
||||||
|
).addOnSuccessListener { location: Location? ->
|
||||||
|
if (location != null) {
|
||||||
|
getAddressFromLocation(location.latitude,location.longitude)
|
||||||
|
} else {
|
||||||
|
Toast.makeText(requireContext(),getString(R.string.please_try_again_later) , Toast.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun requestLocationPermission() {
|
||||||
|
locationPermissionLauncher.launch(
|
||||||
|
arrayOf(
|
||||||
|
Manifest.permission.ACCESS_FINE_LOCATION,
|
||||||
|
Manifest.permission.ACCESS_COARSE_LOCATION
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getAddressFromLocation(latitude: Double, longitude: Double) {
|
private fun getAddressFromLocation(latitude: Double, longitude: Double) {
|
||||||
|
@ -478,6 +500,8 @@ class AddSiteFragment : Fragment() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private fun createImageFile(): File {
|
private fun createImageFile(): File {
|
||||||
val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
|
val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
|
||||||
val fileName = "JPEG_${timeStamp}_"
|
val fileName = "JPEG_${timeStamp}_"
|
||||||
|
|
|
@ -61,6 +61,7 @@ class AddSiteViewModel @Inject constructor(private val webService: WebService)
|
||||||
if (response.isSuccessful) {
|
if (response.isSuccessful) {
|
||||||
rooms.value = Resource.success(response.body())
|
rooms.value = Resource.success(response.body())
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
rooms.value = Resource.error(
|
rooms.value = Resource.error(
|
||||||
ApiUtils.getError(response.code(),
|
ApiUtils.getError(response.code(),
|
||||||
|
|
|
@ -107,6 +107,7 @@
|
||||||
<string name="pdf_saved">تم حفظ ملف PDF في المستندات!</string>
|
<string name="pdf_saved">تم حفظ ملف PDF في المستندات!</string>
|
||||||
<string name="pdf_failed">فشل في حفظ ملف PDF!</string>
|
<string name="pdf_failed">فشل في حفظ ملف PDF!</string>
|
||||||
<string name="contact_number_length_error">الرجاء إدخال رقم اتصال صالح يتكون من 7 إلى 11 رقمًا</string>
|
<string name="contact_number_length_error">الرجاء إدخال رقم اتصال صالح يتكون من 7 إلى 11 رقمًا</string>
|
||||||
|
<string name="please_try_again_later">يرجى المحاولة مرة أخرى لاحقا</string>
|
||||||
<string name="please_enter_valid_password">يجب أن تتكون كلمة المرور من 6 أحرف على الأقل وتتضمن حرفًا كبيرًا واحدًا ورقمًا واحدًا وحرفًا خاصًا واحدًا</string>
|
<string name="please_enter_valid_password">يجب أن تتكون كلمة المرور من 6 أحرف على الأقل وتتضمن حرفًا كبيرًا واحدًا ورقمًا واحدًا وحرفًا خاصًا واحدًا</string>
|
||||||
|
|
||||||
<string-array name="availability">
|
<string-array name="availability">
|
||||||
|
|
|
@ -106,6 +106,7 @@
|
||||||
<string name="vat">VAT</string>
|
<string name="vat">VAT</string>
|
||||||
<string name="pdf_saved">PDF saved to Documents!</string>
|
<string name="pdf_saved">PDF saved to Documents!</string>
|
||||||
<string name="pdf_failed">Failed to save PDF!</string>
|
<string name="pdf_failed">Failed to save PDF!</string>
|
||||||
|
<string name="please_try_again_later">Please try again later</string>
|
||||||
<string name="contact_number_length_error">Please enter a valid contact number with 7 to 11 digits</string>
|
<string name="contact_number_length_error">Please enter a valid contact number with 7 to 11 digits</string>
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<paths>
|
<paths xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<external-cache-path
|
|
||||||
name="external_cache_files"
|
|
||||||
path="." />
|
|
||||||
<external-files-path
|
<external-files-path
|
||||||
name="external_files_files"
|
name="my_images"
|
||||||
path="." />
|
path="Pictures" />
|
||||||
<external-path
|
|
||||||
name="external_files"
|
|
||||||
path="." />
|
|
||||||
</paths>
|
</paths>
|
Loading…
Reference in a new issue