Skip to content

Commit baf83d3

Browse files
Merge pull request #322 from bitcoinppl/initial-android-views
Initial android views and project setup
2 parents e052c51 + bf53938 commit baf83d3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+3678
-151
lines changed

android/app/build.gradle.kts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
plugins {
22
id("com.android.application")
33
id("org.jetbrains.kotlin.android")
4+
id("org.jetbrains.kotlin.plugin.compose")
45
}
56

67
android {
78
namespace = "com.example.cove"
8-
compileSdk = 34
9+
compileSdk = 36
910

1011
defaultConfig {
1112
applicationId = "com.example.cove"
1213
minSdk = 24
13-
targetSdk = 33
14+
targetSdk = 36
1415
versionCode = 1
1516
versionName = "1.0"
1617

@@ -51,29 +52,30 @@ android {
5152

5253
dependencies {
5354

54-
implementation("androidx.core:core-ktx:1.9.0")
55-
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.1")
56-
implementation("androidx.activity:activity-compose:1.9.0")
57-
implementation(platform("androidx.compose:compose-bom:2023.03.00"))
55+
implementation("androidx.core:core-ktx:1.17.0")
56+
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.9.3")
57+
implementation("androidx.activity:activity-compose:1.10.1")
58+
implementation(platform("androidx.compose:compose-bom:2025.08.01"))
5859
implementation("androidx.compose.ui:ui")
5960
implementation("androidx.compose.ui:ui-graphics")
6061
implementation("androidx.compose.ui:ui-tooling-preview")
6162
implementation("androidx.compose.material3:material3")
63+
implementation("androidx.compose.material:material-icons-extended")
6264
testImplementation("junit:junit:4.13.2")
63-
androidTestImplementation("androidx.test.ext:junit:1.1.5")
64-
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
65-
androidTestImplementation(platform("androidx.compose:compose-bom:2023.03.00"))
65+
androidTestImplementation("androidx.test.ext:junit:1.3.0")
66+
androidTestImplementation("androidx.test.espresso:espresso-core:3.7.0")
67+
androidTestImplementation(platform("androidx.compose:compose-bom:2025.08.01"))
6668
androidTestImplementation("androidx.compose.ui:ui-test-junit4")
6769
debugImplementation("androidx.compose.ui:ui-tooling")
6870
debugImplementation("androidx.compose.ui:ui-test-manifest")
6971

7072
// Uniffi
71-
implementation("net.java.dev.jna:jna:5.12.0@aar")
72-
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")
73+
implementation("net.java.dev.jna:jna:5.17.0@aar")
74+
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2")
7375

7476
// Jetpack compose / flow
75-
implementation("androidx.lifecycle:lifecycle-Manager-compose:2.8.1")
76-
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0")
77-
implementation("androidx.compose.runtime:runtime-livedata:1.0.5")
77+
implementation("androidx.lifecycle:lifecycle-runtime-compose:2.9.3")
78+
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.9.3")
79+
implementation("androidx.compose.runtime:runtime-livedata:1.9.0")
7880

7981
}

android/app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
android:theme="@style/Theme.Cove"
1414
tools:targetApi="31">
1515
<activity
16-
android:name=".MainActivity"
16+
android:name="org.bitcoinppl.cove.MainActivity"
1717
android:exported="true"
1818
android:label="@string/app_name"
1919
android:theme="@style/Theme.Cove">

android/app/src/main/java/org/bitcoinppl/cove/CoveApp.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
1-
import androidx.compose.foundation.layout.*
1+
import androidx.compose.foundation.layout.Box
2+
import androidx.compose.foundation.layout.fillMaxSize
23
import androidx.compose.material3.Button
3-
import androidx.compose.material3.ButtonDefaults
44
import androidx.compose.material3.Text
5-
import androidx.compose.runtime.*
5+
import androidx.compose.runtime.Composable
66
import androidx.compose.ui.Alignment
77
import androidx.compose.ui.Modifier
88
import androidx.compose.ui.graphics.Color
99
import androidx.compose.ui.tooling.preview.Preview
10-
import androidx.compose.ui.unit.dp
1110
import androidx.compose.ui.unit.sp
1211
import com.example.cove.Manager
13-
import com.example.cove.ui.theme.CoveTheme
14-
import androidx.lifecycle.Manager.compose.Manager
1512
import org.bitcoinppl.cove.AutoComplete
13+
import org.bitcoinppl.cove.ui.theme.CoveTheme
1614

1715
@Composable
1816
fun CoveApp(Manager: Manager = Manager()) {

android/app/src/main/java/org/bitcoinppl/cove/MainActivity.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package com.example.cove
1+
package org.bitcoinppl.cove
22

33
import CoveApp
44
import android.os.Bundle
55
import androidx.activity.ComponentActivity
66
import androidx.activity.compose.setContent
7-
import com.example.cove.ui.theme.CoveTheme
7+
import org.bitcoinppl.cove.ui.theme.CoveTheme
88

99
class MainActivity : ComponentActivity() {
1010
override fun onCreate(savedInstanceState: Bundle?) {
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package com.example.cove
22

3-
import androidx.lifecycle.Manager
3+
//import androidx.lifecycle.Manager
44

5-
class Manager : Manager()
5+
class Manager()// : Manager()
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
package org.bitcoinppl.cove.flow.new_wallet
2+
3+
import androidx.compose.foundation.Image
4+
import androidx.compose.foundation.layout.Arrangement
5+
import androidx.compose.foundation.layout.Box
6+
import androidx.compose.foundation.layout.Column
7+
import androidx.compose.foundation.layout.Row
8+
import androidx.compose.foundation.layout.Spacer
9+
import androidx.compose.foundation.layout.fillMaxSize
10+
import androidx.compose.foundation.layout.fillMaxWidth
11+
import androidx.compose.foundation.layout.heightIn
12+
import androidx.compose.foundation.layout.padding
13+
import androidx.compose.material.icons.Icons
14+
import androidx.compose.material.icons.automirrored.filled.ArrowBack
15+
import androidx.compose.material3.ButtonDefaults
16+
import androidx.compose.material3.CenterAlignedTopAppBar
17+
import androidx.compose.material3.ExperimentalMaterial3Api
18+
import androidx.compose.material3.HorizontalDivider
19+
import androidx.compose.material3.Icon
20+
import androidx.compose.material3.IconButton
21+
import androidx.compose.material3.MaterialTheme
22+
import androidx.compose.material3.Scaffold
23+
import androidx.compose.material3.SnackbarHost
24+
import androidx.compose.material3.SnackbarHostState
25+
import androidx.compose.material3.Text
26+
import androidx.compose.material3.TopAppBarDefaults
27+
import androidx.compose.runtime.Composable
28+
import androidx.compose.runtime.remember
29+
import androidx.compose.ui.Alignment
30+
import androidx.compose.ui.Modifier
31+
import androidx.compose.ui.graphics.Color
32+
import androidx.compose.ui.layout.ContentScale
33+
import androidx.compose.ui.res.painterResource
34+
import androidx.compose.ui.res.stringResource
35+
import androidx.compose.ui.text.font.FontWeight
36+
import androidx.compose.ui.text.style.TextOverflow
37+
import androidx.compose.ui.tooling.preview.Preview
38+
import androidx.compose.ui.unit.dp
39+
import androidx.compose.ui.unit.sp
40+
import com.example.cove.R
41+
import org.bitcoinppl.cove.ui.theme.BtnPrimary
42+
import org.bitcoinppl.cove.ui.theme.MidnightBlue
43+
import org.bitcoinppl.cove.views.DashDotsIndicator
44+
import org.bitcoinppl.cove.views.ImageButton
45+
46+
47+
@Preview(showBackground = true, backgroundColor = 0xFF0D1B2A)
48+
@Composable
49+
private fun NewWalletSelectScreenPreview() {
50+
val snack = remember { SnackbarHostState() }
51+
NewWalletSelectScreen(
52+
onBack = {},
53+
onOpenNewHotWallet = {},
54+
onOpenQrScan = {},
55+
onOpenNfcScan = {},
56+
snackbarHostState = snack
57+
)
58+
}
59+
60+
@OptIn(ExperimentalMaterial3Api::class)
61+
@Composable
62+
fun NewWalletSelectScreen(
63+
onBack: () -> Unit,
64+
onOpenNewHotWallet: () -> Unit,
65+
onOpenQrScan: () -> Unit,
66+
onOpenNfcScan: () -> Unit,
67+
snackbarHostState: SnackbarHostState = remember { SnackbarHostState() },
68+
) {
69+
Scaffold(containerColor = MidnightBlue, topBar = {
70+
CenterAlignedTopAppBar(
71+
colors = TopAppBarDefaults.centerAlignedTopAppBarColors(
72+
containerColor = Color.Transparent,
73+
titleContentColor = Color.White,
74+
actionIconContentColor = Color.White,
75+
navigationIconContentColor = Color.White
76+
), title = {
77+
Text(
78+
stringResource(R.string.title_wallet_add),
79+
style = MaterialTheme.typography.titleMedium,
80+
maxLines = 1,
81+
overflow = TextOverflow.Ellipsis
82+
)
83+
}, navigationIcon = {
84+
IconButton(onClick = onBack) {
85+
Icon(
86+
imageVector = Icons.AutoMirrored.Default.ArrowBack,
87+
contentDescription = "Back"
88+
)
89+
}
90+
}, actions = {
91+
IconButton(onClick = onOpenQrScan) {
92+
Icon(
93+
painter = painterResource(id = R.drawable.icon_qr_code),
94+
contentDescription = "Scan QR"
95+
)
96+
}
97+
IconButton(onClick = {
98+
onOpenNfcScan()
99+
}) {
100+
Icon(
101+
painter = painterResource(id = R.drawable.icon_contactless),
102+
contentDescription = "NFC"
103+
)
104+
}
105+
})
106+
}, snackbarHost = { SnackbarHost(snackbarHostState) }) { padding ->
107+
108+
Box(
109+
modifier = Modifier
110+
.fillMaxSize()
111+
.padding(padding)
112+
) {
113+
Image(
114+
painter = painterResource(id = R.drawable.image_chain_code_pattern_horizontal),
115+
contentDescription = null,
116+
contentScale = ContentScale.Crop,
117+
modifier = Modifier
118+
.fillMaxWidth()
119+
.padding(top = 36.dp)
120+
.heightIn(min = 0.dp, max = (0.75f * 720).dp)
121+
.align(Alignment.TopCenter)
122+
)
123+
124+
Row(
125+
modifier = Modifier
126+
.align(Alignment.BottomCenter)
127+
.padding(horizontal = 20.dp, vertical = 16.dp)
128+
.fillMaxWidth(),
129+
) {
130+
Column(
131+
modifier = Modifier.fillMaxWidth(),
132+
verticalArrangement = Arrangement.spacedBy(28.dp)
133+
) {
134+
Row(
135+
verticalAlignment = Alignment.CenterVertically
136+
) {
137+
DashDotsIndicator(
138+
count = 4,
139+
currentIndex = 0,
140+
)
141+
Spacer(Modifier.weight(1f))
142+
}
143+
144+
Text(
145+
text = stringResource(R.string.label_wallet_add_new_wallet),
146+
color = Color.White,
147+
fontSize = 34.sp,
148+
fontWeight = FontWeight.SemiBold,
149+
lineHeight = 38.sp
150+
)
151+
152+
HorizontalDivider(
153+
color = Color.White.copy(alpha = 0.35f), thickness = 1.dp
154+
)
155+
156+
Row(
157+
horizontalArrangement = Arrangement.spacedBy(16.dp),
158+
modifier = Modifier.fillMaxWidth()
159+
) {
160+
ImageButton(
161+
text = stringResource(R.string.btn_hardware_wallet),
162+
leading = {
163+
Icon(
164+
painter = painterResource(R.drawable.icon_currency_bitcoin),
165+
contentDescription = null
166+
)
167+
168+
},
169+
onClick = {
170+
// todo
171+
},
172+
colors = ButtonDefaults.buttonColors(
173+
containerColor = BtnPrimary, contentColor = MidnightBlue
174+
),
175+
modifier = Modifier.weight(1f),
176+
)
177+
178+
ImageButton(
179+
text = stringResource(R.string.btn_on_this_device),
180+
leading = {
181+
Icon(
182+
painter = painterResource(R.drawable.icon_phone_device), // placeholder "phone"
183+
contentDescription = null
184+
)
185+
},
186+
onClick = onOpenNewHotWallet,
187+
colors = ButtonDefaults.buttonColors(
188+
containerColor = BtnPrimary, contentColor = MidnightBlue
189+
),
190+
modifier = Modifier.weight(1f),
191+
)
192+
}
193+
}
194+
}
195+
}
196+
}
197+
}
198+
199+
200+
201+

0 commit comments

Comments
 (0)