NTP-26362 | bbps education category enhancements (#15828)

This commit is contained in:
Mohit Rajput
2025-04-18 00:04:34 -07:00
committed by GitHub
parent 1676c55a88
commit 9a023a2ec3
16 changed files with 98 additions and 65 deletions

View File

@@ -63,6 +63,7 @@ const val CATEGORY_ID_LANDLINE = "LANDLINE-POSTPAID"
const val CATEGORY_ID_CREDIT_CARD = "CREDIT-CARD"
const val CATEGORY_ID_PIPED_GAS = "LPG-GAS"
const val CATEGORY_ID_WATER = "WATER"
const val CATEGORY_ID_EDUCATION = "EDUCATION"
const val KEY_DEFAULT = "&DEFAULT"

View File

@@ -61,6 +61,7 @@ constructor(
isAdhoc = bundle.getString("isAdhoc").orEmpty().toBoolean(),
isPopular = bundle.getString("isPopular").orEmpty().toBoolean(),
state = bundle.getString("state").orEmpty(),
region = bundle.getString("region").orEmpty(),
)
val customerParams = jsonToMap(bundle.getString("customerParams").orEmpty()).toStringMap()

View File

@@ -26,6 +26,7 @@ import com.navi.bbps.common.CATEGORY_ID_BROADBAND
import com.navi.bbps.common.CATEGORY_ID_CABLE
import com.navi.bbps.common.CATEGORY_ID_CREDIT_CARD
import com.navi.bbps.common.CATEGORY_ID_DTH
import com.navi.bbps.common.CATEGORY_ID_EDUCATION
import com.navi.bbps.common.CATEGORY_ID_ELECTRICITY
import com.navi.bbps.common.CATEGORY_ID_FASTAG
import com.navi.bbps.common.CATEGORY_ID_MOBILE_PREPAID
@@ -132,7 +133,12 @@ object NaviBbpsCommonUtils {
fun isCategoryOfTypeLocationRequired(categoryId: String): Boolean {
return categoryId in
listOf(CATEGORY_ID_WATER, CATEGORY_ID_BROADBAND, CATEGORY_ID_ELECTRICITY)
listOf(
CATEGORY_ID_WATER,
CATEGORY_ID_BROADBAND,
CATEGORY_ID_ELECTRICITY,
CATEGORY_ID_EDUCATION,
)
}
fun closeKeyboardOnScroll(

View File

@@ -44,7 +44,7 @@ import com.navi.bbps.feature.prepaidrecharge.model.view.PrepaidRechargeEntity
PrepaidRechargeEntity::class,
DetectedBillEntity::class,
],
version = 9,
version = 10,
exportSchema = false,
)
@TypeConverters(
@@ -212,3 +212,12 @@ val NAVI_BBPS_DATABASE_MIGRATION_8_9 =
db.execSQL("DROP TABLE IF EXISTS $NAVI_BBPS_TABLE_DISMISSED_BILLS")
}
}
val NAVI_BBPS_DATABASE_MIGRATION_9_10 =
object : Migration(9, 10) {
override fun migrate(db: SupportSQLiteDatabase) {
db.execSQL(
"ALTER TABLE $NAVI_BBPS_DATABASE_BILLERS ADD COLUMN region TEXT NOT NULL DEFAULT ''"
)
}
}

View File

@@ -18,6 +18,7 @@ import com.navi.bbps.db.NAVI_BBPS_DATABASE_MIGRATION_5_6
import com.navi.bbps.db.NAVI_BBPS_DATABASE_MIGRATION_6_7
import com.navi.bbps.db.NAVI_BBPS_DATABASE_MIGRATION_7_8
import com.navi.bbps.db.NAVI_BBPS_DATABASE_MIGRATION_8_9
import com.navi.bbps.db.NAVI_BBPS_DATABASE_MIGRATION_9_10
import com.navi.bbps.db.NaviBbpsAppDatabase
import dagger.Module
import dagger.Provides
@@ -49,6 +50,7 @@ object NaviBbpsDbModule {
NAVI_BBPS_DATABASE_MIGRATION_6_7,
NAVI_BBPS_DATABASE_MIGRATION_7_8,
NAVI_BBPS_DATABASE_MIGRATION_8_9,
NAVI_BBPS_DATABASE_MIGRATION_9_10,
)
.fallbackToDestructiveMigration()
.build()

View File

@@ -7,6 +7,7 @@
package com.navi.bbps.feature.billerlist
import com.navi.base.utils.orFalse
import com.navi.bbps.feature.billerlist.model.network.BillerItemResponse
import com.navi.bbps.feature.billerlist.model.view.BillerItemEntity
import javax.inject.Inject
@@ -15,17 +16,20 @@ class BillerItemResponseToEntityMapper @Inject constructor() {
fun mapBillerItemResponseToEntityList(
billers: List<BillerItemResponse>
): List<BillerItemEntity> {
return billers.map { response ->
BillerItemEntity(
billerId = response.billerId,
billerName = response.billerName,
billerLogoUrl = response.billerLogoUrl,
status = response.status ?: "",
isAdhoc = response.isAdhoc ?: false,
state = response.state ?: "",
categoryId = response.categoryId,
isPopular = response.isPopular ?: false,
)
}
return billers.map { response -> toBillerItemEntity(response) }
}
fun toBillerItemEntity(response: BillerItemResponse): BillerItemEntity {
return BillerItemEntity(
billerId = response.billerId,
billerName = response.billerName.trim(),
billerLogoUrl = response.billerLogoUrl,
status = response.status.orEmpty(),
isAdhoc = response.isAdhoc.orFalse(),
state = response.state.orEmpty(),
region = response.region.orEmpty().trim(),
categoryId = response.categoryId,
isPopular = response.isPopular.orFalse(),
)
}
}

View File

@@ -14,7 +14,6 @@ import com.navi.base.utils.BaseUtils
import com.navi.base.utils.EMPTY
import com.navi.base.utils.ResourceProvider
import com.navi.base.utils.isNotNull
import com.navi.base.utils.orFalse
import com.navi.bbps.R
import com.navi.bbps.common.CATEGORY_ID_FASTAG
import com.navi.bbps.common.CATEGORY_ID_MOBILE_POSTPAID
@@ -31,7 +30,6 @@ import com.navi.bbps.common.usecase.RewardNudgeUseCase
import com.navi.bbps.common.utils.BillDetailsResponseToEntityMapper
import com.navi.bbps.common.utils.MyBillEntityToBillDetailsResponseMapper
import com.navi.bbps.common.utils.NaviBbpsCommonUtils.getBbpsMetricInfo
import com.navi.bbps.common.utils.NaviBbpsDateUtils
import com.navi.bbps.common.utils.getDefaultConfig
import com.navi.bbps.common.viewmodel.NaviBbpsBaseVM
import com.navi.bbps.feature.billerlist.model.network.BillerGroupItemResponse
@@ -93,7 +91,6 @@ constructor(
private val dispatcherProvider: CoroutineDispatcherProvider,
private val billerListRepository: BillerListRepository,
private val bbpsCommonRepository: BbpsCommonRepository,
private val naviBbpsDateUtils: NaviBbpsDateUtils,
private val naviBbpsConfigUseCase: NaviBbpsConfigUseCase,
private val deviceLocationProvider: DeviceLocationProvider,
private val myBillsSyncJob: MyBillsSyncJob,
@@ -102,6 +99,7 @@ constructor(
private val myBillEntityToBillDetailsResponseMapper: MyBillEntityToBillDetailsResponseMapper,
private val billDetailsResponseToEntityMapper: BillDetailsResponseToEntityMapper,
private val resourceProvider: ResourceProvider,
private val billerItemResponseToEntityMapper: BillerItemResponseToEntityMapper,
) : NaviBbpsBaseVM(naviBbpsVmData = NaviBbpsVmData(screen = NaviBbpsScreen.NAVI_BBPS_BILLER_LIST)) {
private val naviBbpsAnalytics: NaviBbpsAnalytics.BillerList =
@@ -272,6 +270,7 @@ constructor(
status = myBillEntity.status,
isAdhoc = myBillEntity.isAdhoc,
state = "",
region = "",
categoryId = myBillEntity.categoryId,
isPopular = false,
),
@@ -488,16 +487,7 @@ constructor(
}
private fun BillerItemResponse.toBillerItemEntity(): BillerItemEntity {
return BillerItemEntity(
billerId = this.billerId,
billerName = this.billerName,
billerLogoUrl = this.billerLogoUrl ?: "",
status = this.status ?: "",
isAdhoc = this.isAdhoc == true,
state = this.state ?: "",
categoryId = this.categoryId,
isPopular = this.isPopular.orFalse(),
)
return billerItemResponseToEntityMapper.toBillerItemEntity(response = this)
}
private var billerListResponse: RepoResult<BillerListResponse> = RepoResult()
@@ -629,22 +619,7 @@ constructor(
recentBills = recentBillsEntity,
billerGroups =
fullBillerList.map { group ->
BillerGroupItemEntity(
title = group.title,
billers =
group.billers.map {
BillerItemEntity(
billerId = it.billerId,
billerName = it.billerName,
billerLogoUrl = it.billerLogoUrl,
status = it.status,
isAdhoc = it.isAdhoc,
state = it.state,
categoryId = it.categoryId,
isPopular = it.isPopular,
)
},
)
BillerGroupItemEntity(title = group.title, billers = group.billers)
},
popularBillers =
fullBillerList.flatMap { it.billers.filter { biller -> biller.isPopular } },

View File

@@ -46,6 +46,7 @@ data class BillerItemResponse(
@SerializedName("status") val status: String?,
@SerializedName("isAdhoc") val isAdhoc: Boolean?,
@SerializedName("state") val state: String?,
@SerializedName("region") val region: String?,
@SerializedName("categoryId") val categoryId: String,
@SerializedName("isPopular") val isPopular: Boolean?,
)

View File

@@ -11,6 +11,7 @@ import android.os.Parcelable
import androidx.annotation.Keep
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.navi.bbps.common.CATEGORY_ID_EDUCATION
import com.navi.bbps.db.NaviBbpsAppDatabase.Companion.NAVI_BBPS_DATABASE_BILLERS
import com.navi.bbps.feature.mybills.model.view.MyBillEntity
import kotlinx.parcelize.Parcelize
@@ -29,6 +30,11 @@ data class BillerItemEntity(
val status: String,
val isAdhoc: Boolean,
val state: String,
val region: String,
val categoryId: String,
val isPopular: Boolean,
) : Parcelable
fun BillerItemEntity.isRegionWidgetVisible(): Boolean {
return categoryId == CATEGORY_ID_EDUCATION && region.isNotBlank()
}

View File

@@ -412,9 +412,9 @@ fun BillerListScreen(
) {
keyboardController.customHide(context, view)
naviBbpsAnalytics.onOfferRolodexClicked(
source = source.orEmpty(),
source = source,
sessionAttribute = billerListViewModel.getNaviBbpsSessionAttributes(),
initialSource = initialSource.orEmpty(),
initialSource = initialSource,
offerDataList = offerData,
coinBurnData = coinBurnData,
billCategoryEntity = billCategoryEntity,

View File

@@ -77,6 +77,7 @@ import com.navi.bbps.feature.billerlist.BillerListViewModel
import com.navi.bbps.feature.billerlist.model.view.BillerGroupItemEntity
import com.navi.bbps.feature.billerlist.model.view.BillerItemEntity
import com.navi.bbps.feature.billerlist.model.view.BillerListState
import com.navi.bbps.feature.billerlist.model.view.isRegionWidgetVisible
import com.navi.bbps.feature.mybills.model.view.MyBillEntity
import com.navi.bbps.getBillTitleFromAccountHolderNameOrPrimaryCustomerParams
import com.navi.bbps.noRippleClickableWithDebounce
@@ -607,14 +608,27 @@ fun BillerItem(billerItemEntity: BillerItemEntity, onItemClicked: () -> Unit) {
)
Spacer(modifier = Modifier.width(8.dp))
NaviText(
text = billerItemEntity.billerName,
fontFamily = naviFontFamily,
fontSize = 14.sp,
color = NaviBbpsColor.textPrimary,
modifier = Modifier.align(Alignment.CenterVertically),
lineHeight = 20.sp,
)
Column(modifier = Modifier.fillMaxWidth().align(Alignment.CenterVertically)) {
NaviText(
text = billerItemEntity.billerName,
fontFamily = naviFontFamily,
fontSize = 14.sp,
color = NaviBbpsColor.textPrimary,
fontWeight = getFontWeight(FontWeightEnum.NAVI_BODY_REGULAR),
lineHeight = 22.sp,
)
if (billerItemEntity.isRegionWidgetVisible()) {
Spacer(modifier = Modifier.height(4.dp))
NaviText(
text = billerItemEntity.region,
fontFamily = naviFontFamily,
fontSize = 12.sp,
color = NaviBbpsColor.textTertiary,
fontWeight = getFontWeight(FontWeightEnum.NAVI_BODY_REGULAR),
lineHeight = 16.sp,
)
}
}
}
Spacer(modifier = Modifier.height(16.dp))
}

View File

@@ -461,6 +461,7 @@ constructor(
status = myBillEntity.status,
isAdhoc = myBillEntity.isAdhoc,
state = "",
region = "",
categoryId = myBillEntity.categoryId,
isPopular = false,
),

View File

@@ -563,6 +563,7 @@ constructor(
status = myBillEntity.status,
isAdhoc = myBillEntity.isAdhoc,
state = "",
region = "",
categoryId = myBillEntity.categoryId,
isPopular = false,
),

View File

@@ -56,8 +56,6 @@ import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.OffsetMapping
import androidx.compose.ui.text.input.TransformedText
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@@ -88,6 +86,7 @@ import com.navi.bbps.customHide
import com.navi.bbps.entry.NaviBbpsActivity
import com.navi.bbps.entry.NaviBbpsRouter
import com.navi.bbps.feature.billerlist.model.view.BillerItemEntity
import com.navi.bbps.feature.billerlist.model.view.isRegionWidgetVisible
import com.navi.bbps.feature.category.model.view.BillCategoryEntity
import com.navi.bbps.feature.customerinput.CustomerDataInputViewModel
import com.navi.bbps.feature.customerinput.ParamKey
@@ -473,22 +472,33 @@ fun RenderBillerDetailStrip(billerItemEntity: BillerItemEntity) {
.padding(16.dp),
) {
BbpsCircleImage(
modifier = Modifier.size(40.dp),
imageUrl = billerItemEntity.billerLogoUrl,
placeholderIconResId = com.navi.common.R.drawable.navi_common_ic_biller_placeholder,
)
Spacer(modifier = Modifier.width(8.dp))
NaviText(
text = billerItemEntity.billerName,
fontSize = 14.sp,
fontFamily = naviFontFamily,
fontWeight = getFontWeight(FontWeightEnum.NAVI_BODY_REGULAR),
color = NaviBbpsColor.textPrimary,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
textAlign = TextAlign.Center,
)
Column(modifier = Modifier.fillMaxWidth().align(Alignment.CenterVertically)) {
NaviText(
text = billerItemEntity.billerName,
fontFamily = naviFontFamily,
fontSize = 14.sp,
color = NaviBbpsColor.textPrimary,
fontWeight = getFontWeight(FontWeightEnum.NAVI_BODY_REGULAR),
lineHeight = 22.sp,
)
if (billerItemEntity.isRegionWidgetVisible()) {
NaviText(
text = billerItemEntity.region,
fontFamily = naviFontFamily,
fontSize = 12.sp,
color = NaviBbpsColor.textTertiary,
fontWeight = getFontWeight(FontWeightEnum.NAVI_BODY_REGULAR),
lineHeight = 16.sp,
)
}
}
}
Spacer(modifier = Modifier.height(24.dp))

View File

@@ -293,6 +293,7 @@ constructor(
status = EMPTY,
isAdhoc = true,
state = EMPTY,
region = EMPTY,
categoryId = detectedBillEntity.categoryId,
isPopular = true,
)

View File

@@ -595,6 +595,7 @@ constructor(
status = myBillEntity.status,
isAdhoc = myBillEntity.isAdhoc,
state = "",
region = "",
categoryId = myBillEntity.categoryId,
isPopular = false,
),