diff --git a/app/src/main/java/com/stormtales/notevault/data/dao/SongDao.java b/app/src/main/java/com/stormtales/notevault/data/dao/SongDao.java index ede1d48..135178d 100644 --- a/app/src/main/java/com/stormtales/notevault/data/dao/SongDao.java +++ b/app/src/main/java/com/stormtales/notevault/data/dao/SongDao.java @@ -78,4 +78,10 @@ public interface SongDao { @Query("DELETE FROM NoteSheet WHERE songID = :localID") void deleteNoteSheetsByLocalSongID(int localID); + + @Update + void updateNoteSheet(NoteSheet noteSheet); + + @Query("SELECT * FROM NoteSheet WHERE serverFileName =:serverFileName") + NoteSheet getNoteSheetByServerFileName(String serverFileName); } diff --git a/app/src/main/java/com/stormtales/notevault/data/entities/NoteSheet.java b/app/src/main/java/com/stormtales/notevault/data/entities/NoteSheet.java index 8a38119..397f70b 100644 --- a/app/src/main/java/com/stormtales/notevault/data/entities/NoteSheet.java +++ b/app/src/main/java/com/stormtales/notevault/data/entities/NoteSheet.java @@ -1,6 +1,7 @@ package com.stormtales.notevault.data.entities; import androidx.room.Entity; +import androidx.room.Ignore; import androidx.room.PrimaryKey; import com.stormtales.notevault.data.sync.SyncStatus; @@ -17,12 +18,27 @@ public class NoteSheet { private SyncStatus syncStatus; + @Ignore public NoteSheet(String localFileName, String hash) { this.localFileName = localFileName; this.hash = hash; this.syncStatus = SyncStatus.CREATED; } + @Ignore + public NoteSheet(int songID, String localFileName, String serverFileName, String hash) { + this.songID = songID; + this.localFileName = localFileName; + this.serverFileName = serverFileName; + this.hash = hash; + this.syncStatus = SyncStatus.REMOTE_MODIFIED; + } + + + public NoteSheet() { + + } + public int getLocalID() { return localID; } diff --git a/app/src/main/java/com/stormtales/notevault/data/entities/Song.java b/app/src/main/java/com/stormtales/notevault/data/entities/Song.java index e960a03..241326b 100644 --- a/app/src/main/java/com/stormtales/notevault/data/entities/Song.java +++ b/app/src/main/java/com/stormtales/notevault/data/entities/Song.java @@ -47,6 +47,12 @@ public class Song { public Song() { } + @Ignore + public Song(String serverID) { + this.serverID = serverID; + this.syncStatus = SyncStatus.REMOTE_MODIFIED; + } + public int getLocalID() { return localID; } diff --git a/app/src/main/java/com/stormtales/notevault/data/repositories/SongSyncRepository.java b/app/src/main/java/com/stormtales/notevault/data/repositories/SongSyncRepository.java index 4924e6f..93e392a 100644 --- a/app/src/main/java/com/stormtales/notevault/data/repositories/SongSyncRepository.java +++ b/app/src/main/java/com/stormtales/notevault/data/repositories/SongSyncRepository.java @@ -168,10 +168,27 @@ public class SongSyncRepository { public void markSongsAsRemotelyModified(List serverIDs) { Executors.newSingleThreadExecutor().execute(() -> { List songs = songDao.getSongsByServerIDs(serverIDs); + List createdSongs = new ArrayList<>(); for(Song song : songs) { song.setSyncStatus(SyncStatus.REMOTE_MODIFIED); } + + for(String serverID : serverIDs) { + boolean foundServerSong = false; + for(Song song : songs) { + if(song.getServerID().equals(serverID)) { + foundServerSong = true; + break; + } + } + + if(!foundServerSong) { + Song song = new Song(serverID); + createdSongs.add(song); + } + } songDao.updateSongs(songs); + songDao.insertSongs(createdSongs); }); } @@ -192,6 +209,7 @@ public class SongSyncRepository { List onlyRemoteExistingSongs = new ArrayList<>(); List outdatedNoteSheets = new ArrayList<>(); + List onlyRemoteNoteSheets = new ArrayList<>(); for(SongModel songModel : remoteSongs) { boolean found = false; for(Song song : songs) { @@ -206,16 +224,32 @@ public class SongSyncRepository { song.setGenre(songModel.getGenre()); song.setYear(songModel.getYear()); - for(NoteSheet noteSheet : noteSheets) { - for(RemotelyModifiedNoteSheetModel remoteNoteSheet : songModel.getNote_sheets()) { - if(remoteNoteSheet.getServer_filename().equals(noteSheet.getServerFileName())) { - if(!remoteNoteSheet.getHash().equals(noteSheet.getHash())) { - outdatedNoteSheets.add(noteSheet); - break; - } - } - } - } + for(RemotelyModifiedNoteSheetModel remoteNoteSheet : songModel.getNote_sheets()) { + if(noteSheets.isEmpty()) { + NoteSheet noteSheet = new NoteSheet(song.getLocalID(), remoteNoteSheet.getFilename(), remoteNoteSheet.getServer_filename(), null); + onlyRemoteNoteSheets.add(noteSheet); + outdatedNoteSheets.add(noteSheet); + } else { + boolean foundNoteSheet = false; + for(NoteSheet noteSheet : outdatedNoteSheets) { + if(remoteNoteSheet.getServer_filename().equals(noteSheet.getServerFileName())) { + foundNoteSheet = true; + if(!remoteNoteSheet.getHash().equals(noteSheet.getHash())) { + outdatedNoteSheets.add(noteSheet); + break; + } + } + } + + if(!foundNoteSheet) { + NoteSheet noteSheet = new NoteSheet(song.getLocalID(), remoteNoteSheet.getFilename(), remoteNoteSheet.getServer_filename(), null); + onlyRemoteNoteSheets.add(noteSheet); + outdatedNoteSheets.add(noteSheet); + } + } + + } + } else { removeSong(song); } @@ -230,6 +264,7 @@ public class SongSyncRepository { songDao.updateSongs(songs); songDao.insertSongs(onlyRemoteExistingSongs); + songDao.insert(onlyRemoteNoteSheets); Handler mainHandler = new Handler(Looper.getMainLooper()); mainHandler.post(()-> callback.onResult(outdatedNoteSheets)); @@ -250,6 +285,17 @@ public class SongSyncRepository { } + + + public void saveUpdatedNoteSheet(String serverFileName, String localFileName, String hash) { + Executors.newSingleThreadExecutor().execute(()-> { + NoteSheet noteSheet = songDao.getNoteSheetByServerFileName(serverFileName); + noteSheet.setHash(hash); + noteSheet.setLocalFileName(localFileName); + songDao.updateNoteSheet(noteSheet); + }); + } + public interface LoadDataCallback { void onResult(T result); } diff --git a/app/src/main/java/com/stormtales/notevault/network/NetworkModule.java b/app/src/main/java/com/stormtales/notevault/network/NetworkModule.java index 10b3bc1..b27519d 100644 --- a/app/src/main/java/com/stormtales/notevault/network/NetworkModule.java +++ b/app/src/main/java/com/stormtales/notevault/network/NetworkModule.java @@ -10,7 +10,7 @@ import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; public class NetworkModule { - private static final String BASE_URL = "https://192.168.178.30:8000/"; + private static final String BASE_URL = "https://notevault.fawkes100.de/"; private static Retrofit retrofit; public static Retrofit getRetrofitInstance(Context context) { @@ -25,7 +25,7 @@ public class NetworkModule { .build(); retrofit = new Retrofit.Builder() - .baseUrl("http://192.168.178.30:8000/") + .baseUrl(BASE_URL) .client(client) .addConverterFactory(GsonConverterFactory.create()) .build(); diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncAPI.java b/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncAPI.java index 616997e..be474fc 100644 --- a/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncAPI.java +++ b/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncAPI.java @@ -33,7 +33,7 @@ public interface SongSyncAPI { @GET("/sync/songs/fetch") Call fetchRemoteModifiedSongs(@Query(value = "last_client_sync") String last_client_sync); - @GET("/sync/songs/get") + @GET("/sync/songs/get/") Call fetchRemotelyModifiedSongData(@Query(value = "songID") String songID); @GET("/sync/songs/get/notesheet/") diff --git a/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncModule.java b/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncModule.java index ebf64b2..bbec6c9 100644 --- a/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncModule.java +++ b/app/src/main/java/com/stormtales/notevault/network/sync/SongSyncModule.java @@ -9,6 +9,7 @@ import com.stormtales.notevault.data.repositories.SongSyncRepository; import com.stormtales.notevault.network.sync.models.*; import com.stormtales.notevault.ui.gallery.GalleryViewModel; import com.stormtales.notevault.utils.NoteSheetsUtil; +import com.stormtales.notevault.utils.Tupel; import java.io.File; import java.time.LocalDateTime; @@ -97,10 +98,17 @@ public class SongSyncModule { public void getRemotelyModifiedSongData() { songSyncRepository.loadRemotelyModifiedSongs(songs -> { - songSyncService.getRemotelyModifiedSongData(songs, remoteSongs -> { - songSyncRepository.saveRemoteSongs(remoteSongs, this::downloadNoteSheets); - - }); + if(songs.isEmpty()) { + syncViewModel.finishFetching(); + } else { + songSyncService.getRemotelyModifiedSongData(songs, remoteSongs -> { + if(remoteSongs.isEmpty()) { + syncViewModel.finishFetching(); + } else { + songSyncRepository.saveRemoteSongs(remoteSongs, this::downloadNoteSheets); + } + }); + } }); } @@ -110,7 +118,8 @@ public class SongSyncModule { songSyncService.downloadNoteSheet(noteSheet, responseBody -> { String localFilename = noteSheet.getServerFileName().substring(36); - NoteSheetsUtil.saveImageFromServer(responseBody, context.getFilesDir()); + Tupel result = NoteSheetsUtil.saveImageFromServer(responseBody, context.getFilesDir()); + songSyncRepository.saveUpdatedNoteSheet(noteSheet.getServerFileName(), result.getValue00(), result.getValue01()); }); } syncViewModel.finishFetching();