فهرست منبع

fix: accurately detect WebView data deletion failures

HapeLee 3 ماه پیش
والد
کامیت
bf957cc228

+ 20 - 8
app/src/main/java/io/legado/app/help/webView/WebViewDataCleaner.kt

@@ -4,7 +4,6 @@ import android.content.Context
 import android.webkit.CookieManager
 import android.webkit.CookieManager
 import android.webkit.WebStorage
 import android.webkit.WebStorage
 import android.webkit.WebViewDatabase
 import android.webkit.WebViewDatabase
-import io.legado.app.utils.FileUtils
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlinx.coroutines.withContext
 import kotlinx.coroutines.withContext
@@ -21,8 +20,8 @@ object WebViewDataCleaner {
 
 
         val directoriesCleared = withContext(Dispatchers.IO) {
         val directoriesCleared = withContext(Dispatchers.IO) {
             clearDataDirectories(
             clearDataDirectories(
-                webViewDirectory = context.getDir("webview", Context.MODE_PRIVATE),
-                huaweiWebViewDirectory = context.getDir("hws_webview", Context.MODE_PRIVATE),
+                webViewDirectory = File(context.applicationInfo.dataDir, "app_webview"),
+                huaweiWebViewDirectory = File(context.applicationInfo.dataDir, "app_hws_webview"),
             )
             )
         }
         }
         if (!directoriesCleared) {
         if (!directoriesCleared) {
@@ -52,11 +51,24 @@ internal fun clearDataDirectories(
     webViewDirectory: File,
     webViewDirectory: File,
     huaweiWebViewDirectory: File,
     huaweiWebViewDirectory: File,
 ): Boolean {
 ): Boolean {
-    FileUtils.delete(webViewDirectory)
-    FileUtils.delete(huaweiWebViewDirectory, deleteRootDir = true)
-    return webViewDirectory.isMissingOrEmpty() && huaweiWebViewDirectory.isMissingOrEmpty()
+    val webViewCleared = webViewDirectory.clearContents()
+    val huaweiWebViewCleared = huaweiWebViewDirectory.deleteDirectory()
+    return webViewCleared && huaweiWebViewCleared
 }
 }
 
 
-private fun File.isMissingOrEmpty(): Boolean {
-    return !exists() || isDirectory && listFiles()?.isEmpty() == true
+private fun File.clearContents(): Boolean {
+    if (!exists()) return true
+    if (!isDirectory) return false
+
+    val children = listFiles() ?: return false
+    val childrenDeleted = children.fold(true) { success, child ->
+        child.deleteRecursively() && success
+    }
+    return childrenDeleted && listFiles()?.isEmpty() == true
+}
+
+private fun File.deleteDirectory(): Boolean {
+    if (!exists()) return true
+    if (!isDirectory) return false
+    return deleteRecursively() && !exists()
 }
 }

+ 13 - 0
app/src/test/java/io/legado/app/help/webView/WebViewDataCleanerTest.kt

@@ -47,6 +47,19 @@ class WebViewDataCleanerTest {
         assertFalse(huaweiWebViewDirectory.exists())
         assertFalse(huaweiWebViewDirectory.exists())
     }
     }
 
 
+    @Test
+    fun clearDataDirectories_reportsFailureWhenHuaweiDirectoryCannotBeDeleted() {
+        val webViewDirectory = File(testDirectory, "app_webview").apply { mkdirs() }
+        val huaweiWebViewDirectory = object : File(testDirectory, "app_hws_webview") {
+            override fun exists() = true
+            override fun isDirectory() = true
+            override fun listFiles(): Array<File> = emptyArray()
+            override fun delete() = false
+        }
+
+        assertFalse(clearDataDirectories(webViewDirectory, huaweiWebViewDirectory))
+    }
+
     private fun File.createFileWithParents() {
     private fun File.createFileWithParents() {
         parentFile?.mkdirs()
         parentFile?.mkdirs()
         createNewFile()
         createNewFile()