From 9d356e7d9d097c3410dc201437b04be3ff0fd7f2 Mon Sep 17 00:00:00 2001 From: gdlbo <41114720+gdlbo@users.noreply.github.com> Date: Fri, 17 Jun 2022 18:21:10 +0300 Subject: [PATCH] added auto cleaning cache --- .../java/com/vk/core/ui/themes/VKTheme.java | 1 + .../java/ru/vtosters/lite/foaf/FoafBase.java | 2 - .../ru/vtosters/lite/ui/PreferencesUtil.java | 14 +++ .../lite/ui/fragments/MessagesFragment.java | 2 +- .../lite/ui/fragments/OtherFragment.java | 2 +- .../lite/ui/fragments/VTSettings.java | 9 ++ .../ru/vtosters/lite/utils/CacheUtils.java | 88 +++++++++++++++++++ .../java/ru/vtosters/lite/utils/Globals.java | 27 ------ .../ru/vtosters/lite/utils/Preferences.java | 24 ++++- smali/res/values-ru/strings.xml | 3 + smali/res/values/strings.xml | 3 + 11 files changed, 143 insertions(+), 32 deletions(-) create mode 100644 app/src/main/java/ru/vtosters/lite/utils/CacheUtils.java diff --git a/app/src/main/java/com/vk/core/ui/themes/VKTheme.java b/app/src/main/java/com/vk/core/ui/themes/VKTheme.java index a17b16fb4..ef3c65423 100644 --- a/app/src/main/java/com/vk/core/ui/themes/VKTheme.java +++ b/app/src/main/java/com/vk/core/ui/themes/VKTheme.java @@ -1,6 +1,7 @@ package com.vk.core.ui.themes; import com.vk.s.R; + import ru.vtosters.lite.utils.Themes; public enum VKTheme { diff --git a/app/src/main/java/ru/vtosters/lite/foaf/FoafBase.java b/app/src/main/java/ru/vtosters/lite/foaf/FoafBase.java index 1967409ae..1064ab36c 100644 --- a/app/src/main/java/ru/vtosters/lite/foaf/FoafBase.java +++ b/app/src/main/java/ru/vtosters/lite/foaf/FoafBase.java @@ -4,7 +4,6 @@ import static android.widget.Toast.LENGTH_SHORT; import static android.widget.Toast.makeText; import static ru.vtosters.lite.utils.Globals.getIdentifier; import static ru.vtosters.lite.utils.Globals.getString; -import static ru.vtosters.lite.utils.Preferences.getDateFormat; import static ru.vtosters.lite.utils.Proxy.getApiCom; import static ru.vtosters.lite.utils.Proxy.proxy; @@ -15,7 +14,6 @@ import android.support.v7.app.AlertDialog; import androidx.exifinterface.media.ExifInterface; import com.vk.core.dialogs.alert.VkAlertDialog; -import com.vtosters.lite.R; import java.io.IOException; import java.text.ParseException; diff --git a/app/src/main/java/ru/vtosters/lite/ui/PreferencesUtil.java b/app/src/main/java/ru/vtosters/lite/ui/PreferencesUtil.java index 5c12297e7..12dc88dd0 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/PreferencesUtil.java +++ b/app/src/main/java/ru/vtosters/lite/ui/PreferencesUtil.java @@ -45,6 +45,20 @@ public class PreferencesUtil { fragment.ay().d(preference); // fragment.getPreferenceScreen().addPreference(preference) } + public static void addListPreferenceIcon(MaterialPreferenceToolbarFragment fragment, String key, String def, CharSequence title, String icon, CharSequence summary, CharSequence[] entries, CharSequence[] entriesValue) { + ListPreference preference = new ListPreference(getContext()); + preference.a(entries); + preference.b(entriesValue); + preference.b(summary); // setSummary + preference.c(title); // setTitle + preference.a(title); // setDialogTitle + preference.d(key); // setKey + preference.b(def); // setDefaultValue + if (icon != null) + preference.a(setTint(getContext(), getDrawable(getContext(), icon))); // preference.setIcon + fragment.ay().d(preference); // fragment.getPreferenceScreen().addPreference(preference) + } + public static void addMaterialSwitchPreference(MaterialPreferenceToolbarFragment materialPreferenceToolbarFragment, String key, CharSequence title, CharSequence summary, boolean defValue) { MaterialSwitchPreference materialSwitchPreference = new MaterialSwitchPreference(getContext()); materialSwitchPreference.c(title); // setTitle diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/MessagesFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/MessagesFragment.java index 894a71372..74d929477 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/MessagesFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/MessagesFragment.java @@ -1,6 +1,6 @@ package ru.vtosters.lite.ui.fragments; -import static ru.vtosters.lite.utils.Globals.deleteCache; +import static ru.vtosters.lite.utils.CacheUtils.deleteCache; import static ru.vtosters.lite.utils.Globals.getContext; import static ru.vtosters.lite.utils.Globals.restartApplicationWithTimer; diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/OtherFragment.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/OtherFragment.java index 6716aa09a..6502797af 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/OtherFragment.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/OtherFragment.java @@ -2,7 +2,7 @@ package ru.vtosters.lite.ui.fragments; import static android.widget.Toast.LENGTH_SHORT; import static android.widget.Toast.makeText; -import static ru.vtosters.lite.utils.Globals.deleteCache; +import static ru.vtosters.lite.utils.CacheUtils.deleteCache; import static ru.vtosters.lite.utils.Globals.getContext; import static ru.vtosters.lite.utils.Globals.getString; import static ru.vtosters.lite.utils.Globals.getUserToken; diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java index 5fed102f4..0b9fdc5d4 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java @@ -8,6 +8,7 @@ import static ru.vtosters.lite.ui.fragments.multiaccount.MultiAccountManager.wit import static ru.vtosters.lite.ui.fragments.multiaccount.MultiAccountManager.workingAccounts; import static ru.vtosters.lite.utils.About.getBuildNumber; import static ru.vtosters.lite.utils.About.getCommitLink; +import static ru.vtosters.lite.utils.CacheUtils.humanReadableByteCountBin; import static ru.vtosters.lite.utils.Globals.drawableFromUrl; import static ru.vtosters.lite.utils.Globals.edit; import static ru.vtosters.lite.utils.Globals.getContext; @@ -62,6 +63,7 @@ import ru.vtosters.lite.ui.fragments.dockbar.DockBarFragment; import ru.vtosters.lite.ui.fragments.dockbar.DockBarManager; import ru.vtosters.lite.ui.fragments.multiaccount.MultiAccountFragment; import ru.vtosters.lite.ui.fragments.tgstickers.StickersFragment; +import ru.vtosters.lite.utils.CacheUtils; public class VTSettings extends MaterialPreferenceToolbarFragment { @@ -308,6 +310,13 @@ public class VTSettings extends MaterialPreferenceToolbarFragment { return false; }); + PreferencesUtil.addListPreferenceIcon(this, "clearcache", "Default", getString("autoclearcache"), "ic_delete_24", getString("autoclearcachesumm") + " " + humanReadableByteCountBin(CacheUtils.getInstance().size), new CharSequence[]{ + getString("autoclearcachedisabled"), "100 MB", "500 MB", "1 GB", "2 GB", "5 GB" + }, new String[]{ + "Default", "100mb", "500mb", "1gb", "2gb", "5gb" + }); + + PreferencesUtil.addPreference(this, "", getString("vtlother"), othersumm, "ic_more_24", preference -> { Context context = getContext(); Intent a2 = new Navigator(OtherFragment.class).a(context); diff --git a/app/src/main/java/ru/vtosters/lite/utils/CacheUtils.java b/app/src/main/java/ru/vtosters/lite/utils/CacheUtils.java new file mode 100644 index 000000000..2fd07bf3d --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/utils/CacheUtils.java @@ -0,0 +1,88 @@ +package ru.vtosters.lite.utils; + +import static ru.vtosters.lite.utils.Globals.getContext; +import static ru.vtosters.lite.utils.Globals.sendToast; +import static ru.vtosters.lite.utils.Preferences.dev; +import static ru.vtosters.lite.utils.Preferences.getSizeForDelete; + +import android.annotation.SuppressLint; + +import java.io.File; +import java.text.CharacterIterator; +import java.text.StringCharacterIterator; +import java.util.Objects; + +public class CacheUtils { + private static CacheUtils sInstance = new CacheUtils(); + public long size = 0; + + public static CacheUtils getInstance() { + if (sInstance == null) + sInstance = new CacheUtils(); + return sInstance; + } + + public void autoCleaningCache() { + size = getDirSize(getContext().getCacheDir()); + + if(size >= getSizeForDelete()) { + if(dev()) sendToast("Кэш очищен"); + deleteCache(); + size = 0; + } + } + + public long getDirSize(File dir){ + long size = 0; + for (File file : Objects.requireNonNull(dir.listFiles())) { + if (file != null && file.isDirectory()) { + size += getDirSize(file); + } else if (file != null && file.isFile()) { + size += file.length(); + } + } + return size; + } + + public static void deleteCache() { + try { + File dir = getContext().getCacheDir(); + deleteDir(dir); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static boolean deleteDir(File dir) { + if (dir != null && dir.isDirectory()) { + String[] children = dir.list(); + for (int i=0; i < Objects.requireNonNull(children).length; i++) { + boolean success = deleteDir(new File(dir, children[i])); + if (!success) { + return false; + } + } + return dir.delete(); + } else if(dir!= null && dir.isFile()) { + return dir.delete(); + } else { + return false; + } + } + + @SuppressLint("DefaultLocale") + public static String humanReadableByteCountBin(long bytes) { + long absB = bytes == Long.MIN_VALUE ? Long.MAX_VALUE : Math.abs(bytes); + if (absB < 1024) { + return bytes + " B"; + } + long value = absB; + CharacterIterator ci = new StringCharacterIterator("KMGTPE"); + for (int i = 40; i >= 0 && absB > 0xfffccccccccccccL >> i; i -= 10) { + value >>= 10; + ci.next(); + } + value *= Long.signum(bytes); + return String.format("%.1f %cB", value / 1024.0, ci.current()); + } +} diff --git a/app/src/main/java/ru/vtosters/lite/utils/Globals.java b/app/src/main/java/ru/vtosters/lite/utils/Globals.java index 1faa0c90e..9005b1fb4 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/Globals.java +++ b/app/src/main/java/ru/vtosters/lite/utils/Globals.java @@ -42,7 +42,6 @@ import com.vtosters.lite.api.ExtendedUserProfile; import com.vtosters.lite.auth.VKAccountManager; import com.vtosters.lite.im.ImEngineProvider; -import java.io.File; import java.io.InputStream; import java.lang.reflect.Method; import java.net.URL; @@ -50,7 +49,6 @@ import java.net.URLConnection; import java.util.ArrayList; import java.util.List; import java.util.Locale; -import java.util.Objects; import ru.vtosters.lite.ui.dialogs.DisableBattery; import ru.vtosters.lite.ui.dialogs.InstallGMS; @@ -202,31 +200,6 @@ public class Globals { return null; } // Getting the global context through reflection to use context on application initialization - public static void deleteCache() { - try { - File dir = getContext().getCacheDir(); - deleteDir(dir); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static boolean deleteDir(File dir) { - if (dir != null && dir.isDirectory()) { - String[] children = dir.list(); - for (int i=0; i < Objects.requireNonNull(children).length; i++) { - boolean success = deleteDir(new File(dir, children[i])); - if (!success) { - return false; - } - } - return dir.delete(); - } else if(dir!= null && dir.isFile()) { - return dir.delete(); - } else { - return false; - } - } public static boolean isGmsInstalled() { try { getContext().getPackageManager().getPackageInfo("com.google.android.gms", 0); diff --git a/app/src/main/java/ru/vtosters/lite/utils/Preferences.java b/app/src/main/java/ru/vtosters/lite/utils/Preferences.java index 0c53e9647..44a02c7a4 100644 --- a/app/src/main/java/ru/vtosters/lite/utils/Preferences.java +++ b/app/src/main/java/ru/vtosters/lite/utils/Preferences.java @@ -1,9 +1,11 @@ package ru.vtosters.lite.utils; import static android.os.Build.VERSION; +import static java.lang.Long.MAX_VALUE; import static ru.vtosters.lite.f0x1d.VTVerifications.hasPrometheus; import static ru.vtosters.lite.f0x1d.VTVerifications.isVerified; import static ru.vtosters.lite.ui.fragments.multiaccount.MultiAccountManager.migrate; +import static ru.vtosters.lite.utils.CacheUtils.getInstance; import static ru.vtosters.lite.utils.DeletedMessagesHandler.reloadMessagesList; import static ru.vtosters.lite.utils.Globals.fixGapps; import static ru.vtosters.lite.utils.Globals.getContext; @@ -58,13 +60,16 @@ public class Preferences { LoadLibrary("vkopustest"); } systemThemeChanger(); + getInstance().autoCleaningCache(); } // VK Init public static void forceOffline() { + setupFilters(); + getInstance().autoCleaningCache(); + if (setoffline() && !offline()) { Users.b(); } - setupFilters(); } public static boolean getBoolValue(String key, Boolean value) { @@ -438,6 +443,23 @@ public class Preferences { } } + public static long getSizeForDelete() { + switch (getPrefsValue("clearcache")) { + case "100mb": + return 104857600L; + case "500mb": + return 524288000L; + case "1gb": + return 1073741824L; + case "2gb": + return 2147483648L; + case "5gb": + return 5368709120L; + default: + return MAX_VALUE; + } + } + public static String nullOnline() { return getString("onlineNull"); } diff --git a/smali/res/values-ru/strings.xml b/smali/res/values-ru/strings.xml index f5d01e10c..3fb4e6986 100644 --- a/smali/res/values-ru/strings.xml +++ b/smali/res/values-ru/strings.xml @@ -4201,6 +4201,9 @@ Socks Прокси Static Домен Сообщить о баге + Авто очистка кэша + Размер кэша: + Не очищать кэш Репорты багов помогают нам их исправлять Перезапустите приложение Сохраненные сообщения diff --git a/smali/res/values/strings.xml b/smali/res/values/strings.xml index 14b1e4524..4b00926d8 100644 --- a/smali/res/values/strings.xml +++ b/smali/res/values/strings.xml @@ -4326,6 +4326,9 @@ You need to restart the application to apply proxy settings" Socks Proxy Static Domain Report a bug + Auto-cleaning app cache + Cache size: + "Don't clear cache" Bug reports help us fix them Please, restart app Saved messages