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

Commit a010375c authored by smain@google.com's avatar smain@google.com
Browse files

some fixes to TV App quality and TV games doc.

add section to TV Games doc about controller instructions w/ template download.
clarify use of <meta-data> tag and standardize headings per Training conventions.

Change-Id: I6f61a0d4fd976098a6db9ded33c61419a764ad4f
parent 2fa604fc
Loading
Loading
Loading
Loading
+13 −12
Original line number Diff line number Diff line
@@ -234,7 +234,7 @@ page.image=/distribute/images/gp-tv-quality.png
  </td>
  <td>
    <p style="margin-bottom:.5em;">
      App does not depend on a remote controller having a menu button to access user interface
      App does not depend on a remote controller having a Menu button to access user interface
      controls.
      (<a href="{@docRoot}training/tv/start/navigation.html#d-pad-navigation">Learn how</a>)
    </p>
@@ -291,8 +291,8 @@ data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
  </td>
  <td>
    <p style="margin-bottom:.5em;">
      App manifest sets an intent type of {@code ACTION_MAIN} with category
      {@code CATEGORY_LEANBACK_LAUNCHER}.
      App manifest sets an intent type of {@link android.content.Intent#ACTION_MAIN} with category
      {@link android.content.Intent#CATEGORY_LEANBACK_LAUNCHER}.
      (<a href="{@docRoot}training/tv/start/start.html#tv-activity">Learn how</a>)
    </p>
  </td>
@@ -321,8 +321,9 @@ data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
  </td>
  <td>
    <p style="margin-bottom:.5em;">
      If the app requires a game controller, the app manifest sets the {@code uses-feature} setting
      {@code android.hardware.gamepad} to {@code required="true"}.
      If the app uses a game controller as it's primary input method, it declares the appropriate
      requirement with the <a href="{@docRoot}guide/topics/manifest/uses-feature-element.html"
      >{@code &lt;uses-feature>}</a> manifest tag.
      (<a href="{@docRoot}training/tv/games/index.html#gamepad">Learn how</a>)
    </p>
  </td>
@@ -334,9 +335,9 @@ data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
  </td>
  <td>
    <p style="margin-bottom:.5em;">
      If the app provides user instructions for use of game controllers, the instructions
      do not include a controller with any branding.
      (<a href="{@docRoot}training/tv/games/index.html#generic-controllers">Learn how</a>)
      If the app provides visual instructions for using game controllers, the instructions should
      be free of branding and show a compatible button layout.
      (<a href="{@docRoot}training/tv/games/index.html#ControllerHelp">Learn how</a>)
    </p>
  </td>
</tr>
@@ -351,7 +352,7 @@ data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
  </td>
  <td>
    <p style="margin-bottom:.5em;">
      App enables interaction with any advertising using D-pad controls.
      App allows interaction with advertising using D-pad controls.
      (<a href="{@docRoot}training/tv/start/navigation.html#d-pad-navigation">Learn how</a>)
    </p>
  </td>
@@ -363,7 +364,7 @@ data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
  </td>
  <td>
    <p style="margin-bottom:.5em;">
      For advertising that uses full-screen, non-video ads, the app allows the user to
      For advertising that uses fullscreen, non-video ads, the app allows the user to
      immediately dismiss the ad with D-pad controls.
    </p>
  </td>
+41.1 KiB
Loading image diff...
+68 KiB
Loading image diff...
+62 −32
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ page.article=true
</p>


<h3 id="shared-display">Shared display</h3>
<h3 id="shared-display">Consider the shared display</h3>

<p>
  A living-room TV poses design challenges for multiplayer games, in that all players can see
@@ -57,7 +57,7 @@ page.article=true
</ul>


<h3 id="landscape-display">Landscape display</h3>
<h3 id="landscape-display">Support landscape display</h3>

<p>
  A TV is always sideways: You can’t turn it, and there is no portrait orientation. Always design
@@ -69,19 +69,19 @@ page.article=true

<p>
  TVs don't have touch interfaces, so it's even more important to get your controls right and make
  sure that players find them intuitive and fun to use. The separation of controller from device
  also introduces some other issues to pay attention to, like keeping track of multiple players'
  sure players find them intuitive and fun to use. Handling controllers
  also introduces some other issues to pay attention to, like keeping track of multiple
  controllers, and handling disconnects gracefully.
</p>

<h3 id="d-pad">D-pad</h3>
<h3 id="d-pad">Support D-pad controls</h3>

<p>
  Plan your control scheme around a directional pad (D-pad) control, since this control set is the
  default for Android TV devices. The player needs to be able to use a D-Pad in all aspects of the
  gamenot just controlling core gameplay, but also navigating menus and ads. For this reason, you
  should also ensure that your Android TV game does not refer to a touch interface: For example, an
  Android TV game should not tell a player to <strong>Tap here to skip</strong>.
  game&mdash;not just controlling core gameplay, but also navigating menus and ads. For this reason, you
  should also ensure that your Android TV game does not refer to a touch interface. For example, an
  Android TV game should not tell a player to "<em>Tap</em> here to continue."
</p>

<p>
@@ -91,35 +91,35 @@ page.article=true

<ul>
  <li>
    <strong>Communicate Controller Requirements up Front</strong> - Use your Play Store description
    <strong>Communicate Controller Requirements up Front</strong>. Use your Google Play description
    to communicate to the player any expectations about controllers. If a game is better suited to
    a gamepad with a joystick than one with only a D-pad, make this fact clear. A player who uses
    an ill-suited controller for a game is likely to have a subpar experienceand penalize your
    an ill-suited controller for a game is likely to have a subpar experience and penalize your
    game in the ratings.
  </li>
  <li>
    <strong>Use Consistent Button Mapping</strong> - Intuitive and flexible button mapping is key
    to a good user experience. For example, you can adhere to accepted custom by using the A button
    to <code>Accept</code>, and the B button to <code>Cancel</code>. You can also offer flexibility
    in the form of remappability. For more information on button mapping, see <a href=
    <strong>Use Consistent Button Mapping</strong>. Intuitive and flexible button mapping is key
    to a good user experience. For example, you should adhere to accepted customs by using the A button
    to <em>Accept</em>, and the B button to <em>Cancel</em>. You can also offer flexibility
    in the form of remappability. For more information about button mapping, see <a href=
    "http://developer.android.com/training/game-controllers/controller-input.html">Handling
    Controller Actions</a>.
  </li>
  <li>
    <strong>Detect Controller Capabilities and Adjust Accordingly</strong> - Query the controller
    <strong>Detect Controller Capabilities and Adjust Accordingly</strong>. Query the controller
    about its capabilities in order to optimize the match between controller and game. For example,
    you may intend for a player to steer an object by waving the controller in the air. If a
    player's controller lacks accelerometer and gyroscope hardware, however, waving will not work.
    When, however, your game queries the controller and discovers that motion detection is not
    supported, it can switch over to an alternative, available control scheme. For more information
    on querying controller capabilities, see <a href=
    So, your game should query the controller and if motion detection is not
    supported, switch over to an alternative, available control scheme. For more information
    about querying controller capabilities, see <a href=
    "http://developer.android.com/training/game-controllers/compatibility.html">Supporting
    Controllers Across Android Versions</a>.
  </li>
</ul>


<h3 id="back-button">Back-button behavior</h3>
<h3 id="back-button">Provide appropriate Back-button behavior</h3>

<p>
  The Back button should never act as a toggle. For example, do not use it to both open and close a
@@ -139,18 +139,18 @@ page.article=true
</p>


<h3 id="multiple-controllers">Handling multiple controllers</h3>
<h3 id="multiple-controllers">Handle multiple controllers</h3>

<p>
  When multiple players are playing a game, each with his or her own controller, it is important to
  map each player-controller pair. For information on how to implement controller-number
  map each player-controller pair. For information about how to implement controller-number
  identification, see <a href=
  "http://developer.android.com/reference/android/view/InputDevice.html#getControllerNumber">Input
  Devices</a>.
</p>


<h3 id="handle-disconnect">Handling disconnects</h3>
<h3 id="handle-disconnect">Handle controller disconnects</h3>

<p>
  When a controller is disconnected in the middle of gameplay, the game should pause, and a dialog
@@ -159,7 +159,7 @@ page.article=true

<p>
  The dialog should also offer troubleshooting tips (for example, a pop-up dialog telling the
  player to "Check your Bluetooth connection"). For more information on implementing input-device
  player to "Check your Bluetooth connection"). For more information about implementing input-device
  support, see <a href=
  "http://developer.android.com/training/game-controllers/controller-input.html">Handling Controller
  Actions</a>. Specific information about Bluetooth connections is at <a href=
@@ -167,13 +167,41 @@ page.article=true
</p>


<h3 id="ControllerHelp">Show controller instructions</h3>

<p>If your game provides visual game control instructions, the
controller image should be free of branding and include only <a
href="{@docRoot}training/game-controllers/controller-input.html#button"
>buttons compatible with Android</a>.</p>

<p>For sample images of an Android-compatible controller, download the
<a href="http://storage.googleapis.com/androiddevelopers/design/android_tv_gamepad_template-2014-10.zip"
>Android TV Gamepad Template (ZIP)</a>.
It includes a white controller on black background and a black controller on white background
(shown in figure 1), as a PNG file and an Adobe&reg; Illustrator&reg; file.</p>

<img src="{@docRoot}images/games/game-controller-buttons_2x.png" width="700"
     srcset="{@docRoot}images/games/game-controller-buttons_2x.png 2x,
             {@docRoot}images/games/game-controller-buttons.png 1x" />
<p class="img-caption"><b>Figure 1.</b> Example controller instructions using the
<a href="http://storage.googleapis.com/androiddevelopers/design/android_tv_gamepad_template-2014-10.zip"
>Android TV Gamepad Template (ZIP)</a>.




<h2 id="manifest">Manifest</h2>

<p>There are a some special things games should include in the Android manifest.</p>

<h3 id="Launcher">Show your game in the launcher</h3>
<p>
  The Android TV launcher home screen displays games in a separate row from regular apps. The TV
  framework uses the <code>android:isGame</code> manifest attribute to differentiate games from
  non-game apps. Set this value to <code>true</code> in your game's app manifest, as shown in the
  following code example:
  The Android TV launcher home screen displays games in a separate row from regular apps.
  To make your game appear in the list of games, add the
  <a href="{@docRoot}guide/topics/manifest/meta-data-element.html"
  ><code>&lt;meta-data></code></a> tag in your app manifest with <code>android:name</code>
  set to <code>"isGame"</code> and <code>android:value</code>
  set to <code>"true"</code>. For example:
</p>

<pre class="fragment">
@@ -185,7 +213,7 @@ page.article=true
</pre>


<h3 id="gamepad">Game Controllers</h3>
<h3 id="gamepad">Declare support for game controllers</h3>

<p>
  Games controllers may not be available or active for users of a TV device. In order to properly
@@ -215,7 +243,9 @@ page.article=true
<h2 id="gpgs">Google Play Game Services</h2>

<p>
  If your game integrates Google Play Game Services, you should keep in mind a number of
  If your game integrates <a
  href="https://developers.google.com/games/services/">Google Play Game services</a>,
  you should keep in mind a number of
  considerations pertaining to achievements, sign-in, saving games, and multiplayer play.
</p>

@@ -224,7 +254,7 @@ page.article=true

<p>
  Your game should include at least five (earnable) achievements. Only a user controlling gameplay
  from a supported input device should be able to earn achievements. For more information on
  from a supported input device should be able to earn achievements. For more information about
  achievements and how to implement them, see <a href=
  "https://developers.google.com/games/services/android/achievements">Achievements in Android</a>.
</p>
@@ -262,7 +292,7 @@ page.article=true

<p>
  A game offering a multiplayer experience must allow at least two players to enter a room. For
  further information on multiplayer games in Android, see the <a href=
  further information about multiplayer games in Android, see the <a href=
  "https://developers.google.com/games/services/android/realtimeMultiplayer">Real-time
  Multiplayer</a> and <a href="">Turn-based Multiplayer</a> documentation on the Android developer
  site.