Skip to content
Open
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
4 changes: 3 additions & 1 deletion .github/workflows/detekt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ jobs:
detekt:
name: Static Code Analysis with Detekt
runs-on: ubuntu-latest
env:
ORG_GRADLE_JAVA_INSTALLATIONS_AUTO_DOWNLOAD: "false"

steps:
# ✅ Step 1: Checkout Repository
Expand Down Expand Up @@ -73,4 +75,4 @@ jobs:
path: |
*/build/reports/detekt/*.html
*/build/reports/detekt/*.md
*/build/reports/detekt/*.xml
*/build/reports/detekt/*.xml
2 changes: 1 addition & 1 deletion analytics/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ kotlin {

android {
namespace = "net.opendasharchive.openarchive.analytics"
compileSdk = 36
compileSdk = 37

defaultConfig {
minSdk = 29
Expand Down
6 changes: 4 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ android {

namespace = "net.opendasharchive.openarchive"

compileSdk = 36
compileSdk = 37

compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
Expand All @@ -66,7 +66,7 @@ android {
defaultConfig {
applicationId = "net.opendasharchive.openarchive"
minSdk = 29
targetSdk = 36
targetSdk = 37
versionCode = 30043
versionName = "4.0.5"
multiDexEnabled = true
Expand Down Expand Up @@ -108,6 +108,7 @@ android {

// Distribution dimension
create("gms") {
isDefault = true
dimension = "distribution"
buildConfigField("boolean", "IS_GMS_BUILD", "true")
buildConfigField("boolean", "IS_FOSS_BUILD", "false")
Expand All @@ -127,6 +128,7 @@ android {

// Environment dimension
create("dev") {
isDefault = true
dimension = "env"
versionNameSuffix = "-dev"
applicationIdSuffix = ".debug"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package net.opendasharchive.openarchive.core.navigation

/**
* Constants for result keys used in [ResultEventBus] and [ResultEffect].
* Constants for result keys used in [ResultEventBus] and [androidx.navigation3.runtime.result.ResultEffect].
*/
object NavigationResultKeys {
const val QR_SCAN_RESULT = "qr_scan_result"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package net.opendasharchive.openarchive.db
import android.annotation.SuppressLint
import androidx.room3.Database
import androidx.room3.RoomDatabase
import androidx.room3.TypeConverters
import androidx.room3.ColumnTypeConverters
import androidx.room3.AutoMigration
import androidx.room3.DeleteColumn
import androidx.room3.migration.AutoMigrationSpec
Expand Down Expand Up @@ -38,7 +38,7 @@ import androidx.room3.migration.AutoMigrationSpec
version = 4,
exportSchema = true
)
@TypeConverters(Converters::class)
@ColumnTypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun vaultDao(): VaultDao
abstract fun archiveDao(): ArchiveDao
Expand Down
Original file line number Diff line number Diff line change
@@ -1,46 +1,46 @@
package net.opendasharchive.openarchive.db

import androidx.room3.TypeConverter
import androidx.room3.ColumnTypeConverter
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed
import kotlinx.datetime.LocalDateTime
import kotlinx.datetime.TimeZone
import kotlinx.datetime.toInstant
import kotlinx.datetime.toLocalDateTime
import net.opendasharchive.openarchive.core.domain.VaultType
import net.opendasharchive.openarchive.core.domain.EvidenceStatus
import net.opendasharchive.openarchive.core.domain.VaultType
import kotlin.time.Instant

class Converters {
@TypeConverter
@ColumnTypeConverter
fun fromTimestamp(value: Long?): LocalDateTime? {
return value?.let {
Instant.fromEpochMilliseconds(it).toLocalDateTime(TimeZone.currentSystemDefault())
}
}

@TypeConverter
@ColumnTypeConverter
fun dateToTimestamp(date: LocalDateTime?): Long? {
return date?.toInstant(TimeZone.currentSystemDefault())?.toEpochMilliseconds()
}

@TypeConverter
@ColumnTypeConverter
fun fromVaultType(value: VaultType): Int = when (value) {
VaultType.PRIVATE_SERVER -> 0
VaultType.INTERNET_ARCHIVE -> 1
VaultType.DWEB_STORAGE -> 5
}

@TypeConverter
@ColumnTypeConverter
fun toVaultType(value: Int): VaultType = when (value) {
0 -> VaultType.PRIVATE_SERVER
1 -> VaultType.INTERNET_ARCHIVE
5 -> VaultType.DWEB_STORAGE
else -> VaultType.PRIVATE_SERVER
}

@TypeConverter
@ColumnTypeConverter
fun fromEvidenceStatus(value: EvidenceStatus): Int = value.id

@TypeConverter
@ColumnTypeConverter
fun toEvidenceStatus(value: Int): EvidenceStatus = when (value) {
0 -> EvidenceStatus.NEW
1 -> EvidenceStatus.LOCAL
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,26 @@ import androidx.room3.Relation
data class VaultWithDweb(
@Embedded val vault: VaultEntity,
@Relation(
parentColumn = "id",
entityColumn = "vaultId"
parentColumns = ["id"],
entityColumns = ["vaultId"]
)
val dwebMetadata: VaultDwebEntity?
)

data class ArchiveWithDweb(
@Embedded val archive: ArchiveEntity,
@Relation(
parentColumn = "id",
entityColumn = "archiveId"
parentColumns = ["id"],
entityColumns = ["archiveId"]
)
val dwebMetadata: ArchiveDwebEntity?
)

data class EvidenceWithDweb(
@Embedded val evidence: EvidenceEntity,
@Relation(
parentColumn = "id",
entityColumn = "evidenceId"
parentColumns = ["id"],
entityColumns = ["evidenceId"]
)
val dwebMetadata: EvidenceDwebEntity?
)
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation3.runtime.result.ResultEffect
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.collectLatest
Expand All @@ -61,7 +62,6 @@ import kotlinx.coroutines.flow.drop
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import net.opendasharchive.openarchive.core.navigation.NavigationResultKeys
import net.opendasharchive.openarchive.core.navigation.ResultEffect
import net.opendasharchive.openarchive.core.presentation.theme.DefaultBoxPreview
import net.opendasharchive.openarchive.core.repositories.MediaRepository
import net.opendasharchive.openarchive.core.repositories.ProjectRepository
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import androidx.compose.animation.slideOutHorizontally
import androidx.compose.animation.togetherWith
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
Expand All @@ -23,17 +22,16 @@ import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDe
import androidx.navigation3.runtime.NavEntryDecorator
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
import androidx.navigation3.runtime.result.rememberResultEventBus
import androidx.navigation3.runtime.result.rememberResultEventBusNavEntryDecorator
import androidx.navigation3.ui.NavDisplay
import kotlinx.coroutines.launch
import net.opendasharchive.openarchive.R
import net.opendasharchive.openarchive.analytics.api.AnalyticsManager
import net.opendasharchive.openarchive.analytics.api.session.SessionTracker
import net.opendasharchive.openarchive.core.domain.VaultType
import net.opendasharchive.openarchive.core.logger.AppLogger
import net.opendasharchive.openarchive.core.navigation.LocalResultEventBus
import net.opendasharchive.openarchive.core.navigation.NavigationResultKeys
import net.opendasharchive.openarchive.core.navigation.ResultEventBus
import net.opendasharchive.openarchive.core.navigation.rememberResultStore
import net.opendasharchive.openarchive.core.presentation.components.TextActionButton
import net.opendasharchive.openarchive.db.sugar.Space
import net.opendasharchive.openarchive.features.core.dialog.DialogHost
Expand Down Expand Up @@ -92,8 +90,7 @@ fun SaveNavGraph(
) {
val analyticsManager: AnalyticsManager = koinInject()
val sessionTracker: SessionTracker = koinInject()
val resultBus = ResultEventBus
val resultStore = rememberResultStore()
val resultBus = rememberResultEventBus()
val passcodeFlowState: PasscodeFlowState = koinInject()
val passcodeGate: PasscodeGate = koinInject()
val isLocked by passcodeGate.locked.collectAsStateWithLifecycle()
Expand Down Expand Up @@ -126,18 +123,17 @@ fun SaveNavGraph(

DialogHost(dialogManager)

CompositionLocalProvider(LocalResultEventBus provides resultBus) {

NavDisplay(
modifier = Modifier.fillMaxSize(),
backStack = navigator.backstack,
entryDecorators = listOf(
// Add the default decorators for managing scenes and saving state
rememberSaveableStateHolderNavEntryDecorator(),
// Then add the view model store decorator
rememberViewModelStoreNavEntryDecorator(),
rememberAnalyticsNavEntryDecorator(analyticsManager, sessionTracker)
),
NavDisplay(
modifier = Modifier.fillMaxSize(),
backStack = navigator.backstack,
entryDecorators = listOf(
// Add the default decorators for managing scenes and saving state
rememberSaveableStateHolderNavEntryDecorator(),
// Then add the view model store and result decorators
rememberViewModelStoreNavEntryDecorator(),
rememberResultEventBusNavEntryDecorator(resultBus),
rememberAnalyticsNavEntryDecorator(analyticsManager, sessionTracker)
),
transitionSpec = {
// Slide in from right when navigating forward
slideInHorizontally(initialOffsetX = { it }) togetherWith
Expand All @@ -153,7 +149,7 @@ fun SaveNavGraph(
slideInHorizontally(initialOffsetX = { -it }) togetherWith
slideOutHorizontally(targetOffsetX = { it })
},
entryProvider = entryProvider {
entryProvider = entryProvider {

entry<AppRoute.HomeRoute> { route ->

Expand Down Expand Up @@ -559,8 +555,7 @@ fun SaveNavGraph(
// Snowbird feature entries
snowbirdEntries(navigator)
}
)
}
)
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,14 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation3.runtime.result.ResultEffect
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import net.opendasharchive.openarchive.R
import net.opendasharchive.openarchive.core.domain.Evidence
import net.opendasharchive.openarchive.core.logger.AppLogger
import net.opendasharchive.openarchive.core.navigation.NavigationResultKeys
import net.opendasharchive.openarchive.core.navigation.ResultEffect
import net.opendasharchive.openarchive.core.presentation.media.MediaStatusOverlay
import net.opendasharchive.openarchive.core.presentation.media.MediaThumbnail
import net.opendasharchive.openarchive.core.presentation.theme.MontserratFontFamily
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation3.runtime.EntryProviderScope
import androidx.navigation3.runtime.result.LocalResultEventBus
import net.opendasharchive.openarchive.R
import net.opendasharchive.openarchive.core.navigation.NavigationResultKeys
import net.opendasharchive.openarchive.core.navigation.ResultEventBus
import net.opendasharchive.openarchive.features.main.ui.AppRoute
import net.opendasharchive.openarchive.features.main.ui.Navigator
import net.opendasharchive.openarchive.features.settings.passcode.components.DefaultScaffold
Expand Down Expand Up @@ -202,9 +202,10 @@ fun EntryProviderScope<AppRoute>.snowbirdEntries(
}

entry<AppRoute.SnowbirdQRScannerRoute> { route ->
val resultEventBus = LocalResultEventBus.current
QRScannerScreen(
onQrCodeScanned = { result ->
ResultEventBus.sendResult(
resultEventBus.sendResult(
resultKey = NavigationResultKeys.QR_SCAN_RESULT,
result = result
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation3.runtime.result.ResultEffect
import kotlinx.coroutines.flow.collectLatest
import net.opendasharchive.openarchive.R
import net.opendasharchive.openarchive.core.navigation.NavigationResultKeys
import net.opendasharchive.openarchive.core.navigation.ResultEffect
import net.opendasharchive.openarchive.core.presentation.components.LoadingOverlay
import net.opendasharchive.openarchive.core.presentation.theme.DefaultBoxPreview
import net.opendasharchive.openarchive.core.presentation.theme.DefaultScaffoldPreview
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,12 +49,12 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.core.content.FileProvider
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation3.runtime.result.ResultEffect
import kotlinx.coroutines.flow.collectLatest
import net.opendasharchive.openarchive.R
import net.opendasharchive.openarchive.core.config.AppConfig
import net.opendasharchive.openarchive.core.domain.Evidence
import net.opendasharchive.openarchive.core.navigation.NavigationResultKeys
import net.opendasharchive.openarchive.core.navigation.ResultEffect
import net.opendasharchive.openarchive.core.presentation.media.MediaThumbnail
import net.opendasharchive.openarchive.core.presentation.theme.DefaultScaffoldPreview
import net.opendasharchive.openarchive.core.presentation.theme.PreviewLight
Expand Down
Binary file modified app/src/main/jniLibs/arm64-v8a/libsave.so
Binary file not shown.
Binary file modified app/src/main/jniLibs/armeabi-v7a/libsave.so
Binary file not shown.
5 changes: 3 additions & 2 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ plugins {
alias(libs.plugins.android.library) apply false

// Kotlin
alias(libs.plugins.kotlin.android) apply false
alias(libs.plugins.kotlin.serialization) apply false
alias(libs.plugins.compose.compiler) apply false

Expand All @@ -17,8 +18,8 @@ plugins {

// Google Services - Using direct IDs instead of catalog for FOSS compatibility
// These plugins are conditionally applied in app/build.gradle.kts for GMS builds only
id("com.google.gms.google-services") version "4.4.4" apply false
id("com.google.firebase.crashlytics") version "3.0.6" apply false
id("com.google.gms.google-services") version "4.5.0" apply false
id("com.google.firebase.crashlytics") version "3.0.7" apply false
}

tasks.register<Delete>("clean") {
Expand Down
23 changes: 11 additions & 12 deletions gradle/gradle-daemon-jvm.properties
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
#This file is generated by updateDaemonJvm
toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/536afcd1dff540251f85e5d2c80458cf/redirect
toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/67a0fee3c4236b6397dcbe8575ca2011/redirect
toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/29ee363f71d060405f729a8f1b7f7aef/redirect
toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/67a0fee3c4236b6397dcbe8575ca2011/redirect
toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/10fc3bf1ee0001078a473afe6e43cfdb/redirect
toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/9c55677aff3966382f3d853c0959bfb2/redirect
toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/29ee363f71d060405f729a8f1b7f7aef/redirect
toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/67a0fee3c4236b6397dcbe8575ca2011/redirect
toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/248ffb1098f61659502d0c09aa348294/redirect
toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/ac151d55def6b6a9a159dc4cb4642851/redirect
toolchainVendor=JETBRAINS
toolchainVersion=21
toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/491f83666ae7f4d6ebb28fee72ebb035/redirect
toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/0d1a1acdc708062093673f65aa9aba4b/redirect
toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/491f83666ae7f4d6ebb28fee72ebb035/redirect
toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/0d1a1acdc708062093673f65aa9aba4b/redirect
toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/7083b89563e7ce20943037b8cd2b8cc2/redirect
toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/060bbb778a1f55ea705fdebd2ccfeab9/redirect
toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/491f83666ae7f4d6ebb28fee72ebb035/redirect
toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/0d1a1acdc708062093673f65aa9aba4b/redirect
toolchainUrl.WINDOWS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/d09679dc60fe5aa05ef7d03efdefac20/redirect
toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/ed4e3bf2f5e7c5d9aabc4cbd8acd555e/redirect
toolchainVersion=17
Loading
Loading