Initial commit: Pezkuwi Wallet Android

Security hardened release:
- Code obfuscation enabled (minifyEnabled=true, shrinkResources=true)
- Sensitive files excluded (google-services.json, keystores)
- Branch.io key moved to BuildConfig placeholder
- Updated dependencies: OkHttp 4.12.0, Gson 2.10.1, BouncyCastle 1.77
- Comprehensive ProGuard rules for crypto wallet
- Navigation 2.7.7, Lifecycle 2.7.0, ConstraintLayout 2.1.4
This commit is contained in:
2026-02-12 05:19:41 +03:00
commit a294aa1a6b
7687 changed files with 441811 additions and 0 deletions
@@ -0,0 +1,111 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<io.novafoundation.nova.common.view.Toolbar
android:id="@+id/claimGiftToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:dividerVisible="false"
app:homeButtonIcon="@drawable/ic_close"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/claimGiftTitle"
style="@style/TextAppearance.NovaFoundation.Bold.Title1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:gravity="center"
android:paddingHorizontal="16dp"
android:text="@string/claim_gift_title"
android:textColor="@color/text_primary"
app:layout_constraintTop_toBottomOf="@+id/claimGiftToolbar" />
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/claimGiftAnimation"
android:layout_width="280dp"
android:layout_height="280dp"
app:layout_constraintBottom_toTopOf="@+id/claimGiftAmount"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/claimGiftTitle"
app:layout_constraintVertical_bias="0.31"
app:layout_constraintVertical_chainStyle="packed"
tools:lottie_rawRes="@raw/dot_unpacking" />
<ImageView
android:id="@+id/claimGiftTokenIcon"
android:layout_width="44dp"
android:layout_height="44dp"
app:layout_constraintBottom_toBottomOf="@+id/claimGiftAmount"
app:layout_constraintEnd_toStartOf="@+id/claimGiftAmount"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="@+id/claimGiftAnimation"
app:layout_constraintTop_toTopOf="@+id/claimGiftAmount" />
<TextView
android:id="@+id/claimGiftAmount"
style="@style/TextAppearance.NovaFoundation.Bold.LargeTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:gravity="center"
android:textColor="@color/text_primary"
app:layout_constraintBottom_toTopOf="@+id/claimGiftAccount"
app:layout_constraintEnd_toEndOf="@+id/claimGiftAnimation"
app:layout_constraintStart_toEndOf="@+id/claimGiftTokenIcon"
app:layout_constraintTop_toBottomOf="@+id/claimGiftAnimation"
tools:text="2 DOT" />
<TextView
android:id="@+id/claimGiftAccountTitle"
style="@style/TextAppearance.NovaFoundation.Regular.Footnote"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="center"
android:textColor="@color/text_secondary"
app:layout_constraintBottom_toTopOf="@+id/claimGiftAccount"
app:layout_constraintStart_toStartOf="@+id/claimGiftAccount"
tools:text="Your wallet to receive the gift" />
<io.novafoundation.nova.feature_account_api.view.AccountView
android:id="@+id/claimGiftAccount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="12dp"
app:layout_constraintBottom_toTopOf="@+id/claimGiftAlert"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_goneMarginBottom="24dp" />
<io.novafoundation.nova.common.view.AlertView
android:id="@+id/claimGiftAlert"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="24dp"
android:visibility="gone"
app:layout_constraintBottom_toTopOf="@+id/claimGiftButton" />
<io.novafoundation.nova.common.view.PrimaryButtonV2
android:id="@+id/claimGiftButton"
style="@style/Widget.Nova.MaterialButton.Primary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="16dp"
android:text="@string/claim_gift_button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<io.novafoundation.nova.common.view.Toolbar
android:id="@+id/confirmCreateGiftToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:dividerVisible="false"
app:titleText="@string/common_gift" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingEnd="16dp">
<io.novafoundation.nova.feature_wallet_api.presentation.view.amount.PrimaryAmountView
android:id="@+id/confirmCreateGiftTotalAmount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp" />
<io.novafoundation.nova.common.view.TableView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp">
<io.novafoundation.nova.common.view.TableCellView
android:id="@+id/confirmCreateGiftNetwork"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/common_network" />
<io.novafoundation.nova.common.view.TableCellView
android:id="@+id/confirmCreateGiftWallet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/tabbar_wallet_title" />
<io.novafoundation.nova.common.view.TableCellView
android:id="@+id/confirmCreateGiftAccount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:primaryValueEndIcon="@drawable/ic_info"
app:title="@string/common_account" />
<io.novafoundation.nova.common.view.TableCellView
android:id="@+id/confirmCreateGiftAmount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/common_your_gift" />
<io.novafoundation.nova.feature_wallet_api.presentation.view.FeeView
android:id="@+id/confirmCreateGiftNetworkFee"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<io.novafoundation.nova.feature_wallet_api.presentation.view.FeeView
android:id="@+id/confirmCreateGiftClaimFee"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/gifts_claim_fee"/>
</io.novafoundation.nova.common.view.TableView>
</LinearLayout>
<Space
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<TextView
style="@style/TextAppearance.NovaFoundation.Regular.Footnote"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="16dp"
android:textColor="@color/text_secondary"
android:gravity="center"
android:text="@string/confirm_create_gift_hint" />
<io.novafoundation.nova.common.view.PrimaryButtonV2
android:id="@+id/confirmCreateGiftButton"
style="@style/Widget.Nova.MaterialButton.Primary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:text="@string/common_confirm" />
</LinearLayout>
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<io.novafoundation.nova.common.view.Toolbar
android:id="@+id/giftsToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:dividerVisible="false"
app:homeButtonIcon="@drawable/ic_close"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/giftsList"
android:layout_width="match_parent"
android:layout_height="0dp"
android:clipToPadding="false"
android:paddingBottom="80dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/giftsToolbar" />
<io.novafoundation.nova.common.view.PrimaryButtonV2
android:id="@+id/giftsCreate"
style="@style/Widget.Nova.MaterialButton.Primary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="16dp"
android:text="@string/gifts_create"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -0,0 +1,87 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<io.novafoundation.nova.common.view.Toolbar
android:id="@+id/giftAmountToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:dividerVisible="false"
app:layout_constraintTop_toTopOf="parent" />
<com.google.android.flexbox.FlexboxLayout
android:id="@+id/giftAmountTitleContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
app:flexDirection="row"
app:flexWrap="wrap"
app:layout_constraintTop_toBottomOf="@+id/giftAmountToolbar">
<TextView
android:id="@+id/giftAmountTitle"
style="@style/TextAppearance.NovaFoundation.Bold.Title2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="10dp"
android:layout_marginBottom="8dp"
android:includeFontPadding="false"
android:text="@string/select_gift_amount_title"
android:textColor="@color/text_primary" />
<io.novafoundation.nova.feature_account_api.view.ChainChipView
android:id="@+id/giftAmountChain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp" />
</com.google.android.flexbox.FlexboxLayout>
<io.novafoundation.nova.feature_wallet_api.presentation.view.amount.ChooseAmountView
android:id="@+id/giftsAmount"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
app:layout_constraintTop_toBottomOf="@+id/giftAmountTitleContainer" />
<io.novafoundation.nova.common.view.PrimaryButton
android:id="@+id/giftAmountGetTokens"
style="@style/Widget.Nova.Button.AccentSecondaryTransparent.Small"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="12dp"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@+id/giftsAmount"
tools:text="Get DOT"
tools:visibility="visible" />
<io.novafoundation.nova.feature_wallet_api.presentation.view.FeeView
android:id="@+id/giftAmountFee"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
app:dividerVisible="false"
app:title="@string/common_total_fee"
app:layout_constraintTop_toBottomOf="@+id/giftAmountGetTokens" />
<io.novafoundation.nova.common.view.PrimaryButtonV2
android:id="@+id/giftAmountContinue"
style="@style/Widget.Nova.MaterialButton.Primary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:text="@string/common_continue" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -0,0 +1,91 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<io.novafoundation.nova.common.view.Toolbar
android:id="@+id/shareGiftToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="0"
app:dividerVisible="false"
app:homeButtonIcon="@drawable/ic_close"
app:layout_constraintTop_toTopOf="parent"
app:textRight="@string/share_gift_reclaim"
app:textRightVisible="false"
tools:alpha="1" />
<TextView
android:id="@+id/shareGiftTitle"
style="@style/TextAppearance.NovaFoundation.Bold.Title1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:alpha="0"
android:gravity="center"
android:paddingHorizontal="16dp"
android:text="@string/share_gift_title"
app:layout_constraintTop_toBottomOf="@+id/shareGiftToolbar"
tools:alpha="1" />
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/shareGiftAnimation"
android:layout_width="280dp"
android:layout_height="280dp"
app:layout_constraintBottom_toTopOf="@+id/shareGiftAmount"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/shareGiftTitle"
app:layout_constraintVertical_bias="0.31"
app:layout_constraintVertical_chainStyle="packed"
tools:lottie_rawRes="@raw/DOT_packing_optimized" />
<ImageView
android:id="@+id/shareGiftTokenIcon"
android:layout_width="44dp"
android:layout_height="44dp"
android:alpha="0"
app:layout_constraintBottom_toBottomOf="@+id/shareGiftAmount"
app:layout_constraintEnd_toStartOf="@+id/shareGiftAmount"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="@+id/shareGiftAnimation"
app:layout_constraintTop_toTopOf="@+id/shareGiftAmount" />
<TextView
android:id="@+id/shareGiftAmount"
style="@style/TextAppearance.NovaFoundation.Bold.LargeTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:alpha="0"
android:gravity="center"
app:layout_constraintBottom_toTopOf="@+id/shareGiftButton"
app:layout_constraintEnd_toEndOf="@+id/shareGiftAnimation"
app:layout_constraintStart_toEndOf="@+id/shareGiftTokenIcon"
app:layout_constraintTop_toBottomOf="@+id/shareGiftAnimation"
tools:alpha="1"
tools:text="2 DOT" />
<io.novafoundation.nova.common.view.PrimaryButtonV2
android:id="@+id/shareGiftButton"
style="@style/Widget.Nova.MaterialButton.Primary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="16dp"
android:alpha="0"
android:text="@string/share_gift_button"
app:icon="@drawable/ic_share_outline"
app:iconGravity="textStart"
app:iconTint="@color/icon_primary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
tools:alpha="1" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="4dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/giftAssetIcon"
style="@style/Widget.Nova.AssetIcon.Primary"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginVertical="12dp"
android:layout_marginStart="12dp"
android:background="@drawable/bg_token_container"
android:src="@drawable/ic_star_filled"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:padding="5dp" />
<TextView
android:id="@+id/giftAmount"
style="@style/TextAppearance.NovaFoundation.SemiBold.Body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:includeFontPadding="false"
android:textColor="@color/text_primary"
app:layout_constraintBottom_toTopOf="@id/giftCreationDate"
app:layout_constraintStart_toEndOf="@+id/giftAssetIcon"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
tools:text="2 DOT" />
<ImageView
android:id="@+id/giftAmountChevron"
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_marginStart="2dp"
android:src="@drawable/ic_chevron_right"
app:layout_constraintBottom_toBottomOf="@+id/giftAmount"
app:layout_constraintStart_toEndOf="@+id/giftAmount"
app:layout_constraintTop_toTopOf="@+id/giftAmount" />
<TextView
android:id="@+id/giftCreationDate"
style="@style/TextAppearance.NovaFoundation.Regular.Footnote"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:includeFontPadding="false"
android:textColor="@color/text_secondary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/giftAssetIcon"
app:layout_constraintTop_toBottomOf="@+id/giftAmount"
tools:text="Created: 02.10.2025" />
<ImageView
android:id="@+id/giftImage"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_marginStart="2dp"
android:layout_marginEnd="12dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@drawable/ic_gift_packed" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:orientation="vertical">
<TextView
style="@style/TextAppearance.NovaFoundation.Bold.Title1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/gifts_header_title" />
<TextView
style="@style/TextAppearance.NovaFoundation.Regular.SubHeadline"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/gifts_header_subtitle"
android:textColor="@color/text_secondary" />
<io.novafoundation.nova.common.view.LinkView
android:id="@+id/giftsHeaderLearnMore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:minHeight="32dp"
android:paddingVertical="8dp"
app:linkText="@string/common_learn_more" />
</LinearLayout>
@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<io.novafoundation.nova.common.view.InstructionStepView
android:id="@+id/giftsInstructionStep1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
app:stepNumber="1" />
<io.novafoundation.nova.common.view.InstructionStepView
android:id="@+id/giftsInstructionStep2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="24dp"
app:stepNumber="2" />
<io.novafoundation.nova.common.view.InstructionStepView
android:id="@+id/giftsInstructionStep3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="24dp"
app:stepNumber="3" />
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:src="@drawable/ic_gifts_placeholder" />
</LinearLayout>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:orientation="vertical">
<TextView
style="@style/TextAppearance.NovaFoundation.SemiBold.Title3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:layout_marginBottom="4dp"
android:text="@string/gifts_list_title" />
</LinearLayout>