Skip to content

Commit a31f0cf

Browse files
committed
DownloadsFileSaver: initialize callback in constructor, not on the fly
Signed-off-by: Jason A. Donenfeld <[email protected]>
1 parent 1dc74b1 commit a31f0cf

File tree

3 files changed

+22
-9
lines changed

3 files changed

+22
-9
lines changed

ui/src/main/java/com/wireguard/android/activity/LogViewerActivity.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,12 +147,14 @@ class LogViewerActivity : AppCompatActivity() {
147147
}
148148
}
149149

150+
private val downloadsFileSaver = DownloadsFileSaver(this)
151+
150152
private suspend fun saveLog() {
151153
var exception: Throwable? = null
152154
var outputFile: DownloadsFileSaver.DownloadsFile? = null
153155
withContext(Dispatchers.IO) {
154156
try {
155-
outputFile = DownloadsFileSaver.save(this@LogViewerActivity, "wireguard-log.txt", "text/plain", true)
157+
outputFile = downloadsFileSaver.save("wireguard-log.txt", "text/plain", true)
156158
outputFile?.outputStream?.write(rawLogLines.toString().toByteArray(Charsets.UTF_8))
157159
} catch (e: Throwable) {
158160
outputFile?.delete()

ui/src/main/java/com/wireguard/android/preference/ZipExporterPreference.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ import java.util.zip.ZipOutputStream
3232
*/
3333
class ZipExporterPreference(context: Context, attrs: AttributeSet?) : Preference(context, attrs) {
3434
private var exportedFilePath: String? = null
35+
private val downloadsFileSaver = DownloadsFileSaver(activity)
36+
3537
private fun exportZip() {
3638
lifecycleScope.launch {
3739
val tunnels = Application.getTunnelManager().getTunnels()
@@ -41,7 +43,7 @@ class ZipExporterPreference(context: Context, attrs: AttributeSet?) : Preference
4143
if (configs.isEmpty()) {
4244
throw IllegalArgumentException(context.getString(R.string.no_tunnels_error))
4345
}
44-
val outputFile = DownloadsFileSaver.save(activity, "wireguard-export.zip", "application/zip", true)
46+
val outputFile = downloadsFileSaver.save("wireguard-export.zip", "application/zip", true)
4547
if (outputFile == null) {
4648
withContext(Dispatchers.Main.immediate) {
4749
isEnabled = true

ui/src/main/java/com/wireguard/android/util/DownloadsFileSaver.kt

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import android.os.Environment
1414
import android.provider.MediaStore
1515
import android.provider.MediaStore.MediaColumns
1616
import androidx.activity.ComponentActivity
17+
import androidx.activity.result.ActivityResultLauncher
1718
import androidx.activity.result.contract.ActivityResultContracts
1819
import androidx.core.content.ContextCompat
1920
import com.wireguard.android.R
@@ -25,9 +26,18 @@ import java.io.FileOutputStream
2526
import java.io.IOException
2627
import java.io.OutputStream
2728

28-
object DownloadsFileSaver {
29-
@Throws(Exception::class)
30-
suspend fun save(context: ComponentActivity, name: String, mimeType: String?, overwriteExisting: Boolean) = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
29+
class DownloadsFileSaver(private val context: ComponentActivity) {
30+
private lateinit var activityResult: ActivityResultLauncher<String>
31+
private lateinit var futureGrant: CompletableDeferred<Boolean>
32+
33+
init {
34+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
35+
futureGrant = CompletableDeferred()
36+
activityResult = context.registerForActivityResult(ActivityResultContracts.RequestPermission()) { ret -> futureGrant.complete(ret) }
37+
}
38+
}
39+
40+
suspend fun save(name: String, mimeType: String?, overwriteExisting: Boolean) = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
3141
withContext(Dispatchers.IO) {
3242
val contentResolver = context.contentResolver
3343
if (overwriteExisting)
@@ -66,13 +76,12 @@ object DownloadsFileSaver {
6676
} else {
6777
withContext(Dispatchers.Main.immediate) {
6878
if (ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
69-
val futureGrant = CompletableDeferred<Boolean>()
70-
val activityResult = context.registerForActivityResult(ActivityResultContracts.RequestPermission(), futureGrant::complete)
7179
activityResult.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)
7280
val granted = futureGrant.await()
73-
activityResult.unregister()
74-
if (!granted)
81+
if (!granted) {
82+
futureGrant = CompletableDeferred()
7583
return@withContext null
84+
}
7685
}
7786
@Suppress("DEPRECATION") val path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
7887
withContext(Dispatchers.IO) {

0 commit comments

Comments
 (0)