summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jay Sullivan <jaysullivan@google.com> 2024-03-07 02:36:03 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-03-07 02:36:03 +0000
commit1d1d7400d1981a8fa1ee83df5fb8489f46146850 (patch)
tree9c5cfab3202ef2a2fcf8d5db70542033fe183497
parent246e4d1395bfcf8c17ce337dbdf0c342cba23fea (diff)
parent518a7a1c03b0499aab02d94d54c6a575b7e4f3e9 (diff)
Merge "[StartForFutureActivity] Mitigate CompletableFuture leak" into main
-rw-r--r--tests/cts/permissionui/src/android/permissionui/cts/StartForFutureActivity.kt25
1 files changed, 13 insertions, 12 deletions
diff --git a/tests/cts/permissionui/src/android/permissionui/cts/StartForFutureActivity.kt b/tests/cts/permissionui/src/android/permissionui/cts/StartForFutureActivity.kt
index 8caa4e6bf..f9f9e8cd2 100644
--- a/tests/cts/permissionui/src/android/permissionui/cts/StartForFutureActivity.kt
+++ b/tests/cts/permissionui/src/android/permissionui/cts/StartForFutureActivity.kt
@@ -21,7 +21,9 @@ import android.app.Instrumentation
import android.content.Intent
import android.os.Bundle
import android.util.Log
+import android.util.LruCache
import java.util.concurrent.CompletableFuture
+import java.util.concurrent.atomic.AtomicInteger
class StartForFutureActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
@@ -36,26 +38,25 @@ class StartForFutureActivity : Activity() {
intent: Intent,
future: CompletableFuture<Instrumentation.ActivityResult>
) {
- if (StartForFutureActivity.future != null) {
- throw RuntimeException(
- "StartForFutureActivity only supports launching one " +
- "concurrent activity, but more than one was attempted."
- )
- }
-
- startActivityForResult(intent, 1)
- StartForFutureActivity.future = future
+ val requestCode = nextRequestCode.getAndIncrement()
+ futures.put(requestCode, future)
+ startActivityForResult(intent, requestCode)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
- future!!.complete(Instrumentation.ActivityResult(resultCode, data))
- future = null
+ val future =
+ futures.remove(requestCode)
+ ?: throw IllegalStateException(
+ "StartForFutureActivity received an activity result with an unknown requestCode"
+ )
+ future.complete(Instrumentation.ActivityResult(resultCode, data))
finish()
}
companion object {
- private var future: CompletableFuture<Instrumentation.ActivityResult>? = null
private val TAG = StartForFutureActivity::class.simpleName
+ private var nextRequestCode = AtomicInteger(1)
+ private val futures = LruCache<Int, CompletableFuture<Instrumentation.ActivityResult>>(10)
}
}