Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
## Build and Development

- `./gradlew assembleFreeDebug` will compile the debug version of the app
- For fast feedback, run single tests i.e. `./gradlew :capy:testDebugUnitTest --tests com.jocmp.capy.persistence.ArticleRecordsTest` replacing the module - `:capy` - and Java package accordingly
- For fast feedback, run single tests i.e. `./gradlew :capy:test --tests com.jocmp.capy.persistence.ArticleRecordsTest` replacing the module - `:capy` - and Java package accordingly. Note `:capy` is a JVM module (use `:capy:test`); Android modules like `:app` use the variant task `testFreeDebugUnitTest`
- `make test` will run all tests via Fastlane.
- When modifying the `.js` and `.liquid` files, be sure to run `make` to compile those assets, and `make check` to typecheck

Expand Down
5 changes: 4 additions & 1 deletion app/src/main/java/com/capyreader/app/CommonModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.capyreader.app.common.AndroidClientCertManager
import com.capyreader.app.common.AppFaviconPolicy
import com.capyreader.app.common.SharedPreferenceStoreProvider
import com.capyreader.app.preferences.AppPreferences
import com.capyreader.app.refresher.RefreshScheduler
import com.jocmp.capy.AccountManager
import com.jocmp.capy.ClientCertManager
import com.jocmp.capy.DatabaseProvider
Expand All @@ -24,18 +25,20 @@ internal val common = module {
single<DatabaseProvider> { AndroidDatabaseProvider(context = get()) }
single<ClientCertManager> { AndroidClientCertManager(context = get()) }
single {
val userAgent = lazy { WebSettings.getDefaultUserAgent(androidContext()) }
AccountManager(
rootFolder = androidContext().filesDir.toURI(),
databaseProvider = get(),
cacheDirectory = androidContext().cacheDir.toURI(),
preferenceStoreProvider = get(),
faviconPolicy = AppFaviconPolicy(get()),
clientCertManager = get(),
userAgent = WebSettings.getDefaultUserAgent(androidContext()),
userAgent = { userAgent.value },
acceptLanguage = Locale.getDefault().toAcceptLanguageTag(),
)
}
single { AppPreferences(get()) }
single { RefreshScheduler(get(), get()) }
}

private fun Locale.toAcceptLanguageTag(): String {
Expand Down
6 changes: 0 additions & 6 deletions app/src/main/java/com/capyreader/app/MainApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import coil3.svg.SvgDecoder
import coil3.video.VideoFrameDecoder
import com.capyreader.app.common.AndroidLogging
import com.capyreader.app.preferences.AppPreferences
import com.capyreader.app.refresher.RefreshScheduler
import com.capyreader.app.ui.widget.HeadlinesWidgetReceiver
import com.capyreader.app.ui.widget.SpotlightWidgetReceiver
import com.google.android.material.color.DynamicColors
Expand All @@ -39,16 +38,11 @@ class MainApplication : Application(), SingletonImageLoader.Factory {

if (get<AppPreferences>().isLoggedIn) {
loadAccountModules()
initializeRefreshScheduler()
}

loadWidgetPreview()
}

private fun initializeRefreshScheduler() {
get<RefreshScheduler>().initialize()
}

override fun newImageLoader(context: PlatformContext): ImageLoader {
return ImageLoader.Builder(context)
.components {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,5 @@ import org.koin.dsl.module

val refresherModule = module {
single { FeedRefresher(account = get(), get(), get(), get()) }
single { RefreshScheduler(get(), get()) }
worker { RefreshFeedsWorker(get(), get()) }
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,21 @@ import com.jocmp.capy.AccountManager
import com.jocmp.capy.accounts.Source
import com.capyreader.app.preferences.AppPreferences
import com.capyreader.app.loadAccountModules
import com.capyreader.app.refresher.RefreshScheduler

class AddAccountViewModel(
private val accountManager: AccountManager,
private val appPreferences: AppPreferences,
private val refreshScheduler: RefreshScheduler,
) : ViewModel() {
fun addLocalAccount() {
val accountID = accountManager.createAccount(source = Source.LOCAL)

selectAccount(accountID)

loadAccountModules()

refreshScheduler.initialize()
}

private fun selectAccount(id: String) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ val loginModule = module {
viewModel {
AddAccountViewModel(
accountManager = get(),
appPreferences = get()
appPreferences = get(),
refreshScheduler = get(),
)
}
viewModel {
Expand All @@ -16,6 +17,7 @@ val loginModule = module {
accountManager = get(),
appPreferences = get(),
clientCertManager = get(),
refreshScheduler = get(),
)
}
viewModel {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import androidx.lifecycle.viewModelScope
import androidx.navigation.toRoute
import com.capyreader.app.loadAccountModules
import com.capyreader.app.preferences.AppPreferences
import com.capyreader.app.refresher.RefreshScheduler
import com.capyreader.app.ui.Route
import com.jocmp.capy.AccountManager
import com.jocmp.capy.ClientCertManager
Expand All @@ -30,6 +31,7 @@ class LoginViewModel(
private val accountManager: AccountManager,
private val appPreferences: AppPreferences,
private val clientCertManager: ClientCertManager,
private val refreshScheduler: RefreshScheduler,
) : ViewModel() {
private var _username by mutableStateOf("")
private var _password by mutableStateOf("")
Expand Down Expand Up @@ -158,6 +160,8 @@ class LoginViewModel(
selectAccount(accountID)

loadAccountModules()

refreshScheduler.initialize()
}

private fun selectAccount(id: String) {
Expand Down
2 changes: 1 addition & 1 deletion bench/src/main/kotlin/com/jocmp/bench/BenchAccount.kt
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ fun loadOrCreateAccount(benchDir: File, config: BenchConfig): Pair<AccountManage
databaseProvider = databaseProvider,
preferenceStoreProvider = preferenceStoreProvider,
faviconPolicy = FaviconPolicy { true },
userAgent = "CapyBench/1.0",
userAgent = { "CapyBench/1.0" },
acceptLanguage = "en-US",
)

Expand Down
2 changes: 1 addition & 1 deletion capy/src/main/java/com/jocmp/capy/Account.kt
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ data class Account(
val source: Source = Source.LOCAL,
val faviconPolicy: FaviconPolicy,
private val clientCertManager: ClientCertManager = ClientCertManager { builder, _ -> builder },
private val userAgent: String,
private val userAgent: () -> String,
private val acceptLanguage: String,
private val localHttpClient: OkHttpClient = LocalOkHttpClient.forAccount(path = cacheDirectory),
val delegate: AccountDelegate = when (source) {
Expand Down
2 changes: 1 addition & 1 deletion capy/src/main/java/com/jocmp/capy/AccountManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class AccountManager(
private val preferenceStoreProvider: PreferenceStoreProvider,
private val faviconPolicy: FaviconPolicy,
private val clientCertManager: ClientCertManager = ClientCertManager { builder, _ -> builder },
private val userAgent: String,
private val userAgent: () -> String,
private val acceptLanguage: String,
) {
fun findByID(
Expand Down
4 changes: 2 additions & 2 deletions capy/src/main/java/com/jocmp/capy/UserAgentInterceptor.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@ class UserAgentInterceptor(private val userAgent: String = USER_AGENT) : Interce
}

class BrowserHeadersInterceptor(
private val userAgent: String,
private val userAgent: () -> String,
private val acceptLanguage: String,
) : Interceptor {
override fun intercept(chain: Chain): Response {
val originalRequest = chain.request()
val request = originalRequest.newBuilder()
.header("User-Agent", userAgent)
.header("User-Agent", userAgent())
.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8")
.header("Accept-Language", acceptLanguage)
.header("Sec-Fetch-Dest", "document")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import java.net.URL
class FaviconFinder(
private val httpClient: OkHttpClient,
private val faviconPolicy: FaviconPolicy,
private val userAgent: String = "",
private val userAgent: () -> String = { "" },
private val acceptLanguage: String = "",
) {
suspend fun find(url: URL): String? {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import java.net.URL

class ArticleContent(
client: OkHttpClient,
userAgent: String,
userAgent: () -> String,
acceptLanguage: String,
) {
private val httpClient =
Expand Down
2 changes: 1 addition & 1 deletion capy/src/test/java/com/jocmp/capy/AccountManagerTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class AccountManagerTest {
cacheDirectory = rootFolder.newFolder().toURI(),
databaseProvider = InMemoryDatabaseProvider,
faviconPolicy = FakeFaviconPolicy,
userAgent = "TestUserAgent",
userAgent = { "TestUserAgent" },
acceptLanguage = "en-US",
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ class ArticleContentTest {
fun setup() {
extractor = ArticleContent(
client = client,
userAgent = "TestUserAgent",
userAgent = { "TestUserAgent" },
acceptLanguage = "en-US",
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ object AccountFixture {
source = source,
delegate = accountDelegate,
faviconPolicy = FakeFaviconPolicy,
userAgent = "TestUserAgent",
userAgent = { "TestUserAgent" },
acceptLanguage = "en-US",
)
}
Expand Down
Loading