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 new file mode 100644 index 0000000..3f3ac07 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +NoteVault \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index a55e7a1..0000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml deleted file mode 100644 index 3ca65a2..0000000 --- a/.idea/dataSources.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - sqlite.xerial - true - org.sqlite.JDBC - jdbc:sqlite:$PROJECT_DIR$/music_database - - - - $ProjectFileDir$ - - - sqlite.xerial - true - org.sqlite.JDBC - jdbc:sqlite:$PROJECT_DIR$/music_database - - - - $ProjectFileDir$ - - - sqlite.xerial - true - org.sqlite.JDBC - jdbc:sqlite:$USER_HOME$/.cache/JetBrains/IntelliJIdea2024.1/device-explorer/Pixel Tablet API 30/_/data/data/core.notevault/databases/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/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 612ad88..0c0c338 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -2,9 +2,6 @@ - - - diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml deleted file mode 100644 index b268ef3..0000000 --- a/.idea/deploymentTargetSelector.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 7c2d85a..ed6ca53 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,12 +1,5 @@ + - - - - - - - - + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml deleted file mode 100644 index 2b63946..0000000 --- a/.idea/uiDesigner.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7..35eb1dd 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ebf81a8..c7463f6 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,16 +1,15 @@ plugins { - alias(libs.plugins.android.application) - + id("com.android.application") } android { - namespace = "core.notevault" - compileSdk = 35 + namespace = "com.stormtales.notevault" + compileSdk = 34 defaultConfig { - applicationId = "core.notevault" - minSdk = 28 - targetSdk = 35 + applicationId = "com.stormtales.notevault" + minSdk = 29 + targetSdk = 34 versionCode = 1 versionName = "1.0" @@ -22,10 +21,6 @@ android { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } - debug { - // Setzt den Manifest-Platzhalter nur für den Debug-Build auf true - manifestPlaceholders["usesCleartextTraffic"] = "true" - } } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 @@ -38,32 +33,14 @@ android { 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.common) - implementation("androidx.recyclerview:recyclerview:1.3.2") - implementation("com.github.chrisbanes:PhotoView:2.3.0") - implementation(libs.car.ui.lib) - testImplementation(libs.junit) - androidTestImplementation(libs.ext.junit) - androidTestImplementation(libs.espresso.core) - 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") - - - val room_version = "2.6.1" // Aktuelle Room-Version - - implementation("androidx.room:room-runtime:$room_version") - annotationProcessor("androidx.room:room-compiler:$room_version") // Für Annotation Processing - - // Optional: Unterstützung für Kotlin Coroutines oder RxJava - implementation("androidx.room:room-ktx:$room_version") // Für Kotlin-Extensions - implementation("androidx.room:room-rxjava3:$room_version") // Für RxJava-Unterstützung - implementation("androidx.work:work-runtime:2.10.0") + implementation("androidx.appcompat:appcompat:1.7.0") + implementation("com.google.android.material:material:1.12.0") + implementation("androidx.constraintlayout:constraintlayout:2.2.0") + implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.7") + implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.7") + implementation("androidx.navigation:navigation-fragment:2.8.3") + implementation("androidx.navigation:navigation-ui:2.8.3") + testImplementation("junit:junit:4.13.2") + androidTestImplementation("androidx.test.ext:junit:1.2.1") + androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") } \ No newline at end of file diff --git a/app/src/androidTest/java/core/notevault/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/stormtales/notevault/ExampleInstrumentedTest.java similarity index 85% rename from app/src/androidTest/java/core/notevault/ExampleInstrumentedTest.java rename to app/src/androidTest/java/com/stormtales/notevault/ExampleInstrumentedTest.java index 165c633..b779b0e 100644 --- a/app/src/androidTest/java/core/notevault/ExampleInstrumentedTest.java +++ b/app/src/androidTest/java/com/stormtales/notevault/ExampleInstrumentedTest.java @@ -1,4 +1,4 @@ -package core.notevault; +package com.stormtales.notevault; import android.content.Context; import androidx.test.platform.app.InstrumentationRegistry; @@ -20,6 +20,6 @@ public class ExampleInstrumentedTest { public void useAppContext() { // Context of the app under test. Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - assertEquals("core.notevault", appContext.getPackageName()); + assertEquals("com.stormtales.notevault", appContext.getPackageName()); } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ddcd607..71d1156 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,8 +1,7 @@ - - + - - - - - \ 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 new file mode 100644 index 0000000..2e62dcf --- /dev/null +++ b/app/src/main/java/com/stormtales/notevault/MainActivity.java @@ -0,0 +1,62 @@ +package com.stormtales.notevault; + +import android.os.Bundle; +import android.view.View; +import android.view.Menu; +import com.google.android.material.snackbar.Snackbar; +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; + +public class MainActivity extends AppCompatActivity { + + private AppBarConfiguration mAppBarConfiguration; + private ActivityMainBinding binding; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + binding = ActivityMainBinding.inflate(getLayoutInflater()); + setContentView(binding.getRoot()); + + setSupportActionBar(binding.appBarMain.toolbar); + binding.appBarMain.fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) + .setAction("Action", null).show(); + } + }); + 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); + } + + @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(); + } +} \ No newline at end of file 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 new file mode 100644 index 0000000..582a46e --- /dev/null +++ b/app/src/main/java/com/stormtales/notevault/ui/gallery/GalleryFragment.java @@ -0,0 +1,35 @@ +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.TextView; +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; +import com.stormtales.notevault.databinding.FragmentGalleryBinding; + +public class GalleryFragment extends Fragment { + + private FragmentGalleryBinding binding; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + GalleryViewModel galleryViewModel = + new ViewModelProvider(this).get(GalleryViewModel.class); + + binding = FragmentGalleryBinding.inflate(inflater, container, false); + View root = binding.getRoot(); + + final TextView textView = binding.textGallery; + galleryViewModel.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/gallery/GalleryViewModel.java b/app/src/main/java/com/stormtales/notevault/ui/gallery/GalleryViewModel.java new file mode 100644 index 0000000..cfb1d06 --- /dev/null +++ b/app/src/main/java/com/stormtales/notevault/ui/gallery/GalleryViewModel.java @@ -0,0 +1,19 @@ +package com.stormtales.notevault.ui.gallery; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class GalleryViewModel extends ViewModel { + + private final MutableLiveData mText; + + public GalleryViewModel() { + mText = new MutableLiveData<>(); + mText.setValue("This is gallery fragment"); + } + + public LiveData getText() { + return mText; + } +} \ 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 new file mode 100644 index 0000000..9fa2a76 --- /dev/null +++ b/app/src/main/java/com/stormtales/notevault/ui/home/HomeFragment.java @@ -0,0 +1,35 @@ +package com.stormtales.notevault.ui.home; + +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.FragmentHomeBinding; + +public class HomeFragment extends Fragment { + + private FragmentHomeBinding binding; + + public View onCreateView(@NonNull LayoutInflater inflater, + ViewGroup container, Bundle savedInstanceState) { + HomeViewModel homeViewModel = + new ViewModelProvider(this).get(HomeViewModel.class); + + binding = FragmentHomeBinding.inflate(inflater, container, false); + View root = binding.getRoot(); + + final TextView textView = binding.textHome; + homeViewModel.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/home/HomeViewModel.java b/app/src/main/java/com/stormtales/notevault/ui/home/HomeViewModel.java new file mode 100644 index 0000000..cef39e9 --- /dev/null +++ b/app/src/main/java/com/stormtales/notevault/ui/home/HomeViewModel.java @@ -0,0 +1,19 @@ +package com.stormtales.notevault.ui.home; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +public class HomeViewModel extends ViewModel { + + private final MutableLiveData mText; + + public HomeViewModel() { + mText = new MutableLiveData<>(); + mText.setValue("This is home fragment"); + } + + public LiveData getText() { + return mText; + } +} \ No newline at end of file diff --git a/app/src/main/java/core/notevault/ui/slideshow/SlideshowFragment.java b/app/src/main/java/com/stormtales/notevault/ui/slideshow/SlideshowFragment.java similarity index 89% rename from app/src/main/java/core/notevault/ui/slideshow/SlideshowFragment.java rename to app/src/main/java/com/stormtales/notevault/ui/slideshow/SlideshowFragment.java index 32dc7b7..dcb2624 100644 --- a/app/src/main/java/core/notevault/ui/slideshow/SlideshowFragment.java +++ b/app/src/main/java/com/stormtales/notevault/ui/slideshow/SlideshowFragment.java @@ -1,4 +1,4 @@ -package core.notevault.ui.slideshow; +package com.stormtales.notevault.ui.slideshow; import android.os.Bundle; import android.view.LayoutInflater; @@ -8,7 +8,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; -import core.notevault.databinding.FragmentSlideshowBinding; +import com.stormtales.notevault.databinding.FragmentSlideshowBinding; public class SlideshowFragment extends Fragment { diff --git a/app/src/main/java/core/notevault/ui/slideshow/SlideshowViewModel.java b/app/src/main/java/com/stormtales/notevault/ui/slideshow/SlideshowViewModel.java similarity index 89% rename from app/src/main/java/core/notevault/ui/slideshow/SlideshowViewModel.java rename to app/src/main/java/com/stormtales/notevault/ui/slideshow/SlideshowViewModel.java index 9dd8fe3..bb4af34 100644 --- a/app/src/main/java/core/notevault/ui/slideshow/SlideshowViewModel.java +++ b/app/src/main/java/com/stormtales/notevault/ui/slideshow/SlideshowViewModel.java @@ -1,4 +1,4 @@ -package core.notevault.ui.slideshow; +package com.stormtales.notevault.ui.slideshow; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; diff --git a/app/src/main/java/core/notevault/MainActivity.java b/app/src/main/java/core/notevault/MainActivity.java deleted file mode 100644 index d8fe049..0000000 --- a/app/src/main/java/core/notevault/MainActivity.java +++ /dev/null @@ -1,308 +0,0 @@ -package core.notevault; - -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.text.TextUtils; -import android.util.Log; -import android.view.MenuItem; -import android.view.View; -import android.view.Menu; -import android.widget.Toast; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.navigation.fragment.NavHostFragment; -import androidx.work.OneTimeWorkRequest; -import androidx.work.WorkManager; -import com.google.android.material.snackbar.Snackbar; -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 core.notevault.data.*; -import core.notevault.databinding.ActivityMainBinding; -import core.notevault.sync.SyncWorker; -import core.notevault.sync.auth.AuthRepository; -import core.notevault.sync.auth.LoginCallback; -import core.notevault.ui.gallery.GalleryFragment; -import core.notevault.ui.gallery.detail.ConcertSongSelector; -import core.notevault.ui.gallery.editor.ConcertEditorDialog; -import core.notevault.ui.home.HomeFragment; -import core.notevault.ui.login.LoginCallBackImpl; -import core.notevault.ui.login.LoginDialogFragment; -import core.notevault.ui.login.RegisterCallback; -import core.notevault.ui.metadatadialog.MetaDataDialog; -import core.notevault.ui.metadatadialog.SongEditDialog; -import core.notevault.util.NoteSheetsUtil; - -import java.io.*; -import java.nio.file.Files; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.List; -import java.util.concurrent.TimeUnit; - -public class MainActivity extends AppCompatActivity implements MetaDataDialog.OnMetadataListener, - ConcertEditorDialog.OnConcertEditorListener, ConcertSongSelector.OnSongSelectedListener, LoginCallback, SongEditDialog.SongEditorListener { - - private AppBarConfiguration mAppBarConfiguration; - private ActivityMainBinding binding; - - private MusicDatabase musicDB; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - binding = ActivityMainBinding.inflate(getLayoutInflater()); - setContentView(binding.getRoot()); - - setSupportActionBar(binding.appBarMain.toolbar); - 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); - - setupLoginButton(); - musicDB = MusicDatabase.getDatabase(this); - scheduleSync(); - } - - public void scheduleSync() { - // Setze eine Uhrzeit für die Synchronisation - Calendar calendar = Calendar.getInstance(); - calendar.set(Calendar.HOUR_OF_DAY,11); - calendar.set(Calendar.MINUTE, 32); - calendar.set(Calendar.SECOND, 0); - - long triggerTime = calendar.getTimeInMillis(); // Zeitstempel für den Trigger - - // Erstelle die OneTimeWorkRequest für den SyncWorker - OneTimeWorkRequest syncRequest = new OneTimeWorkRequest.Builder(SyncWorker.class) - .setInitialDelay(triggerTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS) // Verzögerung bis zur Ausführung - .build(); - - // Planen des Workers mit WorkManager - WorkManager.getInstance(getBaseContext()).enqueue(syncRequest); - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - MenuItem loginItem = menu.findItem(R.id.action_login); - if (isLoggedIn()) { - 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 updateLoginButton() { - invalidateOptionsMenu(); // Menü neu zeichnen - } - - private void setupLoginButton() { - binding.appBarMain.toolbar.setOnMenuItemClickListener(item -> { - if (item.getItemId() == R.id.action_login) { - if (isLoggedIn()) { - performLogout(); // Logout-Logik aufrufen - } else { - showLoginDialog(); // Zeige das Login-Fenster an - } - return true; - } - return false; - }); - } - - private boolean isLoggedIn() { - AuthRepository authRepository = new AuthRepository(this); - return !TextUtils.isEmpty(authRepository.getToken()); - } - - private void showLoginDialog() { - LoginDialogFragment loginDialogFragment = LoginDialogFragment.newInstance(new LoginCallBackImpl(this), new RegisterCallback(this)); - loginDialogFragment.show(getSupportFragmentManager(), "login"); - } - - private void performLogout() { - // Füge hier deine Logout-Logik hinzu - AuthRepository authRepository = new AuthRepository(this); - - authRepository.logout(); // Implementiere die Token-Löschung - updateLoginButton(); - } - - - - @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 onOptionsItemSelected(MenuItem item) { - int id = item.getItemId(); - if(id == R.id.action_login) { - openLoginDialog(); - return true; - } - return super.onOptionsItemSelected(item); - } - - private void openLoginDialog() { - LoginDialogFragment loginDialogFragment = new LoginDialogFragment(); - loginDialogFragment.show(getSupportFragmentManager(), "LOGIN_TAG"); - } - - @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 void onMetadataEntered(Uri[] uris, String title, String composer, int year, String genre) { - new Thread(() -> { - MusicNote musicNote = new MusicNote(title, composer, year, genre); - long musicNoteID = musicDB.musicNoteDao().insert(musicNote); - musicNote.setMusicNoteId(musicNoteID); - - Log.d("MainActivity", "MusicNoteID of inserted song: " + musicNoteID); - Log.d("MainActivity", "MusicNoteID of referenced song: " + musicNote.getMusicNoteId()); - for(Uri uri: uris) { - String filePath = saveImageInternally(uri); - NoteSheet noteSheet = new NoteSheet(musicNoteID, filePath); - musicDB.musicNoteDao().insertNoteSheet(noteSheet); - } - - runOnUiThread(() -> { - NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_content_main); - Fragment currentFragment = navHostFragment != null ? navHostFragment.getChildFragmentManager().getFragments().get(0) : null; - - if(currentFragment instanceof HomeFragment) { - HomeFragment homeFragment = (HomeFragment) currentFragment; - homeFragment.addSong(musicNote); - } - }); - }).start(); - } - - // Speichere eine Kopie des Bilds im internen Speicher - private String saveImageInternally(Uri uri) { - try (InputStream inputStream = getContentResolver().openInputStream(uri)) { - File imageFile = new File(getFilesDir(), "saved_image_" + System.currentTimeMillis() + ".jpg"); - try (OutputStream outputStream = Files.newOutputStream(imageFile.toPath())) { - byte[] buffer = new byte[4096]; - int bytesRead; - while ((bytesRead = inputStream.read(buffer)) != -1) { - outputStream.write(buffer, 0, bytesRead); - } - } - return imageFile.getAbsolutePath(); // Pfad speichern, um später darauf zuzugreifen - } catch (IOException e) { - e.printStackTrace(); - return null; - } - } - - @Override - public void onConcertEditorClosed(String concertTitle, String concertDate, int concertID) { - new Thread(() -> { - if(concertID < 0) { - Concert concert = new Concert(concertTitle, concertDate); - Log.d("ConcertEditor", "Saved Concert: " + concertTitle + " on " + concertDate); - musicDB.musicNoteDao().insertConcert(concert); - - runOnUiThread(() -> { - NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_content_main); - Fragment currentFragment = navHostFragment != null ? navHostFragment.getChildFragmentManager().getFragments().get(0) : null; - - Log.d("MainActivity", "Test for GalleryFragment"); - Log.d("MainActivity", "Current Fragment: " + currentFragment.getClass().getSimpleName()); - if(currentFragment instanceof GalleryFragment) { - Log.d("MainActivity", "GalleryFragment Found"); - GalleryFragment galleryFragment = (GalleryFragment) currentFragment; - galleryFragment.addConcert(concert); - } else { - Log.d("MainActivity", "GalleryFragment Not Found"); - } - }); - } else { - Concert concert = new Concert(concertID, concertTitle, concertDate); - musicDB.musicNoteDao().updateConcert(concert); - runOnUiThread(() -> { - NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_content_main); - Fragment currentFragment = navHostFragment != null ? navHostFragment.getChildFragmentManager().getFragments().get(0) : null; - - Log.d("MainActivity", "Test for GalleryFragment"); - Log.d("MainActivity", "Current Fragment: " + currentFragment.getClass().getSimpleName()); - if(currentFragment instanceof GalleryFragment) { - Log.d("MainActivity", "GalleryFragment Found"); - GalleryFragment galleryFragment = (GalleryFragment) currentFragment; - galleryFragment.updateConcert(concert); - } else { - Log.d("MainActivity", "GalleryFragment Not Found"); - } - }); - } - - }).start(); - } - - @Override - public void onSongsSelected(List songs, int concertID) { - Log.d("MainActivity", "Inserted Songs: " + songs.size()); - new Thread(() -> { - for(MusicNote musicNote : songs) { - ConcertSong concertSong = new ConcertSong(musicNote.getMusicNoteId(), concertID); - musicDB.musicNoteDao().insertConcertSong(concertSong); - Log.d("MainActivity", "Insert Song: " + musicNote.getTitle()); - } - }).start(); - } - - - @Override - public void onSuccess() { - updateLoginButton(); - } - - @Override - public void onError(String error) { - Toast.makeText(this, error, Toast.LENGTH_LONG).show(); - Log.d("LoginError", error); - } - - @Override - public void onSongEdited(MusicNote updatedSong) { - new Thread(() -> { - musicDB.musicNoteDao().updateSong(updatedSong); - Log.d("MainActivity", "Updated Song: " + updatedSong.getTitle()); - }).start(); - NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment_content_main); - Fragment currentFragment = navHostFragment != null ? navHostFragment.getChildFragmentManager().getFragments().get(0) : null; - - if(currentFragment instanceof HomeFragment) { - HomeFragment homeFragment = (HomeFragment) currentFragment; - homeFragment.updateSong(updatedSong); - } else if(currentFragment instanceof GalleryFragment) { - GalleryFragment galleryFragment = (GalleryFragment) currentFragment; - - } - } -} \ No newline at end of file diff --git a/app/src/main/java/core/notevault/data/Concert.java b/app/src/main/java/core/notevault/data/Concert.java deleted file mode 100644 index 84087ff..0000000 --- a/app/src/main/java/core/notevault/data/Concert.java +++ /dev/null @@ -1,90 +0,0 @@ -package core.notevault.data; - -import androidx.room.*; -import core.notevault.data.sync.SyncStatus; -import core.notevault.data.sync.SyncStatusConverter; - -import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.util.Date; -import java.util.Locale; - -@Entity(tableName = "concerts") -@TypeConverters(SyncStatusConverter.class) -public class Concert { - - @PrimaryKey(autoGenerate = true) - private int id; - - private String serverSpecificConcertID; - private String title; - private String concertDate; - private SyncStatus syncStatus; - - private LocalDateTime lastModified; - - @Ignore - public Concert(String title, String concertDate) { - this.title = title; - this.concertDate = concertDate; - this.lastModified = LocalDateTime.now(); - } - - public Concert() { - } - - @Ignore - public Concert(int id, String title, String concertDate) { - this.id = id; - this.title = title; - this.concertDate = concertDate; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getConcertDate() { - return concertDate; - } - - public void setConcertDate(String concertDate) { - this.concertDate = concertDate; - } - - public String getServerSpecificConcertID() { - return serverSpecificConcertID; - } - - public void setServerSpecificConcertID(String serverSpecificConcertID) { - this.serverSpecificConcertID = serverSpecificConcertID; - } - - public SyncStatus getSyncStatus() { - return syncStatus; - } - - public void setSyncStatus(SyncStatus syncStatus) { - this.syncStatus = syncStatus; - } - - public LocalDateTime getLastModified() { - return lastModified; - } - - public void setLastModified(LocalDateTime lastModified) { - this.lastModified = lastModified; - } -} diff --git a/app/src/main/java/core/notevault/data/ConcertSong.java b/app/src/main/java/core/notevault/data/ConcertSong.java deleted file mode 100644 index 3411d14..0000000 --- a/app/src/main/java/core/notevault/data/ConcertSong.java +++ /dev/null @@ -1,55 +0,0 @@ -package core.notevault.data; - -import androidx.room.Entity; -import androidx.room.Ignore; -import androidx.room.PrimaryKey; - -@Entity(tableName = "concert_songs") -public class ConcertSong { - - @PrimaryKey(autoGenerate = true) - private int id; - - private long musicNoteID; - private int concertID; - - @Ignore - public ConcertSong(long musicNoteID, int concertID) { - this.musicNoteID = musicNoteID; - this.concertID = concertID; - } - - @Ignore - public ConcertSong(int id, long musicNoteID, int concertID) { - this.id = id; - this.musicNoteID = musicNoteID; - this.concertID = concertID; - } - - public ConcertSong() { - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public long getMusicNoteID() { - return musicNoteID; - } - - public void setMusicNoteID(long musicNoteID) { - this.musicNoteID = musicNoteID; - } - - public int getConcertID() { - return concertID; - } - - public void setConcertID(int concertID) { - this.concertID = concertID; - } -} diff --git a/app/src/main/java/core/notevault/data/DateConverter.java b/app/src/main/java/core/notevault/data/DateConverter.java deleted file mode 100644 index 5125be5..0000000 --- a/app/src/main/java/core/notevault/data/DateConverter.java +++ /dev/null @@ -1,20 +0,0 @@ -package core.notevault.data; - -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/core/notevault/data/MusicDatabase.java b/app/src/main/java/core/notevault/data/MusicDatabase.java deleted file mode 100644 index 20b8e27..0000000 --- a/app/src/main/java/core/notevault/data/MusicDatabase.java +++ /dev/null @@ -1,27 +0,0 @@ -package core.notevault.data; - -import android.content.Context; -import androidx.room.*; -import core.notevault.data.sync.SyncDataObject; -import core.notevault.data.sync.SyncStatusConverter; - -@Database(entities = {MusicNote.class, NoteSheet.class, Concert.class, ConcertSong.class, SyncDataObject.class}, version = 2, exportSchema = false) -@TypeConverters(DateConverter.class) -public abstract class MusicDatabase extends RoomDatabase { - public abstract MusicNoteDAO musicNoteDao(); - - private static 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/core/notevault/data/MusicNote.java b/app/src/main/java/core/notevault/data/MusicNote.java deleted file mode 100644 index 308e946..0000000 --- a/app/src/main/java/core/notevault/data/MusicNote.java +++ /dev/null @@ -1,107 +0,0 @@ -package core.notevault.data; - -import androidx.room.Entity; -import androidx.room.Ignore; -import androidx.room.PrimaryKey; -import core.notevault.data.sync.SyncStatus; - -import java.time.LocalDateTime; - -@Entity(tableName = "music_notes") -public class MusicNote { - - @PrimaryKey(autoGenerate = true) - private long musicNoteId; - private String serverID; - private SyncStatus syncStatus; - private LocalDateTime last_sync; - - private String title; - private String composer; - private int year; - private String genre; - - @Ignore - public MusicNote(String title, String composer, int year, String genre) { - this.title = title; - this.composer = composer; - this.year = year; - this.genre = genre; - this.syncStatus = SyncStatus.CREATED; - } - - public MusicNote(long musicNoteId, String title) { - this.musicNoteId = musicNoteId; - this.title = title; - this.syncStatus = SyncStatus.CREATED; - } - - @Ignore - public MusicNote() { - } - - public long getMusicNoteId() { - return musicNoteId; - } - - public void setMusicNoteId(long musicNoteId) { - this.musicNoteId = musicNoteId; - } - - 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 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 getLast_sync() { - - return last_sync; - } - - public void setLast_sync(LocalDateTime last_sync) { - this.last_sync = last_sync; - } -} diff --git a/app/src/main/java/core/notevault/data/MusicNoteDAO.java b/app/src/main/java/core/notevault/data/MusicNoteDAO.java deleted file mode 100644 index e742c7a..0000000 --- a/app/src/main/java/core/notevault/data/MusicNoteDAO.java +++ /dev/null @@ -1,89 +0,0 @@ -package core.notevault.data; - -import androidx.room.*; - -import core.notevault.data.sync.SyncDataObject; -import core.notevault.data.sync.SyncStatus; -import core.notevault.sync.synchronisation.songs.creation.SongCreationResponse; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; - -@Dao -public interface MusicNoteDAO { - - @Insert - long insert(MusicNote musicNote); - - @Insert - void insertNoteSheet(NoteSheet noteSheet); - - @Query("SELECT * FROM music_notes WHERE syncStatus != 'DELETED'") - List getAllNotes(); - - @Query("SELECT * FROM note_sheets WHERE musicNoteId = :musicNoteId") - List getNoteSheetsForMusicSong(long musicNoteId); - - @Query("SELECT * FROM concerts WHERE syncStatus = :status") - List getConcertsWithSyncStatus(SyncStatus status); - - @Query("SELECT * FROM music_notes WHERE syncStatus = :status") - List getSongsWithSyncStatus(SyncStatus status); - - @Insert - void insertConcert(Concert concert); - - @Query("SELECT * FROM concerts") - List getAllConcerts(); - - @Delete - void deleteConcert(Concert concert); - - @Update - void updateConcert(Concert concert); - - @Delete - void deleteSong(MusicNote musicNote); - - @Insert - void insertConcertSong(ConcertSong concertSong); - - @Query("SELECT m.* FROM music_notes m JOIN concert_songs cs ON m.musicNoteId = cs.musicNoteID WHERE cs.id = :concertID") - List getAllMusicNotesOfConcert(long concertID); - - @Query("DELETE FROM concert_songs WHERE concertID = :concertID AND musicNoteID = :songID") - void deleteConcertSong(long songID, int concertID); - - @Transaction - default void storeSongSyncResponses(List songCreationResponses) { - for (SongCreationResponse response : songCreationResponses) { - storeSongSyncResponse(response.getLocalID(), SyncStatus.SYNCED, response.getServerID()); - } - } - - @Query("UPDATE music_notes SET syncStatus = :status, serverID = :serverID WHERE musicNoteId = :localID") - void storeSongSyncResponse(long localID, SyncStatus status, String serverID); - - @Query("UPDATE music_notes SET syncStatus = :status, last_sync = :currentTime WHERE serverID IN (:serverIDs)") - void storeSongSyncModifyResponses(List serverIDs, SyncStatus status, LocalDateTime currentTime); - - @Update - void updateSong(MusicNote musicNote); - - @Query("DELETE FROM music_notes WHERE serverID IN (:serverIDs)") - void deleteSongs(List serverIDs); - - @Query("SELECT * FROM note_sheets ns WHERE ns.syncStatus = :status") - List getNoteSheetsWithStatus(SyncStatus status); - - @Query("SELECT mn.serverID FROM music_notes mn WHERE mn.musicNoteId =:musicNoteId") - Optional getMusicNoteByLocalID(long musicNoteId); - - @Update - void updateNoteSheet(NoteSheet noteSheet); - - @Transaction - @Insert(onConflict = OnConflictStrategy.REPLACE) // oder andere Strategie je nach Bedarf - void insertSyncDataObjects(List syncDataObjects); -} diff --git a/app/src/main/java/core/notevault/data/NoteSheet.java b/app/src/main/java/core/notevault/data/NoteSheet.java deleted file mode 100644 index 3a5e644..0000000 --- a/app/src/main/java/core/notevault/data/NoteSheet.java +++ /dev/null @@ -1,56 +0,0 @@ -package core.notevault.data; - -import androidx.room.Entity; -import androidx.room.PrimaryKey; -import core.notevault.data.sync.SyncStatus; - -@Entity(tableName = "note_sheets") -public class NoteSheet { - - @PrimaryKey(autoGenerate = true) - private int id; - private SyncStatus syncStatus; - private long musicNoteId; - private String filePath; - - public NoteSheet(long musicNoteID, String filePath) { - this.musicNoteId = musicNoteID; - this.filePath = filePath; - this.syncStatus = SyncStatus.CREATED; - } - - public NoteSheet() { - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public long getMusicNoteId() { - return musicNoteId; - } - - public void setMusicNoteId(long musicNoteId) { - this.musicNoteId = musicNoteId; - } - - public String getFilePath() { - return filePath; - } - - public void setFilePath(String filePath) { - this.filePath = filePath; - } - - public SyncStatus getSyncStatus() { - return syncStatus; - } - - public void setSyncStatus(SyncStatus syncStatus) { - this.syncStatus = syncStatus; - } -} diff --git a/app/src/main/java/core/notevault/data/sync/SyncDataObject.java b/app/src/main/java/core/notevault/data/sync/SyncDataObject.java deleted file mode 100644 index 344da9d..0000000 --- a/app/src/main/java/core/notevault/data/sync/SyncDataObject.java +++ /dev/null @@ -1,49 +0,0 @@ -package core.notevault.data.sync; - -import androidx.room.Entity; -import androidx.room.Ignore; -import androidx.room.PrimaryKey; -import androidx.room.TypeConverters; - -@Entity(tableName = "sync_data_objects") -@TypeConverters(SyncDataObjectTypeConverter.class) -public class SyncDataObject { - @PrimaryKey(autoGenerate = true) - private int id; - - private String serverID; - private SyncDataObjectType type; - - @Ignore - public SyncDataObject(String serverID, SyncDataObjectType type) { - this.serverID = serverID; - this.type = type; - } - - public SyncDataObject() { - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getServerID() { - return serverID; - } - - public void setServerID(String serverID) { - this.serverID = serverID; - } - - public SyncDataObjectType getType() { - return type; - } - - public void setType(SyncDataObjectType type) { - this.type = type; - } -} diff --git a/app/src/main/java/core/notevault/data/sync/SyncDataObjectType.java b/app/src/main/java/core/notevault/data/sync/SyncDataObjectType.java deleted file mode 100644 index 82e184c..0000000 --- a/app/src/main/java/core/notevault/data/sync/SyncDataObjectType.java +++ /dev/null @@ -1,5 +0,0 @@ -package core.notevault.data.sync; - -public enum SyncDataObjectType { - MUSIC_NOTE -} diff --git a/app/src/main/java/core/notevault/data/sync/SyncDataObjectTypeConverter.java b/app/src/main/java/core/notevault/data/sync/SyncDataObjectTypeConverter.java deleted file mode 100644 index 86385a2..0000000 --- a/app/src/main/java/core/notevault/data/sync/SyncDataObjectTypeConverter.java +++ /dev/null @@ -1,15 +0,0 @@ -package core.notevault.data.sync; - -import androidx.room.TypeConverter; - -public class SyncDataObjectTypeConverter { - @TypeConverter - public static SyncDataObjectType fromInt(int value) { - return SyncDataObjectType.values()[value]; - } - - @TypeConverter - public static int toInt(SyncDataObjectType objectType) { - return objectType.ordinal(); - } -} diff --git a/app/src/main/java/core/notevault/data/sync/SyncStatus.java b/app/src/main/java/core/notevault/data/sync/SyncStatus.java deleted file mode 100644 index 09e686e..0000000 --- a/app/src/main/java/core/notevault/data/sync/SyncStatus.java +++ /dev/null @@ -1,9 +0,0 @@ -package core.notevault.data.sync; - -public enum SyncStatus { - CREATED, - DELETED, - MODIFIED, - REMOTE_MODIFIED, - SYNCED; -} diff --git a/app/src/main/java/core/notevault/data/sync/SyncStatusConverter.java b/app/src/main/java/core/notevault/data/sync/SyncStatusConverter.java deleted file mode 100644 index a8ac3eb..0000000 --- a/app/src/main/java/core/notevault/data/sync/SyncStatusConverter.java +++ /dev/null @@ -1,15 +0,0 @@ -package core.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/core/notevault/sync/APICallback.java b/app/src/main/java/core/notevault/sync/APICallback.java deleted file mode 100644 index 683079e..0000000 --- a/app/src/main/java/core/notevault/sync/APICallback.java +++ /dev/null @@ -1,7 +0,0 @@ -package core.notevault.sync; - -public interface APICallback { - - void onSuccess(); - void onError(String error); -} diff --git a/app/src/main/java/core/notevault/sync/ApiClient.java b/app/src/main/java/core/notevault/sync/ApiClient.java deleted file mode 100644 index ed8191e..0000000 --- a/app/src/main/java/core/notevault/sync/ApiClient.java +++ /dev/null @@ -1,34 +0,0 @@ -package core.notevault.sync; - -import android.content.Context; -import android.content.SharedPreferences; -import core.notevault.sync.auth.AuthInterceptor; -import core.notevault.sync.auth.TokenManager; -import okhttp3.OkHttpClient; -import okhttp3.logging.HttpLoggingInterceptor; -import retrofit2.Retrofit; -import retrofit2.converter.gson.GsonConverterFactory; - -public class ApiClient { - 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("http://192.168.178.30:8000/") - .client(client) - .addConverterFactory(GsonConverterFactory.create()) - .build(); - } - return retrofit; - } -} diff --git a/app/src/main/java/core/notevault/sync/StatusResponse.java b/app/src/main/java/core/notevault/sync/StatusResponse.java deleted file mode 100644 index b5a3a7e..0000000 --- a/app/src/main/java/core/notevault/sync/StatusResponse.java +++ /dev/null @@ -1,14 +0,0 @@ -package core.notevault.sync; - -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/core/notevault/sync/SyncWorker.java b/app/src/main/java/core/notevault/sync/SyncWorker.java deleted file mode 100644 index 72246ce..0000000 --- a/app/src/main/java/core/notevault/sync/SyncWorker.java +++ /dev/null @@ -1,38 +0,0 @@ -package core.notevault.sync; -import android.content.Context; -import androidx.annotation.NonNull; -import androidx.work.Worker; -import androidx.work.WorkerParameters; -import core.notevault.data.MusicDatabase; - -import core.notevault.sync.synchronisation.*; -import core.notevault.sync.synchronisation.songs.SongSyncWorker; - - -public class SyncWorker extends Worker{ - private SongSyncWorker songSyncWorker; - public SyncWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { - super(context, workerParams); - SyncService syncService = ApiClient.getRetrofitInstance(context).create(SyncService.class); - MusicDatabase musicDatabase = MusicDatabase.getDatabase(context); - this.songSyncWorker = new SongSyncWorker(syncService, musicDatabase.musicNoteDao(), context); - } - - @NonNull - @Override - public Result doWork() { - try { - songSyncWorker.syncSongCreations(); - songSyncWorker.syncSongModifications(); - songSyncWorker.syncSongDeletions(); - songSyncWorker.uploadNoteSheets(); - songSyncWorker.fetchModifiedSongs(); - return Result.success(); - } catch (Exception e) { - e.printStackTrace(); - return Result.failure(); - } - } - - -} diff --git a/app/src/main/java/core/notevault/sync/auth/AuthInterceptor.java b/app/src/main/java/core/notevault/sync/auth/AuthInterceptor.java deleted file mode 100644 index 5f6cb6f..0000000 --- a/app/src/main/java/core/notevault/sync/auth/AuthInterceptor.java +++ /dev/null @@ -1,32 +0,0 @@ -package core.notevault.sync.auth; - -import android.content.SharedPreferences; -import android.util.Log; -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/core/notevault/sync/auth/AuthRepository.java b/app/src/main/java/core/notevault/sync/auth/AuthRepository.java deleted file mode 100644 index 7c8587d..0000000 --- a/app/src/main/java/core/notevault/sync/auth/AuthRepository.java +++ /dev/null @@ -1,80 +0,0 @@ -package core.notevault.sync.auth; - -import android.content.Context; -import core.notevault.sync.APICallback; -import core.notevault.sync.ApiClient; -import core.notevault.sync.StatusResponse; -import core.notevault.sync.auth.apimodel.LoginRequest; -import core.notevault.sync.auth.apimodel.LoginResponse; -import core.notevault.sync.auth.apimodel.RegisterRequest; -import core.notevault.sync.auth.apimodel.RegisterResponse; -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; - -public class AuthRepository { - private final AuthService authService; - private final TokenManager tokenManager; - - public AuthRepository(Context context) { - this.authService = ApiClient.getRetrofitInstance(context).create(AuthService.class); - this.tokenManager = new TokenManager(context); - } - - public void performLogin(String email, String password, APICallback callback) { - LoginRequest loginRequest = new LoginRequest(email, password); - - authService.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(); - } 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); - authService.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(); - } -} diff --git a/app/src/main/java/core/notevault/sync/auth/AuthService.java b/app/src/main/java/core/notevault/sync/auth/AuthService.java deleted file mode 100644 index abe2d19..0000000 --- a/app/src/main/java/core/notevault/sync/auth/AuthService.java +++ /dev/null @@ -1,20 +0,0 @@ -package core.notevault.sync.auth; - -import core.notevault.sync.StatusResponse; -import core.notevault.sync.auth.apimodel.LoginRequest; -import core.notevault.sync.auth.apimodel.LoginResponse; -import core.notevault.sync.auth.apimodel.RegisterRequest; -import retrofit2.Call; -import retrofit2.http.Body; -import retrofit2.http.Headers; -import retrofit2.http.POST; - -public interface AuthService { - - @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/core/notevault/sync/auth/LoginCallback.java b/app/src/main/java/core/notevault/sync/auth/LoginCallback.java deleted file mode 100644 index 565944f..0000000 --- a/app/src/main/java/core/notevault/sync/auth/LoginCallback.java +++ /dev/null @@ -1,7 +0,0 @@ -package core.notevault.sync.auth; - -public interface LoginCallback { - - void onSuccess(); - void onError(String error); -} diff --git a/app/src/main/java/core/notevault/sync/auth/TokenManager.java b/app/src/main/java/core/notevault/sync/auth/TokenManager.java deleted file mode 100644 index 98951f2..0000000 --- a/app/src/main/java/core/notevault/sync/auth/TokenManager.java +++ /dev/null @@ -1,31 +0,0 @@ -package core.notevault.sync.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/core/notevault/sync/auth/apimodel/LoginRequest.java b/app/src/main/java/core/notevault/sync/auth/apimodel/LoginRequest.java deleted file mode 100644 index cb4417c..0000000 --- a/app/src/main/java/core/notevault/sync/auth/apimodel/LoginRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package core.notevault.sync.auth.apimodel; - -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/core/notevault/sync/auth/apimodel/LoginResponse.java b/app/src/main/java/core/notevault/sync/auth/apimodel/LoginResponse.java deleted file mode 100644 index 2f10347..0000000 --- a/app/src/main/java/core/notevault/sync/auth/apimodel/LoginResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package core.notevault.sync.auth.apimodel; - -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/core/notevault/sync/auth/apimodel/RegisterRequest.java b/app/src/main/java/core/notevault/sync/auth/apimodel/RegisterRequest.java deleted file mode 100644 index 56adf17..0000000 --- a/app/src/main/java/core/notevault/sync/auth/apimodel/RegisterRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package core.notevault.sync.auth.apimodel; - -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/core/notevault/sync/auth/apimodel/RegisterResponse.java b/app/src/main/java/core/notevault/sync/auth/apimodel/RegisterResponse.java deleted file mode 100644 index db52523..0000000 --- a/app/src/main/java/core/notevault/sync/auth/apimodel/RegisterResponse.java +++ /dev/null @@ -1,31 +0,0 @@ -package core.notevault.sync.auth.apimodel; - -public class RegisterResponse { - - private String username; - private String email; - - public RegisterResponse(String username, String email) { - this.username = username; - this.email = email; - } - - public RegisterResponse() { - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } -} diff --git a/app/src/main/java/core/notevault/sync/synchronisation/FetchRequest.java b/app/src/main/java/core/notevault/sync/synchronisation/FetchRequest.java deleted file mode 100644 index 360f883..0000000 --- a/app/src/main/java/core/notevault/sync/synchronisation/FetchRequest.java +++ /dev/null @@ -1,19 +0,0 @@ -package core.notevault.sync.synchronisation; - -import java.time.LocalDateTime; - -public class FetchRequest { - private LocalDateTime client_last_sync; - - public FetchRequest(LocalDateTime client_last_sync) { - this.client_last_sync = client_last_sync; - } - - public LocalDateTime getClient_last_sync() { - return client_last_sync; - } - - public void setClient_last_sync(LocalDateTime client_last_sync) { - this.client_last_sync = client_last_sync; - } -} diff --git a/app/src/main/java/core/notevault/sync/synchronisation/FetchResponse.java b/app/src/main/java/core/notevault/sync/synchronisation/FetchResponse.java deleted file mode 100644 index 8ff6f71..0000000 --- a/app/src/main/java/core/notevault/sync/synchronisation/FetchResponse.java +++ /dev/null @@ -1,19 +0,0 @@ -package core.notevault.sync.synchronisation; - -import java.util.List; - -public class FetchResponse { - private List serverIDs; - - public FetchResponse(List serverIDs) { - this.serverIDs = serverIDs; - } - - public List getServerIDs() { - return serverIDs; - } - - public void setServerIDs(List serverIDs) { - this.serverIDs = serverIDs; - } -} diff --git a/app/src/main/java/core/notevault/sync/synchronisation/SyncService.java b/app/src/main/java/core/notevault/sync/synchronisation/SyncService.java deleted file mode 100644 index 00d9ffd..0000000 --- a/app/src/main/java/core/notevault/sync/synchronisation/SyncService.java +++ /dev/null @@ -1,36 +0,0 @@ -package core.notevault.sync.synchronisation; - - -import core.notevault.sync.synchronisation.songs.creation.SongCreationBatchRequest; -import core.notevault.sync.synchronisation.songs.creation.SongCreationBatchResponse; -import core.notevault.sync.synchronisation.songs.deletion.SongDeletionBatchRequest; -import core.notevault.sync.synchronisation.songs.deletion.SongDeletionBatchResponse; -import core.notevault.sync.synchronisation.songs.modification.SongModificationBatchRequest; -import core.notevault.sync.synchronisation.songs.modification.SongModificationBatchResponse; -import core.notevault.sync.synchronisation.songs.notesheets.UploadResponse; -import okhttp3.MultipartBody; -import okhttp3.RequestBody; -import retrofit2.Call; -import retrofit2.http.*; - -import java.time.LocalDateTime; - -public interface SyncService { - - @POST("/sync/songs/create") - Call performSongCreation(@Body SongCreationBatchRequest syncRequest); - - @POST("/sync/songs/modify") - Call performSongModification(@Body SongModificationBatchRequest syncRequest); - - @POST("/sync/songs/delete") - Call performSongDeletion(@Body SongDeletionBatchRequest syncRequest); - - @Multipart - @POST("/sync/songs/note_sheet/upload") - Call uploadNoteSheet(@Part("serverID") RequestBody serverID, @Part("fileName") RequestBody fileName, - @Part MultipartBody.Part image); - - @GET("/sync/songs/fetch") - Call fetchModifiedSongs(@Query("last_client_sync") LocalDateTime last_client_sync); -} diff --git a/app/src/main/java/core/notevault/sync/synchronisation/songs/SongSyncWorker.java b/app/src/main/java/core/notevault/sync/synchronisation/songs/SongSyncWorker.java deleted file mode 100644 index d85d92a..0000000 --- a/app/src/main/java/core/notevault/sync/synchronisation/songs/SongSyncWorker.java +++ /dev/null @@ -1,199 +0,0 @@ -package core.notevault.sync.synchronisation.songs; - -import android.content.Context; -import android.os.AsyncTask; -import android.widget.Toast; -import core.notevault.data.MusicNote; -import core.notevault.data.MusicNoteDAO; -import core.notevault.data.NoteSheet; -import core.notevault.data.sync.SyncDataObject; -import core.notevault.data.sync.SyncDataObjectType; -import core.notevault.data.sync.SyncStatus; -import core.notevault.sync.synchronisation.FetchRequest; -import core.notevault.sync.synchronisation.FetchResponse; -import core.notevault.sync.synchronisation.SyncService; -import core.notevault.sync.synchronisation.songs.creation.SongCreationBatchRequest; -import core.notevault.sync.synchronisation.songs.creation.SongCreationBatchResponse; -import core.notevault.sync.synchronisation.songs.creation.SongCreationRequest; -import core.notevault.sync.synchronisation.songs.deletion.SongDeletionBatchRequest; -import core.notevault.sync.synchronisation.songs.deletion.SongDeletionBatchResponse; -import core.notevault.sync.synchronisation.songs.modification.SongModificationBatchRequest; -import core.notevault.sync.synchronisation.songs.modification.SongModificationBatchResponse; -import core.notevault.sync.synchronisation.songs.modification.SongModificationRequest; -import core.notevault.sync.synchronisation.songs.notesheets.UploadResponse; -import okhttp3.MediaType; -import okhttp3.MultipartBody; -import okhttp3.RequestBody; -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; - -import java.io.File; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.stream.Collectors; - -public class SongSyncWorker { - private SyncService syncService; - private MusicNoteDAO database; - private Context context; - private ExecutorService executorService = Executors.newSingleThreadExecutor(); - - public SongSyncWorker(SyncService syncService, MusicNoteDAO database, Context context) { - this.syncService = syncService; - this.database = database; - this.context = context; - } - - private SongCreationBatchRequest buildCreationRequest() { - List created_songs = database.getSongsWithSyncStatus(SyncStatus.CREATED); - List songCreationRequests = new ArrayList<>(); - for(MusicNote musicNote : created_songs) { - songCreationRequests.add(new SongCreationRequest(musicNote.getMusicNoteId(), musicNote.getTitle(), musicNote.getComposer(), musicNote.getGenre(), musicNote.getYear())); - } - return new SongCreationBatchRequest(songCreationRequests); - } - - public void syncSongCreations() { - SongCreationBatchRequest request = buildCreationRequest(); - syncService.performSongCreation(request).enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if(response.isSuccessful() && response.body() != null) { - executorService.execute(() -> { - database.storeSongSyncResponses(response.body().getSongs()); - }); - } else { - Toast.makeText(context, "Song creation failed", Toast.LENGTH_LONG).show(); - } - } - - @Override - public void onFailure(Call call, Throwable throwable) { - Toast.makeText(context, "Song creation failed", Toast.LENGTH_LONG).show(); - } - }); - } - - private SongModificationBatchRequest buildModificationRequest() { - List modified_songs = database.getSongsWithSyncStatus(SyncStatus.MODIFIED); - List songModificationRequests = new ArrayList<>(); - for(MusicNote musicNote : modified_songs) { - songModificationRequests.add(new SongModificationRequest(musicNote.getServerID(), musicNote.getTitle(), musicNote.getComposer(), musicNote.getGenre(), musicNote.getYear())); - } - return new SongModificationBatchRequest(songModificationRequests); - } - - public void syncSongModifications() { - SongModificationBatchRequest request = buildModificationRequest(); - syncService.performSongModification(request).enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - executorService.execute(() -> { - database.storeSongSyncModifyResponses(response.body().getUpdated_songs(), SyncStatus.SYNCED, LocalDateTime.now()); - }); - } - - @Override - public void onFailure(Call call, Throwable throwable) { - Toast.makeText(context, "Sync of Modified Songs failed", Toast.LENGTH_LONG).show(); - } - }); - } - - private SongDeletionBatchRequest buildDeletionBatchRequest() { - List deleted_songs = database.getSongsWithSyncStatus(SyncStatus.DELETED); - List deleted_song_ids = deleted_songs.stream().map(MusicNote::getServerID).collect(Collectors.toList()); - return new SongDeletionBatchRequest(deleted_song_ids); - } - - public void syncSongDeletions() { - SongDeletionBatchRequest request = buildDeletionBatchRequest(); - syncService.performSongDeletion(request).enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if(response.isSuccessful() && response.body() != null) { - executorService.execute(() -> { - database.deleteSongs(response.body().getDeletedSongs()); - }); - } - } - - @Override - public void onFailure(Call call, Throwable throwable) { - Toast.makeText(context, "Sync of Deleted Songs failed", Toast.LENGTH_LONG).show(); - } - }); - } - - public void uploadNoteSheets() { - List noteSheets = database.getNoteSheetsWithStatus(SyncStatus.CREATED); - for(NoteSheet noteSheet : noteSheets) { - Optional serverID = database.getMusicNoteByLocalID(noteSheet.getMusicNoteId()); - - if(serverID.isPresent()) { - File imageFile = new File(noteSheet.getFilePath()); - // Erstelle Request-Bodies für serverID und fileName - RequestBody serverIDBody = RequestBody.create(MediaType.parse("text/plain"), serverID.get()); - RequestBody fileNameBody = RequestBody.create(MediaType.parse("text/plain"), imageFile.getName()); - - // Erstelle den Multipart-Body für die Bilddatei - RequestBody imageRequestBody = RequestBody.create(MediaType.parse("image/*"), imageFile); - MultipartBody.Part imagePart = MultipartBody.Part.createFormData("image", imageFile.getName(), imageRequestBody); - - syncService.uploadNoteSheet(serverIDBody, fileNameBody, imagePart).enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if (response.isSuccessful() && response.body() != null) { - // Erfolg: Antwort verarbeiten - Toast.makeText(context, "Upload erfolgreich", Toast.LENGTH_LONG).show(); - executorService.execute(() -> { - noteSheet.setSyncStatus(SyncStatus.SYNCED); - database.updateNoteSheet(noteSheet); - }); - } else { - // Fehler: Antwort prüfen - Toast.makeText(context, "Fehler beim Upload: " + response.code(), Toast.LENGTH_LONG).show(); - } - - } - - @Override - public void onFailure(Call call, Throwable throwable) { - Toast.makeText(context, "Fehler beim Upload: " + throwable.toString(), Toast.LENGTH_LONG).show(); - } - }); - } - } - } - - public void fetchModifiedSongs() { - FetchRequest request = new FetchRequest(LocalDateTime.MIN); - - syncService.fetchModifiedSongs(LocalDateTime.MIN).enqueue(new Callback() { - @Override - public void onResponse(Call call, Response response) { - if(response.isSuccessful() && response.body() != null) { - executorService.execute(() -> { - List syncDataObjects = new ArrayList<>(); - for(String serverID: response.body().getServerIDs()) { - syncDataObjects.add(new SyncDataObject(serverID, SyncDataObjectType.MUSIC_NOTE)); - } - database.insertSyncDataObjects(syncDataObjects); - }); - } else { - Toast.makeText(context, "Fehler beim Fetch: " + response.code(), Toast.LENGTH_LONG).show(); - } - } - - @Override - public void onFailure(Call call, Throwable throwable) { - Toast.makeText(context, "Fehler beim Fetch: " + throwable.getMessage(), Toast.LENGTH_LONG).show(); - } - }); - } -} diff --git a/app/src/main/java/core/notevault/sync/synchronisation/songs/creation/SongCreationBatchRequest.java b/app/src/main/java/core/notevault/sync/synchronisation/songs/creation/SongCreationBatchRequest.java deleted file mode 100644 index 1bb9986..0000000 --- a/app/src/main/java/core/notevault/sync/synchronisation/songs/creation/SongCreationBatchRequest.java +++ /dev/null @@ -1,11 +0,0 @@ -package core.notevault.sync.synchronisation.songs.creation; - -import java.util.List; - -public class SongCreationBatchRequest { - private List songs; - - public SongCreationBatchRequest(List songs) { - this.songs = songs; - } -} diff --git a/app/src/main/java/core/notevault/sync/synchronisation/songs/creation/SongCreationBatchResponse.java b/app/src/main/java/core/notevault/sync/synchronisation/songs/creation/SongCreationBatchResponse.java deleted file mode 100644 index f1329b9..0000000 --- a/app/src/main/java/core/notevault/sync/synchronisation/songs/creation/SongCreationBatchResponse.java +++ /dev/null @@ -1,19 +0,0 @@ -package core.notevault.sync.synchronisation.songs.creation; - -import java.util.List; - -public class SongCreationBatchResponse { - private List songs; - - public SongCreationBatchResponse(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/core/notevault/sync/synchronisation/songs/creation/SongCreationRequest.java b/app/src/main/java/core/notevault/sync/synchronisation/songs/creation/SongCreationRequest.java deleted file mode 100644 index 30cc11a..0000000 --- a/app/src/main/java/core/notevault/sync/synchronisation/songs/creation/SongCreationRequest.java +++ /dev/null @@ -1,17 +0,0 @@ -package core.notevault.sync.synchronisation.songs.creation; - -public class SongCreationRequest { - private long localID; - private String title; - private String composer; - private String genre; - private int year; - - public SongCreationRequest(long localID, String title, String composer, String genre, int year) { - this.localID = localID; - this.title = title; - this.composer = composer; - this.genre = genre; - this.year = year; - } -} diff --git a/app/src/main/java/core/notevault/sync/synchronisation/songs/creation/SongCreationResponse.java b/app/src/main/java/core/notevault/sync/synchronisation/songs/creation/SongCreationResponse.java deleted file mode 100644 index fe47041..0000000 --- a/app/src/main/java/core/notevault/sync/synchronisation/songs/creation/SongCreationResponse.java +++ /dev/null @@ -1,27 +0,0 @@ -package core.notevault.sync.synchronisation.songs.creation; - -public class SongCreationResponse { - private int localID; - private String serverID; - - public SongCreationResponse(int localID, String serverID) { - this.localID = localID; - this.serverID = 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/core/notevault/sync/synchronisation/songs/deletion/SongDeletionBatchRequest.java b/app/src/main/java/core/notevault/sync/synchronisation/songs/deletion/SongDeletionBatchRequest.java deleted file mode 100644 index 76eeb37..0000000 --- a/app/src/main/java/core/notevault/sync/synchronisation/songs/deletion/SongDeletionBatchRequest.java +++ /dev/null @@ -1,19 +0,0 @@ -package core.notevault.sync.synchronisation.songs.deletion; - -import java.util.List; - -public class SongDeletionBatchRequest { - private List songs; - - public SongDeletionBatchRequest(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/core/notevault/sync/synchronisation/songs/deletion/SongDeletionBatchResponse.java b/app/src/main/java/core/notevault/sync/synchronisation/songs/deletion/SongDeletionBatchResponse.java deleted file mode 100644 index 61fa249..0000000 --- a/app/src/main/java/core/notevault/sync/synchronisation/songs/deletion/SongDeletionBatchResponse.java +++ /dev/null @@ -1,19 +0,0 @@ -package core.notevault.sync.synchronisation.songs.deletion; - -import java.util.List; - -public class SongDeletionBatchResponse { - private List deletedSongs; - - public SongDeletionBatchResponse(List deletedSongs) { - this.deletedSongs = deletedSongs; - } - - public List getDeletedSongs() { - return deletedSongs; - } - - public void setDeletedSongs(List deletedSongs) { - this.deletedSongs = deletedSongs; - } -} diff --git a/app/src/main/java/core/notevault/sync/synchronisation/songs/modification/SongModificationBatchRequest.java b/app/src/main/java/core/notevault/sync/synchronisation/songs/modification/SongModificationBatchRequest.java deleted file mode 100644 index 4f5f59e..0000000 --- a/app/src/main/java/core/notevault/sync/synchronisation/songs/modification/SongModificationBatchRequest.java +++ /dev/null @@ -1,11 +0,0 @@ -package core.notevault.sync.synchronisation.songs.modification; - -import java.util.List; - -public class SongModificationBatchRequest { - private List songs; - - public SongModificationBatchRequest(List songs) { - this.songs = songs; - } -} diff --git a/app/src/main/java/core/notevault/sync/synchronisation/songs/modification/SongModificationBatchResponse.java b/app/src/main/java/core/notevault/sync/synchronisation/songs/modification/SongModificationBatchResponse.java deleted file mode 100644 index 1ad55ac..0000000 --- a/app/src/main/java/core/notevault/sync/synchronisation/songs/modification/SongModificationBatchResponse.java +++ /dev/null @@ -1,19 +0,0 @@ -package core.notevault.sync.synchronisation.songs.modification; - -import java.util.List; - -public class SongModificationBatchResponse { - private List songs; - - public SongModificationBatchResponse(List songs) { - this.songs = songs; - } - - public List getUpdated_songs() { - return songs; - } - - public void setUpdated_songs(List updated_songs) { - this.songs = updated_songs; - } -} diff --git a/app/src/main/java/core/notevault/sync/synchronisation/songs/modification/SongModificationRequest.java b/app/src/main/java/core/notevault/sync/synchronisation/songs/modification/SongModificationRequest.java deleted file mode 100644 index e2fc333..0000000 --- a/app/src/main/java/core/notevault/sync/synchronisation/songs/modification/SongModificationRequest.java +++ /dev/null @@ -1,57 +0,0 @@ -package core.notevault.sync.synchronisation.songs.modification; - -public class SongModificationRequest { - private String serverID; - private String title; - private String composer; - private String genre; - private int year; - - public SongModificationRequest(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 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; - } -} diff --git a/app/src/main/java/core/notevault/sync/synchronisation/songs/notesheets/UploadResponse.java b/app/src/main/java/core/notevault/sync/synchronisation/songs/notesheets/UploadResponse.java deleted file mode 100644 index 05a4801..0000000 --- a/app/src/main/java/core/notevault/sync/synchronisation/songs/notesheets/UploadResponse.java +++ /dev/null @@ -1,5 +0,0 @@ -package core.notevault.sync.synchronisation.songs.notesheets; - -public class UploadResponse { - private String serverID; -} diff --git a/app/src/main/java/core/notevault/ui/gallery/ConcertAdapter.java b/app/src/main/java/core/notevault/ui/gallery/ConcertAdapter.java deleted file mode 100644 index 6513eb2..0000000 --- a/app/src/main/java/core/notevault/ui/gallery/ConcertAdapter.java +++ /dev/null @@ -1,86 +0,0 @@ -package core.notevault.ui.gallery; - -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 core.notevault.R; -import core.notevault.data.Concert; -import core.notevault.ui.home.NoteSongAdapter; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; - -public class ConcertAdapter extends RecyclerView.Adapter { - - private final List concertList; - private final OnConcertClickListener concertClickListener; - - public interface OnConcertClickListener { - void onDeleteConcert(Concert concert); - void onOpenConcertEditor(Concert concert); - void onConcertClick(Concert concert); - } - - - public ConcertAdapter(List concertList, OnConcertClickListener concertClickListener) { - this.concertList = concertList; - this.concertClickListener = concertClickListener; - } - - public ConcertAdapter(OnConcertClickListener onConcertClickListener) { - this.concertClickListener = onConcertClickListener; - this.concertList = new ArrayList<>(); - } - - @Override - public void onBindViewHolder(@NonNull ConcertViewHolder holder, int position) { - holder.concertTitleView.setText(concertList.get(position).getTitle()); - holder.dateHolder.setText(concertList.get(position).getConcertDate()); - - holder.deleteButton.setOnClickListener(v -> concertClickListener.onDeleteConcert(concertList.get(position))); - holder.editButton.setOnClickListener(v -> concertClickListener.onOpenConcertEditor(concertList.get(position))); - holder.itemView.setOnClickListener(v -> concertClickListener.onConcertClick(concertList.get(position))); - } - - @Override - public int getItemCount() { - return concertList.size(); - } - - @NonNull - @Override - public ConcertViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.concert_item, parent, false); - return new ConcertViewHolder(view); - } - - public void updateConcerts(List concerts) { - Log.d("ConcertAdapter", "Update Concerts: " + this.concertList.size() + "vs new: " + concerts.size()); - this.concertList.clear(); - this.concertList.addAll(concerts); - notifyDataSetChanged(); - } - - public class ConcertViewHolder extends RecyclerView.ViewHolder { - TextView concertTitleView; - TextView dateHolder; - - ImageButton deleteButton; - ImageButton editButton; - - public ConcertViewHolder(@NonNull @NotNull View itemView) { - super(itemView); - concertTitleView = itemView.findViewById(R.id.concert_title); - dateHolder = itemView.findViewById(R.id.concert_date); - deleteButton = itemView.findViewById(R.id.delete_concert_button); - editButton = itemView.findViewById(R.id.edit_concert_button); - } - } -} diff --git a/app/src/main/java/core/notevault/ui/gallery/GalleryFragment.java b/app/src/main/java/core/notevault/ui/gallery/GalleryFragment.java deleted file mode 100644 index 365250f..0000000 --- a/app/src/main/java/core/notevault/ui/gallery/GalleryFragment.java +++ /dev/null @@ -1,153 +0,0 @@ -package core.notevault.ui.gallery; - -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.util.Log; -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 androidx.navigation.NavController; -import androidx.navigation.NavDirections; -import androidx.navigation.Navigation; -import androidx.recyclerview.widget.DividerItemDecoration; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import com.google.android.material.floatingactionbutton.FloatingActionButton; -import core.notevault.R; -import core.notevault.data.Concert; -import core.notevault.data.MusicDatabase; -import core.notevault.data.MusicNote; -import core.notevault.data.MusicNoteDAO; -import core.notevault.databinding.FragmentGalleryBinding; -import core.notevault.ui.gallery.editor.ConcertEditorDialog; - -import java.util.List; - -public class GalleryFragment extends Fragment { - - private FragmentGalleryBinding binding; - private ConcertAdapter concertAdapter; - private GalleryViewModel galleryViewModel; - - 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(); - - RecyclerView recyclerView = root.findViewById(R.id.concert_recycler_view); - concertAdapter = new ConcertAdapter(new ConcertAdapter.OnConcertClickListener() { - @Override - public void onDeleteConcert(Concert concert) { - deleteConcert(concert); - } - - @Override - public void onOpenConcertEditor(Concert concert) { - editConcert(concert); - } - - @Override - public void onConcertClick(Concert concert) { - Log.d("GalleryFragment", "Clicked on Concert: " + concert.getTitle()); - Bundle bundle = new Bundle(); - bundle.putInt("concertID", concert.getId()); - bundle.putString("concertTitle", concert.getTitle()); - bundle.putString("concertDate", concert.getConcertDate()); - - NavController navController = Navigation.findNavController(getActivity(), R.id.nav_host_fragment_content_main); - navController.navigate(R.id.concertDetailFragment, bundle); - } - }); - recyclerView.setAdapter(concertAdapter); - recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - - DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), LinearLayoutManager.VERTICAL); - recyclerView.addItemDecoration(dividerItemDecoration); - - - FloatingActionButton addConcertBtn = root.findViewById(R.id.add_concert_btn); - addConcertBtn.setOnClickListener(v -> onCreateNewConcert()); - - galleryViewModel.getConcerts().observe(getViewLifecycleOwner(), newConcerts -> { - concertAdapter.updateConcerts(newConcerts); - }); - - new LoadConcerts().execute(); - return root; - } - - public void deleteConcert(Concert concert) { - Log.d("GalleryFragment", "Delete Concert"); - new Thread(() -> { - MusicDatabase musicDatabase = MusicDatabase.getDatabase(this.getContext()); - MusicNoteDAO musicNoteDAO = musicDatabase.musicNoteDao(); - musicNoteDAO.deleteConcert(concert); - - new Handler(Looper.getMainLooper()).post(() -> { - galleryViewModel.deleteConcert(concert); - Log.d("GalleryFragment", "Concert deleted successfully and ViewModel updated"); - }); - }).start(); - } - - public void editConcert(Concert concert) { - ConcertEditorDialog concertEditorDialog = new ConcertEditorDialog(); - - Bundle args = new Bundle(); - args.putString("concert_title", concert.getTitle()); - args.putString("concert_date", concert.getConcertDate()); - args.putInt("concertID", concert.getId()); - - concertEditorDialog.setArguments(args); - - concertEditorDialog.show(getParentFragmentManager(), ConcertEditorDialog.TAG); - } - - public void updateConcert(Concert concert) { - galleryViewModel.updateConcert(concert); - } - - private class LoadConcerts extends AsyncTask> { - - @Override - protected List doInBackground(Void... voids) { - MusicDatabase db = MusicDatabase.getDatabase(getContext()); - MusicNoteDAO musicNoteDAO = db.musicNoteDao(); - List concerts = musicNoteDAO.getAllConcerts(); - Log.d("GalleryFragment", "Fetching concerts: " + concerts.size()); - return concerts; - - } - - @Override - protected void onPostExecute(List concerts) { - Log.d("GalleryFragment", "Concerts size in onPostExecute: " + concerts.size()); - // concertAdapter.updateConcerts(concerts); // Aktualisiere den Adapter mit den Titeln - galleryViewModel.setConcerts(concerts); - } - } - - public void onCreateNewConcert() { - ConcertEditorDialog concertEditorDialog = new ConcertEditorDialog(); - concertEditorDialog.show(getParentFragmentManager(), ConcertEditorDialog.TAG); - } - - public void addConcert(Concert concert) { - this.galleryViewModel.addConcert(concert); - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - binding = null; - } -} \ No newline at end of file diff --git a/app/src/main/java/core/notevault/ui/gallery/GalleryViewModel.java b/app/src/main/java/core/notevault/ui/gallery/GalleryViewModel.java deleted file mode 100644 index 48132b8..0000000 --- a/app/src/main/java/core/notevault/ui/gallery/GalleryViewModel.java +++ /dev/null @@ -1,58 +0,0 @@ -package core.notevault.ui.gallery; - -import android.util.Log; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; -import core.notevault.data.Concert; - -import java.util.List; - -public class GalleryViewModel extends ViewModel { - - private final MutableLiveData> concerts; - - public GalleryViewModel() { - this.concerts = new MutableLiveData<>(); - } - - - public LiveData> getConcerts() { - return concerts; - } - - public void setConcerts(List concerts) { - this.concerts.setValue(concerts); - } - - public void addConcert(Concert concert) { - List currentConcerts = this.concerts.getValue(); - Log.d("GalleryViewModel", "Add Concert"); - if(currentConcerts != null) { - currentConcerts.add(concert); - concerts.setValue(currentConcerts); - } - } - - public void deleteConcert(Concert concert) { - List currentConcerts = concerts.getValue(); - if(currentConcerts != null) { - currentConcerts.remove(concert); - concerts.setValue(currentConcerts); - } - } - - public void updateConcert(Concert concert) { - List currentConcerts = concerts.getValue(); - if(currentConcerts != null) { - for(int i = 0; i < currentConcerts.size(); i++) { - if(currentConcerts.get(i).getId() == concert.getId()) { - currentConcerts.get(i).setTitle(concert.getTitle()); - currentConcerts.get(i).setConcertDate(concert.getConcertDate()); - break; - } - } - concerts.setValue(currentConcerts); - } - } -} \ No newline at end of file diff --git a/app/src/main/java/core/notevault/ui/gallery/detail/ConcertDetailFragment.java b/app/src/main/java/core/notevault/ui/gallery/detail/ConcertDetailFragment.java deleted file mode 100644 index e9ab23e..0000000 --- a/app/src/main/java/core/notevault/ui/gallery/detail/ConcertDetailFragment.java +++ /dev/null @@ -1,119 +0,0 @@ -package core.notevault.ui.gallery.detail; - -import android.os.AsyncTask; -import android.os.Bundle; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -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 androidx.room.util.ViewInfo; -import com.google.android.material.floatingactionbutton.FloatingActionButton; -import core.notevault.data.Concert; -import core.notevault.data.MusicDatabase; -import core.notevault.data.MusicNote; -import core.notevault.data.MusicNoteDAO; -import core.notevault.databinding.FragmentConcertDetailBinding; -import core.notevault.ui.home.NoteSongAdapter; -import core.notevault.ui.metadatadialog.SongEditDialog; - -import java.util.Collections; -import java.util.List; - -public class ConcertDetailFragment extends Fragment { - - public interface OnConcertSongsLoadedListener { - void onSongsLoaded(List songs); - } - - private FragmentConcertDetailBinding binding; - private Concert concert; - private ConcertDetailViewModel concertDetailViewModel; - private NoteSongAdapter noteSongAdapter; - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - concertDetailViewModel = new ViewModelProvider(this).get(ConcertDetailViewModel.class); - - binding = FragmentConcertDetailBinding.inflate(inflater, container, false); - int concertId = getArguments().getInt("concertID"); - String concertTitle = getArguments().getString("concertTitle"); - String concertDate = getArguments().getString("concertDate"); - concert = new Concert(concertId, concertTitle, concertDate); - - binding.textConcertDetailsTitle.setText(concertTitle); - binding.textConcertDetailsDate.setText(concertDate); - - RecyclerView recyclerView = binding.noteRecyclerView; - noteSongAdapter = new NoteSongAdapter(this::deleteSongFromConcert, this::editSongFromConcert); - recyclerView.setAdapter(noteSongAdapter); - recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - - DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), LinearLayoutManager.VERTICAL); - recyclerView.addItemDecoration(dividerItemDecoration); - - FloatingActionButton fab = binding.addSongConcert; - fab.setOnClickListener(view -> { - ConcertSongSelector concertSongSelector = new ConcertSongSelector(); - - Bundle bundle = new Bundle(); - bundle.putString("concertTitle", concertTitle); - bundle.putString("concertDate", concertDate); - bundle.putInt("concertID", concertId); - - concertSongSelector.setArguments(bundle); - - concertSongSelector.show(getParentFragmentManager(), ConcertSongSelector.TAG); - }); - - concertDetailViewModel.getConcertSongs().observe(getViewLifecycleOwner(), songs -> { - noteSongAdapter.updateSongTitles(songs); - }); - - new LoadConcertSongsTask(concertId, songs -> { - this.concertDetailViewModel.setConcertSongs(songs); - }).execute(); - - return binding.getRoot(); - } - - private void deleteSongFromConcert(MusicNote musicNote) { - this.concertDetailViewModel.deleteConcertSong(musicNote); - new Thread(() -> { - MusicNoteDAO musicNoteDAO = MusicDatabase.getDatabase(getContext()).musicNoteDao(); - musicNoteDAO.deleteConcertSong(musicNote.getMusicNoteId(), concert.getId()); - }).start(); - } - - private void editSongFromConcert(MusicNote musicNote) { - SongEditDialog songEditDialog = new SongEditDialog(); - songEditDialog.setSong(musicNote); - songEditDialog.show(getParentFragmentManager(), SongEditDialog.TAG); - } - - private class LoadConcertSongsTask extends AsyncTask> { - private final int concertID; - private final OnConcertSongsLoadedListener listener; - - public LoadConcertSongsTask(int concertID, OnConcertSongsLoadedListener listener) { - this.concertID = concertID; - this.listener = listener; - } - - @Override - protected List doInBackground(Void... voids) { - MusicDatabase db = MusicDatabase.getDatabase(getContext()); - return db.musicNoteDao().getAllMusicNotesOfConcert(concertID); - } - - @Override - protected void onPostExecute(List songs) { - Log.d("ConcertDetailFragment", "Loaded Concertsongs: " + songs.size()); - listener.onSongsLoaded(songs); - } - } -} diff --git a/app/src/main/java/core/notevault/ui/gallery/detail/ConcertDetailViewModel.java b/app/src/main/java/core/notevault/ui/gallery/detail/ConcertDetailViewModel.java deleted file mode 100644 index 69920ca..0000000 --- a/app/src/main/java/core/notevault/ui/gallery/detail/ConcertDetailViewModel.java +++ /dev/null @@ -1,41 +0,0 @@ -package core.notevault.ui.gallery.detail; - -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; -import core.notevault.data.MusicNote; - -import java.util.ArrayList; -import java.util.List; - -public class ConcertDetailViewModel extends ViewModel { - private final MutableLiveData> concertSongs; - - public ConcertDetailViewModel() { - this.concertSongs = new MutableLiveData<>(new ArrayList<>()); - } - - public LiveData> getConcertSongs() { - return concertSongs; - } - - public void setConcertSongs(List concertSongs) { - this.concertSongs.setValue(concertSongs); - } - - public void deleteConcertSong(MusicNote note) { - List currentConcertSongs = concertSongs.getValue(); - if(currentConcertSongs != null) { - currentConcertSongs.remove(note); - this.concertSongs.setValue(currentConcertSongs); - } - } - - public void addConcertSongs(List concertSongs) { - List currentConcertSongs = this.concertSongs.getValue(); - if(currentConcertSongs != null) { - currentConcertSongs.addAll(concertSongs); - this.concertSongs.setValue(currentConcertSongs); - } - } -} diff --git a/app/src/main/java/core/notevault/ui/gallery/detail/ConcertSongSelector.java b/app/src/main/java/core/notevault/ui/gallery/detail/ConcertSongSelector.java deleted file mode 100644 index c024799..0000000 --- a/app/src/main/java/core/notevault/ui/gallery/detail/ConcertSongSelector.java +++ /dev/null @@ -1,116 +0,0 @@ -package core.notevault.ui.gallery.detail; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.Context; -import android.os.AsyncTask; -import android.os.Bundle; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.SearchView; -import android.widget.TextView; -import androidx.annotation.NonNull; -import androidx.fragment.app.DialogFragment; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import core.notevault.R; -import core.notevault.data.ConcertSong; -import core.notevault.data.MusicDatabase; -import core.notevault.data.MusicNote; -import core.notevault.data.MusicNoteDAO; -import core.notevault.ui.metadatadialog.MetaDataDialog; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class ConcertSongSelector extends DialogFragment { - - private ConcertSongSelectorAdapter adapter; - private OnSongSelectedListener listener; - private int concertID; - - public interface OnSongSelectedListener { - void onSongsSelected(List songs, int concertID); - } - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - LayoutInflater inflater = getActivity().getLayoutInflater(); - View dialogView = inflater.inflate(R.layout.dialog_concert_song_selector, null); - - String concertTitle = getArguments().getString("concertTitle"); - String concertDate = getArguments().getString("concertDate"); - concertID = getArguments().getInt("concertID"); - - TextView dialogTitle = dialogView.findViewById(R.id.dialog_title_concert_song_selector); - dialogTitle.setText("Wähle Stücke für das Konzert '" + concertTitle + "' am " + concertDate + " aus"); - - RecyclerView recyclerView = dialogView.findViewById(R.id.concert_song_selector_recycler); - recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - - - adapter = new ConcertSongSelectorAdapter(new ArrayList<>()); - recyclerView.setAdapter(adapter); - - SearchView searchView = dialogView.findViewById(R.id.search_view); - searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { - @Override - public boolean onQueryTextSubmit(String s) { - return false; - } - - @Override - public boolean onQueryTextChange(String s) { - adapter.filter(s); - return true; - } - }); - - fetchAllSongs(); - - return new AlertDialog.Builder(requireContext()) - .setView(dialogView) - .setPositiveButton("Speichern", (dialog, which) -> { - List selectedSongs = adapter.getSelectedSongs(); - listener.onSongsSelected(selectedSongs, concertID); - }) - .setNegativeButton("Abbrechen", (dialog, which) -> {} ) - .create(); - } - - @Override - public void onAttach(@NonNull Context context) { - super.onAttach(context); - if (context instanceof ConcertSongSelector.OnSongSelectedListener) { - listener = (ConcertSongSelector.OnSongSelectedListener) context; - } else { - throw new RuntimeException(context.toString() - + " must implement OnMetadataListener"); - } - } - - private void fetchAllSongs() { - // Ersetze dies durch das Laden der Songs aus der Datenbank oder einer anderen Quelle - new LoadSongTitlesTask().execute(); - } - - private class LoadSongTitlesTask extends AsyncTask> { - - @Override - protected List doInBackground(Void... voids) { - MusicDatabase db = MusicDatabase.getDatabase(getContext()); - MusicNoteDAO musicNoteDAO = db.musicNoteDao(); - return musicNoteDAO.getAllNotes(); - } - - @Override - protected void onPostExecute(List songs) { - adapter.setSongs(songs); - } - } - - public static String TAG = "ConcertSongSelector"; -} diff --git a/app/src/main/java/core/notevault/ui/gallery/detail/ConcertSongSelectorAdapter.java b/app/src/main/java/core/notevault/ui/gallery/detail/ConcertSongSelectorAdapter.java deleted file mode 100644 index 3a4eeef..0000000 --- a/app/src/main/java/core/notevault/ui/gallery/detail/ConcertSongSelectorAdapter.java +++ /dev/null @@ -1,90 +0,0 @@ -package core.notevault.ui.gallery.detail; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.CheckBox; -import android.widget.TextView; -import androidx.annotation.NonNull; -import androidx.recyclerview.widget.RecyclerView; -import core.notevault.R; -import core.notevault.data.MusicNote; - -import java.util.ArrayList; -import java.util.List; - -public class ConcertSongSelectorAdapter extends RecyclerView.Adapter { - private List songs; - private List selectedSongs = new ArrayList<>(); - private List filteredSongs; - - public ConcertSongSelectorAdapter(List songs) { - this.songs = songs; - this.filteredSongs = new ArrayList<>(songs); - } - - @NonNull - @Override - public ConcertSongSelectorViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.item_concert_song, parent, false); - return new ConcertSongSelectorViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull ConcertSongSelectorViewHolder holder, int position) { - MusicNote song = filteredSongs.get(position); - holder.bind(song); - } - - - @Override - public int getItemCount() { - return filteredSongs.size(); - } - - public List getSelectedSongs() { - return selectedSongs; - } - - public void setSongs(List musicNotes) { - songs = musicNotes; - filteredSongs = new ArrayList<>(musicNotes); - notifyDataSetChanged(); - } - - public void filter(String query) { - filteredSongs.clear(); - if (query.isEmpty()) { - filteredSongs.addAll(songs); - } else { - for (MusicNote song : songs) { - if (song.getTitle().toLowerCase().contains(query.toLowerCase())) { - filteredSongs.add(song); - } - } - } - notifyDataSetChanged(); - } - - class ConcertSongSelectorViewHolder extends RecyclerView.ViewHolder { - private final TextView songTitle; - private final CheckBox songCheckbox; - - ConcertSongSelectorViewHolder(View itemView) { - super(itemView); - songTitle = itemView.findViewById(R.id.song_title); - songCheckbox = itemView.findViewById(R.id.song_checkbox); - - songCheckbox.setOnCheckedChangeListener((buttonView, isChecked) -> { - MusicNote musicNote = filteredSongs.get(getAbsoluteAdapterPosition()); - selectedSongs.add(musicNote); - }); - } - - void bind(MusicNote song) { - songTitle.setText(song.getTitle()); - songCheckbox.setChecked(selectedSongs.contains(song)); - } - } -} diff --git a/app/src/main/java/core/notevault/ui/gallery/editor/ConcertEditorDialog.java b/app/src/main/java/core/notevault/ui/gallery/editor/ConcertEditorDialog.java deleted file mode 100644 index 3f5e9c5..0000000 --- a/app/src/main/java/core/notevault/ui/gallery/editor/ConcertEditorDialog.java +++ /dev/null @@ -1,111 +0,0 @@ -package core.notevault.ui.gallery.editor; - -import android.app.AlertDialog; -import android.app.DatePickerDialog; -import android.app.Dialog; -import android.content.Context; -import android.os.Bundle; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.EditText; -import androidx.annotation.NonNull; -import androidx.fragment.app.DialogFragment; -import core.notevault.R; -import core.notevault.data.Concert; -import core.notevault.ui.metadatadialog.MetaDataDialog; - -import java.util.Calendar; -import java.util.Date; - -public class ConcertEditorDialog extends DialogFragment { - private Concert concert; - - private EditText concert_date_input; - private EditText concertTitleInput; - - private OnConcertEditorListener listener; - - private int concertID = -1; - - public void setConcert(Concert concert) { - concert_date_input.setText(concert.getConcertDate()); - concertTitleInput.setText(concert.getTitle()); - this.concert = concert; - } - - public interface OnConcertEditorListener { - void onConcertEditorClosed(String concertTitle, String concertDate, int concertID); - } - - public interface OnConcertEditorEditListener { - void onConcertEditorEditClosed(String concertTitle, String concertDate); - } - - @NonNull - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - LayoutInflater inflater = requireActivity().getLayoutInflater(); - View dialogView = inflater.inflate(R.layout.concert_editor, null); - - EditText title_input = dialogView.findViewById(R.id.concert_title_input); - concert_date_input = dialogView.findViewById(R.id.concert_date_input); - - concert_date_input.setOnClickListener(v -> showDatePickerDialog()); - - if(getArguments() != null) { - String concertTitle = getArguments().getString("concert_title"); - String concertDate = getArguments().getString("concert_date"); - concertID = getArguments().getInt("concertID"); - title_input.setText(concertTitle); - concert_date_input.setText(concertDate); - - } - - return new AlertDialog.Builder(requireContext()) - .setView(dialogView) - .setPositiveButton("Speichern", (dialog, which) -> { - String title = title_input.getText().toString(); - String concertDate = concert_date_input.getText().toString(); - Log.d("ConcertEditor", "ConcertDate: " + concertDate); - - listener.onConcertEditorClosed(title, concertDate, concertID); - - - }) - .setNegativeButton("Abbrechen", (dialog, which) -> {} ) - .create(); - } - - @Override - public void onAttach(@NonNull Context context) { - super.onAttach(context); - if (context instanceof OnConcertEditorListener) { - listener = (OnConcertEditorListener) context; - } else { - throw new RuntimeException(context.toString() - + " must implement OnMetadataListener"); - } - } - - private void showDatePickerDialog() { - // Erhalte das aktuelle Datum - final Calendar calendar = Calendar.getInstance(); - int year = calendar.get(Calendar.YEAR); - int month = calendar.get(Calendar.MONTH); - int day = calendar.get(Calendar.DAY_OF_MONTH); - - // Erstelle den DatePickerDialog - DatePickerDialog datePickerDialog = new DatePickerDialog(this.getContext(), - (view, selectedYear, selectedMonth, selectedDay) -> { - // Setze das ausgewählte Datum in das EditText - concert_date_input.setText(selectedDay + "/" + (selectedMonth + 1) + "/" + selectedYear); - }, year, month, day); - - // Zeige den Dialog an - datePickerDialog.show(); - } - - - public static String TAG = "ConcertEditorDialog"; -} diff --git a/app/src/main/java/core/notevault/ui/home/FullScreenImageActivity.java b/app/src/main/java/core/notevault/ui/home/FullScreenImageActivity.java deleted file mode 100644 index 5d00fc2..0000000 --- a/app/src/main/java/core/notevault/ui/home/FullScreenImageActivity.java +++ /dev/null @@ -1,35 +0,0 @@ -package core.notevault.ui.home; - -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.widget.ImageView; -import androidx.appcompat.app.AppCompatActivity; -import androidx.viewpager2.widget.ViewPager2; -import core.notevault.R; -import core.notevault.ui.noteviewer.ImagePagerAdapter; - -import java.util.Arrays; -import java.util.List; - -public class FullScreenImageActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_fullscreen_image); // Erstelle eine Layout-Datei - - ViewPager2 imageView = findViewById(R.id.viewPager); // Angenommen, du hast ein ImageView - - // 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 - } else { - throw new NullPointerException(); - } - } -} diff --git a/app/src/main/java/core/notevault/ui/home/HomeFragment.java b/app/src/main/java/core/notevault/ui/home/HomeFragment.java deleted file mode 100644 index 016989c..0000000 --- a/app/src/main/java/core/notevault/ui/home/HomeFragment.java +++ /dev/null @@ -1,160 +0,0 @@ -package core.notevault.ui.home; - -import android.content.Intent; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Handler; -import android.os.Looper; -import android.util.Log; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Toast; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -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 core.notevault.R; -import core.notevault.data.MusicDatabase; -import core.notevault.data.MusicNote; -import core.notevault.data.MusicNoteDAO; -import core.notevault.data.sync.SyncStatus; -import core.notevault.databinding.FragmentHomeBinding; -import core.notevault.ui.metadatadialog.MetaDataDialog; -import core.notevault.ui.metadatadialog.SongEditDialog; -import core.notevault.util.NoteSheetsUtil; - -import java.util.List; - -public class HomeFragment extends Fragment { - - private NoteSongAdapter noteSongAdapter; - - private static final int PICK_FILE_REQUEST_CODE = 1; - private FragmentHomeBinding binding; - private HomeViewModel homeViewModel; - - public View onCreateView(@NonNull LayoutInflater inflater, - ViewGroup container, Bundle savedInstanceState) { - homeViewModel = - new ViewModelProvider(this).get(HomeViewModel.class); - - binding = FragmentHomeBinding.inflate(inflater, container, false); - View root = binding.getRoot(); - - FloatingActionButton importBtn = root.findViewById(R.id.add_song_concert); - importBtn.setOnClickListener(v -> openFileChooser()); - - RecyclerView recyclerView = root.findViewById(R.id.note_recycler_view); - noteSongAdapter = new NoteSongAdapter(this::deleteSong, this::editSong); - recyclerView.setAdapter(noteSongAdapter); - recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); - - DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(), LinearLayoutManager.VERTICAL); - recyclerView.addItemDecoration(dividerItemDecoration); - - homeViewModel.getNoteTitles().observe(getViewLifecycleOwner(), songs -> { - noteSongAdapter.updateSongTitles(songs); - }); - - new LoadSongTitlesTask().execute(); - - return root; - } - - private void editSong(MusicNote musicNote) { - //Open Dialog - SongEditDialog songEditDialog = new SongEditDialog(); - songEditDialog.setSong(musicNote); - songEditDialog.show(getParentFragmentManager(), SongEditDialog.TAG); - - } - - public void deleteSong(MusicNote musicNote) { - new Thread(() -> { - MusicDatabase musicDatabase = MusicDatabase.getDatabase(getContext()); - MusicNoteDAO musicNoteDAO = musicDatabase.musicNoteDao(); - musicNote.setSyncStatus(SyncStatus.DELETED); - musicNoteDAO.updateSong(musicNote); - Log.d("HomeFragment", "Delete Song: " + musicNote.getTitle()); - new Handler(Looper.getMainLooper()).post(()-> { - homeViewModel.deleteSong(musicNote); - }); - }).start(); - } - - private class LoadSongTitlesTask extends AsyncTask> { - - @Override - protected List doInBackground(Void... voids) { - MusicDatabase db = MusicDatabase.getDatabase(getContext()); - MusicNoteDAO musicNoteDAO = db.musicNoteDao(); - return musicNoteDAO.getAllNotes(); - } - - @Override - protected void onPostExecute(List songs) { - homeViewModel.setNoteTitles(songs); - } - } - - @Override - public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == PICK_FILE_REQUEST_CODE && resultCode == getActivity().RESULT_OK && data != null) { - if(data.getClipData() != null) { - int count = data.getClipData().getItemCount(); - Uri[] uris = new Uri[count]; - for(int i = 0; i < count; i++) { - uris[i] = data.getClipData().getItemAt(i).getUri(); - } - handleFile(uris); - } else if(data.getData() != null) { - Uri uri = data.getData(); - handleFile(uri); - } - } - } - - private void handleFile(Uri... uris) { - // Hier kannst du die Logik zum Speichern oder Anzeigen der Datei implementieren - NoteSheetsUtil.sortNoteSheetsByTimestamp(getContext(), uris); - - MetaDataDialog metaDataDialog = new MetaDataDialog(); - metaDataDialog.setFileUri(uris); - metaDataDialog.show(getParentFragmentManager(), MetaDataDialog.TAG); - - Toast.makeText(getActivity(), "Datei ausgewählt: " + uris[0].getPath(), Toast.LENGTH_SHORT).show(); - } - - private void openFileChooser() { - 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); - startActivityForResult(intent, PICK_FILE_REQUEST_CODE); - } - - @Override - public void onDestroyView() { - super.onDestroyView(); - binding = null; - } - - public void addSong(MusicNote musicNote) { - this.homeViewModel.addSong(musicNote); - } - - public void updateSong(MusicNote song) { - this.homeViewModel.updateSong(song); - } -} \ No newline at end of file diff --git a/app/src/main/java/core/notevault/ui/home/HomeViewModel.java b/app/src/main/java/core/notevault/ui/home/HomeViewModel.java deleted file mode 100644 index bb58cca..0000000 --- a/app/src/main/java/core/notevault/ui/home/HomeViewModel.java +++ /dev/null @@ -1,63 +0,0 @@ -package core.notevault.ui.home; - -import android.net.Uri; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; -import core.notevault.MainActivity; -import core.notevault.data.MusicDatabase; -import core.notevault.data.MusicNote; -import core.notevault.ui.metadatadialog.MetaDataDialog; - -import java.util.ArrayList; -import java.util.List; - -public class HomeViewModel extends ViewModel { - - private final MutableLiveData> noteTitles; - - - - - public HomeViewModel() { - noteTitles = new MutableLiveData<>(new ArrayList<>()); - } - - public LiveData> getNoteTitles() { - return noteTitles; - } - - public void setNoteTitles(List noteTitles) { - this.noteTitles.setValue(noteTitles); - } - - - public void addSong(MusicNote song) { - List songs = noteTitles.getValue(); - if(songs != null) { - songs.add(song); - this.noteTitles.setValue(songs); - } - } - - public void deleteSong(MusicNote musicNote) { - List currentSongs = noteTitles.getValue(); - if(currentSongs != null) { - currentSongs.remove(musicNote); - noteTitles.setValue(currentSongs); - } - } - - public void updateSong(MusicNote updatedSong) { - List currentSongs = noteTitles.getValue(); - if(currentSongs != null) { - for(int i=0; i { - - private final List noteTitles; - private final OnSongDeleteListener onSongDeleteListener; - private final OnSongEditListener onSongEditListener; - public interface OnSongDeleteListener { - void onSongDeleted(MusicNote song); - } - - public interface OnSongEditListener { - void onSongEdit(MusicNote song); - } - - public NoteSongAdapter(List noteTitles, OnSongDeleteListener onSongDeleteListener, OnSongEditListener onSongEditListener) { - this.noteTitles = noteTitles; - this.onSongDeleteListener = onSongDeleteListener; - this.onSongEditListener = onSongEditListener; - } - - public NoteSongAdapter(OnSongDeleteListener onSongDeleteListener, OnSongEditListener onSongEditListener) { - this.onSongDeleteListener = onSongDeleteListener; - this.noteTitles = new ArrayList<>(); - this.onSongEditListener = onSongEditListener; - } - - @NonNull - @Override - public NoteViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - View view = LayoutInflater.from(parent.getContext()) - .inflate(R.layout.item_song, parent, false); - return new NoteViewHolder(view); - } - - @Override - public void onBindViewHolder(@NonNull NoteViewHolder holder, int position) { - holder.titleTextView.setText(noteTitles.get(position).getTitle()); - holder.yearTextView.setText(String.valueOf(noteTitles.get(position).getYear())); - holder.compositionTextView.setText(noteTitles.get(position).getComposer()); - - holder.deleteButton.setOnClickListener(v -> { - onSongDeleteListener.onSongDeleted(noteTitles.get(position)); - }); - - holder.editButton.setOnClickListener(v -> { - onSongEditListener.onSongEdit(noteTitles.get(position)); - }); - } - - @Override - public int getItemCount() { - return noteTitles.size(); - } - - public void updateSongTitles(List songs) { - this.noteTitles.clear(); - this.noteTitles.addAll(songs); - notifyDataSetChanged(); - } - - public class NoteViewHolder extends RecyclerView.ViewHolder{ - TextView titleTextView; - TextView yearTextView; - TextView compositionTextView; - - ImageButton deleteButton; - ImageButton editButton; - - NoteViewHolder(View itemView) { - super(itemView); - titleTextView = itemView.findViewById(R.id.text_title); - yearTextView = itemView.findViewById(R.id.text_year); - compositionTextView = itemView.findViewById(R.id.text_composition); - - deleteButton = itemView.findViewById(R.id.delete_song_button); - editButton = itemView.findViewById(R.id.edit_song_button); - titleTextView.setOnClickListener(v -> { - int position = getAdapterPosition(); - if(position != RecyclerView.NO_POSITION) { - MusicNote musicNote = noteTitles.get(position); - - Intent intent = new Intent(itemView.getContext(), FullScreenImageActivity.class); - new LoadNoteSheetsTask(musicNote.getMusicNoteId(), - MusicDatabase.getDatabase(itemView.getContext()).musicNoteDao(), new OnNoteSheedsLoadedListener() { - @Override - public void onNoteSheetsLoaded(List noteSheets) { - String[] noteSheetFiles = new String[noteSheets.size()]; - for (int i = 0; i < noteSheets.size(); i++) { - noteSheetFiles[i] = noteSheets.get(i).getFilePath(); - } - intent.putExtra("imageUris", noteSheetFiles); - itemView.getContext().startActivity(intent); - } - }).execute(); - - } - }); - } - - public void bind(MusicNote note) { - titleTextView.setText(note.getTitle()); - } - - - } - - public interface OnNoteSheedsLoadedListener { - void onNoteSheetsLoaded(List noteSheets); - } - - private class LoadNoteSheetsTask extends AsyncTask> { - private final long musicNoteId; - private final MusicNoteDAO musicNoteDAO; - private final OnNoteSheedsLoadedListener listener; - - - - public LoadNoteSheetsTask(long musicNoteId, MusicNoteDAO musicNoteDAO, OnNoteSheedsLoadedListener listener) { - this.musicNoteId = musicNoteId; - this.musicNoteDAO = musicNoteDAO; - this.listener = listener; - } - - @Override - protected List doInBackground(Void... voids) { - List sheets = musicNoteDAO.getNoteSheetsForMusicSong(this.musicNoteId); - Log.d("LoadedNoteSheetsTask", "ID: " + this.musicNoteId); - Log.d("LoadNoteSheetsTask", "Loaded NoteSheets: " + sheets.size()); - return sheets; - } - - @Override - protected void onPostExecute(List sheets) { - listener.onNoteSheetsLoaded(sheets); - } - } -} diff --git a/app/src/main/java/core/notevault/ui/login/LoginCallBackImpl.java b/app/src/main/java/core/notevault/ui/login/LoginCallBackImpl.java deleted file mode 100644 index b71777d..0000000 --- a/app/src/main/java/core/notevault/ui/login/LoginCallBackImpl.java +++ /dev/null @@ -1,27 +0,0 @@ -package core.notevault.ui.login; - -import android.content.Context; -import android.util.Log; -import android.widget.Toast; -import core.notevault.sync.APICallback; -import core.notevault.sync.auth.LoginCallback; - -public class LoginCallBackImpl implements APICallback { - private Context context; - - public LoginCallBackImpl(Context context) { - this.context = context; - } - - @Override - public void onSuccess() { - Toast.makeText(context, "Login successfull", Toast.LENGTH_SHORT).show(); - - } - - @Override - public void onError(String error) { - Log.d("Login", error); - Toast.makeText(context, "Login not successfull: " + error, Toast.LENGTH_LONG).show(); - } -} diff --git a/app/src/main/java/core/notevault/ui/login/LoginDialogFragment.java b/app/src/main/java/core/notevault/ui/login/LoginDialogFragment.java deleted file mode 100644 index 5723e68..0000000 --- a/app/src/main/java/core/notevault/ui/login/LoginDialogFragment.java +++ /dev/null @@ -1,100 +0,0 @@ -package core.notevault.ui.login; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.Context; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.Button; -import android.widget.EditText; -import android.widget.TextView; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.DialogFragment; -import core.notevault.R; -import core.notevault.sync.APICallback; -import core.notevault.sync.auth.AuthRepository; -import core.notevault.sync.auth.LoginCallback; -import retrofit2.Call; -import retrofit2.Callback; - -public class LoginDialogFragment extends DialogFragment { - private APICallback loginCallback; - private APICallback registerCallback; - - private boolean isLoginMode = true; // Default mode - - @Override - public void onAttach(Context context) { - super.onAttach(context); - if (loginCallback == null || registerCallback == null) { - throw new IllegalStateException("LoginDialogFragment must be created using newInstance()"); - } - } - - public static LoginDialogFragment newInstance(APICallback loginCallback, APICallback registerCallback) { - LoginDialogFragment fragment = new LoginDialogFragment(); - fragment.loginCallback = loginCallback; - fragment.registerCallback = registerCallback; - return fragment; - } - - @NonNull - @Override - public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { - /*return new AlertDialog.Builder(requireContext()) - .setView(loginView) - .setPositiveButton("Speichern", (dialog, which) -> { - String username = usernameInput.getText().toString(); - String password = passwordInput.getText().toString(); - - authRepository.performLogin(username, password, loginCallback); - } ) - .setNegativeButton("Abbrechen", (dialog, which) -> {} ) - .create();*/ - - AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); - LayoutInflater inflater = requireActivity().getLayoutInflater(); - View view = inflater.inflate(R.layout.fragment_login_dialog, null); - - TextView textViewTitle = view.findViewById(R.id.textViewTitle); - EditText editTextUsername = view.findViewById(R.id.editTextUsername); - EditText editTextEmail = view.findViewById(R.id.editTextEmail); - EditText editTextPassword = view.findViewById(R.id.editTextPassword); - Button buttonAction = view.findViewById(R.id.buttonAction); - TextView textViewSwitch = view.findViewById(R.id.textViewSwitch); - - // Handle action button click - buttonAction.setOnClickListener(v -> { - if (isLoginMode) { - // Handle login logic - String email = editTextEmail.getText().toString(); - String password = editTextPassword.getText().toString(); - AuthRepository authRepository = new AuthRepository(this.getContext()); - authRepository.performLogin(email, password, loginCallback); - } else { - // Handle registration logic - String email = editTextEmail.getText().toString(); - String password = editTextPassword.getText().toString(); - String username = editTextUsername.getText().toString(); - AuthRepository authRepository = new AuthRepository(this.getContext()); - authRepository.performRegistration(email, username, password, registerCallback); - } - }); - - // Toggle between Login and Registration - textViewSwitch.setOnClickListener(v -> { - isLoginMode = !isLoginMode; - textViewTitle.setText(isLoginMode ? "Login" : "Register"); - editTextUsername.setVisibility(isLoginMode ? View.GONE : View.VISIBLE); - buttonAction.setText(isLoginMode ? "Login" : "Register"); - textViewSwitch.setText(isLoginMode ? "Don't have an account? Register" : "Already have an account? Login"); - }); - - builder.setView(view); - return builder.create(); - } - - -} diff --git a/app/src/main/java/core/notevault/ui/login/RegisterCallback.java b/app/src/main/java/core/notevault/ui/login/RegisterCallback.java deleted file mode 100644 index c9c905b..0000000 --- a/app/src/main/java/core/notevault/ui/login/RegisterCallback.java +++ /dev/null @@ -1,25 +0,0 @@ -package core.notevault.ui.login; - -import android.content.Context; -import android.util.Log; -import android.widget.Toast; -import core.notevault.sync.APICallback; - -public class RegisterCallback implements APICallback { - private Context context; - - public RegisterCallback(Context context) { - this.context = context; - } - - @Override - public void onSuccess() { - Toast.makeText(context, "Registration successfull", Toast.LENGTH_SHORT).show(); - } - - @Override - public void onError(String error) { - Log.d("Login", error); - Toast.makeText(context, "Login not successfull: " + error, Toast.LENGTH_LONG).show(); - } -} diff --git a/app/src/main/java/core/notevault/ui/metadatadialog/MetaDataDialog.java b/app/src/main/java/core/notevault/ui/metadatadialog/MetaDataDialog.java deleted file mode 100644 index 784309f..0000000 --- a/app/src/main/java/core/notevault/ui/metadatadialog/MetaDataDialog.java +++ /dev/null @@ -1,108 +0,0 @@ -package core.notevault.ui.metadatadialog; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.os.Bundle; -import android.provider.OpenableColumns; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.EditText; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.DialogFragment; -import core.notevault.R; - -public class MetaDataDialog extends DialogFragment { - private Uri[] fileUri; - - public interface OnMetadataListener { - void onMetadataEntered(Uri[] uri, String title, String composer, int year, String genre); - } - - private OnMetadataListener listener; - - @NonNull - @Override - public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { - LayoutInflater inflater = requireActivity().getLayoutInflater(); - View dialogView = inflater.inflate(R.layout.fragment_metadata_dialog, null); // Ersetze 'your_dialog_layout' durch deinen Dateinamen - - EditText title_input = dialogView.findViewById(R.id.title_input); - title_input.setText(this.extraxtTitleFromFilePath()); - EditText composer_input = dialogView.findViewById(R.id.composer_input); - EditText year_input = dialogView.findViewById(R.id.year_input); - EditText genre_input = dialogView.findViewById(R.id.genre_input); - - return new AlertDialog.Builder(requireContext()) - .setView(dialogView) - .setPositiveButton("Speichern", (dialog, which) -> { - String title = title_input.getText().toString(); - String composer = composer_input.getText().toString(); - - String year_string = year_input.getText().toString(); - int year = 0; - if(!year_string.isEmpty()) { - year = Integer.parseInt(year_input.getText().toString()); - } - - String genre = genre_input.getText().toString(); - - listener.onMetadataEntered(fileUri, title, composer, year, genre); - } ) - .setNegativeButton("Abbrechen", (dialog, which) -> {} ) - .create(); - } - - @Override - public void onAttach(@NonNull Context context) { - super.onAttach(context); - if (context instanceof OnMetadataListener) { - listener = (OnMetadataListener) context; - } else { - throw new RuntimeException(context.toString() - + " must implement OnMetadataListener"); - } - } - - public Uri[] getFileUri() { - return fileUri; - } - - public void setFileUri(Uri[] fileUri) { - this.fileUri = fileUri; - } - - private String extraxtTitleFromFilePath() { - String fileName = ""; - - // Überprüfen, ob die Uri ein Content-Uri ist - if (this.fileUri[0].getScheme().equals("content")) { - // ContentResolver verwenden, um die Datei zu finden - Cursor cursor = requireContext().getContentResolver().query(this.fileUri[0], null, null, null, null); - if (cursor != null) { - int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); - if (cursor.moveToFirst()) { - // Den Dateinamen aus dem Cursor abfragen - fileName = cursor.getString(nameIndex); - } - cursor.close(); - } - } else if (this.fileUri[0].getScheme().equals("file")) { - // Bei einer Datei-Uri einfach den letzten Pfadsegment verwenden - fileName = this.fileUri[0].getLastPathSegment(); - } - - if(fileName.contains(".")) { - fileName = fileName.substring(0, fileName.lastIndexOf(".")); - fileName = fileName.replace("_", " "); - fileName = fileName.replace("-", ""); - } - - return fileName; - } - - public static String TAG = "MetaDataDialog"; -} diff --git a/app/src/main/java/core/notevault/ui/metadatadialog/SongEditDialog.java b/app/src/main/java/core/notevault/ui/metadatadialog/SongEditDialog.java deleted file mode 100644 index 85bc808..0000000 --- a/app/src/main/java/core/notevault/ui/metadatadialog/SongEditDialog.java +++ /dev/null @@ -1,90 +0,0 @@ -package core.notevault.ui.metadatadialog; - -import android.app.AlertDialog; -import android.app.Dialog; -import android.content.Context; -import android.os.Bundle; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.EditText; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.DialogFragment; -import core.notevault.R; -import core.notevault.data.MusicNote; -import core.notevault.data.sync.SyncStatus; - -public class SongEditDialog extends DialogFragment { - - private MusicNote song; - private SongEditorListener songEditorListener; - - public interface SongEditorListener { - void onSongEdited(MusicNote updatedSong); - } - - @NonNull - @Override - public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) { - LayoutInflater inflater = requireActivity().getLayoutInflater(); - View dialogView = inflater.inflate(R.layout.song_metadata_edit_dialog, null); // Ersetze 'your_dialog_layout' durch deinen Dateinamen - - EditText title_input = dialogView.findViewById(R.id.title_input); - title_input.setText(song.getTitle()); - EditText composer_input = dialogView.findViewById(R.id.composer_input); - composer_input.setText(song.getComposer()); - EditText year_input = dialogView.findViewById(R.id.year_input); - year_input.setText(String.valueOf(song.getYear())); - EditText genre_input = dialogView.findViewById(R.id.genre_input); - genre_input.setText(song.getGenre()); - - return new AlertDialog.Builder(requireContext()) - .setView(dialogView) - .setPositiveButton("Speichern", (dialog, which) -> { - String title = title_input.getText().toString(); - String composer = composer_input.getText().toString(); - - String year_string = year_input.getText().toString(); - int year = 0; - if(!year_string.isEmpty()) { - year = Integer.parseInt(year_input.getText().toString()); - } - - String genre = genre_input.getText().toString(); - - song.setTitle(title); - song.setComposer(composer); - song.setGenre(genre); - song.setYear(year); - - if(song.getSyncStatus() == SyncStatus.SYNCED) { - song.setSyncStatus(SyncStatus.MODIFIED); - } - - songEditorListener.onSongEdited(song); - } ) - .setNegativeButton("Abbrechen", (dialog, which) -> {} ) - .create(); - } - - public MusicNote getSong() { - return song; - } - - public void setSong(MusicNote song) { - this.song = song; - } - - @Override - public void onAttach(@NonNull Context context) { - super.onAttach(context); - if (context instanceof MetaDataDialog.OnMetadataListener) { - songEditorListener = (SongEditorListener) context; - } else { - throw new RuntimeException(context.toString() - + " must implement OnMetadataListener"); - } - } - - public static String TAG = "SONGEDITDIALOG"; -} diff --git a/app/src/main/java/core/notevault/ui/noteviewer/ImagePagerAdapter.java b/app/src/main/java/core/notevault/ui/noteviewer/ImagePagerAdapter.java deleted file mode 100644 index ade40ba..0000000 --- a/app/src/main/java/core/notevault/ui/noteviewer/ImagePagerAdapter.java +++ /dev/null @@ -1,50 +0,0 @@ -package core.notevault.ui.noteviewer; - -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 core.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/core/notevault/util/NoteSheetsUtil.java b/app/src/main/java/core/notevault/util/NoteSheetsUtil.java deleted file mode 100644 index f98ea4a..0000000 --- a/app/src/main/java/core/notevault/util/NoteSheetsUtil.java +++ /dev/null @@ -1,54 +0,0 @@ -package core.notevault.util; - -import android.content.Context; -import android.database.Cursor; -import android.media.ExifInterface; -import android.net.Uri; -import android.provider.MediaStore; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -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 - - 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/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/layout/activity_fullscreen_image.xml b/app/src/main/res/layout/activity_fullscreen_image.xml deleted file mode 100644 index d771ad9..0000000 --- a/app/src/main/res/layout/activity_fullscreen_image.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/app_bar_main.xml b/app/src/main/res/layout/app_bar_main.xml index 544ae28..9faa0bb 100644 --- a/app/src/main/res/layout/app_bar_main.xml +++ b/app/src/main/res/layout/app_bar_main.xml @@ -23,4 +23,13 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/concert_editor.xml b/app/src/main/res/layout/concert_editor.xml deleted file mode 100644 index f9d07fb..0000000 --- a/app/src/main/res/layout/concert_editor.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/concert_item.xml b/app/src/main/res/layout/concert_item.xml deleted file mode 100644 index 657a951..0000000 --- a/app/src/main/res/layout/concert_item.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_concert_song_selector.xml b/app/src/main/res/layout/dialog_concert_song_selector.xml deleted file mode 100644 index f010800..0000000 --- a/app/src/main/res/layout/dialog_concert_song_selector.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_concert_detail.xml b/app/src/main/res/layout/fragment_concert_detail.xml deleted file mode 100644 index 12156cc..0000000 --- a/app/src/main/res/layout/fragment_concert_detail.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/fragment_gallery.xml b/app/src/main/res/layout/fragment_gallery.xml index 5704324..82d5b10 100644 --- a/app/src/main/res/layout/fragment_gallery.xml +++ b/app/src/main/res/layout/fragment_gallery.xml @@ -7,17 +7,17 @@ android:layout_height="match_parent" tools:context=".ui.gallery.GalleryFragment"> - - - + android:layout_marginStart="8dp" + android:layout_marginTop="8dp" + android:layout_marginEnd="8dp" + android:textAlignment="center" + android:textSize="20sp" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent"/> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 925a47e..d91141c 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -7,22 +7,17 @@ android:layout_height="match_parent" tools:context=".ui.home.HomeFragment"> - - - + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent"/> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_login_dialog.xml b/app/src/main/res/layout/fragment_login_dialog.xml deleted file mode 100644 index da64177..0000000 --- a/app/src/main/res/layout/fragment_login_dialog.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - -