diff options
author | Stefan Niedermann <info@niedermann.it> | 2021-04-28 11:27:18 +0300 |
---|---|---|
committer | Stefan Niedermann <info@niedermann.it> | 2021-04-28 11:27:18 +0300 |
commit | 403cdecc8650af44ddec8b627826588e9c229142 (patch) | |
tree | f966d96fcf6d12dfa2177b42ff64ef06db86c032 /app | |
parent | 4676bb8b6bcb92e9b957b3457ee49601d6fea4e8 (diff) |
Respect @Expose annotation for Notes to only (de)serialize the properties that are relevant for the API
Diffstat (limited to 'app')
5 files changed, 73 insertions, 39 deletions
diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesServerSyncTask.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesServerSyncTask.java index bb22fc30..b3af4ab7 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesServerSyncTask.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/NotesServerSyncTask.java @@ -6,7 +6,6 @@ import android.util.Log; import androidx.annotation.NonNull; import com.nextcloud.android.sso.AccountImporter; -import com.nextcloud.android.sso.api.NextcloudAPI; import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException; import com.nextcloud.android.sso.exceptions.NextcloudHttpRequestFailedException; import com.nextcloud.android.sso.exceptions.TokenMismatchException; @@ -79,31 +78,18 @@ abstract class NotesServerSyncTask extends Thread { @Override public void run() { onPreExecute(); - - notesClient = new ApiProvider(context, ssoAccount, new NextcloudAPI.ApiConnectedListener() { - @Override - public void onConnected() { - new Thread(() -> { - Log.i(TAG, "STARTING SYNCHRONIZATION"); - final SyncResultStatus status = new SyncResultStatus(); - status.pushSuccessful = pushLocalChanges(); - if (!onlyLocalChanges) { - status.pullSuccessful = pullRemoteChanges(); - } - Log.i(TAG, "SYNCHRONIZATION FINISHED"); - - onPostExecute(status); - }).start(); + notesClient = new ApiProvider(context, ssoAccount); + new Thread(() -> { + Log.i(TAG, "STARTING SYNCHRONIZATION"); + final SyncResultStatus status = new SyncResultStatus(); + status.pushSuccessful = pushLocalChanges(); + if (!onlyLocalChanges) { + status.pullSuccessful = pullRemoteChanges(); } + Log.i(TAG, "SYNCHRONIZATION FINISHED"); - @Override - public void onError(Exception ex) { - final SyncResultStatus status = new SyncResultStatus(); - status.pullSuccessful = false; - status.pushSuccessful = false; - onPostExecute(status); - } - }); + onPostExecute(status); + }).start(); } abstract void onPreExecute(); @@ -211,7 +197,7 @@ abstract class NotesServerSyncTask extends Thread { localAccount.setModified(accountFromDatabase.getModified()); localAccount.setETag(accountFromDatabase.getETag()); - final Response<List<Note>> fetchResponse = notesClient.getNotesAPI().getNotes(localAccount.getModified(), localAccount.getETag()).execute(); + final Response<List<Note>> fetchResponse = notesClient.getNotesAPI().getNotes(localAccount.getModified().getTimeInMillis() / 1_000, localAccount.getETag()).execute(); if (fetchResponse.isSuccessful()) { final List<Note> remoteNotes = fetchResponse.body(); final Set<Long> remoteIDs = new HashSet<>(); diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/SSOClient.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/SSOClient.java index d3976617..d5901496 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/SSOClient.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/SSOClient.java @@ -7,11 +7,15 @@ import androidx.annotation.NonNull; import androidx.annotation.WorkerThread; import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializer; import com.nextcloud.android.sso.aidl.NextcloudRequest; import com.nextcloud.android.sso.api.NextcloudAPI; import com.nextcloud.android.sso.api.Response; import com.nextcloud.android.sso.model.SingleSignOnAccount; +import java.util.Calendar; import java.util.HashMap; import java.util.Map; @@ -27,22 +31,32 @@ public class SSOClient { return getNextcloudAPI(context.getApplicationContext(), ssoAccount).performNetworkRequestV2(nextcloudRequest); } - private static NextcloudAPI getNextcloudAPI(Context appContext, SingleSignOnAccount ssoAccount) { + public static NextcloudAPI getNextcloudAPI(Context appContext, SingleSignOnAccount ssoAccount) { if (mNextcloudAPIs.containsKey(ssoAccount.name)) { return mNextcloudAPIs.get(ssoAccount.name); } else { Log.v(TAG, "NextcloudRequest account: " + ssoAccount.name); - final NextcloudAPI nextcloudAPI = new NextcloudAPI(appContext, ssoAccount, new GsonBuilder().create(), new NextcloudAPI.ApiConnectedListener() { - @Override - public void onConnected() { - Log.i(TAG, "SSO API connected for " + ssoAccount); - } + final NextcloudAPI nextcloudAPI = new NextcloudAPI(appContext, ssoAccount, + new GsonBuilder() + .excludeFieldsWithoutExposeAnnotation() + .registerTypeHierarchyAdapter(Calendar.class, (JsonSerializer<Calendar>) (src, typeOfSrc, context) -> new JsonPrimitive(src.getTimeInMillis() / 1_000)) + .registerTypeHierarchyAdapter(Calendar.class, (JsonDeserializer<Calendar>) (src, typeOfSrc, context) -> { + final Calendar calendar = Calendar.getInstance(); + calendar.setTimeInMillis(src.getAsLong() * 1_000); + return calendar; + }) + .create(), + new NextcloudAPI.ApiConnectedListener() { + @Override + public void onConnected() { + Log.i(TAG, "SSO API connected for " + ssoAccount); + } - @Override - public void onError(Exception ex) { - ex.printStackTrace(); - } - }); + @Override + public void onError(Exception ex) { + ex.printStackTrace(); + } + }); mNextcloudAPIs.put(ssoAccount.name, nextcloudAPI); return nextcloudAPI; } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/ApiProvider.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/ApiProvider.java index 63f10c99..cbb0687b 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/ApiProvider.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/ApiProvider.java @@ -8,6 +8,7 @@ import com.google.gson.GsonBuilder; import com.nextcloud.android.sso.api.NextcloudAPI; import com.nextcloud.android.sso.model.SingleSignOnAccount; +import it.niedermann.owncloud.notes.persistence.SSOClient; import retrofit2.NextcloudRetrofitApiBuilder; /** @@ -19,8 +20,8 @@ public class ApiProvider { private final NotesAPI notesAPI; - public ApiProvider(@NonNull Context context, @NonNull SingleSignOnAccount ssoAccount, @NonNull final NextcloudAPI.ApiConnectedListener callback) { - final NextcloudAPI nextcloudAPI = new NextcloudAPI(context, ssoAccount, new GsonBuilder().create(), callback); + public ApiProvider(@NonNull Context appContext, @NonNull SingleSignOnAccount ssoAccount) { + final NextcloudAPI nextcloudAPI = SSOClient.getNextcloudAPI(appContext, ssoAccount); notesAPI = new NextcloudRetrofitApiBuilder(nextcloudAPI, API_ENDPOINT_NOTES).create(NotesAPI.class); } diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NextcloudAPI.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NextcloudAPI.java new file mode 100644 index 00000000..9ddb5941 --- /dev/null +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NextcloudAPI.java @@ -0,0 +1,33 @@ +package it.niedermann.owncloud.notes.persistence.sync; + + +import java.util.List; + +import it.niedermann.owncloud.notes.persistence.entity.Note; +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.DELETE; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.PUT; +import retrofit2.http.Path; +import retrofit2.http.Query; + +/** + * @link <a href="https://deck.readthedocs.io/en/latest/API/">Deck REST API</a> + */ +public interface NextcloudAPI { + + @GET("notes") + Call<List<Note>> getNotes(@Query(value = "pruneBefore") long lastModified, @Query("If-None-Match") String lastETag); + + @POST("notes") + Call<Note> createNote(@Body Note note); + + @PUT("notes/{remoteId}") + Call<Note> editNote(@Body Note note, @Path("remoteId") long remoteId); + + @DELETE("notes/{remoteId}") + Call<Note> deleteNote(@Path("remoteId") long noteId); + +} diff --git a/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI.java b/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI.java index d684a35c..92130664 100644 --- a/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI.java +++ b/app/src/main/java/it/niedermann/owncloud/notes/persistence/sync/NotesAPI.java @@ -20,7 +20,7 @@ import retrofit2.http.Query; public interface NotesAPI { @GET("notes") - Call<List<Note>> getNotes(@Query("pruneBefore") Calendar lastModified, @Query("If-None-Match") String lastETag); + Call<List<Note>> getNotes(@Query(value = "pruneBefore") long lastModified, @Query("If-None-Match") String lastETag); @POST("notes") Call<Note> createNote(@Body Note note); |