<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="androidpublisher_v2.html">Google Play Developer API</a> . <a href="androidpublisher_v2.edits.html">edits</a> . <a href="androidpublisher_v2.edits.tracks.html">tracks</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#get">get(packageName, editId, track)</a></code></p>
<p class="firstline">Fetches the track configuration for the specified track type. Includes the APK version codes that are in this track.</p>
<p class="toc_element">
  <code><a href="#list">list(packageName, editId)</a></code></p>
<p class="firstline">Lists all the track configurations for this edit.</p>
<p class="toc_element">
  <code><a href="#patch">patch(packageName, editId, track, body)</a></code></p>
<p class="firstline">Updates the track configuration for the specified track type. This method supports patch semantics.</p>
<p class="toc_element">
  <code><a href="#update">update(packageName, editId, track, body)</a></code></p>
<p class="firstline">Updates the track configuration for the specified track type.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="get">get(packageName, editId, track)</code>
  <pre>Fetches the track configuration for the specified track type. Includes the APK version codes that are in this track.

Args:
  packageName: string, Unique identifier for the Android app that is being updated; for example, "com.spiffygame". (required)
  editId: string, Unique identifier for this edit. (required)
  track: string, The track to read or modify. (required)

Returns:
  An object of the form:

    {
      "track": "A String", # Identifier for this track.
      "userFraction": 3.14,
      "versionCodes": [ # Version codes to make active on this track. Note that this list should contain all versions you wish to be active, including those you wish to retain from previous releases.
        42,
      ],
    }</pre>
</div>

<div class="method">
    <code class="details" id="list">list(packageName, editId)</code>
  <pre>Lists all the track configurations for this edit.

Args:
  packageName: string, Unique identifier for the Android app that is being updated; for example, "com.spiffygame". (required)
  editId: string, Unique identifier for this edit. (required)

Returns:
  An object of the form:

    {
    "kind": "androidpublisher#tracksListResponse", # Identifies what kind of resource this is. Value: the fixed string "androidpublisher#tracksListResponse".
    "tracks": [
      {
          "track": "A String", # Identifier for this track.
          "userFraction": 3.14,
          "versionCodes": [ # Version codes to make active on this track. Note that this list should contain all versions you wish to be active, including those you wish to retain from previous releases.
            42,
          ],
        },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="patch">patch(packageName, editId, track, body)</code>
  <pre>Updates the track configuration for the specified track type. This method supports patch semantics.

Args:
  packageName: string, Unique identifier for the Android app that is being updated; for example, "com.spiffygame". (required)
  editId: string, Unique identifier for this edit. (required)
  track: string, The track to read or modify. (required)
  body: object, The request body. (required)
    The object takes the form of:

{
    "track": "A String", # Identifier for this track.
    "userFraction": 3.14,
    "versionCodes": [ # Version codes to make active on this track. Note that this list should contain all versions you wish to be active, including those you wish to retain from previous releases.
      42,
    ],
  }


Returns:
  An object of the form:

    {
      "track": "A String", # Identifier for this track.
      "userFraction": 3.14,
      "versionCodes": [ # Version codes to make active on this track. Note that this list should contain all versions you wish to be active, including those you wish to retain from previous releases.
        42,
      ],
    }</pre>
</div>

<div class="method">
    <code class="details" id="update">update(packageName, editId, track, body)</code>
  <pre>Updates the track configuration for the specified track type.

Args:
  packageName: string, Unique identifier for the Android app that is being updated; for example, "com.spiffygame". (required)
  editId: string, Unique identifier for this edit. (required)
  track: string, The track to read or modify. (required)
  body: object, The request body. (required)
    The object takes the form of:

{
    "track": "A String", # Identifier for this track.
    "userFraction": 3.14,
    "versionCodes": [ # Version codes to make active on this track. Note that this list should contain all versions you wish to be active, including those you wish to retain from previous releases.
      42,
    ],
  }


Returns:
  An object of the form:

    {
      "track": "A String", # Identifier for this track.
      "userFraction": 3.14,
      "versionCodes": [ # Version codes to make active on this track. Note that this list should contain all versions you wish to be active, including those you wish to retain from previous releases.
        42,
      ],
    }</pre>
</div>

</body></html>