diff --git a/common/src/main/res/values-ku/strings.xml b/common/src/main/res/values-ku/strings.xml index a92c11a..b8430d8 100644 --- a/common/src/main/res/values-ku/strings.xml +++ b/common/src/main/res/values-ku/strings.xml @@ -2778,7 +2778,7 @@ Tu jixwe hemwelatî yî Di People Chain de balance têr nîne. Herî kêm 1.1 HEZ pêwîst e. Serlêdan bi serkeftî hat şandin - Ji bo hemwelatîbûna Kurdistana Dîjîtal hevalê xwe vexwîne!\n\nNavnîşana min a referansê:\n%s + Ji bo hemwelatîbûna Kurdistana Dîjîtal hevalê xwe vexwîne!\n\nDi sepanê de veke:\n%1$s\n\nNavnîşana referansê:\n%2$s Lînka Referansê Parve Bike Navnîşana Referansê (ne mecbûrî) Referansa te serlêdana te pejirand. Ji bo temamkirina hemwelatîbûnê îmze bike. diff --git a/common/src/main/res/values-tr/strings.xml b/common/src/main/res/values-tr/strings.xml index 2d59629..14da288 100644 --- a/common/src/main/res/values-tr/strings.xml +++ b/common/src/main/res/values-tr/strings.xml @@ -45,7 +45,7 @@ Zaten vatandaşsınız People Chain\'de yetersiz bakiye. En az 1.1 HEZ gerekli. Başvuru başarıyla gönderildi - Dijital Kurdistan vatandaşlığı için arkadaşını davet et!\n\nReferans adresim:\n%s + Dijital Kurdistan vatandaşlığı için arkadaşını davet et!\n\nUygulamada aç:\n%1$s\n\nReferans adresi:\n%2$s Referans Linkini Paylaş Referans Adresi (opsiyonel) Referansınız başvurunuzu onayladı. Vatandaşlığı tamamlamak için imzalayın. diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index c83574a..1c7a1d8 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -2782,7 +2782,7 @@ You are already a citizen Insufficient balance on People Chain. At least 1.1 HEZ required. Application submitted successfully - Refer a friend for Digital Kurdistan citizenship!\n\nMy referrer address:\n%s + Refer a friend for Digital Kurdistan citizenship!\n\nOpen in app:\n%1$s\n\nReferrer address:\n%2$s Share Referral Link Referrer Address (optional) Your referrer has approved your application. Sign to complete citizenship. diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/di/modules/deeplinks/DeepLinkModule.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/di/modules/deeplinks/DeepLinkModule.kt index 68f121e..cdbb843 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/di/modules/deeplinks/DeepLinkModule.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/di/modules/deeplinks/DeepLinkModule.kt @@ -8,6 +8,7 @@ import io.novafoundation.nova.feature_account_api.domain.interfaces.AccountRepos import io.novafoundation.nova.feature_assets.presentation.AssetsRouter import io.novafoundation.nova.feature_assets.presentation.balance.detail.deeplink.AssetDetailsDeepLinkConfigurator import io.novafoundation.nova.feature_assets.presentation.balance.detail.deeplink.AssetDetailsDeepLinkHandler +import io.novafoundation.nova.feature_assets.presentation.citizenship.deeplink.CitizenshipDeepLinkHandler import io.novafoundation.nova.feature_assets.presentation.novacard.common.NovaCardRestrictionCheckMixin import io.novafoundation.nova.feature_assets.presentation.novacard.overview.deeplink.NovaCardDeepLinkHandler import io.novafoundation.nova.feature_deep_linking.presentation.configuring.LinkBuilderFactory @@ -56,12 +57,21 @@ class DeepLinkModule { ) } + @Provides + @FeatureScope + fun provideCitizenshipDeepLinkHandler( + automaticInteractionGate: AutomaticInteractionGate + ): CitizenshipDeepLinkHandler { + return CitizenshipDeepLinkHandler(automaticInteractionGate) + } + @Provides @FeatureScope fun provideDeepLinks( assetDetails: AssetDetailsDeepLinkHandler, - novaCardDeepLink: NovaCardDeepLinkHandler + novaCardDeepLink: NovaCardDeepLinkHandler, + citizenshipDeepLink: CitizenshipDeepLinkHandler ): AssetDeepLinks { - return AssetDeepLinks(listOf(assetDetails, novaCardDeepLink)) + return AssetDeepLinks(listOf(assetDetails, novaCardDeepLink, citizenshipDeepLink)) } } diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListFragment.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListFragment.kt index 105d83f..8741f42 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListFragment.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListFragment.kt @@ -178,8 +178,8 @@ class BalanceListFragment : viewModel.filtersIndicatorIcon.observe(headerAdapter::setFilterIconRes) viewModel.assetViewModeModelFlow.observe { manageAssetsAdapter.setAssetViewModeModel(it) } - viewModel.openCitizenshipEvent.observeEvent { - CitizenshipBottomSheet().show(childFragmentManager, "citizenship") + viewModel.openCitizenshipEvent.observeEvent { referrer -> + CitizenshipBottomSheet.newInstance(referrer).show(childFragmentManager, "citizenship") } viewModel.shareReferralEvent.observeEvent { shareText -> diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListViewModel.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListViewModel.kt index 7266b7a..2e95c5e 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListViewModel.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/BalanceListViewModel.kt @@ -40,6 +40,7 @@ import io.novafoundation.nova.feature_assets.presentation.balance.breakdown.mode import io.novafoundation.nova.feature_assets.presentation.balance.common.AssetListMixinFactory import io.novafoundation.nova.feature_assets.presentation.balance.common.buySell.BuySellSelectorMixin import io.novafoundation.nova.feature_assets.presentation.balance.common.buySell.BuySellSelectorMixinFactory +import io.novafoundation.nova.feature_assets.presentation.citizenship.PendingCitizenshipReferrer import io.novafoundation.nova.feature_assets.presentation.balance.list.model.NftPreviewUi import io.novafoundation.nova.feature_assets.presentation.balance.list.model.TotalBalanceModel import io.novafoundation.nova.feature_assets.presentation.balance.list.view.AssetViewModeModel @@ -115,8 +116,8 @@ class BalanceListViewModel( private val _showBalanceBreakdownEvent = MutableLiveData>() val showBalanceBreakdownEvent: LiveData> = _showBalanceBreakdownEvent - private val _openCitizenshipEvent = MutableLiveData>() - val openCitizenshipEvent: LiveData> = _openCitizenshipEvent + private val _openCitizenshipEvent = MutableLiveData>() + val openCitizenshipEvent: LiveData> = _openCitizenshipEvent private val _shareReferralEvent = MutableLiveData>() val shareReferralEvent: LiveData> = _shareReferralEvent @@ -267,6 +268,10 @@ class BalanceListViewModel( walletInteractor.nftSyncTrigger() .onEach { trigger -> walletInteractor.syncChainNfts(selectedMetaAccount.first(), trigger.chain) } .launchIn(viewModelScope) + + PendingCitizenshipReferrer.referrerEvent + .onEach { referrer -> _openCitizenshipEvent.postValue(Event(referrer)) } + .launchIn(this) } fun fullSync() { @@ -409,13 +414,14 @@ class BalanceListViewModel( } fun basvuruClicked() = launchUnit { - _openCitizenshipEvent.postValue(Event(Unit)) + _openCitizenshipEvent.postValue(Event(null)) } fun shareReferralClicked() = launchUnit { val metaAccount = selectedAccountUseCase.getSelectedMetaAccount() val address = metaAccount.defaultSubstrateAddress ?: return@launchUnit - val shareText = resourceManager.getString(R.string.citizenship_share_referral, address) + val deepLink = "pezkuwiwallet://pezkuwi/open/citizenship?referrer=$address" + val shareText = resourceManager.getString(R.string.citizenship_share_referral, deepLink, address) _shareReferralEvent.postValue(Event(shareText)) } diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/citizenship/CitizenshipBottomSheet.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/citizenship/CitizenshipBottomSheet.kt index 1d616b3..cb41145 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/citizenship/CitizenshipBottomSheet.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/citizenship/CitizenshipBottomSheet.kt @@ -3,6 +3,7 @@ package io.novafoundation.nova.feature_assets.presentation.citizenship import android.content.Intent import android.content.res.ColorStateList import android.graphics.Color +import android.os.Bundle import android.view.Gravity import android.view.View import android.view.ViewGroup @@ -21,6 +22,16 @@ import io.novafoundation.nova.feature_assets.di.AssetsFeatureComponent class CitizenshipBottomSheet : BaseBottomSheetFragment() { + companion object { + private const val KEY_REFERRER = "referrer" + + fun newInstance(referrer: String? = null) = CitizenshipBottomSheet().apply { + arguments = Bundle().apply { + referrer?.let { putString(KEY_REFERRER, it) } + } + } + } + override fun createBinding() = FragmentCitizenshipBottomSheetBinding.inflate(layoutInflater) override fun inject() { @@ -35,6 +46,7 @@ class CitizenshipBottomSheet : BaseBottomSheetFragment updateUiForStatus(status) diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/citizenship/CitizenshipViewModel.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/citizenship/CitizenshipViewModel.kt index 00b299b..3085409 100644 --- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/citizenship/CitizenshipViewModel.kt +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/citizenship/CitizenshipViewModel.kt @@ -208,7 +208,8 @@ class CitizenshipViewModel( val metaAccount = selectedAccountUseCase.getSelectedMetaAccount() val address = metaAccount.addressIn(chain) ?: return@launch - val shareText = resourceManager.getString(R.string.citizenship_share_referral, address) + val deepLink = "pezkuwiwallet://pezkuwi/open/citizenship?referrer=$address" + val shareText = resourceManager.getString(R.string.citizenship_share_referral, deepLink, address) _shareEvent.postValue(Event(shareText)) } catch (e: Exception) { Log.e(TAG, "shareReferralLink failed", e) diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/citizenship/PendingCitizenshipReferrer.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/citizenship/PendingCitizenshipReferrer.kt new file mode 100644 index 0000000..a4e4666 --- /dev/null +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/citizenship/PendingCitizenshipReferrer.kt @@ -0,0 +1,14 @@ +package io.novafoundation.nova.feature_assets.presentation.citizenship + +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableSharedFlow + +object PendingCitizenshipReferrer { + + private val _referrerEvent = MutableSharedFlow(extraBufferCapacity = 1) + val referrerEvent: Flow = _referrerEvent + + fun emit(referrer: String) { + _referrerEvent.tryEmit(referrer) + } +} diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/citizenship/deeplink/CitizenshipDeepLinkHandler.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/citizenship/deeplink/CitizenshipDeepLinkHandler.kt new file mode 100644 index 0000000..ad026eb --- /dev/null +++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/citizenship/deeplink/CitizenshipDeepLinkHandler.kt @@ -0,0 +1,35 @@ +package io.novafoundation.nova.feature_assets.presentation.citizenship.deeplink + +import android.net.Uri +import io.novafoundation.nova.common.utils.sequrity.AutomaticInteractionGate +import io.novafoundation.nova.common.utils.sequrity.awaitInteractionAllowed +import io.novafoundation.nova.feature_assets.presentation.citizenship.PendingCitizenshipReferrer +import io.novafoundation.nova.feature_deep_linking.presentation.handling.CallbackEvent +import io.novafoundation.nova.feature_deep_linking.presentation.handling.DeepLinkHandler +import kotlinx.coroutines.flow.MutableSharedFlow + +class CitizenshipDeepLinkHandler( + private val automaticInteractionGate: AutomaticInteractionGate +) : DeepLinkHandler { + + companion object { + private const val PATH_PREFIX = "/open/citizenship" + private const val REFERRER_PARAM = "referrer" + } + + override val callbackFlow = MutableSharedFlow() + + override suspend fun matches(data: Uri): Boolean { + val path = data.path ?: return false + return path.startsWith(PATH_PREFIX) + } + + override suspend fun handleDeepLink(data: Uri): Result = runCatching { + automaticInteractionGate.awaitInteractionAllowed() + + val referrer = data.getQueryParameter(REFERRER_PARAM) + ?: throw IllegalArgumentException("Missing referrer parameter") + + PendingCitizenshipReferrer.emit(referrer) + } +}