diff --git a/app/build.gradle b/app/build.gradle index f02d7b59..1b2b53f8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -38,6 +38,7 @@ dependencies { kapt "com.google.dagger:hilt-android-compiler:$hilt_version" implementation(project(":data")) implementation(project(":lobsters-api")) + implementation(project(":model")) implementation 'androidx.core:core-ktx:1.5.0-alpha03' implementation 'androidx.appcompat:appcompat:1.3.0-alpha02' implementation "androidx.compose.foundation:foundation:$compose_version" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index bc8152c0..7ce81128 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + { error("Needs to be provided") } @@ -45,6 +51,7 @@ val UrlLauncherAmbient = ambientOf { error("Needs to be provided") class MainActivity : AppCompatActivity() { @Inject lateinit var database: TodoDatabase @Inject lateinit var urlLauncher: UrlLauncher + @Inject lateinit var apiClient: LobstersApi override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -52,6 +59,25 @@ class MainActivity : AppCompatActivity() { Providers(UrlLauncherAmbient provides urlLauncher) { LobstersTheme { val coroutineScope = rememberCoroutineScope() + val posts = mutableStateListOf() + coroutineScope.launch { + apiClient.getHottestPosts().enqueue(object : Callback> { + override fun onResponse( + call: Call>, + response: Response> + ) { + if (response.isSuccessful) { + response.body()?.let { posts.addAll(it) } + } + } + + override fun onFailure(call: Call>, t: Throwable) { + TODO("Not yet implemented") + } + }) + } + LobstersApp(posts) + /* val itemsDao = database.todoItemsDao() val items by itemsDao.getAllItems().collectAsState(initial = emptyList()) TodoApp( @@ -59,12 +85,31 @@ class MainActivity : AppCompatActivity() { { item -> coroutineScope.launch { itemsDao.insert(item) } }, { item -> coroutineScope.launch { itemsDao.delete(item) } }, ) + */ } } } } } +@Composable +fun LobstersApp( + items: List, +) { + val urlLauncher = UrlLauncherAmbient.current + + Scaffold( + topBar = { TopAppBar({ Text(text = stringResource(R.string.app_name)) }) }, + bodyContent = { + LazyColumnFor(items) { item -> + LobstersItem(item) { post -> + urlLauncher.launch(post.url) + } + } + } + ) +} + @Composable fun TodoApp( items: List, @@ -145,6 +190,7 @@ fun ItemAddDialog( ) } +/* @Preview @Composable fun PreviewApp() { @@ -157,3 +203,4 @@ fun PreviewApp() { ) } } +*/ diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/LobstersItem.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/LobstersItem.kt new file mode 100644 index 00000000..a6b67733 --- /dev/null +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/LobstersItem.kt @@ -0,0 +1,90 @@ +package dev.msfjarvis.lobsters.ui + +import androidx.compose.foundation.Text +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumnFor +import androidx.compose.foundation.lazy.LazyItemScope +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.ListItem +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import dev.msfjarvis.lobsters.model.LobstersPost +import dev.msfjarvis.lobsters.model.Submitter + +@Composable +fun LazyItemScope.LobstersItem( + post: LobstersPost, + modifier: Modifier = Modifier, + onClick: (LobstersPost) -> Unit, +) { + ListItem( + modifier = modifier.padding(horizontal = 8.dp) + .fillParentMaxWidth() + .clickable(onClick = { onClick.invoke(post) }), + text = { + Column { + Text( + text = post.title, + color = Color(0xFF7395D9), + fontWeight = FontWeight.Bold, + modifier = Modifier.padding(top = 8.dp) + ) + Row { + post.tags.forEach { tag -> + Text( + text = tag, + modifier = Modifier + .background(Color(0xFFE2E0C5), RoundedCornerShape(4.dp)), + color = Color.DarkGray, + ) + } + } + Text( + text = "authored by ${post.submitterUser.username}", + ) + } + } + ) +} + +@Composable +fun PreviewLobstersItem() { + val post = LobstersPost( + "zqyydb", + "https://lobste.rs/s/zqyydb", + "2020-09-21T07:11:14.000-05:00", + "k2k20 hackathon report: Bob Beck on LibreSSL progress", + "https://undeadly.org/cgi?action=article;sid=20200921105847", + 4, + 0, + 0, + "", + "https://lobste.rs/s/zqyydb/k2k20_hackathon_report_bob_beck_on", + Submitter( + "Vigdis", + "2017-02-27T21:08:14.000-06:00", + false, + "Alleycat for the fun, sys/net admin for a living and OpenBSD contributions for the pleasure. (Not so) French dude in Montreal\r\n\r\nhttps://chown.me", + false, + 76, + "/avatars/Vigdis-100.png", + "sevan", + null, + null, + null, + ), + listOf("openbsd") + ) + LobstersTheme { + LazyColumnFor(items = listOf(post)) { item -> + LobstersItem(post = item, onClick = {}) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/Theme.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/Theme.kt index b4216f33..5db0b20f 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/Theme.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/Theme.kt @@ -1,38 +1,25 @@ package dev.msfjarvis.lobsters.ui -import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material.MaterialTheme -import androidx.compose.material.darkColors import androidx.compose.material.lightColors import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color val lightColors = lightColors( primary = Color.White, - secondary = Color(0xFFAC130D), - background = Color(0xFFFEFEFE), + secondary = Color(0xFF6C0000), + background = Color.White, surface = Color.White, - onPrimary = Color(0x7395D9), + onPrimary = Color.DarkGray, onSecondary = Color.White, onBackground = Color.Black, onSurface = Color.Black, ) -val darkColors = darkColors( - primary = Color(0xFF121212), - secondary = Color(0xFFAC130D), - background = Color.Black, - surface = Color(0xFF121212), - onPrimary = Color(0x7395D9), - onSecondary = Color.White, - onBackground = Color.White, - onSurface = Color.White, -) - @Composable fun LobstersTheme(children: @Composable () -> Unit) { MaterialTheme( - colors = if (isSystemInDarkTheme()) darkColors else lightColors, + colors = lightColors, content = children, ) } diff --git a/lobsters-api/build.gradle b/lobsters-api/build.gradle index d9cc1331..7c1d953e 100644 --- a/lobsters-api/build.gradle +++ b/lobsters-api/build.gradle @@ -7,8 +7,8 @@ dependencies { def moshi_version = "1.9.3" def retrofit_version = "2.9.0" implementation project(":model") + api "com.squareup.retrofit2:retrofit:$retrofit_version" implementation "com.squareup.retrofit2:converter-moshi:$retrofit_version" - implementation "com.squareup.retrofit2:retrofit:$retrofit_version" kaptTest "com.squareup.moshi:moshi-kotlin-codegen:$moshi_version" testImplementation 'junit:junit:4.13' // retrofit uses 3.14.9, so shall we.