summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
authorDavid Samuelson <samuelsond@google.com>2022-04-18 14:59:58 +0000
committerDavid Samuelson <samuelsond@google.com>2022-04-20 18:23:48 +0000
commit37db6025c6998d47d09e79bf04547722a5028705 (patch)
tree7a0d80e807a5e8ee24d36f0332e8ff018ea4b16a /core/java
parent8e157c498cdc4e66576074cf7f8ae6aecaa8b8c4 (diff)
Ensure GameSessionTrampolineActivity launches intent once.
Test: Manually & passes newly added GameSessionTrampolineActivityTest Bug: 229394334 Bug: 202414447 Bug: 202417255 Change-Id: I15ea072805439531fc89ee4f3038acc57f8c49ea
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/service/games/GameSession.java14
-rw-r--r--core/java/android/service/games/GameSessionActivityResult.java12
-rw-r--r--core/java/android/service/games/GameSessionTrampolineActivity.java51
3 files changed, 64 insertions, 13 deletions
diff --git a/core/java/android/service/games/GameSession.java b/core/java/android/service/games/GameSession.java
index 01152943efe3..e8d53d351795 100644
--- a/core/java/android/service/games/GameSession.java
+++ b/core/java/android/service/games/GameSession.java
@@ -25,7 +25,6 @@ import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.app.ActivityTaskManager;
import android.app.Instrumentation;
-import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
@@ -511,14 +510,11 @@ public abstract class GameSession {
callback.onActivityResult(result.getResultCode(), result.getData());
}, executor);
- final Intent trampolineIntent = new Intent();
- trampolineIntent.setComponent(
- new ComponentName(
- "android", "android.service.games.GameSessionTrampolineActivity"));
- trampolineIntent.putExtra(GameSessionTrampolineActivity.INTENT_KEY, intent);
- trampolineIntent.putExtra(GameSessionTrampolineActivity.OPTIONS_KEY, options);
- trampolineIntent.putExtra(
- GameSessionTrampolineActivity.FUTURE_KEY, future);
+ final Intent trampolineIntent =
+ GameSessionTrampolineActivity.createIntent(
+ intent,
+ options,
+ future);
try {
int result = ActivityTaskManager.getService().startActivityFromGameSession(
diff --git a/core/java/android/service/games/GameSessionActivityResult.java b/core/java/android/service/games/GameSessionActivityResult.java
index a2ec6ada010c..c8099e6e5eff 100644
--- a/core/java/android/service/games/GameSessionActivityResult.java
+++ b/core/java/android/service/games/GameSessionActivityResult.java
@@ -22,8 +22,12 @@ import android.content.Intent;
import android.os.Parcel;
import android.os.Parcelable;
+import com.android.internal.annotations.VisibleForTesting;
-final class GameSessionActivityResult implements Parcelable {
+
+/** @hide */
+@VisibleForTesting
+public final class GameSessionActivityResult implements Parcelable {
public static final Creator<GameSessionActivityResult> CREATOR =
new Creator<GameSessionActivityResult>() {
@@ -44,17 +48,17 @@ final class GameSessionActivityResult implements Parcelable {
@Nullable
private final Intent mData;
- GameSessionActivityResult(int resultCode, @Nullable Intent data) {
+ public GameSessionActivityResult(int resultCode, @Nullable Intent data) {
mResultCode = resultCode;
mData = data;
}
- int getResultCode() {
+ public int getResultCode() {
return mResultCode;
}
@Nullable
- Intent getData() {
+ public Intent getData() {
return mData;
}
diff --git a/core/java/android/service/games/GameSessionTrampolineActivity.java b/core/java/android/service/games/GameSessionTrampolineActivity.java
index 3d97d0f59b33..e890876df3e7 100644
--- a/core/java/android/service/games/GameSessionTrampolineActivity.java
+++ b/core/java/android/service/games/GameSessionTrampolineActivity.java
@@ -16,12 +16,15 @@
package android.service.games;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Activity;
+import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.util.Slog;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.infra.AndroidFuture;
import java.util.concurrent.Executor;
@@ -35,6 +38,7 @@ import java.util.concurrent.Executor;
*
* @hide
*/
+@VisibleForTesting
public final class GameSessionTrampolineActivity extends Activity {
private static final String TAG = "GameSessionTrampoline";
private static final int REQUEST_CODE = 1;
@@ -42,11 +46,52 @@ public final class GameSessionTrampolineActivity extends Activity {
static final String FUTURE_KEY = "GameSessionTrampolineActivity.future";
static final String INTENT_KEY = "GameSessionTrampolineActivity.intent";
static final String OPTIONS_KEY = "GameSessionTrampolineActivity.options";
+ private static final String HAS_LAUNCHED_INTENT_KEY =
+ "GameSessionTrampolineActivity.hasLaunchedIntent";
+ private boolean mHasLaunchedIntent = false;
+
+ /**
+ * Create an {@link Intent} for the {@link GameSessionTrampolineActivity} with the given
+ * parameters.
+ *
+ * @param targetIntent the forwarded {@link Intent} that is associated with the Activity that
+ * will be launched by the {@link GameSessionTrampolineActivity}.
+ * @param options Activity options. See {@link #startActivity(Intent, Bundle)}.
+ * @param resultFuture the {@link AndroidFuture} that will complete with the activity results of
+ * {@code targetIntent} launched.
+ * @return the Intent that will launch the {@link GameSessionTrampolineActivity} with the given
+ * parameters.
+ * @hide
+ */
+ @VisibleForTesting
+ public static Intent createIntent(
+ @NonNull Intent targetIntent,
+ @Nullable Bundle options,
+ @NonNull AndroidFuture<GameSessionActivityResult> resultFuture) {
+ final Intent trampolineIntent = new Intent();
+ trampolineIntent.setComponent(
+ new ComponentName(
+ "android", "android.service.games.GameSessionTrampolineActivity"));
+ trampolineIntent.putExtra(INTENT_KEY, targetIntent);
+ trampolineIntent.putExtra(OPTIONS_KEY, options);
+ trampolineIntent.putExtra(FUTURE_KEY, resultFuture);
+
+ return trampolineIntent;
+ }
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ if (savedInstanceState != null) {
+ mHasLaunchedIntent = savedInstanceState.getBoolean(HAS_LAUNCHED_INTENT_KEY);
+ }
+
+ if (mHasLaunchedIntent) {
+ return;
+ }
+ mHasLaunchedIntent = true;
+
try {
startActivityAsCaller(
getIntent().getParcelableExtra(INTENT_KEY),
@@ -64,6 +109,12 @@ public final class GameSessionTrampolineActivity extends Activity {
}
@Override
+ protected void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ outState.putBoolean(HAS_LAUNCHED_INTENT_KEY, mHasLaunchedIntent);
+ }
+
+ @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != REQUEST_CODE) {
// Something went very wrong if we hit this code path, and we should bail.