Merge changes from topic "game_loading_statsd_to_tm-dev" into tm-dev

* changes:
  Increase API coverage for android.app.GameState
  Add statsd logging and address API review feedback
This commit is contained in:
TreeHugger Robot
2022-02-23 10:32:55 +00:00
committed by Android (Google) Code Review
4 changed files with 77 additions and 43 deletions

View File

@@ -5560,11 +5560,11 @@ package android.app {
public final class GameState implements android.os.Parcelable {
ctor public GameState(boolean, int);
ctor public GameState(boolean, int, @Nullable String, @NonNull android.os.Bundle);
ctor public GameState(boolean, int, int, int);
method public int describeContents();
method @Nullable public String getDescription();
method @NonNull public android.os.Bundle getMetadata();
method public int getLabel();
method public int getMode();
method public int getQuality();
method public boolean isLoading();
method public void writeToParcel(@NonNull android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.app.GameState> CREATOR;

View File

@@ -18,8 +18,6 @@ package android.app;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -88,12 +86,11 @@ public final class GameState implements Parcelable {
// One of the states listed above.
private final @GameStateMode int mMode;
// This is a game specific description. For example can be level or scene name.
private final @Nullable String mDescription;
// A developer-supplied enum, e.g. to indicate level or scene.
private final int mLabel;
// This contains any other game specific parameters not covered by the fields above. It can be
// quality parameter data, settings, or game modes.
private final @NonNull Bundle mMetaData;
// The developer-supplied enum, e.g. to indicate the current quality level.
private final int mQuality;
/**
* Create a GameState with the specified loading status.
@@ -101,29 +98,28 @@ public final class GameState implements Parcelable {
* @param mode The game state mode of type @GameStateMode.
*/
public GameState(boolean isLoading, @GameStateMode int mode) {
this(isLoading, mode, null, new Bundle());
this(isLoading, mode, -1, -1);
}
/**
* Create a GameState with the given state variables.
* @param isLoading Whether the game is in the loading state.
* @param mode The game state mode of type @GameStateMode.
* @param description An optional description of the state.
* @param metaData Optional metadata.
* @param mode The game state mode.
* @param label An optional developer-supplied enum e.g. for the current level.
* @param quality An optional developer-supplied enum, e.g. for the current quality level.
*/
public GameState(boolean isLoading, @GameStateMode int mode, @Nullable String description,
@NonNull Bundle metaData) {
public GameState(boolean isLoading, @GameStateMode int mode, int label, int quality) {
mIsLoading = isLoading;
mMode = mode;
mDescription = description;
mMetaData = metaData;
mLabel = label;
mQuality = quality;
}
private GameState(Parcel in) {
mIsLoading = in.readBoolean();
mMode = in.readInt();
mDescription = in.readString();
mMetaData = in.readBundle();
mLabel = in.readInt();
mQuality = in.readInt();
}
/**
@@ -141,17 +137,19 @@ public final class GameState implements Parcelable {
}
/**
* @return The state description, or null if one is not set.
* @return The developer-supplied enum, e.g. to indicate level or scene. The default value (if
* not supplied) is -1.
*/
public @Nullable String getDescription() {
return mDescription;
public int getLabel() {
return mLabel;
}
/**
* @return metadata associated with the state.
* @return The developer-supplied enum, e.g. to indicate the current quality level. The default
* value (if not suplied) is -1.
*/
public @NonNull Bundle getMetadata() {
return mMetaData;
public int getQuality() {
return mQuality;
}
@Override
@@ -163,8 +161,8 @@ public final class GameState implements Parcelable {
public void writeToParcel(@NonNull Parcel parcel, int flags) {
parcel.writeBoolean(mIsLoading);
parcel.writeInt(mMode);
parcel.writeString(mDescription);
parcel.writeBundle(mMetaData);
parcel.writeInt(mLabel);
parcel.writeInt(mQuality);
}
/**

View File

@@ -90,6 +90,7 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.compat.CompatibilityOverrideConfig;
import com.android.internal.compat.IPlatformCompat;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.FrameworkStatsLog;
import com.android.server.LocalServices;
import com.android.server.ServiceThread;
import com.android.server.SystemService;
@@ -268,16 +269,34 @@ public final class GameManagerService extends IGameManagerService.Stub {
break;
}
case SET_GAME_STATE: {
if (mPowerManagerInternal == null) {
final Bundle data = msg.getData();
Slog.d(TAG, "Error setting loading mode for package "
+ data.getString(PACKAGE_NAME_MSG_KEY)
+ " and userId " + data.getInt(USER_ID_MSG_KEY));
break;
}
final GameState gameState = (GameState) msg.obj;
final boolean isLoading = gameState.isLoading();
mPowerManagerInternal.setPowerMode(Mode.GAME_LOADING, isLoading);
final Bundle data = msg.getData();
final String packageName = data.getString(PACKAGE_NAME_MSG_KEY);
final int userId = data.getInt(USER_ID_MSG_KEY);
// Restrict to games only. Requires performance mode to be enabled.
final boolean boostEnabled =
getGameMode(packageName, userId) == GameManager.GAME_MODE_PERFORMANCE;
int uid;
try {
uid = mPackageManager.getPackageUidAsUser(packageName, userId);
} catch (NameNotFoundException e) {
Slog.v(TAG, "Failed to get package metadata");
uid = -1;
}
FrameworkStatsLog.write(FrameworkStatsLog.GAME_STATE_CHANGED, packageName, uid,
boostEnabled, gameStateModeToStatsdGameState(gameState.getMode()),
isLoading, gameState.getLabel(), gameState.getQuality());
if (boostEnabled) {
if (mPowerManagerInternal == null) {
Slog.d(TAG, "Error setting loading mode for package " + packageName
+ " and userId " + userId);
break;
}
mPowerManagerInternal.setPowerMode(Mode.GAME_LOADING, isLoading);
}
break;
}
}
@@ -387,12 +406,6 @@ public final class GameManagerService extends IGameManagerService.Stub {
// Restrict to games only.
return;
}
if (getGameMode(packageName, userId) != GameManager.GAME_MODE_PERFORMANCE) {
// Requires performance mode to be enabled.
return;
}
final Message msg = mHandler.obtainMessage(SET_GAME_STATE);
final Bundle data = new Bundle();
data.putString(PACKAGE_NAME_MSG_KEY, packageName);
@@ -1543,6 +1556,22 @@ public final class GameManagerService extends IGameManagerService.Stub {
return out.toString();
}
private static int gameStateModeToStatsdGameState(int mode) {
switch (mode) {
case GameState.MODE_NONE:
return FrameworkStatsLog.GAME_STATE_CHANGED__STATE__MODE_NONE;
case GameState.MODE_GAMEPLAY_INTERRUPTIBLE:
return FrameworkStatsLog.GAME_STATE_CHANGED__STATE__MODE_GAMEPLAY_INTERRUPTIBLE;
case GameState.MODE_GAMEPLAY_UNINTERRUPTIBLE:
return FrameworkStatsLog.GAME_STATE_CHANGED__STATE__MODE_GAMEPLAY_UNINTERRUPTIBLE;
case GameState.MODE_CONTENT:
return FrameworkStatsLog.GAME_STATE_CHANGED__STATE__MODE_CONTENT;
case GameState.MODE_UNKNOWN:
default:
return FrameworkStatsLog.GAME_STATE_CHANGED__STATE__MODE_UNKNOWN;
}
}
private static ServiceThread createServiceThread() {
ServiceThread handlerThread = new ServiceThread(TAG,
Process.THREAD_PRIORITY_BACKGROUND, true /*allowIo*/);

View File

@@ -1167,7 +1167,14 @@ public class GameManagerServiceTests {
startUser(gameManagerService, USER_ID_1);
gameManagerService.setGameMode(
mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_1);
GameState gameState = new GameState(isLoading, GameState.MODE_NONE);
int testMode = GameState.MODE_NONE;
int testLabel = 99;
int testQuality = 123;
GameState gameState = new GameState(isLoading, testMode, testLabel, testQuality);
assertEquals(isLoading, gameState.isLoading());
assertEquals(testMode, gameState.getMode());
assertEquals(testLabel, gameState.getLabel());
assertEquals(testQuality, gameState.getQuality());
gameManagerService.setGameState(mPackageName, gameState, USER_ID_1);
mTestLooper.dispatchAll();
verify(mMockPowerManager, times(1)).setPowerMode(Mode.GAME_LOADING, isLoading);