From 2cd0b3034d25fdfc9773bbb8099321572e7f17ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Sat, 12 Apr 2025 18:17:17 +0200 Subject: [PATCH] Initialize Rewrite --- .gitea/workflows/job.yaml | 46 --- .idea/.gitignore | 8 - .idea/.name | 1 - .idea/compiler.xml | 6 - .idea/dataSources.xml | 23 -- .idea/deploymentTargetSelector.xml | 18 -- .idea/gradle.xml | 18 -- .idea/misc.xml | 12 - .idea/runConfigurations.xml | 17 - .idea/vcs.xml | 6 - app/build.gradle.kts | 45 +-- .../notevault/ExampleInstrumentedTest.java | 25 -- .../notevault/ExampleInstrumentedTest.kt | 24 ++ app/src/main/AndroidManifest.xml | 10 +- .../stormtales/notevault/MainActivity.java | 90 ------ .../notevault/data/MusicDatabase.java | 33 -- .../notevault/data/dao/SongDao.java | 87 ----- .../notevault/data/entities/NoteSheet.java | 101 ------ .../notevault/data/entities/Song.java | 131 -------- .../data/entities/SongNoteSheet.java | 15 - .../notevault/data/model/LoggedInUser.java | 23 -- .../data/repositories/SongRepository.java | 86 ----- .../data/repositories/SongSyncRepository.java | 303 ------------------ .../notevault/data/sync/DateConverter.java | 20 -- .../notevault/data/sync/SyncStatus.java | 9 - .../data/sync/SyncStatusConverter.java | 15 - .../notevault/network/APICallback.java | 6 - .../notevault/network/NetworkModule.java | 36 --- .../notevault/network/StatusResponse.java | 14 - .../notevault/network/auth/AuthAPI.java | 17 - .../network/auth/AuthInterceptor.java | 29 -- .../notevault/network/auth/AuthService.java | 87 ----- .../notevault/network/auth/LoginRequest.java | 11 - .../notevault/network/auth/LoginResponse.java | 22 -- .../network/auth/RegisterRequest.java | 14 - .../notevault/network/auth/TokenManager.java | 31 -- .../notevault/network/sync/SongSyncAPI.java | 45 --- .../network/sync/SongSyncModule.java | 154 --------- .../network/sync/SongSyncService.java | 246 -------------- .../network/sync/models/AIRecognizedSong.java | 40 --- .../sync/models/BatchCreateResponse.java | 15 - .../sync/models/BatchModifyResponse.java | 15 - .../network/sync/models/CreateResponse.java | 22 -- .../network/sync/models/FetchResponse.java | 15 - .../sync/models/NoteSheetModifyRequest.java | 27 -- .../RemotelyModifiedNoteSheetModel.java | 31 -- .../sync/models/SongBatchDeleteRequest.java | 19 -- .../sync/models/SongCreateBatchRequest.java | 20 -- .../sync/models/SongCreateRequest.java | 67 ---- .../network/sync/models/SongModel.java | 69 ---- .../sync/models/SongModifyBatchRequest.java | 19 -- .../sync/models/SongModifyBatchResponse.java | 16 - .../sync/models/SongModifyRequest.java | 82 ----- .../sync/models/SongModifyResponse.java | 25 -- .../network/sync/models/UploadResponse.java | 31 -- .../notevault/ui/gallery/GalleryFragment.java | 124 ------- .../ui/gallery/GalleryViewModel.java | 92 ------ .../notevault/ui/home/HomeFragment.java | 138 -------- .../notevault/ui/home/HomeViewModel.java | 88 ----- .../notevault/ui/home/SongAdapter.java | 99 ------ .../notevault/ui/login/LoginDialog.java | 156 --------- .../notevault/ui/login/LoginFormState.java | 37 --- .../notevault/ui/login/LoginViewModel.java | 116 ------- .../ui/sheetdisplay/ImagePagerAdapter.java | 51 --- .../NoteSheetDisplayActivity.java | 40 --- .../ui/slideshow/SlideshowFragment.java | 35 -- .../ui/slideshow/SlideshowViewModel.java | 19 -- .../ui/songeditor/SongEditorDialog.java | 193 ----------- .../notevault/utils/NoteSheetsUtil.java | 117 ------- .../com/stormtales/notevault/utils/Tupel.java | 33 -- .../notevault/utils/UriTimestamp.java | 21 -- .../stormborntales/notevault/MainActivity.kt | 47 +++ .../notevault/ui/theme/Color.kt | 11 + .../notevault/ui/theme/Theme.kt | 58 ++++ .../stormborntales/notevault/ui/theme/Type.kt | 34 ++ app/src/main/res/drawable/delete.xml | 9 - .../main/res/drawable/dialog_background.xml | 6 - ...24dp_e8eaed_fill0_wght400_grad0_opsz24.xml | 9 - app/src/main/res/drawable/ic_menu_camera.xml | 12 - app/src/main/res/drawable/ic_menu_gallery.xml | 9 - .../main/res/drawable/ic_menu_slideshow.xml | 9 - app/src/main/res/drawable/login.xml | 9 - app/src/main/res/drawable/logout.xml | 9 - app/src/main/res/drawable/side_nav_bar.xml | 9 - app/src/main/res/layout/activity_main.xml | 26 -- .../res/layout/activity_note_sheet_viewer.xml | 17 - app/src/main/res/layout/app_bar_main.xml | 26 -- app/src/main/res/layout/content_main.xml | 22 -- app/src/main/res/layout/fragment_gallery.xml | 194 ----------- app/src/main/res/layout/fragment_home.xml | 37 --- app/src/main/res/layout/fragment_login.xml | 79 ----- .../main/res/layout/fragment_login_dialog.xml | 84 ----- .../main/res/layout/fragment_slideshow.xml | 23 -- .../layout/fragment_song_editor_dialog.xml | 146 --------- app/src/main/res/layout/item_image.xml | 11 - app/src/main/res/layout/item_song.xml | 77 ----- app/src/main/res/layout/nav_header_main.xml | 36 --- .../main/res/menu/activity_main_drawer.xml | 20 -- app/src/main/res/menu/main.xml | 8 - .../ic_launcher.xml | 0 .../ic_launcher_round.xml | 0 .../main/res/navigation/mobile_navigation.xml | 25 -- app/src/main/res/values-land/dimens.xml | 3 - app/src/main/res/values-night/themes.xml | 16 - app/src/main/res/values-w1240dp/dimens.xml | 3 - app/src/main/res/values-w600dp/dimens.xml | 3 - app/src/main/res/values/colors.xml | 4 - app/src/main/res/values/dimens.xml | 11 - app/src/main/res/values/strings.xml | 22 -- app/src/main/res/values/themes.xml | 24 +- .../main/res/xml/network_security_config.xml | 6 - .../stormtales/notevault/ExampleUnitTest.java | 17 - .../notevault/ExampleUnitTest.kt | 17 + build.gradle.kts | 2 + gradle.properties | 2 + gradle/libs.versions.toml | 45 +-- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle.kts | 2 +- 118 files changed, 250 insertions(+), 4747 deletions(-) delete mode 100644 .gitea/workflows/job.yaml delete mode 100644 .idea/.gitignore delete mode 100644 .idea/.name delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/dataSources.xml delete mode 100644 .idea/deploymentTargetSelector.xml delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/runConfigurations.xml delete mode 100644 .idea/vcs.xml delete mode 100644 app/src/androidTest/java/com/stormtales/notevault/ExampleInstrumentedTest.java create mode 100644 app/src/androidTest/java/come/stormborntales/notevault/ExampleInstrumentedTest.kt delete mode 100644 app/src/main/java/com/stormtales/notevault/MainActivity.java delete mode 100644 app/src/main/java/com/stormtales/notevault/data/MusicDatabase.java delete mode 100644 app/src/main/java/com/stormtales/notevault/data/dao/SongDao.java delete mode 100644 app/src/main/java/com/stormtales/notevault/data/entities/NoteSheet.java delete mode 100644 app/src/main/java/com/stormtales/notevault/data/entities/Song.java delete mode 100644 app/src/main/java/com/stormtales/notevault/data/entities/SongNoteSheet.java delete mode 100644 app/src/main/java/com/stormtales/notevault/data/model/LoggedInUser.java delete mode 100644 app/src/main/java/com/stormtales/notevault/data/repositories/SongRepository.java delete mode 100644 app/src/main/java/com/stormtales/notevault/data/repositories/SongSyncRepository.java delete mode 100644 app/src/main/java/com/stormtales/notevault/data/sync/DateConverter.java delete mode 100644 app/src/main/java/com/stormtales/notevault/data/sync/SyncStatus.java delete mode 100644 app/src/main/java/com/stormtales/notevault/data/sync/SyncStatusConverter.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/APICallback.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/NetworkModule.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/StatusResponse.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/auth/AuthAPI.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/auth/AuthInterceptor.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/auth/AuthService.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/auth/LoginRequest.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/auth/LoginResponse.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/auth/RegisterRequest.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/auth/TokenManager.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/SongSyncAPI.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/SongSyncModule.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/SongSyncService.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/models/AIRecognizedSong.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/models/BatchCreateResponse.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/models/BatchModifyResponse.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/models/CreateResponse.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/models/FetchResponse.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/models/NoteSheetModifyRequest.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/models/RemotelyModifiedNoteSheetModel.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/models/SongBatchDeleteRequest.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/models/SongCreateBatchRequest.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/models/SongCreateRequest.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/models/SongModel.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/models/SongModifyBatchRequest.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/models/SongModifyBatchResponse.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/models/SongModifyRequest.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/models/SongModifyResponse.java delete mode 100644 app/src/main/java/com/stormtales/notevault/network/sync/models/UploadResponse.java delete mode 100644 app/src/main/java/com/stormtales/notevault/ui/gallery/GalleryFragment.java delete mode 100644 app/src/main/java/com/stormtales/notevault/ui/gallery/GalleryViewModel.java delete mode 100644 app/src/main/java/com/stormtales/notevault/ui/home/HomeFragment.java delete mode 100644 app/src/main/java/com/stormtales/notevault/ui/home/HomeViewModel.java delete mode 100644 app/src/main/java/com/stormtales/notevault/ui/home/SongAdapter.java delete mode 100644 app/src/main/java/com/stormtales/notevault/ui/login/LoginDialog.java delete mode 100644 app/src/main/java/com/stormtales/notevault/ui/login/LoginFormState.java delete mode 100644 app/src/main/java/com/stormtales/notevault/ui/login/LoginViewModel.java delete mode 100644 app/src/main/java/com/stormtales/notevault/ui/sheetdisplay/ImagePagerAdapter.java delete mode 100644 app/src/main/java/com/stormtales/notevault/ui/sheetdisplay/NoteSheetDisplayActivity.java delete mode 100644 app/src/main/java/com/stormtales/notevault/ui/slideshow/SlideshowFragment.java delete mode 100644 app/src/main/java/com/stormtales/notevault/ui/slideshow/SlideshowViewModel.java delete mode 100644 app/src/main/java/com/stormtales/notevault/ui/songeditor/SongEditorDialog.java delete mode 100644 app/src/main/java/com/stormtales/notevault/utils/NoteSheetsUtil.java delete mode 100644 app/src/main/java/com/stormtales/notevault/utils/Tupel.java delete mode 100644 app/src/main/java/com/stormtales/notevault/utils/UriTimestamp.java create mode 100644 app/src/main/java/come/stormborntales/notevault/MainActivity.kt create mode 100644 app/src/main/java/come/stormborntales/notevault/ui/theme/Color.kt create mode 100644 app/src/main/java/come/stormborntales/notevault/ui/theme/Theme.kt create mode 100644 app/src/main/java/come/stormborntales/notevault/ui/theme/Type.kt delete mode 100644 app/src/main/res/drawable/delete.xml delete mode 100644 app/src/main/res/drawable/dialog_background.xml delete mode 100644 app/src/main/res/drawable/edit_24dp_e8eaed_fill0_wght400_grad0_opsz24.xml delete mode 100644 app/src/main/res/drawable/ic_menu_camera.xml delete mode 100644 app/src/main/res/drawable/ic_menu_gallery.xml delete mode 100644 app/src/main/res/drawable/ic_menu_slideshow.xml delete mode 100644 app/src/main/res/drawable/login.xml delete mode 100644 app/src/main/res/drawable/logout.xml delete mode 100644 app/src/main/res/drawable/side_nav_bar.xml delete mode 100644 app/src/main/res/layout/activity_main.xml delete mode 100644 app/src/main/res/layout/activity_note_sheet_viewer.xml delete mode 100644 app/src/main/res/layout/app_bar_main.xml delete mode 100644 app/src/main/res/layout/content_main.xml delete mode 100644 app/src/main/res/layout/fragment_gallery.xml delete mode 100644 app/src/main/res/layout/fragment_home.xml delete mode 100644 app/src/main/res/layout/fragment_login.xml delete mode 100644 app/src/main/res/layout/fragment_login_dialog.xml delete mode 100644 app/src/main/res/layout/fragment_slideshow.xml delete mode 100644 app/src/main/res/layout/fragment_song_editor_dialog.xml delete mode 100644 app/src/main/res/layout/item_image.xml delete mode 100644 app/src/main/res/layout/item_song.xml delete mode 100644 app/src/main/res/layout/nav_header_main.xml delete mode 100644 app/src/main/res/menu/activity_main_drawer.xml delete mode 100644 app/src/main/res/menu/main.xml rename app/src/main/res/{mipmap-anydpi => mipmap-anydpi-v26}/ic_launcher.xml (100%) rename app/src/main/res/{mipmap-anydpi => mipmap-anydpi-v26}/ic_launcher_round.xml (100%) delete mode 100644 app/src/main/res/navigation/mobile_navigation.xml delete mode 100644 app/src/main/res/values-land/dimens.xml delete mode 100644 app/src/main/res/values-night/themes.xml delete mode 100644 app/src/main/res/values-w1240dp/dimens.xml delete mode 100644 app/src/main/res/values-w600dp/dimens.xml delete mode 100644 app/src/main/res/values/dimens.xml delete mode 100644 app/src/main/res/xml/network_security_config.xml delete mode 100644 app/src/test/java/com/stormtales/notevault/ExampleUnitTest.java create mode 100644 app/src/test/java/come/stormborntales/notevault/ExampleUnitTest.kt diff --git a/.gitea/workflows/job.yaml b/.gitea/workflows/job.yaml deleted file mode 100644 index 62cdd71..0000000 --- a/.gitea/workflows/job.yaml +++ /dev/null @@ -1,46 +0,0 @@ -+name: Build and Upload APK - -on: - push: - branches: - - notevault-3 # Trigger für den Hauptbranch - pull_request: - branches: - - notevault-3 # Trigger für Pull Requests in den Hauptbranch - -jobs: - build: - runs-on: ubuntu-latest - - steps: - # Schritt 1: Checkout des Repositories - - name: Checkout repository - uses: actions/checkout@v3 - - # Schritt 2: Setup JDK - - name: Set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - - # Schritt 3: Installiere Gradle und Baue die APK - - name: Build APK - run: | - sudo apt-get update - sudo apt-get install -y wget unzip - wget https://services.gradle.org/distributions/gradle-7.4-bin.zip - unzip gradle-7.4-bin.zip - export PATH=$PWD/gradle-7.4/bin:$PATH - ./gradlew clean assembleRelease - - # Schritt 4: Upload der APK - - name: Upload APK to Gitea Releases - uses: pappasam/gitea-release-action@v1 - with: - gitea_token: ${{ secrets.REGISTRY_PASSWORD }} # Dein Gitea API-Token - gitea_url: 'https://git.fawkes100.de' # Deine Gitea-URL - owner: ${{ secrets.REGISTRY_USER }} # Dein Gitea-Benutzername - repo: 'NoteVault' # Dein Repository-Name - tag_name: 'v${{ github.sha }}' # Der Tag für die Version - file: 'app/build/outputs/apk/release/app-release.apk' # Pfad zur APK-Datei - diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index 3f3ac07..0000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -NoteVault \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index b86273d..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml deleted file mode 100644 index 5c70232..0000000 --- a/.idea/dataSources.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - sqlite.xerial - true - org.sqlite.JDBC - jdbc:sqlite:$PROJECT_DIR$/music_database - - - - $ProjectFileDir$ - - - file://$APPLICATION_CONFIG_DIR$/jdbc-drivers/Xerial SQLiteJDBC/3.45.1/org/xerial/sqlite-jdbc/3.45.1.0/sqlite-jdbc-3.45.1.0.jar - - - file://$APPLICATION_CONFIG_DIR$/jdbc-drivers/Xerial SQLiteJDBC/3.45.1/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar - - - - - \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml deleted file mode 100644 index 818c0d7..0000000 --- a/.idea/deploymentTargetSelector.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index e76fb07..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 7c2d85a..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 16660f1..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 12b800a..cea861b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,14 +1,16 @@ plugins { alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.compose) } android { - namespace = "com.stormtales.notevault" + namespace = "come.stormborntales.notevault" compileSdk = 34 defaultConfig { - applicationId = "com.stormtales.notevault" - minSdk = 29 + applicationId = "come.stormborntales.notevault" + minSdk = 24 targetSdk = 34 versionCode = 1 versionName = "1.0" @@ -26,28 +28,31 @@ android { sourceCompatibility = JavaVersion.VERSION_11 targetCompatibility = JavaVersion.VERSION_11 } + kotlinOptions { + jvmTarget = "11" + } buildFeatures { - viewBinding = true + compose = true } } dependencies { - implementation(libs.appcompat) - implementation(libs.material) - implementation(libs.constraintlayout) - implementation(libs.lifecycle.livedata.ktx) - implementation(libs.lifecycle.viewmodel.ktx) - implementation(libs.navigation.fragment) - implementation(libs.navigation.ui) - implementation(libs.room.runtime) - implementation(libs.annotation) + 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) + implementation(libs.androidx.navigation.compose) + implementation(libs.androidx.lifecycle.viewmodel.compose) testImplementation(libs.junit) - androidTestImplementation(libs.ext.junit) - androidTestImplementation(libs.espresso.core) - annotationProcessor(libs.room.compiler) - implementation("com.github.chrisbanes:PhotoView:2.3.0") - implementation("com.squareup.retrofit2:retrofit:2.9.0") - implementation("com.squareup.retrofit2:converter-gson:2.9.0") - implementation("com.squareup.okhttp3:logging-interceptor:4.9.1") + 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) } \ No newline at end of file diff --git a/app/src/androidTest/java/com/stormtales/notevault/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/stormtales/notevault/ExampleInstrumentedTest.java deleted file mode 100644 index b779b0e..0000000 --- a/app/src/androidTest/java/com/stormtales/notevault/ExampleInstrumentedTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.stormtales.notevault; - -import android.content.Context; -import androidx.test.platform.app.InstrumentationRegistry; -import androidx.test.ext.junit.runners.AndroidJUnit4; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - @Test - public void useAppContext() { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - assertEquals("com.stormtales.notevault", appContext.getPackageName()); - } -} \ No newline at end of file diff --git a/app/src/androidTest/java/come/stormborntales/notevault/ExampleInstrumentedTest.kt b/app/src/androidTest/java/come/stormborntales/notevault/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..0a0df47 --- /dev/null +++ b/app/src/androidTest/java/come/stormborntales/notevault/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package come.stormborntales.notevault + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * 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 + assertEquals("come.stormborntales.notevault", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4915f2a..65dd20c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,12 +1,11 @@ - + + android:theme="@style/Theme.NoteVault"> - - - - \ No newline at end of file diff --git a/app/src/main/java/com/stormtales/notevault/MainActivity.java b/app/src/main/java/com/stormtales/notevault/MainActivity.java deleted file mode 100644 index edd4e25..0000000 --- a/app/src/main/java/com/stormtales/notevault/MainActivity.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.stormtales.notevault; - -import android.os.Bundle; -import android.view.MenuItem; -import android.view.Menu; -import android.widget.Toast; -import androidx.lifecycle.ViewModelProvider; -import com.google.android.material.navigation.NavigationView; -import androidx.navigation.NavController; -import androidx.navigation.Navigation; -import androidx.navigation.ui.AppBarConfiguration; -import androidx.navigation.ui.NavigationUI; -import androidx.drawerlayout.widget.DrawerLayout; -import androidx.appcompat.app.AppCompatActivity; -import com.stormtales.notevault.databinding.ActivityMainBinding; -import com.stormtales.notevault.network.APICallback; -import com.stormtales.notevault.network.auth.AuthService; -import com.stormtales.notevault.ui.login.LoginDialog; -import com.stormtales.notevault.ui.login.LoginViewModel; - -public class MainActivity extends AppCompatActivity { - - private AppBarConfiguration mAppBarConfiguration; - private ActivityMainBinding binding; - private LoginViewModel loginViewModel; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - binding = ActivityMainBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); - - setSupportActionBar(binding.appBarMain.toolbar); - binding.appBarMain.toolbar.setOnMenuItemClickListener(item -> { - if (item.getItemId() == R.id.auth_action) { - showLoginDialog(); - return true; - } - return false; - }); - DrawerLayout drawer = binding.drawerLayout; - NavigationView navigationView = binding.navView; - // Passing each menu ID as a set of Ids because each - // menu should be considered as top level destinations. - mAppBarConfiguration = new AppBarConfiguration.Builder( - R.id.nav_home, R.id.nav_gallery, R.id.nav_slideshow) - .setOpenableLayout(drawer) - .build(); - NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main); - NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration); - NavigationUI.setupWithNavController(navigationView, navController); - - loginViewModel = new ViewModelProvider(this).get(LoginViewModel.class); - loginViewModel.setAuthService(new AuthService(getApplicationContext())); - loginViewModel.getIsLoggedIn().observe(this, isLoggedIn -> { - this.invalidateOptionsMenu(); - }); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.main, menu); - return true; - } - - @Override - public boolean onSupportNavigateUp() { - NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_main); - return NavigationUI.navigateUp(navController, mAppBarConfiguration) - || super.onSupportNavigateUp(); - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - MenuItem loginItem = menu.findItem(R.id.auth_action); - if (Boolean.TRUE.equals(loginViewModel.getIsLoggedIn().getValue())) { - loginItem.setIcon(R.drawable.logout); // Setze das Logout-Symbol - } else { - loginItem.setIcon(R.drawable.login); // Setze das Login-Symbol - } - return super.onPrepareOptionsMenu(menu); - } - - public void showLoginDialog() { - LoginDialog loginDialog = new LoginDialog(loginViewModel); - loginDialog.show(getSupportFragmentManager(), "login"); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/stormtales/notevault/data/MusicDatabase.java b/app/src/main/java/com/stormtales/notevault/data/MusicDatabase.java deleted file mode 100644 index f22b907..0000000 --- a/app/src/main/java/com/stormtales/notevault/data/MusicDatabase.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.stormtales.notevault.data; - -import android.content.Context; -import androidx.room.Database; -import androidx.room.Room; -import androidx.room.RoomDatabase; -import androidx.room.TypeConverters; -import com.stormtales.notevault.data.entities.NoteSheet; -import com.stormtales.notevault.data.entities.Song; -import com.stormtales.notevault.data.dao.SongDao; -import com.stormtales.notevault.data.sync.DateConverter; -import com.stormtales.notevault.data.sync.SyncStatusConverter; - -@Database(entities = {Song.class, NoteSheet.class}, version = 1, exportSchema = false) -@TypeConverters({SyncStatusConverter.class, DateConverter.class}) -public abstract class MusicDatabase extends RoomDatabase { - public abstract SongDao getSongTable(); - - private static volatile MusicDatabase INSTANCE; - - public static MusicDatabase getDatabase(final Context context) { - if (INSTANCE == null) { - synchronized (MusicDatabase.class) { - if (INSTANCE == null) { - INSTANCE = Room.databaseBuilder(context.getApplicationContext(), - MusicDatabase.class, "music_database") - .build(); - } - } - } - return INSTANCE; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/data/dao/SongDao.java b/app/src/main/java/com/stormtales/notevault/data/dao/SongDao.java deleted file mode 100644 index 135178d..0000000 --- a/app/src/main/java/com/stormtales/notevault/data/dao/SongDao.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.stormtales.notevault.data.dao; - -import androidx.lifecycle.LiveData; -import androidx.room.*; -import com.stormtales.notevault.data.entities.NoteSheet; -import com.stormtales.notevault.data.entities.Song; -import com.stormtales.notevault.data.sync.SyncStatus; - -import java.util.List; - -@Dao -public interface SongDao { - @Insert - long insert(Song song); - - @Query("SELECT * FROM song WHERE syncStatus != 1") - List getAllSongs(); - - @Update - void update(Song song); - - @Insert - void insert(List noteSheets); - - @Delete - void deleteNoteSheets(List noteSheets); - - @Query("SELECT * FROM NoteSheet WHERE songID = :songID") - List getNoteSheetsBySong(int songID); - - @Query("SELECT localFileName FROM NoteSheet WHERE songID = :songID") - List getNoteSheetFilesBySongID(int songID); - - @Query("SELECT * FROM Song WHERE syncStatus = :syncStatus") - List getSongsBySyncStatus(SyncStatus syncStatus); - - @Update - void updateSongs(List songs); - - @Query("SELECT * FROM Song WHERE localID IN (:localIDs)") - List getSongsByLocalIDs(List localIDs); - - @Query("SELECT * FROM Song WHERE serverID IN (:serverIDs)") - List getSongsByServerIDs(List serverIDs); - - @Query("DELETE FROM Song WHERE serverID IN (:serverIDs)") - void deleteSongsByServerIDs(List serverIDs); - - @Query("DELETE FROM SONG WHERE localID IN (:localIDs)") - void deleteSongsByLocalIDs(List localIDs); - - @Query("SELECT * FROM NoteSheet WHERE songID IN (:localSongIDs)") - List getNoteSheetsBySongIDs(List localSongIDs); - - @Query("SELECT * FROM NoteSheet WHERE songID IN (:songIDs)") - List getNoteSheetsByLocalFiles(List songIDs); - - @Update - void updateNoteSheets(List uploadedNoteSheets); - - @Query("SELECT localID FROM Song WHERE serverID IN (:serverIDs)") - List getLocalSongIDsByServerIDs(List serverIDs); - - @Query("SELECT * FROM NoteSheet WHERE serverFileName IN (:serverFileNames)") - List getNoteSheetsByServerFileNames(List serverFileNames); - - @Query("SELECT * FROM NoteSheet WHERE syncStatus = :status") - List getNoteSheetsBySyncStatus(SyncStatus status); - - @Query("SELECT * FROM NoteSheet WHERE songID IN (:localSongIDs)") - List getNoteSheetFilesBySongIDs(List localSongIDs); - - @Insert - void insertSongs(List onlyRemoteExistingSongs); - - @Delete - void deleteSong(Song song); - - @Query("DELETE FROM NoteSheet WHERE songID = :localID") - void deleteNoteSheetsByLocalSongID(int localID); - - @Update - void updateNoteSheet(NoteSheet noteSheet); - - @Query("SELECT * FROM NoteSheet WHERE serverFileName =:serverFileName") - NoteSheet getNoteSheetByServerFileName(String serverFileName); -} diff --git a/app/src/main/java/com/stormtales/notevault/data/entities/NoteSheet.java b/app/src/main/java/com/stormtales/notevault/data/entities/NoteSheet.java deleted file mode 100644 index 397f70b..0000000 --- a/app/src/main/java/com/stormtales/notevault/data/entities/NoteSheet.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.stormtales.notevault.data.entities; - -import androidx.room.Entity; -import androidx.room.Ignore; -import androidx.room.PrimaryKey; -import com.stormtales.notevault.data.sync.SyncStatus; - -import java.util.Objects; - -@Entity -public class NoteSheet { - @PrimaryKey(autoGenerate = true) - private int localID; - private int songID; - private String localFileName; - private String serverFileName; - private String hash; - - private SyncStatus syncStatus; - - @Ignore - public NoteSheet(String localFileName, String hash) { - this.localFileName = localFileName; - this.hash = hash; - this.syncStatus = SyncStatus.CREATED; - } - - @Ignore - public NoteSheet(int songID, String localFileName, String serverFileName, String hash) { - this.songID = songID; - this.localFileName = localFileName; - this.serverFileName = serverFileName; - this.hash = hash; - this.syncStatus = SyncStatus.REMOTE_MODIFIED; - } - - - public NoteSheet() { - - } - - public int getLocalID() { - return localID; - } - - public void setLocalID(int localID) { - this.localID = localID; - } - - public String getLocalFileName() { - return localFileName; - } - - public void setLocalFileName(String localFileName) { - this.localFileName = localFileName; - } - - public String getHash() { - return hash; - } - - public void setHash(String hash) { - this.hash = hash; - } - - public String getServerFileName() { - return serverFileName; - } - - public void setServerFileName(String serverFileName) { - this.serverFileName = serverFileName; - } - - @Override - public boolean equals(Object o) { - if (o == null || getClass() != o.getClass()) return false; - NoteSheet noteSheet = (NoteSheet) o; - return localID == noteSheet.localID && Objects.equals(localFileName, noteSheet.localFileName) && Objects.equals(hash, noteSheet.hash); - } - - @Override - public int hashCode() { - return Objects.hash(localID, localFileName, hash); - } - - public int getSongID() { - return songID; - } - - public void setSongID(int songID) { - this.songID = songID; - } - - public SyncStatus getSyncStatus() { - return syncStatus; - } - - public void setSyncStatus(SyncStatus syncStatus) { - this.syncStatus = syncStatus; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/data/entities/Song.java b/app/src/main/java/com/stormtales/notevault/data/entities/Song.java deleted file mode 100644 index 241326b..0000000 --- a/app/src/main/java/com/stormtales/notevault/data/entities/Song.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.stormtales.notevault.data.entities; - -import androidx.room.Entity; -import androidx.room.Ignore; -import androidx.room.PrimaryKey; -import com.stormtales.notevault.data.sync.SyncStatus; -import com.stormtales.notevault.network.sync.models.SongModel; - -import java.time.LocalDateTime; -import java.util.Objects; - -@Entity -public class Song { - @PrimaryKey(autoGenerate = true) - private int localID; - - private String serverID; - private SyncStatus syncStatus; - private LocalDateTime syncTime; - - /**Meta Data of Song*/ - private String title; - private String composer; - private String genre; - private int year; - - @Ignore - public Song(String title, String composer, String genre, int year) { - this.title = title; - this.composer = composer; - this.genre = genre; - this.year = year; - this.syncStatus = SyncStatus.CREATED; - } - - @Ignore - public Song(SongModel songModel) { - this.serverID = songModel.getServerID(); - this.title = songModel.getTitle(); - this.composer = songModel.getComposer(); - this.genre = songModel.getGenre(); - this.year = songModel.getYear(); - this.syncStatus = SyncStatus.SYNCED; - this.syncTime = LocalDateTime.now(); - } - - public Song() { - } - - @Ignore - public Song(String serverID) { - this.serverID = serverID; - this.syncStatus = SyncStatus.REMOTE_MODIFIED; - } - - public int getLocalID() { - return localID; - } - - public void setLocalID(int localID) { - this.localID = localID; - } - - public String getServerID() { - return serverID; - } - - public void setServerID(String serverID) { - this.serverID = serverID; - } - - public SyncStatus getSyncStatus() { - return syncStatus; - } - - public void setSyncStatus(SyncStatus syncStatus) { - this.syncStatus = syncStatus; - } - - public LocalDateTime getSyncTime() { - return syncTime; - } - - public void setSyncTime(LocalDateTime syncTime) { - this.syncTime = syncTime; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getComposer() { - return composer; - } - - public void setComposer(String composer) { - this.composer = composer; - } - - public String getGenre() { - return genre; - } - - public void setGenre(String genre) { - this.genre = genre; - } - - public int getYear() { - return year; - } - - public void setYear(int year) { - this.year = year; - } - - @Override - public boolean equals(Object o) { - if (o == null || getClass() != o.getClass()) return false; - Song song = (Song) o; - return localID == song.localID && Objects.equals(serverID, song.serverID); - } - - @Override - public int hashCode() { - return Objects.hash(localID, serverID); - } -} diff --git a/app/src/main/java/com/stormtales/notevault/data/entities/SongNoteSheet.java b/app/src/main/java/com/stormtales/notevault/data/entities/SongNoteSheet.java deleted file mode 100644 index 3f26f9f..0000000 --- a/app/src/main/java/com/stormtales/notevault/data/entities/SongNoteSheet.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.stormtales.notevault.data.entities; - -import androidx.room.Embedded; -import androidx.room.Relation; - -import java.util.List; - -public class SongNoteSheet { - @Embedded public Song song; - @Relation( - parentColumn = "localID", - entityColumn = "songID" - ) - public List noteSheets; -} diff --git a/app/src/main/java/com/stormtales/notevault/data/model/LoggedInUser.java b/app/src/main/java/com/stormtales/notevault/data/model/LoggedInUser.java deleted file mode 100644 index d2b5be7..0000000 --- a/app/src/main/java/com/stormtales/notevault/data/model/LoggedInUser.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.stormtales.notevault.data.model; - -/** - * Data class that captures user information for logged in users retrieved from LoginRepository - */ -public class LoggedInUser { - - private String userId; - private String displayName; - - public LoggedInUser(String userId, String displayName) { - this.userId = userId; - this.displayName = displayName; - } - - public String getUserId() { - return userId; - } - - public String getDisplayName() { - return displayName; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/stormtales/notevault/data/repositories/SongRepository.java b/app/src/main/java/com/stormtales/notevault/data/repositories/SongRepository.java deleted file mode 100644 index a9923c8..0000000 --- a/app/src/main/java/com/stormtales/notevault/data/repositories/SongRepository.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.stormtales.notevault.data.repositories; - -import android.app.Application; -import android.content.Context; -import android.os.Handler; -import android.os.Looper; -import androidx.lifecycle.LiveData; -import com.stormtales.notevault.data.MusicDatabase; -import com.stormtales.notevault.data.dao.SongDao; -import com.stormtales.notevault.data.entities.NoteSheet; -import com.stormtales.notevault.data.entities.Song; -import com.stormtales.notevault.data.sync.SyncStatus; -import com.stormtales.notevault.utils.NoteSheetsUtil; - -import java.io.IOException; -import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -public class SongRepository { - private SongDao songDao; - public SongRepository(Context context) { - MusicDatabase database = MusicDatabase.getDatabase(context); - songDao = database.getSongTable(); - } - public void insert(Song song, Callback callback) { - Executors.newSingleThreadExecutor().execute(() -> { - long result = songDao.insert(song); - Handler mainHandler = new Handler(Looper.getMainLooper()); - mainHandler.post(()-> callback.onResult(result)); - }); - } - - public interface LoadHomeViewModelCallback { - void onResult(T result); - } - - public void getAllSongs(LoadHomeViewModelCallback> callback) { - ExecutorService executorService = Executors.newSingleThreadExecutor(); - executorService.execute(() -> { - List songs = songDao.getAllSongs(); - Handler mainHandler = new Handler(Looper.getMainLooper()); - mainHandler.post(()-> callback.onResult(songs)); - }); - } - - public void updateSong(Song song) { - Executors.newSingleThreadExecutor().execute(() -> { - songDao.update(song); - }); - } - - public void insertNoteSheets(List noteSheets) { - Executors.newSingleThreadExecutor().execute(() -> { - songDao.insert(noteSheets); - }); - } - - public interface Callback { - void onResult(T result); - } - - public void deleteSong(Song song) { - Executors.newSingleThreadExecutor().execute(() -> { - song.setSyncStatus(SyncStatus.DELETED); - songDao.update(song); - - List noteSheets = songDao.getNoteSheetsBySong(song.getLocalID()); - for(NoteSheet noteSheet : noteSheets) { - try { - NoteSheetsUtil.deleteNoteSheet(noteSheet.getLocalFileName()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - songDao.deleteNoteSheets(noteSheets); - }); - } - - public void getNoteSheetFilesBySongID(int songID, Callback> callback) { - Executors.newSingleThreadExecutor().execute(()-> { - List noteSheetFiles = songDao.getNoteSheetFilesBySongID(songID); - callback.onResult(noteSheetFiles); - }); - } -} diff --git a/app/src/main/java/com/stormtales/notevault/data/repositories/SongSyncRepository.java b/app/src/main/java/com/stormtales/notevault/data/repositories/SongSyncRepository.java deleted file mode 100644 index bed896d..0000000 --- a/app/src/main/java/com/stormtales/notevault/data/repositories/SongSyncRepository.java +++ /dev/null @@ -1,303 +0,0 @@ -package com.stormtales.notevault.data.repositories; - -import android.content.Context; -import android.os.Handler; -import android.os.Looper; -import androidx.recyclerview.widget.AsyncListUtil; -import com.stormtales.notevault.data.MusicDatabase; -import com.stormtales.notevault.data.dao.SongDao; -import com.stormtales.notevault.data.entities.NoteSheet; -import com.stormtales.notevault.data.entities.Song; -import com.stormtales.notevault.data.sync.SyncStatus; -import com.stormtales.notevault.network.sync.models.*; -import com.stormtales.notevault.utils.NoteSheetsUtil; - -import java.io.File; -import java.io.IOException; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.stream.Collectors; - -public class SongSyncRepository { - private SongDao songDao; - public SongSyncRepository(Context context) { - MusicDatabase database = MusicDatabase.getDatabase(context); - songDao = database.getSongTable(); - } - - public void loadCreatedSongs(LoadDataCallback> callback) { - Executors.newSingleThreadExecutor().execute(() -> { - List createdSongs = songDao.getSongsBySyncStatus(SyncStatus.CREATED); - Handler mainHandler = new Handler(Looper.getMainLooper()); - mainHandler.post(()-> callback.onResult(createdSongs)); - }); - } - - public void loadModifiedSongs(LoadDataCallback>> callback) { - Executors.newSingleThreadExecutor().execute(() -> { - Map> result = new HashMap<>(); - List modifiedSongs = songDao.getSongsBySyncStatus(SyncStatus.MODIFIED); - for(Song song : modifiedSongs) { - List noteSheets = songDao.getNoteSheetsBySong(song.getLocalID()); - result.put(song, noteSheets); - } - Handler mainHandler = new Handler(Looper.getMainLooper()); - mainHandler.post(()-> callback.onResult(result)); - }); - } - - public void loadDeletedSongs(LoadDataCallback> callback) { - Executors.newSingleThreadExecutor().execute(() -> { - List deletedSongs = songDao.getSongsBySyncStatus(SyncStatus.DELETED); - Handler mainHandler = new Handler(Looper.getMainLooper()); - mainHandler.post(()-> callback.onResult(deletedSongs)); - }); - } - - public void markCreatedSongsAsSynced(BatchCreateResponse createdSongs) { - Executors.newSingleThreadExecutor().execute(() -> { - List localIDs = createdSongs.getCreateResponses().stream().map(CreateResponse::getLocalID).collect(Collectors.toList()); - List requestedSongs = songDao.getSongsByLocalIDs(localIDs); - - for(Song song : requestedSongs) { - song.setSyncTime(LocalDateTime.now()); - song.setSyncStatus(SyncStatus.SYNCED); - - for(CreateResponse createResponse : createdSongs.getCreateResponses()) { - if(createResponse.getLocalID() == song.getLocalID()) { - song.setServerID(createResponse.getServerID()); - break; - } - } - } - songDao.updateSongs(requestedSongs); - }); - } - - public void markSongsAsSynced(List songs) { - for(Song song : songs) { - song.setSyncStatus(SyncStatus.SYNCED); - } - } - - public void markModifiedSongsAsSynced(SongModifyBatchResponse modifyBatchResponse) { - Executors.newSingleThreadExecutor().execute(() -> { - List serverIDs = modifyBatchResponse.getModifiedServerObjects().stream().map(SongModifyResponse::getServerID).collect(Collectors.toList()); - List requestedSongs = songDao.getSongsByServerIDs(serverIDs); - for(Song song : requestedSongs) { - song.setSyncStatus(SyncStatus.SYNCED); - song.setSyncTime(LocalDateTime.now()); - - - for(SongModifyResponse modifyResponse : modifyBatchResponse.getModifiedServerObjects()) { - if(modifyResponse.getServerID().equals(song.getServerID())) { - List outdatedNoteSheets = songDao.getNoteSheetsByServerFileNames(modifyResponse.getOutdated_note_sheets()); - for(NoteSheet noteSheet : outdatedNoteSheets) { - noteSheet.setSyncStatus(SyncStatus.MODIFIED); - } - songDao.updateNoteSheets(outdatedNoteSheets); - } - } - } - - - songDao.updateSongs(requestedSongs); - }); - } - - public void markDeletedSongsAsSynced(List remoteDeletedSongs, List localDeletedSongs) { - Executors.newSingleThreadExecutor().execute(() -> { - songDao.deleteSongsByServerIDs(remoteDeletedSongs); - songDao.deleteSongsByLocalIDs(localDeletedSongs); - }); - } - - public void getNoteSheetFilesBySongIDs(LoadDataCallback> callback) { - Executors.newSingleThreadExecutor().execute(() -> { - List noteSheets = songDao.getNoteSheetsBySyncStatus(SyncStatus.CREATED); - Handler mainHandler = new Handler(Looper.getMainLooper()); - mainHandler.post(()-> callback.onResult(noteSheets)); - }); - } - - public void markCreatedNoteSheetsAsSynced(List uploadResponses) { - Executors.newSingleThreadExecutor().execute(() -> { - List serverSongIDs = uploadResponses.stream().map(UploadResponse::getServerID).collect(Collectors.toList()); - List localSongIDs = songDao.getLocalSongIDsByServerIDs(serverSongIDs); - - List uploadedNoteSheets = songDao.getNoteSheetsBySongIDs(localSongIDs); - for(UploadResponse uploadResponse : uploadResponses) { - for(NoteSheet noteSheet : uploadedNoteSheets) { - if(new File(noteSheet.getLocalFileName()).getName().equals(uploadResponse.getLocalFile())) { - noteSheet.setServerFileName(uploadResponse.getServerFile()); - noteSheet.setSyncStatus(SyncStatus.SYNCED); - break; - } - } - } - songDao.updateNoteSheets(uploadedNoteSheets); - }); - } - - public void loadModifiedNoteSheets(LoadDataCallback> callback) { - Executors.newSingleThreadExecutor().execute(() -> { - List noteSheets = songDao.getNoteSheetsBySyncStatus(SyncStatus.MODIFIED); - Handler mainHandler = new Handler(Looper.getMainLooper()); - mainHandler.post(()-> callback.onResult(noteSheets)); - }); - } - - public void markModifiedNoteSheetsAsSynced(List uploadResponses) { - Executors.newSingleThreadExecutor().execute(() -> { - List serverFileNames = uploadResponses.stream().map(UploadResponse::getServerFile).collect(Collectors.toList()); - - - List noteSheets = songDao.getNoteSheetsByServerFileNames(serverFileNames); - for(NoteSheet noteSheet : noteSheets) { - noteSheet.setSyncStatus(SyncStatus.SYNCED); - } - songDao.updateNoteSheets(noteSheets); - }); - } - - public void markSongsAsRemotelyModified(List serverIDs, LoadDataCallback> callback) { - Executors.newSingleThreadExecutor().execute(() -> { - List songs = songDao.getSongsByServerIDs(serverIDs); - List createdSongs = new ArrayList<>(); - for(Song song : songs) { - song.setSyncStatus(SyncStatus.REMOTE_MODIFIED); - } - - for(String serverID : serverIDs) { - boolean foundServerSong = false; - for(Song song : songs) { - if(song.getServerID().equals(serverID)) { - foundServerSong = true; - break; - } - } - - if(!foundServerSong) { - Song song = new Song(serverID); - createdSongs.add(song); - } - } - songDao.updateSongs(songs); - songDao.insertSongs(createdSongs); - callback.onResult(createdSongs); - }); - } - - public void loadRemotelyModifiedSongs(LoadDataCallback> callback) { - Executors.newSingleThreadExecutor().execute(() -> { - List songs = songDao.getSongsBySyncStatus(SyncStatus.REMOTE_MODIFIED); - Handler mainHandler = new Handler(Looper.getMainLooper()); - mainHandler.post(()-> callback.onResult(songs)); - }); - } - - public void saveRemoteSongs(List remoteSongs, LoadDataCallback> callback) { - Executors.newSingleThreadExecutor().execute(() ->{ - List serverIDs = remoteSongs.stream().map(SongModel::getServerID).collect(Collectors.toList()); - List songs = songDao.getSongsByServerIDs(serverIDs); - List localSongIDs = songDao.getLocalSongIDsByServerIDs(serverIDs); - List noteSheets = songDao.getNoteSheetsBySongIDs(localSongIDs); - - List onlyRemoteExistingSongs = new ArrayList<>(); - List outdatedNoteSheets = new ArrayList<>(); - List onlyRemoteNoteSheets = new ArrayList<>(); - for(SongModel songModel : remoteSongs) { - boolean found = false; - for(Song song : songs) { - if(song.getServerID().equals(songModel.getServerID())) { - found = true; - if(!songModel.isDeleted()) { - song.setSyncStatus(SyncStatus.SYNCED); - song.setSyncTime(LocalDateTime.now()); - - song.setTitle(songModel.getTitle()); - song.setComposer(songModel.getComposer()); - song.setGenre(songModel.getGenre()); - song.setYear(songModel.getYear()); - - for(RemotelyModifiedNoteSheetModel remoteNoteSheet : songModel.getNote_sheets()) { - if(noteSheets.isEmpty()) { - NoteSheet noteSheet = new NoteSheet(song.getLocalID(), remoteNoteSheet.getFilename(), remoteNoteSheet.getServer_filename(), null); - onlyRemoteNoteSheets.add(noteSheet); - outdatedNoteSheets.add(noteSheet); - } else { - boolean foundNoteSheet = false; - for(NoteSheet noteSheet : noteSheets) { - if(remoteNoteSheet.getServer_filename().equals(noteSheet.getServerFileName())) { - foundNoteSheet = true; - if(!remoteNoteSheet.getHash().equals(noteSheet.getHash())) { - outdatedNoteSheets.add(noteSheet); - break; - } - } - } - - if(!foundNoteSheet) { - NoteSheet noteSheet = new NoteSheet(song.getLocalID(), remoteNoteSheet.getFilename(), remoteNoteSheet.getServer_filename(), null); - onlyRemoteNoteSheets.add(noteSheet); - outdatedNoteSheets.add(noteSheet); - } - } - - } - - } else { - removeSong(song); - } - } - } - - if(!found) { - Song song = new Song(songModel); - onlyRemoteExistingSongs.add(song); - } - } - - songDao.updateSongs(songs); - songDao.insertSongs(onlyRemoteExistingSongs); - songDao.insert(onlyRemoteNoteSheets); - - Handler mainHandler = new Handler(Looper.getMainLooper()); - mainHandler.post(()-> callback.onResult(outdatedNoteSheets)); - }); - } - - private void removeSong(Song song) { - List noteSheets = songDao.getNoteSheetsBySong(song.getLocalID()); - for(NoteSheet noteSheet : noteSheets) { - try { - NoteSheetsUtil.deleteNoteSheet(noteSheet.getLocalFileName()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - songDao.deleteNoteSheets(noteSheets); - songDao.deleteSong(song); - - } - - - - public void saveUpdatedNoteSheet(String serverFileName, String localFileName, String hash) { - Executors.newSingleThreadExecutor().execute(()-> { - NoteSheet noteSheet = songDao.getNoteSheetByServerFileName(serverFileName); - noteSheet.setHash(hash); - noteSheet.setLocalFileName(localFileName); - songDao.updateNoteSheet(noteSheet); - }); - } - - public interface LoadDataCallback { - void onResult(T result); - } -} diff --git a/app/src/main/java/com/stormtales/notevault/data/sync/DateConverter.java b/app/src/main/java/com/stormtales/notevault/data/sync/DateConverter.java deleted file mode 100644 index 826e357..0000000 --- a/app/src/main/java/com/stormtales/notevault/data/sync/DateConverter.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.stormtales.notevault.data.sync; - -import androidx.room.TypeConverter; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; - -public class DateConverter { - // Konvertiere LocalDateTime in String - @TypeConverter - public static String fromLocalDateTime(LocalDateTime localDateTime) { - return localDateTime == null ? null : localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); - } - - // Konvertiere String zurück in LocalDateTime - @TypeConverter - public static LocalDateTime toLocalDateTime(String dateTimeString) { - return dateTimeString == null ? null : LocalDateTime.parse(dateTimeString, DateTimeFormatter.ISO_LOCAL_DATE_TIME); - } -} diff --git a/app/src/main/java/com/stormtales/notevault/data/sync/SyncStatus.java b/app/src/main/java/com/stormtales/notevault/data/sync/SyncStatus.java deleted file mode 100644 index 1f96bfe..0000000 --- a/app/src/main/java/com/stormtales/notevault/data/sync/SyncStatus.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.stormtales.notevault.data.sync; - -public enum SyncStatus { - CREATED, - DELETED, - MODIFIED, - REMOTE_MODIFIED, - SYNCED; -} diff --git a/app/src/main/java/com/stormtales/notevault/data/sync/SyncStatusConverter.java b/app/src/main/java/com/stormtales/notevault/data/sync/SyncStatusConverter.java deleted file mode 100644 index 7c67ea0..0000000 --- a/app/src/main/java/com/stormtales/notevault/data/sync/SyncStatusConverter.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.stormtales.notevault.data.sync; - -import androidx.room.TypeConverter; - -public class SyncStatusConverter { - @TypeConverter - public static SyncStatus fromInt(int value) { - return SyncStatus.values()[value]; - } - - @TypeConverter - public static int toInt(SyncStatus syncStatus) { - return syncStatus.ordinal(); - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/APICallback.java b/app/src/main/java/com/stormtales/notevault/network/APICallback.java deleted file mode 100644 index 840c89f..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/APICallback.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.stormtales.notevault.network; - -public interface APICallback { - void onSuccess(); - void onError(String error); -} diff --git a/app/src/main/java/com/stormtales/notevault/network/NetworkModule.java b/app/src/main/java/com/stormtales/notevault/network/NetworkModule.java deleted file mode 100644 index b27519d..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/NetworkModule.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.stormtales.notevault.network; - -import android.content.Context; -import android.content.SharedPreferences; -import com.stormtales.notevault.network.auth.AuthInterceptor; -import com.stormtales.notevault.network.auth.TokenManager; -import okhttp3.OkHttpClient; -import okhttp3.logging.HttpLoggingInterceptor; -import retrofit2.Retrofit; -import retrofit2.converter.gson.GsonConverterFactory; - -public class NetworkModule { - private static final String BASE_URL = "https://notevault.fawkes100.de/"; - private static Retrofit retrofit; - - public static Retrofit getRetrofitInstance(Context context) { - if (retrofit == null) { - HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(); - loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); - - TokenManager tokenManager = new TokenManager(context); - OkHttpClient client = new OkHttpClient.Builder() - .addInterceptor(new AuthInterceptor(tokenManager)) - .addInterceptor(loggingInterceptor) - .build(); - - retrofit = new Retrofit.Builder() - .baseUrl(BASE_URL) - .client(client) - .addConverterFactory(GsonConverterFactory.create()) - .build(); - } - return retrofit; - } - -} diff --git a/app/src/main/java/com/stormtales/notevault/network/StatusResponse.java b/app/src/main/java/com/stormtales/notevault/network/StatusResponse.java deleted file mode 100644 index 215c689..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/StatusResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.stormtales.notevault.network; - -public class StatusResponse { - - private String status; - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/auth/AuthAPI.java b/app/src/main/java/com/stormtales/notevault/network/auth/AuthAPI.java deleted file mode 100644 index d6922e5..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/auth/AuthAPI.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.stormtales.notevault.network.auth; - -import com.stormtales.notevault.network.StatusResponse; -import retrofit2.Call; -import retrofit2.http.Body; -import retrofit2.http.Headers; -import retrofit2.http.POST; - -public interface AuthAPI { - - @POST("/login/") - Call login(@Body LoginRequest loginRequest); - - @POST("/register/") - @Headers("Content-Type: application/json") - Call registration(@Body RegisterRequest registerRequest); -} diff --git a/app/src/main/java/com/stormtales/notevault/network/auth/AuthInterceptor.java b/app/src/main/java/com/stormtales/notevault/network/auth/AuthInterceptor.java deleted file mode 100644 index ba73477..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/auth/AuthInterceptor.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.stormtales.notevault.network.auth; - -import okhttp3.Interceptor; -import okhttp3.Request; -import okhttp3.Response; - -import java.io.IOException; - -public class AuthInterceptor implements Interceptor { - private TokenManager tokenManager; - - public AuthInterceptor(TokenManager tokenManager) { - this.tokenManager = tokenManager; - } - - @Override - public Response intercept(Chain chain) throws IOException { - Request originalRequest = chain.request(); - - String token = tokenManager.getToken(); - if (token == null) { - return chain.proceed(originalRequest); - } - - Request authenticatedRequest = originalRequest.newBuilder() - .header("Authorization", "Bearer " + token).build(); - return chain.proceed(authenticatedRequest); - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/auth/AuthService.java b/app/src/main/java/com/stormtales/notevault/network/auth/AuthService.java deleted file mode 100644 index ad13e87..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/auth/AuthService.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.stormtales.notevault.network.auth; - -import android.content.Context; -import android.text.TextUtils; -import com.stormtales.notevault.network.APICallback; -import com.stormtales.notevault.network.NetworkModule; -import com.stormtales.notevault.network.StatusResponse; -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; - -public class AuthService { - - private final AuthAPI authAPI; - private final TokenManager tokenManager; - - public AuthService(Context context) { - this.authAPI = NetworkModule.getRetrofitInstance(context).create(AuthAPI.class); - this.tokenManager = new TokenManager(context); - } - - public void performLogin(String email, String password, LoginCallback callback) { - LoginRequest loginRequest = new LoginRequest(email, password); - - authAPI.login(loginRequest).enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if (response.isSuccessful() && response.body() != null) { - String token = response.body().getToken(); - saveToken(token); - // Erfolgsrückmeldung an den Callback senden - callback.onSuccess(response.body()); - } else { - // Fehlermeldung an den Callback senden - callback.onError("Login fehlgeschlagen. Überprüfe Benutzername und Passwort."); - } - } - - @Override - public void onFailure(Call call, Throwable t) { - // Netzwerkfehler an den Callback senden - callback.onError("Netzwerkfehler: " + t.getMessage()); - } - }); - } - - public void performRegistration(String email, String username, String password, APICallback callback) { - RegisterRequest registerRequest = new RegisterRequest(username, password, email); - authAPI.registration(registerRequest).enqueue(new Callback() { - - @Override - public void onResponse(Call call, Response response) { - if(response.isSuccessful() && response.body() != null) { - callback.onSuccess(); - } else { - callback.onError("Registration fehlgeschlagen. Überprüfe Benutzername und Passwort."); - } - } - - @Override - public void onFailure(Call call, Throwable throwable) { - callback.onError("Netzwerkfehler: " + throwable.getMessage()); - } - }); - } - - private void saveToken(String token) { - tokenManager.saveToken(token); - } - - public String getToken() { - return tokenManager.getToken(); - } - - public void logout() { - tokenManager.clearToken(); - } - - public boolean isLoggedIn() { - return !TextUtils.isEmpty(tokenManager.getToken()); - } - - public interface LoginCallback { - void onSuccess(LoginResponse loginResponse); - void onError(String error); - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/auth/LoginRequest.java b/app/src/main/java/com/stormtales/notevault/network/auth/LoginRequest.java deleted file mode 100644 index ef2f887..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/auth/LoginRequest.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.stormtales.notevault.network.auth; - -public class LoginRequest { - private String email; - private String password; - - public LoginRequest(String email, String password) { - this.email = email; - this.password = password; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/auth/LoginResponse.java b/app/src/main/java/com/stormtales/notevault/network/auth/LoginResponse.java deleted file mode 100644 index 3d4be92..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/auth/LoginResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.stormtales.notevault.network.auth; - -public class LoginResponse { - private String token; - private String username; - - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/auth/RegisterRequest.java b/app/src/main/java/com/stormtales/notevault/network/auth/RegisterRequest.java deleted file mode 100644 index 9ad5f0d..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/auth/RegisterRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.stormtales.notevault.network.auth; - -public class RegisterRequest { - private String username; - private String email; - private String password; - - public RegisterRequest(String username, String password, String email) { - this.username = username; - this.password = password; - this.email = email; - } - -} diff --git a/app/src/main/java/com/stormtales/notevault/network/auth/TokenManager.java b/app/src/main/java/com/stormtales/notevault/network/auth/TokenManager.java deleted file mode 100644 index 9d26548..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/auth/TokenManager.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.stormtales.notevault.network.auth; - -import android.content.Context; -import android.content.SharedPreferences; - -public class TokenManager { - private static final String PREF_NAME = "app_preferences"; - private static final String KEY_TOKEN = "jwt_token"; - - private SharedPreferences sharedPreferences; - - public TokenManager(Context context) { - sharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); - } - - public void saveToken(String token) { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.putString(KEY_TOKEN, token); - editor.apply(); - } - - public String getToken() { - return sharedPreferences.getString(KEY_TOKEN, null); - } - - public void clearToken() { - SharedPreferences.Editor editor = sharedPreferences.edit(); - editor.remove(KEY_TOKEN); - editor.apply(); - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncAPI.java b/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncAPI.java deleted file mode 100644 index 2bb30d0..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncAPI.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.stormtales.notevault.network.sync; - -import com.stormtales.notevault.network.auth.LoginRequest; -import com.stormtales.notevault.network.auth.LoginResponse; -import com.stormtales.notevault.network.sync.models.*; -import okhttp3.MultipartBody; -import okhttp3.RequestBody; -import okhttp3.ResponseBody; -import retrofit2.Call; -import retrofit2.http.*; - -import java.time.LocalDateTime; - -public interface SongSyncAPI { - - @POST("/sync/songs/create") - Call syncCreatedSongs(@Body SongCreateBatchRequest songCreateBatchRequest); - - @POST("/sync/songs/modify") - Call syncModifiedSongs(@Body SongModifyBatchRequest songModifyBatchRequest); - - @POST("/sync/songs/delete") - Call syncDeletedSongs(@Body SongBatchDeleteRequest songBatchDeleteRequest); - - @Multipart - @POST("/sync/songs/note_sheet/upload") - Call uploadNoteSheet(@Part("serverID")RequestBody serverID, @Part("fileName") RequestBody fileName, @Part MultipartBody.Part image); - - @Multipart - @POST("/sync/songs/note_sheet/update") - Call updateNoteSheet(@Part("server_filename") RequestBody server_filename, @Part MultipartBody.Part image); - - @GET("/sync/songs/fetch") - Call fetchRemoteModifiedSongs(@Query(value = "last_client_sync") String last_client_sync); - - @GET("/sync/songs/get/") - Call fetchRemotelyModifiedSongData(@Query(value = "songID") String songID); - - @GET("/sync/songs/get/notesheet/") - Call downloadNotesheet(@Query("server_filename") String server_filename); - - @Multipart - @POST("/ai/regognize/title") - Call recognizeTitle(@Part MultipartBody.Part image); -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncModule.java b/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncModule.java deleted file mode 100644 index b92a087..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncModule.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.stormtales.notevault.network.sync; - -import android.content.Context; -import android.net.Uri; -import com.stormtales.notevault.data.entities.NoteSheet; -import com.stormtales.notevault.data.entities.Song; -import com.stormtales.notevault.data.repositories.SongRepository; -import com.stormtales.notevault.data.repositories.SongSyncRepository; -import com.stormtales.notevault.network.sync.models.*; -import com.stormtales.notevault.ui.gallery.GalleryViewModel; -import com.stormtales.notevault.utils.NoteSheetsUtil; -import com.stormtales.notevault.utils.Tupel; - -import java.io.File; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -public class SongSyncModule { - private SongRepository songRepository; - private SongSyncRepository songSyncRepository; - private SongSyncService songSyncService; - private GalleryViewModel syncViewModel; - private Context context; - - public SongSyncModule(Context context, GalleryViewModel syncViewModel) { - this.songRepository = new SongRepository(context); - this.songSyncRepository = new SongSyncRepository(context); - this.songSyncService = new SongSyncService(context); - this.syncViewModel = syncViewModel; - this.context = context; - } - - public void syncCreatedSongs() { - songSyncRepository.loadCreatedSongs(result -> { - songSyncService.syncCreatedSongs(result, response -> { - songSyncRepository.markCreatedSongsAsSynced(response); - if(response.getCreateResponses().isEmpty()) { - syncViewModel.finishCreateSongSyncing(); - } else { - uploadCreatedNoteSheets(result, response); - } - }); - }); - } - - public void uploadCreatedNoteSheets(List result, BatchCreateResponse response) { - List songIDs = result.stream().map(Song::getLocalID).collect(Collectors.toList()); - songSyncRepository.getNoteSheetFilesBySongIDs(noteSheets -> { - songSyncService.uploadNoteSheetsOfCreatedSongs(noteSheets, response, uploadResponses -> { - songSyncRepository.markCreatedNoteSheetsAsSynced(uploadResponses); - syncViewModel.finishCreateSongSyncing(); - }); - }); - } - - public void syncModifiedSongs() { - songSyncRepository.loadModifiedSongs(result -> { - songSyncService.syncModifiedSongs(result, (FinishSongSyncingCallback) response -> { - songSyncRepository.markModifiedSongsAsSynced(response); - uploadModifiedNoteSheets(); - }); - }); - } - - public void uploadModifiedNoteSheets() { - songSyncRepository.loadModifiedNoteSheets(modifiedNoteSheets -> { - if(modifiedNoteSheets.isEmpty()) { - syncViewModel.finishModifiedSongSyncinc(); - } else { - songSyncService.uploadModifiedNoteSheets(modifiedNoteSheets, new SongSyncService.UploadNoteSheetCallback() { - @Override - public void finishUploadNoteSheets(List uploadResponses) { - songSyncRepository.markModifiedNoteSheetsAsSynced(uploadResponses); - syncViewModel.finishModifiedSongSyncinc(); - } - }); - } - }); - } - - public void syncDeletedSongs() { - songSyncRepository.loadDeletedSongs(result -> { - songSyncService.syncDeletedSong(result, (remoteDeletedSongs, localDeletedSongs) -> { - songSyncRepository.markDeletedSongsAsSynced(remoteDeletedSongs, localDeletedSongs); - syncViewModel.finishDeleteSongSyncinc(); - }); - }); - } - - public void fetchRemoteModifiedSongs() { - //Todo: Determine Last Client Sync; for testing use LocalDateTime.MIN - songSyncService.fetchRemoteModifiedSongs(LocalDateTime.now().minusDays(35), new SongSyncRepository.LoadDataCallback() { - @Override - public void onResult(FetchResponse result) { - songSyncRepository.markSongsAsRemotelyModified(result.getServerIDs(), createdSongs -> { - getRemotelyModifiedSongData(createdSongs); - }); - - } - }); - } - - public void getRemotelyModifiedSongData(List freshlyCreatedSongs) { - songSyncRepository.loadRemotelyModifiedSongs(songs -> { - for(Song song : freshlyCreatedSongs) { - boolean freshlyCreatedSongFound = false; - for(Song s : songs) { - if(s.getServerID().equals(song.getServerID())) { - freshlyCreatedSongFound = true; - break; - } - } - if(!freshlyCreatedSongFound) { - songs.add(song); - } - - } - if(songs.isEmpty()) { - syncViewModel.finishFetching(); - } else { - songSyncService.getRemotelyModifiedSongData(songs, remoteSongs -> { - if(remoteSongs.isEmpty()) { - syncViewModel.finishFetching(); - } else { - songSyncRepository.saveRemoteSongs(remoteSongs, this::downloadNoteSheets); - } - }); - } - - }); - } - - public void downloadNoteSheets(List noteSheets) { - for(NoteSheet noteSheet : noteSheets) { - songSyncService.downloadNoteSheet(noteSheet, responseBody -> { - String localFilename = noteSheet.getServerFileName().substring(36); - - Tupel result = NoteSheetsUtil.saveImageFromServer(responseBody, context.getFilesDir()); - songSyncRepository.saveUpdatedNoteSheet(noteSheet.getServerFileName(), result.getValue00(), result.getValue01()); - }); - } - syncViewModel.finishFetching(); - } - - public interface FinishSongCreateSyncingCallback { - void finishSongSyncing(BatchCreateResponse response); - } - - public interface FinishSongSyncingCallback { - void finishSongSyncing(T response); - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncService.java b/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncService.java deleted file mode 100644 index 60ea902..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncService.java +++ /dev/null @@ -1,246 +0,0 @@ -package com.stormtales.notevault.network.sync; - -import android.content.Context; -import android.util.Log; -import com.stormtales.notevault.data.entities.NoteSheet; -import com.stormtales.notevault.data.entities.Song; -import com.stormtales.notevault.data.repositories.SongSyncRepository; -import com.stormtales.notevault.network.NetworkModule; -import com.stormtales.notevault.network.auth.AuthAPI; -import com.stormtales.notevault.network.sync.models.*; -import com.stormtales.notevault.ui.gallery.GalleryViewModel; -import okhttp3.MediaType; -import okhttp3.MultipartBody; -import okhttp3.RequestBody; -import okhttp3.ResponseBody; -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; - -import java.io.File; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -public class SongSyncService { - private final SongSyncAPI songSyncAPI; - private GalleryViewModel syncStatusViewModel; - - public SongSyncService(Context context) { - songSyncAPI = NetworkModule.getRetrofitInstance(context).create(SongSyncAPI.class); - } - - public void syncCreatedSongs(List songs, SongSyncModule.FinishSongCreateSyncingCallback callback) { - List createRequests = new ArrayList<>(); - for(Song song : songs) { - createRequests.add(new SongCreateRequest(song)); - } - SongCreateBatchRequest songCreateBatchRequest = new SongCreateBatchRequest(createRequests); - songSyncAPI.syncCreatedSongs(songCreateBatchRequest).enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - callback.finishSongSyncing(response.body()); - } - - @Override - public void onFailure(Call call, Throwable throwable) { - - } - }); - } - - public void uploadNoteSheetsOfCreatedSongs(List noteSheets, BatchCreateResponse batchCreateResponse, UploadNoteSheetCallback callback) { - List uploadResponses = new ArrayList<>(); - for(CreateResponse createResponse : batchCreateResponse.getCreateResponses()) { - for(NoteSheet noteSheet : noteSheets) { - if(noteSheet.getSongID() == createResponse.getLocalID()) { - File imageFile = new File(noteSheet.getLocalFileName()); - - RequestBody serverID = RequestBody.create(MediaType.parse("text/plain"), createResponse.getServerID()); - RequestBody fileName = RequestBody.create(MediaType.parse("text/plain"), imageFile.getName()); - - RequestBody requestFile = RequestBody.create(MediaType.parse("image/**"), new File(noteSheet.getLocalFileName())); - MultipartBody.Part image = MultipartBody.Part.createFormData("image", noteSheet.getLocalFileName(), requestFile); - - songSyncAPI.uploadNoteSheet(serverID, fileName, image).enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if(response.isSuccessful() && response.body() != null) { - uploadResponses.add(response.body()); - if(uploadResponses.size() == noteSheets.size()) { - callback.finishUploadNoteSheets(uploadResponses); - } - } - } - - @Override - public void onFailure(Call call, Throwable throwable) { - - } - }); - } - } - } - } - - public void syncModifiedSongs(Map> songs, SongSyncModule.FinishSongSyncingCallback callback) { - List modifyRequests = new ArrayList<>(); - for(Map.Entry> entry: songs.entrySet()) { - modifyRequests.add(new SongModifyRequest(entry.getKey(), entry.getValue())); - } - SongModifyBatchRequest songModifyBatchRequest = new SongModifyBatchRequest(modifyRequests); - songSyncAPI.syncModifiedSongs(songModifyBatchRequest).enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - callback.finishSongSyncing(response.body()); - } - - @Override - public void onFailure(Call call, Throwable throwable) { - - } - }); - } - - public void syncDeletedSong(List songs, SyncDeletedSongsCallback callback) { - List deleteRequests = new ArrayList<>(); - List deletedNotSyncedSongs = new ArrayList<>(); - for(Song song : songs) { - if(song.getServerID() == null) { - deletedNotSyncedSongs.add(song.getLocalID()); - } else { - deleteRequests.add(song.getServerID()); - } - } - - SongBatchDeleteRequest songBatchDeleteRequest = new SongBatchDeleteRequest(deleteRequests); - songSyncAPI.syncDeletedSongs(songBatchDeleteRequest).enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if(response.isSuccessful() && response.body() != null) { - callback.finishSongSyncing(response.body().getModifiedServerObjects(), deletedNotSyncedSongs); - } - } - - @Override - public void onFailure(Call call, Throwable throwable) { - - } - }); - } - - public void uploadModifiedNoteSheets(List modifiedNoteSheets, UploadNoteSheetCallback callback) { - List uploadResponses = new ArrayList<>(); - for(NoteSheet noteSheet : modifiedNoteSheets) { - RequestBody server_filename = RequestBody.create(MediaType.parse("text/plain"), noteSheet.getServerFileName()); - - RequestBody requestFile = RequestBody.create(MediaType.parse("image/**"), new File(noteSheet.getLocalFileName())); - MultipartBody.Part image = MultipartBody.Part.createFormData("image", noteSheet.getLocalFileName(), requestFile); - - songSyncAPI.updateNoteSheet(server_filename, image).enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if(response.isSuccessful() && response.body() != null) { - uploadResponses.add(response.body()); - if(uploadResponses.size() == modifiedNoteSheets.size()) { - callback.finishUploadNoteSheets(uploadResponses); - } - } else { - Log.d("SongSyncService", "Something went wrong"); - } - } - - @Override - public void onFailure(Call call, Throwable throwable) { - Log.e("SongSyncService", "Upload failed: " + throwable.getMessage(), throwable); - } - }); - } - } - - public void fetchRemoteModifiedSongs(LocalDateTime lastClientSync, SongSyncRepository.LoadDataCallback callback) { - String formattedTime = lastClientSync.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); - songSyncAPI.fetchRemoteModifiedSongs(formattedTime).enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if(response.isSuccessful() && response.body() != null) { - callback.onResult(response.body()); - } - } - - @Override - public void onFailure(Call call, Throwable throwable) { - Log.d("SongSyncService", "Fetch failed: " + throwable.getMessage(), throwable); - } - }); - } - - public void getRemotelyModifiedSongData(List remotelyModifiedSongs, SongSyncRepository.LoadDataCallback> callback) { - List songModels = new ArrayList<>(); - for(Song song : remotelyModifiedSongs) { - songSyncAPI.fetchRemotelyModifiedSongData(song.getServerID()).enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if(response.isSuccessful() && response.body() != null) { - songModels.add(response.body()); - if(songModels.size() == remotelyModifiedSongs.size()) { - callback.onResult(songModels); - } - } - } - - @Override - public void onFailure(Call call, Throwable throwable) { - Log.d("SongSyncService", "Fetch failed: " + throwable.getMessage(), throwable); - } - }); - } - } - - public void downloadNoteSheet(NoteSheet noteSheet, SongSyncRepository.LoadDataCallback callback) { - songSyncAPI.downloadNotesheet(noteSheet.getServerFileName()).enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if(response.isSuccessful() && response.body() != null) { - callback.onResult(response.body()); - } - } - - @Override - public void onFailure(Call call, Throwable throwable) { - Log.d("SongSyncService", "Download failed: " + throwable.getMessage(), throwable); - } - }); - } - - public void recognizeTitle(String firstNoteSheet, RecognizedSongCallback callback) { - RequestBody requestFile = RequestBody.create(MediaType.parse("image/jpeg"), new File(firstNoteSheet)); - MultipartBody.Part image = MultipartBody.Part.createFormData("image", firstNoteSheet, requestFile); - songSyncAPI.recognizeTitle(image).enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - callback.onRecognizedSong(response.body()); - } - - @Override - public void onFailure(Call call, Throwable throwable) { - Log.d("SongSyncService", "Recognition failed: " + throwable.getMessage(), throwable); - } - }); - } - - - public interface SyncDeletedSongsCallback { - void finishSongSyncing(List remoteDeletedSongs, List localDeletedSongs); - } - - public interface UploadNoteSheetCallback { - void finishUploadNoteSheets(List uploadResponses); - } - - public interface RecognizedSongCallback { - void onRecognizedSong(AIRecognizedSong aiRecognizedSong); - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/models/AIRecognizedSong.java b/app/src/main/java/com/stormtales/notevault/network/sync/models/AIRecognizedSong.java deleted file mode 100644 index fc42783..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/models/AIRecognizedSong.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.stormtales.notevault.network.sync.models; - -public class AIRecognizedSong { - private String title; - private int year; - private String composer; - private String description; - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public int getYear() { - return year; - } - - public void setYear(int year) { - this.year = year; - } - - public String getComposer() { - return composer; - } - - public void setComposer(String composer) { - this.composer = composer; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/models/BatchCreateResponse.java b/app/src/main/java/com/stormtales/notevault/network/sync/models/BatchCreateResponse.java deleted file mode 100644 index 551d679..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/models/BatchCreateResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.stormtales.notevault.network.sync.models; - -import java.util.List; - -public class BatchCreateResponse { - private List createResponses; - - public List getCreateResponses() { - return createResponses; - } - - public void setCreateResponses(List createResponses) { - this.createResponses = createResponses; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/models/BatchModifyResponse.java b/app/src/main/java/com/stormtales/notevault/network/sync/models/BatchModifyResponse.java deleted file mode 100644 index ad08584..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/models/BatchModifyResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.stormtales.notevault.network.sync.models; - -import java.util.List; - -public class BatchModifyResponse { - private List modifiedServerObjects; - - public List getModifiedServerObjects() { - return modifiedServerObjects; - } - - public void setModifiedServerObjects(List modifiedServerObjects) { - this.modifiedServerObjects = modifiedServerObjects; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/models/CreateResponse.java b/app/src/main/java/com/stormtales/notevault/network/sync/models/CreateResponse.java deleted file mode 100644 index 309c360..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/models/CreateResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.stormtales.notevault.network.sync.models; - -public class CreateResponse { - private int localID; - private String serverID; - - public int getLocalID() { - return localID; - } - - public void setLocalID(int localID) { - this.localID = localID; - } - - public String getServerID() { - return serverID; - } - - public void setServerID(String serverID) { - this.serverID = serverID; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/models/FetchResponse.java b/app/src/main/java/com/stormtales/notevault/network/sync/models/FetchResponse.java deleted file mode 100644 index 29a9b91..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/models/FetchResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.stormtales.notevault.network.sync.models; - -import java.util.List; - -public class FetchResponse { - private List serverIDs; - - public List getServerIDs() { - return serverIDs; - } - - public void setServerIDs(List serverIDs) { - this.serverIDs = serverIDs; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/models/NoteSheetModifyRequest.java b/app/src/main/java/com/stormtales/notevault/network/sync/models/NoteSheetModifyRequest.java deleted file mode 100644 index f5d9603..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/models/NoteSheetModifyRequest.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.stormtales.notevault.network.sync.models; - -public class NoteSheetModifyRequest { - private String serverFileName; - private String clientHash; - - public NoteSheetModifyRequest(String serverFileName, String clientHash) { - this.serverFileName = serverFileName; - this.clientHash = clientHash; - } - - public String getServerFileName() { - return serverFileName; - } - - public void setServerFileName(String serverFileName) { - this.serverFileName = serverFileName; - } - - public String getClientHash() { - return clientHash; - } - - public void setClientHash(String clientHash) { - this.clientHash = clientHash; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/models/RemotelyModifiedNoteSheetModel.java b/app/src/main/java/com/stormtales/notevault/network/sync/models/RemotelyModifiedNoteSheetModel.java deleted file mode 100644 index c52a224..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/models/RemotelyModifiedNoteSheetModel.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.stormtales.notevault.network.sync.models; - -public class RemotelyModifiedNoteSheetModel { - private String filename; - private String server_filename; - private String hash; - - public String getFilename() { - return filename; - } - - public void setFilename(String filename) { - this.filename = filename; - } - - public String getServer_filename() { - return server_filename; - } - - public void setServer_filename(String server_filename) { - this.server_filename = server_filename; - } - - public String getHash() { - return hash; - } - - public void setHash(String hash) { - this.hash = hash; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/models/SongBatchDeleteRequest.java b/app/src/main/java/com/stormtales/notevault/network/sync/models/SongBatchDeleteRequest.java deleted file mode 100644 index 918c09e..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/models/SongBatchDeleteRequest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.stormtales.notevault.network.sync.models; - -import java.util.List; - -public class SongBatchDeleteRequest { - private List songs; - - public SongBatchDeleteRequest(List songs) { - this.songs = songs; - } - - public List getSongs() { - return songs; - } - - public void setSongs(List songs) { - this.songs = songs; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/models/SongCreateBatchRequest.java b/app/src/main/java/com/stormtales/notevault/network/sync/models/SongCreateBatchRequest.java deleted file mode 100644 index 89924d1..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/models/SongCreateBatchRequest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.stormtales.notevault.network.sync.models; - -import java.util.List; - -public class SongCreateBatchRequest { - - private List songs; - - public SongCreateBatchRequest(List songs) { - this.songs = songs; - } - - public List getSongs() { - return songs; - } - - public void setSongs(List songs) { - this.songs = songs; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/models/SongCreateRequest.java b/app/src/main/java/com/stormtales/notevault/network/sync/models/SongCreateRequest.java deleted file mode 100644 index a5f74bb..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/models/SongCreateRequest.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.stormtales.notevault.network.sync.models; - -import com.stormtales.notevault.data.entities.Song; - -public class SongCreateRequest { - private int localID; - private String title; - private String composer; - private String genre; - private int year; - - public SongCreateRequest(int localID, String title, String composer, String genre, int year) { - this.localID = localID; - this.title = title; - this.composer = composer; - this.genre = genre; - this.year = year; - } - - public SongCreateRequest(Song song) { - this.localID = song.getLocalID(); - this.title = song.getTitle(); - this.composer = song.getComposer(); - this.genre = song.getGenre(); - this.year = song.getYear(); - } - - public int getLocalID() { - return localID; - } - - public void setLocalID(int localID) { - this.localID = localID; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getComposer() { - return composer; - } - - public void setComposer(String composer) { - this.composer = composer; - } - - public String getGenre() { - return genre; - } - - public void setGenre(String genre) { - this.genre = genre; - } - - public int getYear() { - return year; - } - - public void setYear(int year) { - this.year = year; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/models/SongModel.java b/app/src/main/java/com/stormtales/notevault/network/sync/models/SongModel.java deleted file mode 100644 index 4de962a..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/models/SongModel.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.stormtales.notevault.network.sync.models; - -import java.util.List; - -public class SongModel { - private String serverID; - private String title; - private String composer; - private String genre; - private int year; - private List note_sheets; - private boolean deleted; - - public String getServerID() { - return serverID; - } - - public void setServerID(String serverID) { - this.serverID = serverID; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getComposer() { - return composer; - } - - public void setComposer(String composer) { - this.composer = composer; - } - - public String getGenre() { - return genre; - } - - public void setGenre(String genre) { - this.genre = genre; - } - - public int getYear() { - return year; - } - - public void setYear(int year) { - this.year = year; - } - - public List getNote_sheets() { - return note_sheets; - } - - public void setNote_sheets(List note_sheets) { - this.note_sheets = note_sheets; - } - - public boolean isDeleted() { - return deleted; - } - - public void setDeleted(boolean deleted) { - this.deleted = deleted; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/models/SongModifyBatchRequest.java b/app/src/main/java/com/stormtales/notevault/network/sync/models/SongModifyBatchRequest.java deleted file mode 100644 index 33247bf..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/models/SongModifyBatchRequest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.stormtales.notevault.network.sync.models; - -import java.util.List; - -public class SongModifyBatchRequest { - private List songs; - - public SongModifyBatchRequest(List songs) { - this.songs = songs; - } - - public List getSongs() { - return songs; - } - - public void setSongs(List songs) { - this.songs = songs; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/models/SongModifyBatchResponse.java b/app/src/main/java/com/stormtales/notevault/network/sync/models/SongModifyBatchResponse.java deleted file mode 100644 index e475605..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/models/SongModifyBatchResponse.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.stormtales.notevault.network.sync.models; - -import java.util.List; - -public class SongModifyBatchResponse { - - private List modifiedServerObjects; - - public List getModifiedServerObjects() { - return modifiedServerObjects; - } - - public void setModifiedServerObjects(List modifiedServerObjects) { - this.modifiedServerObjects = modifiedServerObjects; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/models/SongModifyRequest.java b/app/src/main/java/com/stormtales/notevault/network/sync/models/SongModifyRequest.java deleted file mode 100644 index 607f6b7..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/models/SongModifyRequest.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.stormtales.notevault.network.sync.models; - -import com.stormtales.notevault.data.entities.NoteSheet; -import com.stormtales.notevault.data.entities.Song; - -import java.util.List; -import java.util.stream.Collectors; - -public class SongModifyRequest { - - private String serverID; - private String title; - private String composer; - private String genre; - private int year; - private List noteSheets; - - public SongModifyRequest(String serverID, String title, String composer, String genre, int year) { - this.serverID = serverID; - this.title = title; - this.composer = composer; - this.genre = genre; - this.year = year; - } - - public SongModifyRequest(Song song, List noteSheets) { - this.serverID = song.getServerID(); - this.title = song.getTitle(); - this.composer = song.getComposer(); - this.genre = song.getGenre(); - this.year = song.getYear(); - this.noteSheets = noteSheets.stream().map(noteSheet -> new NoteSheetModifyRequest(noteSheet.getServerFileName(), noteSheet.getHash())).collect(Collectors.toList()); - } - - public String getServerID() { - return serverID; - } - - public void setServerID(String serverID) { - this.serverID = serverID; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getComposer() { - return composer; - } - - public void setComposer(String composer) { - this.composer = composer; - } - - public String getGenre() { - return genre; - } - - public void setGenre(String genre) { - this.genre = genre; - } - - public int getYear() { - return year; - } - - public void setYear(int year) { - this.year = year; - } - - public List getNoteSheets() { - return noteSheets; - } - - public void setNoteSheets(List noteSheets) { - this.noteSheets = noteSheets; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/models/SongModifyResponse.java b/app/src/main/java/com/stormtales/notevault/network/sync/models/SongModifyResponse.java deleted file mode 100644 index b798c33..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/models/SongModifyResponse.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.stormtales.notevault.network.sync.models; - -import java.util.List; - -public class SongModifyResponse { - - private String serverID; - private List outdated_note_sheets; - - public List getOutdated_note_sheets() { - return outdated_note_sheets; - } - - public void setOutdated_note_sheets(List outdated_note_sheets) { - this.outdated_note_sheets = outdated_note_sheets; - } - - public String getServerID() { - return serverID; - } - - public void setServerID(String serverID) { - this.serverID = serverID; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/models/UploadResponse.java b/app/src/main/java/com/stormtales/notevault/network/sync/models/UploadResponse.java deleted file mode 100644 index 92c23bd..0000000 --- a/app/src/main/java/com/stormtales/notevault/network/sync/models/UploadResponse.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.stormtales.notevault.network.sync.models; - -public class UploadResponse { - private String serverID; - private String localFile; - private String serverFile; - - public String getServerID() { - return serverID; - } - - public void setServerID(String serverID) { - this.serverID = serverID; - } - - public String getLocalFile() { - return localFile; - } - - public void setLocalFile(String localFile) { - this.localFile = localFile; - } - - public String getServerFile() { - return serverFile; - } - - public void setServerFile(String serverFile) { - this.serverFile = serverFile; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/ui/gallery/GalleryFragment.java b/app/src/main/java/com/stormtales/notevault/ui/gallery/GalleryFragment.java deleted file mode 100644 index cf47f96..0000000 --- a/app/src/main/java/com/stormtales/notevault/ui/gallery/GalleryFragment.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.stormtales.notevault.ui.gallery; - -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.ProgressBar; -import android.widget.TextView; -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.lifecycle.ViewModelProvider; -import com.stormtales.notevault.data.repositories.SongRepository; -import com.stormtales.notevault.databinding.FragmentGalleryBinding; -import com.stormtales.notevault.network.sync.SongSyncModule; -import com.stormtales.notevault.network.sync.SongSyncService; - - -public class GalleryFragment extends Fragment { - - GalleryViewModel galleryViewModel; - private FragmentGalleryBinding binding; - private ProgressBar progress_sync_created_songs; - private Button sync_created_songs_btn; - private ProgressBar progress_sync_modified_songs; - private Button sync_modified_songs_btn; - private ProgressBar progress_sync_deleted_songs; - private Button sync_deleted_songs_btn; - - private ProgressBar progress_fetching_songs; - private Button sync_fetching_songs_btn; - - - public View onCreateView(@NonNull LayoutInflater inflater, - ViewGroup container, Bundle savedInstanceState) { - galleryViewModel = new ViewModelProvider(this).get(GalleryViewModel.class); - - binding = FragmentGalleryBinding.inflate(inflater, container, false); - View root = binding.getRoot(); - - progress_sync_created_songs = binding.progressSyncCreatedSongs; - sync_created_songs_btn = binding.syncCreatedBtn; - sync_created_songs_btn.setOnClickListener(v -> onSyncCreatedSongs()); - - progress_sync_modified_songs = binding.progressSyncModifiedSongs; - sync_modified_songs_btn = binding.syncModifiedBtn; - sync_modified_songs_btn.setOnClickListener(v -> onSyncModifiedSogs()); - - progress_sync_deleted_songs = binding.progressSyncDeletedSongs; - sync_deleted_songs_btn = binding.syncDeletedBtn; - sync_deleted_songs_btn.setOnClickListener(v -> onSyncDeletedSongs()); - - progress_fetching_songs = binding.progressFetchSongs; - sync_fetching_songs_btn = binding.fetchSongsBtn; - sync_fetching_songs_btn.setOnClickListener(v -> onFetchRemoteModifiedSongs()); - - galleryViewModel.setSongSyncModule(new SongSyncModule(getContext(), galleryViewModel)); - - galleryViewModel.getIsCreatedSongSyncing().observe(getViewLifecycleOwner(), isCreatedSyncinc -> { - if(isCreatedSyncinc) { - progress_sync_created_songs.setIndeterminate(true); - sync_created_songs_btn.setEnabled(false); - } else { - progress_sync_created_songs.setIndeterminate(false); - sync_created_songs_btn.setEnabled(true); - } - }); - - galleryViewModel.getIsModifiedSongSyncing().observe(getViewLifecycleOwner(), isModifiedSyncinc -> { - if(isModifiedSyncinc) { - progress_sync_modified_songs.setIndeterminate(true); - sync_modified_songs_btn.setEnabled(false); - } else { - progress_sync_modified_songs.setIndeterminate(false); - sync_modified_songs_btn.setEnabled(true); - } - }); - - galleryViewModel.getIsDeletedSongSyncing().observe(getViewLifecycleOwner(), isDeletedSyncinc -> { - if(isDeletedSyncinc) { - progress_sync_deleted_songs.setIndeterminate(true); - sync_deleted_songs_btn.setEnabled(false); - } else { - progress_sync_deleted_songs.setIndeterminate(false); - sync_deleted_songs_btn.setEnabled(true); - } - }); - - galleryViewModel.getIsFetchingActive().observe(getViewLifecycleOwner(), isFetchingActiveSyncinc -> { - if(isFetchingActiveSyncinc) { - progress_fetching_songs.setIndeterminate(true); - sync_fetching_songs_btn.setEnabled(false); - } else { - progress_fetching_songs.setIndeterminate(false); - sync_fetching_songs_btn.setEnabled(true); - } - }); - return root; - } - - private void onFetchRemoteModifiedSongs() { - galleryViewModel.startFetchingActive(); - } - - private void onSyncDeletedSongs() { - galleryViewModel.startDeletedSongSyncing(); - } - - - @Override - public void onDestroyView() { - super.onDestroyView(); - binding = null; - } - - private void onSyncCreatedSongs() { - galleryViewModel.startCreateSongSyncing(); - } - - - private void onSyncModifiedSogs() { - galleryViewModel.startModifiedSongSyncinc(); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/stormtales/notevault/ui/gallery/GalleryViewModel.java b/app/src/main/java/com/stormtales/notevault/ui/gallery/GalleryViewModel.java deleted file mode 100644 index 14da487..0000000 --- a/app/src/main/java/com/stormtales/notevault/ui/gallery/GalleryViewModel.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.stormtales.notevault.ui.gallery; - -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; -import com.stormtales.notevault.data.repositories.SongRepository; -import com.stormtales.notevault.network.sync.SongSyncModule; - -public class GalleryViewModel extends ViewModel { - - private final MutableLiveData isCreatedSongSyncing; - private final MutableLiveData isModifiedSongSyncing; - private final MutableLiveData isDeletedSongSyncing; - private final MutableLiveData isFetchingActive; - private SongSyncModule songSyncModule; - - public GalleryViewModel() { - - isCreatedSongSyncing = new MutableLiveData<>(); - isCreatedSongSyncing.setValue(false); - - isModifiedSongSyncing = new MutableLiveData<>(); - isModifiedSongSyncing.setValue(false); - - isDeletedSongSyncing = new MutableLiveData<>(); - isDeletedSongSyncing.setValue(false); - - isFetchingActive = new MutableLiveData<>(); - isFetchingActive.setValue(false); - } - - public MutableLiveData getIsCreatedSongSyncing() { - return isCreatedSongSyncing; - } - - public void startCreateSongSyncing() { - if(this.songSyncModule == null) throw new RuntimeException("SongSyncModule is not initialized"); - this.isCreatedSongSyncing.setValue(true); - - this.songSyncModule.syncCreatedSongs(); - } - - public void finishCreateSongSyncing() { - this.isCreatedSongSyncing.setValue(false); - } - - public void setSongSyncModule(SongSyncModule songSyncModule) { - this.songSyncModule = songSyncModule; - } - - public void startModifiedSongSyncinc() { - if(this.songSyncModule == null) throw new RuntimeException("SongSyncModule is not initialized"); - this.isModifiedSongSyncing.setValue(true); - this.songSyncModule.syncModifiedSongs(); - } - - public MutableLiveData getIsModifiedSongSyncing() { - return isModifiedSongSyncing; - } - - public void finishModifiedSongSyncinc() { - this.isModifiedSongSyncing.setValue(false); - } - - public MutableLiveData getIsDeletedSongSyncing() { - return isDeletedSongSyncing; - } - - public void startDeletedSongSyncing() { - if(this.songSyncModule == null) throw new RuntimeException("SongSyncModule is not initialized"); - this.isDeletedSongSyncing.setValue(true); - this.songSyncModule.syncDeletedSongs(); - } - - public void finishDeleteSongSyncinc() { - this.isDeletedSongSyncing.setValue(false); - } - - public void startFetchingActive() { - if(this.songSyncModule == null) throw new RuntimeException("SongSyncModule is not initialized"); - this.isFetchingActive.setValue(true); - this.songSyncModule.fetchRemoteModifiedSongs(); - } - - public void finishFetching() { - this.isFetchingActive.setValue(false); - } - - public MutableLiveData getIsFetchingActive() { - return isFetchingActive; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/stormtales/notevault/ui/home/HomeFragment.java b/app/src/main/java/com/stormtales/notevault/ui/home/HomeFragment.java deleted file mode 100644 index 72990d6..0000000 --- a/app/src/main/java/com/stormtales/notevault/ui/home/HomeFragment.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.stormtales.notevault.ui.home; - -import android.app.Activity; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; -import android.widget.Toast; -import androidx.activity.result.ActivityResult; -import androidx.activity.result.ActivityResultCallback; -import androidx.activity.result.ActivityResultLauncher; -import androidx.activity.result.contract.ActivityResultContracts; -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.lifecycle.ViewModelProvider; -import androidx.recyclerview.widget.DividerItemDecoration; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.floatingactionbutton.FloatingActionButton; -import com.stormtales.notevault.R; -import com.stormtales.notevault.data.entities.Song; -import com.stormtales.notevault.data.repositories.SongRepository; -import com.stormtales.notevault.databinding.FragmentHomeBinding; -import com.stormtales.notevault.ui.sheetdisplay.NoteSheetDisplayActivity; -import com.stormtales.notevault.ui.songeditor.SongEditorDialog; - -import java.util.ArrayList; -import java.util.List; - -public class HomeFragment extends Fragment { - - private FragmentHomeBinding binding; - private RecyclerView recyclerView; - private SongAdapter songAdapter; - private HomeViewModel homeViewModel; - private static final int PICK_FILE_REQUEST_CODE = 1; - - public View onCreateView(@NonNull LayoutInflater inflater, - ViewGroup container, Bundle savedInstanceState) { - homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class); - homeViewModel.setSongRepository(new SongRepository(this.getContext())); - - binding = FragmentHomeBinding.inflate(inflater, container, false); - View root = binding.getRoot(); - recyclerView = root.findViewById(R.id.recycler_view_songs); - - ActivityResultLauncher launcher = registerForActivityResult( - new ActivityResultContracts.StartActivityForResult(), - activityResult -> { - getActivity(); - if(activityResult.getResultCode() == Activity.RESULT_OK && activityResult.getData() != null) { - if(activityResult.getData().getClipData() != null) { - int fileNumber = activityResult.getData().getClipData().getItemCount(); - Uri[] files = new Uri[fileNumber]; - for(int i = 0; i < fileNumber; i++) { - files[i] = activityResult.getData().getClipData().getItemAt(i).getUri(); - Toast.makeText(requireContext(), "Uri: " + files[i].toString(), Toast.LENGTH_SHORT).show(); - } - handleSelectedNoteSheets(files); - } else { - Uri uri = activityResult.getData().getData(); - Toast.makeText(requireContext(), "Uri: " + uri.toString(), Toast.LENGTH_SHORT).show(); - handleSelectedNoteSheets(uri); - } - } - } - ); - - FloatingActionButton importBtn = root.findViewById(R.id.addSongBtn); - importBtn.setOnClickListener(v -> { - Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); - intent.setType("*/*"); // Alle Dateitypen - - String[] mimeTypes = {"application/pdf", "image/png", "image/jpeg"}; - intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes); - intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); - - intent.addCategory(Intent.CATEGORY_OPENABLE); - - - launcher.launch(intent); - }); - - // RecyclerView einrichten - songAdapter = new SongAdapter(new ArrayList<>(), this::onEditSong, this::onDeleteSong, this::onOpenSong); - recyclerView.setAdapter(songAdapter); - recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), LinearLayoutManager.VERTICAL); - recyclerView.addItemDecoration(dividerItemDecoration); - - // Beobachte Änderungen in der Song-Liste - homeViewModel.getAllSongsLive().observe(getViewLifecycleOwner(), songs -> { - songAdapter.updateData(songs); - }); - - return root; - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - binding = null; - } - - private void handleSelectedNoteSheets(Uri... files) { - SongEditorDialog songEditorDialog = new SongEditorDialog(); - songEditorDialog.setNoteSheetFiles(files); - songEditorDialog.setHomeViewModel(homeViewModel); - songEditorDialog.show(getParentFragmentManager(), "songEditorDialog"); - } - - public void onEditSong(Song song) { - SongEditorDialog songEditorDialog = new SongEditorDialog(); - songEditorDialog.setEditedSong(song); - songEditorDialog.setHomeViewModel(homeViewModel); - songEditorDialog.show(getParentFragmentManager(), "songEditorDialog"); - } - - public void onDeleteSong(Song song) { - this.homeViewModel.deleteSong(song); - } - - public void onOpenSong(Song song) { - homeViewModel.getSongRepository().getNoteSheetFilesBySongID(song.getLocalID(), result -> { - String[] noteSheetFiles = new String[result.size()]; - for(int i = 0; i < result.size(); i++) { - noteSheetFiles[i] = result.get(i); - } - Intent intent = new Intent(getContext(), NoteSheetDisplayActivity.class); - intent.putExtra("imageUris", noteSheetFiles); - getContext().startActivity(intent); - - }); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/stormtales/notevault/ui/home/HomeViewModel.java b/app/src/main/java/com/stormtales/notevault/ui/home/HomeViewModel.java deleted file mode 100644 index 37ea293..0000000 --- a/app/src/main/java/com/stormtales/notevault/ui/home/HomeViewModel.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.stormtales.notevault.ui.home; - -import android.util.Log; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; -import com.stormtales.notevault.data.entities.NoteSheet; -import com.stormtales.notevault.data.entities.Song; -import com.stormtales.notevault.data.repositories.SongRepository; -import com.stormtales.notevault.data.sync.SyncStatus; - -import java.util.ArrayList; -import java.util.List; - -public class HomeViewModel extends ViewModel { - - private MutableLiveData> allSongs; - private SongRepository songRepository; - - public HomeViewModel() { - List currentSongs = new ArrayList<>(); - this.allSongs = new MutableLiveData<>(currentSongs); - /*this.allSongs.setValue(songRepository.getAllSongs());*/ - } - - public void addSong(Song song, List noteSheetList) { - songRepository.insert(song, internalSongID -> { - for(NoteSheet noteSheet : noteSheetList) { - noteSheet.setSongID(Math.toIntExact(internalSongID)); - } - songRepository.insertNoteSheets(noteSheetList); - }); - - - List currentSongs = allSongs.getValue(); - if(currentSongs == null) { - currentSongs = new ArrayList<>(); - } - - // Neue Liste erstellen und den Song hinzufügen - List updatedSongs = new ArrayList<>(currentSongs); - updatedSongs.add(song); - // Neue Liste in MutableLiveData setzen - allSongs.setValue(updatedSongs); - Log.d("HomeViewModel", "Song added. Total songs: " + updatedSongs.size()); - } - - public LiveData> getAllSongsLive() { - return allSongs; - } - - public void setSongRepository(SongRepository songRepository) { - this.songRepository = songRepository; - loadAllSongs(); - } - - public void loadAllSongs() { - songRepository.getAllSongs(songs->allSongs.setValue(songs)); - } - - public void deleteSong(Song song) { - songRepository.deleteSong(song); - - List currentSongs = allSongs.getValue(); - if(currentSongs != null) { - currentSongs.remove(song); - allSongs.setValue(currentSongs); - } - } - - public void updateSong(Song editedSong) { - List currentSongs = allSongs.getValue(); - if(currentSongs != null) { - for(int i = 0; i < currentSongs.size(); i++) { - if(currentSongs.get(i).getLocalID() == editedSong.getLocalID()) { - currentSongs.set(i, editedSong); - break; - } - } - songRepository.updateSong(editedSong); - allSongs.setValue(currentSongs); - } - } - - public SongRepository getSongRepository() { - return songRepository; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/stormtales/notevault/ui/home/SongAdapter.java b/app/src/main/java/com/stormtales/notevault/ui/home/SongAdapter.java deleted file mode 100644 index 81a4df2..0000000 --- a/app/src/main/java/com/stormtales/notevault/ui/home/SongAdapter.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.stormtales.notevault.ui.home; - -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageButton; -import android.widget.TextView; -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; -import com.stormtales.notevault.R; -import com.stormtales.notevault.data.entities.Song; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; - -public class SongAdapter extends RecyclerView.Adapter { - - private List songList; - private OnEditSongListener onEditSongListener; - private OnDeleteSongListener onDeleteSongListener; - private OnOpenSongListener onOpenSongListener; - - public SongAdapter(List songList, OnEditSongListener onEditSongListener, OnDeleteSongListener onDeleteSongListener, OnOpenSongListener onOpenSongListener) { - this.songList = songList; - this.onEditSongListener = onEditSongListener; - this.onDeleteSongListener = onDeleteSongListener; - this.onOpenSongListener = onOpenSongListener; - } - - public void updateData(List songs) { - if (songs == null) { - this.songList = new ArrayList<>(); - } else { - this.songList = new ArrayList<>(songs); - } - notifyDataSetChanged(); - Log.d("SongAdapter", "Data updated: " + this.songList.size()); - } - - public class SongViewHolder extends RecyclerView.ViewHolder { - TextView textYear, textComposition, textTitle; - ImageButton editButton, deleteButton; - - public SongViewHolder(View itemView) { - super(itemView); - textYear = itemView.findViewById(R.id.text_year); - textComposition = itemView.findViewById(R.id.text_composition); - textTitle = itemView.findViewById(R.id.text_title); - editButton = itemView.findViewById(R.id.edit_song_button); - deleteButton = itemView.findViewById(R.id.delete_song_button); - - textTitle.setOnClickListener(v -> { - int position = getAdapterPosition(); - if (position != RecyclerView.NO_POSITION) { - Song song = songList.get(position); - onOpenSongListener.onOpenSong(song); - } - }); - } - } - - @NonNull - @Override - public @NotNull SongViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int i) { - View itemView = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.item_song, parent, false); - return new SongViewHolder(itemView); - } - - @Override - public void onBindViewHolder(@NonNull @NotNull SongAdapter.SongViewHolder holder, int position) { - Song song = songList.get(position); - holder.textYear.setText(String.valueOf(song.getYear())); - holder.textComposition.setText(song.getComposer()); - holder.textTitle.setText(song.getTitle()); - - holder.editButton.setOnClickListener(v -> onEditSongListener.onEditSong(song)); - holder.deleteButton.setOnClickListener(v -> onDeleteSongListener.onDeleteSong(song)); - } - - @Override - public int getItemCount() { - return songList.size(); - } - - public interface OnEditSongListener { - void onEditSong(Song song); - } - - public interface OnDeleteSongListener { - void onDeleteSong(Song song); - } - - public interface OnOpenSongListener { - void onOpenSong(Song song); - } -} diff --git a/app/src/main/java/com/stormtales/notevault/ui/login/LoginDialog.java b/app/src/main/java/com/stormtales/notevault/ui/login/LoginDialog.java deleted file mode 100644 index 57f3518..0000000 --- a/app/src/main/java/com/stormtales/notevault/ui/login/LoginDialog.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.stormtales.notevault.ui.login; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.Context; -import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; -import android.util.Log; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; -import android.view.inputmethod.EditorInfo; -import android.widget.*; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.DialogFragment; -import androidx.lifecycle.Observer; -import androidx.lifecycle.ViewModelProvider; -import com.stormtales.notevault.R; -import com.stormtales.notevault.network.APICallback; -import com.stormtales.notevault.network.auth.AuthService; -import org.jetbrains.annotations.NotNull; - -public class LoginDialog extends DialogFragment { - - private LoginViewModel loginViewModel; - private boolean isLoginMode = true; - private Dialog dialog; - - private Button loginButton; - private ProgressBar loadingProgressBar; - private EditText editTextUsername; - private EditText editTextPassword; - private EditText editTextEmail; - private TextView textViewTitle; - private TextView textViewSwitch; - - @Override - public void onAttach(Context context) { - super.onAttach(context); - - } - - public LoginDialog(LoginViewModel loginViewModel) { - this.loginViewModel = loginViewModel; - } - - @NonNull - @Override - public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { - AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); - LayoutInflater inflater = requireActivity().getLayoutInflater(); - View view = inflater.inflate(R.layout.fragment_login_dialog, null); - - textViewTitle = view.findViewById(R.id.textViewTitle); - editTextUsername = view.findViewById(R.id.editTextUsername); - editTextEmail = view.findViewById(R.id.editTextEmail); - editTextPassword = view.findViewById(R.id.editTextPassword); - loginButton = view.findViewById(R.id.buttonAction); - textViewSwitch = view.findViewById(R.id.textViewSwitch); - loadingProgressBar = view.findViewById(R.id.loading); - // Handle action button click - - - // Toggle between Login and Registration - textViewSwitch.setOnClickListener(v -> { - isLoginMode = !isLoginMode; - textViewTitle.setText(isLoginMode ? "Login" : "Register"); - editTextUsername.setVisibility(isLoginMode ? View.GONE : View.VISIBLE); - loginButton.setText(isLoginMode ? "Login" : "Register"); - textViewSwitch.setText(isLoginMode ? "Don't have an account? Register" : "Already have an account? Login"); - }); - - builder.setView(view); - dialog = builder.create(); - - - - TextWatcher afterTextChangedListener = new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - - } - - @Override - public void afterTextChanged(Editable s) { - loginViewModel.updateLoginData(editTextUsername.getText().toString(), editTextPassword.getText().toString()); - } - }; - - editTextUsername.addTextChangedListener(afterTextChangedListener); - editTextPassword.addTextChangedListener(afterTextChangedListener); - editTextPassword.setOnEditorActionListener(new TextView.OnEditorActionListener() { - @Override - public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { - if(actionId == EditorInfo.IME_ACTION_DONE) { - loginViewModel.performLogin(editTextUsername.getText().toString(), editTextPassword.getText().toString(), LoginDialog.this::onSuccessFullLogin); - } - return false; - } - }); - - loginButton.setOnClickListener(v -> { - loadingProgressBar.setVisibility(View.VISIBLE); - String email = editTextEmail.getText().toString(); - String password = editTextPassword.getText().toString(); - if (isLoginMode) { - // Handle login logic - this.loginViewModel.performLogin(email, password, this::onSuccessFullLogin); - } else { - // Handle registration logic - String username = editTextUsername.getText().toString(); - this.loginViewModel.performRegistration(email, password, username, this::onSuccessFullRegistration); - } - }); - return dialog; - } - - private void onSuccessFullRegistration() { - Toast.makeText(getContext(), "Successfully registered", Toast.LENGTH_LONG).show(); - this.isLoginMode = true; - textViewTitle.setText(isLoginMode ? "Login" : "Register"); - editTextUsername.setVisibility(isLoginMode ? View.GONE : View.VISIBLE); - loginButton.setText(isLoginMode ? "Login" : "Register"); - textViewSwitch.setText(isLoginMode ? "Don't have an account? Register" : "Already have an account? Login"); - } - - @Override - public void onViewCreated(@NonNull @NotNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - loginViewModel.getLoginFormState().observe(getViewLifecycleOwner(), new Observer() { - @Override - public void onChanged(LoginFormState loginFormState) { - if(loginFormState == null) return; - loginButton.setEnabled(loginFormState.isDataValid()); - if(loginFormState.getUsernameError() != null) { - editTextUsername.setError(getString(loginFormState.getUsernameError())); - } - if(loginFormState.getPasswordError() != null) { - editTextPassword.setError(getString(loginFormState.getPasswordError())); - } - } - }); - } - - void onSuccessFullLogin() { - this.dialog.dismiss(); - } - -} diff --git a/app/src/main/java/com/stormtales/notevault/ui/login/LoginFormState.java b/app/src/main/java/com/stormtales/notevault/ui/login/LoginFormState.java deleted file mode 100644 index 17c2714..0000000 --- a/app/src/main/java/com/stormtales/notevault/ui/login/LoginFormState.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.stormtales.notevault.ui.login; - -import androidx.annotation.Nullable; - -public class LoginFormState { - @Nullable - private Integer usernameError; - @Nullable - private Integer passwordError; - private boolean isDataValid; - - LoginFormState(@Nullable Integer usernameError, @Nullable Integer passwordError) { - this.usernameError = usernameError; - this.passwordError = passwordError; - this.isDataValid = false; - } - - LoginFormState(boolean isDataValid) { - this.usernameError = null; - this.passwordError = null; - this.isDataValid = isDataValid; - } - - @Nullable - Integer getUsernameError() { - return usernameError; - } - - @Nullable - Integer getPasswordError() { - return passwordError; - } - - boolean isDataValid() { - return isDataValid; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/ui/login/LoginViewModel.java b/app/src/main/java/com/stormtales/notevault/ui/login/LoginViewModel.java deleted file mode 100644 index 72a66b7..0000000 --- a/app/src/main/java/com/stormtales/notevault/ui/login/LoginViewModel.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.stormtales.notevault.ui.login; - -import android.util.Log; -import android.util.Patterns; -import android.widget.Toast; -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; -import com.stormtales.notevault.R; -import com.stormtales.notevault.network.APICallback; -import com.stormtales.notevault.network.auth.AuthService; -import com.stormtales.notevault.network.auth.LoginResponse; - -public class LoginViewModel extends ViewModel { - - private final MutableLiveData username; - private final MutableLiveData isLoggedIn; - private MutableLiveData loginFormState = new MutableLiveData<>(); - private AuthService authService; - - public LoginViewModel() { - username = new MutableLiveData<>("Not Logged In"); - isLoggedIn = new MutableLiveData<>(false); - } - - public void performLogin(String email, String password, SuccessFullLoginCallback successFullLoginCallback) { - if(authService != null) { - authService.performLogin(email, password, new LoginCallBackImpl(successFullLoginCallback)); - } else { - throw new RuntimeException("AuthService is not provided to LoginViewModel"); - } - } - - public void performRegistration(String email, String password, String username, SuccessFullLoginCallback successFullLoginCallback) { - if(authService != null) { - authService.performRegistration(email, username, password, new APICallback() { - @Override - public void onSuccess() { - successFullLoginCallback.onSuccess(); - } - - @Override - public void onError(String error) { - Log.d("LoginService", error); - } - }); - } - } - - public void setAuthService(AuthService authService) { - this.authService = authService; - } - - public MutableLiveData getIsLoggedIn() { - return isLoggedIn; - } - - public MutableLiveData getUsername() { - return username; - } - - public void updateLoginData(String username, String password) { - if(!isUserNameValid(username)) { - loginFormState.setValue(new LoginFormState(R.string.invalid_username, null)); - } else if(!isPasswordValid(password)) { - loginFormState.setValue(new LoginFormState(null, R.string.invalid_password)); - } else { - loginFormState.setValue(new LoginFormState(true)); - } - } - - public class LoginCallBackImpl implements AuthService.LoginCallback { - - private final SuccessFullLoginCallback successFullLoginCallback; - - public LoginCallBackImpl(SuccessFullLoginCallback successFullLoginCallback) { - this.successFullLoginCallback = successFullLoginCallback; - } - - @Override - public void onSuccess(LoginResponse loginResponse) { - username.setValue(loginResponse.getUsername()); - isLoggedIn.setValue(true); - successFullLoginCallback.onSuccess(); - } - - @Override - public void onError(String error) { - Log.d("LoginService", error); - } - } - - public interface SuccessFullLoginCallback { - void onSuccess(); - } - - public MutableLiveData getLoginFormState() { - return loginFormState; - } - - // A placeholder username validation check - private boolean isUserNameValid(String username) { - if (username == null) { - return false; - } - if (username.contains("@")) { - return Patterns.EMAIL_ADDRESS.matcher(username).matches(); - } else { - return !username.trim().isEmpty(); - } - } - - // A placeholder password validation check - private boolean isPasswordValid(String password) { - return password != null && password.trim().length() > 5; - } -} diff --git a/app/src/main/java/com/stormtales/notevault/ui/sheetdisplay/ImagePagerAdapter.java b/app/src/main/java/com/stormtales/notevault/ui/sheetdisplay/ImagePagerAdapter.java deleted file mode 100644 index 11dea90..0000000 --- a/app/src/main/java/com/stormtales/notevault/ui/sheetdisplay/ImagePagerAdapter.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.stormtales.notevault.ui.sheetdisplay; - - -import android.content.Context; -import android.net.Uri; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; -import com.github.chrisbanes.photoview.PhotoView; -import com.stormtales.notevault.R; - -import java.util.List; - -public class ImagePagerAdapter extends RecyclerView.Adapter { - private final List imageUris; - private final Context context; - - public ImagePagerAdapter(Context context, List imageUris) { - this.context = context; - this.imageUris = imageUris; - } - - @NonNull - @Override - public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(context).inflate(R.layout.item_image, parent, false); - return new ImageViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) { - Uri uri = Uri.parse(imageUris.get(position)); - holder.photoView.setImageURI(uri); - } - - @Override - public int getItemCount() { - return imageUris.size(); - } - - static class ImageViewHolder extends RecyclerView.ViewHolder { - PhotoView photoView; - - ImageViewHolder(View itemView) { - super(itemView); - photoView = itemView.findViewById(R.id.photoView); - } - } -} diff --git a/app/src/main/java/com/stormtales/notevault/ui/sheetdisplay/NoteSheetDisplayActivity.java b/app/src/main/java/com/stormtales/notevault/ui/sheetdisplay/NoteSheetDisplayActivity.java deleted file mode 100644 index f75a985..0000000 --- a/app/src/main/java/com/stormtales/notevault/ui/sheetdisplay/NoteSheetDisplayActivity.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.stormtales.notevault.ui.sheetdisplay; - -import android.content.Intent; -import android.os.Bundle; -import androidx.appcompat.app.AppCompatActivity; -import androidx.viewpager2.widget.ViewPager2; -import com.google.android.material.tabs.TabLayout; -import com.google.android.material.tabs.TabLayoutMediator; -import com.stormtales.notevault.R; - -import java.util.Arrays; -import java.util.List; - -public class NoteSheetDisplayActivity extends AppCompatActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_note_sheet_viewer); // Erstelle eine Layout-Datei - - ViewPager2 imageView = findViewById(R.id.viewPager); // Angenommen, du hast ein ImageView - TabLayout tabLayout = findViewById(R.id.tabLayout); - - - - // Die URI aus dem Intent erhalten - Intent intent = getIntent(); - String[] imageUris = intent.getStringArrayExtra("imageUris"); - if (imageUris != null) { - List uriList = Arrays.asList(imageUris); - ImagePagerAdapter adapter = new ImagePagerAdapter(this, uriList); - imageView.setAdapter(adapter); // Setze die URI in das ImageView - - new TabLayoutMediator(tabLayout, imageView, - (tab, position) -> tab.setText("Sheet " + (position + 1)) // Hier kannst du auch andere Labels verwenden - ).attach(); - } else { - throw new NullPointerException(); - } - } -} diff --git a/app/src/main/java/com/stormtales/notevault/ui/slideshow/SlideshowFragment.java b/app/src/main/java/com/stormtales/notevault/ui/slideshow/SlideshowFragment.java deleted file mode 100644 index dcb2624..0000000 --- a/app/src/main/java/com/stormtales/notevault/ui/slideshow/SlideshowFragment.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.stormtales.notevault.ui.slideshow; - -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; -import androidx.annotation.NonNull; -import androidx.fragment.app.Fragment; -import androidx.lifecycle.ViewModelProvider; -import com.stormtales.notevault.databinding.FragmentSlideshowBinding; - -public class SlideshowFragment extends Fragment { - - private FragmentSlideshowBinding binding; - - public View onCreateView(@NonNull LayoutInflater inflater, - ViewGroup container, Bundle savedInstanceState) { - SlideshowViewModel slideshowViewModel = - new ViewModelProvider(this).get(SlideshowViewModel.class); - - binding = FragmentSlideshowBinding.inflate(inflater, container, false); - View root = binding.getRoot(); - - final TextView textView = binding.textSlideshow; - slideshowViewModel.getText().observe(getViewLifecycleOwner(), textView::setText); - return root; - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - binding = null; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/stormtales/notevault/ui/slideshow/SlideshowViewModel.java b/app/src/main/java/com/stormtales/notevault/ui/slideshow/SlideshowViewModel.java deleted file mode 100644 index bb4af34..0000000 --- a/app/src/main/java/com/stormtales/notevault/ui/slideshow/SlideshowViewModel.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.stormtales.notevault.ui.slideshow; - -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; - -public class SlideshowViewModel extends ViewModel { - - private final MutableLiveData mText; - - public SlideshowViewModel() { - mText = new MutableLiveData<>(); - mText.setValue("This is slideshow fragment"); - } - - public LiveData getText() { - return mText; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/stormtales/notevault/ui/songeditor/SongEditorDialog.java b/app/src/main/java/com/stormtales/notevault/ui/songeditor/SongEditorDialog.java deleted file mode 100644 index ade8b40..0000000 --- a/app/src/main/java/com/stormtales/notevault/ui/songeditor/SongEditorDialog.java +++ /dev/null @@ -1,193 +0,0 @@ -package com.stormtales.notevault.ui.songeditor; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.Context; -import android.net.Uri; -import android.os.Bundle; -import android.text.Layout; -import android.util.Log; -import android.widget.Button; -import android.widget.EditText; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.DialogFragment; -import androidx.fragment.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import androidx.lifecycle.ViewModelProvider; -import com.stormtales.notevault.R; -import com.stormtales.notevault.data.entities.NoteSheet; -import com.stormtales.notevault.data.entities.Song; -import com.stormtales.notevault.data.sync.SyncStatus; -import com.stormtales.notevault.network.sync.SongSyncService; -import com.stormtales.notevault.network.sync.models.AIRecognizedSong; -import com.stormtales.notevault.ui.home.HomeViewModel; -import com.stormtales.notevault.utils.NoteSheetsUtil; -import com.stormtales.notevault.utils.Tupel; -import org.jetbrains.annotations.NotNull; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; - - -public class SongEditorDialog extends DialogFragment { - - Dialog dialog; - private Uri[] noteSheetFiles; - private HomeViewModel homeViewModel; - - private Song editedSong; - private SongSyncService songSyncService; - - private View progressbar; - public SongEditorDialog() { - // Required empty public constructor - this.songSyncService = new SongSyncService(this.getContext()); - } - - - @NonNull - @Override - public @NotNull Dialog onCreateDialog(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) { - LayoutInflater inflater = LayoutInflater.from(getContext()); - View dialogView = inflater.inflate(R.layout.fragment_song_editor_dialog, null); - - - dialogView.findViewById(R.id.btnCancel).setOnClickListener(v-> onCancel()); - dialogView.findViewById(R.id.btnSave).setOnClickListener(v -> onSave()); - - if(this.noteSheetFiles == null || noteSheetFiles.length == 0) { - dialogView.findViewById(R.id.btnAutoDetect).setEnabled(false); - } else { - progressbar = dialogView.findViewById(R.id.spinnerAutoDetect); - - } - - dialogView.findViewById(R.id.btnAutoDetect).setOnClickListener(v -> { - progressbar.setVisibility(ViewGroup.VISIBLE); - extractTitleFromFirstPage(); - }); - - AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); - builder.setCancelable(false); - builder.setView(dialogView); - - dialog = builder.create(); - dialog.setCanceledOnTouchOutside(false); - return dialog; - } - - private File createTemporaryFileForRecognition(Uri noteSheetUri) { - try { - // Hole den InputStream des Bildes - InputStream inputStream = getContext().getContentResolver().openInputStream(noteSheetUri); - if (inputStream != null) { - // Erstelle eine temporäre Datei - File tempFile = File.createTempFile("temp_note_sheet", ".jpg", getContext().getCacheDir()); - - // Inhalt des InputStreams in die temporäre Datei schreiben - try (OutputStream outputStream = new FileOutputStream(tempFile)) { - byte[] buffer = new byte[8192]; - int bytesRead; - while ((bytesRead = inputStream.read(buffer)) != -1) { - outputStream.write(buffer, 0, bytesRead); - } - } - - // Schließe den InputStream - inputStream.close(); - - return tempFile; - } - } catch (Exception e) { - Log.e("SongEditorDialog", "Fehler beim Erstellen der temporären Datei: " + e.getMessage()); - } - - return null; - } - private void extractTitleFromFirstPage() { - if(noteSheetFiles != null && noteSheetFiles.length > 0) { - Uri firstPageUri = noteSheetFiles[0]; - - // Temporäre Datei erstellen - File tempFile = createTemporaryFileForRecognition(firstPageUri); - if(tempFile != null) { - songSyncService.recognizeTitle(tempFile.getAbsolutePath(), new SongSyncService.RecognizedSongCallback() { - @Override - public void onRecognizedSong(AIRecognizedSong aiRecognizedSong) { - progressbar.setVisibility(ViewGroup.GONE); - ((EditText) dialog.findViewById(R.id.etTitle)).setText(aiRecognizedSong.getTitle()); - ((EditText) dialog.findViewById(R.id.etComposer)).setText(aiRecognizedSong.getComposer()); - ((EditText) dialog.findViewById(R.id.etYear)).setText(String.valueOf(aiRecognizedSong.getYear())); - ((EditText) dialog.findViewById(R.id.etGenre)).setText(aiRecognizedSong.getDescription()); - } - }); - } - } - } - - @Override - public void onStart() { - super.onStart(); - if(editedSong != null) { - ((EditText) dialog.findViewById(R.id.etTitle)).setText(editedSong.getTitle()); - ((EditText) dialog.findViewById(R.id.etComposer)).setText(editedSong.getComposer()); - ((EditText) dialog.findViewById(R.id.etGenre)).setText(editedSong.getGenre()); - ((EditText) dialog.findViewById(R.id.etYear)).setText(String.valueOf(editedSong.getYear())); - } - } - - private void onCancel() { - dialog.dismiss(); - } - - private void onSave() { - String title = ((EditText) dialog.findViewById(R.id.etTitle)).getText().toString(); - String composer = ((EditText) dialog.findViewById(R.id.etComposer)).getText().toString(); - - String year_string = ((EditText) dialog.findViewById(R.id.etYear)).getText().toString(); - int releaseYear = year_string.isBlank()? 0 : Integer.parseInt(year_string); - String genre = ((EditText) dialog.findViewById(R.id.etGenre)).getText().toString(); - - if(editedSong != null) { - editedSong.setTitle(title); - editedSong.setComposer(composer); - editedSong.setYear(releaseYear); - editedSong.setGenre(genre); - editedSong.setSyncStatus(SyncStatus.MODIFIED); - homeViewModel.updateSong(editedSong); - } else { - Song song = new Song(title, composer, genre, releaseYear); - - Context context = this.getContext(); - List noteSheetList = new ArrayList<>(); - for(Uri uri : noteSheetFiles) { - Tupel result = NoteSheetsUtil.saveImageInternally(context.getContentResolver(), uri, context.getFilesDir()); - noteSheetList.add(new NoteSheet(result.getValue00(), result.getValue01())); - } - homeViewModel.addSong(song, noteSheetList); - } - - - dialog.dismiss(); - - } - - public void setNoteSheetFiles(Uri[] noteSheetFiles) { - this.noteSheetFiles = noteSheetFiles; - } - - public void setHomeViewModel(HomeViewModel homeViewModel) { - this.homeViewModel = homeViewModel; - } - - public void setEditedSong(Song editedSong) { - this.editedSong = editedSong; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/stormtales/notevault/utils/NoteSheetsUtil.java b/app/src/main/java/com/stormtales/notevault/utils/NoteSheetsUtil.java deleted file mode 100644 index fa66d89..0000000 --- a/app/src/main/java/com/stormtales/notevault/utils/NoteSheetsUtil.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.stormtales.notevault.utils; - -import android.content.ContentResolver; -import android.content.Context; -import android.media.ExifInterface; -import android.net.Uri; -import okhttp3.ResponseBody; - -import java.io.*; -import java.nio.file.Files; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.*; - -public class NoteSheetsUtil { - private static long getImageTimestamp(Context context, Uri imageUri) { - try { - InputStream inputStream = context.getContentResolver().openInputStream(imageUri); - ExifInterface exif = new ExifInterface(inputStream); - - String dateTime = exif.getAttribute(ExifInterface.TAG_DATETIME); - if(dateTime != null) { - SimpleDateFormat format = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss", Locale.getDefault()); - Date date = format.parse(dateTime); - return date != null ? date.getTime() : 0; - } else { - File file = new File(imageUri.getPath()); - return file.lastModified(); - } - } catch (IOException | ParseException e) { - throw new RuntimeException(e); - } - } - - public static void sortNoteSheetsByTimestamp(Context context, Uri[] uris) { - ArrayList uriTimestamps = new ArrayList<>(); - - for(Uri uri : uris) { - long timestamp = getImageTimestamp(context, uri); - uriTimestamps.add(new UriTimestamp(uri, timestamp)); - } - - Collections.sort(uriTimestamps, Comparator.comparingLong(UriTimestamp::getTimestamp)); - - for(int i=0; i saveImageInternally(ContentResolver contentResolver, Uri uri, File filesDir) { - try (InputStream inputStream = contentResolver.openInputStream(uri)) { - // Datei erstellen - File imageFile = new File(filesDir, "saved_image_" + System.currentTimeMillis() + ".jpg"); - try (OutputStream outputStream = Files.newOutputStream(imageFile.toPath())) { - // SHA-256 Hash-Funktion initialisieren - MessageDigest digest = MessageDigest.getInstance("SHA-256"); - - // Daten blockweise lesen und gleichzeitig schreiben und hashen - byte[] buffer = new byte[4096]; - int bytesRead; - while ((bytesRead = inputStream.read(buffer)) != -1) { - outputStream.write(buffer, 0, bytesRead); - digest.update(buffer, 0, bytesRead); // Hash aktualisieren - } - - // Hash berechnen - byte[] hashBytes = digest.digest(); - StringBuilder hashString = new StringBuilder(); - for (byte b : hashBytes) { - hashString.append(String.format("%02x", b)); // Bytes in Hexadezimal umwandeln - } - - // Hashwert zurückgeben (kann auch zusammen mit dem Pfad gespeichert werden) - return new Tupel<>(imageFile.getAbsolutePath(), hashString.toString()); - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException(e); - } - } catch (IOException e) { - e.printStackTrace(); - return null; - } - } - - public static Tupel saveImageFromServer(ResponseBody body, File filesDir) { - File imageFile = new File(filesDir, "saved_image_" + System.currentTimeMillis() + ".jpg"); - try (InputStream inputStream = body.byteStream(); - FileOutputStream outputStream = new FileOutputStream(imageFile)) { - MessageDigest digest = MessageDigest.getInstance("SHA-256"); - - // Daten blockweise lesen und gleichzeitig schreiben und hashen - byte[] buffer = new byte[4096]; - int bytesRead; - while ((bytesRead = inputStream.read(buffer)) != -1) { - outputStream.write(buffer, 0, bytesRead); - digest.update(buffer, 0, bytesRead); // Hash aktualisieren - } - - // Hash berechnen - byte[] hashBytes = digest.digest(); - StringBuilder hashString = new StringBuilder(); - for (byte b : hashBytes) { - hashString.append(String.format("%02x", b)); // Bytes in Hexadezimal umwandeln - } - - // Hashwert zurückgeben (kann auch zusammen mit dem Pfad gespeichert werden) - return new Tupel<>(imageFile.getAbsolutePath(), hashString.toString()); - } catch (IOException | NoSuchAlgorithmException e) { - throw new RuntimeException(e); - } - } - - public static void deleteNoteSheet(String filePath) throws IOException { - Files.delete(new File(filePath).toPath()); - } -} diff --git a/app/src/main/java/com/stormtales/notevault/utils/Tupel.java b/app/src/main/java/com/stormtales/notevault/utils/Tupel.java deleted file mode 100644 index c9074d8..0000000 --- a/app/src/main/java/com/stormtales/notevault/utils/Tupel.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.stormtales.notevault.utils; - -import java.util.Objects; - -public class Tupel { - private final A value00; - private final B value01; - - public Tupel(A value00, B value01) { - this.value00 = value00; - this.value01 = value01; - } - - public A getValue00() { - return value00; - } - - public B getValue01() { - return value01; - } - - @Override - public boolean equals(Object o) { - if (o == null || getClass() != o.getClass()) return false; - Tupel tupel = (Tupel) o; - return Objects.equals(value00, tupel.value00) && Objects.equals(value01, tupel.value01); - } - - @Override - public int hashCode() { - return Objects.hash(value00, value01); - } -} diff --git a/app/src/main/java/com/stormtales/notevault/utils/UriTimestamp.java b/app/src/main/java/com/stormtales/notevault/utils/UriTimestamp.java deleted file mode 100644 index 7fb2cfd..0000000 --- a/app/src/main/java/com/stormtales/notevault/utils/UriTimestamp.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.stormtales.notevault.utils; - -import android.net.Uri; - -public class UriTimestamp { - private final Uri uri; - private final long timestamp; - - public UriTimestamp(Uri uri, long timestamp) { - this.uri = uri; - this.timestamp = timestamp; - } - - public Uri getUri() { - return uri; - } - - public long getTimestamp() { - return timestamp; - } -} diff --git a/app/src/main/java/come/stormborntales/notevault/MainActivity.kt b/app/src/main/java/come/stormborntales/notevault/MainActivity.kt new file mode 100644 index 0000000..f979edd --- /dev/null +++ b/app/src/main/java/come/stormborntales/notevault/MainActivity.kt @@ -0,0 +1,47 @@ +package come.stormborntales.notevault + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import come.stormborntales.notevault.ui.theme.NoteVaultTheme + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContent { + NoteVaultTheme { + Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> + Greeting( + name = "Android", + modifier = Modifier.padding(innerPadding) + ) + } + } + } + } +} + +@Composable +fun Greeting(name: String, modifier: Modifier = Modifier) { + Text( + text = "Hello $name!", + modifier = modifier + ) +} + +@Preview(showBackground = true) +@Composable +fun GreetingPreview() { + NoteVaultTheme { + Greeting("Android") + } +} \ No newline at end of file diff --git a/app/src/main/java/come/stormborntales/notevault/ui/theme/Color.kt b/app/src/main/java/come/stormborntales/notevault/ui/theme/Color.kt new file mode 100644 index 0000000..f2a213f --- /dev/null +++ b/app/src/main/java/come/stormborntales/notevault/ui/theme/Color.kt @@ -0,0 +1,11 @@ +package come.stormborntales.notevault.ui.theme + +import androidx.compose.ui.graphics.Color + +val Purple80 = Color(0xFFD0BCFF) +val PurpleGrey80 = Color(0xFFCCC2DC) +val Pink80 = Color(0xFFEFB8C8) + +val Purple40 = Color(0xFF6650a4) +val PurpleGrey40 = Color(0xFF625b71) +val Pink40 = Color(0xFF7D5260) \ No newline at end of file diff --git a/app/src/main/java/come/stormborntales/notevault/ui/theme/Theme.kt b/app/src/main/java/come/stormborntales/notevault/ui/theme/Theme.kt new file mode 100644 index 0000000..b6f4ee1 --- /dev/null +++ b/app/src/main/java/come/stormborntales/notevault/ui/theme/Theme.kt @@ -0,0 +1,58 @@ +package come.stormborntales.notevault.ui.theme + +import android.app.Activity +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.darkColorScheme +import androidx.compose.material3.dynamicDarkColorScheme +import androidx.compose.material3.dynamicLightColorScheme +import androidx.compose.material3.lightColorScheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext + +private val DarkColorScheme = darkColorScheme( + primary = Purple80, + secondary = PurpleGrey80, + tertiary = Pink80 +) + +private val LightColorScheme = lightColorScheme( + primary = Purple40, + secondary = PurpleGrey40, + tertiary = Pink40 + + /* Other default colors to override + background = Color(0xFFFFFBFE), + surface = Color(0xFFFFFBFE), + onPrimary = Color.White, + onSecondary = Color.White, + onTertiary = Color.White, + onBackground = Color(0xFF1C1B1F), + onSurface = Color(0xFF1C1B1F), + */ +) + +@Composable +fun NoteVaultTheme( + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + dynamicColor: Boolean = true, + content: @Composable () -> Unit +) { + val colorScheme = when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } + + darkTheme -> DarkColorScheme + else -> LightColorScheme + } + + MaterialTheme( + colorScheme = colorScheme, + typography = Typography, + content = content + ) +} \ No newline at end of file diff --git a/app/src/main/java/come/stormborntales/notevault/ui/theme/Type.kt b/app/src/main/java/come/stormborntales/notevault/ui/theme/Type.kt new file mode 100644 index 0000000..d608622 --- /dev/null +++ b/app/src/main/java/come/stormborntales/notevault/ui/theme/Type.kt @@ -0,0 +1,34 @@ +package come.stormborntales.notevault.ui.theme + +import androidx.compose.material3.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = Typography( + bodyLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp + ) + /* Other default text styles to override + titleLarge = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 22.sp, + lineHeight = 28.sp, + letterSpacing = 0.sp + ), + labelSmall = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Medium, + fontSize = 11.sp, + lineHeight = 16.sp, + letterSpacing = 0.5.sp + ) + */ +) \ No newline at end of file diff --git a/app/src/main/res/drawable/delete.xml b/app/src/main/res/drawable/delete.xml deleted file mode 100644 index 0b9c437..0000000 --- a/app/src/main/res/drawable/delete.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/dialog_background.xml b/app/src/main/res/drawable/dialog_background.xml deleted file mode 100644 index 5b12544..0000000 --- a/app/src/main/res/drawable/dialog_background.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/edit_24dp_e8eaed_fill0_wght400_grad0_opsz24.xml b/app/src/main/res/drawable/edit_24dp_e8eaed_fill0_wght400_grad0_opsz24.xml deleted file mode 100644 index a2f714d..0000000 --- a/app/src/main/res/drawable/edit_24dp_e8eaed_fill0_wght400_grad0_opsz24.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_menu_camera.xml b/app/src/main/res/drawable/ic_menu_camera.xml deleted file mode 100644 index 41688d5..0000000 --- a/app/src/main/res/drawable/ic_menu_camera.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/ic_menu_gallery.xml b/app/src/main/res/drawable/ic_menu_gallery.xml deleted file mode 100644 index ff8ce52..0000000 --- a/app/src/main/res/drawable/ic_menu_gallery.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_menu_slideshow.xml b/app/src/main/res/drawable/ic_menu_slideshow.xml deleted file mode 100644 index ae51e49..0000000 --- a/app/src/main/res/drawable/ic_menu_slideshow.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/login.xml b/app/src/main/res/drawable/login.xml deleted file mode 100644 index 2e5aa22..0000000 --- a/app/src/main/res/drawable/login.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/logout.xml b/app/src/main/res/drawable/logout.xml deleted file mode 100644 index d1d6253..0000000 --- a/app/src/main/res/drawable/logout.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/side_nav_bar.xml b/app/src/main/res/drawable/side_nav_bar.xml deleted file mode 100644 index a33798b..0000000 --- a/app/src/main/res/drawable/side_nav_bar.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index 6882bb5..0000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_note_sheet_viewer.xml b/app/src/main/res/layout/activity_note_sheet_viewer.xml deleted file mode 100644 index a523b28..0000000 --- a/app/src/main/res/layout/activity_note_sheet_viewer.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml deleted file mode 100644 index 544ae28..0000000 --- a/app/src/main/res/layout/app_bar_main.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml deleted file mode 100644 index a3a498e..0000000 --- a/app/src/main/res/layout/content_main.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_gallery.xml b/app/src/main/res/layout/fragment_gallery.xml deleted file mode 100644 index 8c2fe91..0000000 --- a/app/src/main/res/layout/fragment_gallery.xml +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - - - - - - - - -