diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml
index c7e95933..74d638b6 100644
--- a/common/src/main/res/values/strings.xml
+++ b/common/src/main/res/values/strings.xml
@@ -2777,6 +2777,7 @@
Start Tracking
Score tracking started!
Hejmara Kurd Le Cihane
+ Mining Simulation
Pending Signatures
Sign
diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/domain/dashboard/MiningSimulationFormula.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/domain/dashboard/MiningSimulationFormula.kt
new file mode 100644
index 00000000..a3a50f39
--- /dev/null
+++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/domain/dashboard/MiningSimulationFormula.kt
@@ -0,0 +1,48 @@
+package io.novafoundation.nova.feature_assets.domain.dashboard
+
+import java.math.BigInteger
+
+/**
+ * Cosmetic, client-side-only preview of what a user's PEZ trust-score-weighted emission share
+ * could look like - not tied to any real distribution mechanism or backend. Numbers loosely track
+ * the real era emission (92.5M PEZ per ~30-day era) without claiming accuracy; see the "referral
+ * incentive" mining card this backs.
+ */
+object MiningSimulationFormula {
+
+ private const val ERA_DAYS = 30
+ const val ERA_DURATION_MS = ERA_DAYS * 24 * 60 * 60 * 1000L
+ private const val ERA_MINUTES = ERA_DAYS * 24 * 60
+ private const val ERA_POOL_PEZ = 92_500_000.0
+
+ /** Assumed total trust score across the network - unknowable client-side, so this is a
+ * simulation-only reference point, not a real aggregate. */
+ private const val REFERENCE_TOTAL_TRUST = 500_000.0
+
+ const val SESSION_DURATION_MS = 24 * 60 * 60 * 1000L
+
+ private val poolPerMinute = ERA_POOL_PEZ / ERA_MINUTES
+
+ /** Zero trust score always yields zero rate - trust score is a direct multiplier, not an offset. */
+ fun ratePerMinute(trustScore: BigInteger): Double {
+ if (trustScore <= BigInteger.ZERO) return 0.0
+
+ return poolPerMinute * (trustScore.toDouble() / REFERENCE_TOTAL_TRUST)
+ }
+
+ fun isSessionActive(sessionActivatedAt: Long, now: Long): Boolean {
+ return sessionActivatedAt > 0L && now < sessionActivatedAt + SESSION_DURATION_MS
+ }
+
+ /** [baseDiamonds] is the frozen within-era total as of [sessionActivatedAt] (0 = no active
+ * session right now, in which case this is just the frozen total with nothing accruing). */
+ fun diamondsWithinEra(baseDiamonds: Double, sessionActivatedAt: Long, trustScore: BigInteger, now: Long): Double {
+ if (sessionActivatedAt <= 0L) return baseDiamonds
+
+ val sessionEnd = sessionActivatedAt + SESSION_DURATION_MS
+ val effectiveNow = minOf(now, sessionEnd)
+ val elapsedMinutes = (effectiveNow - sessionActivatedAt).coerceAtLeast(0) / 60_000.0
+
+ return baseDiamonds + elapsedMinutes * ratePerMinute(trustScore)
+ }
+}
diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/domain/dashboard/MiningSimulationRepository.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/domain/dashboard/MiningSimulationRepository.kt
new file mode 100644
index 00000000..09117aa9
--- /dev/null
+++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/domain/dashboard/MiningSimulationRepository.kt
@@ -0,0 +1,91 @@
+package io.novafoundation.nova.feature_assets.domain.dashboard
+
+import io.novafoundation.nova.common.data.storage.Preferences
+import java.math.BigInteger
+
+data class MiningSimulationState(
+ val eraStartedAt: Long, // 0 = era never started (no session ever activated)
+ val sessionActivatedAt: Long, // 0 = no active session right now
+ val baseDiamonds: Double, // frozen total within the current era
+)
+
+interface MiningSimulationRepository {
+
+ /** Applies any pending era rollover (see [MiningSimulationFormula.ERA_DURATION_MS]) before
+ * returning the current state - callers should always go through this, never read raw prefs. */
+ fun getState(accountId: Long, now: Long): MiningSimulationState
+
+ /** Freezes the live total (as of [now]) as the new base and starts a fresh session -
+ * never resets [MiningSimulationState.baseDiamonds] to zero except via an era rollover. */
+ fun activate(accountId: Long, trustScore: BigInteger, now: Long): MiningSimulationState
+}
+
+private const val MICRO_SCALE = 1_000_000L
+
+class RealMiningSimulationRepository(
+ private val preferences: Preferences
+) : MiningSimulationRepository {
+
+ override fun getState(accountId: Long, now: Long): MiningSimulationState {
+ return normalize(accountId, now)
+ }
+
+ override fun activate(accountId: Long, trustScore: BigInteger, now: Long): MiningSimulationState {
+ val normalized = normalize(accountId, now)
+
+ val liveDiamonds = MiningSimulationFormula.diamondsWithinEra(
+ baseDiamonds = normalized.baseDiamonds,
+ sessionActivatedAt = normalized.sessionActivatedAt,
+ trustScore = trustScore,
+ now = now
+ )
+
+ val eraStartedAt = if (normalized.eraStartedAt == 0L) now else normalized.eraStartedAt
+
+ val newState = normalized.copy(
+ eraStartedAt = eraStartedAt,
+ sessionActivatedAt = now,
+ baseDiamonds = liveDiamonds
+ )
+ persist(accountId, newState)
+ return newState
+ }
+
+ /** Detects and applies an era rollover (>= ERA_DURATION_MS since era start) - resets both the
+ * diamond total and the active session, since that era's simulated pool is "distributed". */
+ private fun normalize(accountId: Long, now: Long): MiningSimulationState {
+ val stored = read(accountId)
+ if (stored.eraStartedAt == 0L) return stored
+
+ val erasElapsed = (now - stored.eraStartedAt) / MiningSimulationFormula.ERA_DURATION_MS
+ if (erasElapsed <= 0L) return stored
+
+ val rolledOver = stored.copy(
+ eraStartedAt = stored.eraStartedAt + erasElapsed * MiningSimulationFormula.ERA_DURATION_MS,
+ sessionActivatedAt = 0L,
+ baseDiamonds = 0.0
+ )
+ persist(accountId, rolledOver)
+ return rolledOver
+ }
+
+ private fun read(accountId: Long): MiningSimulationState {
+ return MiningSimulationState(
+ eraStartedAt = preferences.getLong(eraKey(accountId), 0L),
+ sessionActivatedAt = preferences.getLong(sessionKey(accountId), 0L),
+ baseDiamonds = preferences.getLong(diamondsKey(accountId), 0L) / MICRO_SCALE.toDouble()
+ )
+ }
+
+ private fun persist(accountId: Long, state: MiningSimulationState) {
+ val editor = preferences.edit()
+ editor.putLong(eraKey(accountId), state.eraStartedAt)
+ editor.putLong(sessionKey(accountId), state.sessionActivatedAt)
+ editor.putLong(diamondsKey(accountId), (state.baseDiamonds * MICRO_SCALE).toLong())
+ editor.apply()
+ }
+
+ private fun eraKey(accountId: Long) = "MiningSimulationRepository.era.$accountId"
+ private fun sessionKey(accountId: Long) = "MiningSimulationRepository.session.$accountId"
+ private fun diamondsKey(accountId: Long) = "MiningSimulationRepository.diamonds.$accountId"
+}
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 1278f1e4..43aca362 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
@@ -143,6 +143,10 @@ class BalanceListFragment :
}
}
+ viewModel.miningSimulationFlow.observe { model ->
+ pezkuwiDashboardAdapter.setMiningModel(model)
+ }
+
viewModel.bannersMixin.bindWithAdapter(bannerAdapter) {
binder.balanceListAssets.invalidateItemDecorations()
}
@@ -301,6 +305,14 @@ class BalanceListFragment :
viewModel.startTrackingClicked()
}
+ override fun onMiningSquareClicked() {
+ viewModel.miningSquareClicked()
+ }
+
+ override fun onMiningInfoClicked() {
+ viewModel.miningInfoClicked()
+ }
+
private fun setupRecyclerViewSpacing() {
binder.balanceListAssets.addSpaceItemDecoration {
add(SpaceBetween(AssetsHeaderHolder, PezkuwiDashboardHolder, spaceDp = 8))
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 03d4305e..52ec2d90 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
@@ -27,7 +27,10 @@ import io.novafoundation.nova.feature_account_api.domain.model.defaultSubstrateA
import io.novafoundation.nova.feature_assets.R
import io.novafoundation.nova.feature_assets.domain.WalletInteractor
import io.novafoundation.nova.feature_assets.domain.assets.list.AssetsListInteractor
+import io.novafoundation.nova.feature_assets.domain.dashboard.MiningSimulationFormula
+import io.novafoundation.nova.feature_assets.domain.dashboard.MiningSimulationRepository
import io.novafoundation.nova.feature_assets.domain.dashboard.PezkuwiDashboardInteractor
+import io.novafoundation.nova.feature_assets.presentation.balance.list.model.MiningSimulationModel
import io.novafoundation.nova.feature_assets.presentation.balance.list.model.PezkuwiDashboardModel
import io.novafoundation.nova.feature_assets.domain.assets.list.NftPreviews
import io.novafoundation.nova.feature_assets.domain.breakdown.BalanceBreakdown
@@ -74,18 +77,22 @@ import io.novafoundation.nova.runtime.multiNetwork.chain.model.Chain
import io.novasama.substrate_sdk_android.runtime.extrinsic.call
import java.text.NumberFormat
import kotlinx.coroutines.async
+import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.debounce
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.onEach
+import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.joinAll
import kotlinx.coroutines.launch
+import java.math.BigInteger
import kotlin.time.Duration.Companion.seconds
private typealias SyncAction = suspend (MetaAccount) -> Unit
@@ -113,7 +120,8 @@ class BalanceListViewModel(
private val giftsRestrictionCheckMixin: GiftsRestrictionCheckMixin,
private val pezkuwiDashboardInteractor: PezkuwiDashboardInteractor,
private val extrinsicService: ExtrinsicService,
- private val chainRegistry: ChainRegistry
+ private val chainRegistry: ChainRegistry,
+ private val miningSimulationRepository: MiningSimulationRepository
) : BaseViewModel(), Browserable.Presentation by Browserable() {
private val maskableAmountFormatterFlow = maskableValueFormatterProvider.provideFormatter()
@@ -139,6 +147,11 @@ class BalanceListViewModel(
private val dashboardRefreshSignal = MutableStateFlow(0)
+ private val diamondFormatter = NumberFormat.getNumberInstance().apply {
+ minimumFractionDigits = 2
+ maximumFractionDigits = 2
+ }
+
val bannersMixin = promotionBannersMixinFactory.create(bannerSourceFactory.assetsSource(), viewModelScope)
private val selectedCurrency = currencyInteractor.observeSelectCurrency()
@@ -256,6 +269,7 @@ class BalanceListViewModel(
PezkuwiDashboardModel(
roles = data.roles,
trustScore = data.trustScore.toString(),
+ trustScoreRaw = data.trustScore,
welatiCount = NumberFormat.getIntegerInstance().format(data.welatiCount),
citizenshipStatus = data.citizenshipStatus,
isTrackingScore = data.isTrackingScore
@@ -265,6 +279,52 @@ class BalanceListViewModel(
}
.shareInBackground()
+ private val miningRefreshSignal = MutableStateFlow(0)
+
+ private val miningTicker = flow {
+ while (true) {
+ emit(Unit)
+ delay(60_000L)
+ }
+ }.onStart { emit(Unit) }
+
+ val miningSimulationFlow = combine(
+ pezkuwiDashboardFlow,
+ selectedMetaAccount,
+ miningTicker,
+ miningRefreshSignal
+ ) { dashboard, metaAccount, _, _ ->
+ val trustScore = dashboard?.trustScoreRaw ?: BigInteger.ZERO
+ val now = System.currentTimeMillis()
+ val state = miningSimulationRepository.getState(metaAccount.id, now)
+ val diamonds = MiningSimulationFormula.diamondsWithinEra(state.baseDiamonds, state.sessionActivatedAt, trustScore, now)
+
+ MiningSimulationModel(
+ diamondsText = diamondFormatter.format(diamonds),
+ isActive = MiningSimulationFormula.isSessionActive(state.sessionActivatedAt, now)
+ )
+ }.shareInBackground()
+
+ fun miningSquareClicked() {
+ launch {
+ val metaAccount = selectedMetaAccount.first()
+ val now = System.currentTimeMillis()
+ val alreadyActive = MiningSimulationFormula.isSessionActive(
+ miningSimulationRepository.getState(metaAccount.id, now).sessionActivatedAt,
+ now
+ )
+ if (alreadyActive) return@launch
+
+ val trustScore = pezkuwiDashboardFlow.first()?.trustScoreRaw ?: BigInteger.ZERO
+ miningSimulationRepository.activate(metaAccount.id, trustScore, now)
+ miningRefreshSignal.value++
+ }
+ }
+
+ fun miningInfoClicked() {
+ showBrowser("https://t.me/DKSKurdistanBot")
+ }
+
init {
selectedCurrency
.onEach { fullSync() }
diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/di/BalanceListModule.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/di/BalanceListModule.kt
index eb4ddf0d..e8f1dd5a 100644
--- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/di/BalanceListModule.kt
+++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/di/BalanceListModule.kt
@@ -7,6 +7,7 @@ import dagger.Module
import dagger.Provides
import dagger.multibindings.IntoMap
import io.novafoundation.nova.common.data.repository.AssetsViewModeRepository
+import io.novafoundation.nova.common.data.storage.Preferences
import io.novafoundation.nova.common.di.scope.ScreenScope
import io.novafoundation.nova.common.di.viewmodel.ViewModelKey
import io.novafoundation.nova.common.di.viewmodel.ViewModelModule
@@ -20,7 +21,9 @@ import io.novafoundation.nova.feature_assets.domain.WalletInteractor
import io.novafoundation.nova.feature_assets.domain.assets.ExternalBalancesInteractor
import io.novafoundation.nova.feature_assets.domain.assets.list.AssetsListInteractor
import io.novafoundation.nova.feature_assets.domain.breakdown.BalanceBreakdownInteractor
+import io.novafoundation.nova.feature_assets.domain.dashboard.MiningSimulationRepository
import io.novafoundation.nova.feature_assets.domain.dashboard.PezkuwiDashboardInteractor
+import io.novafoundation.nova.feature_assets.domain.dashboard.RealMiningSimulationRepository
import io.novafoundation.nova.runtime.di.REMOTE_STORAGE_SOURCE
import io.novafoundation.nova.runtime.multiNetwork.ChainRegistry
import io.novafoundation.nova.runtime.storage.source.StorageDataSource
@@ -103,6 +106,12 @@ class BalanceListModule {
return PezkuwiDashboardInteractor(repository, chainRegistry)
}
+ @Provides
+ @ScreenScope
+ fun provideMiningSimulationRepository(preferences: Preferences): MiningSimulationRepository {
+ return RealMiningSimulationRepository(preferences)
+ }
+
@Provides
@IntoMap
@ViewModelKey(BalanceListViewModel::class)
@@ -130,6 +139,7 @@ class BalanceListModule {
pezkuwiDashboardInteractor: PezkuwiDashboardInteractor,
extrinsicService: ExtrinsicService,
chainRegistry: ChainRegistry,
+ miningSimulationRepository: MiningSimulationRepository,
): ViewModel {
return BalanceListViewModel(
promotionBannersMixinFactory = promotionBannersMixinFactory,
@@ -154,7 +164,8 @@ class BalanceListModule {
giftsRestrictionCheckMixin = giftsRestrictionCheckMixin,
pezkuwiDashboardInteractor = pezkuwiDashboardInteractor,
extrinsicService = extrinsicService,
- chainRegistry = chainRegistry
+ chainRegistry = chainRegistry,
+ miningSimulationRepository = miningSimulationRepository
)
}
diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/model/MiningSimulationModel.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/model/MiningSimulationModel.kt
new file mode 100644
index 00000000..6c1ae799
--- /dev/null
+++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/model/MiningSimulationModel.kt
@@ -0,0 +1,6 @@
+package io.novafoundation.nova.feature_assets.presentation.balance.list.model
+
+data class MiningSimulationModel(
+ val diamondsText: String,
+ val isActive: Boolean,
+)
diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/model/PezkuwiDashboardModel.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/model/PezkuwiDashboardModel.kt
index 11a59405..2ffea73c 100644
--- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/model/PezkuwiDashboardModel.kt
+++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/model/PezkuwiDashboardModel.kt
@@ -1,10 +1,12 @@
package io.novafoundation.nova.feature_assets.presentation.balance.list.model
import io.novafoundation.nova.feature_assets.presentation.citizenship.CitizenshipStatus
+import java.math.BigInteger
data class PezkuwiDashboardModel(
val roles: List,
val trustScore: String,
+ val trustScoreRaw: BigInteger,
val welatiCount: String,
val citizenshipStatus: CitizenshipStatus = CitizenshipStatus.NOT_STARTED,
val isTrackingScore: Boolean = false
diff --git a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/view/PezkuwiDashboardAdapter.kt b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/view/PezkuwiDashboardAdapter.kt
index d869ad42..ac564251 100644
--- a/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/view/PezkuwiDashboardAdapter.kt
+++ b/feature-assets/src/main/java/io/novafoundation/nova/feature_assets/presentation/balance/list/view/PezkuwiDashboardAdapter.kt
@@ -14,6 +14,7 @@ import io.novafoundation.nova.common.utils.inflater
import io.novafoundation.nova.common.utils.recyclerView.WithViewType
import io.novafoundation.nova.feature_assets.R
import io.novafoundation.nova.feature_assets.databinding.ItemPezkuwiDashboardBinding
+import io.novafoundation.nova.feature_assets.presentation.balance.list.model.MiningSimulationModel
import io.novafoundation.nova.feature_assets.presentation.balance.list.model.PezkuwiDashboardModel
import io.novafoundation.nova.feature_assets.presentation.citizenship.CitizenshipStatus
@@ -26,10 +27,13 @@ class PezkuwiDashboardAdapter(
fun onSignClicked()
fun onShareReferralClicked()
fun onStartTrackingClicked()
+ fun onMiningSquareClicked()
+ fun onMiningInfoClicked()
}
private var model: PezkuwiDashboardModel? = null
private var trackingLoading: Boolean = false
+ private var miningModel: MiningSimulationModel? = null
// Survives ViewHolder recycling (scroll) within the process, but not process restart —
// resets to collapsed (false) whenever the app is freshly opened, by design.
@@ -45,6 +49,11 @@ class PezkuwiDashboardAdapter(
notifyChangedIfShown()
}
+ fun setMiningModel(model: MiningSimulationModel) {
+ this.miningModel = model
+ notifyChangedIfShown()
+ }
+
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PezkuwiDashboardHolder {
val binding = ItemPezkuwiDashboardBinding.inflate(parent.inflater(), parent, false)
return PezkuwiDashboardHolder(binding, handler) { expanded -> isExpanded = expanded }
@@ -52,6 +61,7 @@ class PezkuwiDashboardAdapter(
override fun onBindViewHolder(holder: PezkuwiDashboardHolder, position: Int) {
model?.let { holder.bind(it, trackingLoading, isExpanded) }
+ miningModel?.let { holder.bindMining(it) }
}
override fun getItemViewType(position: Int): Int {
@@ -77,6 +87,9 @@ class PezkuwiDashboardHolder(
binder.pezkuwiDashboardCollapsedBar.setOnClickListener { setExpanded(true) }
binder.pezkuwiDashboardCollapseButton.setOnClickListener { setExpanded(false) }
+
+ binder.pezkuwiDashboardMiningSquare.setOnClickListener { handler.onMiningSquareClicked() }
+ binder.pezkuwiDashboardMiningInfoButton.setOnClickListener { handler.onMiningInfoClicked() }
}
private fun setExpanded(expanded: Boolean) {
@@ -86,6 +99,13 @@ class PezkuwiDashboardHolder(
onExpandedChanged(expanded)
}
+ fun bindMining(model: MiningSimulationModel) {
+ binder.pezkuwiDashboardMiningCount.text = model.diamondsText
+
+ val color = if (model.isActive) Color.parseColor("#FDB813") else Color.parseColor("#E2231A")
+ binder.pezkuwiDashboardMiningSquare.background.mutate().setTint(color)
+ }
+
fun bind(model: PezkuwiDashboardModel, trackingLoading: Boolean = false, isExpanded: Boolean = false) {
bindRoles(model.roles)
binder.pezkuwiDashboardTrustValue.text = model.trustScore
diff --git a/feature-assets/src/main/res/drawable/bg_pezkuwi_mining_square.xml b/feature-assets/src/main/res/drawable/bg_pezkuwi_mining_square.xml
new file mode 100644
index 00000000..560c5b7c
--- /dev/null
+++ b/feature-assets/src/main/res/drawable/bg_pezkuwi_mining_square.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
diff --git a/feature-assets/src/main/res/drawable/ic_telegram.xml b/feature-assets/src/main/res/drawable/ic_telegram.xml
new file mode 100644
index 00000000..b2ee877b
--- /dev/null
+++ b/feature-assets/src/main/res/drawable/ic_telegram.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
diff --git a/feature-assets/src/main/res/layout/item_pezkuwi_dashboard.xml b/feature-assets/src/main/res/layout/item_pezkuwi_dashboard.xml
index ad70aa25..eda56007 100644
--- a/feature-assets/src/main/res/layout/item_pezkuwi_dashboard.xml
+++ b/feature-assets/src/main/res/layout/item_pezkuwi_dashboard.xml
@@ -130,6 +130,63 @@
android:text="@string/pezkuwi_dashboard_kurds_title"
android:textColor="#7AFFFFFF"
android:textSize="10sp" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+