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