Initial commit: Pezkuwi Wallet Android

Complete rebrand of Nova Wallet for Pezkuwichain ecosystem.

## Features
- Full Pezkuwichain support (HEZ & PEZ tokens)
- Polkadot ecosystem compatibility
- Staking, Governance, DeFi, NFTs
- XCM cross-chain transfers
- Hardware wallet support (Ledger, Polkadot Vault)
- WalletConnect v2
- Push notifications

## Languages
- English, Turkish, Kurmanci (Kurdish), Spanish, French, German, Russian, Japanese, Chinese, Korean, Portuguese, Vietnamese

Based on Nova Wallet by Novasama Technologies GmbH
© Dijital Kurdistan Tech Institute 2026
This commit is contained in:
2026-01-23 01:31:12 +03:00
commit 31c8c5995f
7621 changed files with 425838 additions and 0 deletions
@@ -0,0 +1,12 @@
package io.novafoundation.nova.splash
import io.novafoundation.nova.common.navigation.SecureRouter
interface SplashRouter : SecureRouter {
fun openWelcomeScreen()
fun openCreatePincode()
fun openInitialCheckPincode()
}
@@ -0,0 +1,3 @@
package io.novafoundation.nova.splash.di
interface SplashFeatureApi
@@ -0,0 +1,44 @@
package io.novafoundation.nova.splash.di
import dagger.BindsInstance
import dagger.Component
import io.novafoundation.nova.common.di.CommonApi
import io.novafoundation.nova.common.di.scope.FeatureScope
import io.novafoundation.nova.feature_account_api.di.AccountFeatureApi
import io.novafoundation.nova.feature_versions_api.di.VersionsFeatureApi
import io.novafoundation.nova.splash.SplashRouter
import io.novafoundation.nova.splash.presentation.di.SplashComponent
@Component(
dependencies = [
SplashFeatureDependencies::class
],
modules = [
SplashFeatureModule::class
]
)
@FeatureScope
interface SplashFeatureComponent : SplashFeatureApi {
fun splashComponentFactory(): SplashComponent.Factory
@Component.Builder
interface Builder {
@BindsInstance
fun router(splashRouter: SplashRouter): Builder
fun withDependencies(deps: SplashFeatureDependencies): Builder
fun build(): SplashFeatureComponent
}
@Component(
dependencies = [
CommonApi::class,
AccountFeatureApi::class,
VersionsFeatureApi::class
]
)
interface SplashFeatureDependenciesComponent : SplashFeatureDependencies
}
@@ -0,0 +1,14 @@
package io.novafoundation.nova.splash.di
import io.novafoundation.nova.common.utils.splash.SplashPassedObserver
import io.novafoundation.nova.feature_account_api.domain.interfaces.AccountRepository
import io.novafoundation.nova.feature_versions_api.domain.UpdateNotificationsInteractor
interface SplashFeatureDependencies {
val splashPassedObserver: SplashPassedObserver
fun accountRepository(): AccountRepository
fun updateNotificationsInteractor(): UpdateNotificationsInteractor
}
@@ -0,0 +1,28 @@
package io.novafoundation.nova.splash.di
import io.novafoundation.nova.common.di.FeatureApiHolder
import io.novafoundation.nova.common.di.FeatureContainer
import io.novafoundation.nova.common.di.scope.ApplicationScope
import io.novafoundation.nova.feature_account_api.di.AccountFeatureApi
import io.novafoundation.nova.feature_versions_api.di.VersionsFeatureApi
import io.novafoundation.nova.splash.SplashRouter
import javax.inject.Inject
@ApplicationScope
class SplashFeatureHolder @Inject constructor(
featureContainer: FeatureContainer,
private val splashRouter: SplashRouter
) : FeatureApiHolder(featureContainer) {
override fun initializeDependencies(): Any {
val splashFeatureDependencies = DaggerSplashFeatureComponent_SplashFeatureDependenciesComponent.builder()
.commonApi(commonApi())
.versionsFeatureApi(getFeature(VersionsFeatureApi::class.java))
.accountFeatureApi(getFeature(AccountFeatureApi::class.java))
.build()
return DaggerSplashFeatureComponent.builder()
.withDependencies(splashFeatureDependencies)
.router(splashRouter)
.build()
}
}
@@ -0,0 +1,6 @@
package io.novafoundation.nova.splash.di
import dagger.Module
@Module
class SplashFeatureModule
@@ -0,0 +1,5 @@
package io.novafoundation.nova.splash.presentation
interface SplashBackgroundHolder {
fun removeSplashBackground()
}
@@ -0,0 +1,38 @@
package io.novafoundation.nova.splash.presentation
import io.novafoundation.nova.common.base.BaseFragment
import io.novafoundation.nova.common.di.FeatureUtils
import io.novafoundation.nova.splash.databinding.FragmentSplashBinding
import io.novafoundation.nova.splash.di.SplashFeatureApi
import io.novafoundation.nova.splash.di.SplashFeatureComponent
import javax.inject.Inject
class SplashFragment : BaseFragment<SplashViewModel, FragmentSplashBinding>() {
override fun createBinding() = FragmentSplashBinding.inflate(layoutInflater)
@Inject lateinit var splashViewModel: SplashViewModel
override fun initViews() {
}
override fun inject() {
FeatureUtils.getFeature<SplashFeatureComponent>(this, SplashFeatureApi::class.java)
.splashComponentFactory()
.create(this)
.inject(this)
}
override fun onResume() {
super.onResume()
viewModel.openInitialDestination()
}
override fun onDestroy() {
super.onDestroy()
(activity as? SplashBackgroundHolder)?.removeSplashBackground()
}
override fun subscribe(viewModel: SplashViewModel) {}
}
@@ -0,0 +1,39 @@
package io.novafoundation.nova.splash.presentation
import androidx.lifecycle.viewModelScope
import io.novafoundation.nova.common.base.BaseViewModel
import io.novafoundation.nova.common.utils.splash.SplashPassedObserver
import io.novafoundation.nova.feature_account_api.domain.interfaces.AccountRepository
import io.novafoundation.nova.splash.SplashRouter
import kotlinx.coroutines.launch
class SplashViewModel(
private val router: SplashRouter,
private val repository: AccountRepository,
private val splashPassedObserver: SplashPassedObserver
) : BaseViewModel() {
fun openInitialDestination() {
viewModelScope.launch {
if (repository.isAccountSelected()) {
openPinCode()
} else {
openWelcomeScreen()
}
splashPassedObserver.setSplashPassed()
}
}
private suspend fun openPinCode() {
if (repository.isCodeSet()) {
router.openInitialCheckPincode()
} else {
router.openCreatePincode()
}
}
private fun openWelcomeScreen() {
router.openWelcomeScreen()
}
}
@@ -0,0 +1,26 @@
package io.novafoundation.nova.splash.presentation.di
import androidx.fragment.app.Fragment
import dagger.BindsInstance
import dagger.Subcomponent
import io.novafoundation.nova.common.di.scope.ScreenScope
import io.novafoundation.nova.splash.presentation.SplashFragment
@Subcomponent(
modules = [
SplashModule::class
]
)
@ScreenScope
interface SplashComponent {
@Subcomponent.Factory
interface Factory {
fun create(
@BindsInstance fragment: Fragment
): SplashComponent
}
fun inject(fragment: SplashFragment)
}
@@ -0,0 +1,34 @@
package io.novafoundation.nova.splash.presentation.di
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import dagger.Module
import dagger.Provides
import dagger.multibindings.IntoMap
import io.novafoundation.nova.common.di.viewmodel.ViewModelKey
import io.novafoundation.nova.common.di.viewmodel.ViewModelModule
import io.novafoundation.nova.common.utils.splash.SplashPassedObserver
import io.novafoundation.nova.feature_account_api.domain.interfaces.AccountRepository
import io.novafoundation.nova.splash.SplashRouter
import io.novafoundation.nova.splash.presentation.SplashViewModel
@Module(includes = [ViewModelModule::class])
class SplashModule {
@Provides
internal fun provideScannerViewModel(fragment: Fragment, factory: ViewModelProvider.Factory): SplashViewModel {
return ViewModelProvider(fragment, factory).get(SplashViewModel::class.java)
}
@Provides
@IntoMap
@ViewModelKey(SplashViewModel::class)
fun provideSignInViewModel(
accountRepository: AccountRepository,
router: SplashRouter,
splashPassedObserver: SplashPassedObserver
): ViewModel {
return SplashViewModel(router, accountRepository, splashPassedObserver)
}
}