浏览代码

refactor: Extract shared log-saving behavior

...so that we implement log-sharing once and apply it to both spots.
Peter Cai 1 年之前
父节点
当前提交
70f1e00eb4

+ 10 - 14
app-common/src/main/java/im/angry/openeuicc/ui/LogsActivity.kt

@@ -8,7 +8,6 @@ import android.view.View
 import android.widget.ScrollView
 import android.widget.TextView
 import androidx.activity.enableEdgeToEdge
-import androidx.activity.result.contract.ActivityResultContracts
 import androidx.appcompat.app.AppCompatActivity
 import androidx.lifecycle.lifecycleScope
 import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
@@ -17,7 +16,6 @@ import im.angry.openeuicc.util.*
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
-import java.io.FileOutputStream
 import java.util.Date
 
 class LogsActivity : AppCompatActivity() {
@@ -27,15 +25,15 @@ class LogsActivity : AppCompatActivity() {
     private lateinit var logStr: String
 
     private val saveLogs =
-        registerForActivityResult(ActivityResultContracts.CreateDocument("text/plain")) { uri ->
-            if (uri == null) return@registerForActivityResult
-            if (!this::logStr.isInitialized) return@registerForActivityResult
-            contentResolver.openFileDescriptor(uri, "w")?.use {
-                FileOutputStream(it.fileDescriptor).use { os ->
-                    os.write(logStr.encodeToByteArray())
-                }
-            }
-        }
+        setupLogSaving(
+            getLogFileName = {
+                getString(
+                    R.string.logs_filename_template,
+                    SimpleDateFormat.getDateTimeInstance().format(Date())
+                )
+            },
+            getLogText = { logStr }
+        )
 
     override fun onCreate(savedInstanceState: Bundle?) {
         enableEdgeToEdge()
@@ -76,9 +74,7 @@ class LogsActivity : AppCompatActivity() {
             true
         }
         R.id.save -> {
-            saveLogs.launch(getString(R.string.logs_filename_template,
-                SimpleDateFormat.getDateTimeInstance().format(Date())
-            ))
+            saveLogs()
             true
         }
         else -> super.onOptionsItemSelected(item)

+ 10 - 16
app-common/src/main/java/im/angry/openeuicc/ui/wizard/DownloadWizardDiagnosticsFragment.kt

@@ -6,10 +6,8 @@ import android.view.LayoutInflater
 import android.view.View
 import android.view.ViewGroup
 import android.widget.TextView
-import androidx.activity.result.contract.ActivityResultContracts
 import im.angry.openeuicc.common.R
 import im.angry.openeuicc.util.*
-import java.io.FileOutputStream
 import java.util.Date
 
 class DownloadWizardDiagnosticsFragment : DownloadWizardActivity.DownloadWizardStepFragment() {
@@ -21,14 +19,15 @@ class DownloadWizardDiagnosticsFragment : DownloadWizardActivity.DownloadWizardS
     private lateinit var diagnosticTextView: TextView
 
     private val saveDiagnostics =
-        registerForActivityResult(ActivityResultContracts.CreateDocument("text/plain")) { uri ->
-            if (uri == null) return@registerForActivityResult
-            requireActivity().contentResolver.openFileDescriptor(uri, "w")?.use {
-                FileOutputStream(it.fileDescriptor).use { os ->
-                    os.write(diagnosticTextView.text.toString().encodeToByteArray())
-                }
-            }
-        }
+        setupLogSaving(
+            getLogFileName = {
+                getString(
+                    R.string.download_wizard_diagnostics_file_template,
+                    SimpleDateFormat.getDateTimeInstance().format(Date())
+                )
+            },
+            getLogText = { diagnosticTextView.text.toString() }
+        )
 
     override fun createNextFragment(): DownloadWizardActivity.DownloadWizardStepFragment? = null
 
@@ -41,12 +40,7 @@ class DownloadWizardDiagnosticsFragment : DownloadWizardActivity.DownloadWizardS
     ): View? {
         val view = inflater.inflate(R.layout.fragment_download_diagnostics, container, false)
         view.requireViewById<View>(R.id.download_wizard_diagnostics_save).setOnClickListener {
-            saveDiagnostics.launch(
-                getString(
-                    R.string.download_wizard_diagnostics_file_template,
-                    SimpleDateFormat.getDateTimeInstance().format(Date())
-                )
-            )
+            saveDiagnostics()
         }
         diagnosticTextView = view.requireViewById(R.id.download_wizard_diagnostics_text)
         return view

+ 31 - 1
app-common/src/main/java/im/angry/openeuicc/util/UiUtils.kt

@@ -1,17 +1,21 @@
 package im.angry.openeuicc.util
 
+import android.content.Context
 import android.content.res.Resources
 import android.graphics.Rect
 import android.view.View
 import android.view.ViewGroup
+import androidx.activity.result.ActivityResultCaller
+import androidx.activity.result.contract.ActivityResultContracts
 import androidx.appcompat.app.AppCompatActivity
-import androidx.appcompat.widget.Toolbar
 import androidx.core.view.ViewCompat
 import androidx.core.view.WindowInsetsCompat
 import androidx.core.view.updateLayoutParams
 import androidx.core.view.updatePadding
 import androidx.fragment.app.DialogFragment
+import androidx.fragment.app.Fragment
 import im.angry.openeuicc.common.R
+import java.io.FileOutputStream
 
 // Source: <https://stackoverflow.com/questions/12478520/how-to-set-dialogfragments-width-and-height>
 /**
@@ -69,4 +73,30 @@ fun setupRootViewInsets(view: ViewGroup) {
 
         WindowInsetsCompat.CONSUMED
     }
+}
+
+fun <T : ActivityResultCaller> T.setupLogSaving(
+    getLogFileName: () -> String,
+    getLogText: () -> String
+): () -> Unit {
+    val launchSaveIntent =
+        registerForActivityResult(ActivityResultContracts.CreateDocument("text/plain")) { uri ->
+            if (uri == null) return@registerForActivityResult
+
+            val contentResolver = when (this@setupLogSaving) {
+                is Context -> contentResolver
+                is Fragment -> requireContext().contentResolver
+                else -> throw IllegalArgumentException("Must be either Context or Fragment!")
+            }
+
+            contentResolver.openFileDescriptor(uri, "w")?.use {
+                FileOutputStream(it.fileDescriptor).use { os ->
+                    os.write(getLogText().encodeToByteArray())
+                }
+            }
+        }
+
+    return {
+        launchSaveIntent.launch(getLogFileName())
+    }
 }