From ad65764004faa5f502f57a77dde7dfc923112239 Mon Sep 17 00:00:00 2001 From: stefan-niedermann Date: Fri, 13 Dec 2019 20:41:28 +0100 Subject: Implement basic background sync job --- .../deck/persistence/sync/SyncManager.java | 2 +- .../deck/persistence/sync/SyncWorker.java | 40 +++++++++++++++++++--- .../nextcloud/deck/ui/DrawerActivity.java | 13 +------ .../deck/ui/about/AboutFragmentCreditsTab.java | 15 ++++++++ .../niedermann/nextcloud/deck/util/DateUtil.java | 6 +++- .../main/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(-) (limited to 'app/src') 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 @@ public class SyncManager { } 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 class SyncWorker extends Worker { @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.appcompat.widget.Toolbar; 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 com.nextcloud.android.sso.ui.UiExceptionManager; 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 abstract class DrawerActivity extends AppCompatActivity implements Naviga 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.api.IResponseCallback; 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 class AboutFragmentCreditsTab extends Fragment { 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 class AboutFragmentCreditsTab extends Fragment { 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 final class DateUtil { } 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 final class DateUtil { 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: -- cgit v1.2.3