Skip to content

Commit

Permalink
okay so now it draws the first 5 items...success?
Browse files Browse the repository at this point in the history
  • Loading branch information
JvmName committed Jan 8, 2025
1 parent 8773d90 commit 37e4263
Show file tree
Hide file tree
Showing 21 changed files with 1,115 additions and 464 deletions.
33 changes: 25 additions & 8 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ kotlin {
optIn.addAll(
"androidx.compose.material3.ExperimentalMaterial3Api",
"androidx.compose.foundation.ExperimentalFoundationApi",
"kotlin.ExperimentalStdlibApi",
"kotlinx.coroutines.ExperimentalCoroutinesApi",
)
freeCompilerArgs.addAll(
"-Xjsr305=strict",
Expand All @@ -43,13 +45,6 @@ kotlin {
val aqVersionCode = providers.gradleProperty("aq_versioncode").map(String::toLong).get()
val aqVersionName = providers.gradleProperty("aq_versionname").get()

buildConfig {
packageName("dev.jvmname.acquisitive")
buildConfigField("String", "FS_VERSION_NAME", "\"$aqVersionName - $aqVersionCode\"")
buildConfigField("Long", "VERSION_CODE", aqVersionCode)
generateAtSync = true
}

android {
namespace = "dev.jvmname.acquisitive"
compileSdk = 35
Expand All @@ -75,6 +70,22 @@ android {
)
}
}

applicationVariants.all variant@{
buildConfig {
generateAtSync = true
useKotlinOutput()
sourceSets.named(this@variant.name) {
className.set("BuildConfig")
packageName("dev.jvmname.acquisitive")
buildConfigField<Boolean>("DEBUG", this@variant.buildType.isDebuggable)
buildConfigField<String>("VERSION_NAME", "\"$aqVersionName - $aqVersionCode\"")
buildConfigField<Long>("VERSION_CODE", aqVersionCode)
}
}

}

compileOptions {
sourceCompatibility = libs.versions.jvmTarget.map(JavaVersion::toVersion).get()
targetCompatibility = libs.versions.jvmTarget.map(JavaVersion::toVersion).get()
Expand All @@ -91,7 +102,10 @@ android {
ksp {
arg("circuit.codegen.mode", "kotlin_inject_anvil")
// arg("me.tatarka.inject.dumpGraph", "true")
arg("kotlin-inject-anvil-contributing-annotations", "com.slack.circuit.codegen.annotations.CircuitInject")
arg(
"kotlin-inject-anvil-contributing-annotations",
"com.slack.circuit.codegen.annotations.CircuitInject"
)
}

dependencies {
Expand Down Expand Up @@ -136,14 +150,17 @@ dependencies {

implementation(platform(libs.square.retrofit.bom))
implementation(libs.square.retrofit)
implementation(libs.square.okhttpLogging)
implementation(libs.square.retrofit.moshi)
implementation(libs.square.moshi)
ksp(libs.square.moshiKotlin)
implementation(libs.square.moshiAdapters)
implementation(libs.square.moshiSealed)
ksp(libs.square.moshiSealedCodegen)
implementation(libs.square.logcat)

implementation(libs.sqkon)

implementation(libs.mnf.store)
implementation("io.github.theapache64:rebugger:1.0.0-rc03")
}
2 changes: 2 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.INTERNET" />

<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
Expand Down
14 changes: 12 additions & 2 deletions app/src/main/java/dev/jvmname/acquisitive/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,46 @@ import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.ui.text.AnnotatedString
import com.slack.circuit.backstack.rememberSaveableBackStack
import com.slack.circuit.foundation.CircuitCompositionLocals
import com.slack.circuit.foundation.NavigableCircuitContent
import com.slack.circuit.foundation.NavigatorDefaults
import com.slack.circuit.foundation.rememberCircuitNavigator
import com.slack.circuitx.android.rememberAndroidScreenAwareNavigator
import com.slack.circuitx.gesturenavigation.GestureNavigationDecoration
import com.theapache64.rebugger.RebuggerConfig
import dev.jvmname.acquisitive.di.AcqComponent
import dev.jvmname.acquisitive.di.create
import dev.jvmname.acquisitive.ui.screen.mainlist.MainListScreen
import dev.jvmname.acquisitive.ui.theme.AcquisitiveTheme
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import logcat.AndroidLogcatLogger
import logcat.LogPriority
import logcat.logcat

class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
AndroidLogcatLogger.installOnDebuggableApp(application, minPriority = LogPriority.VERBOSE)
RebuggerConfig.init(
tag = "AcqRebugger", // changing default tag
logger = { tag, message -> logcat(tag = tag, message = { message }) }
)
System.setProperty("kotlinx.coroutines.debug", if (BuildConfig.DEBUG) "on" else "off")
enableEdgeToEdge()

val scope = CoroutineScope(Dispatchers.Main + SupervisorJob())
val component = AcqComponent::class.create(
contextDelegate = applicationContext,
coroutineScopeDelegate = scope,
)

logcat { "***entering compose" }
setContent {
CircuitCompositionLocals(component.circuit) {
AcquisitiveTheme {
logcat { "***entered theme" }
val backstack = rememberSaveableBackStack(root = MainListScreen())
val navigator = rememberAndroidScreenAwareNavigator(
rememberCircuitNavigator(backstack), // Decorated navigator
Expand Down
25 changes: 20 additions & 5 deletions app/src/main/java/dev/jvmname/acquisitive/network/HNClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,28 @@ import dev.jvmname.acquisitive.network.model.UserId
import dev.jvmname.acquisitive.util.ItemIdArray
import dev.jvmname.acquisitive.util.emptyItemIdArray
import dev.jvmname.acquisitive.util.fetchAsync
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.isActive
import kotlinx.coroutines.withContext
import logcat.asLog
import logcat.logcat
import me.tatarka.inject.annotations.Inject
import software.amazon.lastmile.kotlin.inject.anvil.AppScope
import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding


abstract class HnClient {
//TODO figure out if i want to take the boxing hit to have an ApiResult type
protected suspend fun <T> wrap(call: suspend () -> T): T {
return withContext(Dispatchers.IO) { call() }
protected suspend inline fun <reified T> wrap(crossinline call: suspend () -> T): T {
return withContext(Dispatchers.IO + CoroutineName("HnClientWrapped")) {
try {
if (!isActive) logcat { "***scope not active" }
call()
} catch (e: Exception) {
logcat { "***error: " + e.asLog() }
throw e
}
}
}

abstract suspend fun getStories(mode: FetchMode): ItemIdArray
Expand All @@ -34,7 +45,7 @@ abstract class HnClient {
}

@[Inject ContributesBinding(AppScope::class)]
class RealHnClient (factory: NetworkComponent.RetrofitFactory) : HnClient() {
class RealHnClient(factory: NetworkComponent.RetrofitFactory) : HnClient() {
private val storyClient = factory.create<HnStoryApi>("https://hacker-news.firebaseio.com/v0/")
// private val userClient = factory.create<HnUserApi>("https://news.ycombinator.com/")

Expand All @@ -55,7 +66,11 @@ class RealHnClient (factory: NetworkComponent.RetrofitFactory) : HnClient() {
}

override suspend fun getTopStories(): ItemIdArray {
return wrap { storyClient.getTopStories() }
return try {
storyClient.getTopStories()
} catch (e: Exception) {
throw e
}
?: emptyItemIdArray()
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package dev.jvmname.acquisitive.network

import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.JsonReader
import com.squareup.moshi.JsonWriter
import com.squareup.moshi.Moshi
import com.squareup.moshi.adapter
import dev.jvmname.acquisitive.util.ItemIdArray
import java.lang.reflect.Type

object ItemIdArrayAdapterFactory : JsonAdapter.Factory {
override fun create(
type: Type,
annotations: MutableSet<out Annotation>,
moshi: Moshi,
): JsonAdapter<ItemIdArray>? {
if (type != ItemIdArray::class.java) return null

val delegate = moshi.adapter<IntArray>()
return object : JsonAdapter<ItemIdArray>() {
override fun fromJson(reader: JsonReader): ItemIdArray? {
return delegate.fromJson(reader)?.let(::ItemIdArray)
}

override fun toJson(writer: JsonWriter, value: ItemIdArray?) {
delegate.toJson(writer, value?.storage)
}
}
}

}
24 changes: 15 additions & 9 deletions app/src/main/java/dev/jvmname/acquisitive/network/NetworkModule.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package dev.jvmname.acquisitive.network

import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.Moshi
import com.squareup.moshi.addAdapter
import dev.jvmname.acquisitive.network.adapters.IdAdapter
import dev.jvmname.acquisitive.network.adapters.InstantAdapter
import kotlinx.datetime.Instant
import logcat.logcat
import me.tatarka.inject.annotations.Inject
import me.tatarka.inject.annotations.Provides
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import software.amazon.lastmile.kotlin.inject.anvil.AppScope
Expand All @@ -20,32 +22,36 @@ interface NetworkComponent {
@[Provides SingleIn(AppScope::class)]
fun providesMoshi(): Moshi {
return Moshi.Builder()
.add(Instant::class.java, InstantAdapter)
.addAdapter(InstantAdapter)
.add(IdAdapter.create())
.add(ItemIdArrayAdapterFactory)
.build()
}

@Provides
fun provideMoshiConverterFactory(moshi: Moshi) = MoshiConverterFactory.create(moshi)

@Provides
fun provideOkhttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.build()
}
@Provides
fun provideOkhttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.addNetworkInterceptor(HttpLoggingInterceptor { logcat(tag = "OkhttpInterceptor") { it } }.apply {
level = HttpLoggingInterceptor.Level.BASIC
})
.build()
}


@[Inject SingleIn(AppScope::class)]
class RetrofitFactory(
private val okhttp: () -> OkHttpClient,
private val okhttp: OkHttpClient,
private val moshiConverterFactory: MoshiConverterFactory,
) {
fun <T : Any> create(baseURL: String, clazz: KClass<T>): T {
return Retrofit.Builder()
.client(okhttp)
.baseUrl(baseURL)
.addConverterFactory(moshiConverterFactory)
.validateEagerly(true)
.callFactory { request -> okhttp().newCall(request) }
.build()
.create(clazz.java)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,6 @@ import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.JsonReader
import com.squareup.moshi.JsonWriter
import kotlinx.datetime.Instant
import me.tatarka.inject.annotations.Inject
import software.amazon.lastmile.kotlin.inject.anvil.AppScope
import software.amazon.lastmile.kotlin.inject.anvil.ContributesBinding



object InstantAdapter : JsonAdapter<Instant>() {
override fun fromJson(reader: JsonReader): Instant {
Expand Down
Loading

0 comments on commit 37e4263

Please sign in to comment.