From a5dc26c8390c2bade568a4d1955e46b856cd4860 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E5=8B=A4=E6=B0=91?= Date: Sat, 27 Jul 2024 17:57:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=85=E9=99=A4=E7=BC=93=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/app/common/CrashHandler.java | 5 +- .../android/app/common/FileUtils.java | 41 +++++++++ .../android/app/common/StorageUtils.java | 83 +++++++++++++++++++ .../android/app/ui/FriendsActivity.kt | 4 +- .../android/app/ui/SettingActivity.kt | 37 +++++++-- app/src/main/res/drawable/bg_ff02a7_25.xml | 9 ++ app/src/main/res/layout/activity_setting.xml | 13 +++ 7 files changed, 180 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/com/xuqinmin/android/app/common/FileUtils.java create mode 100644 app/src/main/java/com/xuqinmin/android/app/common/StorageUtils.java create mode 100644 app/src/main/res/drawable/bg_ff02a7_25.xml diff --git a/app/src/main/java/com/xuqinmin/android/app/common/CrashHandler.java b/app/src/main/java/com/xuqinmin/android/app/common/CrashHandler.java index dcf6f70..eca396d 100644 --- a/app/src/main/java/com/xuqinmin/android/app/common/CrashHandler.java +++ b/app/src/main/java/com/xuqinmin/android/app/common/CrashHandler.java @@ -5,6 +5,8 @@ import android.os.Environment; import android.os.SystemClock; import android.util.Log; +import com.xuqm.base.common.AppManager; + import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; @@ -56,8 +58,7 @@ public class CrashHandler implements Thread.UncaughtExceptionHandler { } else { SystemClock.sleep(2000); // 退出程序 - android.os.Process.killProcess(android.os.Process.myPid()); - System.exit(1); + AppManager.getInstance().exit(); } } diff --git a/app/src/main/java/com/xuqinmin/android/app/common/FileUtils.java b/app/src/main/java/com/xuqinmin/android/app/common/FileUtils.java new file mode 100644 index 0000000..4d76dad --- /dev/null +++ b/app/src/main/java/com/xuqinmin/android/app/common/FileUtils.java @@ -0,0 +1,41 @@ +package com.xuqinmin.android.app.common; + +import com.xuqm.base.common.FileHelper; + +import java.io.File; + +public class FileUtils { + public static long getFolderSize(File folder) { + if (folder.isFile()) return folder.length(); + else { + long length = 0; + File[] files = folder.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isFile()) { + length += file.length(); + } else { + length += getFolderSize(file); + } + } + } + return length; + } + } + + public static void clearFolder(File folder) { + if (folder.isFile()) FileHelper.delete(folder); + else { + File[] files = folder.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isFile()) { + FileHelper.delete(folder); + } else { + clearFolder(file); + } + } + } + } + } +} diff --git a/app/src/main/java/com/xuqinmin/android/app/common/StorageUtils.java b/app/src/main/java/com/xuqinmin/android/app/common/StorageUtils.java new file mode 100644 index 0000000..9b0b1fa --- /dev/null +++ b/app/src/main/java/com/xuqinmin/android/app/common/StorageUtils.java @@ -0,0 +1,83 @@ +package com.xuqinmin.android.app.common; + +import static android.os.Environment.MEDIA_MOUNTED; + +import android.content.Context; +import android.os.Environment; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; + +/** + * Provides application storage paths + *

+ * See https://github.com/nostra13/Android-Universal-Image-Loader + * + * @author Sergey Tarasevich (nostra13[at]gmail[dot]com) + * @since 1.0.0 + */ +public class StorageUtils { + + private static final Logger LOG = LoggerFactory.getLogger("StorageUtils"); + private static final String INDIVIDUAL_DIR_NAME = "video-cache"; + + /** + * Returns individual application cache directory (for only video caching from Proxy). Cache directory will be + * created on SD card ("/Android/data/[app_package_name]/cache/video-cache") if card is mounted . + * Else - Android defines cache directory on device's file system. + * + * @param context Application context + * @return Cache {@link File directory} + */ + public static File getIndividualCacheDirectory(Context context) { + File cacheDir = getCacheDirectory(context, true); + return new File(cacheDir, INDIVIDUAL_DIR_NAME); + } + + /** + * Returns application cache directory. Cache directory will be created on SD card + * ("/Android/data/[app_package_name]/cache") (if card is mounted and app has appropriate permission) or + * on device's file system depending incoming parameters. + * + * @param context Application context + * @param preferExternal Whether prefer external location for cache + * @return Cache {@link File directory}.
+ * NOTE: Can be null in some unpredictable cases (if SD card is unmounted and + * {@link Context#getCacheDir() Context.getCacheDir()} returns null). + */ + private static File getCacheDirectory(Context context, boolean preferExternal) { + File appCacheDir = null; + String externalStorageState; + try { + externalStorageState = Environment.getExternalStorageState(); + } catch (NullPointerException e) { // (sh)it happens + externalStorageState = ""; + } + if (preferExternal && MEDIA_MOUNTED.equals(externalStorageState)) { + appCacheDir = getExternalCacheDir(context); + } + if (appCacheDir == null) { + appCacheDir = context.getCacheDir(); + } + if (appCacheDir == null) { + String cacheDirPath = "/data/data/" + context.getPackageName() + "/cache/"; + LOG.warn("Can't define system cache directory! '" + cacheDirPath + "%s' will be used."); + appCacheDir = new File(cacheDirPath); + } + return appCacheDir; + } + + private static File getExternalCacheDir(Context context) { + File dataDir = new File(new File(Environment.getExternalStorageDirectory(), "Android"), "data"); + File appCacheDir = new File(new File(dataDir, context.getPackageName()), "cache"); + if (!appCacheDir.exists()) { + if (!appCacheDir.mkdirs()) { + LOG.warn("Unable to create external cache directory"); + return null; + } + } + return appCacheDir; + } +} diff --git a/app/src/main/java/com/xuqinmin/android/app/ui/FriendsActivity.kt b/app/src/main/java/com/xuqinmin/android/app/ui/FriendsActivity.kt index d2bd6b5..11c6bb2 100644 --- a/app/src/main/java/com/xuqinmin/android/app/ui/FriendsActivity.kt +++ b/app/src/main/java/com/xuqinmin/android/app/ui/FriendsActivity.kt @@ -69,9 +69,9 @@ class FriendsActivity : else -> Color.parseColor("#FFEA2D2D") } ) - holder.setBackgroundColor( + holder.setBackgroundResource( R.id.btn, - if (item.status == 0) Color.parseColor("#FFCFD4E0") else Color.parseColor("#FFFF02A7") + if (item.status == 0) R.drawable.bg_cfd4e0_25 else R.drawable.bg_ff02a7_25 ) holder.setText( R.id.btn, if (viewModel.type == 0) "Unfollow" else { diff --git a/app/src/main/java/com/xuqinmin/android/app/ui/SettingActivity.kt b/app/src/main/java/com/xuqinmin/android/app/ui/SettingActivity.kt index 0738a19..0909a15 100644 --- a/app/src/main/java/com/xuqinmin/android/app/ui/SettingActivity.kt +++ b/app/src/main/java/com/xuqinmin/android/app/ui/SettingActivity.kt @@ -4,15 +4,15 @@ import android.content.Intent import android.net.Uri import android.os.Bundle import com.bigkoo.alertview.AlertView +import com.bumptech.glide.Glide import com.xuqinmin.android.app.R +import com.xuqinmin.android.app.common.FileUtils +import com.xuqinmin.android.app.common.StorageUtils import com.xuqinmin.android.app.databinding.ActivitySettingBinding import com.xuqinmin.android.app.db.XuqmDbHelper import com.xuqinmin.android.app.ui.dialog.DialogDelete import com.xuqm.base.common.AppManager -import com.xuqm.base.common.GsonImplHelp -import com.xuqm.base.common.SHARE_LOGIN_OBJ import com.xuqm.base.extensions.clearForPreferences -import com.xuqm.base.extensions.putString import com.xuqm.base.ui.BaseActivity class SettingActivity : BaseActivity() { @@ -48,9 +48,12 @@ class SettingActivity : BaseActivity() { ) { _, position -> when (position) { 0 -> { - clearForPreferences() - startActivity(Intent(mContext, WelcomeActivity::class.java)) - AppManager.getInstance().exitWithOutLast() + Glide.get(mContext).clearMemory() + Thread { + Glide.get(mContext).clearDiskCache() + }.start() + FileUtils.clearFolder(StorageUtils.getIndividualCacheDirectory(mContext)) + setLength() } } }.show() @@ -79,8 +82,7 @@ class SettingActivity : BaseActivity() { try { startActivity( Intent( - Intent.ACTION_VIEW, - Uri.parse("market://details?id=$packageName") + Intent.ACTION_VIEW, Uri.parse("market://details?id=$packageName") ) ) } catch (e: android.content.ActivityNotFoundException) { @@ -92,5 +94,24 @@ class SettingActivity : BaseActivity() { ) } } + setLength() + } + + private var l = 0L + private fun setLength() { + val length = + FileUtils.getFolderSize(StorageUtils.getIndividualCacheDirectory(mContext)) + FileUtils.getFolderSize( + Glide.getPhotoCacheDir(mContext) + ) + + binding.length.text = if (length < 1024 * 1024 * 1024) { + "${length / 1024 / 1024} M" + } else { + "${length / 1024 / 1024 / 1024} G" + } + if (l != length){ + l = length + setLength() + } } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_ff02a7_25.xml b/app/src/main/res/drawable/bg_ff02a7_25.xml new file mode 100644 index 0000000..2abd734 --- /dev/null +++ b/app/src/main/res/drawable/bg_ff02a7_25.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml index 739a338..a0b7d92 100644 --- a/app/src/main/res/layout/activity_setting.xml +++ b/app/src/main/res/layout/activity_setting.xml @@ -209,8 +209,21 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toEndOf="@+id/img3" app:layout_constraintTop_toTopOf="parent" /> +