Skip to content

Commit 1537d63

Browse files
committed
Much dweb work
1 parent 4f22523 commit 1537d63

File tree

80 files changed

+1429
-629
lines changed

Some content is hidden

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

80 files changed

+1429
-629
lines changed

app/build.gradle.kts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ dependencies {
101101
implementation("androidx.camera:camera-lifecycle:${cameraxVersion}")
102102
implementation("androidx.camera:camera-view:${cameraxVersion}")
103103

104-
val navigationVersion = "2.8.2"
104+
val navigationVersion = "2.8.3"
105105
implementation("androidx.navigation:navigation-compose:$navigationVersion")
106106
implementation("androidx.navigation:navigation-fragment-ktx:$navigationVersion")
107107
implementation("androidx.navigation:navigation-ui-ktx:$navigationVersion")
@@ -133,12 +133,12 @@ dependencies {
133133
implementation("androidx.preference:preference-ktx:1.2.1")
134134
implementation("androidx.multidex:multidex:2.0.1")
135135

136-
val composeVersion = "1.7.3"
136+
val composeVersion = "1.7.4"
137137
implementation("androidx.compose.ui:ui:$composeVersion")
138138
implementation("androidx.compose.foundation:foundation:$composeVersion")
139139
implementation("androidx.compose.ui:ui-tooling-preview:$composeVersion")
140140
implementation("androidx.compose.material:material-icons-extended:$composeVersion")
141-
implementation("androidx.activity:activity-compose:1.9.2")
141+
implementation("androidx.activity:activity-compose:1.9.3")
142142

143143
val koinVersion = "3.5.3"
144144
implementation("io.insert-koin:koin-core:$koinVersion")
@@ -212,8 +212,9 @@ dependencies {
212212
implementation("com.google.android.play:feature-delivery:2.1.0")
213213
implementation("com.google.android.play:feature-delivery-ktx:2.1.0")
214214

215-
implementation("com.google.android.play:review:2.0.1")
216-
implementation("com.google.android.play:review-ktx:2.0.1")
215+
val playVersion = "2.0.2"
216+
implementation("com.google.android.play:review:$playVersion")
217+
implementation("com.google.android.play:review-ktx:$playVersion")
217218

218219
implementation("com.google.android.play:app-update:2.1.0")
219220
implementation("com.google.android.play:app-update-ktx:2.1.0")
@@ -260,7 +261,7 @@ dependencies {
260261
// implementation("androidx.compose.material3:material3-window-size-class")
261262

262263
// Optional - Integration with activities
263-
implementation("androidx.activity:activity-compose:1.9.2")
264+
implementation("androidx.activity:activity-compose:1.9.3")
264265
// Optional - Integration with ViewModels
265266
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.8.6")
266267
// Optional - Integration with LiveData

app/src/androidTest/java/net/opendasharchive/openarchive/features/main/StartTest.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import kotlinx.coroutines.test.runTest
77
import kotlinx.serialization.json.Json
88
import net.opendasharchive.openarchive.db.ApiError
99
import net.opendasharchive.openarchive.db.SnowbirdRepo
10+
import net.opendasharchive.openarchive.extensions.getQueryParameter
1011
import net.opendasharchive.openarchive.services.snowbird.ApiResponse
1112
import org.junit.Assert
1213
import org.junit.Test
@@ -31,12 +32,18 @@ class StartTest {
3132
Assert.assertEquals("net.opendasharchive.openarchive.debug", appContext.packageName)
3233
}
3334

34-
@Test
3535
fun testCreateRepo() = runTest {
3636
val result = parseSnowbirdRepoResponse("blrSIdKPpLPlfJI6M9bTQFjW9BlnwboPzLQ-GPlJsGw", "r1")
3737
assertEquals(ApiResponse.SingleResponse(repo), result)
3838
}
3939

40+
@Test
41+
fun testCustomUri() = runTest {
42+
val uriString = "save+dweb::?dht=23571b8507645d9b5548fcd56ee088f7471e553a60d7b88d43edc6f4d1b7b59b&enc=054fd93e697963a660feaa1d4a0ec76083155f1270e24bb4c1eb3eb491d6c838&pk=bc33f7ceb83f45c4f6bf520417d1466271f4837b63d55aaab527c13e38ff78d3&sk=80431bbbb73d8204050259edd3dc0c438833e3b3f47f41d7600f1fb1552b1210&name=Pixel+6+Group"
43+
val name = uriString.getQueryParameter("name")
44+
assertEquals("Not dissecting URI strings correctly", "Pixel 6 Group", name)
45+
}
46+
4047
@Suppress("SameParameterValue")
4148
private fun parseSnowbirdRepoResponse(groupKey: String, repoName: String): ApiResponse<SnowbirdRepo> {
4249
val client = UnixSocketClient()

app/src/main/java/net/opendasharchive/openarchive/SaveApp.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,11 @@ package net.opendasharchive.openarchive
33
import android.app.NotificationChannel
44
import android.app.NotificationManager
55
import android.content.Context
6+
import android.util.Log
67
import androidx.multidex.MultiDex
8+
import coil.Coil
9+
import coil.ImageLoader
10+
import coil.util.Logger
711
import com.orm.SugarApp
812
import net.opendasharchive.openarchive.core.di.coreModule
913
import net.opendasharchive.openarchive.core.di.featuresModule
@@ -39,6 +43,18 @@ class SaveApp : SugarApp() {
3943
Timber.plant(Timber.DebugTree())
4044
}
4145

46+
val imageLoader = ImageLoader.Builder(this)
47+
.logger(object : Logger {
48+
override var level = Log.VERBOSE
49+
50+
override fun log(tag: String, priority: Int, message: String?, throwable: Throwable?) {
51+
Timber.tag("Coil").log(priority, throwable, message)
52+
}
53+
})
54+
.build()
55+
56+
Coil.setImageLoader(imageLoader)
57+
4258
Analytics.init(this)
4359

4460
Prefs.load(this)

app/src/main/java/net/opendasharchive/openarchive/core/di/FeaturesModule.kt

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@ import net.opendasharchive.openarchive.features.internetarchive.internetArchiveM
1212
import net.opendasharchive.openarchive.features.main.UnixSocketClient
1313
import net.opendasharchive.openarchive.features.main.ui.MediaGridViewModel
1414
import net.opendasharchive.openarchive.services.snowbird.ISnowbirdAPI
15+
import net.opendasharchive.openarchive.services.snowbird.ISnowbirdFileRepository
1516
import net.opendasharchive.openarchive.services.snowbird.ISnowbirdGroupRepository
16-
import net.opendasharchive.openarchive.services.snowbird.ISnowbirdMediaRepository
1717
import net.opendasharchive.openarchive.services.snowbird.ISnowbirdRepoRepository
1818
import net.opendasharchive.openarchive.services.snowbird.SnowbirdAPI
19+
import net.opendasharchive.openarchive.services.snowbird.SnowbirdFileRepository
20+
import net.opendasharchive.openarchive.services.snowbird.SnowbirdFileViewModel
1921
import net.opendasharchive.openarchive.services.snowbird.SnowbirdGroupRepository
2022
import net.opendasharchive.openarchive.services.snowbird.SnowbirdGroupViewModel
21-
import net.opendasharchive.openarchive.services.snowbird.SnowbirdMediaRepository
2223
import net.opendasharchive.openarchive.services.snowbird.SnowbirdRepoRepository
2324
import net.opendasharchive.openarchive.services.snowbird.SnowbirdRepoViewModel
2425
import net.opendasharchive.openarchive.services.tor.ITorRepository
@@ -33,21 +34,22 @@ import org.koin.dsl.module
3334

3435
val featuresModule = module {
3536
includes(internetArchiveModule)
36-
single<ISnowbirdAPI> { SnowbirdAPI(get()) }
37+
single<ISnowbirdAPI> { SnowbirdAPI(get(), get()) }
3738
single { UnixSocketClient() }
3839
single { TorForegroundService() }
3940
single { MediaUploadRepository(MediaUploadManager) }
4041
single<IFolderRepository> { FolderRepository() }
4142
single<ICollectionRepository> { CollectionRepository() }
4243
single<IMediaRepository> { MediaRepository() }
43-
single<ISnowbirdMediaRepository> { SnowbirdMediaRepository(get()) }
44+
single<ISnowbirdFileRepository> { SnowbirdFileRepository(get()) }
4445
single<ISnowbirdGroupRepository> { SnowbirdGroupRepository(get()) }
4546
single<ISnowbirdRepoRepository> { SnowbirdRepoRepository(get()) }
4647
single<ITorRepository> { TorRepository(get()) }
47-
viewModel { (app: Application) -> TorViewModel(app, get()) }
48+
viewModel { (application: Application) -> TorViewModel(application, get()) }
4849
viewModel { MediaGridViewModel(get(), get()) }
4950
viewModel { MediaActionsViewModel(get()) }
5051
viewModel { MediaUploadStatusViewModel(get()) }
51-
viewModel { SnowbirdGroupViewModel(get()) }
52-
viewModel { SnowbirdRepoViewModel(get()) }
52+
viewModel { (application: Application) -> SnowbirdGroupViewModel(application, get()) }
53+
viewModel { (application: Application) -> SnowbirdFileViewModel(application, get()) }
54+
viewModel { (application: Application) -> SnowbirdRepoViewModel(application, get()) }
5355
}

app/src/main/java/net/opendasharchive/openarchive/db/ApiError.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ sealed class ApiError: SerializableMarker {
3434
val friendlyMessage: String
3535
get() = when (this) {
3636
is HttpError -> "HTTP Error $code: $message"
37-
is NetworkError -> "Network Error: $message"
38-
is ServerError -> "Server Error: $message"
37+
is NetworkError -> message
38+
is ServerError -> message
3939
is ClientError -> message
4040
is UnexpectedError -> message
4141
Unauthorized -> "Unauthorized: Please log in and try again"

app/src/main/java/net/opendasharchive/openarchive/db/Backend.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ data class Backend(
7676

7777
companion object {
7878
val ALL_BACKENDS = listOf(
79-
Backend(Backend.Type.INTERNET_ARCHIVE),
79+
// Backend(Backend.Type.INTERNET_ARCHIVE),
8080
Backend(Backend.Type.WEBDAV),
8181
Backend(Backend.Type.GDRIVE),
8282
Backend(Backend.Type.SNOWBIRD),
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package net.opendasharchive.openarchive.db
2+
3+
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
5+
6+
@Serializable
7+
data class FileUploadResult (
8+
var name: String,
9+
@SerialName("updated_collection_hash") var updatedCollectionHash: String
10+
) : SerializableMarker
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package net.opendasharchive.openarchive.db
2+
3+
import kotlinx.serialization.Serializable
4+
5+
@Serializable
6+
data class JoinGroupResponse(
7+
val group: SnowbirdGroup
8+
): SerializableMarker

app/src/main/java/net/opendasharchive/openarchive/db/MediaViewHolder.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ import net.opendasharchive.openarchive.R
2727
import net.opendasharchive.openarchive.databinding.RvMediaBoxSmallBinding
2828
import net.opendasharchive.openarchive.databinding.RvMediaRowSmallBinding
2929
import net.opendasharchive.openarchive.extensions.uriToPath
30-
import net.opendasharchive.openarchive.util.extensions.hide
31-
import net.opendasharchive.openarchive.util.extensions.show
30+
import net.opendasharchive.openarchive.extensions.hide
31+
import net.opendasharchive.openarchive.extensions.show
3232
import timber.log.Timber
3333
import java.io.InputStream
3434
import kotlin.math.roundToInt
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package net.opendasharchive.openarchive.db
2+
3+
import android.database.sqlite.SQLiteException
4+
import com.orm.SugarRecord
5+
import kotlinx.serialization.SerialName
6+
import kotlinx.serialization.Serializable
7+
import kotlinx.serialization.Transient
8+
9+
@Serializable
10+
data class SnowbirdFileList(
11+
var files: List<SnowbirdFileItem>
12+
) : SerializableMarker
13+
14+
@Serializable
15+
data class SnowbirdFileItem(
16+
var hash: String = "",
17+
var name: String = "",
18+
@Transient var groupKey: String = "",
19+
@Transient var repoKey: String = "",
20+
@SerialName("is_downloaded") var isDownloaded: Boolean = false
21+
): SugarRecord(), SerializableMarker {
22+
companion object {
23+
fun clear() {
24+
try {
25+
deleteAll(SnowbirdFileItem::class.java)
26+
} catch (e: SQLiteException) {
27+
// Probably because table doesn't exist. Ignore.
28+
}
29+
}
30+
31+
fun findBy(groupKey: String, repoKey: String): List<SnowbirdFileItem> {
32+
val whereClause = "GROUP_KEY = ? AND REPO_KEY = ?"
33+
val whereArgs = mutableListOf(groupKey, repoKey)
34+
35+
val items = find(
36+
SnowbirdFileItem::class.java,
37+
whereClause,
38+
whereArgs.toTypedArray(),
39+
null,
40+
null,
41+
null)
42+
43+
return items
44+
}
45+
}
46+
47+
fun saveWith(groupKey: String, repoKey: String) {
48+
this.groupKey = groupKey
49+
this.repoKey = repoKey
50+
save()
51+
}
52+
}
53+
54+

app/src/main/java/net/opendasharchive/openarchive/db/SnowbirdGroup.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.opendasharchive.openarchive.db
22

3+
import android.database.sqlite.SQLiteException
34
import com.orm.SugarRecord
45
import kotlinx.serialization.Serializable
56

@@ -15,6 +16,14 @@ data class SnowbirdGroup(
1516
var uri: String? = null
1617
) : SugarRecord(), SerializableMarker {
1718
companion object {
19+
fun clear() {
20+
try {
21+
deleteAll(SnowbirdGroup::class.java)
22+
} catch (e: SQLiteException) {
23+
// Probably because table doesn't exist. Ignore.
24+
}
25+
}
26+
1827
fun getAll(): List<SnowbirdGroup> {
1928
return findAll(SnowbirdGroup::class.java).asSequence().toList()
2029
}

app/src/main/java/net/opendasharchive/openarchive/db/SnowbirdMediaItem.kt

Lines changed: 0 additions & 14 deletions
This file was deleted.

app/src/main/java/net/opendasharchive/openarchive/db/SnowbirdRepo.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,24 @@ data class SnowbirdRepoList(
1212
data class SnowbirdRepo(
1313
var key: String = "",
1414
var name: String? = null,
15-
var snowbirdGroup: SnowbirdGroup? = null
15+
var groupKey: String = ""
1616
) : SugarRecord(), SerializableMarker {
1717
companion object {
18+
fun clear(groupKey: String) {
19+
val whereClause = "GROUP_KEY = ?"
20+
21+
deleteAll(SnowbirdRepo::class.java, whereClause, groupKey)
22+
}
23+
1824
fun getAll(): List<SnowbirdRepo> {
1925
return findAll(SnowbirdRepo::class.java).asSequence().toList()
2026
}
2127

2228
fun getAllFor(group: SnowbirdGroup?): List<SnowbirdRepo> {
2329
if (group == null) return emptyList()
2430

25-
val whereClause = "snowbird_group = ?"
26-
val whereArgs = mutableListOf(group.id.toString())
31+
val whereClause = "GROUP_KEY = ?"
32+
val whereArgs = mutableListOf(group.key)
2733

2834
return find(
2935
SnowbirdRepo::class.java, whereClause, whereArgs.toTypedArray(),
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,21 @@
11
package net.opendasharchive.openarchive.extensions
22

33
import android.app.Application
4+
import androidx.activity.ComponentActivity
5+
import androidx.lifecycle.AndroidViewModel
46
import androidx.lifecycle.ViewModel
57
import org.koin.android.ext.android.getKoin
68
import org.koin.core.parameter.parametersOf
9+
import org.koin.androidx.viewmodel.ext.android.viewModel
710

811
inline fun <reified T : ViewModel> Application.getViewModel(vararg parameters: Any): T {
912
return getKoin().get { parametersOf(*parameters) }
13+
}
14+
15+
inline fun <reified T : AndroidViewModel> androidx.fragment.app.Fragment.androidViewModel(): Lazy<T> {
16+
return viewModel { parametersOf(requireActivity().application) }
17+
}
18+
19+
inline fun <reified T : AndroidViewModel> ComponentActivity.androidViewModel(): Lazy<T> {
20+
return viewModel { parametersOf(application) }
1021
}

app/src/main/java/net/opendasharchive/openarchive/util/extensions/Context.kt renamed to app/src/main/java/net/opendasharchive/openarchive/extensions/ContextExtensions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.opendasharchive.openarchive.util.extensions
1+
package net.opendasharchive.openarchive.extensions
22

33
import android.content.ActivityNotFoundException
44
import android.content.Context

app/src/main/java/net/opendasharchive/openarchive/util/extensions/Drawable.kt renamed to app/src/main/java/net/opendasharchive/openarchive/extensions/DrawableExtensions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.opendasharchive.openarchive.util.extensions
1+
package net.opendasharchive.openarchive.extensions
22

33
import android.content.Context
44
import android.graphics.PorterDuff

app/src/main/java/net/opendasharchive/openarchive/util/extensions/PackageManager.kt renamed to app/src/main/java/net/opendasharchive/openarchive/extensions/PackageManagerExtensions.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.opendasharchive.openarchive.util.extensions
1+
package net.opendasharchive.openarchive.extensions
22

33
import android.content.pm.PackageManager
44
import android.os.Build

0 commit comments

Comments
 (0)