Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
4f9ffe3
Extract send files usecase
mdrlzy Sep 22, 2025
efad2cd
Extract receive files usecase
mdrlzy Sep 22, 2025
b2ad1ab
Refactor ProfileRepository
mdrlzy Sep 26, 2025
1801ad2
Add Room database, refactor HistoryRepository
mdrlzy Sep 28, 2025
4dd846f
Add viewmodels
mdrlzy Oct 2, 2025
373f761
Refactor send screen
mdrlzy Oct 29, 2025
fa58ac0
Refactor Profile screen
mdrlzy Oct 31, 2025
73d258c
Split ReceiveScreenState into separate subclasses
mdrlzy Nov 1, 2025
71f7403
Remove RandomNameGenerator
mdrlzy Nov 1, 2025
1275819
Fix packages, add UserAvatarDto
mdrlzy Nov 1, 2025
7bf79ff
Remove AnimatedContent in Send/Receive to avoid reanimation
mdrlzy Nov 1, 2025
63e89eb
Clean Gradle: Migrate plugins and dependencies to version catalog (#13)
shubertm Nov 8, 2025
54db1f9
Migrate dependency injection from Hilt to Koin (#14)
shubertm Nov 12, 2025
7b2579b
Add ktlint code styling (#15)
shubertm Nov 13, 2025
720450d
Extract DropTopBar
mdrlzy Nov 14, 2025
3d37da4
Apply safeDrawingPadding in root
mdrlzy Nov 14, 2025
8cc703d
Fix paddings in Receive screen
mdrlzy Nov 14, 2025
ce12653
Add session models and split TransferManager into send/receive repos
mdrlzy Nov 15, 2025
611d171
Refactor error handling in Send screen
mdrlzy Nov 16, 2025
3e28cbd
Convert ReceiveError to enum, extract DropErrorCard
mdrlzy Nov 16, 2025
d301756
Rename TransferHistoryItem to TransferSession, store files info as json
mdrlzy Nov 17, 2025
c302655
Make Send screen scrollable, remove LazyColumn from phases
mdrlzy Nov 17, 2025
8a06cc1
Extract DropInstructionsCard
mdrlzy Nov 17, 2025
9d110c4
Remove duplicate Success card
mdrlzy Nov 17, 2025
b246fc2
Add About screen
mdrlzy Nov 17, 2025
cfac7c8
Fix ui in History screen
mdrlzy Nov 17, 2025
1940f96
Remove unused code and replace Logs with Timbers (#16)
shubertm Nov 30, 2025
31bd217
Fix bitmap loading from uri on api 26-27
mdrlzy Dec 2, 2025
322e460
Make sure build job is not skipped (#17)
shubertm Dec 2, 2025
430de54
typo fix
mdrlzy Dec 2, 2025
9af5b36
Save files to downloads legacy (api 26-28)
mdrlzy Dec 3, 2025
cb496ce
Implement write permission flow for file receive
mdrlzy Dec 3, 2025
407ef28
Replace SendQRDialog with WaitingForReceiver screen
mdrlzy Dec 14, 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
34 changes: 34 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
root = true

[*]
indent_style = space
indent_size = 4
tab_width = 4
no-unused-imports = true
no-wildcard-import = true
max_line_length = 100
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.{kt,kts}]
ktlint_code_style = ktlint_official
ktlint_function_naming_ignore_when_annotated_with=Composable
ktlint_standard_annotation = disabled
ktlint_ignore_back_ticked_identifier = true
ktlint_standard = enabled
ktlint_standard_multiline-if-else = disabled

# Don't allow any wildcard imports
ij_kotlin_packages_to_use_import_on_demand = unset

# Prevent wildcard imports
ij_kotlin_name_count_to_use_star_import = 99
ij_kotlin_name_count_to_use_star_import_for_members = 99

[*.md]
trim_trailing_whitespace = false

[**/test/**.kt]
max_line_length=off
167 changes: 92 additions & 75 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -1,83 +1,100 @@
name: Build the app

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
push:
branches: [ main ]
pull_request:
branches: [ main ]

env:
BRANCH_NAME: ${{ github.ref_name }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BRANCH_NAME: ${{ github.ref_name }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


jobs:
check:
if: ${{ startsWith(github.actor, 'dependabot') }}
environment: Development
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'adopt'
cache: gradle

- name: Validate Gradle wrapper
uses: gradle/actions/wrapper-validation@v3

- name: Build debug APK
run: ./gradlew assembleDebug

build:
environment: Development
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'adopt'
cache: gradle

- name: Validate Gradle wrapper
uses: gradle/actions/wrapper-validation@v3

- name: Decrypt the keystore for signing
run: |
echo "${{ secrets.KEYSTORE_ENCRYPTED }}" > keystore.asc
gpg -d --passphrase "${{ secrets.KEYSTORE_PASSWORD }}" --batch keystore.asc > keystore.jks

- name: Build release APK
run: ./gradlew assembleRelease

- name: Upload APK
uses: actions/upload-artifact@v4
with:
name: ark-drop-release
path: ./app/build/outputs/apk/release/ark-drop-release.apk
lint:
needs: build
environment: Development
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'adopt'

- name: Run linter
run: ./gradlew lint

- uses: actions/upload-artifact@v4
with:
name: lint-results
path: ./app/build/reports/*.html
check:
needs: [lint, ktlint]
if: ${{ startsWith(github.actor, 'dependabot') }}
environment: Development
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'adopt'
cache: gradle

- name: Validate Gradle wrapper
uses: gradle/actions/wrapper-validation@v3

- name: Build debug APK
run: ./gradlew assembleDebug

build:
needs: [lint, ktlint]
environment: Development
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'adopt'
cache: gradle

- name: Validate Gradle wrapper
uses: gradle/actions/wrapper-validation@v3

- name: Decrypt the keystore for signing
run: |
echo "${{ secrets.KEYSTORE_ENCRYPTED }}" > keystore.asc
gpg -d --passphrase "${{ secrets.KEYSTORE_PASSWORD }}" --batch keystore.asc > keystore.jks

- name: Build release APK
run: ./gradlew assembleRelease

- name: Upload APK
uses: actions/upload-artifact@v4
with:
name: ark-drop-release
path: ./app/build/outputs/apk/release/ark-drop-release.apk

lint:
environment: Development
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'adopt'

- name: Run linter
run: ./gradlew lint

- uses: actions/upload-artifact@v4
with:
name: lint-results
path: ./app/build/reports/*.html

ktlint:
environment: Development
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'adopt'

- name: Run KtLint
run: ./gradlew ktlintCheck
96 changes: 54 additions & 42 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
import com.android.build.gradle.internal.tasks.factory.dependsOn

plugins {
kotlin("kapt") version "2.2.0"
kotlin("plugin.serialization") version "1.9.23"
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
id("com.google.dagger.hilt.android") version "2.56.2"
id("com.github.triplet.play") version "3.10.1"
alias(libs.plugins.triplet.play)
alias(libs.plugins.ksp)
alias(libs.plugins.ktlint.gradle)
alias(libs.plugins.kotlin.serialization)
}

kotlin {
compilerOptions {
jvmToolchain(11)
}
}

android {
Expand All @@ -23,17 +31,20 @@ android {

defaultConfig {
applicationId = "dev.arkbuilders.drop.app"
minSdk = 29
minSdk = 26
targetSdk = 36
versionCode = 1
versionName = "1.0"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"


setProperty("archivesBaseName", "ark-drop")
}

ksp {
arg("room.schemaLocation", "$projectDir/schemas")
}

buildTypes {
debug {
applicationIdSuffix = ".debug"
Expand All @@ -48,7 +59,7 @@ android {
signingConfig = signingConfigs.getByName("testRelease")
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
"proguard-rules.pro",
)

// Enable R8 full mode
Expand All @@ -63,10 +74,6 @@ android {
targetCompatibility = JavaVersion.VERSION_11
}

kotlinOptions {
jvmTarget = "11"
}

buildFeatures {
compose = true
buildConfig = true
Expand All @@ -75,17 +82,19 @@ android {
packaging {
jniLibs.excludes.add("META-INF/AL2.0")
jniLibs.excludes.add("META-INF/LGPL2.1")
resources.excludes.addAll(listOf(
"META-INF/DEPENDENCIES",
"META-INF/LICENSE",
"META-INF/LICENSE.txt",
"META-INF/license.txt",
"META-INF/NOTICE",
"META-INF/NOTICE.txt",
"META-INF/notice.txt",
"META-INF/ASL2.0",
"META-INF/*.kotlin_module"
))
resources.excludes.addAll(
listOf(
"META-INF/DEPENDENCIES",
"META-INF/LICENSE",
"META-INF/LICENSE.txt",
"META-INF/license.txt",
"META-INF/NOTICE",
"META-INF/NOTICE.txt",
"META-INF/notice.txt",
"META-INF/ASL2.0",
"META-INF/*.kotlin_module",
),
)
}

bundle {
Expand Down Expand Up @@ -122,7 +131,7 @@ dependencies {
}
}
//noinspection Aligned16KB
implementation("dev.arkbuilders:drop:17348879247") {
implementation(libs.arkbuilders.drop) {
artifact {
extension = "aar"
type = "aar"
Expand All @@ -141,22 +150,19 @@ dependencies {
implementation(libs.mlkit.barcode.scanning)
implementation(libs.accompanist.permissions)

// DAGGER SETUP
implementation("com.google.dagger:hilt-android:2.56.2")
kapt("com.google.dagger:hilt-compiler:2.56.2")
implementation(libs.timber)

// For instrumentation tests
androidTestImplementation("com.google.dagger:hilt-android-testing:2.56.2")
kaptAndroidTest("com.google.dagger:hilt-compiler:2.56.2")
implementation(libs.room.runtime)
implementation(libs.room.ktx)
ksp(libs.room.compiler)

// For local unit tests
testImplementation("com.google.dagger:hilt-android-testing:2.56.2")
kaptTest("com.google.dagger:hilt-compiler:2.56.2")
implementation(libs.orbit.compose)
implementation(libs.orbit.viewmodel)

// EXTRA ICONS
implementation("br.com.devsrsouza.compose.icons:simple-icons:1.1.0")
implementation("br.com.devsrsouza.compose.icons:font-awesome:1.1.0")
implementation("br.com.devsrsouza.compose.icons:tabler-icons:1.1.0")
implementation(libs.simple.icons)
implementation(libs.font.awesome)
implementation(libs.tabler.icons)

// DEVELOPMENT SETUP
testImplementation(libs.junit)
Expand All @@ -168,16 +174,22 @@ dependencies {
debugImplementation(libs.androidx.ui.test.manifest)

// File-system profile manager
implementation("io.coil-kt:coil-compose:2.5.0")
implementation("androidx.compose.foundation:foundation:1.4.0")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")
}
implementation(libs.io.coil)
implementation(libs.androidx.compose.foundation)
implementation(libs.kotlinx.serialization)

kapt {
correctErrorTypes = true
implementation(libs.ark.about)

// Koin Dependency Injection
implementation(libs.io.koin.core)
implementation(libs.io.koin.android)
implementation(libs.io.koin.compose)
implementation(libs.io.koin.test)
}

tasks.preBuild.dependsOn(tasks.ktlintCheck)
tasks.ktlintCheck.dependsOn(tasks.ktlintFormat)

tasks.named<Delete>("clean") {
delete(fileTree("$projectDir/src/main/jniLibs"))
}

Loading