From 81349047a8cd0eb54ff80cf976ddea574a13de16 Mon Sep 17 00:00:00 2001 From: stefan-niedermann Date: Fri, 6 Dec 2019 19:11:19 +0100 Subject: [PATCH 1/7] Background synchronization using WorkManager --- app/build.gradle | 2 ++ .../deck/persistence/sync/SyncManager.java | 11 ++++++++ .../deck/persistence/sync/SyncWorker.java | 28 +++++++++++++++++++ .../nextcloud/deck/ui/DrawerActivity.java | 13 +++++++++ 4 files changed, 54 insertions(+) create mode 100644 app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java diff --git a/app/build.gradle b/app/build.gradle index a6fcfe507..33c8233a0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -60,6 +60,8 @@ dependencies { implementation 'com.google.android.material:material:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.work:work-runtime:2.2.0' + // Flexbox implementation 'com.google.android:flexbox:2.0.0' diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java index c9e630efb..863eb4037 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java @@ -72,6 +72,17 @@ private void doAsync(Runnable r) { new Thread(r).start(); } + boolean synchronizeEverything() { + // TODO do some magic here, but wait with implementation for PoC + try { + Thread.sleep(2000); + return true; + } catch (InterruptedException e) { + e.printStackTrace(); + } + return false; + } + public void synchronize(IResponseCallback responseCallback) { if (responseCallback == null || responseCallback.getAccount() == null || diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java new file mode 100644 index 000000000..e3b398e6e --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java @@ -0,0 +1,28 @@ +package it.niedermann.nextcloud.deck.persistence.sync; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.work.Worker; +import androidx.work.WorkerParameters; + +import it.niedermann.nextcloud.deck.DeckLog; + +public class SyncWorker extends Worker { + + public static final String TAG = SyncWorker.class.getSimpleName(); + + public SyncWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { + super(context, workerParams); + } + + @NonNull + @Override + public Result doWork() { + SyncManager syncManager = new SyncManager(getApplicationContext(), null); + DeckLog.log("Starting background synchronization"); + boolean success = syncManager.synchronizeEverything(); + DeckLog.log("Finishing background synchronization with result " + success); + return success ? Result.failure() : Result.success(); + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/DrawerActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/DrawerActivity.java index bc5a68a49..22622899a 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/DrawerActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/DrawerActivity.java @@ -31,6 +31,10 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; +import androidx.work.Constraints; +import androidx.work.ExistingPeriodicWorkPolicy; +import androidx.work.PeriodicWorkRequest; +import androidx.work.WorkManager; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; @@ -49,6 +53,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.concurrent.TimeUnit; import butterknife.BindInt; import butterknife.BindString; @@ -63,6 +68,7 @@ import it.niedermann.nextcloud.deck.model.ocs.Capabilities; import it.niedermann.nextcloud.deck.model.ocs.Version; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; +import it.niedermann.nextcloud.deck.persistence.sync.SyncWorker; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.WrappedLiveData; import it.niedermann.nextcloud.deck.ui.board.EditBoardDialogFragment; import it.niedermann.nextcloud.deck.ui.exception.ExceptionHandler; @@ -170,6 +176,13 @@ public void onResponse(Capabilities response) { editor.remove(sharedPreferenceLastAccount); editor.commit(); // Has to be done synchronously } else { + Constraints constraints = new Constraints.Builder() + .setRequiresCharging(true) + .build(); + PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(SyncWorker.class, 30, TimeUnit.MINUTES) + .setConstraints(constraints) + .build(); + WorkManager.getInstance(getApplicationContext()).enqueueUniquePeriodicWork(SyncWorker.TAG, ExistingPeriodicWorkPolicy.KEEP, work); accountIsGettingImportedSnackbar.show(); } } From 46d4a856ae842a51e103a6fc3c4798b5434825be Mon Sep 17 00:00:00 2001 From: stefan-niedermann Date: Fri, 6 Dec 2019 19:11:19 +0100 Subject: [PATCH 2/7] Background synchronization using WorkManager --- app/build.gradle | 2 ++ .../deck/persistence/sync/SyncManager.java | 11 ++++++++ .../deck/persistence/sync/SyncWorker.java | 28 +++++++++++++++++++ .../nextcloud/deck/ui/DrawerActivity.java | 13 +++++++++ 4 files changed, 54 insertions(+) create mode 100644 app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java diff --git a/app/build.gradle b/app/build.gradle index 9607d20af..8301f6ba0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -60,6 +60,8 @@ dependencies { implementation 'com.google.android.material:material:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.work:work-runtime:2.2.0' + // Flexbox implementation 'com.google.android:flexbox:2.0.0' diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java index f07314685..5926bf0fc 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java @@ -74,6 +74,17 @@ private void doAsync(Runnable r) { new Thread(r).start(); } + boolean synchronizeEverything() { + // TODO do some magic here, but wait with implementation for PoC + try { + Thread.sleep(2000); + return true; + } catch (InterruptedException e) { + e.printStackTrace(); + } + return false; + } + public void synchronize(IResponseCallback responseCallback) { if (responseCallback == null || responseCallback.getAccount() == null || diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java new file mode 100644 index 000000000..e3b398e6e --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java @@ -0,0 +1,28 @@ +package it.niedermann.nextcloud.deck.persistence.sync; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.work.Worker; +import androidx.work.WorkerParameters; + +import it.niedermann.nextcloud.deck.DeckLog; + +public class SyncWorker extends Worker { + + public static final String TAG = SyncWorker.class.getSimpleName(); + + public SyncWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { + super(context, workerParams); + } + + @NonNull + @Override + public Result doWork() { + SyncManager syncManager = new SyncManager(getApplicationContext(), null); + DeckLog.log("Starting background synchronization"); + boolean success = syncManager.synchronizeEverything(); + DeckLog.log("Finishing background synchronization with result " + success); + return success ? Result.failure() : Result.success(); + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/DrawerActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/DrawerActivity.java index bc5a68a49..22622899a 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/DrawerActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/DrawerActivity.java @@ -31,6 +31,10 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; +import androidx.work.Constraints; +import androidx.work.ExistingPeriodicWorkPolicy; +import androidx.work.PeriodicWorkRequest; +import androidx.work.WorkManager; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; @@ -49,6 +53,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.concurrent.TimeUnit; import butterknife.BindInt; import butterknife.BindString; @@ -63,6 +68,7 @@ import it.niedermann.nextcloud.deck.model.ocs.Capabilities; import it.niedermann.nextcloud.deck.model.ocs.Version; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; +import it.niedermann.nextcloud.deck.persistence.sync.SyncWorker; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.util.WrappedLiveData; import it.niedermann.nextcloud.deck.ui.board.EditBoardDialogFragment; import it.niedermann.nextcloud.deck.ui.exception.ExceptionHandler; @@ -170,6 +176,13 @@ public void onResponse(Capabilities response) { editor.remove(sharedPreferenceLastAccount); editor.commit(); // Has to be done synchronously } else { + Constraints constraints = new Constraints.Builder() + .setRequiresCharging(true) + .build(); + PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(SyncWorker.class, 30, TimeUnit.MINUTES) + .setConstraints(constraints) + .build(); + WorkManager.getInstance(getApplicationContext()).enqueueUniquePeriodicWork(SyncWorker.TAG, ExistingPeriodicWorkPolicy.KEEP, work); accountIsGettingImportedSnackbar.show(); } } From ad65764004faa5f502f57a77dde7dfc923112239 Mon Sep 17 00:00:00 2001 From: stefan-niedermann Date: Fri, 13 Dec 2019 20:41:28 +0100 Subject: [PATCH 3/7] Implement basic background sync job --- .../deck/persistence/sync/SyncManager.java | 2 +- .../deck/persistence/sync/SyncWorker.java | 40 ++++++++++++++++--- .../nextcloud/deck/ui/DrawerActivity.java | 13 +----- .../ui/about/AboutFragmentCreditsTab.java | 15 +++++++ .../nextcloud/deck/util/DateUtil.java | 6 ++- .../res/layout/fragment_about_credits_tab.xml | 26 ++++++++++++ app/src/main/res/values/setup.xml | 1 + app/src/main/res/values/strings.xml | 1 + 8 files changed, 85 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java index 5926bf0fc..13f16a951 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java @@ -75,7 +75,7 @@ private void doAsync(Runnable r) { } boolean synchronizeEverything() { - // TODO do some magic here, but wait with implementation for PoC + // TODO do some magic here try { Thread.sleep(2000); return true; diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java index e3b398e6e..6d92a1549 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java @@ -1,16 +1,26 @@ package it.niedermann.nextcloud.deck.persistence.sync; import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; import androidx.annotation.NonNull; +import androidx.work.Constraints; +import androidx.work.ExistingPeriodicWorkPolicy; +import androidx.work.NetworkType; +import androidx.work.PeriodicWorkRequest; +import androidx.work.WorkManager; import androidx.work.Worker; import androidx.work.WorkerParameters; +import java.util.concurrent.TimeUnit; + import it.niedermann.nextcloud.deck.DeckLog; +import it.niedermann.nextcloud.deck.R; public class SyncWorker extends Worker { - public static final String TAG = SyncWorker.class.getSimpleName(); + private static final String TAG = SyncWorker.class.getSimpleName(); public SyncWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(context, workerParams); @@ -20,9 +30,29 @@ public SyncWorker(@NonNull Context context, @NonNull WorkerParameters workerPara @Override public Result doWork() { SyncManager syncManager = new SyncManager(getApplicationContext(), null); - DeckLog.log("Starting background synchronization"); - boolean success = syncManager.synchronizeEverything(); - DeckLog.log("Finishing background synchronization with result " + success); - return success ? Result.failure() : Result.success(); + if (syncManager.hasInternetConnection()) { + DeckLog.log("Starting background synchronization"); + SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit(); + editor.putLong(getApplicationContext().getString(R.string.shared_preference_last_background_sync), System.currentTimeMillis()); + editor.apply(); + boolean success = syncManager.synchronizeEverything(); + DeckLog.log("Finishing background synchronization with result " + success); + return success ? Result.failure() : Result.success(); + } + return Result.success(); + } + + public static void register(@NonNull Context context) { + Constraints constraints = new Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) + .build(); + PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(SyncWorker.class, PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, TimeUnit.MILLISECONDS) + .setConstraints(constraints) + .build(); + WorkManager.getInstance(context.getApplicationContext()).enqueueUniquePeriodicWork(SyncWorker.TAG, ExistingPeriodicWorkPolicy.KEEP, work); + } + + public static void deregister(@NonNull Context context) { + WorkManager.getInstance(context.getApplicationContext()).cancelAllWorkByTag(TAG); } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/DrawerActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/DrawerActivity.java index 22622899a..4bbe77b2e 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/DrawerActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/DrawerActivity.java @@ -31,10 +31,6 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout; import androidx.core.view.GravityCompat; import androidx.drawerlayout.widget.DrawerLayout; -import androidx.work.Constraints; -import androidx.work.ExistingPeriodicWorkPolicy; -import androidx.work.PeriodicWorkRequest; -import androidx.work.WorkManager; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; @@ -53,7 +49,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.concurrent.TimeUnit; import butterknife.BindInt; import butterknife.BindString; @@ -176,13 +171,7 @@ public void onResponse(Capabilities response) { editor.remove(sharedPreferenceLastAccount); editor.commit(); // Has to be done synchronously } else { - Constraints constraints = new Constraints.Builder() - .setRequiresCharging(true) - .build(); - PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(SyncWorker.class, 30, TimeUnit.MINUTES) - .setConstraints(constraints) - .build(); - WorkManager.getInstance(getApplicationContext()).enqueueUniquePeriodicWork(SyncWorker.TAG, ExistingPeriodicWorkPolicy.KEEP, work); + SyncWorker.register(getApplicationContext()); accountIsGettingImportedSnackbar.show(); } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/about/AboutFragmentCreditsTab.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/about/AboutFragmentCreditsTab.java index adacda0e5..dea80d283 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/about/AboutFragmentCreditsTab.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/about/AboutFragmentCreditsTab.java @@ -1,9 +1,12 @@ package it.niedermann.nextcloud.deck.ui.about; +import android.content.SharedPreferences; import android.graphics.Typeface; import android.os.Bundle; +import android.preference.PreferenceManager; import android.text.Spannable; import android.text.SpannableString; +import android.text.format.DateUtils; import android.text.style.ForegroundColorSpan; import android.text.style.StyleSpan; import android.view.LayoutInflater; @@ -26,6 +29,7 @@ import it.niedermann.nextcloud.deck.exceptions.OfflineException; import it.niedermann.nextcloud.deck.model.ocs.Capabilities; import it.niedermann.nextcloud.deck.persistence.sync.SyncManager; +import it.niedermann.nextcloud.deck.util.DateUtil; import it.niedermann.nextcloud.deck.util.LinkUtil; public class AboutFragmentCreditsTab extends Fragment { @@ -38,7 +42,11 @@ public class AboutFragmentCreditsTab extends Fragment { TextView aboutMaintainer; @BindView(R.id.about_translators) TextView aboutTranslators; + @BindView(R.id.last_background_sync) + TextView lastBackgroundSyncExecutionTime; + @BindString(R.string.shared_preference_last_background_sync) + String sharedPreferencesLastBackgroundSync; @BindString(R.string.you_are_currently_offline) String offlineText; @BindString(R.string.strong_start) @@ -65,6 +73,9 @@ public void onResponse(Capabilities response) { offlineTextSpannable.setSpan(new ForegroundColorSpan(ContextCompat.getColor(Objects.requireNonNull(getContext()), R.color.fg_secondary)), 0, offlineTextSpannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); aboutServerAppVersion.setText(offlineTextSpannable); } + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(Objects.requireNonNull(getContext()).getApplicationContext()); + long lastBackgroundSync = sharedPreferences.getLong(sharedPreferencesLastBackgroundSync, 0); + LinkUtil.setHtml(lastBackgroundSyncExecutionTime, getLastBackgroundSyncStrongTag(lastBackgroundSync)); LinkUtil.setHtml(aboutMaintainer, LinkUtil.concatenateResources(v.getResources(), R.string.anchor_start, R.string.url_maintainer, R.string.anchor_middle, R.string.about_maintainer, R.string.anchor_end)); LinkUtil.setHtml(aboutTranslators, @@ -77,4 +88,8 @@ public void onResponse(Capabilities response) { private String getVersionStrongTag(String version) { return strongStart + "v" + version + strongEnd; } + + private String getLastBackgroundSyncStrongTag(long lastBackgroundSync) { + return strongStart + DateUtil.getRelativeDateTimeString(getContext(), lastBackgroundSync, DateUtils.SECOND_IN_MILLIS) + strongEnd; + } } \ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/util/DateUtil.java b/app/src/main/java/it/niedermann/nextcloud/deck/util/DateUtil.java index d21ff3620..dc5dc574e 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/util/DateUtil.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/util/DateUtil.java @@ -56,6 +56,10 @@ public static long getDayDifference(Date sourceDateFrom, Date sourceDateUntil) { } public static CharSequence getRelativeDateTimeString(Context context, long time) { + return getRelativeDateTimeString(context, time, DateUtils.DAY_IN_MILLIS); + } + + public static CharSequence getRelativeDateTimeString(Context context, long time, long minResolution) { if ((System.currentTimeMillis() - time) < 60 * 1000 && System.currentTimeMillis() > time) { // < 60 seconds -> seconds ago return context.getString(R.string.seconds_ago); @@ -64,7 +68,7 @@ public static CharSequence getRelativeDateTimeString(Context context, long time) CharSequence dateString = DateUtils.getRelativeDateTimeString( context, time, - DateUtils.DAY_IN_MILLIS, + minResolution, DateUtils.WEEK_IN_MILLIS, 0 ); diff --git a/app/src/main/res/layout/fragment_about_credits_tab.xml b/app/src/main/res/layout/fragment_about_credits_tab.xml index fa3ef489b..c505d559a 100644 --- a/app/src/main/res/layout/fragment_about_credits_tab.xml +++ b/app/src/main/res/layout/fragment_about_credits_tab.xml @@ -21,6 +21,32 @@ android:textAppearance="?android:attr/textAppearanceMedium" android:textSize="26sp" /> + + + + + + + it.niedermann.nextcloud.deck.last_sync + it.niedermann.nextcloud.deck.last_background_sync it.niedermann.nextcloud.deck.last_account wifiOnly diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4e4fd8693..d571b42cd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -148,4 +148,5 @@ This will permanently delete this attachment. Delete %1$s No content yet + Last background sync: From 1e90cad2b2a8cfed31eed5e5ce5fe0fcb82f9e74 Mon Sep 17 00:00:00 2001 From: stefan-niedermann Date: Fri, 13 Dec 2019 20:47:56 +0100 Subject: [PATCH 4/7] Use fix constant for SyncWorker tag --- .../niedermann/nextcloud/deck/persistence/sync/SyncWorker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java index 6d92a1549..1f6947461 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java @@ -20,7 +20,7 @@ public class SyncWorker extends Worker { - private static final String TAG = SyncWorker.class.getSimpleName(); + private static final String TAG = "it.niedermann.nextcloud.deck.background_synchronization"; public SyncWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(context, workerParams); From 72fd49a31c2ed298e9f9ee58afcaf8097236dd99 Mon Sep 17 00:00:00 2001 From: stefan-niedermann Date: Fri, 13 Dec 2019 22:20:31 +0100 Subject: [PATCH 5/7] #230 Background synchronization Make setting to en/disable the background sync (Off, 15 Minutes, 1 Hour, 6 Hours) --- .../deck/persistence/sync/SyncWorker.java | 30 ++++++++++++++----- .../deck/ui/settings/SettingsFragment.java | 11 +++++++ .../drawable/ic_network_wifi_grey600_24dp.xml | 6 ++++ app/src/main/res/values/setup.xml | 20 +++++++++++++ app/src/main/res/values/strings.xml | 5 ++++ app/src/main/res/xml/settings.xml | 12 ++++++-- 6 files changed, 74 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/drawable/ic_network_wifi_grey600_24dp.xml diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java index 1f6947461..a3dcc624d 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java @@ -43,16 +43,30 @@ public Result doWork() { } public static void register(@NonNull Context context) { - Constraints constraints = new Constraints.Builder() - .setRequiredNetworkType(NetworkType.CONNECTED) - .build(); - PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(SyncWorker.class, PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS, TimeUnit.MILLISECONDS) - .setConstraints(constraints) - .build(); - WorkManager.getInstance(context.getApplicationContext()).enqueueUniquePeriodicWork(SyncWorker.TAG, ExistingPeriodicWorkPolicy.KEEP, work); + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); + String backgroundSync = sharedPreferences.getString(context.getString(R.string.pref_key_background_sync), context.getString(R.string.pref_value_background_15_minutes)); + if (!context.getString(R.string.pref_value_background_sync_off).equals(backgroundSync)) { + int repeatInterval = 15; + TimeUnit unit = TimeUnit.MINUTES; + if (context.getString(R.string.pref_value_background_1_hour).equals(backgroundSync)) { + repeatInterval = 1; + unit = TimeUnit.HOURS; + } else if (context.getString(R.string.pref_value_background_6_hours).equals(backgroundSync)) { + repeatInterval = 6; + unit = TimeUnit.HOURS; + } + Constraints constraints = new Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) + .build(); + PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(SyncWorker.class, repeatInterval, unit) + .setConstraints(constraints).build(); + WorkManager.getInstance(context.getApplicationContext()).enqueueUniquePeriodicWork(SyncWorker.TAG, ExistingPeriodicWorkPolicy.REPLACE, work); + } else { + deregister(context); + } } - public static void deregister(@NonNull Context context) { + private static void deregister(@NonNull Context context) { WorkManager.getInstance(context.getApplicationContext()).cancelAllWorkByTag(TAG); } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java index bf9e13213..4925c447d 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java @@ -2,6 +2,7 @@ import android.app.Activity; import android.os.Bundle; +import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.SwitchPreference; @@ -13,6 +14,7 @@ import it.niedermann.nextcloud.deck.Application; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.R; +import it.niedermann.nextcloud.deck.persistence.sync.SyncWorker; public class SettingsFragment extends PreferenceFragment { @@ -20,6 +22,8 @@ public class SettingsFragment extends PreferenceFragment { String prefKeyWifiOnly; @BindString(R.string.pref_key_dark_theme) String prefKeyDarkTheme; + @BindString(R.string.pref_key_background_sync) + String prefKeyBackgroundSync; @Override public void onCreate(@Nullable Bundle savedInstanceState) { @@ -45,5 +49,12 @@ public void onCreate(@Nullable Bundle savedInstanceState) { getActivity().recreate(); return true; }); + + final ListPreference backgroundSyncPref = (ListPreference) findPreference(prefKeyBackgroundSync); + backgroundSyncPref.setOnPreferenceChangeListener((Preference preference, Object newValue) -> { + DeckLog.log("backgroundSync: " + newValue); + SyncWorker.register(getActivity().getApplicationContext()); + return true; + }); } } diff --git a/app/src/main/res/drawable/ic_network_wifi_grey600_24dp.xml b/app/src/main/res/drawable/ic_network_wifi_grey600_24dp.xml new file mode 100644 index 000000000..1c3b9a41c --- /dev/null +++ b/app/src/main/res/drawable/ic_network_wifi_grey600_24dp.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/values/setup.xml b/app/src/main/res/values/setup.xml index f25e3291b..e9b860fba 100644 --- a/app/src/main/res/values/setup.xml +++ b/app/src/main/res/values/setup.xml @@ -6,6 +6,26 @@ wifiOnly darkTheme + backgroundSync + + off + 15_minutes + 1_hour + 6_hours + + + @string/simple_off + @string/minutes_15 + @string/hour_1 + @string/hours_6 + + + + @string/pref_value_background_sync_off + @string/pref_value_background_15_minutes + @string/pref_value_background_1_hour + @string/pref_value_background_6_hours + it.niedermann.nextcloud.deck.last_board_for_account_ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d571b42cd..35d8f2eb5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -130,6 +130,7 @@ Rename Settings Dark theme + Background synchronization Sync on Wi-Fi and mobile data Sync only on Wi-Fi Light @@ -149,4 +150,8 @@ Delete %1$s No content yet Last background sync: + Off + 15 Minutes + 1 Hour + 6 Hours diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml index 98a7220fa..6a24dce9e 100644 --- a/app/src/main/res/xml/settings.xml +++ b/app/src/main/res/xml/settings.xml @@ -3,14 +3,22 @@ + + - From 2956f0f909573f13de126a3ee8609ae28c34442f Mon Sep 17 00:00:00 2001 From: stefan-niedermann Date: Sat, 14 Dec 2019 09:43:28 +0100 Subject: [PATCH 6/7] #230 Background synchronization --- .../deck/persistence/sync/SyncWorker.java | 34 +++++++++++-------- .../nextcloud/deck/ui/DrawerActivity.java | 2 +- .../deck/ui/settings/SettingsFragment.java | 3 +- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java index a3dcc624d..39eb0e628 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncWorker.java @@ -21,6 +21,9 @@ public class SyncWorker extends Worker { private static final String TAG = "it.niedermann.nextcloud.deck.background_synchronization"; + private static final Constraints constraints = new Constraints.Builder() + .setRequiredNetworkType(NetworkType.CONNECTED) + .build(); public SyncWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) { super(context, workerParams); @@ -29,12 +32,13 @@ public SyncWorker(@NonNull Context context, @NonNull WorkerParameters workerPara @NonNull @Override public Result doWork() { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); + SharedPreferences.Editor sharedPreferencesEditor = sharedPreferences.edit(); SyncManager syncManager = new SyncManager(getApplicationContext(), null); if (syncManager.hasInternetConnection()) { DeckLog.log("Starting background synchronization"); - SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).edit(); - editor.putLong(getApplicationContext().getString(R.string.shared_preference_last_background_sync), System.currentTimeMillis()); - editor.apply(); + sharedPreferencesEditor.putLong(getApplicationContext().getString(R.string.shared_preference_last_background_sync), System.currentTimeMillis()); + sharedPreferencesEditor.apply(); boolean success = syncManager.synchronizeEverything(); DeckLog.log("Finishing background synchronization with result " + success); return success ? Result.failure() : Result.success(); @@ -42,31 +46,33 @@ public Result doWork() { return Result.success(); } - public static void register(@NonNull Context context) { - SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context.getApplicationContext()); - String backgroundSync = sharedPreferences.getString(context.getString(R.string.pref_key_background_sync), context.getString(R.string.pref_value_background_15_minutes)); - if (!context.getString(R.string.pref_value_background_sync_off).equals(backgroundSync)) { + public static void update(@NonNull Context context) { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + update(context, sharedPreferences.getString(context.getString(R.string.pref_key_background_sync), context.getString(R.string.pref_value_background_15_minutes))); + } + + public static void update(@NonNull Context context, String preferenceValue) { + if (context.getString(R.string.pref_value_background_sync_off).equals(preferenceValue)) { + deregister(context); + } else { int repeatInterval = 15; TimeUnit unit = TimeUnit.MINUTES; - if (context.getString(R.string.pref_value_background_1_hour).equals(backgroundSync)) { + if (context.getString(R.string.pref_value_background_1_hour).equals(preferenceValue)) { repeatInterval = 1; unit = TimeUnit.HOURS; - } else if (context.getString(R.string.pref_value_background_6_hours).equals(backgroundSync)) { + } else if (context.getString(R.string.pref_value_background_6_hours).equals(preferenceValue)) { repeatInterval = 6; unit = TimeUnit.HOURS; } - Constraints constraints = new Constraints.Builder() - .setRequiredNetworkType(NetworkType.CONNECTED) - .build(); PeriodicWorkRequest work = new PeriodicWorkRequest.Builder(SyncWorker.class, repeatInterval, unit) .setConstraints(constraints).build(); + DeckLog.log("Registering worker running each " + repeatInterval + " " + unit); WorkManager.getInstance(context.getApplicationContext()).enqueueUniquePeriodicWork(SyncWorker.TAG, ExistingPeriodicWorkPolicy.REPLACE, work); - } else { - deregister(context); } } private static void deregister(@NonNull Context context) { + DeckLog.log("Deregistering all workers with tag \"" + TAG + "\""); WorkManager.getInstance(context.getApplicationContext()).cancelAllWorkByTag(TAG); } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/DrawerActivity.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/DrawerActivity.java index 4bbe77b2e..0126e251e 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/DrawerActivity.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/DrawerActivity.java @@ -171,7 +171,7 @@ public void onResponse(Capabilities response) { editor.remove(sharedPreferenceLastAccount); editor.commit(); // Has to be done synchronously } else { - SyncWorker.register(getApplicationContext()); + SyncWorker.update(getApplicationContext()); accountIsGettingImportedSnackbar.show(); } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java b/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java index 4925c447d..17d5be87e 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/ui/settings/SettingsFragment.java @@ -52,8 +52,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { final ListPreference backgroundSyncPref = (ListPreference) findPreference(prefKeyBackgroundSync); backgroundSyncPref.setOnPreferenceChangeListener((Preference preference, Object newValue) -> { - DeckLog.log("backgroundSync: " + newValue); - SyncWorker.register(getActivity().getApplicationContext()); + SyncWorker.update(getActivity().getApplicationContext(), (String) newValue); return true; }); } From b47340db452a510b78520578369135ee4c1fa90d Mon Sep 17 00:00:00 2001 From: desperateCoder Date: Fri, 27 Dec 2019 13:18:14 +0100 Subject: [PATCH 7/7] #230 implemented SyncManager.syncEverything() --- .../nextcloud/deck/api/ApiProvider.java | 41 +++++++------ .../deck/persistence/sync/SyncManager.java | 57 ++++++++++++++----- .../sync/adapters/ServerAdapter.java | 12 ++-- .../sync/adapters/db/DataBaseAdapter.java | 10 +++- .../sync/adapters/db/dao/AccountDao.java | 13 ++--- 5 files changed, 87 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/api/ApiProvider.java b/app/src/main/java/it/niedermann/nextcloud/deck/api/ApiProvider.java index 9d2b19ea4..fcac68710 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/api/ApiProvider.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/api/ApiProvider.java @@ -2,10 +2,10 @@ import android.content.Context; +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.NoCurrentAccountSelectedException; -import com.nextcloud.android.sso.exceptions.SSOException; import com.nextcloud.android.sso.helper.SingleAccountHelper; import com.nextcloud.android.sso.model.SingleSignOnAccount; @@ -25,27 +25,36 @@ public class ApiProvider { private NextcloudServerAPI nextcloudAPI; private Context context; private SingleSignOnAccount ssoAccount; + private String ssoAccountName; public ApiProvider(Context context) { + this(context, null); + } + + public ApiProvider(Context context, String ssoAccountName) { this.context = context; + this.ssoAccountName = ssoAccountName; + setAccount(); } public void initSsoApi(final NextcloudAPI.ApiConnectedListener callback) { + NextcloudAPI nextcloudAPI = new NextcloudAPI(context, ssoAccount, GsonConfig.getGson(), callback); + deckAPI = new NextcloudRetrofitApiBuilder(nextcloudAPI, DECK_API_ENDPOINT).create(DeckAPI.class); + this.nextcloudAPI = new NextcloudRetrofitApiBuilder(nextcloudAPI, NC_API_ENDPOINT).create(NextcloudServerAPI.class); + } + + private void setAccount() { try { - setAccount(); - NextcloudAPI nextcloudAPI = new NextcloudAPI(context, ssoAccount, GsonConfig.getGson(), callback); - deckAPI = new NextcloudRetrofitApiBuilder(nextcloudAPI, DECK_API_ENDPOINT).create(DeckAPI.class); - this.nextcloudAPI = new NextcloudRetrofitApiBuilder(nextcloudAPI, NC_API_ENDPOINT).create(NextcloudServerAPI.class); - } catch (SSOException e) { + if (ssoAccountName == null) { + this.ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(context); + } else { + this.ssoAccount = AccountImporter.getSingleSignOnAccount(context, ssoAccountName); + } + } catch (NextcloudFilesAppAccountNotFoundException | NoCurrentAccountSelectedException e) { DeckLog.logError(e); - callback.onError(e); } } - private void setAccount() throws NextcloudFilesAppAccountNotFoundException, NoCurrentAccountSelectedException { - ssoAccount = SingleAccountHelper.getCurrentSingleSignOnAccount(context); - } - public DeckAPI getDeckAPI() { return deckAPI; } @@ -54,18 +63,18 @@ public NextcloudServerAPI getNextcloudAPI() { return nextcloudAPI; } - public String getServerUrl() throws NextcloudFilesAppAccountNotFoundException, NoCurrentAccountSelectedException { - if (ssoAccount==null){ + public String getServerUrl(){ + if (ssoAccount == null) { setAccount(); } return ssoAccount.url; } - public String getApiPath(){ + public String getApiPath() { return DECK_API_ENDPOINT; } - public String getApiUrl() throws NextcloudFilesAppAccountNotFoundException, NoCurrentAccountSelectedException { - return getServerUrl()+getApiPath(); + public String getApiUrl() { + return getServerUrl() + getApiPath(); } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java index 13f16a951..50510aaf8 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/SyncManager.java @@ -16,6 +16,7 @@ import java.util.Collections; import java.util.Date; import java.util.List; +import java.util.concurrent.CountDownLatch; import it.niedermann.nextcloud.deck.DeckLog; import it.niedermann.nextcloud.deck.api.IResponseCallback; @@ -52,37 +53,60 @@ public class SyncManager { - private DataBaseAdapter dataBaseAdapter; private ServerAdapter serverAdapter; + public SyncManager(Activity sourceActivity) { + this(sourceActivity, sourceActivity); + } + public SyncManager(Context context, @Nullable Activity sourceActivity) { + this(context, sourceActivity, null); + } + public SyncManager(Context context, @Nullable Activity sourceActivity, String ssoAccountName) { if (context == null) { throw new IllegalArgumentException("Provide a valid context."); } Context applicationContext = context.getApplicationContext(); LastSyncUtil.init(applicationContext); dataBaseAdapter = new DataBaseAdapter(applicationContext); - this.serverAdapter = new ServerAdapter(applicationContext, sourceActivity); - } - - public SyncManager(Activity sourceActivity) { - this(sourceActivity, sourceActivity); + this.serverAdapter = new ServerAdapter(applicationContext, sourceActivity, ssoAccountName); } private void doAsync(Runnable r) { new Thread(r).start(); } - boolean synchronizeEverything() { - // TODO do some magic here - try { - Thread.sleep(2000); - return true; - } catch (InterruptedException e) { - e.printStackTrace(); + public boolean synchronizeEverything() { + List accounts = dataBaseAdapter.getAllAccountsDirectly(); + if (accounts.size() > 0){ + final BooleanResultHolder success = new BooleanResultHolder(); + CountDownLatch latch = new CountDownLatch(accounts.size()); + try { + for (Account account : accounts) { + new SyncManager(dataBaseAdapter.getContext(), null, account.getName()).synchronize(new IResponseCallback(account) { + @Override + public void onResponse(Boolean response) { + success.result = success.result && response.booleanValue() ; + latch.countDown(); + } + + @Override + public void onError(Throwable throwable) { + success.result = false; + super.onError(throwable); + latch.countDown(); + } + }); + } + latch.await(); + return success.result; + } catch (InterruptedException e) { + DeckLog.logError(e); + return false; + } } - return false; + return true; } public void synchronize(IResponseCallback responseCallback) { @@ -949,4 +973,9 @@ public void onResponse(Attachment response) { }); return liveData; } + + + private class BooleanResultHolder { + public boolean result = true; + } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/ServerAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/ServerAdapter.java index b59cbcc63..772afd701 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/ServerAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/ServerAdapter.java @@ -12,9 +12,6 @@ import androidx.annotation.Nullable; -import com.nextcloud.android.sso.exceptions.NextcloudFilesAppAccountNotFoundException; -import com.nextcloud.android.sso.exceptions.NoCurrentAccountSelectedException; - import java.io.File; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -64,15 +61,18 @@ public class ServerAdapter { private SharedPreferences lastSyncPref; public ServerAdapter(Context applicationContext, @Nullable Activity sourceActivity) { + this(applicationContext, sourceActivity, null); + } + public ServerAdapter(Context applicationContext, @Nullable Activity sourceActivity, String ssoAccountName) { this.applicationContext = applicationContext; this.sourceActivity = sourceActivity; prefKeyWifiOnly = applicationContext.getResources().getString(R.string.pref_key_wifi_only); - provider = new ApiProvider(applicationContext); + provider = new ApiProvider(applicationContext, ssoAccountName); lastSyncPref = applicationContext.getSharedPreferences( applicationContext.getString(R.string.shared_preference_last_sync), Context.MODE_PRIVATE); } - public String getServerUrl() throws NextcloudFilesAppAccountNotFoundException, NoCurrentAccountSelectedException { + public String getServerUrl() { return provider.getServerUrl(); } @@ -80,7 +80,7 @@ public String getApiPath() { return provider.getApiPath(); } - public String getApiUrl() throws NextcloudFilesAppAccountNotFoundException, NoCurrentAccountSelectedException { + public String getApiUrl() { return provider.getApiUrl(); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java index 684096318..60e05708c 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java @@ -290,11 +290,11 @@ public void updateAccount(Account account) { } public LiveData readAccount(long id) { - return LiveDataHelper.onlyIfChanged(db.getAccountDao().selectById(id)); + return LiveDataHelper.onlyIfChanged(db.getAccountDao().getAccountById(id)); } public LiveData readAccount(String name) { - return LiveDataHelper.onlyIfChanged(db.getAccountDao().selectById(name)); + return LiveDataHelper.onlyIfChanged(db.getAccountDao().getAccountByName(name)); } public Account readAccountDirectly(long id) { @@ -302,7 +302,7 @@ public Account readAccountDirectly(long id) { } public LiveData> readAccounts() { - return LiveDataHelper.onlyIfChanged(db.getAccountDao().selectAll()); + return LiveDataHelper.onlyIfChanged(db.getAccountDao().getAllAccounts()); } public LiveData> getBoards(long accountId) { @@ -520,6 +520,10 @@ public Account getAccountByIdDirectly(long accountId) { return db.getAccountDao().getAccountByIdDirectly(accountId); } + public List getAllAccountsDirectly() { + return db.getAccountDao().getAllAccountsDirectly(); + } + public User getUserByLocalIdDirectly(long localUserId) { return db.getUserDao().getUserByLocalIdDirectly(localUserId); } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/AccountDao.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/AccountDao.java index 56ac92008..0e56c7e0a 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/AccountDao.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/AccountDao.java @@ -10,10 +10,6 @@ @Dao public interface AccountDao extends GenericDao { - - @Query("SELECT * FROM account") - LiveData> getAccounts(); - @Query("SELECT count(*) FROM account") int countAccountsDirectly(); @@ -27,11 +23,14 @@ public interface AccountDao extends GenericDao { Account getAccountByIdDirectly(long id); @Query("SELECT * from account where id = :id") - LiveData selectById(long id); + LiveData getAccountById(long id); @Query("SELECT * from account where name = :name") - LiveData selectById(String name); + LiveData getAccountByName(String name); + + @Query("SELECT * from account") + LiveData> getAllAccounts(); @Query("SELECT * from account") - LiveData> selectAll(); + List getAllAccountsDirectly(); } \ No newline at end of file