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,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)
}
}