location update acc to android 14

This commit is contained in:
Aryankc2 2025-05-05 12:51:50 +05:30
parent a77f993d78
commit dfe3f2116f
6 changed files with 93 additions and 66 deletions

View file

@ -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"
/> />

View file

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

View file

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

View file

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

View file

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

View file

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