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
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

@@ -0,0 +1,207 @@
<?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"
tools:background="@color/secondary_screen_background">
<io.novafoundation.nova.common.view.Toolbar
android:id="@+id/swapMainSettingsToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:dividerVisible="false"
app:iconRight="@drawable/ic_options"
app:layout_constraintTop_toTopOf="parent"
app:titleText="@string/wallet_asset_swap" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:clipToPadding="false"
android:paddingBottom="16dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:background="@color/secondary_screen_background">
<TextView
android:id="@+id/swapMainSettingsPayTitle"
style="@style/TextAppearance.NovaFoundation.Regular.Footnote"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
android:text="@string/fragment_swap_main_settings_pay_title"
android:textColor="@color/text_secondary"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<io.novafoundation.nova.feature_wallet_api.presentation.view.amount.MaxAmountView
android:id="@+id/swapMainSettingsMaxAmount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<io.novafoundation.nova.feature_swap_impl.presentation.common.views.SwapAmountInputView
android:id="@+id/swapMainSettingsPayInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp"
app:layout_constraintTop_toBottomOf="@id/swapMainSettingsPayTitle" />
<io.novafoundation.nova.common.view.PrimaryButton
android:id="@+id/swapMainSettingsGetAssetIn"
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:layout_marginBottom="24dp"
app:layout_constraintTop_toBottomOf="@+id/swapMainSettingsPayInput"
tools:text="Get KSM" />
<ImageView
android:id="@+id/swapMainSettingsFlip"
android:layout_width="40dp"
android:layout_height="40dp"
android:scaleType="centerInside"
android:src="@drawable/ic_flip_swap"
app:layout_constraintBottom_toTopOf="@+id/swapMainSettingsReceiveInput"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/swapMainSettingsGetAssetIn" />
<TextView
android:id="@+id/swapMainSettingsReceiveTitle"
style="@style/TextAppearance.NovaFoundation.Regular.Footnote"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="24dp"
android:text="@string/fragment_swap_main_settings_receive_title"
android:textColor="@color/text_secondary"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/swapMainSettingsGetAssetIn" />
<io.novafoundation.nova.feature_swap_impl.presentation.common.views.SwapAmountInputView
android:id="@+id/swapMainSettingsReceiveInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp"
app:layout_constraintTop_toBottomOf="@id/swapMainSettingsReceiveTitle" />
<io.novafoundation.nova.common.view.AlertView
android:id="@+id/swapMainSettingsAlert"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
android:text="@string/swap_error_pair_not_supported"
android:visibility="gone"
app:alertMode="error"
app:layout_constraintTop_toBottomOf="@+id/swapMainSettingsReceiveInput"
app:styleIcon="@drawable/ic_close_circle"
app:styleIconTint="@color/icon_negative" />
<io.novafoundation.nova.common.view.ExpandableView
android:id="@+id/swapMainSettingsDetails"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:chevronId="@+id/swapMainSettingsDetailsChevron"
app:expandableId="@+id/swapMainSettingsDetailsContainer"
app:layout_constraintTop_toBottomOf="@+id/swapMainSettingsAlert">
<TextView
style="@style/TextAppearance.NovaFoundation.Regular.Footnote"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginStart="16dp"
android:text="@string/fragment_swap_main_settings_details_title"
android:textColor="@color/text_secondary"
app:layout_constraintBottom_toBottomOf="@+id/swapMainSettingsDetailsChevron"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/swapMainSettingsDetailsChevron" />
<ImageView
android:id="@+id/swapMainSettingsDetailsChevron"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="16dp"
android:scaleType="centerInside"
android:src="@drawable/ic_chevron_up"
app:layout_constraintBottom_toTopOf="@+id/swapMainSettingsReceiveInput"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/swapMainSettingsPayInput"
app:tint="@color/icon_secondary" />
<FrameLayout
android:id="@+id/swapMainSettingsDetailsContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:paddingTop="8dp"
app:layout_constraintTop_toBottomOf="@+id/swapMainSettingsDetailsChevron">
<io.novafoundation.nova.common.view.TableView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<io.novafoundation.nova.common.view.TableCellView
android:id="@+id/swapMainSettingsDetailsRate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/swap_rate_title"
app:titleIcon="@drawable/ic_info" />
<io.novafoundation.nova.feature_swap_impl.presentation.common.route.SwapRouteTableCellView
android:id="@+id/swapMainSettingsRoute"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:titleIcon="@drawable/ic_info" />
<io.novafoundation.nova.common.view.TableCellView
android:id="@+id/swapMainSettingsExecutionTime"
app:title="@string/swap_execution_time"
android:clickable="true"
android:focusable="true"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<io.novafoundation.nova.feature_wallet_api.presentation.view.FeeView
android:id="@+id/swapMainSettingsDetailsNetworkFee"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/common_total_fee"
app:titleIcon="@drawable/ic_info" />
</io.novafoundation.nova.common.view.TableView>
</FrameLayout>
</io.novafoundation.nova.common.view.ExpandableView>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
<io.novafoundation.nova.common.view.PrimaryButton
android:id="@+id/swapMainSettingsContinue"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="16dp"
android:enabled="false"
tools:text="Enter amount" />
</LinearLayout>
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/swapRouteContent"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
tools:listitem="@layout/item_route_swap" />
<ProgressBar
android:id="@+id/swapRouteProgress"
style="@style/Widget.Nova.ProgressBar.Indeterminate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</FrameLayout>
@@ -0,0 +1,125 @@
<?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"
tools:background="@color/secondary_screen_background"
android:orientation="vertical">
<io.novafoundation.nova.common.view.Toolbar
android:id="@+id/swapConfirmationToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:dividerVisible="false"
app:layout_constraintTop_toTopOf="parent"
app:titleText="@string/wallet_asset_swap" />
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:orientation="vertical"
app:layout_constraintTop_toBottomOf="@+id/swapConfirmationToolbar">
<io.novafoundation.nova.feature_swap_api.presentation.view.SwapAssetsView
android:id="@+id/swapConfirmationAssets"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp" />
<io.novafoundation.nova.common.view.TableView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp">
<io.novafoundation.nova.common.view.TableCellView
android:id="@+id/swapConfirmationRate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/swap_rate_title"
app:titleIcon="@drawable/ic_info" />
<io.novafoundation.nova.common.view.TableCellView
android:id="@+id/swapConfirmationPriceDifference"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/swap_price_difference_title"
app:titleIcon="@drawable/ic_info" />
<io.novafoundation.nova.common.view.TableCellView
android:id="@+id/swapConfirmationSlippage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/swap_slippage_title"
app:titleIcon="@drawable/ic_info" />
<io.novafoundation.nova.feature_swap_impl.presentation.common.route.SwapRouteTableCellView
android:id="@+id/swapConfirmationRoute"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:titleIcon="@drawable/ic_info" />
<io.novafoundation.nova.common.view.TableCellView
android:clickable="true"
android:focusable="true"
android:id="@+id/swapConfirmationExecutionTime"
app:title="@string/swap_execution_time"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<io.novafoundation.nova.feature_wallet_api.presentation.view.FeeView
android:id="@+id/swapConfirmationNetworkFee"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/common_total_fee"
app:titleIcon="@drawable/ic_info" />
</io.novafoundation.nova.common.view.TableView>
<io.novafoundation.nova.common.view.TableView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp">
<io.novafoundation.nova.common.view.TableCellView
android:id="@+id/swapConfirmationWallet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/common_wallet" />
<io.novafoundation.nova.common.view.TableCellView
android:id="@+id/swapConfirmationAccount"
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.TableView>
</LinearLayout>
<io.novafoundation.nova.common.view.AlertView
android:id="@+id/swapConfirmationAlert"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp"
android:visibility="gone"
app:alertMode="warning"
app:layout_constraintTop_toBottomOf="@+id/linearLayout"
tools:layout_editor_absoluteX="16dp" />
<io.novafoundation.nova.common.view.PrimaryButton
android:id="@+id/swapConfirmationButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="24dp"
android:text="@string/common_confirm"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -0,0 +1,196 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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:id="@+id/swapExecutionContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:background="@color/secondary_screen_background">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingBottom="84dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<io.novafoundation.nova.common.view.Toolbar
android:id="@+id/swapExecutionToolbar"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:dividerVisible="false"
app:homeButtonVisible="false"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<io.novafoundation.nova.feature_swap_impl.presentation.execution.ExecutionTimerView
android:id="@+id/swapExecutionTimer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/swapExecutionToolbar" />
<TextSwitcher
android:id="@+id/swapExecutionTitleSwitcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/swapExecutionTimer"
tools:background="@color/container_background"
tools:minHeight="40dp"
tools:minWidth="200dp" />
<TextSwitcher
android:id="@+id/swapExecutionSubtitleSwitcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="4dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/swapExecutionTitleSwitcher"
tools:background="@color/container_background"
tools:minHeight="20dp"
tools:minWidth="300dp" />
<FrameLayout
android:id="@+id/swapExecutionStepContainer"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="24dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/swapExecutionSubtitleSwitcher"
tools:background="@color/block_background">
<com.facebook.shimmer.ShimmerFrameLayout
android:id="@+id/swapExecutionStepShimmer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center">
<TextView
android:id="@+id/swapExecutionStepLabel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginVertical="14dp"
android:textColor="@color/text_secondary"
tools:text="3 of 3 operations" />
</com.facebook.shimmer.ShimmerFrameLayout>
</FrameLayout>
<io.novafoundation.nova.feature_swap_api.presentation.view.SwapAssetsView
android:id="@+id/swapExecutionAssets"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="24dp"
app:layout_constraintTop_toBottomOf="@id/swapExecutionStepContainer" />
<io.novafoundation.nova.common.view.ExpandableView
android:id="@+id/swapExecutionDetails"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
app:chevronId="@+id/swapExecutionDetailsChevron"
app:expandableId="@+id/swapExecutionDetailsContainer"
app:layout_constraintTop_toBottomOf="@+id/swapExecutionAssets">
<TextView
style="@style/TextAppearance.NovaFoundation.Regular.Footnote"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginStart="16dp"
android:text="@string/fragment_swap_main_settings_details_title"
android:textColor="@color/text_secondary"
app:layout_constraintBottom_toBottomOf="@+id/swapExecutionDetailsChevron"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/swapExecutionDetailsChevron" />
<ImageView
android:id="@+id/swapExecutionDetailsChevron"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="16dp"
android:scaleType="centerInside"
android:src="@drawable/ic_chevron_up"
app:layout_constraintBottom_toTopOf="@+id/swapExecutionReceiveInput"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/swapExecutionPayInput"
app:tint="@color/icon_secondary" />
<FrameLayout
android:id="@+id/swapExecutionDetailsContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:paddingTop="8dp"
app:layout_constraintTop_toBottomOf="@+id/swapExecutionDetailsChevron">
<io.novafoundation.nova.common.view.TableView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<io.novafoundation.nova.common.view.TableCellView
android:id="@+id/swapExecutionRate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/swap_rate_title"
app:titleIcon="@drawable/ic_info" />
<io.novafoundation.nova.common.view.TableCellView
android:id="@+id/swapExecutionPriceDifference"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/swap_price_difference_title"
app:titleIcon="@drawable/ic_info" />
<io.novafoundation.nova.common.view.TableCellView
android:id="@+id/swapExecutionSlippage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/swap_slippage_title"
app:titleIcon="@drawable/ic_info" />
<io.novafoundation.nova.feature_swap_impl.presentation.common.route.SwapRouteTableCellView
android:id="@+id/swapExecutionRoute"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:titleIcon="@drawable/ic_info" />
<io.novafoundation.nova.feature_wallet_api.presentation.view.FeeView
android:id="@+id/swapExecutionNetworkFee"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:title="@string/common_total_fee"
app:titleIcon="@drawable/ic_info" />
</io.novafoundation.nova.common.view.TableView>
</FrameLayout>
</io.novafoundation.nova.common.view.ExpandableView>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
<io.novafoundation.nova.common.view.PrimaryButtonV2
android:id="@+id/swapExecutionActionButton"
style="@style/Widget.Nova.MaterialButton.Primary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="16dp"
android:visibility="gone"
tools:text="Done" />
</FrameLayout>
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/swapFeeContainer"
android:orientation="vertical"
android:paddingHorizontal="16dp">
<View
style="@style/Widget.Nova.Puller"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="8dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingVertical="10dp">
<TextView
style="@style/TextAppearance.NovaFoundation.SemiBold.Body"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:text="@string/common_total_fee" />
<TextView
android:id="@+id/swapFeeTotal"
style="@style/TextAppearance.NovaFoundation.Regular.SubHeadline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="$0.56" />
</LinearLayout>
<LinearLayout
android:id="@+id/swapFeeContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</LinearLayout>
@@ -0,0 +1,61 @@
<?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/swapOptionsToolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:dividerVisible="false"
app:layout_constraintTop_toTopOf="parent"
app:textRight="@string/common_reset"
app:titleText="@string/swap_settings_title" />
<TextView
android:id="@+id/swapOptionsSlippageTitle"
style="@style/TextAppearance.NovaFoundation.SemiBold.Body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
android:drawablePadding="8dp"
android:text="@string/swap_slippage"
android:textColor="@color/text_primary"
app:drawableEndCompat="@drawable/ic_info"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/swapOptionsToolbar"
tools:drawableEnd="@drawable/ic_info" />
<io.novafoundation.nova.common.view.TipsInputField
android:id="@+id/swapOptionsSlippageInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="12dp"
android:inputType="numberDecimal"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/swapOptionsSlippageTitle"
app:postfix="@string/common_percent" />
<io.novafoundation.nova.common.view.AlertView
android:id="@+id/swapOptionsAlert"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="12dp"
app:layout_constraintTop_toBottomOf="@+id/swapOptionsSlippageInput" />
<io.novafoundation.nova.common.view.PrimaryButton
android:id="@+id/swapOptionsApplyButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginBottom="24dp"
android:text="@string/common_apply"
app:layout_constraintBottom_toBottomOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -0,0 +1,33 @@
<?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="wrap_content"
android:orientation="vertical"
android:paddingBottom="12dp"
tools:background="@color/secondary_screen_background">
<io.novafoundation.nova.common.view.Toolbar
android:id="@+id/swapRouteBack"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:dividerVisible="false" />
<TextView
style="@style/TextAppearance.NovaFoundation.Bold.Title1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="16dp"
android:text="@string/swap_route" />
<TextView
style="@style/TextAppearance.NovaFoundation.Regular.SubHeadline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="8dp"
android:text="@string/swap_route_description"
android:textColor="@color/text_secondary" />
</LinearLayout>
@@ -0,0 +1,94 @@
<?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"
tools:background="@color/secondary_screen_background">
<TextView
android:id="@+id/itemRouteSwapTitle"
style="@style/TextAppearance.NovaFoundation.Regular.SubHeadline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="13dp"
android:text="@string/swap_route_segment_swap_title"
android:textColor="@color/text_primary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<io.novafoundation.nova.feature_swap_impl.presentation.route.view.TokenAmountView
android:id="@+id/itemRouteSwapAmountFrom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
app:layout_constrainedWidth="true"
app:layout_constraintEnd_toStartOf="@id/itemRouteSwapArrow"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="@+id/itemRouteSwapTitle"
app:layout_constraintTop_toBottomOf="@id/itemRouteSwapTitle" />
<ImageView
android:id="@+id/itemRouteSwapArrow"
android:layout_width="16dp"
android:layout_height="16dp"
android:layout_marginStart="4dp"
android:src="@drawable/ic_arrow_right"
app:layout_constraintBottom_toBottomOf="@+id/itemRouteSwapAmountFrom"
app:layout_constraintEnd_toStartOf="@+id/guideline"
app:layout_constraintStart_toEndOf="@+id/itemRouteSwapAmountFrom"
app:layout_constraintTop_toTopOf="@+id/itemRouteSwapAmountFrom"
app:tint="@color/icon_secondary" />
<io.novafoundation.nova.feature_swap_impl.presentation.route.view.TokenAmountView
android:id="@+id/itemRouteSwapAmountTo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="4dp"
android:layout_marginEnd="16dp"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="@+id/itemRouteSwapAmountFrom"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toEndOf="@+id/itemRouteSwapArrow"
app:layout_constraintTop_toTopOf="@+id/itemRouteSwapAmountFrom" />
<TextView
android:id="@+id/itemRouteSwapFee"
style="@style/TextAppearance.NovaFoundation.Regular.Caption1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="15dp"
android:textColor="@color/text_secondary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@+id/itemRouteSwapAmountFrom"
app:layout_constraintTop_toBottomOf="@+id/itemRouteSwapAmountFrom"
tools:text="Fee: $0.416" />
<TextView
android:id="@+id/itemRouteSwapChain"
style="@style/TextAppearance.NovaFoundation.Regular.Caption1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="15dp"
android:layout_marginEnd="16dp"
android:includeFontPadding="false"
android:textColor="@color/text_secondary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/itemRouteSwapAmountFrom"
tools:text="Hydration" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.56" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -0,0 +1,81 @@
<?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"
tools:background="@color/secondary_screen_background">
<TextView
android:id="@+id/itemRouteTransferTitle"
style="@style/TextAppearance.NovaFoundation.Regular.SubHeadline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="16dp"
android:layout_marginTop="13dp"
android:text="@string/swap_route_segment_transfer_title"
android:textColor="@color/text_primary"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<io.novafoundation.nova.feature_swap_impl.presentation.route.view.TokenAmountView
android:id="@+id/itemRouteTransferAmount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
app:layout_constraintStart_toStartOf="@+id/itemRouteTransferTitle"
app:layout_constraintTop_toBottomOf="@id/itemRouteTransferTitle" />
<TextView
android:id="@+id/itemRouteTransferFee"
style="@style/TextAppearance.NovaFoundation.Regular.Caption1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="15dp"
android:textColor="@color/text_secondary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@+id/itemRouteTransferAmount"
app:layout_constraintTop_toBottomOf="@+id/itemRouteTransferAmount"
tools:text="Fee: $0.416" />
<TextView
android:id="@+id/itemRouteTransferFrom"
style="@style/TextAppearance.NovaFoundation.Regular.Caption1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="4dp"
android:includeFontPadding="false"
android:textColor="@color/text_secondary"
app:layout_constraintBottom_toBottomOf="@+id/itemRouteTransferTo"
app:layout_constraintEnd_toStartOf="@+id/itemRouteTransferArrow"
app:layout_constraintTop_toTopOf="@+id/itemRouteTransferTo"
tools:text="Polkadot" />
<ImageView
android:id="@+id/itemRouteTransferArrow"
android:layout_width="12dp"
android:layout_height="12dp"
android:layout_marginEnd="4dp"
android:src="@drawable/ic_arrow_right"
app:layout_constraintBottom_toBottomOf="@id/itemRouteTransferTo"
app:layout_constraintEnd_toStartOf="@id/itemRouteTransferTo"
app:layout_constraintTop_toTopOf="@id/itemRouteTransferTo"
app:tint="@color/icon_secondary" />
<TextView
android:id="@+id/itemRouteTransferTo"
style="@style/TextAppearance.NovaFoundation.Regular.Caption1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="15dp"
android:layout_marginEnd="16dp"
android:includeFontPadding="false"
android:textColor="@color/text_secondary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/itemRouteTransferAmount"
tools:text="Hydration" />
</androidx.constraintlayout.widget.ConstraintLayout>
@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<merge 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:clipChildren="false"
tools:background="@color/secondary_screen_background"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
<View
android:id="@+id/executionBackground"
android:layout_width="64dp"
android:layout_height="64dp"
android:background="@drawable/bg_container_with_border_circle"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/executionProgress"
android:layout_width="0dp"
android:layout_height="0dp"
android:src="@drawable/ic_container_timer_animated"
app:layout_constraintBottom_toBottomOf="@+id/executionBackground"
app:layout_constraintEnd_toEndOf="@+id/executionBackground"
app:layout_constraintStart_toStartOf="@+id/executionBackground"
app:layout_constraintTop_toTopOf="@+id/executionBackground" />
<ImageView
android:id="@+id/executionResult"
android:layout_width="0dp"
android:layout_height="0dp"
android:src="@drawable/ic_execution_result_success"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@+id/executionBackground"
app:layout_constraintEnd_toEndOf="@+id/executionBackground"
app:layout_constraintStart_toStartOf="@+id/executionBackground"
app:layout_constraintTop_toTopOf="@+id/executionBackground" />
<TextSwitcher
android:id="@+id/executionTimeSwitcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="20dp"
android:textColor="@color/text_primary"
app:layout_constraintBottom_toTopOf="@+id/executionTimeSeconds"
app:layout_constraintEnd_toEndOf="@+id/executionProgress"
app:layout_constraintStart_toStartOf="@+id/executionProgress"
app:layout_constraintTop_toTopOf="@+id/executionProgress"
app:layout_constraintVertical_chainStyle="packed" />
<TextView
android:id="@+id/executionTimeSeconds"
style="@style/TextAppearance.NovaFoundation.Regular.Caption1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:includeFontPadding="false"
android:text="@string/common_sec"
android:textColor="@color/text_secondary"
app:layout_constraintBottom_toBottomOf="@+id/executionProgress"
app:layout_constraintEnd_toEndOf="@+id/executionProgress"
app:layout_constraintStart_toStartOf="@+id/executionProgress"
app:layout_constraintTop_toBottomOf="@+id/executionTimeSwitcher" />
</merge>
@@ -0,0 +1,139 @@
<?xml version="1.0" encoding="utf-8"?>
<merge 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"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/swapAmountInputContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:background="@color/input_background">
<ImageView
android:id="@+id/swapAmountInputImage"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginStart="12dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:scaleType="centerInside"
android:background="@drawable/bg_token_container"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@drawable/ic_token_dot_colored" />
<ImageView
android:id="@+id/swapAmountInputSubtitleImage"
android:layout_width="12dp"
android:layout_height="12dp"
android:layout_marginEnd="12dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="@+id/swapAmountInputSubtitle"
app:layout_constraintStart_toEndOf="@+id/swapAmountInputImageBarier"
app:layout_constraintTop_toTopOf="@+id/swapAmountInputSubtitle"
tools:src="@drawable/ic_pezkuwi_logo" />
<androidx.constraintlayout.widget.Barrier
android:id="@+id/swapAmountInputImageBarier"
android:layout_width="0dp"
android:layout_height="match_parent"
app:barrierDirection="end"
app:barrierMargin="12dp"
app:constraint_referenced_ids="swapAmountInputImage" />
<TextView
android:id="@+id/swapAmountInputToken"
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/swapAmountInputSubtitle"
app:layout_constraintStart_toEndOf="@id/swapAmountInputImage"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
tools:text="KSM" />
<TextView
android:id="@+id/swapAmountInputSubtitle"
style="@style/TextAppearance.NovaFoundation.Regular.Footnote"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="4dp"
android:includeFontPadding="false"
android:text="@string/fragment_swap_main_settings_select_token"
android:textColor="@color/text_secondary"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/swapAmountInputSubtitleImage"
app:layout_constraintTop_toBottomOf="@+id/swapAmountInputToken"
app:layout_goneMarginStart="0dp" />
<ImageView
android:id="@+id/swapAmountInputChevron"
android:layout_width="20dp"
android:layout_height="20dp"
android:src="@drawable/ic_chevron_right"
app:layout_constraintBottom_toBottomOf="@+id/swapAmountInputToken"
app:layout_constraintStart_toEndOf="@+id/swapAmountInputToken"
app:layout_constraintTop_toTopOf="@+id/swapAmountInputToken"
app:tint="@color/icon_primary" />
<EditText
android:id="@+id/swapAmountInputField"
style="@style/TextAppearance.NovaFoundation.Regular.Title2"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="16dp"
android:background="@null"
android:gravity="end"
android:hint="0"
android:inputType="numberDecimal"
android:paddingTop="10dp"
android:paddingEnd="16dp"
android:paddingBottom="10dp"
android:saveEnabled="false"
android:textColor="@color/text_primary"
android:textColorHint="@color/hint_text"
android:textCursorDrawable="@null"
android:textStyle="bold"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toEndOf="@+id/swapAmountInputChevron"
app:layout_constraintTop_toTopOf="parent"
tools:text="4.508614" />
<TextView
android:id="@+id/swapAmountInputFiat"
style="@style/TextAppearance.NovaFoundation.Regular.Footnote"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginBottom="12dp"
android:singleLine="true"
android:textColor="@color/text_secondary"
app:layout_constrainedWidth="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:text="135.87$" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/swapAmountInputError"
style="@style/TextAppearance.NovaFoundation.Regular.Caption1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:textColor="@color/text_negative"
android:visibility="gone"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/swapAmountInputContainer" />
</merge>
@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:gravity="center_vertical"
tools:orientation="horizontal"
tools:parentTag="android.widget.LinearLayout">
<ImageView
android:id="@+id/viewTokenAmountIcon"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="4dp"
android:background="@drawable/bg_token_container"
tools:padding="3dp"
tools:src="@drawable/ic_token_ksm" />
<TextView
android:id="@+id/viewTokenAmountAmount"
style="@style/TextAppearance.NovaFoundation.SemiBold.Body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:singleLine="true"
android:textColor="@color/text_primary"
tools:text="900 DOT" />
</merge>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="SwapRouteView">
<attr name="SwapRouteView_displayChainName" format="boolean" />
</declare-styleable>
<declare-styleable name="SwapRouteTableCellView">
<attr name="SwapRouteView_displayChainName" />
</declare-styleable>
</resources>