# QIYU Application Review Guidelines

Latest Updated Date: 27th July, 2021

# I. Packaging Requirements

  1. # The application must be compatible with VR devices.

  2. # The application must be signed. All subsequent versions of your app must also be signed with the same certificate and name.

  3. # You app must not require Android features that aren’t supported on QiYu 3. Such as Google Mobile Services, camera access, HMD touchpad, and more.

  4. # You must use a supported SDK and Unity Engine version, browse more details in QIYU Device Developer SDK & Document (opens new window).

  5. # APK files must be less than 3.5 GB in size, but can be accompanied by multiple (up to 5) expansion files up to 3.5 GB each.

  6. # All QiYu applications must be released version and submitted as C++ 64-bit binary files.

# II. Audio Requirements

  1. # Additional Details

    For more information, see QIYU Device Developer SDK & Document (opens new window) - Audio.

    # Steps to Test

    Locate a sound source within the app and rotate your head.

    # Expected Result

    Sound should switch appropriately between speakers.

# III. Performance Requirements

  1. # The app must use a refresh at least 72 Hz on QiYu 3.

    # Additional Details

    For more information, see QIYU Device Developer SDK & Document (opens new window).

    The SDK Sample provides FPS.cs for calculating FPS.

    # Expected Result

    The application should not experience extended periods of framerate below the requested refresh rate of the display. Exceptions include when there’s a black screen or loading scenes.

  2. # The app must run for 45 minutes with typical usage without entering thermal throttling Power Save mode.

    # Steps to Test
    1. Run the script. Please Click here (opens new window) to Download the script.

      adb push freq_temp.sh /sdcard/
      adb shell
      cd sdcard
      chmod 775 freq_temp.sh
      nohup sh freq_temp.sh > data.csv &
      
    2. Use the app for length of the content or 45 minutes, whichever is shorter.

    3. Get output data.csv from sdcard, can check each CPU/GPU frequence and thermel.

    # Expected Result

    Device's performance will not be degraded because of thermal issues caused by running application.

  3. # The app must either display a slow head tracked graphics in the headset within 4 seconds of launch or provide a loading indicator in VR.

    # Steps to Test
    1. Launch the title.
    2. Count the number of seconds it takes to display something and respond to head tracking.
    # Expected Result

    App begins accepting input, responds to head tracking, and displays graphics within 4 seconds of app startup.

# IV. Functional Requirements

  1. # The app must install and run without crashes, freezes, or extended unresponsive states.

    # Steps to Test
    1. Launch the title.
    2. Play through content for at least 45 minutes, or the length of the content if less than 45 minutes.
    # Expected Result
    • App installs and runs without crashing or freezing.

    • App installs and runs without being disrupted by screen recording, screenshot, and screen projection.

  2. # Single player apps must pause when the user removes the headset or opens the Flexible Dock.

    # Additional Details

    In Unity, you should see OnApplicationPause(true) called both when the HMD sleeps after dismount, as well as when the display is turned off from the power button.

    This will be matched by a corresponding OnApplicationPause(false) when the headset is remounted, or the power button is hit again to turn on the display.

    Things that cause OnApplicationPause(true) to occur:

    • Pressing Home button (system UI)

    • Pressing Power button to turn off display

    • Dismounting headset and display is turned off

    • Moving outside of Guardian boundary

    # Steps to Test
    1. Launch the app.
    2. Take off the HMD.
    # Expected Result

    Things that cause the occuring of application pause:

    • Pressing Home button (system UI)

    • Pressing Power button to turn off display

    • Dismounting headset and display is turned off for 10 seconds

    • Moving outside of Guardian boundary

  3. # The app must not leave the user stuck at any point in the experience.

    # Additional Details

    For example, if your app requires a login, you must provide instructions for the user to successfully create an account. These instructions must be discoverable in VR, but account creation could happen in 2D.

    Game levels must not have broken logic that prevents progressing to the next level.

    # Steps to Test
    1. Launch the title.
    2. Progress through content for at least 45 minutes.
    # Expected Result

    User must be able to experience all content without being unable to progress or requiring unobtainable information.

  4. # The app must not lose the user’s data. Such as saves/settings/downloads/content.

    # Steps to Test
    1. Launch the title.
    2. Progress through part of the content and save the game progress.
    3. Quit and restart the app.
    4. Install a higher version of the app.
    5. Uninstall and reinstall the app.
    # Expected Result

    All user saves/settings/downloads/content created within the app persist throughout use of the application.

  5. # The application must respond to the HMD’s positional tracking as well as orientation.

    # Steps to Test
    1. Launch the title.
    2. Lean forward and side-to-side within the app.
    # Expected Result

    Your view should look as if you are moving within the VR world.

  6. # App must only include QiYu HMDs and controllers within the title or Store assets.

    # Steps to Test
    1. Launch the title.
    2. Progress through content for at least 45 minutes.
    # Expected Result

    App should only reference QiYu HMDs and controllers.

  7. # If your app requires Internet connectivity for its core functionality, notify users without an active Internet connection that one is required.

    # Additional Details

    In Unity, you can use the Application.internetReachability property to test for an active Internet connection.

    Other engines may require you to test the connection by attempting to reach a server.

    # Steps to Test
    1. Disconnect device from the network.
    2. Launch the app.
    # Expected Result

    If app requires a connection to the Internet, an error message is displayed.

  8. # The app must continue to download content if the user removes the headset.

    # Additional Details

    When a user removes their headset, the foreground app is paused, which means any downloads running in the app are also paused. In order for downloads to continue when a user removes their HMD, they must be done in the background. To meet this requirement, you can use Android DownloadManager (opens new window), or other similar utilities, to download in the background.

    # Steps to Test
    1. Launch app and start a download.
    2. Remove the headset.
    # Expected Result

    The download in application should not be shutted down.

  9. # The user must be able to reset their forward orientation.

    # Steps to Test
    1. Launch the app.
    2. Observe the forward facing direction.
    3. Turn your body 180 degrees.
    4. Long press the QiYu Home button.
    # Expected Result

    Forward orientation is reset.

  10. # Steps to Test
    1. Play through several levels of the application.
    2. Observe any elements that stay in front of your face no matter which way you look.
    # Expected Result

    Nothing should be headlocked.

  11. # Users must not get disconnected from a multiplayer match if they press the Home button or remove their HMD.

    # Steps to Test
    1. Launch the title and start a multiplayer session.
    2. Remove the HMD or press the Home button to open the dock.
    # Expected Result

    User stays connected for at least 1 minute.

# V. Security Requirements

  1. # The app must request the minimum number of permissions required to function.

    # Additional Details

    The review team will be paying especially close attention to the list of permissions that Google considers dangerous, which includes camera, location, microphone, reading and writing external storage, and others.

    For more information about permissions, see https://developer.android.com/guide/topics/permissions/overview.html.

    # Steps to Test
    1. Look at permissions requested in the android manifest. From a command line, you can also run $ aapt dump badging and search the output for uses-permission.
    2. Verify that all permissions are utilized by the application.
    # Expected Result

    There must be a rationale behind every permission your app requests in the app manifest.

# VI. Tracking Requirements

  1. # When configuring the submission metadata for your app, it must meet the requirements for either sitting, standing, or roomscale play modes.

    # Steps to Test
    1. Launch the title.
    2. Play through several levels.
    # Expected Result

    Sitting: no action requires you to stand or reach down to the ground.

    Standing: You are able to interact with all game elements while standing, turning around, or reaching within a 2 x 2 (m²) play area.

    Roomscale: The app must be completely usable within a 2 x 2 (m²) play area.

# VII. Input Requirements

  1. # Steps to Test
    1. Launch the title.
    2. Click the menu button.
    # Expected Result

    App should open an in-app menu, if applicable.

  2. # Steps to Test
    1. Launch the title.
    2. Pick up an object.
    # Expected Result

    You use the grip button to pick up objects.

  3. # In-application hands and controllers should line up with the user’s real-world counterparts in position and orientation as closely as possible.

    # Steps to Test

    While using your app, hold your hands in front of your face and raise your headset slightly so you can compare your real-world hands and your virtual hands. Repeat this process with your hands at different angles and positions in order to observe and correct any disparities.

    # Expected Result

    In-application hands should match your real-world hands.

# VIII. Accessibility Requirements

  1. # Application should provide versions with Chinese localization texts integrated, and Chinese should be set as default language.