diff --git a/app/src/main/java/org/fdroid/fdroid/CleanCacheService.java b/app/src/main/java/org/fdroid/fdroid/CleanCacheService.java index 48d5910c3..0838b6770 100644 --- a/app/src/main/java/org/fdroid/fdroid/CleanCacheService.java +++ b/app/src/main/java/org/fdroid/fdroid/CleanCacheService.java @@ -1,9 +1,13 @@ package org.fdroid.fdroid; +import android.app.AlarmManager; import android.app.IntentService; +import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Process; +import android.os.SystemClock; +import android.util.Log; import org.apache.commons.io.FileUtils; @@ -18,9 +22,26 @@ import java.io.File; public class CleanCacheService extends IntentService { public static final String TAG = "CleanCacheService"; - public static void start(Context context) { + /** + * Schedule or cancel this service to update the app index, according to the + * current preferences. Should be called a) at boot, b) if the preference + * is changed, or c) on startup, in case we get upgraded. + */ + public static void schedule(Context context) { + long keepTime = Preferences.get().getKeepCacheTime(); + long interval = 604800000; // 1 day + if (keepTime < interval) { + interval = keepTime * 1000; + } + Log.i(TAG, "schedule " + keepTime + " " + interval); + Intent intent = new Intent(context, CleanCacheService.class); - context.startService(intent); + PendingIntent pending = PendingIntent.getService(context, 0, intent, 0); + + AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + alarm.cancel(pending); + alarm.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, + SystemClock.elapsedRealtime() + 5000, interval, pending); } public CleanCacheService() { @@ -30,14 +51,7 @@ public class CleanCacheService extends IntentService { @Override protected void onHandleIntent(Intent intent) { Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST); - - int cachetime; - if (Preferences.get().shouldCacheApks()) { - cachetime = Integer.MAX_VALUE; - } else { - cachetime = 3600; // keep for 1 hour to allow resumable downloads - } - Utils.clearOldFiles(Utils.getApkCacheDir(this), cachetime); + Utils.clearOldFiles(Utils.getApkCacheDir(this), Preferences.get().getKeepCacheTime()); deleteStrayIndexFiles(); } diff --git a/app/src/main/java/org/fdroid/fdroid/FDroidApp.java b/app/src/main/java/org/fdroid/fdroid/FDroidApp.java index 4213dce38..c774fccd9 100644 --- a/app/src/main/java/org/fdroid/fdroid/FDroidApp.java +++ b/app/src/main/java/org/fdroid/fdroid/FDroidApp.java @@ -221,7 +221,7 @@ public class FDroidApp extends Application { } }); - CleanCacheService.start(this); + CleanCacheService.schedule(this); UpdateService.schedule(getApplicationContext()); bluetoothAdapter = getBluetoothAdapter(); diff --git a/app/src/main/java/org/fdroid/fdroid/Preferences.java b/app/src/main/java/org/fdroid/fdroid/Preferences.java index 326ac2107..160e655d3 100644 --- a/app/src/main/java/org/fdroid/fdroid/Preferences.java +++ b/app/src/main/java/org/fdroid/fdroid/Preferences.java @@ -32,9 +32,11 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh private static final String TAG = "Preferences"; + private final Context context; private final SharedPreferences preferences; private Preferences(Context context) { + this.context = context; preferences = PreferenceManager.getDefaultSharedPreferences(context); preferences.registerOnSharedPreferenceChangeListener(this); if (preferences.getString(PREF_LOCAL_REPO_NAME, null) == null) { @@ -52,7 +54,7 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh public static final String PREF_INCOMP_VER = "incompatibleVersions"; public static final String PREF_THEME = "theme"; public static final String PREF_IGN_TOUCH = "ignoreTouchscreen"; - public static final String PREF_CACHE_APK = "cacheDownloaded"; + public static final String PREF_KEEP_CACHE_TIME = "keepCacheFor"; public static final String PREF_UNSTABLE_UPDATES = "unstableUpdates"; public static final String PREF_EXPERT = "expert"; public static final String PREF_PRIVILEGED_INSTALLER = "privilegedInstaller"; @@ -72,7 +74,7 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh private static final int DEFAULT_UPD_HISTORY = 14; private static final boolean DEFAULT_PRIVILEGED_INSTALLER = false; //private static final boolean DEFAULT_LOCAL_REPO_BONJOUR = true; - private static final boolean DEFAULT_CACHE_APK = false; + private static final long DEFAULT_KEEP_CACHE_SECONDS = 86400; // one day private static final boolean DEFAULT_UNSTABLE_UPDATES = false; //private static final boolean DEFAULT_LOCAL_REPO_HTTPS = false; private static final boolean DEFAULT_INCOMP_VER = false; @@ -139,8 +141,32 @@ public final class Preferences implements SharedPreferences.OnSharedPreferenceCh PreferencesCompat.apply(preferences.edit().putBoolean(PREF_POST_PRIVILEGED_INSTALL, postInstall)); } - public boolean shouldCacheApks() { - return preferences.getBoolean(PREF_CACHE_APK, DEFAULT_CACHE_APK); + /** + * Old preference replaced by {@link #PREF_KEEP_CACHE_TIME} + */ + private static final String PREF_CACHE_APK = "cacheDownloaded"; + + /** + * Time in seconds to keep cached files. Anything that has been around longer will be deleted + */ + public long getKeepCacheTime() { + String value = preferences.getString(PREF_KEEP_CACHE_TIME, String.valueOf(DEFAULT_KEEP_CACHE_SECONDS)); + + if (preferences.contains(PREF_CACHE_APK)) { + if (preferences.getBoolean(PREF_CACHE_APK, false)) { + value = context.getString(R.string.keep_forever); + } + SharedPreferences.Editor editor = preferences.edit(); + editor.remove(PREF_CACHE_APK); + editor.putString(PREF_KEEP_CACHE_TIME, value); + PreferencesCompat.apply(editor); + } + + try { + return Long.parseLong(value); + } catch (NumberFormatException e) { + return DEFAULT_KEEP_CACHE_SECONDS; + } } public boolean getUnstableUpdates() { diff --git a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java b/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java index a150db286..5043fc914 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java +++ b/app/src/main/java/org/fdroid/fdroid/views/fragments/PreferencesFragment.java @@ -39,7 +39,7 @@ public class PreferencesFragment extends PreferenceFragment Preferences.PREF_IGN_TOUCH, Preferences.PREF_LOCAL_REPO_NAME, Preferences.PREF_LANGUAGE, - Preferences.PREF_CACHE_APK, + Preferences.PREF_KEEP_CACHE_TIME, Preferences.PREF_EXPERT, Preferences.PREF_PRIVILEGED_INSTALLER, Preferences.PREF_ENABLE_PROXY, @@ -143,8 +143,8 @@ public class PreferencesFragment extends PreferenceFragment } break; - case Preferences.PREF_CACHE_APK: - checkSummary(key, R.string.cache_downloaded_on); + case Preferences.PREF_KEEP_CACHE_TIME: + entrySummary(key); break; case Preferences.PREF_EXPERT: diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml index de5f1f86b..c575ea5a4 100644 --- a/app/src/main/res/values/array.xml +++ b/app/src/main/res/values/array.xml @@ -10,6 +10,15 @@ @string/interval_2w + + @string/keep_hour + @string/keep_day + @string/keep_week + @string/keep_month + @string/keep_year + @string/keep_forever + + @string/theme_light @string/theme_dark diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml index d6a202fab..c7d387726 100644 --- a/app/src/main/res/values/donottranslate.xml +++ b/app/src/main/res/values/donottranslate.xml @@ -23,6 +23,15 @@ 336 + + 3600 + 86400 + 604800 + 2592000 + 31449600 + 2147483647 + + light dark diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d2203a659..2b2cb2c8b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,8 +10,8 @@ by Delete Enable NFC Send… - Cache packages - Keep downloaded package files on device + Keep cached apps + Keep downloaded APK files on device Updates Unstable updates Suggest updates to unstable versions @@ -383,6 +383,13 @@ Weekly Every 2 weeks + 1 Hour + 1 Day + 1 Week + 1 Month + 1 Year + Forever + Light Dark Night diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 4b2c7d14f..31fb9aee9 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -73,9 +73,10 @@ android:dependency="enableProxy" /> - +