Merge pull request #2815 from medici/task/hl-location-permission
Task/hl location permission
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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?) {
|
||||
|
||||
@@ -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
|
||||
)
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
)
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
87
app/src/main/res/layout/permission_request_bottom_sheet.xml
Normal file
87
app/src/main/res/layout/permission_request_bottom_sheet.xml
Normal 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>
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user