Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 112388bd authored by David Samuelson's avatar David Samuelson Committed by Automerger Merge Worker
Browse files

Merge "Ensure GameSessionTrampolineActivity launches intent once." into tm-dev am: eeebac45

parents c4db39cc eeebac45
Loading
Loading
Loading
Loading
+5 −9
Original line number Diff line number Diff line
@@ -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(
+8 −4
Original line number Diff line number Diff line
@@ -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;
    }

+51 −0
Original line number Diff line number Diff line
@@ -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),
@@ -63,6 +108,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) {
+2 −0
Original line number Diff line number Diff line
@@ -42,6 +42,8 @@ android_test {
    static_libs: [
        "androidx.test.core",
        "androidx.test.runner",
        "androidx.test.espresso.core",
        "androidx.test.espresso.contrib",
        "androidx.test.ext.truth",
        "frameworks-base-testutils",
        "hamcrest-library",
+4 −0
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@
    <uses-permission
        android:name="android.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD"/>
    <uses-permission android:name="android.permission.STATUS_BAR_SERVICE" />
    <uses-permission android:name="android.permission.MANAGE_GAME_ACTIVITY" />
    <uses-permission android:name="android.permission.SET_ALWAYS_FINISH" />

    <!-- needed by MasterClearReceiverTest to display a system dialog -->
    <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW"/>
@@ -39,6 +41,8 @@
    <application android:testOnly="true"
                 android:debuggable="true">
        <uses-library android:name="android.test.runner" />
        <activity
            android:name="android.service.games.GameSessionTrampolineActivityTest$TestActivity" />
    </application>

    <instrumentation
Loading