Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
51d197e
re-enabled webdav
Elelan Apr 11, 2025
8bd3e0d
Merge branch 'next' into feature/common-dialogs
Elelan May 2, 2025
58d01c8
Merge branch 'next' into feature/common-dialogs
Elelan May 7, 2025
fc3d95b
chore: update gradle for latest IDE
ryjen May 8, 2025
07ce958
feat: enable internal tor daemon
ryjen May 8, 2025
5e412b0
ui changes for dweb ui
Elelan May 11, 2025
14e9afd
feat: orbot proxy enhancements
ryjen May 11, 2025
2ee4374
refactor(gdrive,tor): separate files for gdrive refactor, untested
ryjen May 11, 2025
c90216c
chore(tor): cleanup from refactor
ryjen May 11, 2025
e020f23
WIP: Add refresh group functionality and update logging format
Elelan May 23, 2025
8a28c6d
Dweb link included in main activity drawer menu
Elelan May 23, 2025
9181064
dweb refresh api
Elelan Jun 3, 2025
62f9800
Merge branch 'next' into feature/tor-upload-updates
ryjen Jun 5, 2025
8c22493
chore: remove unused activity
ryjen Jun 5, 2025
7525641
fix(tor): add starting status to settings
ryjen Jun 5, 2025
b74b6cb
fix(orbot): refactor to harden
ryjen Jun 8, 2025
cb23f25
fix(settings): ensure extra orbot controls show when enabled
ryjen Jun 8, 2025
8ea5949
di: add missing module
ryjen Jun 8, 2025
a330ffe
fix(tor): add orbot callbacks to viewmodel initializer
ryjen Jun 8, 2025
5dd3662
Merge pull request #678 from OpenArchive/feature/next-orbot
prathieshna Jun 10, 2025
b8a33b0
Removed "Tor is disabled" pop-up
Elelan Jun 10, 2025
8140b5d
Merge pull request #679 from OpenArchive/bug/tor-not-availabe-dialog-…
prathieshna Jun 10, 2025
d18c9f9
fix(settings): update UI for Tor button and preferences layout
Elelan Jun 11, 2025
775f78d
fix(build): update versionCode to 30008 and gradle distribution to 8.…
Elelan Jun 11, 2025
dd01266
fix(settings): add defaultValue attribute to SwitchPreferenceCompat i…
Elelan Jun 11, 2025
a587b13
Merge pull request #680 from OpenArchive/bugFix/settings-screen-tor-b…
Elelan Jun 11, 2025
556ffd2
Merge remote-tracking branch 'origin/next' into feature/dweb-ui
Elelan Jun 12, 2025
a8910f2
fix(service): enhance connection notification to include attempt number
Elelan Jun 13, 2025
c01be38
Revert "Merge remote-tracking branch 'origin/next' into feature/dweb-ui"
Jul 18, 2025
e34d08f
Merge remote-tracking branch 'origin/next' into feature/dweb-ui
Elelan Jul 18, 2025
b7b404f
feat: added missing InAppReviewHelper class
Elelan Jul 21, 2025
2e412bc
added more logs to snowbird connection
Elelan Jul 21, 2025
d7dd739
Updated Naming
Aug 14, 2025
1799617
Merge remote-tracking branch 'origin/next' into feature/dweb-ui
Elelan Aug 14, 2025
dfa3fc8
fix: update content descriptions and notification channel names for c…
Elelan Aug 14, 2025
5bb8553
Updated the name to DWeb Storage
Aug 15, 2025
0c1752a
fix for dweb file upload using retrofit
Elelan Sep 3, 2025
07c7ec6
Merge remote-tracking branch 'origin/next' into feature/dweb-next
Elelan Sep 3, 2025
b2d5d42
dweb merged with next
Elelan Sep 3, 2025
c67cbc0
Merge branch 'feature/ia-cc-license' into feature/dweb-next
Elelan Sep 3, 2025
33af019
dweb increased timeouts
Elelan Sep 3, 2025
35941bc
added dweb qr code scanning from gallery
Elelan Sep 3, 2025
96bfa30
Updating the logo of DWEB Logo
Sep 4, 2025
1c48182
Replaced remaining snowbird logos with dweb ones
Elelan Sep 4, 2025
ca6a53d
Merge branch 'feature/ia-cc-license' into feature/dweb-next
Elelan Sep 4, 2025
604c4e0
removed unused snowbird logo
Elelan Sep 4, 2025
aa57f3f
Merge branch 'feature/ia-cc-license' into feature/dweb-next
Elelan Sep 4, 2025
a31ede9
Merge branch 'feature/ia-cc-license' into feature/dweb-next
Elelan Sep 5, 2025
f1f525f
Merge branch 'next' into feature/dweb-next
Elelan Sep 10, 2025
f55fdf6
Merge branch 'next' into feature/dweb-next
Elelan Sep 11, 2025
46964a8
Merge branch 'next' into feature/dweb-next
Elelan Sep 15, 2025
7a80c51
- renamed navgraph just like in next branch
Elelan Sep 15, 2025
468badd
organized gradle files and version catalog
Elelan Nov 18, 2025
461187d
Merge branch 'next' into feature/dweb-next
Elelan Nov 18, 2025
61d87d1
fixed merge issues
Elelan Nov 18, 2025
57d5714
Merge branch 'next' into feature/dweb-next
Elelan Nov 26, 2025
0fd8712
Merge branch 'next' into feature/dweb-next
Elelan Dec 1, 2025
1c8242d
Merge branch 'next' into feature/dweb-next
Elelan Dec 2, 2025
5fa29cc
Merge branch 'next' into feature/dweb-next
Elelan Dec 2, 2025
9586424
fix: update room library version to 2.8.4
Elelan Dec 2, 2025
f7739c5
fix: update ZXing library versions in build configuration
Elelan Dec 2, 2025
ee941f3
updated save-rust lib
Elelan Dec 3, 2025
b17bf86
refactor: migrate Snowbird fragments to extend BaseSnowbirdFragment
Elelan Dec 3, 2025
1bb5e0a
feat: add DWeb server control to SnowbirdFragment and update service …
Elelan Dec 4, 2025
e7fa057
Merge pull request #746 from OpenArchive/feature/dweb-next
Elelan Dec 4, 2025
3345c19
Merge branch 'next' into feature/dweb-next
Elelan Dec 5, 2025
c588420
removed unused import and code cleanup
Elelan Dec 5, 2025
8062062
Merge branch 'next' into stage/dweb-next-merge
Elelan Dec 5, 2025
8b6f52b
Merge branch 'feature/dweb-next' into stage/dweb-next-merge
Elelan Dec 5, 2025
b23b2e8
disabled dweb and removed libsave.so file to merge to next
Elelan Dec 5, 2025
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: 2 additions & 2 deletions analytics/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
plugins {
id("com.android.library")
id("org.jetbrains.kotlin.android")
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
}

kotlin {
Expand Down
15 changes: 15 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ plugins {
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.ksp)
alias(libs.plugins.navigation.safeargs)
alias(libs.plugins.androidx.room)
alias(libs.plugins.detekt.plugin)
alias(libs.plugins.google.gms.google.services)
alias(libs.plugins.google.firebase.crashlytics)
Expand Down Expand Up @@ -153,6 +154,10 @@ android {
exclude(group = "org.bouncycastle", module = "bcprov-jdk15on")
}
}

room {
schemaDirectory("$projectDir/schemas")
}
}

dependencies {
Expand Down Expand Up @@ -215,6 +220,11 @@ dependencies {
implementation(libs.androidx.security.crypto)
implementation(libs.androidx.work)

// Room Database
implementation(libs.androidx.room.runtime)
implementation(libs.androidx.room.ktx)
ksp(libs.androidx.room.compiler)

// Dependency Injection - Koin
implementation(libs.koin.core)
implementation(libs.koin.android)
Expand All @@ -229,6 +239,7 @@ dependencies {
implementation(libs.okhttp.logging)
implementation(libs.retrofit)
implementation(libs.retrofit.gson)
implementation(libs.retrofit.kotlinx.serialization)
implementation(libs.guardianproject.sardine)

// Images & Media
Expand Down Expand Up @@ -288,6 +299,10 @@ dependencies {
exclude(group = "com.squareup.okio", module = "okio")
}

// Barcode Scanning
implementation(libs.zxing.core)
implementation(libs.zxing.android.embedded)

// Utilities
implementation(libs.timber)
implementation(libs.gson)
Expand Down
17 changes: 9 additions & 8 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<!-- <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />-->
<!-- <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />-->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Expand Down Expand Up @@ -130,11 +130,11 @@
android:taskAffinity=""
android:theme="@style/SaveAppTheme.NoActionBar" />

<!-- <activity-->
<!-- android:name=".features.main.QRScannerActivity"-->
<!-- android:screenOrientation="portrait"-->
<!-- android:theme="@style/zxing_CaptureTheme"-->
<!-- android:windowSoftInputMode="stateAlwaysHidden" />-->
<activity
android:name=".features.main.QRScannerActivity"
android:screenOrientation="portrait"
android:theme="@style/zxing_CaptureTheme"
android:windowSoftInputMode="stateAlwaysHidden" />

<activity
android:name=".features.media.ReviewActivity"
Expand Down Expand Up @@ -209,9 +209,10 @@

<meta-data
android:name="VERSION"
android:value="37" />
android:value="38" />
<!-- NOTE: Please do not write migrations for added columns, as they are not needed.-->
<!-- Only upgrade the version number when you add a new column.-->
<!-- Version 38: Added 'hash' column to SNOWBIRD_REPO table-->
<!-- migration sql causing duplicate column error:-->
<!-- https://github.com/chennaione/sugar/issues/713 -->

Expand Down
5 changes: 5 additions & 0 deletions app/src/main/assets/dweb/dweb_create_group_response.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"key": "A7c3ei6lejlBN3LIqHVOLbLwaICMVa1M1xbvNxvXB2o",
"name": "my grp",
"uri": "save+dweb::?dht=03b7377a2ea57a39413772c8a8754e2db2f068808c55ad4cd716ef371bd7076a&enc=c2157baf9f64ebd61aff7a204571bd97887d3c72706c1eb3622c8fbb98f67161&pk=cf3a57211dca6a993e8c2b322d50193d940baaed0eca5f17d1e02f41d6d8d7af&sk=85f46f8f3a4231210fc648b2a8ee4e71324190853b0df22381accc325392d191"
}
5 changes: 5 additions & 0 deletions app/src/main/assets/dweb/dweb_create_repo_response.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"key": "1KHp86Sv5asv7DWdCoXL6LmhLAvVOYOpQ-4EvmScXFM",
"name": "prathie",
"can_write": true
}
9 changes: 9 additions & 0 deletions app/src/main/assets/dweb/dweb_fetch_groups_response.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"groups": [
{
"key": "yvClq1HZNqD2y9tHH-7pYBcUZBUjFoNZ3OcvzbszlOM",
"name": "SaveWeb",
"uri": "save+dweb::?dht=caf0a5ab51d936a0f6cbdb471feee9601714641523168359dce72fcdbb3394e3&enc=5af9ad74efce749b9b2bed692ecb16f71016729a6b11ea021d20f5f9186a1a7d&pk=0f083d9391c5bddf199320014abc9ab3f5b51c9e41adf97c0261e5be6b1ba41d&sk=e1525c792b78cd3aca849b3e2a1b6d3f7e08dd9339f3e872513b88400196c398"
}
]
}
14 changes: 14 additions & 0 deletions app/src/main/assets/dweb/dweb_fetch_medias_response.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"files": [
{
"hash": "4wtxbdhr7qcvfyha2joslvgfp237qmbvbab5hxr4q4te6w4ktkxq",
"is_downloaded": true,
"name": "download.jpeg"
},
{
"hash": "igibt6thvtgvzlh5dzigfjccbhxgvrejed4whcqucdftyu4d4zua",
"is_downloaded": true,
"name": "1747903650390.jpg"
}
]
}
14 changes: 14 additions & 0 deletions app/src/main/assets/dweb/dweb_fetch_repos_response.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"repos": [
{
"can_write": false,
"key": "qPV1BjzjsomQa67_jNk0n4elKMa-c9FMSfs_FygHNWs",
"name": "Prathie"
},
{
"can_write": true,
"key": "_HP0fgWIA8gnibdSH37_akFwNs0goZz_bZN4AZk41hE",
"name": "Elelan"
}
]
}
78 changes: 78 additions & 0 deletions app/src/main/assets/dweb/dweb_refresh_response.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
[
{
"repos": [
{
"all_files": [
"1747903650390.jpg",
"download.jpeg"
],
"can_write": true,
"name": "Elelan",
"refreshed_files": [],
"repo_hash": "wiuab7ulsfa4zhvim4fymp4xeyzec5kofjsxombq5vkhvx6z5voa",
"repo_id": "Snti-GUoge16L1V00oQ86BppenuZ5OvA40k5LxbPNQA"
},
{
"all_files": [],
"can_write": false,
"error": "Error getting repo hash from DHT: Unable to get DHT value for repo root hash",
"name": "Prathie",
"refreshed_files": [],
"repo_id": "WuXDAzC2mBlEKjrTdctrDt8KASSfHwjspGgIqOXAFpc"
}
],
"status": "success"
},
{
"repos": [
{
"all_files": [
"download.jpeg",
"1747903650390.jpg"
],
"can_write": true,
"name": "Elelan",
"refreshed_files": [],
"repo_hash": "jyr2k2xbzwei3ueopuhzoeu7kj6mouezoivxarxe4sez6nk27sca",
"repo_id": "_HP0fgWIA8gnibdSH37_akFwNs0goZz_bZN4AZk41hE"
},
{
"all_files": [
"IMG-20250527-WA0002.jpg"
],
"can_write": false,
"name": "Prathie",
"refreshed_files": [
"IMG-20250527-WA0002.jpg"
],
"repo_hash": "47rm2mhbxxnvdj2sodqhztykaehf3aaub5mopvoe25rzv6rxx24q",
"repo_id": "qPV1BjzjsomQa67_jNk0n4elKMa-c9FMSfs_FygHNWs"
}
],
"status": "success"
},
{
"repos": [
{
"all_files": [
"1747903650390.jpg",
"download.jpeg"
],
"can_write": false,
"name": "Elelan",
"refreshed_files": [],
"repo_hash": "jyr2k2xbzwei3ueopuhzoeu7kj6mouezoivxarxe4sez6nk27sca",
"repo_id": "qY00DJlYIQyPoCJt_EJZz7QhJqzQJqcpnYB23OPAWEs"
},
{
"all_files": [],
"can_write": true,
"error": "Error getting repo hash from DHT: Unable to get DHT value for repo root hash",
"name": "Upul",
"refreshed_files": [],
"repo_id": "Qa1DGd8PX_zU6X3SFubR1oMKklJw7zAGWiVhgvGkRuI"
}
],
"status": "success"
}
]
4 changes: 2 additions & 2 deletions app/src/main/java/net/opendasharchive/openarchive/SaveApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -141,13 +141,13 @@ class SaveApp : SugarApp(), SingletonImageLoader.Factory, DefaultLifecycleObserv
private fun createSnowbirdNotificationChannel() {
val silentChannel = NotificationChannel(
SNOWBIRD_SERVICE_CHANNEL_SILENT,
"Raven Service",
"Dweb Storage",
NotificationManager.IMPORTANCE_LOW
)

val chimeChannel = NotificationChannel(
SNOWBIRD_SERVICE_CHANNEL_CHIME,
"Raven Service",
"Dweb Storage",
NotificationManager.IMPORTANCE_DEFAULT
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,19 +26,34 @@
// TODO: have some registry of feature modules


single<ISnowbirdFileRepository> { SnowbirdFileRepository(get(named("retrofit"))) }

Check warning

Code scanning / detekt

Multiple occurrences of the same string literal within a single file detected. Prefer extracting the string literal into a property or constant. Warning

Multiple occurrences of the same string literal within a single file detected. Prefer extracting the string literal into a property or constant.
single<ISnowbirdGroupRepository> { SnowbirdGroupRepository(get(named("retrofit"))) }
single<ISnowbirdRepoRepository> { SnowbirdRepoRepository(get(named("retrofit"))) }

// single<ISnowbirdFileRepository> { SnowbirdFileRepository(get(named("unixSocket"))) }
// single<ISnowbirdGroupRepository> { SnowbirdGroupRepository(get(named("unixSocket"))) }
// single<ISnowbirdRepoRepository> { SnowbirdRepoRepository(get(named("unixSocket"))) }

// single<ISnowbirdFileRepository> { SnowbirdFileRepository(get(named("retrofit"))) }
// single<ISnowbirdGroupRepository> { SnowbirdGroupRepository(get(named("retrofit"))) }
// single<ISnowbirdRepoRepository> { SnowbirdRepoRepository(get(named("retrofit"))) }
viewModel { (application: Application) ->
SnowbirdGroupViewModel(
application = application,
repository = get()
)
}

single<ISnowbirdFileRepository> { SnowbirdFileRepository(get(named("unixSocket"))) }
single<ISnowbirdGroupRepository> { SnowbirdGroupRepository(get(named("unixSocket"))) }
single<ISnowbirdRepoRepository> { SnowbirdRepoRepository(get(named("unixSocket"))) }
viewModel { (application: Application) -> SnowbirdGroupViewModel(application, get()) }
viewModel { (application: Application) -> SnowbirdFileViewModel(application, get()) }
viewModel { (application: Application) -> SnowbirdRepoViewModel(application, get()) }
viewModel { (application: Application) ->
SnowbirdFileViewModel(
application = application,
repository = get()
)
}

viewModel { (application: Application) ->
SnowbirdRepoViewModel(
application = application,
repository = get()
)
}

viewModelOf(::SpaceListViewModel)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
package net.opendasharchive.openarchive.core.di

import android.content.Context
import kotlinx.serialization.json.Json
import net.opendasharchive.openarchive.services.snowbird.service.ISnowbirdAPI
import net.opendasharchive.openarchive.services.snowbird.service.RetrofitAPI
import net.opendasharchive.openarchive.services.snowbird.service.RetrofitClient
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import org.koin.core.qualifier.named
import org.koin.dsl.module
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.converter.kotlinx.serialization.asConverterFactory
import java.util.concurrent.TimeUnit

val retrofitModule = module {
Expand All @@ -33,7 +35,7 @@ val retrofitModule = module {
Retrofit.Builder()
.baseUrl("http://localhost:8080/api/")
.client(get<OkHttpClient>())
.addConverterFactory(GsonConverterFactory.create())
.addConverterFactory(Json.asConverterFactory("application/json; charset=UTF8".toMediaType()))
.build()
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package net.opendasharchive.openarchive.db

Check warning

Code scanning / detekt

Detects missing final newlines Warning

File must end with a newline (\n)

import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

@Serializable
data class RefreshGroupResponse(

Check warning

Code scanning / detekt

The data classes are bad for the binary compatibility in public APIs. Avoid to use it. Warning

The data classes are bad for the binary compatibility in public APIs. Avoid to use it.
val status: String,
@SerialName("repos")
val refreshedRepos: List<RefreshedRepo>
) : SerializableMarker

Check warning

Code scanning / detekt

Library classes should not be public. Warning

Class RefreshGroupResponse should not be public


@Serializable

Check warning

Code scanning / detekt

Reports consecutive blank lines Warning

Needless blank line(s)
data class RefreshedRepo(

Check warning

Code scanning / detekt

The data classes are bad for the binary compatibility in public APIs. Avoid to use it. Warning

The data classes are bad for the binary compatibility in public APIs. Avoid to use it.
@SerialName("repo_id")
val repoId: String,
@SerialName("repo_hash")
val hash: String? = null,
val name: String,
@SerialName("can_write")
val canWrite: Boolean,
@SerialName("all_files")
val allFiles: List<String>,
@SerialName("refreshed_files")
val refreshedFiles: List<String>,
@SerialName("error")
val error: String? = null,
)

Check warning

Code scanning / detekt

Library classes should not be public. Warning

Class RefreshedRepo should not be public

fun RefreshedRepo.toRepo(): SnowbirdRepo {
return SnowbirdRepo(
key = repoId,
name = name,
hash = hash,
permissions = if (canWrite) "READ_WRITE" else "READ_ONLY",
createdAt = null, // No createdAt in this response
)
}

Check warning

Code scanning / detekt

Library classes should not be public. Warning

Top level function toRepo should not be public

Check warning

Code scanning / detekt

Checks whether files end with a line separator. Warning

The file /home/runner/work/Save-app-android/Save-app-android/app/src/main/java/net/opendasharchive/openarchive/db/RefreshGroupResponse.kt is not ending with a new line.
Loading