blob: 7dcb3909f0b9e5e24816072fcfcf47629889a2a7 [file] [log] [blame]
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.app;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.ArrayMap;
import androidx.annotation.Nullable;
import com.android.internal.annotations.VisibleForTesting;
import java.util.Arrays;
import java.util.Map;
/**
* GameModeInfo returned from {@link GameManager#getGameModeInfo(String)}.
*
* Developers can enable game modes or interventions by adding
* <pre>{@code
* <meta-data android:name="android.game_mode_intervention"
* android:resource="@xml/GAME_MODE_CONFIG_FILE" />
* }</pre>
* to the <pre>{@code <application>}</pre>, where the GAME_MODE_CONFIG_FILE is an XML file that
* specifies the game mode enablement and intervention configuration:
* <pre>{@code
* <game-mode-config xmlns:android="http://schemas.android.com/apk/res/android"
* android:gameModePerformance="true"
* android:gameModeBattery="false"
* android:allowGameDownscaling="true"
* android:allowGameFpsOverride="false"
* />
* }</pre>
*
* @hide
*/
@SystemApi
public final class GameModeInfo implements Parcelable {
public static final @NonNull Creator<GameModeInfo> CREATOR = new Creator<GameModeInfo>() {
@Override
public GameModeInfo createFromParcel(Parcel in) {
return new GameModeInfo(in);
}
@Override
public GameModeInfo[] newArray(int size) {
return new GameModeInfo[size];
}
};
/**
* Builder for {@link GameModeInfo}.
*
* @hide
*/
@SystemApi
public static final class Builder {
/** Constructs a new Builder for a game mode info. */
public Builder() {
}
/**
* Sets the available game modes.
*/
@NonNull
public GameModeInfo.Builder setAvailableGameModes(
@NonNull @GameManager.GameMode int[] availableGameModes) {
mAvailableGameModes = availableGameModes;
return this;
}
/**
* Sets the overridden game modes.
*/
@NonNull
public GameModeInfo.Builder setOverriddenGameModes(
@NonNull @GameManager.GameMode int[] overriddenGameModes) {
mOverriddenGameModes = overriddenGameModes;
return this;
}
/**
* Sets the active game mode.
*/
@NonNull
public GameModeInfo.Builder setActiveGameMode(
@NonNull @GameManager.GameMode int activeGameMode) {
mActiveGameMode = activeGameMode;
return this;
}
/**
* Sets the downscaling intervention flag.
*/
@NonNull
public GameModeInfo.Builder setDownscalingAllowed(boolean allowed) {
mIsDownscalingAllowed = allowed;
return this;
}
/**
* Sets the FPS override flag.
*/
@NonNull
public GameModeInfo.Builder setFpsOverrideAllowed(boolean allowed) {
mIsFpsOverrideAllowed = allowed;
return this;
}
/**
* Sets the GameModeConfiguration for a game mode.
*/
@NonNull
public GameModeInfo.Builder setGameModeConfiguration(
@GameManager.GameMode int gameMode,
@NonNull GameModeConfiguration gameModeConfiguration) {
mConfigMap.put(gameMode, gameModeConfiguration);
return this;
}
/**
* Builds a GameModeInfo.
*/
@NonNull
public GameModeInfo build() {
return new GameModeInfo(mActiveGameMode, mAvailableGameModes, mOverriddenGameModes,
mIsDownscalingAllowed, mIsFpsOverrideAllowed, mConfigMap);
}
private @GameManager.GameMode int[] mAvailableGameModes = new int[]{};
private @GameManager.GameMode int[] mOverriddenGameModes = new int[]{};
private @GameManager.GameMode int mActiveGameMode;
private boolean mIsDownscalingAllowed;
private boolean mIsFpsOverrideAllowed;
private Map<Integer, GameModeConfiguration> mConfigMap = new ArrayMap<>();
}
/**
* Creates a game mode info.
*
* @deprecated Use the {@link Builder} instead.
*/
public GameModeInfo(@GameManager.GameMode int activeGameMode,
@NonNull @GameManager.GameMode int[] availableGameModes) {
this(activeGameMode, availableGameModes, new int[]{}, true, true, new ArrayMap<>());
}
private GameModeInfo(@GameManager.GameMode int activeGameMode,
@NonNull @GameManager.GameMode int[] availableGameModes,
@NonNull @GameManager.GameMode int[] overriddenGameModes, boolean isDownscalingAllowed,
boolean isFpsOverrideAllowed, @NonNull Map<Integer, GameModeConfiguration> configMap) {
mActiveGameMode = activeGameMode;
mAvailableGameModes = Arrays.copyOf(availableGameModes, availableGameModes.length);
mOverriddenGameModes = Arrays.copyOf(overriddenGameModes, overriddenGameModes.length);
mIsDownscalingAllowed = isDownscalingAllowed;
mIsFpsOverrideAllowed = isFpsOverrideAllowed;
mConfigMap = configMap;
}
/** @hide */
@VisibleForTesting
public GameModeInfo(Parcel in) {
mActiveGameMode = in.readInt();
mAvailableGameModes = in.createIntArray();
mOverriddenGameModes = in.createIntArray();
mIsDownscalingAllowed = in.readBoolean();
mIsFpsOverrideAllowed = in.readBoolean();
mConfigMap = new ArrayMap<>();
in.readMap(mConfigMap,
getClass().getClassLoader(), Integer.class, GameModeConfiguration.class);
}
/**
* Returns the {@link GameManager.GameMode} the application is currently using.
*/
public @GameManager.GameMode int getActiveGameMode() {
return mActiveGameMode;
}
/**
* Gets the collection of {@link GameManager.GameMode} that can be applied to the game.
* <p>
* Available games include all game modes that are either supported by the OEM in device
* config, or overridden by the game developers in game mode config XML, plus the default
* enabled modes for any game including {@link GameManager#GAME_MODE_STANDARD} and
* {@link GameManager#GAME_MODE_CUSTOM}.
* <p>
* Also see {@link GameModeInfo}.
*/
@NonNull
public @GameManager.GameMode int[] getAvailableGameModes() {
return Arrays.copyOf(mAvailableGameModes, mAvailableGameModes.length);
}
/**
* Gets the collection of {@link GameManager.GameMode} that are overridden by the game.
* <p>
* Also see {@link GameModeInfo}.
*/
@NonNull
public @GameManager.GameMode int[] getOverriddenGameModes() {
return Arrays.copyOf(mOverriddenGameModes, mOverriddenGameModes.length);
}
/**
* Gets the current game mode configuration of a game mode.
* <p>
* The game mode can be null if it's overridden by the game itself, or not configured in device
* config nor set by the user as custom game mode configuration.
*/
public @Nullable GameModeConfiguration getGameModeConfiguration(
@GameManager.GameMode int gameMode) {
return mConfigMap.get(gameMode);
}
/**
* Returns if downscaling is allowed (not opted out) by the game in their Game Mode config.
* <p>
* Also see {@link GameModeInfo}.
*/
public boolean isDownscalingAllowed() {
return mIsDownscalingAllowed;
}
/**
* Returns if FPS override is allowed (not opted out) by the game in their Game Mode config.
* <p>
* Also see {@link GameModeInfo}.
*/
public boolean isFpsOverrideAllowed() {
return mIsFpsOverrideAllowed;
}
private final @GameManager.GameMode int[] mAvailableGameModes;
private final @GameManager.GameMode int[] mOverriddenGameModes;
private final @GameManager.GameMode int mActiveGameMode;
private final boolean mIsDownscalingAllowed;
private final boolean mIsFpsOverrideAllowed;
private final Map<Integer, GameModeConfiguration> mConfigMap;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(mActiveGameMode);
dest.writeIntArray(mAvailableGameModes);
dest.writeIntArray(mOverriddenGameModes);
dest.writeBoolean(mIsDownscalingAllowed);
dest.writeBoolean(mIsFpsOverrideAllowed);
dest.writeMap(mConfigMap);
}
}