Skip to content

Commit 711a9cf

Browse files
authored
Merge pull request #1993 from jocmp/v2
2 parents 33b2ffa + 4cf9676 commit 711a9cf

145 files changed

Lines changed: 1472 additions & 961 deletions

File tree

Some content is hidden

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

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ app/gplay/release/
3939

4040
# Cruft
4141
technotes/.obsidian/
42+
**/.idea/
4243
.idea/runConfigurations.xml
4344
.idea/markdown.xml
4445
.kotlin/sessions/

app/build.gradle.kts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import com.android.build.gradle.internal.tasks.factory.dependsOn
2+
import java.security.SecureRandom
23
import java.util.Properties
34

45
plugins {
@@ -193,4 +194,42 @@ tasks.register("useGMSDebugFile") {
193194
}
194195
}
195196

197+
val generateSecretKey = tasks.register("generateSecretKey") {
198+
val outputDir = layout.buildDirectory.dir("generated/source/secrets/com/capyreader/app")
199+
outputs.dir(outputDir)
200+
201+
doLast {
202+
val username = secrets.getProperty("extract_username", "")
203+
val secret = secrets.getProperty("extract_secret", "")
204+
val salt = ByteArray(64).also { SecureRandom().nextBytes(it) }
205+
206+
fun encode(value: String) = value.toByteArray()
207+
.mapIndexed { i, b -> (b.toInt() xor salt[i % salt.size].toInt()).toByte() }
208+
.toByteArray()
209+
210+
fun ByteArray.toHexLiteral() = joinToString { "0x%02x.toByte()".format(it) }
211+
212+
val file = outputDir.get().file("SecretKey.kt").asFile
213+
file.parentFile.mkdirs()
214+
file.writeText(
215+
"""
216+
package com.capyreader.app
217+
218+
internal object SecretKey {
219+
private val salt = byteArrayOf(${salt.toHexLiteral()})
220+
221+
private fun decode(encoded: ByteArray) =
222+
String(ByteArray(encoded.size) { i -> (encoded[i].toInt() xor salt[i % salt.size].toInt()).toByte() })
223+
224+
val extractUsername = decode(byteArrayOf(${encode(username).toHexLiteral()}))
225+
val extractSecret = decode(byteArrayOf(${encode(secret).toHexLiteral()}))
226+
}
227+
""".trimIndent()
228+
)
229+
}
230+
}
231+
196232
project.tasks.preBuild.dependsOn("useGMSDebugFile")
233+
project.tasks.preBuild.dependsOn("generateSecretKey")
234+
235+
android.sourceSets["main"].kotlin.srcDir(layout.buildDirectory.dir("generated/source/secrets"))

app/src/main/java/com/capyreader/app/AddLinkActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ class AddLinkActivity : BaseActivity() {
4242
AddLinkScreen(
4343
defaultQueryURL = defaultQueryURL,
4444
pageTitle = pageTitle,
45-
supportsPages = account.source.supportsPages,
45+
supportsReadLater = account.source.supportsReadLater,
4646
onBack = {
4747
finish()
4848
}

app/src/main/java/com/capyreader/app/CommonModule.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ internal val common = module {
2828
clientCertManager = get(),
2929
userAgent = WebSettings.getDefaultUserAgent(androidContext()),
3030
acceptLanguage = Locale.getDefault().toAcceptLanguageTag(),
31+
extractUsername = SecretKey.extractUsername,
32+
extractSecret = SecretKey.extractSecret,
3133
)
3234
}
3335
single { AppPreferences(get()) }

app/src/main/java/com/capyreader/app/MainActivity.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ package com.capyreader.app
33
import android.content.Intent
44
import android.os.Bundle
55
import androidx.activity.compose.setContent
6+
import androidx.compose.runtime.getValue
7+
import androidx.compose.runtime.mutableStateOf
8+
import androidx.compose.runtime.setValue
69
import com.capyreader.app.notifications.NotificationHelper
710
import com.capyreader.app.preferences.AppPreferences
811
import com.capyreader.app.ui.App
@@ -13,21 +16,25 @@ import org.koin.android.ext.android.inject
1316
class MainActivity : BaseActivity() {
1417
val appPreferences by inject<AppPreferences>()
1518

19+
private var pendingArticleID by mutableStateOf<String?>(null)
20+
1621
override fun onCreate(savedInstanceState: Bundle?) {
1722
super.onCreate(savedInstanceState)
18-
NotificationHelper.openFromIntent(intent, appPreferences = appPreferences)
23+
pendingArticleID = NotificationHelper.openFromIntent(intent, appPreferences = appPreferences)
1924

2025
setContent {
2126
App(
2227
startDestination = startDestination(),
2328
appPreferences = appPreferences,
29+
pendingArticleID = pendingArticleID,
30+
onPendingArticleSelected = { pendingArticleID = null },
2431
)
2532
}
2633
}
2734

2835
override fun onNewIntent(intent: Intent) {
2936
super.onNewIntent(intent)
30-
NotificationHelper.openFromIntent(intent, appPreferences = appPreferences)
37+
pendingArticleID = NotificationHelper.openFromIntent(intent, appPreferences = appPreferences)
3138
}
3239

3340
private fun startDestination(): Route {

0 commit comments

Comments
 (0)