GameManager: Add Public API

Add the public API to GameManager:
- getGameMode()

Bug: b/178860939
Test: atest CtsGameManagerTestCases
Test: atest GameManagerTests
Test: atest GameManagerServiceTests
Test: atest GameManagerServiceSettingsTests
Change-Id: Ie6030e4ec796c9ecf2c756f24f00e445572accda
diff --git a/core/api/current.txt b/core/api/current.txt
index 8710e61..a5d6444 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -5311,6 +5311,14 @@
     field @Deprecated public static final int TRANSIT_UNSET = -1; // 0xffffffff
   }
 
+  public final class GameManager {
+    method public int getGameMode();
+    field public static final int GAME_MODE_BATTERY = 3; // 0x3
+    field public static final int GAME_MODE_PERFORMANCE = 2; // 0x2
+    field public static final int GAME_MODE_STANDARD = 1; // 0x1
+    field public static final int GAME_MODE_UNSUPPORTED = 0; // 0x0
+  }
+
   public class Instrumentation {
     ctor public Instrumentation();
     method public android.os.TestLooperManager acquireLooperManager(android.os.Looper);
@@ -10487,6 +10495,7 @@
     field public static final String EUICC_SERVICE = "euicc";
     field public static final String FILE_INTEGRITY_SERVICE = "file_integrity";
     field public static final String FINGERPRINT_SERVICE = "fingerprint";
+    field public static final String GAME_SERVICE = "game";
     field public static final String HARDWARE_PROPERTIES_SERVICE = "hardware_properties";
     field public static final String INPUT_METHOD_SERVICE = "input_method";
     field public static final String INPUT_SERVICE = "input";
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 29ea74e..61c8314 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -259,6 +259,10 @@
     method @RequiresPermission(android.Manifest.permission.WRITE_DREAM_STATE) public void stopDream();
   }
 
+  public final class GameManager {
+    method @RequiresPermission("android.permission.MANAGE_GAME_MODE") public void setGameMode(@NonNull String, int);
+  }
+
   public abstract class HomeVisibilityListener {
     ctor public HomeVisibilityListener();
     method public abstract void onHomeVisibilityChanged(boolean);
diff --git a/core/java/android/app/GameManager.java b/core/java/android/app/GameManager.java
index ac1fa1e..47de040 100644
--- a/core/java/android/app/GameManager.java
+++ b/core/java/android/app/GameManager.java
@@ -18,8 +18,11 @@
 
 import android.Manifest;
 import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.annotation.RequiresPermission;
 import android.annotation.SystemService;
+import android.annotation.TestApi;
 import android.annotation.UserHandleAware;
 import android.content.Context;
 import android.os.Handler;
@@ -27,57 +30,87 @@
 import android.os.ServiceManager;
 import android.os.ServiceManager.ServiceNotFoundException;
 
-import com.android.internal.annotations.VisibleForTesting;
-
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
 /**
  * The GameManager allows system apps to modify and query the game mode of apps.
- *
- * @hide
  */
-@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
 @SystemService(Context.GAME_SERVICE)
 public final class GameManager {
 
     private static final String TAG = "GameManager";
 
-    private final Context mContext;
+    private final @Nullable Context mContext;
     private final IGameManagerService mService;
 
-    @IntDef(flag = false, prefix = { "GAME_MODE_" }, value = {
+    /** @hide */
+    @IntDef(flag = false, prefix = {"GAME_MODE_"}, value = {
             GAME_MODE_UNSUPPORTED, // 0
             GAME_MODE_STANDARD, // 1
             GAME_MODE_PERFORMANCE, // 2
             GAME_MODE_BATTERY, // 3
     })
     @Retention(RetentionPolicy.SOURCE)
-    public @interface GameMode {}
+    public @interface GameMode {
+    }
 
+    /**
+     * Game mode is not supported for this application.
+     */
     public static final int GAME_MODE_UNSUPPORTED = 0;
+
+    /**
+     * Standard game mode means the platform will use the game's default
+     * performance characteristics.
+     */
     public static final int GAME_MODE_STANDARD = 1;
+
+    /**
+     * Performance game mode maximizes the game's performance.
+     * <p>
+     * This game mode is highly likely to increase battery consumption.
+     */
     public static final int GAME_MODE_PERFORMANCE = 2;
+
+    /**
+     * Battery game mode will save battery and give longer game play time.
+     */
     public static final int GAME_MODE_BATTERY = 3;
 
-    public GameManager(Context context, Handler handler) throws ServiceNotFoundException {
+    GameManager(Context context, Handler handler) throws ServiceNotFoundException {
         mContext = context;
         mService = IGameManagerService.Stub.asInterface(
                 ServiceManager.getServiceOrThrow(Context.GAME_SERVICE));
     }
 
-    @VisibleForTesting
-    public GameManager(Context context, IGameManagerService gameManagerService) {
-        mContext = context;
-        mService = gameManagerService;
+    /**
+     * Return the user selected game mode for this application.
+     * <p>
+     * An application can use <code>android:isGame="true"</code> or
+     * <code>android:appCategory="game"</code> to indicate that the application is a game. If an
+     * application is not a game, always return {@link #GAME_MODE_UNSUPPORTED}.
+     * <p>
+     * Developers should call this API every time the application is resumed.
+     */
+    public @GameMode int getGameMode() {
+        try {
+            return mService.getGameMode(mContext.getPackageName(), mContext.getUserId());
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
     }
 
     /**
-     * Returns the game mode for the given package.
+     * Gets the game mode for the given package.
+     * <p>
+     * The caller must have {@link android.Manifest.permission#MANAGE_GAME_MODE}.
+     *
+     * @hide
      */
     @UserHandleAware
     @RequiresPermission(Manifest.permission.MANAGE_GAME_MODE)
-    public @GameMode int getGameMode(String packageName) {
+    public @GameMode int getGameMode(@NonNull String packageName) {
         try {
             return mService.getGameMode(packageName, mContext.getUserId());
         } catch (RemoteException e) {
@@ -87,10 +120,15 @@
 
     /**
      * Sets the game mode for the given package.
+     * <p>
+     * The caller must have {@link android.Manifest.permission#MANAGE_GAME_MODE}.
+     *
+     * @hide
      */
+    @TestApi
     @UserHandleAware
     @RequiresPermission(Manifest.permission.MANAGE_GAME_MODE)
-    public void setGameMode(String packageName, @GameMode int gameMode) {
+    public void setGameMode(@NonNull String packageName, @GameMode int gameMode) {
         try {
             mService.setGameMode(packageName, gameMode, mContext.getUserId());
         } catch (RemoteException e) {
diff --git a/core/java/android/app/IGameManager.aidl b/core/java/android/app/IGameManager.aidl
new file mode 100644
index 0000000..3730de8
--- /dev/null
+++ b/core/java/android/app/IGameManager.aidl
@@ -0,0 +1,28 @@
+/*
+ * 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;
+
+/**
+ * Interface used to control Game Manager modes.
+ * @hide
+ */
+interface IGameManager {
+    /**
+     * Return the current Game Mode for the calling package.
+     */
+    int getGameMode();
+}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index f3a4e1f..ea6040d 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -5514,8 +5514,6 @@
      * {@link GameManager}.
      *
      * @see #getSystemService(String)
-     *
-     * @hide
      */
     public static final String GAME_SERVICE = "game";
 
diff --git a/core/tests/GameManagerTests/Android.bp b/core/tests/GameManagerTests/Android.bp
index 2789e9f..8c5d6d5 100644
--- a/core/tests/GameManagerTests/Android.bp
+++ b/core/tests/GameManagerTests/Android.bp
@@ -29,6 +29,7 @@
         "androidx.test.rules",
         "frameworks-base-testutils",
         "junit",
+        "platform-test-annotations",
         "truth-prebuilt",
     ],
     libs: ["android.test.runner"],
diff --git a/core/tests/GameManagerTests/src/android/app/GameManagerTests.java b/core/tests/GameManagerTests/src/android/app/GameManagerTests.java
index 8f50051..0c96411 100644
--- a/core/tests/GameManagerTests/src/android/app/GameManagerTests.java
+++ b/core/tests/GameManagerTests/src/android/app/GameManagerTests.java
@@ -16,13 +16,13 @@
 
 package android.app;
 
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
 import static junit.framework.Assert.assertEquals;
 
-import android.app.GameManager.GameMode;
-import android.util.ArrayMap;
-import android.util.Pair;
+import android.content.Context;
+import android.platform.test.annotations.Presubmit;
 
-import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
 
@@ -35,22 +35,43 @@
  */
 @RunWith(AndroidJUnit4.class)
 @SmallTest
+@Presubmit
 public final class GameManagerTests {
     private static final String PACKAGE_NAME_0 = "com.android.app0";
     private static final String PACKAGE_NAME_1 = "com.android.app1";
 
-    private TestGameManagerService mService;
+    protected Context mContext;
     private GameManager mGameManager;
+    private String mPackageName;
 
     @Before
     public void setUp() {
-        mService = new TestGameManagerService();
-        mGameManager = new GameManager(
-                InstrumentationRegistry.getContext(), mService);
+        mContext = getInstrumentation().getContext();
+        mGameManager = mContext.getSystemService(GameManager.class);
+        mPackageName = mContext.getPackageName();
+
+        // Reset the Game Mode for the test app, since it persists across invocations.
+        mGameManager.setGameMode(mPackageName, GameManager.GAME_MODE_UNSUPPORTED);
+        mGameManager.setGameMode(PACKAGE_NAME_0, GameManager.GAME_MODE_UNSUPPORTED);
+        mGameManager.setGameMode(PACKAGE_NAME_1, GameManager.GAME_MODE_UNSUPPORTED);
     }
 
     @Test
-    public void testGameModeGetterSetter() {
+    public void testPublicApiGameModeGetterSetter() {
+        assertEquals(GameManager.GAME_MODE_UNSUPPORTED,
+                mGameManager.getGameMode());
+
+        mGameManager.setGameMode(mPackageName, GameManager.GAME_MODE_STANDARD);
+        assertEquals(GameManager.GAME_MODE_STANDARD,
+                mGameManager.getGameMode());
+
+        mGameManager.setGameMode(mPackageName, GameManager.GAME_MODE_PERFORMANCE);
+        assertEquals(GameManager.GAME_MODE_PERFORMANCE,
+                mGameManager.getGameMode());
+    }
+
+    @Test
+    public void testPrivilegedGameModeGetterSetter() {
         assertEquals(GameManager.GAME_MODE_UNSUPPORTED,
                 mGameManager.getGameMode(PACKAGE_NAME_0));
 
@@ -62,22 +83,4 @@
         assertEquals(GameManager.GAME_MODE_PERFORMANCE,
                 mGameManager.getGameMode(PACKAGE_NAME_1));
     }
-
-    private final class TestGameManagerService extends IGameManagerService.Stub {
-        private final ArrayMap<Pair<String, Integer>, Integer> mGameModes = new ArrayMap<>();
-
-        @Override
-        public @GameMode int getGameMode(String packageName, int userId) {
-            final Pair key = Pair.create(packageName, userId);
-            if (mGameModes.containsKey(key)) {
-                return mGameModes.get(key);
-            }
-            return GameManager.GAME_MODE_UNSUPPORTED;
-        }
-
-        @Override
-        public void setGameMode(String packageName, @GameMode int gameMode, int userId) {
-            mGameModes.put(Pair.create(packageName, userId), gameMode);
-        }
-    }
 }
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 1393116..0687191 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -418,6 +418,9 @@
     <!-- Permission required for CTS test - PeopleManagerTest -->
     <uses-permission android:name="android.permission.READ_PEOPLE_DATA" />
 
+    <!-- Permission required for CTS test - CtsGameManagerTestCases -->
+    <uses-permission android:name="android.permission.MANAGE_GAME_MODE" />
+
     <application android:label="@string/app_label"
                 android:theme="@android:style/Theme.DeviceDefault.DayNight"
                 android:defaultToDeviceProtectedStorage="true"
diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java
index 26ce0d7..0eae661 100644
--- a/services/core/java/com/android/server/app/GameManagerService.java
+++ b/services/core/java/com/android/server/app/GameManagerService.java
@@ -136,6 +136,7 @@
 
     /**
      * SystemService lifecycle for GameService.
+     *
      * @hide
      */
     public static class Lifecycle extends SystemService {
@@ -169,39 +170,69 @@
         }
     }
 
-    private boolean hasPermission(String permission) {
-        return mContext.checkCallingOrSelfPermission(permission)
-                == PackageManager.PERMISSION_GRANTED;
+    private boolean isValidPackageName(String packageName) {
+        final PackageManager pm = mContext.getPackageManager();
+        try {
+            return pm.getPackageUid(packageName, 0) == Binder.getCallingUid();
+        } catch (PackageManager.NameNotFoundException e) {
+            e.printStackTrace();
+            return false;
+        }
     }
 
-    @Override
-    @RequiresPermission(Manifest.permission.MANAGE_GAME_MODE)
-    public @GameMode int getGameMode(String packageName, int userId) {
-        if (!hasPermission(Manifest.permission.MANAGE_GAME_MODE)) {
-            Log.w(TAG, String.format("Caller or self does not have permission.MANAGE_GAME_MODE"));
-            return GameManager.GAME_MODE_UNSUPPORTED;
+    private void checkPermission(String permission) throws SecurityException {
+        if (mContext.checkCallingOrSelfPermission(permission)
+                != PackageManager.PERMISSION_GRANTED) {
+            throw new SecurityException("Access denied to process: " + Binder.getCallingPid()
+                    + ", must have permission " + permission);
         }
+    }
+
+    private @GameMode int getGameModeFromSettings(String packageName, int userId) {
+        synchronized (mLock) {
+            if (!mSettings.containsKey(userId)) {
+                Log.w(TAG, "User ID '" + userId + "' does not have a Game Mode"
+                        + " selected for package: '" + packageName + "'");
+                return GameManager.GAME_MODE_UNSUPPORTED;
+            }
+
+            return mSettings.get(userId).getGameModeLocked(packageName);
+        }
+    }
+
+    /**
+     * Get the Game Mode for the package name.
+     * Verifies that the calling process is for the matching package UID or has
+     * {@link android.Manifest.permission#MANAGE_GAME_MODE}.
+     */
+    @Override
+    public @GameMode int getGameMode(String packageName, int userId)
+            throws SecurityException {
+        // TODO(b/178860939): Restrict to games only.
 
         userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(),
                 Binder.getCallingUid(), userId, false, true, "getGameMode",
                 "com.android.server.app.GameManagerService");
 
-        synchronized (mLock) {
-            if (!mSettings.containsKey(userId)) {
-                return GameManager.GAME_MODE_UNSUPPORTED;
-            }
-            GameManagerSettings userSettings = mSettings.get(userId);
-            return userSettings.getGameModeLocked(packageName);
+        if (isValidPackageName(packageName)) {
+            return getGameModeFromSettings(packageName, userId);
         }
+
+        checkPermission(Manifest.permission.MANAGE_GAME_MODE);
+        return getGameModeFromSettings(packageName, userId);
     }
 
+    /**
+     * Sets the Game Mode for the package name.
+     * Verifies that the calling process has {@link android.Manifest.permission#MANAGE_GAME_MODE}.
+     */
     @Override
     @RequiresPermission(Manifest.permission.MANAGE_GAME_MODE)
-    public void setGameMode(String packageName, @GameMode int gameMode, int userId) {
-        if (!hasPermission(Manifest.permission.MANAGE_GAME_MODE)) {
-            Log.w(TAG, String.format("Caller or self does not have permission.MANAGE_GAME_MODE"));
-            return;
-        }
+    public void setGameMode(String packageName, @GameMode int gameMode, int userId)
+            throws SecurityException {
+        // TODO(b/178860939): Restrict to games only.
+
+        checkPermission(Manifest.permission.MANAGE_GAME_MODE);
 
         userId = ActivityManager.handleIncomingUser(Binder.getCallingPid(),
                 Binder.getCallingUid(), userId, false, true, "setGameMode",
diff --git a/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java b/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java
index 6d4189e..5be05d8 100644
--- a/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java
+++ b/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java
@@ -20,6 +20,7 @@
 import static org.junit.Assert.assertThat;
 
 import android.content.Context;
+import android.platform.test.annotations.Presubmit;
 import android.util.AtomicFile;
 import android.util.Log;
 
@@ -37,6 +38,7 @@
 
 @RunWith(AndroidJUnit4.class)
 @SmallTest
+@Presubmit
 public class GameManagerServiceSettingsTests {
 
     private static final String TAG = "GameServiceSettingsTests";
diff --git a/services/tests/servicestests/src/com/android/server/app/GameManagerServiceTests.java b/services/tests/servicestests/src/com/android/server/app/GameManagerServiceTests.java
index d039a9d..3d0895d 100644
--- a/services/tests/servicestests/src/com/android/server/app/GameManagerServiceTests.java
+++ b/services/tests/servicestests/src/com/android/server/app/GameManagerServiceTests.java
@@ -17,12 +17,14 @@
 package com.android.server.app;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 
 import android.Manifest;
 import android.app.GameManager;
 import android.content.Context;
 import android.content.ContextWrapper;
 import android.content.pm.PackageManager;
+import android.platform.test.annotations.Presubmit;
 
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
@@ -38,11 +40,11 @@
 
 @RunWith(AndroidJUnit4.class)
 @SmallTest
+@Presubmit
 public class GameManagerServiceTests {
 
     private static final String TAG = "GameServiceTests";
-    private static final String PACKAGE_NAME_0 = "com.android.app0";
-    private static final String PACKAGE_NAME_1 = "com.android.app1";
+    private static final String PACKAGE_NAME_INVALID = "com.android.app";
     private static final int USER_ID_1 = 1001;
     private static final int USER_ID_2 = 1002;
 
@@ -62,6 +64,7 @@
          *
          * <p>Passing null reverts to default behavior, which does a real permission check on the
          * test package.
+         *
          * @param granted One of {@link PackageManager#PERMISSION_GRANTED} or
          *                {@link PackageManager#PERMISSION_DENIED}.
          */
@@ -103,9 +106,12 @@
     @Mock
     private MockContext mMockContext;
 
+    private String mPackageName;
+
     @Before
     public void setUp() throws Exception {
         mMockContext = new MockContext(InstrumentationRegistry.getContext());
+        mPackageName = mMockContext.getPackageName();
     }
 
     private void mockModifyGameModeGranted() {
@@ -129,7 +135,7 @@
         mockModifyGameModeGranted();
 
         assertEquals(GameManager.GAME_MODE_UNSUPPORTED,
-                gameManagerService.getGameMode(PACKAGE_NAME_0, USER_ID_1));
+                gameManagerService.getGameMode(mPackageName, USER_ID_1));
     }
 
     /**
@@ -142,9 +148,9 @@
 
         mockModifyGameModeGranted();
 
-        gameManagerService.setGameMode(PACKAGE_NAME_1, GameManager.GAME_MODE_STANDARD, USER_ID_2);
+        gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_STANDARD, USER_ID_2);
         assertEquals(GameManager.GAME_MODE_UNSUPPORTED,
-                gameManagerService.getGameMode(PACKAGE_NAME_1, USER_ID_2));
+                gameManagerService.getGameMode(mPackageName, USER_ID_2));
     }
 
     /**
@@ -152,40 +158,41 @@
      */
     @Test
     public void testGameMode() {
-        GameManagerService gameManagerService =  new GameManagerService(mMockContext);
+        GameManagerService gameManagerService = new GameManagerService(mMockContext);
         gameManagerService.onUserStarting(USER_ID_1);
 
         mockModifyGameModeGranted();
 
         assertEquals(GameManager.GAME_MODE_UNSUPPORTED,
-                gameManagerService.getGameMode(PACKAGE_NAME_1, USER_ID_1));
-        gameManagerService.setGameMode(PACKAGE_NAME_1, GameManager.GAME_MODE_STANDARD, USER_ID_1);
+                gameManagerService.getGameMode(mPackageName, USER_ID_1));
+        gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_STANDARD, USER_ID_1);
         assertEquals(GameManager.GAME_MODE_STANDARD,
-                gameManagerService.getGameMode(PACKAGE_NAME_1, USER_ID_1));
-        gameManagerService.setGameMode(PACKAGE_NAME_1, GameManager.GAME_MODE_PERFORMANCE,
+                gameManagerService.getGameMode(mPackageName, USER_ID_1));
+        gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_PERFORMANCE,
                 USER_ID_1);
         assertEquals(GameManager.GAME_MODE_PERFORMANCE,
-                gameManagerService.getGameMode(PACKAGE_NAME_1, USER_ID_1));
+                gameManagerService.getGameMode(mPackageName, USER_ID_1));
     }
 
     /**
      * Test permission.MANAGE_GAME_MODE is checked
      */
     @Test
-    public void testGetGameModePermissionDenied() {
-        GameManagerService gameManagerService =  new GameManagerService(mMockContext);
+    public void testGetGameModeInvalidPackageName() {
+        GameManagerService gameManagerService = new GameManagerService(mMockContext);
         gameManagerService.onUserStarting(USER_ID_1);
 
-        // Update the game mode so we can read back something valid.
-        mockModifyGameModeGranted();
-        gameManagerService.setGameMode(PACKAGE_NAME_1, GameManager.GAME_MODE_STANDARD, USER_ID_1);
-        assertEquals(GameManager.GAME_MODE_STANDARD,
-                gameManagerService.getGameMode(PACKAGE_NAME_1, USER_ID_1));
+        try {
+            assertEquals(GameManager.GAME_MODE_UNSUPPORTED,
+                    gameManagerService.getGameMode(PACKAGE_NAME_INVALID,
+                            USER_ID_1));
 
-        // Deny permission.MANAGE_GAME_MODE and verify we get back GameManager.GAME_MODE_UNSUPPORTED
-        mockModifyGameModeDenied();
-        assertEquals(GameManager.GAME_MODE_UNSUPPORTED,
-                gameManagerService.getGameMode(PACKAGE_NAME_1, USER_ID_1));
+            fail("GameManagerService failed to generate SecurityException when "
+                    + "permission.MANAGE_GAME_MODE is not granted.");
+        } catch (SecurityException ignored) {
+        }
+
+        // The test should throw an exception, so the test is passing if we get here.
     }
 
     /**
@@ -193,22 +200,30 @@
      */
     @Test
     public void testSetGameModePermissionDenied() {
-        GameManagerService gameManagerService =  new GameManagerService(mMockContext);
+        GameManagerService gameManagerService = new GameManagerService(mMockContext);
         gameManagerService.onUserStarting(USER_ID_1);
 
         // Update the game mode so we can read back something valid.
         mockModifyGameModeGranted();
-        gameManagerService.setGameMode(PACKAGE_NAME_1, GameManager.GAME_MODE_STANDARD, USER_ID_1);
+        gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_STANDARD, USER_ID_1);
         assertEquals(GameManager.GAME_MODE_STANDARD,
-                gameManagerService.getGameMode(PACKAGE_NAME_1, USER_ID_1));
+                gameManagerService.getGameMode(mPackageName, USER_ID_1));
 
         // Deny permission.MANAGE_GAME_MODE and verify the game mode is not updated.
         mockModifyGameModeDenied();
-        gameManagerService.setGameMode(PACKAGE_NAME_1, GameManager.GAME_MODE_PERFORMANCE,
-                USER_ID_1);
+        try {
+            gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_PERFORMANCE,
+                    USER_ID_1);
 
+            fail("GameManagerService failed to generate SecurityException when "
+                    + "permission.MANAGE_GAME_MODE is denied.");
+        } catch (SecurityException ignored) {
+        }
+
+        // The test should throw an exception, so the test is passing if we get here.
         mockModifyGameModeGranted();
+        // Verify that the Game Mode value wasn't updated.
         assertEquals(GameManager.GAME_MODE_STANDARD,
-                gameManagerService.getGameMode(PACKAGE_NAME_1, USER_ID_1));
+                gameManagerService.getGameMode(mPackageName, USER_ID_1));
     }
 }