TP-64841 | methods, classes & package restructuring & removed unused … (#10786)

This commit is contained in:
Kishan Kumar
2024-05-13 14:40:06 +05:30
committed by GitHub
parent a8ce441e0c
commit c49ebceb52
57 changed files with 364 additions and 563 deletions

View File

@@ -8,7 +8,7 @@
android:supportsRtl="true">
<activity
android:name="com.navi.coin.ui.compose.CoinActivity"
android:name="com.navi.coin.ui.activity.CoinActivity"
android:exported="false"
android:launchMode="singleTask"
android:screenOrientation="portrait"

View File

@@ -1,12 +1,12 @@
package com.navi.coin.network.di
package com.navi.coin.di.module
import com.google.gson.Gson
import com.navi.coin.network.retrofit.CoinHttpClient
import com.navi.coin.network.retrofit.RetrofitService
import com.navi.coin.utils.CountDownFacade
import com.navi.coin.utils.ICountDownHelper
import com.navi.coin.di.qualifiers.CoinRetrofit
import com.navi.coin.network.CoinHttpClient
import com.navi.coin.network.RetrofitService
import com.navi.coin.utils.constant.Constants
import com.navi.common.CommonLibManager
import com.navi.common.model.ModuleName
import com.navi.common.model.ModuleNameV2
import com.navi.common.model.NetworkInfo
import com.navi.common.network.converter.EmptyBodyHandlingConverterFactory
@@ -27,7 +27,13 @@ object NetworkModule {
@Singleton
@Provides
@CoinRetrofit
fun providesNetworkInfo(): NetworkInfo = getNetworkInfo()
fun providesNetworkInfo() = NetworkInfo(
appVersionName = CommonLibManager.buildConfigDetails.appVersionName,
appVersionCode = CommonLibManager.buildConfigDetails.appVersionCode,
moduleName = ModuleName.COIN,
timeoutInSec = Constants.ApiConstants.API_CONNECT_TIMEOUT_VALUE,
baseUrl = CommonLibManager.buildConfigDetails.baseUrl
)
@Singleton
@Provides
@@ -44,7 +50,7 @@ object NetworkModule {
@Provides
fun provideApiService(
@Named("coinGson") deserializer: Gson,
@CoinRetrofit naviHttpClient: CoinHttpClient
@CoinRetrofit naviHttpClient: CoinHttpClient,
): RetrofitService {
val retrofit =
Retrofit.Builder()
@@ -55,9 +61,4 @@ object NetworkModule {
.build()
return retrofit.create(RetrofitService::class.java)
}
@Provides
@CountDownHelperQualifier
fun getPlatformNavigationHandler(): ICountDownHelper = CountDownFacade()
}

View File

@@ -0,0 +1,17 @@
package com.navi.coin.di.module
import com.navi.coin.di.qualifiers.CountDownHelperQualifier
import com.navi.coin.utils.facade.CountDownFacade
import com.navi.coin.utils.facade.ICountDownHelper
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
@Module
@InstallIn(SingletonComponent::class)
object UtilityModule {
@Provides
@CountDownHelperQualifier
fun getPlatformNavigationHandler(): ICountDownHelper = CountDownFacade()
}

View File

@@ -1,4 +1,4 @@
package com.navi.coin.network.di
package com.navi.coin.di.qualifiers
import javax.inject.Qualifier

View File

@@ -1,13 +0,0 @@
/*
*
* * Copyright © 2024 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
package com.navi.coin.models
data class CoinHistoryNavArgs(
val initialTab: Int = 0,
val showBottomSheet: Boolean = false,
)

View File

@@ -1,4 +1,4 @@
package com.navi.coin.models
package com.navi.coin.models.model
import android.os.Parcelable
import com.navi.common.model.RequestConfig

View File

@@ -5,7 +5,7 @@
*
*/
package com.navi.coin.models
package com.navi.coin.models.model
import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.navi.coin.models
package com.navi.coin.models.model
import com.google.gson.annotations.SerializedName

View File

@@ -1,4 +1,4 @@
package com.navi.coin.models
package com.navi.coin.models.model
data class VpaValidation(

View File

@@ -1,4 +1,4 @@
package com.navi.coin.models
package com.navi.coin.models.states
import com.navi.common.forge.model.ScreenDefinition
import com.navi.common.network.models.ErrorMessage

View File

@@ -5,7 +5,7 @@
*
*/
package com.navi.coin.utils
package com.navi.coin.navigator
enum class CoinNavigationActions(val initialTab: Int = 0, val showBottomSheet: Boolean = true) {
COIN_HOME_SCREEN,

View File

@@ -1,12 +1,12 @@
package com.navi.coin.utils
package com.navi.coin.navigator
import android.os.Bundle
import com.navi.coin.ui.compose.destinations.CoinErrorScreenDestination
import com.navi.coin.ui.compose.destinations.CoinHistoryScreenDestination
import com.navi.coin.ui.compose.destinations.CoinHomeScreenDestination
import com.navi.coin.ui.compose.destinations.RedemptionStatusScreenDestination
import com.navi.coin.ui.compose.destinations.ScratchCardHistoryScreenDestination
import com.navi.coin.ui.compose.screen.destinations.CoinErrorScreenDestination
import com.navi.coin.ui.compose.screen.destinations.CoinHistoryScreenDestination
import com.navi.coin.ui.compose.screen.destinations.CoinHomeScreenDestination
import com.navi.coin.ui.compose.screen.destinations.RedemptionStatusScreenDestination
import com.navi.coin.ui.compose.screen.destinations.ScratchCardHistoryScreenDestination
import com.navi.naviwidgets.utils.FORWARD_SLASH
import com.ramcosta.composedestinations.spec.Direction
import com.ramcosta.composedestinations.spec.Route

View File

@@ -8,16 +8,11 @@ import com.navi.base.deeplink.util.DeeplinkConstants
import com.navi.base.model.CtaData
import com.navi.base.utils.orFalse
import com.navi.base.utils.orZero
import com.navi.coin.ui.compose.CoinActivity
import com.navi.coin.utils.Constants.COIN_NAVIGATION_LINK
import com.navi.coin.ui.activity.CoinActivity
import com.navi.coin.utils.constant.Constants.COIN_NAVIGATION_LINK
import timber.log.Timber
object NaviCoinDeepLinkNavigator {
const val coin = "coin"
const val COIN_HOME_SCREEN = "COIN_HOME_SCREEN"
const val COIN_REWARD_HISTORY_CASH = "COIN_REWARD_HISTORY_CASH"
const val COIN_REWARD_HISTORY_COIN = "COIN_REWARD_HISTORY_COIN"
const val COIN_REWARD_HISTORY_COIN_BOTTOMSHEET = "COIN_REWARD_HISTORY_COIN_BOTTOMSHEET"
fun navigate(
activity: Activity?,

View File

@@ -12,7 +12,7 @@ import androidx.compose.runtime.Composable
import com.navi.coin.navigator.screens.CoinActivityRegistry
import com.navi.coin.navigator.screens.CoinComposableRegistry
import com.navi.coin.ui.activity.CoinBaseActivity
import com.navi.coin.utils.Constants
import com.navi.coin.utils.constant.Constants.COIN_NAVIGATION_LINK
import com.navi.rr.common.activity.NavHostControllerOwner
import com.navi.rr.navigation.NavArgs
import com.navi.rr.navigation.NavigationAction
@@ -49,7 +49,7 @@ class CoinNavigator @Inject constructor(
navArgs: NavArgs?,
navAction: NavigationAction
) {
navArgs?.bundle?.putString(Constants.COIN_NAVIGATION_LINK, navArgs.ctaData.url)
navArgs?.bundle?.putString(COIN_NAVIGATION_LINK, navArgs.ctaData.url)
super.navigate(activity, navHostOwner, navArgs, navAction)
}
}

View File

@@ -8,8 +8,8 @@
package com.navi.coin.navigator.screens
import android.app.Activity
import com.navi.coin.ui.activity.CoinActivity
import com.navi.coin.ui.activity.CoinBaseActivity
import com.navi.coin.ui.compose.CoinActivity
import com.navi.rr.navigation.registry.def.ActivityRegistry
import dagger.hilt.android.scopes.ActivityScoped
import javax.inject.Inject

View File

@@ -9,9 +9,9 @@ package com.navi.coin.navigator.screens
import android.os.Bundle
import androidx.compose.runtime.Composable
import com.navi.coin.ui.compose.destinations.CoinHomeScreenDestination
import com.navi.coin.ui.compose.destinations.RedemptionStatusScreenDestination
import com.navi.coin.ui.compose.destinations.ScratchCardHistoryScreenDestination
import com.navi.coin.ui.compose.screen.destinations.CoinHomeScreenDestination
import com.navi.coin.ui.compose.screen.destinations.RedemptionStatusScreenDestination
import com.navi.coin.ui.compose.screen.destinations.ScratchCardHistoryScreenDestination
import com.navi.rr.navigation.registry.def.ComposableRegistry
import com.ramcosta.composedestinations.spec.Direction
import dagger.hilt.android.scopes.ActivityScoped

View File

@@ -1,6 +0,0 @@
package com.navi.coin.network
object ApiConstants {
const val API_CONNECT_TIMEOUT_VALUE = 20L
const val API_SUCCESS_CODE = 200
}

View File

@@ -1,4 +1,4 @@
package com.navi.coin.network.retrofit
package com.navi.coin.network
import android.content.Context
import com.chuckerteam.chucker.api.ChuckerCollector

View File

@@ -5,15 +5,15 @@
*
*/
package com.navi.coin.network.retrofit
package com.navi.coin.network
import com.navi.coin.models.RedemptionInfoResponse
import com.navi.coin.models.RedemptionRequest
import com.navi.coin.models.RedemptionResponse
import com.navi.coin.models.RedemptionStatusResponse
import com.navi.coin.models.ScratchCardHistoryResponse
import com.navi.coin.models.TransactionHistoryResponse
import com.navi.coin.models.VpaValidation
import com.navi.coin.models.model.RedemptionInfoResponse
import com.navi.coin.models.model.RedemptionRequest
import com.navi.coin.models.model.RedemptionResponse
import com.navi.coin.models.model.RedemptionStatusResponse
import com.navi.coin.models.model.ScratchCardHistoryResponse
import com.navi.coin.models.model.TransactionHistoryResponse
import com.navi.coin.models.model.VpaValidation
import com.navi.common.forge.model.ScreenDefinition
import com.navi.common.model.UploadDataAsyncResponse
import com.navi.common.network.models.GenericResponse

View File

@@ -1,16 +0,0 @@
package com.navi.coin.network.di
import com.navi.coin.network.ApiConstants.API_CONNECT_TIMEOUT_VALUE
import com.navi.common.CommonLibManager
import com.navi.common.model.ModuleName
import com.navi.common.model.NetworkInfo
fun getNetworkInfo(timeOutInSeconds: Long = API_CONNECT_TIMEOUT_VALUE): NetworkInfo {
return NetworkInfo(
appVersionName = CommonLibManager.buildConfigDetails.appVersionName,
appVersionCode = CommonLibManager.buildConfigDetails.appVersionCode,
moduleName = ModuleName.COIN,
timeoutInSec = timeOutInSeconds,
baseUrl = CommonLibManager.buildConfigDetails.baseUrl
)
}

View File

@@ -1,10 +1,11 @@
package com.navi.coin.repo
package com.navi.coin.repo.pagingsource
import androidx.paging.PagingSource
import androidx.paging.PagingState
import com.navi.base.utils.orFalse
import com.navi.coin.models.TransactionHistoryCardData
import com.navi.coin.utils.Constants.SOMETHING_WENT_WRONG
import com.navi.coin.models.model.TransactionHistoryCardData
import com.navi.coin.repo.repository.CoinHistoryScreenRepo
import com.navi.coin.utils.constant.Constants.SOMETHING_WENT_WRONG
import com.navi.coin.vm.CoinHistoryCardScreenState
import com.navi.common.utils.log
import kotlinx.coroutines.flow.MutableStateFlow

View File

@@ -1,10 +1,11 @@
package com.navi.coin.repo
package com.navi.coin.repo.pagingsource
import androidx.paging.PagingSource
import androidx.paging.PagingState
import com.navi.base.utils.orFalse
import com.navi.coin.models.TransactionHistoryCardData
import com.navi.coin.utils.Constants.SOMETHING_WENT_WRONG
import com.navi.coin.models.model.TransactionHistoryCardData
import com.navi.coin.repo.repository.CoinHistoryScreenRepo
import com.navi.coin.utils.constant.Constants.SOMETHING_WENT_WRONG
import com.navi.coin.vm.CoinHistoryCardScreenState
import com.navi.common.utils.log
import kotlinx.coroutines.flow.MutableStateFlow

View File

@@ -5,14 +5,15 @@
*
*/
package com.navi.coin.repo
package com.navi.coin.repo.pagingsource
import androidx.paging.PagingSource
import androidx.paging.PagingState
import com.navi.base.utils.orFalse
import com.navi.coin.models.ScratchCard
import com.navi.coin.models.model.ScratchCard
import com.navi.coin.models.states.ScratchCardPaginatedHistoryScreenState
import com.navi.coin.utils.Constants.SOMETHING_WENT_WRONG
import com.navi.coin.repo.repository.ScratchCardHistoryScreenRepo
import com.navi.coin.utils.constant.Constants.SOMETHING_WENT_WRONG
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update

View File

@@ -5,12 +5,12 @@
*
*/
package com.navi.coin.repo
package com.navi.coin.repo.repository
import com.navi.coin.models.TransactionHistoryResponse
import com.navi.coin.network.retrofit.RetrofitService
import com.navi.coin.utils.Constants.SCREENS.TRANSACTION_HISTORY_CASH_SCREEN_NAME
import com.navi.coin.utils.Constants.SCREENS.TRANSACTION_HISTORY_COINS_SCREEN_NAME
import com.navi.coin.models.model.TransactionHistoryResponse
import com.navi.coin.network.RetrofitService
import com.navi.coin.utils.constant.Constants.SCREENS.TRANSACTION_HISTORY_CASH_SCREEN_NAME
import com.navi.coin.utils.constant.Constants.SCREENS.TRANSACTION_HISTORY_COINS_SCREEN_NAME
import com.navi.common.forge.model.ScreenDefinition
import com.navi.common.model.ModuleNameV2
import com.navi.common.network.models.RepoResult

View File

@@ -5,12 +5,12 @@
*
*/
package com.navi.coin.repo
package com.navi.coin.repo.repository
import com.navi.coin.models.RedemptionRequest
import com.navi.coin.network.retrofit.RetrofitService
import com.navi.coin.utils.Constants.SCREENS.COINS_LOADING_SCREEN_SCREEN_NAME
import com.navi.coin.utils.Constants.SCREENS.COINS_SCREEN_SCREEN_NAME
import com.navi.coin.models.model.RedemptionRequest
import com.navi.coin.network.RetrofitService
import com.navi.coin.utils.constant.Constants.SCREENS.COINS_LOADING_SCREEN_SCREEN_NAME
import com.navi.coin.utils.constant.Constants.SCREENS.COINS_SCREEN_SCREEN_NAME
import com.navi.common.model.ModuleName
import com.navi.common.model.ModuleNameV2
import com.navi.common.utils.Constants.GZIP

View File

@@ -5,15 +5,14 @@
*
*/
package com.navi.coin.repo
package com.navi.coin.repo.repository
import com.navi.coin.models.ScratchCardHistoryResponse
import com.navi.coin.network.retrofit.RetrofitService
import com.navi.coin.utils.Constants.REWARD_HISTORY_SCRATCH_CARD_SCREEN_NAME
import com.navi.coin.models.model.ScratchCardHistoryResponse
import com.navi.coin.network.RetrofitService
import com.navi.coin.utils.constant.Constants.REWARD_HISTORY_SCRATCH_CARD_SCREEN_NAME
import com.navi.common.forge.model.ScreenDefinition
import com.navi.common.model.ModuleNameV2
import com.navi.common.network.models.RepoResult
import com.navi.common.network.retrofit.ResponseCallback
import com.navi.common.utils.Constants.GZIP
import com.navi.rr.network.retrofit.ResponseHandler
import javax.inject.Inject
@@ -23,7 +22,7 @@ class ScratchCardHistoryScreenRepo
constructor(
private val retrofitService: RetrofitService,
private val responseHandler: ResponseHandler,
) : ResponseCallback() {
) {
suspend fun fetchScratchCardUiTronConfigs(): RepoResult<ScreenDefinition> {
return responseHandler.handleResponse(

View File

@@ -1,4 +1,4 @@
package com.navi.coin.ui.themes
package com.navi.coin.theme
import androidx.compose.ui.graphics.Color

View File

@@ -1,4 +1,4 @@
package com.navi.coin.ui.compose
package com.navi.coin.ui.activity
import android.content.Intent
import android.os.Bundle
@@ -7,12 +7,12 @@ import androidx.navigation.NavHostController
import com.navi.base.deeplink.DeepLinkManager
import com.navi.base.deeplink.util.DeeplinkConstants
import com.navi.base.model.CtaData
import com.navi.coin.ui.activity.CoinBaseActivity
import com.navi.coin.utils.CoinRouter
import com.navi.coin.utils.Constants.COINS_SCREEN
import com.navi.coin.utils.Constants.COIN_NAVIGATION_LINK
import com.navi.coin.utils.startEnterAnimation
import com.navi.coin.utils.startExitAnimation
import com.navi.coin.navigator.CoinRouter
import com.navi.coin.ui.compose.navhost.CoinDestinationNavHost
import com.navi.coin.utils.constant.Constants.COINS_SCREEN
import com.navi.coin.utils.constant.Constants.COIN_NAVIGATION_LINK
import com.navi.coin.utils.ext.startEnterAnimation
import com.navi.coin.utils.ext.startExitAnimation
import com.navi.common.model.ModuleNameV2
import com.navi.design.theme.NaviMaterialTheme
import com.ramcosta.composedestinations.navigation.navigate

View File

@@ -1,4 +1,4 @@
package com.navi.coin.views
package com.navi.coin.ui.compose.common
import android.content.Context
import androidx.compose.foundation.BorderStroke
@@ -62,19 +62,18 @@ import com.google.accompanist.pager.HorizontalPager
import com.google.accompanist.pager.pagerTabIndicatorOffset
import com.google.accompanist.pager.rememberPagerState
import com.navi.coin.R
import com.navi.coin.models.TransactionHistoryCardData
import com.navi.coin.ui.compose.RenderCoinHistoryScreenContent
import com.navi.coin.utils.Constants.Status.BLOCKED_STATUS
import com.navi.coin.utils.Constants.Status.FAILED_STATUS
import com.navi.coin.utils.Constants.Status.IN_PROGRESS_CASH_STATUS
import com.navi.coin.utils.Constants.Status.IN_PROGRESS_GOLD_STATUS
import com.navi.coin.utils.Constants.Status.IN_PROGRESS_STATUS
import com.navi.coin.utils.Constants.Status.RECEIVED_STATUS
import com.navi.coin.utils.Constants.Status.REDEEMED_TO_CASH_STATUS
import com.navi.coin.utils.Constants.Status.REDEEMED_TO_GOLD_STATUS
import com.navi.coin.utils.NaviCoinsAnalytics
import com.navi.coin.utils.NoRippleIndicationSource
import com.navi.coin.utils.scaledSp
import com.navi.coin.models.model.TransactionHistoryCardData
import com.navi.coin.ui.compose.screen.RenderCoinHistoryScreenContent
import com.navi.coin.utils.analytics.NaviCoinsAnalytics
import com.navi.coin.utils.constant.Constants.Status.BLOCKED_STATUS
import com.navi.coin.utils.constant.Constants.Status.FAILED_STATUS
import com.navi.coin.utils.constant.Constants.Status.IN_PROGRESS_CASH_STATUS
import com.navi.coin.utils.constant.Constants.Status.IN_PROGRESS_GOLD_STATUS
import com.navi.coin.utils.constant.Constants.Status.IN_PROGRESS_STATUS
import com.navi.coin.utils.constant.Constants.Status.RECEIVED_STATUS
import com.navi.coin.utils.constant.Constants.Status.REDEEMED_TO_CASH_STATUS
import com.navi.coin.utils.constant.Constants.Status.REDEEMED_TO_GOLD_STATUS
import com.navi.coin.utils.ext.scaledSp
import com.navi.coin.vm.CoinHistoryScreenVM
import com.navi.common.forge.model.TabConfig
import com.navi.common.forge.model.WidgetModelDefinition
@@ -82,6 +81,7 @@ import com.navi.design.font.FontWeightEnum
import com.navi.design.theme.getFontWeight
import com.navi.design.theme.ttComposeFontFamily
import com.navi.design.utils.parseColorSafe
import com.navi.rr.utils.NoRippleIndicationSource
import com.navi.uitron.model.UiTronResponse
import kotlinx.coroutines.launch
import kotlin.reflect.KFunction1

View File

@@ -1,4 +1,4 @@
package com.navi.coin.views
package com.navi.coin.ui.compose.common
import androidx.annotation.RawRes
@@ -36,8 +36,8 @@ import com.airbnb.lottie.compose.LottieCompositionSpec
import com.airbnb.lottie.compose.animateLottieCompositionAsState
import com.airbnb.lottie.compose.rememberLottieComposition
import com.navi.coin.R
import com.navi.coin.utils.Constants
import com.navi.coin.utils.SemiCircleShape
import com.navi.coin.utils.constant.Constants
import com.navi.coin.utils.shape.SemiCircleShape
import com.navi.design.font.FontWeightEnum
import com.navi.design.theme.getFontWeight
import com.navi.design.theme.ttComposeFontFamily
@@ -47,96 +47,6 @@ import com.navi.uitron.utils.toPx
import kotlin.reflect.KFunction0
import com.navi.design.R as DesignR
@Composable
fun MainScreenShimmer(){
Column(
Modifier
.fillMaxSize()
.padding(start = 16.dp, top = 48.dp),
horizontalAlignment = Alignment.CenterHorizontally,
) {
Row(
Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween
) {
Box(modifier = Modifier
.height(24.dp)
.width(24.dp)
.clip(RoundedCornerShape(4.dp))
.setShimmerEffect(true))
Box(modifier = Modifier
.padding(end = 16.dp)
.height(24.dp)
.width(82.dp)
.clip(RoundedCornerShape(4.dp))
.setShimmerEffect(true))
}
Box(modifier = Modifier
.padding(top = 4.dp)
.width(130.dp)
.height(130.dp)
.clip(RoundedCornerShape(4.dp))
.setShimmerEffect(true))
Box(modifier = Modifier
.padding(top = 32.dp)
.height(24.dp)
.width(234.dp)
.clip(RoundedCornerShape(4.dp))
.setShimmerEffect(true))
Row(
Modifier
.fillMaxWidth()
.padding(start = 24.dp, top = 24.dp, bottom = 41.dp)
) {
Box(modifier = Modifier
.height(92.dp)
.width(284.dp)
.clip(RoundedCornerShape(4.dp))
.setShimmerEffect(true))
Box(modifier = Modifier
.height(92.dp)
.width(284.dp)
.padding(start = 18.dp)
.clip(RoundedCornerShape(4.dp))
.setShimmerEffect(true))
}
Box(modifier = Modifier
.height(82.dp)
.width(192.dp)
.clip(RoundedCornerShape(4.dp))
.setShimmerEffect(true))
Row(
Modifier
.padding(top = 33.dp)
.fillMaxWidth()
) {
Box(modifier = Modifier
.height(220.dp)
.width(136.dp)
.clip(RoundedCornerShape(4.dp))
.setShimmerEffect(true))
Box(modifier = Modifier
.height(220.dp)
.width(136.dp)
.padding(start = 16.dp)
.clip(RoundedCornerShape(4.dp))
.setShimmerEffect(true))
Box(modifier = Modifier
.height(220.dp)
.width(136.dp)
.padding(start = 16.dp)
.clip(RoundedCornerShape(4.dp))
.setShimmerEffect(true))
}
Box(modifier = Modifier
.padding(top = 92.dp, bottom = 412.dp)
.height(52.dp)
.width(328.dp)
.clip(RoundedCornerShape(4.dp))
.setShimmerEffect(true))
}
}
@Composable
fun MainScreenShimmerV2(){
Column(
@@ -333,40 +243,6 @@ fun CoinPaginationLoadingComponent() {
}
@Composable
fun CoinPaginationErrorComponent(retry: KFunction0<Unit>) {
Column(
modifier = Modifier
.fillMaxWidth()
.background(
Color(0xFFF9F9F9)
), horizontalAlignment = Alignment.CenterHorizontally
) {
Row(
modifier = Modifier.padding(16.dp, 16.dp, 16.dp, 40.dp),
) {
Image(
painter = painterResource(id = DesignR.drawable.ic_info_icon_black),
modifier = Modifier.size(16.dp),
contentDescription = stringResource(R.string.error_icon)
)
Text(
text = stringResource(R.string.retry) ,
modifier = Modifier
.padding(8.dp, 0.dp, 0.dp, 0.dp)
.clickable {
retry()
},
color = Color(0xFF000000),
fontFamily = ttComposeFontFamily,
fontWeight = getFontWeight(FontWeightEnum.TT_REGULAR),
fontSize = 12.sp
)
}
}
}
@Composable
fun NaviCoinLottieAnimation(
modifier: Modifier,

View File

@@ -1,4 +1,4 @@
package com.navi.coin.utils
package com.navi.coin.ui.compose.common
import android.app.Activity
import androidx.compose.material3.ExperimentalMaterial3Api
@@ -11,7 +11,7 @@ import androidx.compose.ui.graphics.Color
import androidx.core.os.bundleOf
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.navi.coin.ui.compose.destinations.CoinErrorScreenDestination
import com.navi.coin.ui.compose.screen.destinations.CoinErrorScreenDestination
import com.navi.common.constants.SCREEN_NAME
import com.navi.rr.common.utils.InitErrorBottomSheet
import com.navi.rr.common.vm.RRBaseVM

View File

@@ -5,7 +5,7 @@
*
*/
package com.navi.coin.views
package com.navi.coin.ui.compose.common
import android.annotation.SuppressLint
import androidx.compose.foundation.ExperimentalFoundationApi
@@ -63,32 +63,31 @@ import coil.compose.AsyncImage
import coil.request.ImageRequest
import com.navi.base.utils.EMPTY
import com.navi.coin.R
import com.navi.coin.models.ScratchCard
import com.navi.coin.models.model.ScratchCard
import com.navi.coin.models.states.ScratchCardPaginatedHistoryScreenState
import com.navi.coin.models.states.ScratchCardStatus
import com.navi.coin.ui.themes.Color_824992
import com.navi.coin.ui.themes.Color_F9F9F9
import com.navi.coin.ui.themes.borderAlt
import com.navi.coin.ui.themes.brandSupportingMidGreen
import com.navi.coin.ui.themes.ctaTertiary
import com.navi.coin.ui.themes.midGoldColor
import com.navi.coin.ui.themes.onSurfaceHighlight
import com.navi.coin.ui.themes.textOrange
import com.navi.coin.ui.themes.textPrimary
import com.navi.coin.ui.themes.textTertiary
import com.navi.coin.utils.Constants
import com.navi.coin.utils.Constants.EXPIRED
import com.navi.coin.utils.Constants.EXPIRED_SCRATCH_CARD_URL_KEY
import com.navi.coin.utils.Constants.IN_PROGRESS
import com.navi.coin.utils.Constants.LOCKED_SCRATCH_CARD_URL_KEY
import com.navi.coin.utils.Constants.NAVI_COINS
import com.navi.coin.utils.Constants.NAVI_COIN_URL_KEY
import com.navi.coin.utils.Constants.SCRATCH_CARD_EXPIRED_BOTTOM_SHEET
import com.navi.coin.utils.Constants.SCRATCH_CARD_IN_PROGRESS_BOTTOM_SHEET
import com.navi.coin.utils.Constants.SCRATCH_CARD_RECEIVED_BOTTOM_SHEET
import com.navi.coin.utils.NoRippleIndicationSource
import com.navi.coin.theme.Color_824992
import com.navi.coin.theme.Color_F9F9F9
import com.navi.coin.theme.borderAlt
import com.navi.coin.theme.brandSupportingMidGreen
import com.navi.coin.theme.ctaTertiary
import com.navi.coin.theme.midGoldColor
import com.navi.coin.theme.onSurfaceHighlight
import com.navi.coin.theme.textOrange
import com.navi.coin.theme.textPrimary
import com.navi.coin.theme.textTertiary
import com.navi.coin.utils.constant.Constants
import com.navi.coin.utils.constant.Constants.EXPIRED
import com.navi.coin.utils.constant.Constants.EXPIRED_SCRATCH_CARD_URL_KEY
import com.navi.coin.utils.constant.Constants.IN_PROGRESS
import com.navi.coin.utils.constant.Constants.LOCKED_SCRATCH_CARD_URL_KEY
import com.navi.coin.utils.constant.Constants.NAVI_COINS
import com.navi.coin.utils.constant.Constants.NAVI_COIN_URL_KEY
import com.navi.coin.utils.constant.Constants.SCRATCH_CARD_EXPIRED_BOTTOM_SHEET
import com.navi.coin.utils.constant.Constants.SCRATCH_CARD_IN_PROGRESS_BOTTOM_SHEET
import com.navi.coin.utils.constant.Constants.SCRATCH_CARD_RECEIVED_BOTTOM_SHEET
import com.navi.coin.utils.ext.scaledSp
import com.navi.coin.utils.formatDuration
import com.navi.coin.utils.scaledSp
import com.navi.coin.vm.ScratchCardScreenVM
import com.navi.common.forge.model.WidgetModelDefinition
import com.navi.design.font.FontWeightEnum
@@ -97,6 +96,7 @@ import com.navi.design.theme.ttComposeFontFamily
import com.navi.rr.utils.EventConstants.BOTTOM_SHEET_TYPE
import com.navi.rr.utils.EventConstants.SCRATCH_CARD_HISTORY_BOTTOM_SHEET_VISIBLE_EVENT
import com.navi.rr.utils.NaviRRAnalytics
import com.navi.rr.utils.NoRippleIndicationSource
import com.navi.rr.widgetFactory.WidgetRenderer
import com.navi.uitron.model.UiTronResponse
import java.util.Locale

View File

@@ -1,4 +1,4 @@
package com.navi.coin.ui.compose
package com.navi.coin.ui.compose.navhost
import androidx.compose.animation.AnimatedContentTransitionScope
import androidx.compose.animation.ExperimentalAnimationApi
@@ -6,9 +6,11 @@ import androidx.compose.animation.core.tween
import androidx.compose.runtime.Composable
import androidx.navigation.compose.rememberNavController
import com.google.accompanist.navigation.material.ExperimentalMaterialNavigationApi
import com.navi.coin.navigator.CoinNavigationActions
import com.navi.coin.ui.activity.CoinBaseActivity
import com.navi.coin.ui.compose.destinations.CoinHistoryScreenDestination
import com.navi.coin.utils.CoinNavigationActions
import com.navi.coin.ui.compose.screen.CoinHistoryScreen
import com.navi.coin.ui.compose.screen.NavGraphs
import com.navi.coin.ui.compose.screen.destinations.CoinHistoryScreenDestination
import com.navi.naviwidgets.utils.FORWARD_SLASH
import com.ramcosta.composedestinations.DestinationsNavHost
import com.ramcosta.composedestinations.animations.defaults.RootNavGraphDefaultAnimations

View File

@@ -1,4 +1,4 @@
package com.navi.coin.ui.compose
package com.navi.coin.ui.compose.screen
import android.os.Bundle
import androidx.compose.runtime.Composable

View File

@@ -1,4 +1,4 @@
package com.navi.coin.ui.compose
package com.navi.coin.ui.compose.screen
import android.app.Activity
import androidx.activity.compose.BackHandler
@@ -50,20 +50,20 @@ import com.navi.base.model.CtaData
import com.navi.base.model.LineItem
import com.navi.base.utils.EMPTY
import com.navi.coin.R
import com.navi.coin.models.TransactionHistoryCardData
import com.navi.coin.utils.Constants.Status.FAILED_STATUS
import com.navi.coin.utils.Constants.Status.REDEEMED_TO_CASH_STATUS
import com.navi.coin.utils.Constants.Status.REDEEMED_TO_GOLD_STATUS
import com.navi.coin.utils.Init
import com.navi.coin.utils.NaviCoinsAnalytics
import com.navi.coin.utils.NaviCoinsAnalytics.Companion.REWARDS_HISTORY_TRANSACTION_DETAIL_BOTTOMSHEET_APPEARS
import com.navi.coin.utils.NaviCoinsAnalytics.Companion.REWARDS_HISTORY_TRANSACTION_DETAIL_BOTTOMSHEET_DISAPPEARS
import com.navi.coin.utils.NaviCoinsAnalytics.Companion.naviCoinsAnalytics
import com.navi.coin.views.TabLayout
import com.navi.coin.views.TransactionHistoryScreenShimmer
import com.navi.coin.models.model.TransactionHistoryCardData
import com.navi.coin.utils.constant.Constants.Status.FAILED_STATUS
import com.navi.coin.utils.constant.Constants.Status.REDEEMED_TO_CASH_STATUS
import com.navi.coin.utils.constant.Constants.Status.REDEEMED_TO_GOLD_STATUS
import com.navi.coin.ui.compose.common.Init
import com.navi.coin.utils.analytics.NaviCoinsAnalytics
import com.navi.coin.utils.analytics.NaviCoinsAnalytics.Companion.REWARDS_HISTORY_TRANSACTION_DETAIL_BOTTOMSHEET_APPEARS
import com.navi.coin.utils.analytics.NaviCoinsAnalytics.Companion.REWARDS_HISTORY_TRANSACTION_DETAIL_BOTTOMSHEET_DISAPPEARS
import com.navi.coin.utils.analytics.NaviCoinsAnalytics.Companion.naviCoinsAnalytics
import com.navi.coin.ui.compose.common.TabLayout
import com.navi.coin.ui.compose.common.TransactionHistoryScreenShimmer
import com.navi.coin.vm.CoinHistoryScreenState
import com.navi.coin.vm.CoinHistoryScreenVM
import com.navi.coin.widgetFactory.CoinWidgetRenderer
import com.navi.coin.ui.compose.widgetfactory.CoinWidgetRenderer
import com.navi.common.constants.CHAT_BOT_SCREEN_NAME
import com.navi.common.forge.model.TabConfig
import com.navi.common.forge.model.WidgetModelDefinition
@@ -75,7 +75,6 @@ import com.navi.naviwidgets.models.RewardType
import com.navi.rr.common.constants.COIN_HISTORY_SCREEN
import com.navi.rr.common.constants.PROFILE_RR_SCREEN
import com.navi.rr.utils.clickable
import com.navi.rr.common.constants.COIN_HISTORY_SCREEN
import com.navi.uitron.model.UiTronResponse
import com.navi.uitron.model.data.SpannableTextData
import com.navi.uitron.model.data.TextData

View File

@@ -1,4 +1,4 @@
package com.navi.coin.ui.compose
package com.navi.coin.ui.compose.screen
import android.os.Bundle
import androidx.activity.compose.BackHandler
@@ -65,26 +65,26 @@ import com.navi.base.model.LineItem
import com.navi.base.utils.EMPTY
import com.navi.base.utils.orFalse
import com.navi.coin.R
import com.navi.coin.models.CoinHomeScreenState
import com.navi.coin.models.states.ApiActionState
import com.navi.coin.ui.activity.CoinBaseActivity
import com.navi.coin.utils.CoinRouter.REDEMPTION_STATUS_SCREEN_CTA_URL
import com.navi.coin.utils.Constants
import com.navi.coin.utils.Constants.BACKGROUND_IMAGE_HEIGHT_KEY
import com.navi.coin.utils.Constants.HERO_PLACEHOLDER_PROPERTY_KEY
import com.navi.coin.utils.Constants.SCREEN_CONTENT
import com.navi.coin.utils.Constants.SHOW_CURVE_KEY
import com.navi.coin.utils.Init
import com.navi.coin.utils.NaviCoinsAnalytics
import com.navi.coin.utils.NaviCoinsAnalytics.Companion.REWARDS_NAVI_COINS_INFO_PAGE_BACK_ARROW_CLICK
import com.navi.coin.utils.NoRippleIndicationSource
import com.navi.coin.views.MainScreenShimmerV2
import com.navi.coin.models.states.CoinHomeScreenState
import com.navi.coin.navigator.CoinRouter.REDEMPTION_STATUS_SCREEN_CTA_URL
import com.navi.coin.ui.compose.common.Init
import com.navi.coin.ui.compose.common.MainScreenShimmerV2
import com.navi.coin.utils.analytics.NaviCoinsAnalytics
import com.navi.coin.utils.analytics.NaviCoinsAnalytics.Companion.REWARDS_NAVI_COINS_INFO_PAGE_BACK_ARROW_CLICK
import com.navi.coin.utils.constant.Constants
import com.navi.coin.utils.constant.Constants.BACKGROUND_IMAGE_HEIGHT_KEY
import com.navi.coin.utils.constant.Constants.HERO_PLACEHOLDER_PROPERTY_KEY
import com.navi.coin.utils.constant.Constants.SCREEN_CONTENT
import com.navi.coin.utils.constant.Constants.SHOW_CURVE_KEY
import com.navi.coin.vm.CoinHomeScreenVM
import com.navi.common.uitron.model.action.CtaAction
import com.navi.rr.common.actions.InitActionHandler
import com.navi.rr.common.constants.COIN_HOME_SCREEN
import com.navi.rr.utils.Constants.NULL_STRING
import com.navi.rr.utils.InitWidgetActions
import com.navi.rr.utils.NoRippleIndicationSource
import com.navi.rr.utils.brushType
import com.navi.rr.utils.getGsonBuilders
import com.navi.rr.utils.toJson

View File

@@ -1,4 +1,4 @@
package com.navi.coin.ui.compose
package com.navi.coin.ui.compose.screen
import android.app.Activity
import android.os.Bundle
@@ -15,8 +15,8 @@ import androidx.compose.ui.platform.LocalContext
import androidx.core.os.bundleOf
import androidx.hilt.navigation.compose.hiltViewModel
import com.navi.base.deeplink.DeepLinkManager
import com.navi.coin.utils.Constants.SCREENS.COINS_LOADING_SCREEN_SCREEN_NAME
import com.navi.coin.utils.Constants.SCREEN_CONTENT
import com.navi.coin.utils.constant.Constants.SCREENS.COINS_LOADING_SCREEN_SCREEN_NAME
import com.navi.coin.utils.constant.Constants.SCREEN_CONTENT
import com.navi.common.forge.model.ScreenDefinition
import com.navi.common.uitron.model.action.CtaAction
import com.navi.rr.common.utils.Init

View File

@@ -5,7 +5,7 @@
*
*/
package com.navi.coin.ui.compose
package com.navi.coin.ui.compose.screen
import android.app.Activity
import androidx.activity.compose.BackHandler
@@ -58,25 +58,25 @@ import com.navi.base.deeplink.util.DeeplinkConstants.CHAT_ACTIVITY
import com.navi.base.model.CtaData
import com.navi.base.model.LineItem
import com.navi.coin.R
import com.navi.coin.models.ScratchCard
import com.navi.coin.models.model.ScratchCard
import com.navi.coin.models.model.toFlatMap
import com.navi.coin.models.states.ScratchCardHistoryScreenState
import com.navi.coin.models.toFlatMap
import com.navi.coin.theme.Color_601978
import com.navi.coin.ui.activity.CoinBaseActivity
import com.navi.coin.ui.themes.Color_601978
import com.navi.coin.ui.themes.Color_F9F9F9
import com.navi.coin.utils.Constants
import com.navi.coin.utils.Constants.N
import com.navi.coin.utils.Constants.PREVIOUS_BALANCE
import com.navi.coin.utils.Constants.REWARD_EARNED
import com.navi.coin.utils.Constants.REWARD_HISTORY_SCRATCH_CARD_SCREEN_NAME
import com.navi.coin.utils.Constants.RR_BOTTOM_SHEET
import com.navi.coin.utils.Constants.SCREEN_NAME
import com.navi.coin.utils.Constants.TRANSACTION_ID
import com.navi.coin.utils.Constants.Y
import com.navi.coin.utils.Init
import com.navi.coin.utils.NaviCoinsAnalytics
import com.navi.coin.utils.SemiCircleShape
import com.navi.coin.views.ScratchCardListView
import com.navi.coin.theme.Color_F9F9F9
import com.navi.coin.ui.compose.common.Init
import com.navi.coin.ui.compose.common.ScratchCardListView
import com.navi.coin.utils.analytics.NaviCoinsAnalytics
import com.navi.coin.utils.constant.Constants
import com.navi.coin.utils.constant.Constants.N
import com.navi.coin.utils.constant.Constants.PREVIOUS_BALANCE
import com.navi.coin.utils.constant.Constants.REWARD_EARNED
import com.navi.coin.utils.constant.Constants.REWARD_HISTORY_SCRATCH_CARD_SCREEN_NAME
import com.navi.coin.utils.constant.Constants.RR_BOTTOM_SHEET
import com.navi.coin.utils.constant.Constants.SCREEN_NAME
import com.navi.coin.utils.constant.Constants.TRANSACTION_ID
import com.navi.coin.utils.constant.Constants.Y
import com.navi.coin.utils.shape.SemiCircleShape
import com.navi.coin.vm.ScratchCardScreenVM
import com.navi.common.constants.CHAT_BOT_SCREEN_NAME
import com.navi.common.forge.model.ScreenDefinition

View File

@@ -1,8 +1,7 @@
package com.navi.coin.widgetFactory
package com.navi.coin.ui.compose.widgetfactory
import androidx.compose.runtime.Composable
import com.navi.coin.vm.CoinHistoryScreenVM
import com.navi.coin.vm.CoinHomeScreenVM
import com.navi.common.forge.model.WidgetModelDefinition
import com.navi.common.forge.model.WidgetTypes
import com.navi.uitron.model.UiTronResponse
@@ -23,25 +22,6 @@ fun CoinWidgetRenderer(
.Render(composeViews = widget.widgetData?.parentComposeView.orEmpty())
}
else -> Unit
}
}
@Composable
fun CoinWidgetRenderer(
widget: WidgetModelDefinition<UiTronResponse>?,
viewModel: CoinHomeScreenVM
) {
if (widget == null) return
return when (widget.widgetType) {
WidgetTypes.UI_TRON_WIDGET.name -> {
UiTronRenderer(
dataMap = widget.widgetData?.data,
uiTronViewModel = viewModel,
)
.Render(composeViews = widget.widgetData?.parentComposeView.orEmpty())
}
else -> Unit
}
}

View File

@@ -1,17 +0,0 @@
package com.navi.coin.utils
import android.app.Activity
import com.navi.common.R as CommonR
fun Activity.startEnterAnimation() {
this.overridePendingTransition(
CommonR.anim.parallax_slide_in_right,
CommonR.anim.parallax_slide_out_left)
}
fun Activity.startExitAnimation() {
this.overridePendingTransition(
CommonR.anim.parallax_slide_in_left,
CommonR.anim.parallax_slide_out_right
)
}

View File

@@ -1,60 +1,34 @@
package com.navi.coin.utils
import android.app.Activity
import androidx.compose.foundation.interaction.Interaction
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.runtime.Composable
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Outline
import androidx.compose.ui.graphics.Path
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.sp
import androidx.core.content.ContextCompat
import androidx.core.view.WindowInsetsControllerCompat
import coil.imageLoader
import coil.request.CachePolicy
import coil.request.ImageRequest
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.navi.base.utils.isNull
import com.navi.coin.ui.activity.CoinBaseActivity
import com.navi.coin.utils.ext.filterEntries
import com.navi.common.CommonLibManager
import com.navi.common.forge.model.ScreenStructure
import com.navi.common.utils.registerUiTronDeSerializers
import com.navi.design.theme.getFontFamily
import com.navi.design.theme.getFontWeight
import com.navi.naviwidgets.models.NaviTextComponent
import com.navi.rr.common.activity.NavHostControllerOwner
import com.navi.rr.navigation.NavArgs
import com.navi.rr.navigation.NavigationAction
import com.navi.rr.utils.getGsonBuilders
import com.navi.uitron.utils.hexToComposeColor
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.emptyFlow
import kotlinx.coroutines.withContext
import org.json.JSONObject
import java.util.concurrent.TimeUnit
fun Activity.setStatusBarColor(color: Int, isLight: Boolean = false) {
val window = window
val decorView = window.decorView
val wic = WindowInsetsControllerCompat(window, decorView)
wic.isAppearanceLightStatusBars = isLight
window.statusBarColor = ContextCompat.getColor(this, color)
}
fun setSpannableString(
textWithSpan: NaviTextComponent
textWithSpan: NaviTextComponent,
): AnnotatedString? {
if (textWithSpan.text == null) {
return null
@@ -80,62 +54,6 @@ fun setSpannableString(
}
return annotatedString
}
class SemiCircleShape(private val height: Float) : Shape {
override fun createOutline(
size: Size,
layoutDirection: LayoutDirection,
density: Density,
): Outline {
return Outline.Generic(
path = drawSemiCircle(size, height)
)
}
private fun drawSemiCircle(size: Size, height:Float): Path {
return Path().apply {
reset()
arcTo(
rect = Rect(
left = 0f,
top = -height ,
right = size.width,
bottom = height
),
startAngleDegrees = 180.0f,
sweepAngleDegrees = -180.0f,
forceMoveTo = false
)
lineTo(size.width, 0f)
lineTo(size.width, size.height)
lineTo(0f, size.height)
close()
}
}
}
@Composable
fun Int.scaledSp(): TextUnit {
val value: Int = this
return with(LocalDensity.current) {
val fontScale = this.fontScale
val textSize = value / fontScale
textSize.sp
}
}
val Int.scaledSp: TextUnit
@Composable get() = scaledSp()
class NoRippleIndicationSource : MutableInteractionSource {
override val interactions: Flow<Interaction> = emptyFlow()
override suspend fun emit(interaction: Interaction) {}
override fun tryEmit(interaction: Interaction) = true
}
fun getSerializerGsonBuilders(): Gson = GsonBuilder()
.registerUiTronDeSerializers()
.create()
suspend fun cacheCoinHomeImages(screenStructure: ScreenStructure?) =
withContext(Dispatchers.IO) {
@@ -152,7 +70,7 @@ suspend fun cacheCoinHomeImages(screenStructure: ScreenStructure?) =
}
screenStructure.content?.widgets?.forEach { uiTronResponse ->
uiTronResponse?.let {
val jsonObj = JSONObject(getSerializerGsonBuilders().toJson(uiTronResponse))
val jsonObj = JSONObject(getGsonBuilders().toJson(uiTronResponse))
jsonObj
.filterEntries { it.first == "iconUrl" && it.second.isNull().not() }
.forEach { context.imageLoader.enqueue(request.data(it.second).build()) }

View File

@@ -1,23 +0,0 @@
/*
*
* * Copyright © 2024 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
package com.navi.coin.utils
import java.io.Closeable
interface ICountDownHelper : Closeable {
fun startTimer(
timerId: String,
millisInFuture: Long,
onTick: (Long) -> Unit,
onFinish: () -> Unit
)
fun cancelAllTimers()
fun cancelTimer(timerId: String)
}

View File

@@ -1,4 +1,4 @@
package com.navi.coin.utils
package com.navi.coin.utils.analytics
import com.navi.analytics.utils.NaviTrackEvent
import com.navi.base.sharedpref.CommonPrefConstants.USER_EXTERNAL_ID

View File

@@ -1,4 +1,4 @@
package com.navi.coin.utils
package com.navi.coin.utils.constant
object Constants {
@@ -26,18 +26,12 @@ object Constants {
const val EXPIRED_SCRATCH_CARD_URL_KEY = "expiredScratchCardUrl"
const val NAVI_COIN_URL_KEY = "naviCoinsUrl"
const val RR_BOTTOM_SHEET = "RR_BOTTOM_SHEET"
const val CURRENT_BALANCE = "currentBalance"
const val PREVIOUS_BALANCE = "previousBalance"
const val TRANSACTION_ID = "transaction_id"
const val SCREEN_NAME = "screen_name"
const val REWARD_EARNED= "reward_earned"
const val Y="Y"
const val N="N"
const val PAYMENT_SUMMARY_SCREEN = "PAYMENT_SUMMARY_SCREEN"
const val TEMPLATE_NAME = "templateName"
const val REWARD = "REWARD"
const val NO_REWARD = "NO_REWARD"
const val SCRATCH_STARTED="scratchStarted"
const val BACK="BACK"
const val SCREEN_CONTENT = "screen_content"
@@ -70,11 +64,9 @@ object Constants {
const val COINS_LOADING_SCREEN_SCREEN_NAME = "COINS_HOME_LOADING_SCREEN_M2"
}
object ErrorConfig {
const val ERROR_TITLE = "Something went wrong!"
const val ERROR_SUBTITLE = "Oops! Something isnt working correctly."
const val ERROR_BUTTON_TEXT = "Reload"
}
const val CLOSE = "close"
object ApiConstants {
const val API_CONNECT_TIMEOUT_VALUE = 20L
}
}

View File

@@ -0,0 +1,29 @@
package com.navi.coin.utils.ext
import android.app.Activity
import androidx.core.content.ContextCompat
import androidx.core.view.WindowInsetsControllerCompat
import com.navi.common.R
fun Activity.startEnterAnimation() {
this.overridePendingTransition(
R.anim.parallax_slide_in_right,
R.anim.parallax_slide_out_left
)
}
fun Activity.startExitAnimation() {
this.overridePendingTransition(
R.anim.parallax_slide_in_left,
R.anim.parallax_slide_out_right
)
}
fun Activity.setStatusBarColor(color: Int, isLight: Boolean = false) {
val window = window
val decorView = window.decorView
val wic = WindowInsetsControllerCompat(window, decorView)
wic.isAppearanceLightStatusBars = isLight
window.statusBarColor = ContextCompat.getColor(this, color)
}

View File

@@ -1,4 +1,4 @@
package com.navi.coin.utils
package com.navi.coin.utils.ext
import com.navi.common.utils.EMPTY
import com.navi.common.utils.log

View File

@@ -0,0 +1,16 @@
package com.navi.coin.utils.ext
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.sp
@Composable
fun Int.scaledSp(): TextUnit {
val value: Int = this
return with(LocalDensity.current) {
val fontScale = this.fontScale
val textSize = value / fontScale
textSize.sp
}
}

View File

@@ -5,15 +5,31 @@
*
*/
package com.navi.coin.utils
package com.navi.coin.utils.facade
import android.os.CountDownTimer
import java.io.Closeable
import javax.inject.Inject
/**
* Please call close method manually when you are done with the helper
**/
interface ICountDownHelper : Closeable {
fun startTimer(
timerId: String,
millisInFuture: Long,
onTick: (Long) -> Unit,
onFinish: () -> Unit
)
fun cancelAllTimers()
fun cancelTimer(timerId: String)
}
class CountDownFacade @Inject constructor() : ICountDownHelper {
private var idToTimer = mutableMapOf<String, CountDownTimer>()

View File

@@ -1,4 +1,4 @@
package com.navi.coin.utils
package com.navi.coin.utils.mock
import com.google.gson.JsonObject
import com.google.gson.JsonParser

View File

@@ -0,0 +1,42 @@
package com.navi.coin.utils.shape
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Outline
import androidx.compose.ui.graphics.Path
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.LayoutDirection
class SemiCircleShape(private val height: Float) : Shape {
override fun createOutline(
size: Size,
layoutDirection: LayoutDirection,
density: Density,
): Outline {
return Outline.Generic(
path = drawSemiCircle(size, height)
)
}
private fun drawSemiCircle(size: Size, height:Float): Path {
return Path().apply {
reset()
arcTo(
rect = Rect(
left = 0f,
top = -height ,
right = size.width,
bottom = height
),
startAngleDegrees = 180.0f,
sweepAngleDegrees = -180.0f,
forceMoveTo = false
)
lineTo(size.width, 0f)
lineTo(size.width, size.height)
lineTo(0f, size.height)
close()
}
}
}

View File

@@ -6,13 +6,13 @@ import androidx.paging.PagingConfig
import androidx.paging.cachedIn
import com.navi.base.cache.model.NaviCacheEntity
import com.navi.base.cache.repository.NaviCacheRepositoryImpl
import com.navi.coin.repo.CashHistoryListSource
import com.navi.coin.repo.CoinHistoryListSource
import com.navi.coin.repo.CoinHistoryScreenRepo
import com.navi.coin.repo.CoinHomeScreenRepo
import com.navi.coin.utils.CoinNavigationActions
import com.navi.coin.utils.CoinRouter
import com.navi.coin.utils.Constants.CLOSE
import com.navi.coin.repo.pagingsource.CashHistoryListSource
import com.navi.coin.repo.pagingsource.CoinHistoryListSource
import com.navi.coin.repo.repository.CoinHistoryScreenRepo
import com.navi.coin.repo.repository.CoinHomeScreenRepo
import com.navi.coin.navigator.CoinNavigationActions
import com.navi.coin.navigator.CoinRouter
import com.navi.coin.utils.constant.Constants.CLOSE
import com.navi.coin.utils.cacheCoinHomeImages
import com.navi.common.CommonLibManager
import com.navi.common.constants.DBCacheConstants.COIN_HOME_SCREEN_CACHE_KEY

View File

@@ -3,24 +3,24 @@ package com.navi.coin.vm
import com.navi.base.cache.model.NaviCacheAltSourceEntity
import com.navi.base.cache.model.NaviCacheEntity
import com.navi.base.cache.repository.NaviCacheRepositoryImpl
import com.navi.coin.models.CoinHomeScreenState
import com.navi.coin.models.RedemptionRequest
import com.navi.coin.models.RedemptionResponse
import com.navi.coin.models.RedemptionResponse.Companion.NAVI_CASH
import com.navi.coin.models.RedemptionResponse.Companion.NAVI_COINS
import com.navi.coin.models.RedemptionStatusResponse
import com.navi.coin.models.states.CoinHomeScreenState
import com.navi.coin.models.model.RedemptionRequest
import com.navi.coin.models.model.RedemptionResponse
import com.navi.coin.models.model.RedemptionResponse.Companion.NAVI_CASH
import com.navi.coin.models.model.RedemptionResponse.Companion.NAVI_COINS
import com.navi.coin.models.model.RedemptionStatusResponse
import com.navi.coin.models.states.ApiActionState
import com.navi.coin.repo.CoinHistoryScreenRepo
import com.navi.coin.repo.CoinHomeScreenRepo
import com.navi.coin.utils.CoinNavigationActions
import com.navi.coin.utils.CoinRouter
import com.navi.coin.utils.NaviCoinsAnalytics
import com.navi.coin.utils.NaviCoinsAnalytics.Companion.DEV_REDEEM_COIN_FAILURE_EVENT
import com.navi.coin.utils.NaviCoinsAnalytics.Companion.DEV_REDEEM_COIN_INITIATED_EVENT
import com.navi.coin.utils.NaviCoinsAnalytics.Companion.DEV_REDEEM_COIN_SUCCESS_EVENT
import com.navi.coin.utils.NaviCoinsAnalytics.Companion.DEV_VALIDATE_UPI_ID_EVENT
import com.navi.coin.utils.NaviCoinsAnalytics.Companion.DEV_VALIDATE_UPI_ID_FAILURE_EVENT
import com.navi.coin.utils.NaviCoinsAnalytics.Companion.DEV_VALIDATE_UPI_ID_SUCCESS_EVENT
import com.navi.coin.repo.repository.CoinHistoryScreenRepo
import com.navi.coin.repo.repository.CoinHomeScreenRepo
import com.navi.coin.navigator.CoinNavigationActions
import com.navi.coin.navigator.CoinRouter
import com.navi.coin.utils.analytics.NaviCoinsAnalytics
import com.navi.coin.utils.analytics.NaviCoinsAnalytics.Companion.DEV_REDEEM_COIN_FAILURE_EVENT
import com.navi.coin.utils.analytics.NaviCoinsAnalytics.Companion.DEV_REDEEM_COIN_INITIATED_EVENT
import com.navi.coin.utils.analytics.NaviCoinsAnalytics.Companion.DEV_REDEEM_COIN_SUCCESS_EVENT
import com.navi.coin.utils.analytics.NaviCoinsAnalytics.Companion.DEV_VALIDATE_UPI_ID_EVENT
import com.navi.coin.utils.analytics.NaviCoinsAnalytics.Companion.DEV_VALIDATE_UPI_ID_FAILURE_EVENT
import com.navi.coin.utils.analytics.NaviCoinsAnalytics.Companion.DEV_VALIDATE_UPI_ID_SUCCESS_EVENT
import com.navi.coin.utils.cacheCoinHomeImages
import com.navi.common.CommonLibManager
import com.navi.common.constants.DBCacheConstants.COIN_HOME_SCREEN_CACHE_KEY

View File

@@ -13,16 +13,16 @@ import androidx.paging.PagingConfig
import androidx.paging.cachedIn
import androidx.paging.compose.LazyPagingItems
import com.navi.base.utils.orZero
import com.navi.coin.models.ScratchCard
import com.navi.coin.di.qualifiers.CountDownHelperQualifier
import com.navi.coin.models.model.ScratchCard
import com.navi.coin.models.states.ScratchCardHistoryScreenState
import com.navi.coin.models.states.ScratchCardStatus
import com.navi.coin.network.di.CountDownHelperQualifier
import com.navi.coin.repo.ScratchCardHistoryListSource
import com.navi.coin.repo.ScratchCardHistoryScreenRepo
import com.navi.coin.utils.CoinNavigationActions
import com.navi.coin.utils.CoinRouter
import com.navi.coin.utils.Constants
import com.navi.coin.utils.ICountDownHelper
import com.navi.coin.navigator.CoinNavigationActions
import com.navi.coin.navigator.CoinRouter
import com.navi.coin.repo.pagingsource.ScratchCardHistoryListSource
import com.navi.coin.repo.repository.ScratchCardHistoryScreenRepo
import com.navi.coin.utils.constant.Constants
import com.navi.coin.utils.facade.ICountDownHelper
import com.navi.common.forge.model.ScreenDefinition
import com.navi.common.forge.model.WidgetModelDefinition
import com.navi.common.network.ApiConstants

View File

@@ -8,11 +8,11 @@
package com.navi.coins.repo
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.navi.coin.models.TransactionHistoryCardData
import com.navi.coin.models.TransactionHistoryResponse
import com.navi.coin.network.retrofit.RetrofitService
import com.navi.coin.repo.CoinHistoryScreenRepo
import com.navi.coin.utils.Constants
import com.navi.coin.models.model.TransactionHistoryCardData
import com.navi.coin.models.model.TransactionHistoryResponse
import com.navi.coin.network.RetrofitService
import com.navi.coin.repo.repository.CoinHistoryScreenRepo
import com.navi.coin.utils.constant.Constants
import com.navi.coins.common.TestDispatcher
import com.navi.common.forge.model.ScreenDefinition
import com.navi.common.forge.model.ScreenStructure
@@ -21,6 +21,7 @@ import com.navi.common.network.models.GenericResponse
import com.navi.common.network.models.RepoResult
import com.navi.common.network.retrofit.ResponseCallback
import com.navi.common.utils.Constants.GZIP
import com.navi.rr.network.retrofit.ResponseHandler
import io.mockk.MockKAnnotations
import io.mockk.coEvery
import io.mockk.every
@@ -40,6 +41,7 @@ import retrofit2.Response
class CoinHistoryScreenRepoTest {
@RelaxedMockK private lateinit var superAppRetrofitService: RetrofitService
@RelaxedMockK private lateinit var responseCallback: ResponseCallback
@RelaxedMockK private lateinit var responseHandler: ResponseHandler
private lateinit var repository: CoinHistoryScreenRepo
@get:Rule var rule: TestRule = InstantTaskExecutorRule()
@InternalCoroutinesApi lateinit var testDispatcher: TestDispatcher
@@ -55,7 +57,7 @@ class CoinHistoryScreenRepoTest {
@Test
fun testFetchCoinHistoryScreenCoinBalanceUiTronConfigs() =
runBlocking(testDispatcher) {
repository = CoinHistoryScreenRepo(superAppRetrofitService)
repository = CoinHistoryScreenRepo(superAppRetrofitService,responseHandler)
// Mock Retrofit response
val expectedResponse =
ScreenDefinition(screenStructure = ScreenStructure(screenId = "1"))
@@ -82,7 +84,7 @@ class CoinHistoryScreenRepoTest {
@Test
fun testFetchCoinHistoryScreenCashRewardsUiTronConfigs() =
runBlocking(testDispatcher) {
repository = CoinHistoryScreenRepo(superAppRetrofitService)
repository = CoinHistoryScreenRepo(superAppRetrofitService,responseHandler)
// Mock Retrofit response
val expectedResponse =
ScreenDefinition(screenStructure = ScreenStructure(screenId = "1"))
@@ -109,7 +111,7 @@ class CoinHistoryScreenRepoTest {
@Test
fun testFetchCoinsListData() =
runBlocking(testDispatcher) {
repository = CoinHistoryScreenRepo(superAppRetrofitService)
repository = CoinHistoryScreenRepo(superAppRetrofitService,responseHandler)
// Mock Retrofit response
val expectedResponse =
TransactionHistoryResponse(
@@ -138,7 +140,7 @@ class CoinHistoryScreenRepoTest {
@Test
fun testFetchCashListData() =
runBlocking(testDispatcher) {
repository = CoinHistoryScreenRepo(superAppRetrofitService)
repository = CoinHistoryScreenRepo(superAppRetrofitService,responseHandler)
val expectedResponse =
TransactionHistoryResponse(
coinHistoryList = listOf(TransactionHistoryCardData("@31123"))

View File

@@ -8,9 +8,9 @@
package com.navi.coins.repo
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.navi.coin.network.retrofit.RetrofitService
import com.navi.coin.repo.CoinHomeScreenRepo
import com.navi.coin.utils.Constants
import com.navi.coin.network.RetrofitService
import com.navi.coin.repo.repository.CoinHomeScreenRepo
import com.navi.coin.utils.constant.Constants
import com.navi.coins.common.TestDispatcher
import com.navi.common.forge.model.ScreenDefinition
import com.navi.common.forge.model.ScreenStructure

View File

@@ -3,10 +3,10 @@ package com.navi.coins.vm
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.lifecycle.viewModelScope
import com.navi.base.cache.repository.NaviCacheRepositoryImpl
import com.navi.coin.repo.CashHistoryListSource
import com.navi.coin.repo.CoinHistoryListSource
import com.navi.coin.repo.CoinHistoryScreenRepo
import com.navi.coin.repo.CoinHomeScreenRepo
import com.navi.coin.repo.pagingsource.CashHistoryListSource
import com.navi.coin.repo.pagingsource.CoinHistoryListSource
import com.navi.coin.repo.repository.CoinHistoryScreenRepo
import com.navi.coin.repo.repository.CoinHomeScreenRepo
import com.navi.coin.vm.CoinHistoryCardScreenState
import com.navi.coin.vm.CoinHistoryScreenState
import com.navi.coin.vm.CoinHistoryScreenVM

View File

@@ -1,13 +1,11 @@
package com.navi.coins.vm
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.lifecycle.viewModelScope
import com.navi.base.cache.model.NaviCacheEntity
import com.navi.base.cache.repository.NaviCacheRepositoryImpl
import com.navi.coin.repo.CashHistoryListSource
import com.navi.coin.repo.CoinHistoryListSource
import com.navi.coin.repo.CoinHistoryScreenRepo
import com.navi.coin.repo.CoinHomeScreenRepo
import com.navi.coin.repo.pagingsource.CashHistoryListSource
import com.navi.coin.repo.pagingsource.CoinHistoryListSource
import com.navi.coin.repo.repository.CoinHistoryScreenRepo
import com.navi.coin.repo.repository.CoinHomeScreenRepo
import com.navi.coin.vm.CoinHomeScreenVM
import com.navi.coins.common.TestDispatcher
import com.navi.common.forge.model.ScreenDefinition
@@ -21,17 +19,8 @@ import io.mockk.impl.annotations.RelaxedMockK
import io.mockk.unmockkAll
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.InternalCoroutinesApi
import kotlinx.coroutines.cancel
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestCoroutineDispatcher
import kotlinx.coroutines.test.TestCoroutineScope
import kotlinx.coroutines.test.advanceUntilIdle
import kotlinx.coroutines.test.resetMain
import kotlinx.coroutines.test.runBlockingTest
import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.test.setMain
import org.junit.After
import org.junit.Before
import org.junit.Rule