Merge pull request #2815 from medici/task/hl-location-permission

Task/hl location permission
This commit is contained in:
rahul bhat
2022-05-12 12:31:15 +05:30
committed by GitHub Enterprise
19 changed files with 443 additions and 30 deletions

View File

@@ -1427,7 +1427,7 @@ class NaviAnalytics private constructor() {
fun onLoaderShown() =
NaviTrackEvent.trackEvent("PL_EmploymentVerification_LoaderVerify_Shown")
fun onSendOtp() {
NaviTrackEvent.trackEventOnAllThirdParty("send_otp_for_epfo")
NaviTrackEvent.trackEventOnClickStream("PL_EmploymentVerification_GenerateOTP_Clicked")
@@ -3783,6 +3783,7 @@ class NaviAnalytics private constructor() {
const val CO_APPLICANT_DETAIL_BOTTOM_SHEET = "HL_AddCoapplicant_Bottomsheet"
const val HOME_LOAN_OFFER_REDUCTION_BOTTOM_SHEET = "HL_Ofer_Reduction_Bottomsheet"
const val HOME_LOAN_CO_APPLICANT_NUDGE_BOTTOM_SHEET = "HL_Coapplicant_Nudge_Bottomsheet"
const val PERMISSION_REQUEST_BOTTOM_SHEET = "HL_location_permission_request_Bottomsheet"
const val HOME_LOAN_FORM = "home_loan_form"
const val HOME_LOAN_ELIGIBILITY_V2 = "home_loan_eligibility_v2"
const val HOME_LOAN_DETAILS_V2 = "home_loan_eligibility_v2"

View File

@@ -130,12 +130,18 @@ abstract class BaseActivity : AppCompatActivity(), Toolbar.OnMenuItemClickListen
inAppUpdate.addInAppUpdateListener(this)
}
private fun checkLocationPermission(eventName: String? = null) {
private fun checkLocationPermission(
eventName: String? = null,
businessVertical: String? = null,
screenName: String? = null
) {
if (permissionsManager?.hasPermissions(
locationPermission
).orFalse()
) {
locationManager.setEventName(eventName)
locationManager.setBusinessVertical(businessVertical)
locationManager.setScreenName(screenName)
locationManager.postLocationData(this)
}
}
@@ -548,14 +554,18 @@ abstract class BaseActivity : AppCompatActivity(), Toolbar.OnMenuItemClickListen
}
}
private fun updateLocationDataToServer(eventName: String? = null) {
private fun updateLocationDataToServer(
eventName: String? = null,
businessVertical: String? = null,
screenName: String? = null
) {
PreferenceManager.setBooleanPreference(NaviLocationManager.IS_HARD_LOCATION_UPDATE, true)
if (CommonUtils.isUserLoggedIn())
checkLocationPermission(eventName)
checkLocationPermission(eventName, businessVertical, screenName)
}
override fun updateLocation(data: String?) {
updateLocationDataToServer(data)
override fun updateLocation(data: String?, businessVertical: String?, screenName: String?) {
updateLocationDataToServer(data, businessVertical, screenName)
}
fun updateApp(

View File

@@ -8,5 +8,5 @@ package com.naviapp.common.listeners
interface LocationUpdateListener {
fun updateLocation(data: String?)
fun updateLocation(data: String?, businessVertical: String? = null, screenName: String? = null)
}

View File

@@ -0,0 +1,92 @@
package com.naviapp.homeloandigital.common.customview
/*
*
* * Copyright © 2021 by Navi Technologies Private Limited
* * All rights reserved. Strictly confidential
*
*/
import android.os.Bundle
import android.view.View
import android.view.ViewStub
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.naviapp.R
import com.naviapp.analytics.utils.NaviAnalytics
import com.naviapp.common.customview.BaseBottomSheet
import com.naviapp.databinding.PermissionRequestBottomSheetBinding
import com.naviapp.homeloandigital.models.response.PermissionRequestBottomSheetResponse
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class PermissionRequestBottomSheet : BaseBottomSheet() {
private lateinit var binding: PermissionRequestBottomSheetBinding
private var _bottomSheetSecondaryButtonClicked = MutableLiveData<String>()
val bottomSheetSecondaryButtonClicked: LiveData<String>
get() = _bottomSheetSecondaryButtonClicked
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setStyle(STYLE_NORMAL, R.style.DialogStyleAdjustResizeInput)
isCancelable = false
}
override fun setContainerView(viewStub: ViewStub) {
viewStub.layoutResource = R.layout.permission_request_bottom_sheet
binding = DataBindingUtil.getBinding(viewStub.inflate())!!
initListeners()
initUI()
}
private fun initUI() {
val data =
arguments?.getParcelable<PermissionRequestBottomSheetResponse>(
PERMISSION_REQUEST_BOTTOM_SHEET
)
binding.response = data
data?.primaryCta?.let { ctaData ->
binding.primaryAbv.visibility = View.VISIBLE
ctaData.title?.let {
binding.primaryAbv.setProperties(it)
}
}
data?.secondaryCta?.let { ctaData ->
binding.secondaryAbv.visibility = View.VISIBLE
ctaData.title?.let {
binding.secondaryAbv.setProperties(title = it, titleColor = R.color.red)
}
binding.secondaryAbv.setABVBackgroundColor(R.drawable.bg_red_rounded_border_8)
}
}
private fun initListeners() {
binding.secondaryAbv.setOnClickListener {
dismiss()
}
binding.primaryAbv.setOnClickListener {
_bottomSheetSecondaryButtonClicked.value =
arguments?.getParcelable<PermissionRequestBottomSheetResponse>(
PERMISSION_REQUEST_BOTTOM_SHEET
)?.primaryCta?.url
dismiss()
}
}
override val screenName: String
get() = NaviAnalytics.PERMISSION_REQUEST_BOTTOM_SHEET
companion object {
const val TAG = "PermissionRequestBottomSheet"
const val PERMISSION_REQUEST_BOTTOM_SHEET = "PERMISSION_REQUEST_BOTTOM_SHEET"
const val LOCATION_PERMISSION = "LOCATION_PERMISSION"
fun getInstance(bundle: Bundle?): PermissionRequestBottomSheet {
return PermissionRequestBottomSheet().apply {
arguments = bundle
}
}
}
}

View File

@@ -0,0 +1,24 @@
package com.naviapp.homeloandigital.common.viewmodel
/*
*
* * Copyright © 2021 by Navi Technologies Private Limited
* * All rights reserved. Strictly confidential
*
*/
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.naviapp.common.viewmodel.BaseVM
class PermissionVM() : BaseVM() {
private val _permissionResultData = MutableLiveData<Triple<Array<out String>, IntArray, Int>>()
val permissionResultData: LiveData<Triple<Array<out String>, IntArray, Int>>
get() = _permissionResultData
fun setPermissionData(data: Triple<Array<out String>, IntArray, Int>?) {
_permissionResultData.value = data
}
}

View File

@@ -11,10 +11,11 @@ import com.naviapp.databinding.HomeLoanEligibilityV2Binding
import com.naviapp.homeloandigital.common.ui.activity.BaseHomeLoanActivity
import com.naviapp.homeloandigital.common.ui.activity.FragmentContainer
import com.naviapp.homeloandigital.common.ui.customview.TopNavigationHeaderInterface
import com.naviapp.homeloandigital.common.viewmodel.PermissionVM
import com.naviapp.homeloandigital.eligibility.fragment.HomeLoanSelectTypeFragment
import com.naviapp.homeloandigital.eligibility.fragment.cityinput.HomeLoanSearchInputFormFragment
import com.naviapp.homeloandigital.models.HelpBottomSheetData
import com.naviapp.homeloandigital.posteligibility.fragment.SelfieVerificationFragment
import com.naviapp.homeloandigital.posteligibility.viewmodel.SelfieVerificationSharedVM
import com.naviapp.models.LendingModuleName
import com.naviapp.utils.Constants
import dagger.hilt.android.AndroidEntryPoint
@@ -22,7 +23,7 @@ import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class HomeLoanEligibilityV2Activity : BaseHomeLoanActivity(), FragmentContainer,
TopNavigationHeaderInterface {
private val sharedVM by lazy { ViewModelProvider(this).get(SelfieVerificationSharedVM::class.java) }
private val permissionSharedVM by lazy { ViewModelProvider(this).get(PermissionVM::class.java) }
private lateinit var binding: HomeLoanEligibilityV2Binding
@@ -67,11 +68,12 @@ class HomeLoanEligibilityV2Activity : BaseHomeLoanActivity(), FragmentContainer,
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (!isValidRequestCode(requestCode) || permissions.isEmpty()) return
sharedVM.setPermissionData(Triple(permissions, grantResults, requestCode))
permissionSharedVM.setPermissionData(Triple(permissions, grantResults, requestCode))
}
private fun isValidRequestCode(requestCode: Int) =
requestCode == SelfieVerificationFragment.SELFIE_REQUEST_CODE
requestCode == SelfieVerificationFragment.SELFIE_REQUEST_CODE ||
requestCode == HomeLoanSearchInputFormFragment.LOCATION_REQUEST_CODE
override fun getCurrentFragmentScreenName(): String {
return try {

View File

@@ -1,23 +1,36 @@
package com.naviapp.homeloandigital.eligibility.fragment.cityinput
import android.Manifest
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.content.PermissionChecker
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import com.navi.common.utils.clicks
import com.navi.common.utils.throttleFirst
import com.navi.common.sharedpref.PreferenceManager
import com.navi.naviwidgets.callbacks.WidgetCallback
import com.navi.naviwidgets.widgets.labeledinputsearch.LabeledTextInputSearchWidgetModel
import com.navi.naviwidgets.widgets.textdisplay.TextDisplayWidgetModel
import com.naviapp.BuildConfig
import com.naviapp.R
import com.naviapp.analytics.utils.NaviAnalytics
import com.naviapp.app.NaviApplication
import com.naviapp.common.listeners.BackListener
import com.naviapp.common.listeners.LocationUpdateListener
import com.naviapp.databinding.FragmentCityInputFormBinding
import com.naviapp.homeloandigital.common.adapter.PropertyRowAdapter
import com.naviapp.homeloandigital.common.adapter.PropertyRowSelectInterface
import com.naviapp.homeloandigital.common.customview.PermissionRequestBottomSheet
import com.naviapp.homeloandigital.common.customview.PermissionRequestBottomSheet.Companion.LOCATION_PERMISSION
import com.naviapp.homeloandigital.common.ui.customview.TopNavigationHeaderInterface
import com.naviapp.homeloandigital.common.viewmodel.PermissionVM
import com.naviapp.homeloandigital.eligibility.fragment.form.FormBaseFragment
import com.naviapp.homeloandigital.models.FormResponse
import com.naviapp.homeloandigital.models.InputSearchResponse
@@ -25,6 +38,10 @@ import com.naviapp.models.response.CommonSearchRow
import com.naviapp.utils.Constants
import com.naviapp.utils.orFalse
import com.naviapp.utils.textChanges
import com.naviapp.homeloandigital.models.response.PermissionRequestBottomSheetResponse
import com.naviapp.homeloandigital.models.response.PermissionRequestData
import com.naviapp.manager.PermissionsManager
import com.naviapp.utils.*
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.MainScope
import kotlinx.coroutines.flow.*
@@ -41,6 +58,8 @@ class HomeLoanSearchInputFormFragment : FormBaseFragment(), BackListener, Widget
private var selectedRowData: CommonSearchRow? = null
private val analyticsTracker = NaviAnalytics.naviAnalytics.HomeLoanForm()
private var listener: TopNavigationHeaderInterface? = null
private val permissionsManager by lazy { PermissionsManager(requireActivity()) }
private var locationUpdateListener: LocationUpdateListener? = null
private var adapter: PropertyRowAdapter =
PropertyRowAdapter(object : PropertyRowSelectInterface {
@@ -59,6 +78,8 @@ class HomeLoanSearchInputFormFragment : FormBaseFragment(), BackListener, Widget
private val linearLayoutManager = LinearLayoutManager(activity)
companion object {
const val LOCATION_REQUEST_CODE = 301
const val LOCATION_REQUEST_BOTTOM_SHEET_SHOWN = "LOCATION_REQUEST_BOTTOM_SHEET_SHOWN"
private const val FORM_ACTION = "action"
fun newInstance(bundle: Bundle? = null): HomeLoanSearchInputFormFragment {
return HomeLoanSearchInputFormFragment().apply {
@@ -120,6 +141,17 @@ class HomeLoanSearchInputFormFragment : FormBaseFragment(), BackListener, Widget
}
override fun processFormResponseData(formResponse: FormResponse) {
activity?.let {
val permissionSharedVM = ViewModelProvider(it).get(PermissionVM::class.java)
observePermissionResult(permissionSharedVM)
}
formResponse.content?.permissionRequestData?.forEach { element ->
if (element.permissionType == Constants.LOCATION && element.askForPermission.orFalse()) {
requestLocationPermission(element)
}
}
val textDisplayWidgetModel =
formResponse.content?.widgetList?.filterIsInstance<TextDisplayWidgetModel>()?.first()
val searchWidgetModel =
@@ -197,6 +229,87 @@ class HomeLoanSearchInputFormFragment : FormBaseFragment(), BackListener, Widget
}
}
private fun requestLocationPermission(locationPermissionData: PermissionRequestData) {
if (permissionsManager.hasPermissions(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION))) {
sendLocation(locationPermissionData)
} else {
permissionsManager.requestPermissions(
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
LOCATION_REQUEST_CODE
)
}
}
private fun observePermissionResult(permissionSharedVM: PermissionVM) {
permissionSharedVM.permissionResultData.observeNonNull(this) {
when (it.third) {
LOCATION_REQUEST_CODE -> handleLocationPermissions(it)
}
permissionSharedVM.setPermissionData(null)
}
}
private fun handleLocationPermissions(permissionResult: Triple<Array<out String>, IntArray, Int>) {
if (permissionResult.second.firstOrNull() == PermissionChecker.PERMISSION_GRANTED) {
formResponse?.content?.permissionRequestData?.firstOrNull { it.permissionType == Constants.LOCATION }
?.let {
sendLocation(it)
}
} else {
formResponse?.content?.permissionRequestData?.firstOrNull {
it.permissionType == Constants.LOCATION
}?.permissionRequestBottomSheetData?.let {
if (!PreferenceManager.getBooleanPreference(
LOCATION_REQUEST_BOTTOM_SHEET_SHOWN,
false
)
) {
openPermissionRequestBottomSheet(it)
}
}
}
}
private fun openPermissionRequestBottomSheet(data: PermissionRequestBottomSheetResponse) {
PreferenceManager.setBooleanPreference(LOCATION_REQUEST_BOTTOM_SHEET_SHOWN, true)
val bundle = Bundle().apply {
putParcelable(
PermissionRequestBottomSheet.PERMISSION_REQUEST_BOTTOM_SHEET,
data
)
}
val bottomSheet = PermissionRequestBottomSheet.getInstance(bundle)
safelyShowBottomSheet(
bottomSheet,
PermissionRequestBottomSheet.TAG,
)
bottomSheet.bottomSheetSecondaryButtonClicked.observeNonNull(viewLifecycleOwner) {
if (it == LOCATION_PERMISSION) openNativePermissionPage()
}
}
private fun openNativePermissionPage() {
try {
val context = NaviApplication.instance.applicationContext
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.parse(Constants.PACKAGE.plus(BuildConfig.APPLICATION_ID))
)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent)
} catch (e: Exception) {
e.log()
}
}
private fun sendLocation(locationPermissionData: PermissionRequestData) {
locationUpdateListener?.updateLocation(
locationPermissionData.eventName,
locationPermissionData.businessVertical,
locationPermissionData.screenName
)
}
override fun onBackPressed() {
viewModel.formGetResponse.value?.header?.backCta?.let {
moveToNextScreen(it)
@@ -205,9 +318,20 @@ class HomeLoanSearchInputFormFragment : FormBaseFragment(), BackListener, Widget
}
}
override fun onResume() {
super.onResume()
formResponse?.content?.permissionRequestData?.firstOrNull { it.permissionType == Constants.LOCATION }
?.let { locationPermissionData ->
if (permissionsManager.hasPermissions(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION))) {
sendLocation(locationPermissionData)
}
}
}
override fun onAttach(context: Context) {
super.onAttach(context)
listener = context as? TopNavigationHeaderInterface
locationUpdateListener = context as? LocationUpdateListener
}
override fun onFocusChange(widgetId: String?, hasFocus: Boolean, input: String?) {

View File

@@ -2,8 +2,11 @@ package com.naviapp.homeloandigital.models
import com.google.gson.annotations.SerializedName
import com.navi.naviwidgets.models.NaviWidget
import com.naviapp.homeloandigital.models.response.PermissionRequestData
data class FormContent(
@SerializedName("widgets")
var widgetList: ArrayList<NaviWidget>? = null
var widgetList: ArrayList<NaviWidget>? = null,
@SerializedName("permissionRequestData")
var permissionRequestData: List<PermissionRequestData>? = null
)

View File

@@ -23,7 +23,8 @@ data class HomeLoanTrackerContent(
@SerializedName("title") val title: String? = null,
@SerializedName("offerReductionBottomSheetData") val offerReductionBottomSheetData: OfferReductionBottomSheetData? = null,
@SerializedName("coApplicantNudgeBottomSheet") val coApplicantNudgeBottomSheetData: CoApplicantNudgeBottomSheetData? = null,
@SerializedName("steps") val steps: List<HomeLoanStepResponse>? = null
@SerializedName("steps") val steps: List<HomeLoanStepResponse>? = null,
@SerializedName("permissionRequestData") var permissionRequestData: List<PermissionRequestData>? = null
)
@Parcelize

View File

@@ -0,0 +1,22 @@
package com.naviapp.homeloandigital.models.response
/*
*
* * Copyright © 2021 by Navi Technologies Private Limited
* * All rights reserved. Strictly confidential
*
*/
import android.os.Parcelable
import com.google.gson.annotations.SerializedName
import com.navi.common.model.CtaData
import kotlinx.android.parcel.Parcelize
@Parcelize
data class PermissionRequestBottomSheetResponse(
@SerializedName("title") val title: String? = null,
@SerializedName("subtitle") val subtitle: String? = null,
@SerializedName("description") val description: String? = null,
@SerializedName("primaryCta") val primaryCta: CtaData? = null,
@SerializedName("secondaryCta") val secondaryCta: CtaData? = null
) : Parcelable

View File

@@ -0,0 +1,19 @@
package com.naviapp.homeloandigital.models.response
/*
*
* * Copyright © 2021 by Navi Technologies Private Limited
* * All rights reserved. Strictly confidential
*
*/
import com.google.gson.annotations.SerializedName
data class PermissionRequestData(
@SerializedName("permissionType") var permissionType: String? = null,
@SerializedName("businessVertical") var businessVertical: String? = null,
@SerializedName("screenName") var screenName: String? = null,
@SerializedName("eventName") var eventName: String? = null,
@SerializedName("askForPermission") var askForPermission: Boolean? = null,
@SerializedName("permissionBottomSheet") var permissionRequestBottomSheetData: PermissionRequestBottomSheetResponse? = null
)

View File

@@ -26,6 +26,7 @@ import com.naviapp.homeloandigital.common.ui.activity.FragmentContainer
import com.naviapp.homeloandigital.common.ui.activity.SubScreen
import com.naviapp.homeloandigital.common.ui.customview.TopNavigationHeaderInterface
import com.naviapp.homeloandigital.common.ui.fragment.skipstep.SkipStepBottomSheet
import com.naviapp.homeloandigital.common.viewmodel.PermissionVM
import com.naviapp.homeloandigital.models.HLAdhaarResponse
import com.naviapp.homeloandigital.models.HelpBottomSheetData
import com.naviapp.homeloandigital.models.HomeLoanSelfieUploadRequestData
@@ -61,6 +62,7 @@ class HomeLoanPostEligibilityV2Activity : BaseHomeLoanActivity(),
private val viewModel by lazy { ViewModelProvider(this).get(HomeLoanPostEligibilityV2ActivityVM::class.java) }
private val analyticsEventTracker = NaviAnalytics.naviAnalytics.HomeLoanPostEligibility()
private val kycSharedVM by lazy { ViewModelProvider(this).get(KycSharedVM::class.java) }
private val permissionSharedVM by lazy { ViewModelProvider(this).get(PermissionVM::class.java) }
private val sharedVM by lazy { ViewModelProvider(this).get(SelfieVerificationSharedVM::class.java) }
private val selfieVerificationHelper by lazy { HomeLoanSelfieCaptureHelper() }
private val aadhaarVerificationHelper by lazy { AadhaarVerificationHelper() }
@@ -255,7 +257,7 @@ class HomeLoanPostEligibilityV2Activity : BaseHomeLoanActivity(),
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (!isValidRequestCode(requestCode) || permissions.isEmpty()) return
sharedVM.setPermissionData(Triple(permissions, grantResults, requestCode))
permissionSharedVM.setPermissionData(Triple(permissions, grantResults, requestCode))
onAadhaarRequestUpdate(permissions, grantResults, requestCode)
}

View File

@@ -25,6 +25,7 @@ import com.naviapp.firebasedb.*
import com.naviapp.homeloandigital.common.ui.activity.Navigator
import com.naviapp.homeloandigital.common.ui.customview.TopNavigationHeaderInterface
import com.naviapp.homeloandigital.common.ui.fragment.BaseHomeLoanFragment
import com.naviapp.homeloandigital.common.viewmodel.PermissionVM
import com.naviapp.homeloandigital.models.AWSPresignedUrlRequest
import com.naviapp.homeloandigital.models.AWSPresignedUrlResponse
import com.naviapp.homeloandigital.models.HomeLoanSelfieUploadRequestData
@@ -77,16 +78,17 @@ class SelfieVerificationFragment : BaseHomeLoanFragment(),
activity?.let {
val sharedVM = ViewModelProvider(it).get(SelfieVerificationSharedVM::class.java)
observeSelfieResponse(sharedVM)
observePermissionResult(sharedVM)
val permissionSharedVM = ViewModelProvider(it).get(PermissionVM::class.java)
observePermissionResult(permissionSharedVM)
}
}
private fun observePermissionResult(sharedVM: SelfieVerificationSharedVM) {
sharedVM.permissionResultData.observeNonNull(this) {
private fun observePermissionResult(permissionSharedVM: PermissionVM) {
permissionSharedVM.permissionResultData.observeNonNull(this) {
when (it.third) {
SELFIE_REQUEST_CODE -> handleSelfiePermissions(it)
}
sharedVM.setPermissionData(null)
permissionSharedVM.setPermissionData(null)
}
}

View File

@@ -4,7 +4,6 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import com.naviapp.common.viewmodel.BaseVM
import com.naviapp.homeloandigital.models.HomeLoanSelfieUploadRequestData
import com.naviapp.models.request.SelfieUploadRequestData
import com.naviapp.selfiecapture.SelfieErrorData
class SelfieVerificationSharedVM() :
@@ -14,10 +13,6 @@ class SelfieVerificationSharedVM() :
val selfieRequestData: LiveData<HomeLoanSelfieUploadRequestData>
get() = _selfieRequestData
private val _permissionResultData = MutableLiveData<Triple<Array<out String>, IntArray, Int>>()
val permissionResultData: LiveData<Triple<Array<out String>, IntArray, Int>>
get() = _permissionResultData
private val _selfieErrorData = MutableLiveData<SelfieErrorData>()
val selfieErrorData: LiveData<SelfieErrorData>
get() = _selfieErrorData
@@ -29,9 +24,4 @@ class SelfieVerificationSharedVM() :
fun setSelfieErrorData(data: SelfieErrorData) {
_selfieErrorData.value = data
}
fun setPermissionData(data: Triple<Array<out String>, IntArray, Int>?) {
_permissionResultData.value = data
}
}

View File

@@ -1,6 +1,8 @@
package com.naviapp.homeloandigital.tracker.ui.activity
import android.app.Activity
import android.Manifest
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.view.ViewTreeObserver
@@ -38,6 +40,7 @@ import com.naviapp.homeloandigital.tracker.ui.customview.HomeLoanApplicantInfoVi
import com.naviapp.homeloandigital.tracker.ui.listener.HomeLoanSubStepsAdapterListener
import com.naviapp.homeloandigital.tracker.viewmodel.HomeLoanTrackerVM
import com.naviapp.models.LendingModuleName
import com.naviapp.manager.PermissionsManager
import com.naviapp.models.response.BottomSheetData
import com.naviapp.utils.*
import com.naviapp.utils.Constants.NEED_TO_SHOW_HL_INCOME_SUCCESS_DIALOG
@@ -52,6 +55,7 @@ class HomeLoanTrackerActivity : BaseHomeLoanActivity(), HomeLoanSubStepsAdapterL
private lateinit var binding: ActivityHlLoanTrackerBinding
private val trackerViewModel by lazy { ViewModelProvider(this).get(HomeLoanTrackerVM::class.java) }
private lateinit var layoutManager: LinearLayoutManager
private val permissionsManager by lazy { PermissionsManager(this) }
private var listItems: List<HomeLoanSubStepResponse> = listOf()
private val loadTimeEventTracker = LoadTimeEventTracker()
private var naviDownloadManager: NaviDownloadManager? = null
@@ -134,6 +138,11 @@ class HomeLoanTrackerActivity : BaseHomeLoanActivity(), HomeLoanSubStepsAdapterL
homeLoanTrackerResponse.content?.offerReductionBottomSheetData?.let {
openOfferReductionBottomSheet(it)
}
homeLoanTrackerResponse.content?.permissionRequestData?.forEach { element ->
if (element.permissionType == Constants.LOCATION) {
postLocationIfHasPermission(element)
}
}
}
}
trackerViewModel.sendLinkResponse.observe(this) { response ->
@@ -622,6 +631,16 @@ class HomeLoanTrackerActivity : BaseHomeLoanActivity(), HomeLoanSubStepsAdapterL
super.onDestroy()
}
private fun postLocationIfHasPermission(locationPermissionData: PermissionRequestData) {
if (permissionsManager.hasPermissions(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION))) {
updateLocation(
locationPermissionData.eventName,
locationPermissionData.businessVertical,
locationPermissionData.screenName
)
}
}
override val screenName: String = Constants.EMPTY
override val moduleName: LendingModuleName
get() = LendingModuleName.HL

View File

@@ -43,6 +43,8 @@ class NaviLocationManager : Application.ActivityLifecycleCallbacks {
private val coroutineScope = CoroutineScope(Dispatchers.Default + exceptionHandler)
private val analyticsTracker = NaviAnalytics.naviAnalytics.NaviLocationManager()
private var eventName: String? = null
private var businessVertical: String? = null
private var screenName: String? = null
private val _locationPollingData = MutableLiveData<UploadDataAsyncResponse?>()
val locationPollingData: LiveData<UploadDataAsyncResponse?>
get() = _locationPollingData
@@ -56,7 +58,9 @@ class NaviLocationManager : Application.ActivityLifecycleCallbacks {
location.latitude.toString(),
location.longitude.toString(),
location.time.toString(),
eventData = if (eventName.isNullOrBlank()) null else EventData(eventName = eventName)
eventData = if (eventName.isNullOrBlank()) null else EventData(eventName = eventName),
businessVertical = businessVertical,
screenName = screenName
)
CommonUtils.saveUserLocation(userLocation)
PreferenceManager.setBooleanPreference(
@@ -81,6 +85,8 @@ class NaviLocationManager : Application.ActivityLifecycleCallbacks {
analyticsTracker.onLocationPostStartTime()
coroutineScope.launch {
eventName = null
businessVertical = null
screenName = null
PreferenceManager.setBooleanPreference(IS_HARD_LOCATION_UPDATE, false)
val response = UserDataRepository().postLocation(location)
analyticsTracker.onLocationPostEndTime()
@@ -226,6 +232,12 @@ class NaviLocationManager : Application.ActivityLifecycleCallbacks {
fun setEventName(event: String? = null) {
this.eventName = event
}
fun setBusinessVertical(businessVertical: String? = null) {
this.businessVertical = businessVertical
}
fun setScreenName(screenName: String? = null) {
this.screenName = screenName
}
companion object {
const val REQUEST_LOCATION_SETTINGS = 100

View File

@@ -206,4 +206,5 @@ object Constants {
const val SCALE_ONE = 1f
const val SCALE_ONE_AND_HALF = 1.5f
const val LOAN_ACCOUNT_NUMBER = "loanAccountNumber"
const val LOCATION = "LOCATION"
}

View File

@@ -0,0 +1,87 @@
<?xml version="1.0" encoding="utf-8"?><!--
~ /*
~ * Copyright © 2021 by Navi Technologies Private Limited
~ * All rights reserved. Strictly confidential
~ */
-->
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="response"
type="com.naviapp.homeloandigital.models.response.PermissionRequestBottomSheetResponse" />
<import type="android.view.View" />
<import type="android.text.TextUtils" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/layout_dp_20">
<TextView
android:id="@+id/title_tv"
style="@style/SmallBannerFontStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{response.title}"
android:visibility="@{(TextUtils.isEmpty(response.title))? View.GONE : View.VISIBLE}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Your offer has reduced" />
<TextView
android:id="@+id/subtitle_tv"
style="@style/LineItemFontStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_dp_18"
android:letterSpacing="0.03"
android:text="@{response.subtitle}"
android:visibility="@{(TextUtils.isEmpty(response.subtitle))? View.GONE : View.VISIBLE}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/title_tv"
tools:text="NAVI requires you to allow location permission to continue this process" />
<TextView
android:id="@+id/description_tv"
style="@style/AgreementFontStyleGrey"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_dp_16"
android:letterSpacing="0.03"
android:text="@{response.description}"
android:visibility="@{(TextUtils.isEmpty(response.description))? View.GONE : View.VISIBLE}"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/subtitle_tv"
tools:text="This happpened due to low financial eligibility of your co-applicant Sahiti." />
<com.naviapp.common.customview.ActionButtonView
android:id="@+id/primary_abv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_dp_24"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/description_tv"
tools:visibility="visible" />
<com.naviapp.common.customview.ActionButtonView
android:id="@+id/secondary_abv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_dp_8"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/primary_abv"
tools:visibility="visible" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>

View File

@@ -13,7 +13,9 @@ data class UserLocation(
@SerializedName("latitude") val latitude: String?,
@SerializedName("longitude") val longitude: String?,
@SerializedName("date") val date: String? = null,
@SerializedName("eventData") val eventData: EventData? = null
@SerializedName("eventData") val eventData: EventData? = null,
@SerializedName("businessVertical") var businessVertical: String? = null,
@SerializedName("screenName") var screenName: String? = null
)
data class EventData(