diff --git a/app/build.gradle b/app/build.gradle index ba3ec9029d..99c1f95e15 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -68,6 +68,7 @@ dependencies { implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.60' implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2' implementation 'com.itkacher.okhttpprofiler:okhttpprofiler:1.0.5' + implementation "com.google.android.gms:play-services-location:17.0.0" implementation 'com.github.bumptech.glide:glide:4.10.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.10.0' implementation 'com.otaliastudios:cameraview:2.4.0' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e29485190a..8d585d899d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + , + locationRequest: LocationRequest + ) { + locationSettingsResponseTask.addOnSuccessListener { + fusedLocationClient.requestLocationUpdates( + locationRequest, + locationCallback, + Looper.getMainLooper() + ) + } + } + + private fun onFailureLocationSettingsResponse( + locationSettingsResponseTask: Task, + activity: Activity + ) { + locationSettingsResponseTask.addOnFailureListener { exception -> + if (exception is ResolvableApiException) { + exception.startResolutionForResult( + activity, + REQUEST_LOCATION_SETTINGS + ) + } + } + } + + override fun onActivityPaused(activity: Activity) { + fusedLocationClient.removeLocationUpdates(locationCallback) + } + + override fun onActivityResumed(activity: Activity) { + postLocation(activity) + } + + override fun onActivityStarted(activity: Activity) {} + + override fun onActivityDestroyed(activity: Activity) {} + + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} + + override fun onActivityStopped(activity: Activity) {} + + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {} + + companion object { + const val REQUEST_LOCATION_SETTINGS = 100 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navi/medici/androidCustomerApp/common/PermissionsManager.kt b/app/src/main/java/com/navi/medici/androidCustomerApp/manager/PermissionsManager.kt similarity index 89% rename from app/src/main/java/com/navi/medici/androidCustomerApp/common/PermissionsManager.kt rename to app/src/main/java/com/navi/medici/androidCustomerApp/manager/PermissionsManager.kt index d6a0acd0ca..42e83fae82 100644 --- a/app/src/main/java/com/navi/medici/androidCustomerApp/common/PermissionsManager.kt +++ b/app/src/main/java/com/navi/medici/androidCustomerApp/manager/PermissionsManager.kt @@ -1,7 +1,6 @@ -package com.navi.medici.androidCustomerApp.common +package com.navi.medici.androidCustomerApp.manager import android.app.Activity -import android.content.Context import android.content.pm.PackageManager import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat diff --git a/app/src/main/java/com/navi/medici/androidCustomerApp/manager/repositories/UserDataRepository.kt b/app/src/main/java/com/navi/medici/androidCustomerApp/manager/repositories/UserDataRepository.kt index e6064b4f8c..c93dfe418f 100644 --- a/app/src/main/java/com/navi/medici/androidCustomerApp/manager/repositories/UserDataRepository.kt +++ b/app/src/main/java/com/navi/medici/androidCustomerApp/manager/repositories/UserDataRepository.kt @@ -1,10 +1,14 @@ package com.navi.medici.androidCustomerApp.manager.repositories import com.navi.medici.androidCustomerApp.models.UserInstalledApp +import com.navi.medici.androidCustomerApp.models.UserLocation import com.navi.medici.androidCustomerApp.network.retrofit.ResponseCallback import com.navi.medici.androidCustomerApp.utils.retrofitService class UserDataRepository : ResponseCallback() { suspend fun postInstalledApps(installedApps: List) = apiResponseCallback(retrofitService().postInstalledApps(installedApps)) + + suspend fun postLocation(location: UserLocation) = + apiResponseCallback(retrofitService().postLocation(location)) } \ No newline at end of file diff --git a/app/src/main/java/com/navi/medici/androidCustomerApp/models/UserLocation.kt b/app/src/main/java/com/navi/medici/androidCustomerApp/models/UserLocation.kt new file mode 100644 index 0000000000..a1638ba1ff --- /dev/null +++ b/app/src/main/java/com/navi/medici/androidCustomerApp/models/UserLocation.kt @@ -0,0 +1,9 @@ +package com.navi.medici.androidCustomerApp.models + +import com.google.gson.annotations.SerializedName + +data class UserLocation( + @SerializedName("latitude") val latitude: String?, + @SerializedName("longitude") val longitude: String?, + @SerializedName("date") val date: String? +) diff --git a/app/src/main/java/com/navi/medici/androidCustomerApp/network/retrofit/RetrofitService.kt b/app/src/main/java/com/navi/medici/androidCustomerApp/network/retrofit/RetrofitService.kt index 05b9230055..693b417161 100644 --- a/app/src/main/java/com/navi/medici/androidCustomerApp/network/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/navi/medici/androidCustomerApp/network/retrofit/RetrofitService.kt @@ -6,10 +6,7 @@ package com.navi.medici.androidCustomerApp.network.retrofit -import com.navi.medici.androidCustomerApp.models.ApplicationSummary -import com.navi.medici.androidCustomerApp.models.OfferResponse -import com.navi.medici.androidCustomerApp.models.OfferSelected -import com.navi.medici.androidCustomerApp.models.UserInstalledApp +import com.navi.medici.androidCustomerApp.models.* import com.navi.medici.androidCustomerApp.models.request.* import com.navi.medici.androidCustomerApp.models.response.* import com.navi.medici.androidCustomerApp.network.GenericResponse @@ -104,4 +101,8 @@ interface RetrofitService { //User data @POST("/user-device-data/apps") suspend fun postInstalledApps(@Body installedApps: List): Response> + + @POST("/user-device-data/location") + suspend fun postLocation(@Body userLocation: UserLocation): Response> + } \ No newline at end of file diff --git a/app/src/main/java/com/navi/medici/androidCustomerApp/registration/RegistrationActivity.kt b/app/src/main/java/com/navi/medici/androidCustomerApp/registration/RegistrationActivity.kt index 35c93e0d6d..e9c2ce21b2 100644 --- a/app/src/main/java/com/navi/medici/androidCustomerApp/registration/RegistrationActivity.kt +++ b/app/src/main/java/com/navi/medici/androidCustomerApp/registration/RegistrationActivity.kt @@ -6,6 +6,7 @@ package com.navi.medici.androidCustomerApp.registration +import android.Manifest import android.content.Intent import android.os.Bundle import androidx.databinding.DataBindingUtil @@ -13,6 +14,8 @@ import androidx.fragment.app.Fragment import com.navi.medici.androidCustomerApp.R import com.navi.medici.androidCustomerApp.common.BaseActivity import com.navi.medici.androidCustomerApp.databinding.RegistrationActivityBinding +import com.navi.medici.androidCustomerApp.manager.LocationManager +import com.navi.medici.androidCustomerApp.manager.PermissionsManager import com.navi.medici.androidCustomerApp.manager.repositories.UserDataRepository import com.navi.medici.androidCustomerApp.models.UserInstalledApp import com.navi.medici.androidCustomerApp.registration.listeners.RegistrationScreenListener @@ -26,15 +29,29 @@ class RegistrationActivity : BaseActivity(), RegistrationScreenListener { private lateinit var binding: RegistrationActivityBinding private val coroutineScope = CoroutineScope(Dispatchers.Default) + private val locationManager = LocationManager() + private val permissionsManager = PermissionsManager(this) + private val permissions = arrayOf(Manifest.permission.ACCESS_FINE_LOCATION) + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - postInstalledPackages() + readUserData() binding = DataBindingUtil.setContentView(this, R.layout.registration_activity) onLoginScreen() } + + private fun readUserData() { + postInstalledPackages() + if (permissionsManager.hasPermissions(permissions)) { + locationManager.postLocation(this) + } else { + permissionsManager.requestPermissions(permissions) + } + } + private fun postInstalledPackages() { val installedApps: List try { @@ -49,6 +66,21 @@ class RegistrationActivity : BaseActivity(), RegistrationScreenListener { } } + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == PermissionsManager.REQUEST_CODE) { + if (permissionsManager.hasPermissions(this.permissions)) { + readUserData() + } else { + permissionsManager.requestPermissions(this.permissions) + } + } + } + private fun navigateTo(screen: Int, data: String? = null) { val fragmentManager = supportFragmentManager.beginTransaction() val tag = getTag(screen) @@ -62,6 +94,13 @@ class RegistrationActivity : BaseActivity(), RegistrationScreenListener { fragmentManager.commit() } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == LocationManager.REQUEST_LOCATION_SETTINGS) { + locationManager.postLocation(this) + } + } + private fun getFragment(screen: Int, data: String? = null): Fragment { return when (screen) { LOGIN_SCREEN -> {