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,70 @@
<?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:gravity="center_horizontal"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingEnd="16dp">
<View
style="@style/Widget.Nova.Puller"
android:layout_marginTop="6dp" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/actionNotAllowedImage"
android:layout_width="88dp"
android:layout_height="88dp"
android:layout_marginTop="20dp"
app:srcCompat="@drawable/ic_bell" />
<TextView
android:id="@+id/actionNotAllowedTitle"
style="@style/TextAppearance.NovaFoundation.SemiBold.Title3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:gravity="center"
android:text="@string/mutisigs_push_notifications_warning_title"
android:textColor="@color/text_primary" />
<TextView
android:id="@+id/actionNotAllowedSubtitle"
style="@style/TextAppearance.NovaFoundation.Regular.Footnote"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="center"
android:text="@string/mutisigs_push_notifications_warning_message"
android:textColor="@color/text_secondary" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:clipToPadding="false"
android:orientation="horizontal"
android:paddingVertical="16dp">
<io.novafoundation.nova.common.view.PrimaryButtonV2
android:id="@+id/enableMultisigPushesNotNow"
style="@style/Widget.Nova.MaterialButton.Secondary"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginEnd="6dp"
android:layout_weight="1"
android:text="@string/common_not_now" />
<io.novafoundation.nova.common.view.PrimaryButtonV2
android:id="@+id/enableMultisigPushesEnable"
style="@style/Widget.Nova.MaterialButton.Primary"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="6dp"
android:layout_weight="1"
android:text="@string/common_enable" />
</LinearLayout>
</LinearLayout>
@@ -0,0 +1,39 @@
<?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/pushGovernanceToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:dividerVisible="false"
app:layout_constraintTop_toTopOf="parent"
app:textRight="@string/common_clear"
app:titleText="@string/common_governance" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/pushGovernanceList"
android:layout_width="match_parent"
android:layout_height="0dp"
android:clipToPadding="false"
android:paddingHorizontal="16dp"
android:paddingTop="16dp"
android:paddingBottom="24dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/pushGovernanceToolbar" />
<ProgressBar
android:id="@+id/pushGovernanceProgress"
style="@style/Widget.Nova.ProgressBar.Indeterminate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/pushGovernanceToolbar" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -0,0 +1,61 @@
<?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="match_parent"
android:orientation="vertical">
<io.novafoundation.nova.common.view.Toolbar
android:id="@+id/pushMultisigsToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:dividerVisible="false"
app:layout_constraintTop_toTopOf="parent"
app:titleText="@string/push_settings_multisig_operations" />
<io.novafoundation.nova.common.view.settings.SettingsGroupView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp">
<io.novafoundation.nova.common.view.settings.SettingsSwitcherView
android:id="@+id/pushMultisigSettingsSwitcher"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/push_settings_enable" />
</io.novafoundation.nova.common.view.settings.SettingsGroupView>
<io.novafoundation.nova.common.view.settings.SettingsGroupView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="24dp">
<io.novafoundation.nova.common.view.settings.SettingsSwitcherView
android:id="@+id/pushMultisigInitiatingSwitcher"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/multisig_push_settings_initial_switcher" />
<io.novafoundation.nova.common.view.settings.SettingsSwitcherView
android:id="@+id/pushMultisigApprovalSwitcher"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/multisig_push_settings_approval_switcher" />
<io.novafoundation.nova.common.view.settings.SettingsSwitcherView
android:id="@+id/pushMultisigExecutedSwitcher"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/multisig_push_settings_executed_switcher" />
<io.novafoundation.nova.common.view.settings.SettingsSwitcherView
android:id="@+id/pushMultisigRejectedSwitcher"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/multisig_push_settings_rejected_switcher" />
</io.novafoundation.nova.common.view.settings.SettingsGroupView>
</LinearLayout>
@@ -0,0 +1,153 @@
<?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/pushSettingsToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:dividerVisible="false"
app:layout_constraintTop_toTopOf="parent"
app:textRight="@string/common_save"
app:titleText="@string/common_push_notifications" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:clipToPadding="false"
android:paddingHorizontal="16dp"
android:paddingTop="16dp"
android:paddingBottom="24dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/pushSettingsToolbar">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="300dp"
android:orientation="vertical">
<io.novafoundation.nova.common.view.settings.SettingsGroupView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<io.novafoundation.nova.common.view.settings.SettingsSwitcherView
android:id="@+id/pushSettingsEnable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:icon="@drawable/ic_notifications_outline"
app:title="@string/push_settings_enable" />
<io.novafoundation.nova.common.view.settings.SettingsItemView
android:id="@+id/pushSettingsWallets"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:icon="@drawable/ic_wallet_outline"
app:title="@string/push_settings_wallets"
tools:settingValue="0" />
</io.novafoundation.nova.common.view.settings.SettingsGroupView>
<TextView
android:id="@+id/pushSettingsNoSelectedWallets"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/push_settings_no_selected_wallets"
android:textColor="@color/text_secondary"
android:textSize="12sp" />
<io.novafoundation.nova.common.view.settings.SettingsGroupHeaderView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/settings_general" />
<io.novafoundation.nova.common.view.settings.SettingsGroupView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<io.novafoundation.nova.common.view.settings.SettingsSwitcherView
android:id="@+id/pushSettingsAnnouncements"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/push_settings_announcements" />
</io.novafoundation.nova.common.view.settings.SettingsGroupView>
<io.novafoundation.nova.common.view.settings.SettingsGroupHeaderView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/push_settings_balances" />
<io.novafoundation.nova.common.view.settings.SettingsGroupView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<io.novafoundation.nova.common.view.settings.SettingsSwitcherView
android:id="@+id/pushSettingsSentTokens"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/push_settings_sent_tokens" />
<io.novafoundation.nova.common.view.settings.SettingsSwitcherView
android:id="@+id/pushSettingsReceivedTokens"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/push_settings_received_tokens" />
</io.novafoundation.nova.common.view.settings.SettingsGroupView>
<io.novafoundation.nova.common.view.settings.SettingsGroupHeaderView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/push_settings_others" />
<io.novafoundation.nova.common.view.settings.SettingsGroupView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<io.novafoundation.nova.common.view.settings.SettingsItemView
android:id="@+id/pushSettingsMultisigs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/push_settings_multisig_operations"
tools:settingValue="On" />
<io.novafoundation.nova.common.view.settings.SettingsItemView
android:id="@+id/pushSettingsGovernance"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/common_governance"
tools:settingValue="On" />
<io.novafoundation.nova.common.view.settings.SettingsItemView
android:id="@+id/pushSettingsStakingRewards"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/push_settings_staking_rewards"
tools:settingValue="On" />
</io.novafoundation.nova.common.view.settings.SettingsGroupView>
<TextView
style="@style/TextAppearance.NovaFoundation.Regular.Footnote"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="64dp"
android:layout_marginBottom="8dp"
android:text="Powered by"
android:textColor="@color/text_secondary" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:src="@drawable/ic_web3_alert_icon" />
</LinearLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -0,0 +1,39 @@
<?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/pushStakingToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:dividerVisible="false"
app:layout_constraintTop_toTopOf="parent"
app:textRight="@string/common_clear"
app:titleText="@string/push_settings_staking_rewards" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/pushStakingList"
android:layout_width="match_parent"
android:layout_height="0dp"
android:clipToPadding="false"
android:paddingHorizontal="16dp"
android:paddingTop="16dp"
android:paddingBottom="24dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/pushStakingToolbar" />
<ProgressBar
android:id="@+id/pushStakingProgress"
style="@style/Widget.Nova.ProgressBar.Indeterminate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/pushStakingToolbar" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -0,0 +1,180 @@
<?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/pushWelcomeToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:dividerVisible="false"
app:homeButtonIcon="@drawable/ic_close"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/pushWelcomeImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:src="@drawable/ic_bell"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/pushWelcomeToolbar" />
<TextView
android:id="@+id/pushWelcomeTitle"
style="@style/TextAppearance.NovaFoundation.Bold.Title2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:gravity="center"
android:paddingHorizontal="16dp"
android:text="@string/push_welcome_title"
android:textColor="@color/text_primary"
app:layout_constraintTop_toBottomOf="@id/pushWelcomeImage" />
<TextView
android:id="@+id/pushWelcomeMessage"
style="@style/TextAppearance.NovaFoundation.Regular.Footnote"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="center"
android:paddingHorizontal="16dp"
android:text="@string/push_welcome_message"
android:textColor="@color/text_secondary"
app:layout_constraintTop_toBottomOf="@id/pushWelcomeTitle" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
app:layout_constraintTop_toBottomOf="@id/pushWelcomeMessage">
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="32dp"
android:layout_marginHorizontal="48dp"
app:cardBackgroundColor="@color/notification_preview_3_layer_background"
app:cardCornerRadius="18dp"
app:cardElevation="0dp"
app:layout_constraintBottom_toBottomOf="parent" />
<com.google.android.material.card.MaterialCardView
android:layout_width="match_parent"
android:layout_height="32dp"
android:layout_marginHorizontal="32dp"
android:layout_marginBottom="16dp"
app:cardBackgroundColor="@color/notification_preview_2_layer_background"
app:cardCornerRadius="18dp"
app:cardElevation="8dp"
app:layout_constraintBottom_toBottomOf="parent" />
<com.google.android.material.card.MaterialCardView
android:id="@+id/pushWelcomeTemplate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="32dp"
app:cardBackgroundColor="@color/notification_preview_1_layer_background"
app:cardCornerRadius="18dp"
app:cardElevation="16dp"
app:layout_constraintBottom_toBottomOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/pushWelcomeLogo"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginStart="14dp"
android:layout_marginTop="12dp"
android:src="@drawable/ic_pezkuwi_logo"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
style="@style/TextAppearance.NovaFoundation.Regular.Caption2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:includeFontPadding="false"
android:text="@string/push_template_app_name_and_time"
android:textColor="@color/chip_text"
app:layout_constraintBottom_toBottomOf="@id/pushWelcomeLogo"
app:layout_constraintStart_toEndOf="@id/pushWelcomeLogo"
app:layout_constraintTop_toTopOf="@id/pushWelcomeLogo" />
<TextView
android:id="@+id/pushWelcomeTemplateTitle"
style="@style/TextAppearance.NovaFoundation.Regular.Footnote"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:layout_marginTop="8dp"
android:text="@string/push_staking_reward_single_account_title"
android:textColor="@color/text_primary"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/pushWelcomeLogo" />
<TextView
android:id="@+id/pushWelcomeTemplateMessage"
style="@style/TextAppearance.NovaFoundation.Regular.Caption1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="14dp"
android:layout_marginTop="2dp"
android:layout_marginBottom="12dp"
android:text="@string/push_template_message"
android:textColor="@color/chip_text"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/pushWelcomeTemplateTitle" />
</androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.card.MaterialCardView>
</androidx.constraintlayout.widget.ConstraintLayout>
<io.novafoundation.nova.common.view.PrimaryButton
android:id="@+id/pushWelcomeEnableButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="16dp"
android:text="@string/push_welcome_enable_button"
app:appearance="primary"
app:layout_constraintBottom_toTopOf="@id/pushWelcomeCancelButton" />
<io.novafoundation.nova.common.view.PrimaryButton
android:id="@+id/pushWelcomeCancelButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="16dp"
android:text="@string/common_not_now"
app:appearance="secondary"
app:layout_constraintBottom_toTopOf="@id/pushWelcomeTermsAndConditions" />
<TextView
android:id="@+id/pushWelcomeTermsAndConditions"
style="@style/TextAppearance.NovaFoundation.Body1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/x2"
android:layout_marginEnd="@dimen/x2"
android:layout_marginBottom="24dp"
android:gravity="center"
android:text="@string/push_welcome_terms_and_conditions"
android:textColor="@color/text_secondary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<io.novafoundation.nova.common.view.settings.SettingsGroupView 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:layout_marginBottom="8dp">
<io.novafoundation.nova.common.view.settings.SettingsSwitcherView
android:id="@+id/pushGovernanceItemState"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:icon="@drawable/ic_pezkuwi"
tools:title="Polkdaot" />
<io.novafoundation.nova.common.view.settings.SettingsSwitcherView
android:id="@+id/pushGovernanceItemNewReferenda"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/push_governance_settings_new_referendum" />
<io.novafoundation.nova.common.view.settings.SettingsSwitcherView
android:id="@+id/pushGovernanceItemReferendumUpdate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/push_governance_settings_referendum_update" />
<io.novafoundation.nova.common.view.settings.SettingsItemView
android:id="@+id/pushGovernanceItemTracks"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/delegation_tracks" />
</io.novafoundation.nova.common.view.settings.SettingsGroupView>
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<io.novafoundation.nova.common.view.settings.SettingsGroupView 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:layout_marginBottom="8dp">
<io.novafoundation.nova.common.view.settings.SettingsSwitcherView
android:id="@+id/pushStakingItem"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:icon="@drawable/ic_pezkuwi"
tools:title="Polkdaot" />
</io.novafoundation.nova.common.view.settings.SettingsGroupView>