From f85ee536b1b6aec35af2d4e7a4621c810b6beff9 Mon Sep 17 00:00:00 2001 From: Dinar Khakimov <85668474+mdrlzy@users.noreply.github.com> Date: Thu, 22 Jan 2026 09:19:41 -0800 Subject: [PATCH 01/25] KMP prototype (#1) * Remove android project * KMP project init * Add kmp domain layer * Add Room, ksp, serialization * Add repositories, datastore * Add android helper implementations * Refactor helpers * Add koin modules * Add shared viewmodels * Fixes * Add android ui * Fix koin modules * Android platform: add Room, DataStore * Add koin init, minor fixes * Fix UnsatisfiedLinkError Native library not found in resource path (.) java.lang.UnsatisfiedLinkError: Native library (com/sun/jna/android-arm/libjnidispatch.so) not found in resource path (.) * ios platform: setup Room and DataStore * Remove default platform example * Setup ktlint * ktlint formatting * Setup keystore * Update app icon * Fix lint * Fix Expected DatabaseConstructor has no actual declaration in ios * Add ios actual stubs * Fix ci apk path * Add ViewModels entry point in iosMain --- .editorconfig | 3 + .github/workflows/build.yml | 4 +- .gitignore | 27 +- app/.gitignore | 1 - app/build.gradle.kts | 195 --------- app/proguard-rules.pro | 135 ------- .../drop/app/ExampleInstrumentedTest.kt | 22 -- .../data/datasource/ProfileLocalDataSource.kt | 84 ---- .../arkbuilders/drop/app/data/db/Database.kt | 33 -- .../OffsetDateTimeTypeConverter.kt | 16 - .../drop/app/data/model/UserAvatarDto.kt | 9 - .../drop/app/data/model/UserProfileDto.kt | 9 - .../app/data/repository/ProfileRepoImpl.kt | 29 -- .../dev/arkbuilders/drop/app/di/AppModule.kt | 44 --- .../drop/app/di/ViewModelsModule.kt | 18 - .../drop/app/domain/AvatarHelper.kt | 13 - .../drop/app/domain/ResourcesHelper.kt | 14 - .../app/domain/model/BuildConfigFields.kt | 6 - .../drop/app/domain/model/ReceiveSession.kt | 9 - .../drop/app/domain/model/SendSession.kt | 9 - .../app/domain/repository/NetworkStatus.kt | 9 - .../drop/app/domain/repository/ProfileRepo.kt | 17 - .../app/domain/usecase/ReceiveFilesUseCase.kt | 51 --- .../drop/app/presentation/DropApplication.kt | 32 -- app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1116 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 2338 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 862 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 1568 -> 0 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1358 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3206 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 1652 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 4402 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 1988 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 5878 -> 0 bytes app/src/main/res/values/colors.xml | 10 - app/src/main/res/values/strings.xml | 3 - app/src/main/res/values/themes.xml | 5 - app/src/main/res/xml/backup_rules.xml | 13 - .../main/res/xml/data_extraction_rules.xml | 19 - app/src/main/res/xml/file_provider_paths.xml | 8 - .../arkbuilders/drop/app/ExampleUnitTest.kt | 16 - build.gradle.kts | 13 +- composeApp/build.gradle.kts | 107 +++++ .../src/androidMain}/AndroidManifest.xml | 33 +- .../drawable/compose-multiplatform.xml | 44 +++ .../drop}/presentation/DisplayUtils.kt | 2 +- .../drop/presentation/DropApplication.kt | 17 + .../drop}/presentation/MainActivity.kt | 25 +- .../presentation/components/AvatarImage.kt | 2 +- .../presentation/components/DropButton.kt | 4 +- .../drop}/presentation/components/DropCard.kt | 4 +- .../presentation/components/DropErrorCard.kt | 4 +- .../components/DropInstructionsCard.kt | 4 +- .../presentation/components/DropTopBar.kt | 4 +- .../presentation/components/ErrorStates.kt | 4 +- .../presentation/components/LoadingStates.kt | 4 +- .../presentation/history/HistoryScreen.kt | 28 +- .../drop/presentation/home/HomeScreen.kt | 53 +-- .../navigation/DropDestination.kt | 2 +- .../drop}/presentation/profile/AboutScreen.kt | 12 +- .../presentation/profile/EditProfileScreen.kt | 38 +- .../presentation/receive/ReceiveScreen.kt | 25 +- .../receive/components/ReceiveCompleteCard.kt | 4 +- .../receive/components/ReceiveLoadingCard.kt | 4 +- .../components/ReceiveManualInputCard.kt | 4 +- .../ReceivePermissionRequestCard.kt | 6 +- .../receive/components/ReceiveProgressCard.kt | 12 +- .../components/ReceiveQRCodeScannedCard.kt | 4 +- .../components/ReceiveReadyToScanCard.kt | 6 +- .../receive/components/ReceiveScanningCard.kt | 6 +- .../drop/presentation/send/SendScreen.kt | 16 +- .../send/components/SendButton.kt | 2 +- .../presentation/send/components/SendCard.kt | 2 +- .../send/components/SendEmptyState.kt | 2 +- .../send/components/SendFileItem.kt | 6 +- .../send/components/SendLoadingIndicator.kt | 2 +- .../send/components/SendProgressBar.kt | 2 +- .../components/phase/FileSelectionPhase.kt | 18 +- .../components/phase/GeneratingQRPhase.kt | 12 +- .../components/phase/TransferCompletePhase.kt | 10 +- .../components/phase/TransferringPhase.kt | 14 +- .../phase/WaitingForReceiverPhase.kt | 23 +- .../drop}/presentation/theme/Color.kt | 2 +- .../drop}/presentation/theme/DesignTokens.kt | 2 +- .../drop}/presentation/theme/Theme.kt | 2 +- .../drop}/presentation/theme/TopBar.kt | 2 +- .../drop}/presentation/theme/Type.kt | 2 +- .../androidMain}/res/drawable/avatar_00.png | Bin .../androidMain}/res/drawable/avatar_01.png | Bin .../androidMain}/res/drawable/avatar_02.png | Bin .../androidMain}/res/drawable/avatar_03.png | Bin .../androidMain}/res/drawable/avatar_04.png | Bin .../androidMain}/res/drawable/avatar_05.png | Bin .../androidMain}/res/drawable/avatar_06.png | Bin .../androidMain}/res/drawable/avatar_07.png | Bin .../androidMain}/res/drawable/avatar_08.png | Bin .../src/androidMain}/res/drawable/banner.xml | 0 .../src/androidMain}/res/drawable/ic_back.xml | 0 .../androidMain}/res/drawable/ic_document.xml | 0 .../androidMain}/res/drawable/ic_image.xml | 0 .../res/drawable/ic_launcher_background.xml | 170 ++++++++ .../res/drawable/ic_launcher_foreground.xml | 2 +- .../src/androidMain}/res/drawable/ic_link.xml | 0 .../src/androidMain}/res/drawable/ic_logo.xml | 0 .../androidMain}/res/drawable/ic_music.xml | 0 .../src/androidMain}/res/drawable/ic_pdf.xml | 0 .../androidMain}/res/drawable/ic_video.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2348 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1570 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3210 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 4418 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 5892 bytes .../res/values/ic_launcher_background.xml | 0 .../src/androidMain/res/values/strings.xml | 3 + .../drop/ComposeAppAndroidUnitTest.kt | 11 + .../metadata/android/en-US/changelogs/1.txt | 7 - .../android/en-US/full_description.txt | 36 -- .../android/en-US/short_description.txt | 1 - fastlane/metadata/android/en-US/title.txt | 1 - gradle.properties | 33 +- gradle/libs.versions.toml | 149 +++---- gradle/wrapper/gradle-wrapper.jar | Bin 59203 -> 43764 bytes gradle/wrapper/gradle-wrapper.properties | 5 +- gradlew | 286 ++++++++------ gradlew.bat | 41 +- iosApp/Configuration/Config.xcconfig | 7 + iosApp/iosApp.xcodeproj/project.pbxproj | 373 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 35 ++ iosApp/iosApp/Assets.xcassets/Contents.json | 6 + iosApp/iosApp/ContentView.swift | 33 ++ iosApp/iosApp/Info.plist | 8 + .../Preview Assets.xcassets/Contents.json | 6 + iosApp/iosApp/iOSApp.swift | 10 + settings.gradle.kts | 28 +- shared/build.gradle.kts | 87 ++++ .../1.json | 8 +- .../drop/data/helper/AvatarHelper.android.kt | 20 +- .../drop/data/helper/NetworkStatus.android.kt | 13 +- .../data/helper/PermissionsHelper.android.kt | 11 +- .../data/helper/ResourcesHelper.android.kt | 66 +++- .../drop/di/PlatformModule.android.kt | 42 ++ .../drop/domain/libwrapper/DropApi.android.kt | 77 ++++ .../receive/DropReceiveFilesBubbleImpl.kt | 33 ++ .../receive/DropReceiveFilesSubscriberImpl.kt | 33 +- .../send/DropSendFilesBubbleImpl.kt | 41 ++ .../libwrapper/send}/SenderFileDataImpl.kt | 6 +- .../send/SenderFilesSubscriberImpl.kt | 19 +- .../data/datasource/ProfileLocalDataSource.kt | 99 +++++ .../TransferSessionLocalDataSource.kt | 16 +- .../arkbuilders/drop/data/db/DropDatabase.kt | 29 ++ .../drop}/data/db/dao/TransferSessionDao.kt | 4 +- .../data/db/entity/RoomTransferSession.kt | 11 +- .../typeconverter}/DropFileListConverter.kt | 4 +- .../drop/data/helper/AvatarHelper.kt | 7 + .../drop/data/helper/NetworkStatus.kt | 9 + .../drop/data/helper}/PermissionsHelper.kt | 4 +- .../drop/data/helper/ResourcesHelper.kt | 23 ++ .../drop/data/repository/ProfileRepoImpl.kt | 26 ++ .../data/repository/ReceiveSessionRepoImpl.kt | 40 +- .../data/repository/SendSessionRepoImpl.kt | 43 +- .../repository/TransferSessionRepoImpl.kt | 23 +- .../drop/data/settings/CreateDataStore.kt | 13 + .../dev/arkbuilders/drop/di/AppModule.kt | 3 + .../dev/arkbuilders/drop/di/DBModule.kt | 13 + .../dev/arkbuilders/drop/di/PlatformModule.kt | 5 + .../arkbuilders/drop/di/RepositoriesModule.kt | 24 ++ .../dev/arkbuilders/drop/di/UseCaseModule.kt | 11 + .../arkbuilders/drop/di/ViewModelModule.kt | 18 + .../drop/domain/libwrapper/DropApi.kt | 20 + .../receive/DropReceiveFilesBubble.kt | 15 + .../receive/DropReceiveFilesSubscriber.kt | 9 + .../receive/DropReceivingProgress.kt | 20 + .../request/DropReceiveFilesRequest.kt | 8 + .../receive/request/DropReceiverConfig.kt | 6 + .../receive/request/DropReceiverProfile.kt | 6 + .../libwrapper/send/DropSendFilesBubble.kt | 19 + .../send/DropSendFilesSubscriber.kt | 7 + .../libwrapper/send/DropSendingProgress.kt | 10 + .../send/request/DropSendFilesRequest.kt | 7 + .../send/request/DropSenderConfig.kt | 6 + .../libwrapper/send/request/DropSenderFile.kt | 6 + .../send/request/DropSenderFileData.kt | 9 + .../send/request/DropSenderProfile.kt | 6 + .../drop}/domain/model/DropFileInfo.kt | 2 +- .../drop/domain/model/ReceiveSession.kt | 9 + .../drop/domain/model/SendSession.kt | 9 + .../drop}/domain/model/TransferSession.kt | 9 +- .../drop}/domain/model/TransferStatus.kt | 2 +- .../drop}/domain/model/UserAvatar.kt | 2 +- .../drop}/domain/model/UserProfile.kt | 2 +- .../drop/domain/repository/ProfileRepo.kt | 15 + .../domain/repository/ReceiveSessionRepo.kt | 14 + .../drop/domain/repository/SendSessionRepo.kt | 14 + .../domain/repository/TransferSessionRepo.kt | 8 +- .../domain/usecase/ReceiveFilesUseCase.kt | 53 +++ .../drop}/domain/usecase/SendFilesUseCase.kt | 54 ++- .../edit}/EditProfileViewModel.kt | 14 +- .../presentation/history/HistoryViewModel.kt | 6 +- .../drop}/presentation/home/HomeViewModel.kt | 14 +- .../receive/ReceiveScreenState.kt | 8 +- .../presentation/receive/ReceiveViewModel.kt | 13 +- .../presentation/send/SendScreenState.kt | 7 +- .../drop}/presentation/send/SendViewModel.kt | 64 +-- .../dev/arkbuilders/drop/SharedCommonTest.kt | 11 + .../drop/data/helper/AvatarHelper.ios.kt | 11 + .../drop/data/helper/NetworkStatus.ios.kt | 14 + .../drop/data/helper/PermissionsHelper.ios.kt | 11 + .../drop/data/helper/ResourcesHelper.ios.kt | 35 ++ .../arkbuilders/drop/di/PlatformModule.ios.kt | 51 +++ .../dev/arkbuilders/drop/di/ViewModels.kt | 21 + .../drop/domain/libwrapper/DropApi.ios.kt | 5 + 215 files changed, 2641 insertions(+), 1598 deletions(-) delete mode 100644 app/.gitignore delete mode 100644 app/build.gradle.kts delete mode 100644 app/proguard-rules.pro delete mode 100644 app/src/androidTest/java/dev/arkbuilders/drop/app/ExampleInstrumentedTest.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/data/datasource/ProfileLocalDataSource.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/data/db/Database.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/data/db/typeconverters/OffsetDateTimeTypeConverter.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/data/model/UserAvatarDto.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/data/model/UserProfileDto.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/data/repository/ProfileRepoImpl.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/di/AppModule.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/di/ViewModelsModule.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/domain/AvatarHelper.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/domain/ResourcesHelper.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/domain/model/BuildConfigFields.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/domain/model/ReceiveSession.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/domain/model/SendSession.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/domain/repository/NetworkStatus.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/domain/repository/ProfileRepo.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/domain/usecase/ReceiveFilesUseCase.kt delete mode 100644 app/src/main/java/dev/arkbuilders/drop/app/presentation/DropApplication.kt delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/values/colors.xml delete mode 100644 app/src/main/res/values/strings.xml delete mode 100644 app/src/main/res/values/themes.xml delete mode 100644 app/src/main/res/xml/backup_rules.xml delete mode 100644 app/src/main/res/xml/data_extraction_rules.xml delete mode 100644 app/src/main/res/xml/file_provider_paths.xml delete mode 100644 app/src/test/java/dev/arkbuilders/drop/app/ExampleUnitTest.kt create mode 100644 composeApp/build.gradle.kts rename {app/src/main => composeApp/src/androidMain}/AndroidManifest.xml (54%) create mode 100644 composeApp/src/androidMain/composeResources/drawable/compose-multiplatform.xml rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/DisplayUtils.kt (93%) create mode 100644 composeApp/src/androidMain/kotlin/dev/arkbuilders/drop/presentation/DropApplication.kt rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/MainActivity.kt (82%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/components/AvatarImage.kt (98%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/components/DropButton.kt (98%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/components/DropCard.kt (97%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/components/DropErrorCard.kt (97%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/components/DropInstructionsCard.kt (95%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/components/DropTopBar.kt (96%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/components/ErrorStates.kt (98%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/components/LoadingStates.kt (98%) rename app/src/main/java/dev/arkbuilders/drop/app/presentation/history/History.kt => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop/presentation/history/HistoryScreen.kt (94%) rename app/src/main/java/dev/arkbuilders/drop/app/presentation/home/Home.kt => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop/presentation/home/HomeScreen.kt (90%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/navigation/DropDestination.kt (92%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/profile/AboutScreen.kt (69%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/profile/EditProfileScreen.kt (95%) rename app/src/main/java/dev/arkbuilders/drop/app/presentation/receive/Receive.kt => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop/presentation/receive/ReceiveScreen.kt (87%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/receive/components/ReceiveCompleteCard.kt (98%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/receive/components/ReceiveLoadingCard.kt (94%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/receive/components/ReceiveManualInputCard.kt (98%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/receive/components/ReceivePermissionRequestCard.kt (96%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/receive/components/ReceiveProgressCard.kt (96%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/receive/components/ReceiveQRCodeScannedCard.kt (97%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/receive/components/ReceiveReadyToScanCard.kt (96%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/receive/components/ReceiveScanningCard.kt (98%) rename app/src/main/java/dev/arkbuilders/drop/app/presentation/send/Send.kt => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop/presentation/send/SendScreen.kt (87%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/send/components/SendButton.kt (98%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/send/components/SendCard.kt (93%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/send/components/SendEmptyState.kt (97%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/send/components/SendFileItem.kt (96%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/send/components/SendLoadingIndicator.kt (95%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/send/components/SendProgressBar.kt (92%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/send/components/phase/FileSelectionPhase.kt (90%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/send/components/phase/GeneratingQRPhase.kt (74%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/send/components/phase/TransferCompletePhase.kt (93%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/send/components/phase/TransferringPhase.kt (93%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/send/components/phase/WaitingForReceiverPhase.kt (87%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/theme/Color.kt (95%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/theme/DesignTokens.kt (97%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/theme/Theme.kt (98%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/theme/TopBar.kt (97%) rename {app/src/main/java/dev/arkbuilders/drop/app => composeApp/src/androidMain/kotlin/dev/arkbuilders/drop}/presentation/theme/Type.kt (98%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/avatar_00.png (100%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/avatar_01.png (100%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/avatar_02.png (100%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/avatar_03.png (100%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/avatar_04.png (100%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/avatar_05.png (100%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/avatar_06.png (100%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/avatar_07.png (100%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/avatar_08.png (100%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/banner.xml (100%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/ic_back.xml (100%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/ic_document.xml (100%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/ic_image.xml (100%) create mode 100644 composeApp/src/androidMain/res/drawable/ic_launcher_background.xml rename {app/src/main => composeApp/src/androidMain}/res/drawable/ic_launcher_foreground.xml (98%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/ic_link.xml (100%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/ic_logo.xml (100%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/ic_music.xml (100%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/ic_pdf.xml (100%) rename {app/src/main => composeApp/src/androidMain}/res/drawable/ic_video.xml (100%) rename {app/src/main => composeApp/src/androidMain}/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename {app/src/main => composeApp/src/androidMain}/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) create mode 100644 composeApp/src/androidMain/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 composeApp/src/androidMain/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 composeApp/src/androidMain/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 composeApp/src/androidMain/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 composeApp/src/androidMain/res/mipmap-xxxhdpi/ic_launcher_round.webp rename {app/src/main => composeApp/src/androidMain}/res/values/ic_launcher_background.xml (100%) create mode 100644 composeApp/src/androidMain/res/values/strings.xml create mode 100644 composeApp/src/androidUnitTest/kotlin/dev/arkbuilders/drop/ComposeAppAndroidUnitTest.kt delete mode 100644 fastlane/metadata/android/en-US/changelogs/1.txt delete mode 100644 fastlane/metadata/android/en-US/full_description.txt delete mode 100644 fastlane/metadata/android/en-US/short_description.txt delete mode 100644 fastlane/metadata/android/en-US/title.txt create mode 100644 iosApp/Configuration/Config.xcconfig create mode 100644 iosApp/iosApp.xcodeproj/project.pbxproj create mode 100644 iosApp/iosApp.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 iosApp/iosApp/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 iosApp/iosApp/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 iosApp/iosApp/Assets.xcassets/Contents.json create mode 100644 iosApp/iosApp/ContentView.swift create mode 100644 iosApp/iosApp/Info.plist create mode 100644 iosApp/iosApp/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 iosApp/iosApp/iOSApp.swift create mode 100644 shared/build.gradle.kts rename {app/schemas/dev.arkbuilders.drop.app.data.db.Database => shared/schemas/dev.arkbuilders.drop.data.db.DropDatabase}/1.json (85%) rename app/src/main/java/dev/arkbuilders/drop/app/data/helper/AvatarHelperImpl.kt => shared/src/androidMain/kotlin/dev/arkbuilders/drop/data/helper/AvatarHelper.android.kt (84%) rename app/src/main/java/dev/arkbuilders/drop/app/data/repository/NetworkStatusImpl.kt => shared/src/androidMain/kotlin/dev/arkbuilders/drop/data/helper/NetworkStatus.android.kt (88%) rename app/src/main/java/dev/arkbuilders/drop/app/data/helper/PermissionsHelperImpl.kt => shared/src/androidMain/kotlin/dev/arkbuilders/drop/data/helper/PermissionsHelper.android.kt (71%) rename app/src/main/java/dev/arkbuilders/drop/app/data/helper/ResourcesHelperImpl.kt => shared/src/androidMain/kotlin/dev/arkbuilders/drop/data/helper/ResourcesHelper.android.kt (74%) create mode 100644 shared/src/androidMain/kotlin/dev/arkbuilders/drop/di/PlatformModule.android.kt create mode 100644 shared/src/androidMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/DropApi.android.kt create mode 100644 shared/src/androidMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/receive/DropReceiveFilesBubbleImpl.kt rename app/src/main/java/dev/arkbuilders/drop/app/data/ReceiveFilesSubscriberImpl.kt => shared/src/androidMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/receive/DropReceiveFilesSubscriberImpl.kt (87%) create mode 100644 shared/src/androidMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/send/DropSendFilesBubbleImpl.kt rename {app/src/main/java/dev/arkbuilders/drop/app/data => shared/src/androidMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/send}/SenderFileDataImpl.kt (93%) rename app/src/main/java/dev/arkbuilders/drop/app/data/SendFilesSubscriberImpl.kt => shared/src/androidMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/send/SenderFilesSubscriberImpl.kt (75%) create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/data/datasource/ProfileLocalDataSource.kt rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/data/datasource/TransferSessionLocalDataSource.kt (68%) create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/data/db/DropDatabase.kt rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/data/db/dao/TransferSessionDao.kt (86%) rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/data/db/entity/RoomTransferSession.kt (51%) rename {app/src/main/java/dev/arkbuilders/drop/app/data/db/typeconverters => shared/src/commonMain/kotlin/dev/arkbuilders/drop/data/db/typeconverter}/DropFileListConverter.kt (75%) create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/data/helper/AvatarHelper.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/data/helper/NetworkStatus.kt rename {app/src/main/java/dev/arkbuilders/drop/app/domain => shared/src/commonMain/kotlin/dev/arkbuilders/drop/data/helper}/PermissionsHelper.kt (52%) create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/data/helper/ResourcesHelper.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/data/repository/ProfileRepoImpl.kt rename app/src/main/java/dev/arkbuilders/drop/app/data/repository/ReceiveSessionRepo.kt => shared/src/commonMain/kotlin/dev/arkbuilders/drop/data/repository/ReceiveSessionRepoImpl.kt (75%) rename app/src/main/java/dev/arkbuilders/drop/app/data/repository/SendSessionRepo.kt => shared/src/commonMain/kotlin/dev/arkbuilders/drop/data/repository/SendSessionRepoImpl.kt (68%) rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/data/repository/TransferSessionRepoImpl.kt (69%) create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/data/settings/CreateDataStore.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/di/AppModule.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/di/DBModule.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/di/PlatformModule.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/di/RepositoriesModule.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/di/UseCaseModule.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/di/ViewModelModule.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/DropApi.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/receive/DropReceiveFilesBubble.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/receive/DropReceiveFilesSubscriber.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/receive/DropReceivingProgress.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/receive/request/DropReceiveFilesRequest.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/receive/request/DropReceiverConfig.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/receive/request/DropReceiverProfile.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/send/DropSendFilesBubble.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/send/DropSendFilesSubscriber.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/send/DropSendingProgress.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/send/request/DropSendFilesRequest.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/send/request/DropSenderConfig.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/send/request/DropSenderFile.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/send/request/DropSenderFileData.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/send/request/DropSenderProfile.kt rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/domain/model/DropFileInfo.kt (73%) create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/model/ReceiveSession.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/model/SendSession.kt rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/domain/model/TransferSession.kt (54%) rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/domain/model/TransferStatus.kt (73%) rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/domain/model/UserAvatar.kt (87%) rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/domain/model/UserProfile.kt (78%) create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/repository/ProfileRepo.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/repository/ReceiveSessionRepo.kt create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/repository/SendSessionRepo.kt rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/domain/repository/TransferSessionRepo.kt (71%) create mode 100644 shared/src/commonMain/kotlin/dev/arkbuilders/drop/domain/usecase/ReceiveFilesUseCase.kt rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/domain/usecase/SendFilesUseCase.kt (52%) rename {app/src/main/java/dev/arkbuilders/drop/app/presentation/profile => shared/src/commonMain/kotlin/dev/arkbuilders/drop/presentation/edit}/EditProfileViewModel.kt (89%) rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/presentation/history/HistoryViewModel.kt (91%) rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/presentation/home/HomeViewModel.kt (80%) rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/presentation/receive/ReceiveScreenState.kt (85%) rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/presentation/receive/ReceiveViewModel.kt (96%) rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/presentation/send/SendScreenState.kt (90%) rename {app/src/main/java/dev/arkbuilders/drop/app => shared/src/commonMain/kotlin/dev/arkbuilders/drop}/presentation/send/SendViewModel.kt (80%) create mode 100644 shared/src/commonTest/kotlin/dev/arkbuilders/drop/SharedCommonTest.kt create mode 100644 shared/src/iosMain/kotlin/dev/arkbuilders/drop/data/helper/AvatarHelper.ios.kt create mode 100644 shared/src/iosMain/kotlin/dev/arkbuilders/drop/data/helper/NetworkStatus.ios.kt create mode 100644 shared/src/iosMain/kotlin/dev/arkbuilders/drop/data/helper/PermissionsHelper.ios.kt create mode 100644 shared/src/iosMain/kotlin/dev/arkbuilders/drop/data/helper/ResourcesHelper.ios.kt create mode 100644 shared/src/iosMain/kotlin/dev/arkbuilders/drop/di/PlatformModule.ios.kt create mode 100644 shared/src/iosMain/kotlin/dev/arkbuilders/drop/di/ViewModels.kt create mode 100644 shared/src/iosMain/kotlin/dev/arkbuilders/drop/domain/libwrapper/DropApi.ios.kt diff --git a/.editorconfig b/.editorconfig index 015d3bc..325425c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -32,3 +32,6 @@ trim_trailing_whitespace = false [**/test/**.kt] max_line_length=off + +[**/build/**/*.kt] +ktlint = disabled diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 10d3d33..ac96b4c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -62,7 +62,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: ark-drop-release - path: ./app/build/outputs/apk/release/ark-drop-release.apk + path: ./composeApp/build/outputs/apk/release/composeApp-release.apk lint: environment: Development @@ -82,7 +82,7 @@ jobs: - uses: actions/upload-artifact@v4 with: name: lint-results - path: ./app/build/reports/*.html + path: ./composeApp/build/reports/*.html ktlint: environment: Development diff --git a/.gitignore b/.gitignore index 259e370..adfa9bf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,19 @@ -# JNILibs -/app/src/main/jniLibs - -# Development Setup -/build -/.idea -/.kotlin -/.gradle -/captures +*.iml +.kotlin +.gradle +**/build/ +xcuserdata +!src/**/build/ local.properties -.cxx +.idea .DS_Store +captures .externalNativeBuild - +.cxx +*.xcodeproj/* +!*.xcodeproj/project.pbxproj +!*.xcodeproj/xcshareddata/ +!*.xcodeproj/project.xcworkspace/ +!*.xcworkspace/contents.xcworkspacedata +**/xcshareddata/WorkspaceSettings.xcsettings +node_modules/ diff --git a/app/.gitignore b/app/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/app/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts deleted file mode 100644 index 15edf56..0000000 --- a/app/build.gradle.kts +++ /dev/null @@ -1,195 +0,0 @@ -import com.android.build.gradle.internal.tasks.factory.dependsOn - -plugins { - alias(libs.plugins.android.application) - alias(libs.plugins.kotlin.android) - alias(libs.plugins.kotlin.compose) - alias(libs.plugins.triplet.play) - alias(libs.plugins.ksp) - alias(libs.plugins.ktlint.gradle) - alias(libs.plugins.kotlin.serialization) -} - -kotlin { - compilerOptions { - jvmToolchain(11) - } -} - -android { - namespace = "dev.arkbuilders.drop.app" - compileSdk = 36 - - signingConfigs { - create("testRelease") { - storeFile = project.rootProject.file("keystore.jks") - storePassword = "sw0rdf1sh" - keyAlias = "ark-builders-test" - keyPassword = "rybamech" - } - } - - defaultConfig { - applicationId = "dev.arkbuilders.drop.app" - 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" - versionNameSuffix = "-debug" - isDebuggable = true - isMinifyEnabled = false - } - - release { - isMinifyEnabled = true - isShrinkResources = true - signingConfig = signingConfigs.getByName("testRelease") - proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro", - ) - - // Enable R8 full mode - isDebuggable = false - isJniDebuggable = false - isPseudoLocalesEnabled = false - } - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 - } - - buildFeatures { - compose = true - buildConfig = true - } - - 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", - ), - ) - } - - bundle { - language { - enableSplit = false - } - density { - enableSplit = true - } - abi { - enableSplit = true - } - } -} - -dependencies { - implementation(libs.androidx.core.ktx) - implementation(libs.androidx.lifecycle.runtime.ktx) - implementation(libs.androidx.activity.compose) - implementation(platform(libs.androidx.compose.bom)) - implementation(libs.androidx.ui) - implementation(libs.androidx.ui.graphics) - implementation(libs.androidx.ui.tooling.preview) - implementation(libs.androidx.material3) - - // NAVIGATION - implementation(libs.androidx.navigation.compose) - - // Bindings setup - implementation(libs.jna) { - artifact { - extension = "aar" - type = "aar" - } - } - //noinspection Aligned16KB - implementation(libs.arkbuilders.drop) { - artifact { - extension = "aar" - type = "aar" - } - } - - // QR CODE create setup - implementation(libs.google.zxing.core) - implementation(libs.github.yuriy.budiyev.code.scanner) - - // QR CODE SCAN - implementation(libs.androidx.camera.core) - implementation(libs.androidx.camera.camera2) - implementation(libs.androidx.camera.lifecycle) - implementation(libs.androidx.camera.view) - implementation(libs.mlkit.barcode.scanning) - implementation(libs.accompanist.permissions) - - implementation(libs.timber) - - implementation(libs.room.runtime) - implementation(libs.room.ktx) - ksp(libs.room.compiler) - - implementation(libs.orbit.compose) - implementation(libs.orbit.viewmodel) - - // EXTRA ICONS - implementation(libs.simple.icons) - implementation(libs.font.awesome) - implementation(libs.tabler.icons) - - // DEVELOPMENT SETUP - testImplementation(libs.junit) - androidTestImplementation(libs.androidx.junit) - androidTestImplementation(libs.androidx.espresso.core) - androidTestImplementation(platform(libs.androidx.compose.bom)) - androidTestImplementation(libs.androidx.ui.test.junit4) - debugImplementation(libs.androidx.ui.tooling) - debugImplementation(libs.androidx.ui.test.manifest) - - // File-system profile manager - implementation(libs.io.coil) - implementation(libs.androidx.compose.foundation) - implementation(libs.kotlinx.serialization) - - 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("clean") { - delete(fileTree("$projectDir/src/main/jniLibs")) -} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro deleted file mode 100644 index 5b8e65c..0000000 --- a/app/proguard-rules.pro +++ /dev/null @@ -1,135 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. --keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. --renamesourcefileattribute SourceFile - -# Keep Hilt classes --keep class dagger.hilt.** { *; } --keep class javax.inject.** { *; } --keep class * extends dagger.hilt.android.HiltAndroidApp --keepclasseswithmembers class * { - @dagger.hilt.android.AndroidEntryPoint ; -} - -# Keep Compose classes --keep class androidx.compose.** { *; } --keep class kotlin.Metadata { *; } - -# Keep serialization classes --keepattributes *Annotation*, InnerClasses --dontnote kotlinx.serialization.AnnotationsKt --keepclassmembers class kotlinx.serialization.json.** { - *** Companion; -} --keepclasseswithmembers class kotlinx.serialization.json.** { - kotlinx.serialization.KSerializer serializer(...); -} --keep,includedescriptorclasses class dev.arkbuilders.drop.app.**$$serializer { *; } --keepclassmembers class dev.arkbuilders.drop.app.** { - *** Companion; -} --keepclasseswithmembers class dev.arkbuilders.drop.app.** { - kotlinx.serialization.KSerializer serializer(...); -} - -# Keep JNA classes --keep class com.sun.jna.** { *; } --keep class * implements com.sun.jna.** { *; } - -# Keep ZXing classes but exclude desktop GUI components --keep class com.google.zxing.** { *; } --dontwarn com.google.zxing.client.j2se.** --dontwarn java.awt.** --dontwarn javax.swing.** --dontwarn javax.imageio.** --dontwarn org.w3c.dom.bootstrap.** - -# Exclude ZXing desktop GUI classes completely --dontnote com.google.zxing.client.j2se.** - -# Keep CameraX classes --keep class androidx.camera.** { *; } - -# Keep ML Kit classes --keep class com.google.mlkit.** { *; } - -# Keep file provider classes --keep class androidx.core.content.FileProvider { *; } - -# Remove logging in release --assumenosideeffects class android.util.Log { - public static boolean isLoggable(java.lang.String, int); - public static int v(...); - public static int i(...); - public static int w(...); - public static int d(...); - public static int e(...); -} - -# Fix for missing javax.imageio classes from ZXing --dontwarn javax.imageio.spi.ImageInputStreamSpi --dontwarn javax.imageio.spi.ImageOutputStreamSpi --dontwarn javax.imageio.spi.ImageReaderSpi --dontwarn javax.imageio.spi.ImageWriterSpi --dontwarn com.github.jaiimageio.impl.** - -# Fix for missing AWT classes from ZXing desktop components --dontwarn java.awt.Component --dontwarn java.awt.Container --dontwarn java.awt.Dimension --dontwarn java.awt.FlowLayout --dontwarn java.awt.Graphics2D --dontwarn java.awt.GraphicsEnvironment --dontwarn java.awt.HeadlessException --dontwarn java.awt.Image --dontwarn java.awt.LayoutManager --dontwarn java.awt.Window --dontwarn java.awt.geom.AffineTransform --dontwarn java.awt.image.BufferedImage --dontwarn java.awt.image.ImageObserver --dontwarn java.awt.image.RenderedImage --dontwarn java.awt.image.WritableRaster - -# Fix for missing Swing classes from ZXing desktop components --dontwarn javax.swing.Icon --dontwarn javax.swing.ImageIcon --dontwarn javax.swing.JFileChooser --dontwarn javax.swing.JFrame --dontwarn javax.swing.JLabel --dontwarn javax.swing.JPanel --dontwarn javax.swing.JTextArea --dontwarn javax.swing.SwingUtilities --dontwarn javax.swing.text.JTextComponent - -# Suppress warnings for ZXing desktop classes that we don't use on Android --dontwarn com.google.zxing.client.j2se.GUIRunner --dontwarn com.google.zxing.client.j2se.BufferedImageLuminanceSource --dontwarn com.google.zxing.client.j2se.DecodeWorker --dontwarn com.google.zxing.client.j2se.HtmlAssetTranslator - -# Keep only the ZXing classes we actually use for Android --keep class com.google.zxing.BarcodeFormat { *; } --keep class com.google.zxing.WriterException { *; } --keep class com.google.zxing.common.BitMatrix { *; } --keep class com.google.zxing.qrcode.QRCodeWriter { *; } - -# Additional R8 optimizations --allowaccessmodification --repackageclasses '' diff --git a/app/src/androidTest/java/dev/arkbuilders/drop/app/ExampleInstrumentedTest.kt b/app/src/androidTest/java/dev/arkbuilders/drop/app/ExampleInstrumentedTest.kt deleted file mode 100644 index 2d5d626..0000000 --- a/app/src/androidTest/java/dev/arkbuilders/drop/app/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,22 +0,0 @@ -package dev.arkbuilders.drop.app - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.platform.app.InstrumentationRegistry -import org.junit.Assert -import org.junit.Test -import org.junit.runner.RunWith - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - Assert.assertEquals("dev.arkbuilders.drop", appContext.packageName) - } -} diff --git a/app/src/main/java/dev/arkbuilders/drop/app/data/datasource/ProfileLocalDataSource.kt b/app/src/main/java/dev/arkbuilders/drop/app/data/datasource/ProfileLocalDataSource.kt deleted file mode 100644 index f0962da..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/data/datasource/ProfileLocalDataSource.kt +++ /dev/null @@ -1,84 +0,0 @@ -package dev.arkbuilders.drop.app.data.datasource - -import android.content.Context -import android.content.SharedPreferences -import androidx.core.content.edit -import dev.arkbuilders.drop.app.data.model.UserAvatarDto -import dev.arkbuilders.drop.app.data.model.UserProfileDto -import dev.arkbuilders.drop.app.domain.AvatarHelper -import dev.arkbuilders.drop.app.domain.model.UserAvatar -import dev.arkbuilders.drop.app.domain.model.UserProfile -import kotlinx.serialization.json.Json - -class ProfileLocalDataSource( - context: Context, - private val avatarHelper: AvatarHelper, -) { - private val prefs: SharedPreferences = - context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) - - private val json = Json { ignoreUnknownKeys = true } - - fun loadProfile(): UserProfile { - val profileJson = prefs.getString(KEY_PROFILE, null) ?: return createDefaultProfile() - - return runCatching { - json - .decodeFromString(profileJson) - .toDomain() - }.getOrElse { - createDefaultProfile() - } - } - - private fun createDefaultProfile(): UserProfile { - val defaultAvatarId = "avatar_00" - val default = - UserProfile( - name = "Anonymous", - avatar = - UserAvatar( - base64 = avatarHelper.getDefaultAvatarBase64(defaultAvatarId), - predefinedId = defaultAvatarId, - ), - ) - saveProfile(default) - return default - } - - fun saveProfile(profile: UserProfile) { - runCatching { - val profileJson = json.encodeToString(profile.toDto()) - prefs.edit { putString(KEY_PROFILE, profileJson) } - } - } - - companion object { - private const val PREFS_NAME = "drop_profile" - private const val KEY_PROFILE = "user_profile" - } -} - -private fun UserProfileDto.toDomain() = - UserProfile( - name = name, - avatar = avatar.toDomain(), - ) - -private fun UserProfile.toDto() = - UserProfileDto( - name = name, - avatar = avatar.toDto(), - ) - -private fun UserAvatar.toDto() = - UserAvatarDto( - base64 = base64, - predefinedId = predefinedId, - ) - -private fun UserAvatarDto.toDomain() = - UserAvatar( - base64 = base64, - predefinedId = predefinedId, - ) diff --git a/app/src/main/java/dev/arkbuilders/drop/app/data/db/Database.kt b/app/src/main/java/dev/arkbuilders/drop/app/data/db/Database.kt deleted file mode 100644 index 4b87b2c..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/data/db/Database.kt +++ /dev/null @@ -1,33 +0,0 @@ -package dev.arkbuilders.drop.app.data.db - -import android.content.Context -import androidx.room.Room -import androidx.room.RoomDatabase -import androidx.room.TypeConverters -import dev.arkbuilders.drop.app.data.db.dao.TransferSessionDao -import dev.arkbuilders.drop.app.data.db.entity.RoomTransferSession -import dev.arkbuilders.drop.app.data.db.typeconverters.DropFileListConverter -import dev.arkbuilders.drop.app.data.db.typeconverters.OffsetDateTimeTypeConverter - -@androidx.room.Database( - entities = [ - RoomTransferSession::class, - ], - version = 1, - exportSchema = true, -) -@TypeConverters( - OffsetDateTimeTypeConverter::class, - DropFileListConverter::class, -) -abstract class Database : RoomDatabase() { - abstract fun transferHistoryDao(): TransferSessionDao - - companion object { - const val DB_NAME = "arkdrop.db" - - fun build(ctx: Context) = - Room.databaseBuilder(ctx, Database::class.java, DB_NAME) - .build() - } -} diff --git a/app/src/main/java/dev/arkbuilders/drop/app/data/db/typeconverters/OffsetDateTimeTypeConverter.kt b/app/src/main/java/dev/arkbuilders/drop/app/data/db/typeconverters/OffsetDateTimeTypeConverter.kt deleted file mode 100644 index b91bab6..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/data/db/typeconverters/OffsetDateTimeTypeConverter.kt +++ /dev/null @@ -1,16 +0,0 @@ -package dev.arkbuilders.drop.app.data.db.typeconverters - -import androidx.room.TypeConverter -import java.time.OffsetDateTime - -object OffsetDateTimeTypeConverter { - @TypeConverter - fun fromOffsetDateTime(date: OffsetDateTime): String = date.toString() - - @TypeConverter - fun toOffsetDateTime(dateString: String): OffsetDateTime { - val date = OffsetDateTime.parse(dateString) - val offset = OffsetDateTime.now().offset - return date.withOffsetSameInstant(offset) - } -} diff --git a/app/src/main/java/dev/arkbuilders/drop/app/data/model/UserAvatarDto.kt b/app/src/main/java/dev/arkbuilders/drop/app/data/model/UserAvatarDto.kt deleted file mode 100644 index cdafc8e..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/data/model/UserAvatarDto.kt +++ /dev/null @@ -1,9 +0,0 @@ -package dev.arkbuilders.drop.app.data.model - -import kotlinx.serialization.Serializable - -@Serializable -data class UserAvatarDto( - val base64: String, - val predefinedId: String?, -) diff --git a/app/src/main/java/dev/arkbuilders/drop/app/data/model/UserProfileDto.kt b/app/src/main/java/dev/arkbuilders/drop/app/data/model/UserProfileDto.kt deleted file mode 100644 index 5688139..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/data/model/UserProfileDto.kt +++ /dev/null @@ -1,9 +0,0 @@ -package dev.arkbuilders.drop.app.data.model - -import kotlinx.serialization.Serializable - -@Serializable -data class UserProfileDto( - val name: String, - val avatar: UserAvatarDto, -) diff --git a/app/src/main/java/dev/arkbuilders/drop/app/data/repository/ProfileRepoImpl.kt b/app/src/main/java/dev/arkbuilders/drop/app/data/repository/ProfileRepoImpl.kt deleted file mode 100644 index 165c968..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/data/repository/ProfileRepoImpl.kt +++ /dev/null @@ -1,29 +0,0 @@ -package dev.arkbuilders.drop.app.data.repository - -import dev.arkbuilders.drop.app.data.datasource.ProfileLocalDataSource -import dev.arkbuilders.drop.app.domain.model.UserAvatar -import dev.arkbuilders.drop.app.domain.model.UserProfile -import dev.arkbuilders.drop.app.domain.repository.ProfileRepo -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.asStateFlow - -class ProfileRepoImpl( - private val localDataSource: ProfileLocalDataSource, -) : ProfileRepo { - private val _profile = MutableStateFlow(localDataSource.loadProfile()) - override val profile: StateFlow = _profile.asStateFlow() - - override fun updateProfile(profile: UserProfile) { - _profile.value = profile - localDataSource.saveProfile(profile) - } - - override fun updateName(name: String) { - updateProfile(_profile.value.copy(name = name)) - } - - override fun updateAvatar(avatar: UserAvatar) { - updateProfile(_profile.value.copy(avatar = avatar)) - } -} diff --git a/app/src/main/java/dev/arkbuilders/drop/app/di/AppModule.kt b/app/src/main/java/dev/arkbuilders/drop/app/di/AppModule.kt deleted file mode 100644 index e5b71bc..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/di/AppModule.kt +++ /dev/null @@ -1,44 +0,0 @@ -package dev.arkbuilders.drop.app.di - -import dev.arkbuilders.drop.app.data.datasource.ProfileLocalDataSource -import dev.arkbuilders.drop.app.data.datasource.TransferSessionLocalDataSource -import dev.arkbuilders.drop.app.data.db.Database -import dev.arkbuilders.drop.app.data.db.dao.TransferSessionDao -import dev.arkbuilders.drop.app.data.helper.AvatarHelperImpl -import dev.arkbuilders.drop.app.data.helper.PermissionsHelperImpl -import dev.arkbuilders.drop.app.data.helper.ResourcesHelperImpl -import dev.arkbuilders.drop.app.data.repository.NetworkStatusImpl -import dev.arkbuilders.drop.app.data.repository.ProfileRepoImpl -import dev.arkbuilders.drop.app.data.repository.ReceiveSessionRepo -import dev.arkbuilders.drop.app.data.repository.SendSessionRepo -import dev.arkbuilders.drop.app.data.repository.TransferSessionRepoImpl -import dev.arkbuilders.drop.app.domain.AvatarHelper -import dev.arkbuilders.drop.app.domain.PermissionsHelper -import dev.arkbuilders.drop.app.domain.ResourcesHelper -import dev.arkbuilders.drop.app.domain.repository.NetworkStatus -import dev.arkbuilders.drop.app.domain.repository.ProfileRepo -import dev.arkbuilders.drop.app.domain.repository.TransferSessionRepo -import dev.arkbuilders.drop.app.domain.usecase.ReceiveFilesUseCase -import dev.arkbuilders.drop.app.domain.usecase.SendFilesUseCase -import org.koin.dsl.module - -val appModule = - module { - single { ProfileRepoImpl(get()) } - single { ResourcesHelperImpl(get()) } - single { Database.build(get()) } - single { TransferSessionRepoImpl(get()) } - single { PermissionsHelperImpl(get()) } - single { NetworkStatusImpl(get()) } - single { AvatarHelperImpl(get()) } - single { ProfileLocalDataSource(get(), get()) } - single { TransferSessionLocalDataSource(get()) } - single { SendSessionRepo(get(), get(), get()) } - single { ReceiveSessionRepo(get(), get(), get()) } - factory { - val db: Database = get() - db.transferHistoryDao() - } - factory { SendFilesUseCase(get(), get(), get()) } - factory { ReceiveFilesUseCase(get()) } - } diff --git a/app/src/main/java/dev/arkbuilders/drop/app/di/ViewModelsModule.kt b/app/src/main/java/dev/arkbuilders/drop/app/di/ViewModelsModule.kt deleted file mode 100644 index ab8f0e8..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/di/ViewModelsModule.kt +++ /dev/null @@ -1,18 +0,0 @@ -package dev.arkbuilders.drop.app.di - -import dev.arkbuilders.drop.app.presentation.history.HistoryViewModel -import dev.arkbuilders.drop.app.presentation.home.HomeViewModel -import dev.arkbuilders.drop.app.presentation.profile.EditProfileViewModel -import dev.arkbuilders.drop.app.presentation.receive.ReceiveViewModel -import dev.arkbuilders.drop.app.presentation.send.SendViewModel -import org.koin.core.module.dsl.viewModel -import org.koin.dsl.module - -val viewModelsModule = - module { - viewModel { HistoryViewModel(get()) } - viewModel { HomeViewModel(get(), get(), get()) } - viewModel { EditProfileViewModel(get(), get()) } - viewModel { ReceiveViewModel(get(), get()) } - viewModel { SendViewModel(get(), get(), get()) } - } diff --git a/app/src/main/java/dev/arkbuilders/drop/app/domain/AvatarHelper.kt b/app/src/main/java/dev/arkbuilders/drop/app/domain/AvatarHelper.kt deleted file mode 100644 index 91ec9f5..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/domain/AvatarHelper.kt +++ /dev/null @@ -1,13 +0,0 @@ -package dev.arkbuilders.drop.app.domain - -interface AvatarHelper { - fun uriToBase64(uri: String): String? - - fun getDefaultAvatarBase64(avatarId: String): String - - companion object { - const val MAX_IMAGE_SIZE = 512 // Maximum width/height in pixels - const val JPEG_QUALITY = 85 // JPEG compression quality - const val MAX_FILE_SIZE = 500 * 1024 // 500KB max file size - } -} diff --git a/app/src/main/java/dev/arkbuilders/drop/app/domain/ResourcesHelper.kt b/app/src/main/java/dev/arkbuilders/drop/app/domain/ResourcesHelper.kt deleted file mode 100644 index d730dd7..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/domain/ResourcesHelper.kt +++ /dev/null @@ -1,14 +0,0 @@ -package dev.arkbuilders.drop.app.domain - -interface ResourcesHelper { - fun getFileName(uri: String): String? - - fun validateUris(uris: List): Pair, Int> - - fun getFileSize(uri: String): Long - - fun saveFileToDownloads( - fileName: String, - data: ByteArray, - ): String? -} diff --git a/app/src/main/java/dev/arkbuilders/drop/app/domain/model/BuildConfigFields.kt b/app/src/main/java/dev/arkbuilders/drop/app/domain/model/BuildConfigFields.kt deleted file mode 100644 index 1e139a1..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/domain/model/BuildConfigFields.kt +++ /dev/null @@ -1,6 +0,0 @@ -package dev.arkbuilders.drop.app.domain.model - -class BuildConfigFields( - val versionCode: Int, - val versionName: String, -) diff --git a/app/src/main/java/dev/arkbuilders/drop/app/domain/model/ReceiveSession.kt b/app/src/main/java/dev/arkbuilders/drop/app/domain/model/ReceiveSession.kt deleted file mode 100644 index 4f8e7b8..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/domain/model/ReceiveSession.kt +++ /dev/null @@ -1,9 +0,0 @@ -package dev.arkbuilders.drop.app.domain.model - -import dev.arkbuilders.drop.ReceiveFilesBubble -import dev.arkbuilders.drop.app.data.ReceiveFilesSubscriberImpl - -class ReceiveSession( - val bubble: ReceiveFilesBubble, - val subscriber: ReceiveFilesSubscriberImpl, -) diff --git a/app/src/main/java/dev/arkbuilders/drop/app/domain/model/SendSession.kt b/app/src/main/java/dev/arkbuilders/drop/app/domain/model/SendSession.kt deleted file mode 100644 index 25208bb..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/domain/model/SendSession.kt +++ /dev/null @@ -1,9 +0,0 @@ -package dev.arkbuilders.drop.app.domain.model - -import dev.arkbuilders.drop.SendFilesBubble -import dev.arkbuilders.drop.app.data.SendFilesSubscriberImpl - -class SendSession( - val bubble: SendFilesBubble, - val subscriber: SendFilesSubscriberImpl, -) diff --git a/app/src/main/java/dev/arkbuilders/drop/app/domain/repository/NetworkStatus.kt b/app/src/main/java/dev/arkbuilders/drop/app/domain/repository/NetworkStatus.kt deleted file mode 100644 index 804c89b..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/domain/repository/NetworkStatus.kt +++ /dev/null @@ -1,9 +0,0 @@ -package dev.arkbuilders.drop.app.domain.repository - -import kotlinx.coroutines.flow.StateFlow - -interface NetworkStatus { - fun isOnline() = onlineStatus.value - - val onlineStatus: StateFlow -} diff --git a/app/src/main/java/dev/arkbuilders/drop/app/domain/repository/ProfileRepo.kt b/app/src/main/java/dev/arkbuilders/drop/app/domain/repository/ProfileRepo.kt deleted file mode 100644 index 960dddf..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/domain/repository/ProfileRepo.kt +++ /dev/null @@ -1,17 +0,0 @@ -package dev.arkbuilders.drop.app.domain.repository - -import dev.arkbuilders.drop.app.domain.model.UserAvatar -import dev.arkbuilders.drop.app.domain.model.UserProfile -import kotlinx.coroutines.flow.StateFlow - -interface ProfileRepo { - val profile: StateFlow - - fun getCurrentProfile() = profile.value - - fun updateProfile(profile: UserProfile) - - fun updateName(name: String) - - fun updateAvatar(avatar: UserAvatar) -} diff --git a/app/src/main/java/dev/arkbuilders/drop/app/domain/usecase/ReceiveFilesUseCase.kt b/app/src/main/java/dev/arkbuilders/drop/app/domain/usecase/ReceiveFilesUseCase.kt deleted file mode 100644 index 732d522..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/domain/usecase/ReceiveFilesUseCase.kt +++ /dev/null @@ -1,51 +0,0 @@ -package dev.arkbuilders.drop.app.domain.usecase - -import dev.arkbuilders.drop.ReceiveFilesBubble -import dev.arkbuilders.drop.ReceiveFilesRequest -import dev.arkbuilders.drop.ReceiverConfig -import dev.arkbuilders.drop.ReceiverProfile -import dev.arkbuilders.drop.app.domain.repository.ProfileRepo -import dev.arkbuilders.drop.receiveFiles -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.withContext -import timber.log.Timber - -class ReceiveFilesUseCase( - private val profileRepo: ProfileRepo, -) { - suspend operator fun invoke( - ticket: String, - confirmation: UByte, - ): Result = - withContext(Dispatchers.IO) { - runCatching { - Timber.d("Starting file receive with ticket: $ticket") - - val profile = profileRepo.getCurrentProfile() - val receiverProfile = - ReceiverProfile( - name = profile.name.ifEmpty { "Anonymous" }, - avatarB64 = profile.avatar.base64.takeIf { it.isNotEmpty() }, - ) - - val request = - ReceiveFilesRequest( - ticket = ticket, - confirmation = confirmation, - profile = receiverProfile, - config = - ReceiverConfig( - chunkSize = 1024u * 512u, - parallelStreams = 4u, - ), - ) - - val bubble = receiveFiles(request) - - Timber.d("Receive bubble created and started") - bubble - }.onFailure { - Timber.e("Error starting file receive ${it.message}") - } - } -} diff --git a/app/src/main/java/dev/arkbuilders/drop/app/presentation/DropApplication.kt b/app/src/main/java/dev/arkbuilders/drop/app/presentation/DropApplication.kt deleted file mode 100644 index bee919f..0000000 --- a/app/src/main/java/dev/arkbuilders/drop/app/presentation/DropApplication.kt +++ /dev/null @@ -1,32 +0,0 @@ -package dev.arkbuilders.drop.app.presentation - -import android.app.Application -import dev.arkbuilders.drop.app.BuildConfig -import dev.arkbuilders.drop.app.di.appModule -import dev.arkbuilders.drop.app.di.viewModelsModule -import dev.arkbuilders.drop.app.domain.model.BuildConfigFields -import org.koin.android.ext.koin.androidContext -import org.koin.core.context.startKoin -import org.koin.dsl.module -import timber.log.Timber - -class DropApplication : Application() { - override fun onCreate() { - super.onCreate() - Timber.plant(Timber.DebugTree()) - - val buildConfigFieldsModule = - module { - single { - BuildConfigFields( - BuildConfig.VERSION_CODE, - BuildConfig.VERSION_NAME, - ) - } - } - startKoin { - androidContext(this@DropApplication) - modules(appModule, viewModelsModule, buildConfigFieldsModule) - } - } -} diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index 80ee67029b308ebd8ebee316dd268d6616486d46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1116 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 I+A2kF0qT^Bn*aa+ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp deleted file mode 100644 index 00afadf4d393059bd3f0f4e213eb2c37d1141d6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 862 zcmV-k1EKsB@v8Ns^-|DjTi-|2U3t*RY~16H;v3uA=qA zACoj>G$05AI6w{p5W_g$O#zUr{V9L1Pwr7;L>Xof$nt88q9XOKw2~(G?QN~{A>8Jq=E$R zlkF`{R=@1-AuUZ(7L8~gQYAekf>2FrAU~S*)%AYA*qmKDFMxn}it zwtEb_`%62kFW>*)TFJ5GvVXWfwm0YDumAb{{md_Kw~?Ii{{1dXjt1G1WSh1%kG-v9 z+qP}nwr%6uwso$3e{UgTj(hg|7!mzv7kuQ>j|R9hEpSg;cRh2T_rQm<#4a=pwaIoMEIY`vY?kIOEH3T@-Rhs;p1U zS?qlnkS{WzhHqv_?~CZ;O+;Qqe&`=SCSJbJo<4c}=;4Ed!=vMqbLTHytT^i~^^Mj* z=`3p(T)r{}rBzoiHe6Y4;P~J%!Mz|B4SJb+K+Gp6VhW|EVLH(O%%F!J<`Uv5jwn!PjEU_B@qBM* zYjb10QI|e`_qGVoy=~KF+`n`gPFH!u&RX`z|I5afJN%_!vYme94w;#R0BS0r2mk;8 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp deleted file mode 100644 index 6e542fe535dc3b22eff7b8dad937bec134803c8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1568 zcmV+*2H*KoNk&E(1^@t8MM6+kP&iBr1^@srFTe{BwT6PWZJ2~V>~;r2L`(o(75GS5 zvTdtzb0-lR1LFWP1LkBJDSswkseI8tGcz+YGc!{&zxQspK~M4suFI00>*}(ixFw^a z2syWH9eb7cdllO@D;u3{+g4}u2iQ)X&bInbb*}CEKF?<0wvnP__n4u(Z-8xU+u7*; z&pNhk+qP=kP3i_U^QU((p81XjwP8t;ZQ5F6y|!)JoCUvZ+qUn0wgFp`WYg9x9ox2T z+qR#4F23J3$TpHc$Q{As{iO`tHd5qeJibSeR%DPx-lrz|w(pQdQHC5fh`MNnPQ3$6 z4OT#Lkr zkP!bpHl=4X7iV=PBnkoKrxXMjunw6L&;SL-usB3w<|k7M0Z1d1GLV|XR|-wG0O><6gtGQ!($9%sU0kPR_cO`mk-qu#Lz+ zz7epm`5Y@Q$C}HzVq8ngcfuG3-GcNftjYTiiAr}Y{sVyipvTcZYgOHJD37`o2mR8u zLFwG6cxXb{F)gT@sA zLa(Ih^AsuKQ&XcwA)$6j&O&0gxJnUgiNcBqdHI+6{N1?Xus($i<8*Ol%vv^-30%J! z-=}vVb4$1)NZjK292A8N8|XRvwxtDzmkuDNPWNPLq75puT+qfH7w|=xG@K5 z!9bEW;Dt;CLA^t%OA0RLp8)+uf_UMZ|AM5TXy@YwvVBS}upm0t>_x6S0l+pQ@hL0_ zBJgGv7@xW`mpVpN6I05LO>d6-o)7S?(1tK-TM)3vcRS$O9dk|2*gBUir5lqP%kkex@%K>qeDB_0mfh-QYeYH zYaEGgx|BZYPz+3nH;z2<#*nYn3;9M-uf+R1^@=?|V@(Pr`FW>jg>!CNlp`bRgNg_0 zgLtJsu%v*sDWtVNL8=tKZH}CYa@f-!BG)*_ z!0Pi;^W@mG7qF%6Y~xr3aamgWuPY?0IT-+W#P7e0vq8McH_c%%JUp5QQbE{~nMMY? zCi{>x$oUy8SYO#H0EwlN`Jw=v*=-}os2u?woNny3BWmW!=D*GX4xEAC&KkE`L61^cmCr`UkMU!P_N7VIsE)`|2+EF-SmB%S=b3$U;!Sp6W8^g-+g@dUit0y z_lMT%2j!Ey^Sjgso>8rHk<41p1$fYpz!AKL`A>?T9MfqJ{HaA9K{X_cI%l{?!ge75 SEzkkIuGU)6f_$Vu2>}4<`us-# diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100644 index c569ae5805bb3456984119d021545a5c177fd23e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1358 zcmV-U1+n^4Nk&FS1pok7MM6+kP&iCE1pojqU%(d-O`vVtHi*#8{{LY+K~IS2{{+k# zZ4cN8CkI)Jai3`YOGS+& zMWq7)_?I*ixZy?mKLOycRU}$t33@{4$6PqFw?dck51r zoIlRVm^1AZ0Y|cJ)ym%YzWd!>BOEfu@pHyO!cZ0#N;WY&{$8(ebweSRgd_cPi#J#$Tw!`q*&& z!9Vr*7DyhzXlH6%`)3g9r|G0|8DAFN(^;X|tNyMQpb**^9`pVD*a%QL2y-RX075JJ z^w+059X>Dz62FD{p`o3BK74|Zjq`+-hO7|_EUKp9iYm~P{iP%=2-bjTq8ix2u4?v~ z18?@?*Q`aOg^@)jk!f^H42fh&U<4*3Fbpx27In0-g=ST=ipRfvFaom>0Y(NQpbSiz zKnRKuN@ZY%1t`5E3{bP*;1BP-J$FE~Pw$oN)y?-OM_vsHEpJ{~y8Dbw2^qnghu^E8 z|C&$|g=I&SvJ6jb_a>DA9Nu#G>dse_-$QE8j;(L}(Zc`UiN*$R?NI^)04P-ffFoP( zTcfM1nW3ezsOnV}Aa+x+U=H(Z$6B ztf{adDATX~@Tdm*i=w(aPjmx-?tWwQNniwGL@|tz1Yf@F(;LOuUT1500MOkJ07j{ zkJ3LNU66~+s4}dw14@yBU}9iGUaA z5XDjqN>-$l0ssO8vXw0g08p~f(8^X;@aM6A)Rxzjxe(LSYhTy)Jt?_+;4Pa%^^dZ; zS^{u*%fqWX-vh%eC{!nj!KL+0I9mAMJCR)qMw-}YY#k^m&6mFcz|ozLt(ErmtBce7 zGol#pp8qV_=Rdu9m8h^FXhIltpd%s5((cH-W;XyOgR_*ZZ>)(G;P*b5jg`u__|IAt zvOoo52QegMNMJ-U8G&I0hLWfY8JJYvy7@u|G*=k>NI+u+KiZ*g&=v6iCMnXfDcG?< z!r7+n8zSK))r^(DMbKF!VOwg)RF?|d3KIN#f7#OKki$EpMNW_OxA~{qurB@bM}0o} z6F+U(95`e4`}Z}B*8-4ic!BB?c>P!jzPdcWEc!u1cH%9+_*~szHIFcz1NDdc&6ijA zN0oO*xBlk={WKtW|MA)Gi;Fj}{f1yw1lQaj_n*$LuBhLbJ#L|3BAtA2@9xOt(XI)z zE>L&Jd3o+>Qop5e*~JooxNIk_@App#wR5B=L!-F%PeIv44&Q8Gzy#M>StkiA^2nWc Q5Q-;Kh){cgM(8aC008WoF#rGn diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index cf0abd117a364ef545c89d6492d46d0f724f6b59..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3206 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 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp deleted file mode 100644 index 3cb1f6efecbd86c2e5e9ccd6e833b14b41f5efa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1652 zcmV-)28;PpNk&F&1^@t8MM6+kP&iCr1^@srkH8}kO)zL1$&qI6zGnC%zK$TG{}Z4y zT_%cTkJ;U&T_hv(d{ht8v_mY>&u_~tk07do@P#rxU z3r^IvbO)Z6_bz_j@KluC;B7q*V2~Z@ft8l5t2$xnH{pcTe42Mk?sR>Biwh3jdP% z(TZ>=+zb0TaBJIEt?d2XJ@^07jFdJUDj;;Jz#7mt$QeY0?(VM7^}voK$x)S!G7Jy! z9vj}5)}mqpK=@=@n;7GIK&>OE8VrU{6@q$@Ix=hyLBfgHjAtlhtT+;E_BDnw zypt!Z05mtBr(P=-3IhQ^f!=h=I~ zU>+7eb$37!rw)i{dW(#xDjCmV6?zw%6nk$A&IJabVwk`ByZ^JYz*eFQ08r6b!kOUx z7gqK?(lRD?_Z*y~G&oPqAU^tNgQ!Lm*kG=p0`17zb>H@jEWn_+>srlqR0_5wWJ+&Y zWB{=D!@R}MijrDP$-1HV*cuUYdtOwHRdi42Gq6N0yt6q6OIoC8rAKT-slh(W{IgY@ zGM8agNs>gvC&|cb661C7;lEg>4qrOL0D!GQ4IFmM5dh+_iK=4BSjEy7JG2Moj&1c1 z&aSR|YM22ua|RtXR+JUYEF6P8lFTR4R9a&28B=;qqLNaE#X!q3(RvwCEYkuy6L9zj z0RSTo`^uvEiX~)0M{rcH;Oy#sV(;I4j*ZyB2DInckem?*KR$i#;NJ>n`pUJUNYp1{ z5H;M>0DVRu+B2KHa6rChHFx-4H~v#diJ@4|a?c{`FUvxEpv#va}q>SDu;+)Df6k0F9i0HV_ z2JIvu-e2C6nKyG{vyb`DufzhmwLr=Vl&aK8NWRseIN*fhZ2pKoWKbj60&M}Vi(n<(w zl@et#+}H#TW^`U37cizSBwU6WghFhvM1bGAn>*s47TP&pH^#C1%7*TTVDsXrDx#kR zzW{stwz>WL;!^;-mKm059wR0p0;q2v2HT8AQEsD$P9`EXIX9}as2@=#Z zztZlm?ys0i`tBu@el=yo2FCz*JZr;2hk8c`+w&rDxmHjl&pto=gbauQGX4vS){=BH ztgyGUcem!yTxdh-{sE&CbT%@S_)q+m0q=k$dd)DyQq|nf?6+aA7m)7@b?8ukKzj+K yY~z7}$C_(BL*r_i8phY+m&IRw$~W{p&oc_pzVG|g5kMLm8oIxxre@@-;W4Ftx)Iv| diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp deleted file mode 100644 index ea8abc0d8142bf3e107b529341904bdc6289f65e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4402 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 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp deleted file mode 100644 index b25f486cf8d5c53072d74eabadd5f58163deddd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1988 zcmV;#2RryuNk&Gz2LJ$9MM6+kP&iDm2LJ#szrZgLO)!ikDN(WTI-7sO$RP84`eCqnZe96AB+v(!^Zdj=3>= z!Nj(0B?p=R*nT8x@{2o-^+_RPbN5p}1`u zN7{ew)GPmpm;gTQxpWKfWbhrJg0JMYsxzTu!<6O!QzR+BY+b?Kxw-q9;LdCC1nzhC z5jgV@?k9J5cNo{MLT)*ce~$cu(*{LGBrcsKdLlaFx471Bgj`9sRl8YxpL^aFGqW^%W=CEHeQH)~&!nVC6fi2T!znb{#j#LR3l zOUEP_$tvNjI`!5GPh$3pZn&cT3a)M2#-4q?-~RvDwp%Ba`&8*|R;m6nc!Ruv-P^2e z+vbK^+qP?E?kB(g1IeHWx}bG>NG=B(S4;qi?`g9puoOIKf~2+5z$ApUVbrf_4Kxt} zNn|0l1n+x%#ygU5e)UfLo@l`^>X3)@HU&<<;sajc7Ea+Zi#*f!L<1Jl#CO&R934m! zS22(4-^(wuTIkG^zvj&FgP@GgkjqQ-I+2}JOb}jeYoZmC^IfFEVwxi+Z<_S~Xug94 z)6kL#J3JhJX7zu9e2FetXhIXs`RfqtCvWR=3gbxwA3U7rPv&6lt;6Cn~Fet8y{X~?vR>k(%i-Rl-)DS68o?nY2G?!O%`b)%%auyq}`_%sf;LR z+O)zdm)D7VqL!Fu{aEzz4{fo_R!x%!qHU<%_b%`o%WUN=c>pE1*o9)+eX!(EsGpv> ze(&sphMF+cAWTRpN;FACx-!ZoljIesQ$ZA+P==P$QjzisbVb!UboX}Oys>+wG}6*A zLrNo)$+&D7h6-tJ=!h#_G}%l!@+19-3tx4k1Vh;<2{coFX5uMy2LS(U!;f=35w33z z4YjvMeS1aiU*MB}GHa*}W91P?k}29>L+ys_o#Dx7qZ}s+kUL-_;^iMS6BB145|Y*FEl&F0;7$}A*a!LSYX@R;Bblug_MR$ zCAw-#sgx>d`r##eobTT~<;}CvJkRXttxoLD7n|ARz|R}GA3yDg2|&BdkhZaCWsi?` zdblMuA^KEP2~BiGSA|ImI_i>AHFaNg^(d}y${wdUc3nOf9T6#~Ty&IyOcFs6l#7mB zDc6T%U-mfN)6J!^XTR9|XpaLwfA`|U#kl~bqpc!AI4dOU44vg?JAZs}YUAGoIl<{2 zCwqLl=UJzQEkk`H7AmjM5=D8b6aUBQKD!ZZ=j-de*ts7+GOQX*l&-A3w1?5g{~0>M z-w42uq!D1~h#z6=)OIkkKTG474IQDWW{(3>-(7s1A8I=vFP`s9d=*VnM!is^!c@PJ zJv+2nnh8EaB z`*riOf=&tGiEy2hY^a?T?eusY*!^PPr|ZJ*45D0-Qi>8?M7lD{rIc5oP6b+}(3D1S z#5XE)QihrcbS!kYr`)pV&$H1y`#f`4>>%4sDJwx>lbA>0NI0!NyspsuzmC2{lW>H& z?~i=u=N^D=7M}5b`5i5q;}T{+U-~lLF4}#(S57vZx}Bpz$SJ(~2%a7ZxhHNPN2kEpM&)xjc1=$)oy@IFioOv30Z@{$sm|m2l7~$n>ucERL zW8{vk+DCB5`cFrgm&3$8F+J(;g43_vaqtW(swG<@|6kMHxbN`7Grv6TCHe@0L8Kr3 znuS}X9MpFJhJNidbTC1tQx~k*d(cbz;HO>;A~2E%;0QbJMor3PlZTA%h27B=GUwnq zFtWUahjHIA%%tazCsBZhQiRivoY=SLwI4sWPsuLW8SBx**TKuHSi~E65l`H|ZD-TD zIC9!Hg1n$gY}+NS>@ttfYCE`jr{aytJH~fSt$_noGW%od>+8=Ryn4w6{2$2AaN1Zz zKU7N5FnY)6_xr5cJvHaRu*%>s4>uf9Q(rfvLYLrN|Rf5)lP=;O=PkhDr>7 zN;?s!yygG+Pf7GuB8kX&Jc$Fl!SuLK3S3&z)o@;xeT4Ag{X|mo<(+9VnM~ReC5Aqw zUm*xS`Q(#CuOBZd WeuR;6#DWsVH90c!GjKHDL9hYL3h=!E diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp deleted file mode 100644 index 9c4aa6ce8204eaa8247a7e872ba61471830ac464..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5878 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 MRRIvA5+e!M1%I|o&Hw-a diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml deleted file mode 100644 index f8c6127..0000000 --- a/app/src/main/res/values/colors.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - #FFBB86FC - #FF6200EE - #FF3700B3 - #FF03DAC5 - #FF018786 - #FF000000 - #FFFFFFFF - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml deleted file mode 100644 index 0a26eb8..0000000 --- a/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - Drop - \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml deleted file mode 100644 index 630d594..0000000 --- a/app/src/main/res/values/themes.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - -