mirror of
https://github.com/signalapp/Signal-Android.git
synced 2025-12-21 11:38:36 +00:00
Add debugging info around used disk space.
This commit is contained in:
committed by
Michelle Tang
parent
2fad52abdc
commit
72206b9523
@@ -30,6 +30,7 @@ import com.google.android.gms.security.ProviderInstaller;
|
|||||||
import org.conscrypt.ConscryptSignal;
|
import org.conscrypt.ConscryptSignal;
|
||||||
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.EventBus;
|
||||||
import org.signal.aesgcmprovider.AesGcmProvider;
|
import org.signal.aesgcmprovider.AesGcmProvider;
|
||||||
|
import org.signal.core.util.DiskUtil;
|
||||||
import org.signal.core.util.MemoryTracker;
|
import org.signal.core.util.MemoryTracker;
|
||||||
import org.signal.core.util.concurrent.AnrDetector;
|
import org.signal.core.util.concurrent.AnrDetector;
|
||||||
import org.signal.core.util.concurrent.SignalExecutors;
|
import org.signal.core.util.concurrent.SignalExecutors;
|
||||||
@@ -299,7 +300,7 @@ public class ApplicationContext extends Application implements AppForegroundObse
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void checkFreeDiskSpace() {
|
public void checkFreeDiskSpace() {
|
||||||
long availableBytes = BackupRepository.INSTANCE.getFreeStorageSpace().getBytes();
|
long availableBytes = DiskUtil.getAvailableSpace(getApplicationContext()).getBytes();
|
||||||
SignalStore.backup().setSpaceAvailableOnDiskBytes(availableBytes);
|
SignalStore.backup().setSpaceAvailableOnDiskBytes(availableBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import org.signal.core.util.Base64
|
|||||||
import org.signal.core.util.Base64.decodeBase64OrThrow
|
import org.signal.core.util.Base64.decodeBase64OrThrow
|
||||||
import org.signal.core.util.ByteSize
|
import org.signal.core.util.ByteSize
|
||||||
import org.signal.core.util.CursorUtil
|
import org.signal.core.util.CursorUtil
|
||||||
|
import org.signal.core.util.DiskUtil
|
||||||
import org.signal.core.util.EventTimer
|
import org.signal.core.util.EventTimer
|
||||||
import org.signal.core.util.PendingIntentFlags.cancelCurrent
|
import org.signal.core.util.PendingIntentFlags.cancelCurrent
|
||||||
import org.signal.core.util.Stopwatch
|
import org.signal.core.util.Stopwatch
|
||||||
@@ -375,7 +376,7 @@ object BackupRepository {
|
|||||||
* Caller from the attachment / thumbnail download jobs.
|
* Caller from the attachment / thumbnail download jobs.
|
||||||
*/
|
*/
|
||||||
fun checkForOutOfStorageError(tag: String): Boolean {
|
fun checkForOutOfStorageError(tag: String): Boolean {
|
||||||
val availableSpace = getFreeStorageSpace()
|
val availableSpace = DiskUtil.getAvailableSpace(AppDependencies.application)
|
||||||
val remainingAttachmentSize = SignalDatabase.attachments.getRemainingRestorableAttachmentSize().bytes
|
val remainingAttachmentSize = SignalDatabase.attachments.getRemainingRestorableAttachmentSize().bytes
|
||||||
|
|
||||||
return if (availableSpace < remainingAttachmentSize) {
|
return if (availableSpace < remainingAttachmentSize) {
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import android.provider.Settings
|
|||||||
import android.util.DisplayMetrics
|
import android.util.DisplayMetrics
|
||||||
import com.google.android.gms.common.ConnectionResult
|
import com.google.android.gms.common.ConnectionResult
|
||||||
import com.google.android.gms.common.GoogleApiAvailability
|
import com.google.android.gms.common.GoogleApiAvailability
|
||||||
|
import org.signal.core.util.BidiUtil
|
||||||
|
import org.signal.core.util.DiskUtil
|
||||||
import org.signal.core.util.FontUtil.canRenderEmojiAtFontSize
|
import org.signal.core.util.FontUtil.canRenderEmojiAtFontSize
|
||||||
import org.signal.core.util.bytes
|
import org.signal.core.util.bytes
|
||||||
import org.signal.core.util.roundedString
|
import org.signal.core.util.roundedString
|
||||||
@@ -55,6 +57,7 @@ class LogSectionSystemInfo : LogSection {
|
|||||||
Memory : ${getMemoryUsage()}
|
Memory : ${getMemoryUsage()}
|
||||||
Memclass : ${getMemoryClass(context)}
|
Memclass : ${getMemoryClass(context)}
|
||||||
MemInfo : ${getMemoryInfo(context)}
|
MemInfo : ${getMemoryInfo(context)}
|
||||||
|
Disk Space : ${getDiskSpaceInfo(context)}
|
||||||
OS Host : ${Build.HOST}
|
OS Host : ${Build.HOST}
|
||||||
RecipientId : ${if (SignalStore.registration.isRegistrationComplete) self().id else "N/A"}
|
RecipientId : ${if (SignalStore.registration.isRegistrationComplete) self().id else "N/A"}
|
||||||
ACI : ${getCensoredAci()}
|
ACI : ${getCensoredAci()}
|
||||||
@@ -128,6 +131,14 @@ class LogSectionSystemInfo : LogSection {
|
|||||||
return "availMem: ${info.availMem.bytes.inMebiBytes.roundedString(2)} MiB, totalMem: ${info.totalMem.bytes.inMebiBytes.roundedString(2)} MiB, threshold: ${info.threshold.bytes.inMebiBytes.roundedString(2)} MiB, lowMemory: ${info.lowMemory}"
|
return "availMem: ${info.availMem.bytes.inMebiBytes.roundedString(2)} MiB, totalMem: ${info.totalMem.bytes.inMebiBytes.roundedString(2)} MiB, threshold: ${info.threshold.bytes.inMebiBytes.roundedString(2)} MiB, lowMemory: ${info.lowMemory}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getDiskSpaceInfo(context: Context): String {
|
||||||
|
val totalSpace = DiskUtil.getTotalDiskSize(context)
|
||||||
|
val freeSpace = DiskUtil.getAvailableSpace(context)
|
||||||
|
val usedSpace = totalSpace - freeSpace
|
||||||
|
|
||||||
|
return BidiUtil.stripAllDirectionalCharacters("${usedSpace.toUnitString()} / ${totalSpace.toUnitString()} (${freeSpace.toUnitString()} free)")
|
||||||
|
}
|
||||||
|
|
||||||
private fun getScreenResolution(context: Context): String {
|
private fun getScreenResolution(context: Context): String {
|
||||||
val displayMetrics = DisplayMetrics()
|
val displayMetrics = DisplayMetrics()
|
||||||
val windowManager = ServiceUtil.getWindowManager(context)
|
val windowManager = ServiceUtil.getWindowManager(context)
|
||||||
|
|||||||
@@ -152,4 +152,8 @@ object BidiUtil {
|
|||||||
fun forceLtr(text: CharSequence): String {
|
fun forceLtr(text: CharSequence): String {
|
||||||
return "\u202a" + text + "\u202c"
|
return "\u202a" + text + "\u202c"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun stripAllDirectionalCharacters(text: String): String {
|
||||||
|
return text.replace("[\\u200f\\u2066\\u2067\\u2068\\u2069\\u202a\\u202b\\u202c\\u202d\\u202e]".toRegex(), "")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
72
core-util/src/main/java/org/signal/core/util/DiskUtil.kt
Normal file
72
core-util/src/main/java/org/signal/core/util/DiskUtil.kt
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2025 Signal Messenger, LLC
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.signal.core.util
|
||||||
|
|
||||||
|
import android.app.usage.StorageStatsManager
|
||||||
|
import android.content.Context
|
||||||
|
import android.os.Build
|
||||||
|
import android.os.StatFs
|
||||||
|
import android.os.storage.StorageManager
|
||||||
|
import androidx.annotation.RequiresApi
|
||||||
|
|
||||||
|
object DiskUtil {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the remaining storage usable by the application.
|
||||||
|
*
|
||||||
|
* @param context The application context
|
||||||
|
*/
|
||||||
|
@JvmStatic
|
||||||
|
fun getAvailableSpace(context: Context): ByteSize {
|
||||||
|
return if (Build.VERSION.SDK_INT >= 26) {
|
||||||
|
getAvailableStorageBytesApi26(context).bytes
|
||||||
|
} else {
|
||||||
|
return getAvailableStorageBytesLegacy(context).bytes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the total disk size of the volume used by the application.
|
||||||
|
*
|
||||||
|
* @param context The application context
|
||||||
|
*/
|
||||||
|
@JvmStatic
|
||||||
|
fun getTotalDiskSize(context: Context): ByteSize {
|
||||||
|
return if (Build.VERSION.SDK_INT >= 26) {
|
||||||
|
getTotalDiskSizeApi26(context).bytes
|
||||||
|
} else {
|
||||||
|
return getTotalDiskSizeLegacy(context).bytes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(26)
|
||||||
|
private fun getAvailableStorageBytesApi26(context: Context): Long {
|
||||||
|
val storageManager = context.getSystemService(Context.STORAGE_SERVICE) as StorageManager
|
||||||
|
val storageStatsManager = context.getSystemService(Context.STORAGE_STATS_SERVICE) as StorageStatsManager
|
||||||
|
val appStorageUuid = storageManager.getUuidForPath(context.filesDir)
|
||||||
|
|
||||||
|
return storageStatsManager.getFreeBytes(appStorageUuid)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getAvailableStorageBytesLegacy(context: Context): Long {
|
||||||
|
val stat = StatFs(context.filesDir.absolutePath)
|
||||||
|
return stat.availableBytes
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequiresApi(26)
|
||||||
|
private fun getTotalDiskSizeApi26(context: Context): Long {
|
||||||
|
val storageManager = context.getSystemService(Context.STORAGE_SERVICE) as StorageManager
|
||||||
|
val storageStatsManager = context.getSystemService(Context.STORAGE_STATS_SERVICE) as StorageStatsManager
|
||||||
|
val appStorageUuid = storageManager.getUuidForPath(context.filesDir)
|
||||||
|
|
||||||
|
return storageStatsManager.getTotalBytes(appStorageUuid)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getTotalDiskSizeLegacy(context: Context): Long {
|
||||||
|
val stat = StatFs(context.filesDir.absolutePath)
|
||||||
|
return stat.totalBytes
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user