Skip to content

Commit d87b603

Browse files
m4gr3dsyntaxerror247
authored andcommitted
Merge pull request godotengine#28 from m4gr3d/fix_binary_copy
Fix invalid project tree copy
2 parents 773e2db + 417bd6a commit d87b603

2 files changed

Lines changed: 20 additions & 5 deletions

File tree

‎app/src/main/java/org/godotengine/godot_gradle_build_environment/BuildEnvironment.kt‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import java.io.FileOutputStream
1414
import java.io.IOException
1515
import java.io.InputStreamReader
1616
import java.util.concurrent.TimeUnit
17+
import java.util.concurrent.atomic.AtomicReference
1718
import java.util.concurrent.locks.ReentrantLock
1819
import kotlin.concurrent.withLock
1920

@@ -42,7 +43,7 @@ class BuildEnvironment(private val context: Context, private val rootfs: String,
4243

4344
private val accessLock = ReentrantLock()
4445
private val accessLockCondition = accessLock.newCondition()
45-
@Volatile private var grantedTreeUri: Uri? = null
46+
private val grantedTreeUri = AtomicReference<Uri>()
4647

4748
private fun getDefaultEnv(): List<String> {
4849
return try {
@@ -187,7 +188,7 @@ class BuildEnvironment(private val context: Context, private val rootfs: String,
187188
}
188189

189190
var projectTreeUri = FileUtils.getProjectTreeUri(context, projectPath)
190-
if (projectTreeUri == null) {
191+
if (projectTreeUri == null || !FileUtils.isProjectTreeUriPersisted(context, projectTreeUri)) {
191192
val notificationPerm = checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS)
192193
if (notificationPerm == PackageManager.PERMISSION_GRANTED) {
193194
outputHandler(
@@ -504,20 +505,22 @@ class BuildEnvironment(private val context: Context, private val rootfs: String,
504505
fun waitForDirectoryAccess(timeoutMs: Long): Uri? {
505506
accessLock.withLock {
506507
var remainingTimeInNanos = TimeUnit.MILLISECONDS.toNanos(timeoutMs)
507-
while (grantedTreeUri == null && remainingTimeInNanos > 0) {
508+
while (grantedTreeUri.get() == null && remainingTimeInNanos > 0) {
508509
try {
509510
remainingTimeInNanos = accessLockCondition.awaitNanos(remainingTimeInNanos)
510511
} catch (_: InterruptedException) {
511512
Thread.currentThread().interrupt()
512513
}
513514
}
514-
return grantedTreeUri
515+
// We reset the value to `null` after returning it to avoid returning a previous value when this method is
516+
// invoked again.
517+
return grantedTreeUri.getAndSet(null)
515518
}
516519
}
517520

518521
fun onDirectoryAccessGranted(uri: Uri) {
519522
accessLock.withLock {
520-
grantedTreeUri = uri
523+
grantedTreeUri.set(uri)
521524
accessLockCondition.signalAll()
522525
}
523526
}

‎app/src/main/java/org/godotengine/godot_gradle_build_environment/FileUtils.kt‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,18 @@ object FileUtils {
177177
prefs.edit { remove(projectPath) }
178178
}
179179

180+
/**
181+
* Check whether we have persisted the given project tree uri.
182+
*/
183+
fun isProjectTreeUriPersisted(context: Context, projectTreeUri: Uri): Boolean {
184+
for (uriPermission in context.contentResolver.persistedUriPermissions) {
185+
if (uriPermission.uri == projectTreeUri) {
186+
return true
187+
}
188+
}
189+
return false
190+
}
191+
180192
fun getProjectTreeUri(context: Context, projectPath: String): Uri? {
181193
val prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
182194
val uriString = prefs.getString(projectPath, null)

0 commit comments

Comments
 (0)