summaryrefslogtreecommitdiffstats
path: root/docs/html
diff options
context:
space:
mode:
Diffstat (limited to 'docs/html')
-rw-r--r--docs/html/about/dashboards/index.jd50
-rw-r--r--docs/html/community/index.html3
-rw-r--r--docs/html/distribute/engage/app-updates.jd8
-rw-r--r--docs/html/distribute/engage/community.jd10
-rw-r--r--docs/html/distribute/engage/deep-linking.jd14
-rw-r--r--docs/html/distribute/engage/easy-signin.jd16
-rw-r--r--docs/html/distribute/engage/game-services.jd8
-rw-r--r--docs/html/distribute/engage/gcm.jd8
-rw-r--r--docs/html/distribute/engage/notifications.jd8
-rw-r--r--docs/html/distribute/engage/video.jd8
-rw-r--r--docs/html/distribute/engage/widgets.jd9
-rw-r--r--docs/html/distribute/essentials/best-practices/apps.jd22
-rw-r--r--docs/html/distribute/essentials/best-practices/games.jd20
-rw-r--r--docs/html/distribute/essentials/gpfe-guidelines.jd34
-rw-r--r--docs/html/distribute/essentials/optimizing-your-app.jd50
-rw-r--r--docs/html/distribute/essentials/quality/core.jd64
-rw-r--r--docs/html/distribute/essentials/quality/tablets.jd64
-rw-r--r--docs/html/distribute/googleplay/about.jd43
-rw-r--r--docs/html/distribute/googleplay/developer-console.jd119
-rw-r--r--docs/html/distribute/googleplay/edu/about.jd6
-rw-r--r--docs/html/distribute/googleplay/edu/faq.jd50
-rw-r--r--docs/html/distribute/googleplay/edu/start.jd22
-rw-r--r--docs/html/distribute/googleplay/start.jd20
-rw-r--r--docs/html/distribute/monetize/ads.jd2
-rw-r--r--docs/html/distribute/monetize/ecommerce.jd10
-rw-r--r--docs/html/distribute/monetize/freemium.jd6
-rw-r--r--docs/html/distribute/monetize/payments.jd34
-rw-r--r--docs/html/distribute/monetize/premium.jd10
-rw-r--r--docs/html/distribute/monetize/subscriptions.jd4
-rw-r--r--docs/html/distribute/tools/launch-checklist.jd204
-rw-r--r--docs/html/distribute/tools/localization-checklist.jd78
-rw-r--r--docs/html/distribute/tools/open-distribution.jd26
-rw-r--r--docs/html/distribute/tools/promote/badge-files.jd10
-rw-r--r--docs/html/distribute/tools/promote/brand.jd76
-rw-r--r--docs/html/distribute/tools/promote/device-art.jd4
-rw-r--r--docs/html/distribute/users/build-buzz.jd70
-rw-r--r--docs/html/distribute/users/build-community.jd26
-rw-r--r--docs/html/distribute/users/expand-to-new-markets.jd36
-rw-r--r--docs/html/distribute/users/know-your-user.jd36
-rw-r--r--docs/html/distribute/users/your-listing.jd38
-rw-r--r--docs/html/google/play-services/setup.jd4
-rw-r--r--docs/html/google/play/billing/billing_admin.jd10
-rw-r--r--docs/html/google/play/billing/billing_testing.jd131
-rw-r--r--docs/html/google/play/billing/v2/billing_integrate.jd19
-rw-r--r--docs/html/google/play/expansion-files.jd78
-rw-r--r--docs/html/google/play/licensing/licensing-reference.jd23
-rw-r--r--docs/html/google/play/licensing/overview.jd17
-rw-r--r--docs/html/guide/components/fundamentals.jd4
-rw-r--r--docs/html/guide/topics/ui/settings.jd42
-rw-r--r--docs/html/images/brand/Google_Play_Store_600.pngbin0 -> 124868 bytes
-rw-r--r--docs/html/images/training/volley-request.pngbin0 -> 61812 bytes
-rw-r--r--docs/html/sdk/installing/studio.jd4
-rw-r--r--docs/html/tools/device.jd4
-rw-r--r--docs/html/tools/sdk/tools-notes.jd33
-rw-r--r--docs/html/training/basics/network-ops/connecting.jd1
-rw-r--r--docs/html/training/basics/network-ops/index.jd9
-rw-r--r--docs/html/training/contacts-provider/retrieve-names.jd12
-rw-r--r--docs/html/training/training_toc.cs29
-rw-r--r--docs/html/training/volley/index.jd133
-rw-r--r--docs/html/training/volley/request-custom.jd163
-rw-r--r--docs/html/training/volley/request.jd281
-rw-r--r--docs/html/training/volley/requestqueue.jd204
-rw-r--r--docs/html/training/volley/simple.jd169
63 files changed, 1863 insertions, 833 deletions
diff --git a/docs/html/about/dashboards/index.jd b/docs/html/about/dashboards/index.jd
index c61a94b..32b9c9e 100644
--- a/docs/html/about/dashboards/index.jd
+++ b/docs/html/about/dashboards/index.jd
@@ -64,7 +64,7 @@ Platform Versions</a>.</p>
</div>
-<p style="clear:both"><em>Data collected during a 7-day period ending on May 1, 2014.
+<p style="clear:both"><em>Data collected during a 7-day period ending on June 4, 2014.
<br/>Any versions with less than 0.1% distribution are not shown.</em>
</p>
@@ -95,7 +95,7 @@ Screens</a>.</p>
</div>
-<p style="clear:both"><em>Data collected during a 7-day period ending on May 1, 2014.
+<p style="clear:both"><em>Data collected during a 7-day period ending on June 4, 2014.
<br/>Any screen configurations with less than 0.1% distribution are not shown.</em></p>
@@ -114,7 +114,7 @@ support for any lower version (for example, support for version 2.0 also implies
<img alt="" style="float:right"
-src="//chart.googleapis.com/chart?chs=400x250&cht=p&chd=t%3A0.1%2C87.0%2C12.9&chf=bg%2Cs%2C00000000&chl=GL%201.1%20only%7CGL%202.0%7CGL%203.0&chco=c4df9b%2C6fad0c" />
+src="//chart.googleapis.com/chart?chs=400x250&cht=p&chd=t%3A0.1%2C83.6%2C16.3&chf=bg%2Cs%2C00000000&chl=GL%201.1%20only%7CGL%202.0%7CGL%203.0&chco=c4df9b%2C6fad0c" />
<p>To declare which version of OpenGL ES your application requires, you should use the {@code
android:glEsVersion} attribute of the <a
@@ -136,17 +136,17 @@ uses.</p>
</tr>
<tr>
<td>2.0</th>
-<td>87.0%</td>
+<td>83.6%</td>
</tr>
<tr>
<td>3.0</th>
-<td>12.9%</td>
+<td>16.3%</td>
</tr>
</table>
-<p style="clear:both"><em>Data collected during a 7-day period ending on May 1, 2014</em></p>
+<p style="clear:both"><em>Data collected during a 7-day period ending on June 4, 2014</em></p>
@@ -164,47 +164,42 @@ uses.</p>
var VERSION_DATA =
[
{
- "chart": "//chart.googleapis.com/chart?chs=500x250&cht=p&chd=t%3A1.0%2C16.2%2C0.1%2C13.4%2C60.8%2C8.5&chf=bg%2Cs%2C00000000&chl=Froyo%7CGingerbread%7CHoneycomb%7CIce%20Cream%20Sandwich%7CJelly%20Bean%7CKitKat&chco=c4df9b%2C6fad0c",
+ "chart": "//chart.googleapis.com/chart?chl=Froyo%7CGingerbread%7CIce%20Cream%20Sandwich%7CJelly%20Bean%7CKitKat&chf=bg%2Cs%2C00000000&chd=t%3A0.8%2C14.9%2C12.3%2C58.4%2C13.6&chco=c4df9b%2C6fad0c&cht=p&chs=500x250",
"data": [
{
"api": 8,
"name": "Froyo",
- "perc": "1.0"
+ "perc": "0.8"
},
{
"api": 10,
"name": "Gingerbread",
- "perc": "16.2"
- },
- {
- "api": 13,
- "name": "Honeycomb",
- "perc": "0.1"
+ "perc": "14.9"
},
{
"api": 15,
"name": "Ice Cream Sandwich",
- "perc": "13.4"
+ "perc": "12.3"
},
{
"api": 16,
"name": "Jelly Bean",
- "perc": "33.5"
+ "perc": "29.0"
},
{
"api": 17,
"name": "Jelly Bean",
- "perc": "18.8"
+ "perc": "19.1"
},
{
"api": 18,
"name": "Jelly Bean",
- "perc": "8.5"
+ "perc": "10.3"
},
{
"api": 19,
"name": "KitKat",
- "perc": "8.5"
+ "perc": "13.6"
}
]
}
@@ -226,23 +221,22 @@ var SCREEN_DATA =
"xhdpi": "0.6"
},
"Normal": {
- "hdpi": "33.9",
- "mdpi": "12.5",
- "xhdpi": "19.9",
- "xxhdpi": "13.5"
+ "hdpi": "34.2",
+ "mdpi": "12.0",
+ "xhdpi": "19.6",
+ "xxhdpi": "14.6"
},
"Small": {
- "ldpi": "7.5"
+ "ldpi": "7.2"
},
"Xlarge": {
"hdpi": "0.3",
- "ldpi": "0.1",
- "mdpi": "4.2",
+ "mdpi": "4.0",
"xhdpi": "0.3"
}
},
- "densitychart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chd=t%3A8.2%2C21.1%2C1.6%2C34.8%2C20.8%2C13.5&chf=bg%2Cs%2C00000000&chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi&chco=c4df9b%2C6fad0c",
- "layoutchart": "//chart.googleapis.com/chart?chs=400x250&cht=p&chd=t%3A4.9%2C7.8%2C80.0%2C7.5&chf=bg%2Cs%2C00000000&chl=Xlarge%7CLarge%7CNormal%7CSmall&chco=c4df9b%2C6fad0c"
+ "densitychart": "//chart.googleapis.com/chart?chl=ldpi%7Cmdpi%7Ctvdpi%7Chdpi%7Cxhdpi%7Cxxhdpi&chf=bg%2Cs%2C00000000&chd=t%3A7.8%2C20.4%2C1.6%2C35.1%2C20.5%2C14.6&chco=c4df9b%2C6fad0c&cht=p&chs=400x250",
+ "layoutchart": "//chart.googleapis.com/chart?chl=Xlarge%7CLarge%7CNormal%7CSmall&chf=bg%2Cs%2C00000000&chd=t%3A4.6%2C7.8%2C80.4%2C7.2&chco=c4df9b%2C6fad0c&cht=p&chs=400x250"
}
];
diff --git a/docs/html/community/index.html b/docs/html/community/index.html
index eeb1c51..e3834ba 100644
--- a/docs/html/community/index.html
+++ b/docs/html/community/index.html
@@ -34,6 +34,9 @@ href="//fonts.googleapis.com/css?family=Roboto:regular,medium,thin,italic,medium
</script>
<style>
+#header {
+ padding: 2.2em 0 0.2em 0;
+}
#header-wrap h1 {
margin:0;
padding:0;
diff --git a/docs/html/distribute/engage/app-updates.jd b/docs/html/distribute/engage/app-updates.jd
index 6b751b9..2b7cd2c 100644
--- a/docs/html/distribute/engage/app-updates.jd
+++ b/docs/html/distribute/engage/app-updates.jd
@@ -36,12 +36,12 @@ page.image=/images/gp-your-user-0.jpg
"18x6," data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="related-resources">
+<div class="headerLine">
+ <h2 id="related-resources">
Related Resources
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="resource-widget resource-flow-layout col-13" data-query=
diff --git a/docs/html/distribute/engage/community.jd b/docs/html/distribute/engage/community.jd
index 035058a..e202d54 100644
--- a/docs/html/distribute/engage/community.jd
+++ b/docs/html/distribute/engage/community.jd
@@ -29,12 +29,14 @@ page.image=/images/gp-engage-9.jpg
Learn more about how to <a href="{@docRoot}distribute/users/build-community.html">build and manage a community</a>.
</p>
-<div class="headerLine clearfloat">
- <h1 id="related-resources">
+<p style="clear:both">
+</p>
+<div class="headerLine">
+ <h2 id="related-resources">
Related Resources
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="resource-widget resource-flow-layout col-13" data-query=
diff --git a/docs/html/distribute/engage/deep-linking.jd b/docs/html/distribute/engage/deep-linking.jd
index cd62f9d..0417ba1 100644
--- a/docs/html/distribute/engage/deep-linking.jd
+++ b/docs/html/distribute/engage/deep-linking.jd
@@ -11,7 +11,7 @@ page.image=/images/gp-listing-4.jpg
</p>
<div class="headerLine">
-<h1>Deep Linking from Google+ Posts</h1><hr>
+<h2>Deep Linking from Google+ Posts</h2>
</div>
<p>
@@ -43,8 +43,8 @@ page.image=/images/gp-listing-4.jpg
</div>
-<div class="headerLine clearfloat">
-<h1>Deep Linking from Google Search &mdash; App Indexing</h1><hr>
+<div class="headerLine">
+<h2>Deep Linking from Google Search &mdash; App Indexing</h2>
</div>
<p>
@@ -64,12 +64,10 @@ page.image=/images/gp-listing-4.jpg
<img src="{@docRoot}images/gp-listing-4.jpg" style="padding-top:1em;">
</div>
-<div class="headerLine clearfloat">
- <h1 id="related-resources">
+<div class="headerLine">
+ <h2 id="related-resources">
Related Resources
- </h1>
-
- <hr>
+ </h2>
</div>
<div class="resource-widget resource-flow-layout col-13" data-query=
diff --git a/docs/html/distribute/engage/easy-signin.jd b/docs/html/distribute/engage/easy-signin.jd
index 92c3ffc..d066181 100644
--- a/docs/html/distribute/engage/easy-signin.jd
+++ b/docs/html/distribute/engage/easy-signin.jd
@@ -37,11 +37,11 @@ page.image=/images/google/gps-googleplus.png
</p>
<div class="headerLine">
- <h1>
+ <h2>
And Spreading the Word a Snap
- </h1>
+ </h2>
+
- <hr>
</div>
@@ -85,12 +85,14 @@ page.image=/images/google/gps-googleplus.png
</li>
</ul>
- <div class="headerLine clearfloat">
- <h1 id="related-resources">
+<p style="clear:both">
+</p>
+ <div class="headerLine">
+ <h2 id="related-resources">
Related Resources
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="resource-widget resource-flow-layout col-13"
diff --git a/docs/html/distribute/engage/game-services.jd b/docs/html/distribute/engage/game-services.jd
index 5153435..1c77d2d 100644
--- a/docs/html/distribute/engage/game-services.jd
+++ b/docs/html/distribute/engage/game-services.jd
@@ -75,12 +75,12 @@ page.image=/images/google/gps-play_games_logo.png
Game Developer Best Practices</a>.
</p>
-<div class="headerLine clearfloat">
- <h1 id="related-resources">
+<div class="headerLine">
+ <h2 id="related-resources">
Related Resources
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="resource-widget resource-flow-layout col-13" data-query=
diff --git a/docs/html/distribute/engage/gcm.jd b/docs/html/distribute/engage/gcm.jd
index d793124e..7d9b6bb 100644
--- a/docs/html/distribute/engage/gcm.jd
+++ b/docs/html/distribute/engage/gcm.jd
@@ -35,12 +35,12 @@ page.image=/images/gcm/gcm-logo.png
free and there are no quotas.
</p>
-<div class="headerLine clearfloat">
- <h1 id="related-resources">
+<div class="headerLine">
+ <h2 id="related-resources">
Related Resources
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="resource-widget resource-flow-layout col-13"
diff --git a/docs/html/distribute/engage/notifications.jd b/docs/html/distribute/engage/notifications.jd
index fecfb45..1aa0637 100644
--- a/docs/html/distribute/engage/notifications.jd
+++ b/docs/html/distribute/engage/notifications.jd
@@ -40,17 +40,15 @@ page.image=/design/media/notifications_pattern_anatomy.png
</p>
- <div class="sidebox" style="width:326px;float:left;margin-left:0">
<p><strong>Tip:</strong>
Use notifications sparingly &mdash; be sure any information presented is
useful. Give users the option to turn notifications off.
</p>
- </div>
- <div class="headerLine clearfloat">
- <h1 id="related-resources">
+ <div class="headerLine">
+ <h2 id="related-resources">
Related Resources
- </h1><hr>
+ </h2>
</div>
<div class="resource-widget resource-flow-layout col-13"
diff --git a/docs/html/distribute/engage/video.jd b/docs/html/distribute/engage/video.jd
index 1a30f3a..c5a4997 100644
--- a/docs/html/distribute/engage/video.jd
+++ b/docs/html/distribute/engage/video.jd
@@ -23,12 +23,12 @@ page.image=/images/gp-engage-smule.jpg
<img src="{@docRoot}images/gp-engage-smule.jpg">
</div>
-<div class="headerLine clearfloat">
- <h1 id="related-resources">
+<div class="headerLine">
+ <h2 id="related-resources">
Related Resources
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="resource-widget resource-flow-layout col-13" data-query=
diff --git a/docs/html/distribute/engage/widgets.jd b/docs/html/distribute/engage/widgets.jd
index b17af08..286adea 100644
--- a/docs/html/distribute/engage/widgets.jd
+++ b/docs/html/distribute/engage/widgets.jd
@@ -28,10 +28,13 @@ page.image=/images/gp-engage-0.jpg
or upcoming deadlines. Widgets should serve as more than a launcher icon.</p>
</div>
-<div class="headerLine clearfloat">
- <h1 id="related-resources">
+<p style="clear:both">
+</p>
+
+<div class="headerLine">
+ <h2 id="related-resources">
Related Resources
- </h1><hr>
+ </h2>
</div>
<div class="resource-widget resource-flow-layout col-13"
diff --git a/docs/html/distribute/essentials/best-practices/apps.jd b/docs/html/distribute/essentials/best-practices/apps.jd
index 055a349..bbac727 100644
--- a/docs/html/distribute/essentials/best-practices/apps.jd
+++ b/docs/html/distribute/essentials/best-practices/apps.jd
@@ -17,7 +17,7 @@ page.metaDescription=Essential tips for launching successful apps in Google Play
<p>The following best practices have enabled developers worldwide to build great, successful apps for Google Play.</p>
<div class="headerLine">
-<h1 id="essentials">Get the Essentials Right</h1><hr>
+<h2 id="essentials">Get the Essentials Right</h2>
</div>
<h3>1. Make it Android</h3>
@@ -82,11 +82,11 @@ page.metaDescription=Essential tips for launching successful apps in Google Play
</ul>
<div class="headerLine">
- <h1 id="users">
+ <h2 id="users">
Get Users
- </h1>
+ </h2>
+
- <hr>
</div>
<h3>
@@ -150,11 +150,11 @@ page.metaDescription=Essential tips for launching successful apps in Google Play
</ul>
<div class="headerLine">
- <h1 id="engage">
+ <h2 id="engage">
Engage and Retain
- </h1>
+ </h2>
+
- <hr>
</div>
<h3>
@@ -211,11 +211,11 @@ page.metaDescription=Essential tips for launching successful apps in Google Play
</ul>
<div class="headerLine">
- <h1 id="beyond">
+ <h2 id="beyond">
Beyond the Basics
- </h1>
+ </h2>
+
- <hr>
</div>
<ul>
@@ -249,7 +249,7 @@ page.metaDescription=Essential tips for launching successful apps in Google Play
</ul>
<div class="headerLine">
-<h1 id="related-resources">Related Resources</h1><hr>
+<h2 id="related-resources">Related Resources</h2>
</div>
<div class="resource-widget resource-flow-layout col-13"
diff --git a/docs/html/distribute/essentials/best-practices/games.jd b/docs/html/distribute/essentials/best-practices/games.jd
index ac1df44..c4ce66e 100644
--- a/docs/html/distribute/essentials/best-practices/games.jd
+++ b/docs/html/distribute/essentials/best-practices/games.jd
@@ -20,11 +20,11 @@ page.metaDescription=Essential tips for launching successful games in Google Pla
</p>
<div class="headerLine">
- <h1 id="users">
+ <h2 id="users">
Get Users
- </h1>
+ </h2>
+
- <hr>
</div>
<h3>
@@ -111,11 +111,11 @@ page.metaDescription=Essential tips for launching successful games in Google Pla
</ul>
<div class="headerLine">
- <h1 id="engage">
+ <h2 id="engage">
Engage and Retain
- </h1>
+ </h2>
+
- <hr>
</div>
<h3>
@@ -213,11 +213,11 @@ page.metaDescription=Essential tips for launching successful games in Google Pla
</ul>
<div class="headerLine">
- <h1 id="beyond">
+ <h2 id="beyond">
Beyond the Basics
- </h1>
+ </h2>
+
- <hr>
</div>
<ul>
@@ -249,7 +249,7 @@ page.metaDescription=Essential tips for launching successful games in Google Pla
</ul>
<div class="headerLine">
-<h1 id="related-resources">Related Resources</h1><hr>
+<h2 id="related-resources">Related Resources</h2>
</div>
<div class="resource-widget resource-flow-layout col-13"
diff --git a/docs/html/distribute/essentials/gpfe-guidelines.jd b/docs/html/distribute/essentials/gpfe-guidelines.jd
index 799009f..734bddc 100644
--- a/docs/html/distribute/essentials/gpfe-guidelines.jd
+++ b/docs/html/distribute/essentials/gpfe-guidelines.jd
@@ -50,12 +50,12 @@ Xnonavpage=true
Distribution Agreement</a>.
</p>
-<div class="headerLine clearfloat">
- <h1 id="basic-reqts">
+<div class="headerLine">
+ <h2 id="basic-reqts">
Basic Requirements
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -108,11 +108,11 @@ Xnonavpage=true
</ul>
<div class="headerLine">
- <h1 id="monetizing-ads">
+ <h2 id="monetizing-ads">
Monetizing and Ads
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -195,11 +195,11 @@ Xnonavpage=true
</ul>
<div class="headerLine">
- <h1 id="e-value">
+ <h2 id="e-value">
Educational Value
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure">
@@ -299,11 +299,11 @@ Xnonavpage=true
</p>
<div class="headerLine">
- <h1 id="quality">
+ <h2 id="quality">
App Quality
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure">
@@ -410,11 +410,11 @@ Xnonavpage=true
</ul>
<div class="headerLine">
- <h1 id="test-environment">
+ <h2 id="test-environment">
Test Environment
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -487,7 +487,7 @@ Xnonavpage=true
</ul>
<div class="headerLine">
-<h1>Related Resources</h1><hr>
+<h2>Related Resources</h2>
</div>
<div class="dynamic-grid">
diff --git a/docs/html/distribute/essentials/optimizing-your-app.jd b/docs/html/distribute/essentials/optimizing-your-app.jd
index 3fe91b28..696ef53 100644
--- a/docs/html/distribute/essentials/optimizing-your-app.jd
+++ b/docs/html/distribute/essentials/optimizing-your-app.jd
@@ -53,11 +53,11 @@ page.image=/distribute/images/gp-optimize-card.jpg
</p>
<div class="headerLine">
- <h1 id="listen-to-your-users">
+ <h2 id="listen-to-your-users">
Listen to Your Users
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure">
@@ -147,11 +147,11 @@ page.image=/distribute/images/gp-optimize-card.jpg
</p>
<div class="headerLine" id="measuring-analyzing-responding">
- <h1>
+ <h2>
Measuring, Analyzing, and Responding to User Behavior
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure">
@@ -260,11 +260,11 @@ who can help automate, measure, and optimize your mobile marketing.
</p>
<div class="headerLine">
- <h1 id="improve-stability">
+ <h2 id="improve-stability">
Improve Stability and Eliminate Bugs
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -298,11 +298,11 @@ who can help automate, measure, and optimize your mobile marketing.
</p>
<div class="headerLine">
- <h1 id="improve-ui">
+ <h2 id="improve-ui">
Improve UI Responsiveness
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure">
@@ -352,11 +352,11 @@ who can help automate, measure, and optimize your mobile marketing.
</p>
<div class="headerLine">
- <h1 id="improve-usability">
+ <h2 id="improve-usability">
Improve Usability
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="sidebox-wrapper" style="float:right;">
@@ -403,11 +403,11 @@ who can help automate, measure, and optimize your mobile marketing.
</p>
<div class="headerLine">
- <h1 id="professional-appearance">
+ <h2 id="professional-appearance">
Professional Appearance and Aesthetics
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -439,11 +439,11 @@ who can help automate, measure, and optimize your mobile marketing.
</p>
<div class="headerLine">
- <h1 id="deliver-features">
+ <h2 id="deliver-features">
Deliver the Right Set of Features
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -464,11 +464,11 @@ who can help automate, measure, and optimize your mobile marketing.
</p>
<div class="headerLine">
- <h1 id="integrate">
+ <h2 id="integrate">
Integrate with the System and Third-Party apps
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -502,7 +502,7 @@ who can help automate, measure, and optimize your mobile marketing.
</p>
<div class="headerLine">
-<h1 id="related-resources">Related Resources</h1><hr>
+<h2 id="related-resources">Related Resources</h2>
</div>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/essentials/optimizing, tag:addia"
diff --git a/docs/html/distribute/essentials/quality/core.jd b/docs/html/distribute/essentials/quality/core.jd
index 558b030..cfe1a2a 100644
--- a/docs/html/distribute/essentials/quality/core.jd
+++ b/docs/html/distribute/essentials/quality/core.jd
@@ -63,12 +63,12 @@ page.image=/distribute/images/core-quality-guidelines.jpg
Guidelines</a>.
</p>
-<div class="headerLine clearfloat">
- <h1 id="ux">
+<div class="headerLine">
+ <h2 id="ux">
Visual Design and User Interaction
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -234,9 +234,7 @@ page.image=/distribute/images/core-quality-guidelines.jpg
</tr>
</table>
-<h3>
- Related Resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/essentials/corequalityguidelines/visualdesign"
@@ -244,12 +242,12 @@ data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,6x3,6x3"
data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="fn">
+<div class="headerLine">
+ <h2 id="fn">
Functionality
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -509,21 +507,19 @@ data-maxresults="6">
</tr>
</table>
-<h3>
- Related Resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/essentials/corequalityguidelines/functionality"
data-sortorder="-timestamp" data-cardsizes="6x3" data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="ps">
+<div class="headerLine">
+ <h2 id="ps">
Performance and Stability
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -670,21 +666,19 @@ data-sortorder="-timestamp" data-cardsizes="6x3" data-maxresults="6">
</tr>
</table>
-<h3>
- Related Resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/essentials/core/performance" data-sortorder="-timestamp"
data-cardsizes="6x3" data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="listing">
+<div class="headerLine">
+ <h2 id="listing">
Google Play
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -819,21 +813,19 @@ data-cardsizes="6x3" data-maxresults="6">
</tr>
</table>
-<h3>
- Related Resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/essentials/core/play" data-sortorder="-timestamp"
data-cardsizes="6x3,6x3,6x3,6x3,6x3,6x3" data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="test-environment">
+<div class="headerLine">
+ <h2 id="test-environment">
Setting Up a Test Environment
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -863,12 +855,12 @@ data-cardsizes="6x3,6x3,6x3,6x3,6x3,6x3" data-maxresults="6">
increase the number or complexity of tests and quality criteria.
</p>
-<div class="headerLine clearfloat">
- <h1 id="tests">
+<div class="headerLine">
+ <h2 id="tests">
Test Procedures
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
diff --git a/docs/html/distribute/essentials/quality/tablets.jd b/docs/html/distribute/essentials/quality/tablets.jd
index 7dfab48..2b2a5ae 100644
--- a/docs/html/distribute/essentials/quality/tablets.jd
+++ b/docs/html/distribute/essentials/quality/tablets.jd
@@ -52,7 +52,7 @@ Xnonavpage=true
help you address each recommendation included.
</p>
-<div class="headerLine"><h1 id="core-app-quality">1. Test for Basic Tablet App Quality</h1><hr></div>
+<div class="headerLine"><h2 id="core-app-quality">1. Test for Basic Tablet App Quality</h2></div>
<p>The first step in delivering a great tablet app experience is making sure
that it meets the <em>core app quality criteria</em> for all of the devices
@@ -78,8 +78,8 @@ Before publishing, also ensure that your app passes the basic technical checks a
Tips page</a>.</p>
-<div class="headerLine clearfloat">
-<h1 id="optimize-layouts">2. Optimize Layouts for Larger Screens</h1><hr></div>
+<div class="headerLine">
+<h2 id="optimize-layouts">2. Optimize Layouts for Larger Screens</h2></div>
<p>
Android makes it easy to develop an app that runs well on a wide range of
@@ -158,7 +158,7 @@ across the screen:</p>
multi-pane UI for tablets (see next section).</li>
</ul>
-<h3>Related resources</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/essentials/tabletguidelines/optimize"
@@ -167,7 +167,7 @@ multi-pane UI for tablets (see next section).</li>
data-maxResults="6"></div>
-<div class="headerLine clearfloat"><h1 id="use-extra-space">3. Take Advantage of Extra Screen Area</h1><hr></div>
+<div class="headerLine"><h2 id="use-extra-space">3. Take Advantage of Extra Screen Area</h2></div>
<div style="width:340px;float:right;margin:1.5em;margin-bottom:0;margin-top:0;">
<img src="{@docRoot}images/training/app-navigation-multiple-sizes-multipane-good.png"
@@ -219,7 +219,7 @@ different layouts in the appropriate screen size buckets (such as
<code>sw600dp</code>/<code>sw720</code>).</li>
</ul>
-<h3>Related resources</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/essentials/tabletguidelines/extrascreen"
@@ -227,7 +227,7 @@ different layouts in the appropriate screen size buckets (such as
data-cardSizes="6x3,6x3,6x3"
data-maxResults="6"></div>
-<div class="headerLine clearfloat"><h1 id="use-tablet-icons">4. Use Assets Designed for Tablet Screens</h1><hr></div>
+<div class="headerLine"><h2 id="use-tablet-icons">4. Use Assets Designed for Tablet Screens</h2></div>
<div><img src="{@docRoot}design/media/devices_displays_density@2x.png"></div>
@@ -308,7 +308,7 @@ icon at the highest density possible. For example, if a tablet has an {@code xhd
it will request the {@code xxhdpi} version of the launcher icon.</li>
</ul>
-<h3>Related resources</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/essentials/tabletguidelines/assets"
@@ -316,8 +316,8 @@ it will request the {@code xxhdpi} version of the launcher icon.</li>
data-cardSizes="9x3"
data-maxResults="6"></div>
-<div class="headerLine clearfloat"><h1 id="adjust-font-sizes">5.
-Adjust Font Sizes and Touch Targets</h1><hr></div>
+<div class="headerLine"><h2 id="adjust-font-sizes">5.
+Adjust Font Sizes and Touch Targets</h2></div>
<p>To make sure your app is easy to use on tablets, take some time to adjust the
font sizes and touch targets in your tablet UI, for all of the screen
@@ -345,7 +345,7 @@ larger touch targets. </li>
or just centering the icon within the transparent button.</li>
</ul>
-<h3>Related resources</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/essentials/tabletguidelines/fonts"
@@ -353,7 +353,7 @@ or just centering the icon within the transparent button.</li>
data-cardSizes="9x3,9x3,6x3,6x3,6x3"
data-maxResults="6"></div>
-<div class="headerLine clearfloat"><h1 id="adjust-widgets">6. Adjust Sizes of Home Screen Widgets</h1><hr></div>
+<div class="headerLine"><h2 id="adjust-widgets">6. Adjust Sizes of Home Screen Widgets</h2></div>
<p>If your app includes a home screen widget, here are a few points to consider
to ensure a great user experience on tablet screens: </p>
@@ -371,7 +371,7 @@ horizontal or square widget). </li>
possible.</li>
</ul>
-<h3>Related resources</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/essentials/tabletguidelines/widgets"
@@ -380,7 +380,7 @@ possible.</li>
data-maxResults="6"></div>
-<div class="headerLine clearfloat"><h1 id="offer-full-feature-set">7. Full Feature Set for Tablet Users</h1><hr></div>
+<div class="headerLine"><h2 id="offer-full-feature-set">7. Full Feature Set for Tablet Users</h2></div>
<div class="centered-full-image" style="width:600px;margin:1.5em"><img src="{@docRoot}images/gp-tablets-full-feature-set.png" alt="Tablet feature sets"></div>
@@ -415,7 +415,7 @@ some recommendations:</p>
</li>
</ul>
-<div class="headerLine clearfloat"><h1 id="android-versions">8. Target Android Versions Properly</h1><hr></div>
+<div class="headerLine"><h2 id="android-versions">8. Target Android Versions Properly</h2></div>
<p>
To ensure the broadest possible distribution to tablets, make sure that your
@@ -458,7 +458,7 @@ some recommendations:</p>
</li>
</ol>
-<h3>Related resources</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/essentials/tabletguidelines/versions"
@@ -466,7 +466,7 @@ some recommendations:</p>
data-cardSizes="6x3"
data-maxResults="6"></div>
-<div class="headerLine clearfloat"><h1 id="hardware-requirements">9. Declare Hardware Feature Dependencies Properly</h1><hr></div>
+<div class="headerLine"><h2 id="hardware-requirements">9. Declare Hardware Feature Dependencies Properly</h2></div>
<p>
Handsets and tablets typically offer slightly different hardware support for
@@ -528,7 +528,7 @@ permissions, make sure to explicitly declare a corresponding
as needed.
</p>
-<h3>Related resources</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/essentials/tabletguidelines/hardware"
@@ -536,7 +536,7 @@ permissions, make sure to explicitly declare a corresponding
data-cardSizes="9x3"
data-maxResults="6"></div>
-<div class="headerLine clearfloat"><h1 id="support-screens">10. Declare Support for Tablet Screens</h1><hr></div>
+<div class="headerLine"><h2 id="support-screens">10. Declare Support for Tablet Screens</h2></div>
<p>To ensure that you can distribute your app to a broad range of tablets, your app should
declare support for tablet screen sizes in its manifest file, as follows:</p>
@@ -560,7 +560,7 @@ app supports. Note that, if possible, you should avoid using the
<a href="{@docRoot}guide/topics/manifest/compatible-screens-element.html"><code>&lt;compatible-screens&gt;</code></a>
element in your app.</p>
-<h3>Related resources</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/essentials/tabletguidelines/tabletscreens"
@@ -569,7 +569,7 @@ element in your app.</p>
data-maxResults="6"></div>
-<div class="headerLine clearfloat"><h1 id="google-play">11. Showcase Your Tablet UI in Google Play</h1><hr></div>
+<div class="headerLine"><h2 id="google-play">11. Showcase Your Tablet UI in Google Play</h2></div>
<p>
After you've done the work to create an rich, optimized UI for your tablet
@@ -689,7 +689,7 @@ element in your app.</p>
</li>
</ul>
-<h3>Related resources</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/essentials/tabletguidelines/showcase"
@@ -697,12 +697,12 @@ element in your app.</p>
data-cardSizes="9x3,9x3,9x3,9x3"
data-maxResults="6"></div>
-<div class="headerLine clearfloat">
- <h1 id="google-play-best-practices">
+<div class="headerLine">
+ <h2 id="google-play-best-practices">
12. Follow Best Practices for Publishing in Google Play
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -799,7 +799,7 @@ appropriate.</p>
recommended.
</p>
-<h3 class="clearfloat">Related resources</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/essentials/tabletguidelines/googleplay"
data-sortOrder="-timestamp"
@@ -807,12 +807,12 @@ appropriate.</p>
data-maxResults="6"></div>
-<div class="headerLine clearfloat">
- <h1 id="test-environment">
+<div class="headerLine">
+ <h2 id="test-environment">
Setting Up a Test Environment for Tablets
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -858,7 +858,7 @@ listed platform versions, screen configurations, and hardware feature configurat
</tr>
</table>
-<div class="headerLine clearfloat"><h1 id="related-resources">Related Resources</h1><hr></div>
+<div class="headerLine"><h2 id="related-resources">Related Resources</h2></div>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/essentials/tabletguidelines"
diff --git a/docs/html/distribute/googleplay/about.jd b/docs/html/distribute/googleplay/about.jd
index cf0c6d2..c7c91ac 100644
--- a/docs/html/distribute/googleplay/about.jd
+++ b/docs/html/distribute/googleplay/about.jd
@@ -58,11 +58,11 @@ page.image=/distribute/images/about-play.jpg
</p>
<div class="headerLine">
- <h1 id="ratings-reviews">
+ <h2 id="ratings-reviews">
User Ratings and Reviews
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -83,11 +83,11 @@ page.image=/distribute/images/about-play.jpg
</div>
<div class="headerLine">
- <h1 id="category-browsing">
+ <h2 id="category-browsing">
Category Browsing
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -98,11 +98,11 @@ page.image=/distribute/images/about-play.jpg
</p>
<div class="headerLine">
- <h1 id="search">
+ <h2 id="search">
Search
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -113,11 +113,11 @@ page.image=/distribute/images/about-play.jpg
</p>
<div class="headerLine">
- <h1 id="top-charts-and-lists">
+ <h2 id="top-charts-and-lists">
Top Charts and Lists
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure">
@@ -195,11 +195,11 @@ page.image=/distribute/images/about-play.jpg
</table>
<div class="headerLine">
- <h1 id="featured-staff-picks">
+ <h2 id="featured-staff-picks">
Featured, Staff Picks, Collections, and Badges
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -313,11 +313,11 @@ page.image=/distribute/images/about-play.jpg
</p>
<div class="headerLine">
- <h1 id="product-detail-pages">
+ <h2 id="product-detail-pages">
Store Listing Pages
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure">
@@ -357,8 +357,11 @@ page.image=/distribute/images/about-play.jpg
Products</a> to find out how.
</p>
-<div class="headerLine clearfloat">
-<h1>Related Resources</h1><hr>
+<p style="clear:both">
+</p>
+
+<div class="headerLine">
+<h2>Related Resources</h2>
</div>
<div class="resource-widget resource-flow-layout col-13"
diff --git a/docs/html/distribute/googleplay/developer-console.jd b/docs/html/distribute/googleplay/developer-console.jd
index 6263431..f5b3ac6 100644
--- a/docs/html/distribute/googleplay/developer-console.jd
+++ b/docs/html/distribute/googleplay/developer-console.jd
@@ -44,12 +44,12 @@ Xnonavpage=true
verification by email, you can sign in to your Google Play Developer Console.
</p>
-<div class="headerLine clearfloat">
- <h1 id="allapps">
+<div class="headerLine">
+ <h2 id="allapps">
All Applications
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -61,12 +61,12 @@ Xnonavpage=true
<img src="{@docRoot}images/gp-dc-home.png" class="border-img">
</div>
-<div class="headerLine clearfloat" style="margin-top:-6px">
- <h1 id="account-details">
+<div class="headerLine" style="margin-top:-6px">
+ <h2 id="account-details">
Your Account Details
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -112,12 +112,12 @@ Xnonavpage=true
Google Play licensing.
</p>
-<div class="headerLine clearfloat">
- <h1 id="merchant-account">
+<div class="headerLine">
+ <h2 id="merchant-account">
Linking Your Merchant Account
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -127,12 +127,12 @@ Xnonavpage=true
from sales.
</p>
-<div class="headerLine clearfloat">
- <h1 id="multiple-user-accounts">
+<div class="headerLine">
+ <h2 id="multiple-user-accounts">
Multiple User Accounts
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -157,12 +157,12 @@ Xnonavpage=true
up multiple accounts</a> now.
</p>
-<div class="headerLine clearfloat">
- <h1 id="store-listing-details">
+<div class="headerLine">
+ <h2 id="store-listing-details">
Store Listing Details
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -181,12 +181,12 @@ Xnonavpage=true
<img src="{@docRoot}images/gp-dc-details.png" class="frame">
</div>
-<div class="headerLine clearfloat">
- <h1 id="upload-instantly-publish">
+<div class="headerLine">
+ <h2 id="upload-instantly-publish">
Upload and Instantly Publish
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -212,12 +212,12 @@ Xnonavpage=true
time.
</p>
-<div class="headerLine clearfloat">
- <h1 id="alpha-beta">
+<div class="headerLine">
+ <h2 id="alpha-beta">
Alpha and Beta Testing
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -270,12 +270,12 @@ Xnonavpage=true
Checklist</a>.
</p>
-<div class="headerLine clearfloat">
- <h1 id="staged-rollouts">
+<div class="headerLine">
+ <h2 id="staged-rollouts">
Staged Rollouts
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -303,12 +303,12 @@ Xnonavpage=true
updates.
</p>
-<div class="headerLine clearfloat">
- <h1 id="multiple-apk">
+<div class="headerLine">
+ <h2 id="multiple-apk">
Multiple APK Support
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -335,12 +335,12 @@ Xnonavpage=true
of the normal app installation.
</p>
-<div class="headerLine clearfloat">
- <h1 id="selling-pricing-your-products">
+<div class="headerLine">
+ <h2 id="selling-pricing-your-products">
Selling and Pricing Your Products
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure-right">
@@ -407,12 +407,12 @@ Xnonavpage=true
Expand into New Markets</a>.
</p>
-<div class="headerLine clearfloat">
- <h1 id="in-app-products">
+<div class="headerLine">
+ <h2 id="in-app-products">
In-app Products
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -448,12 +448,12 @@ Xnonavpage=true
monetization models
</p>
-<div class="headerLine clearfloat">
- <h1 id="distribution-controls">
+<div class="headerLine">
+ <h2 id="distribution-controls">
Distribution Controls
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -518,12 +518,12 @@ Xnonavpage=true
exclude specific devices if needed.
</p>
-<div class="headerLine clearfloat">
- <h1 id="reviews-reports">
+<div class="headerLine">
+ <h2 id="reviews-reports">
User Reviews and Crash Reports
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure-right" style="width:500px;">
@@ -548,12 +548,12 @@ Xnonavpage=true
devices.
</p>
-<div class="headerLine clearfloat">
- <h1 id="app-stats">
+<div class="headerLine">
+ <h2 id="app-stats">
App Statistics
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure" style="width:500px">
@@ -587,9 +587,12 @@ Xnonavpage=true
on data inside a dimension by adding specific points to the timeline.
</p>
+<p style="clear:both">
+</p>
+
<div class="dynamic-grid">
-<div class="headerLine clearfloat">
-<h1 id="related-resources">Related Resources</h1><hr/>
+<div class="headerLine">
+<h2 id="related-resources">Related Resources</h2>
</div>
<div class="resource-widget resource-flow-layout col-13"
diff --git a/docs/html/distribute/googleplay/edu/about.jd b/docs/html/distribute/googleplay/edu/about.jd
index 3944909..e73356e 100644
--- a/docs/html/distribute/googleplay/edu/about.jd
+++ b/docs/html/distribute/googleplay/edu/about.jd
@@ -106,8 +106,10 @@ Xnonavpage=true
</div>
</div>
-<div class="headerLine clearfloat">
-<h1>Related Resources</h1><hr>
+<p style="clear:both">
+</p>
+<div class="headerLine">
+<h2 id="related-resources">Related Resources</h2>
</div>
<div class="dynamic-grid">
diff --git a/docs/html/distribute/googleplay/edu/faq.jd b/docs/html/distribute/googleplay/edu/faq.jd
index 0866da5..36e2064 100644
--- a/docs/html/distribute/googleplay/edu/faq.jd
+++ b/docs/html/distribute/googleplay/edu/faq.jd
@@ -58,11 +58,11 @@ page.image=/distribute/images/gpfe-faq.jpg
</p>
<div class="headerLine">
- <h1 id="business-model-and-monetization">
+ <h2 id="business-model-and-monetization">
Business Model and Monetization
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -143,11 +143,11 @@ page.image=/distribute/images/gpfe-faq.jpg
</p>
<div class="headerLine">
- <h1 id="free-trials">
+ <h2 id="free-trials">
Free Trials
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -172,11 +172,11 @@ page.image=/distribute/images/gpfe-faq.jpg
</p>
<div class="headerLine">
- <h1 id="discovery">
+ <h2 id="discovery">
Discovery
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -211,11 +211,11 @@ page.image=/distribute/images/gpfe-faq.jpg
</p>
<div class="headerLine">
- <h1 id="app-review-process">
+ <h2 id="app-review-process">
App Review Process
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -255,11 +255,11 @@ page.image=/distribute/images/gpfe-faq.jpg
</p>
<div class="headerLine">
- <h1 id="app-features">
+ <h2 id="app-features">
App Features
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -310,11 +310,11 @@ page.image=/distribute/images/gpfe-faq.jpg
</p>
<div class="headerLine">
- <h1 id="marketing-and-roi">
+ <h2 id="marketing-and-roi">
Marketing and ROI
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -364,11 +364,11 @@ page.image=/distribute/images/gpfe-faq.jpg
</p>
<div class="headerLine">
- <h1 id="devices">
+ <h2 id="devices">
Devices
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -393,11 +393,11 @@ page.image=/distribute/images/gpfe-faq.jpg
</p>
<div class="headerLine">
- <h1 id="accounts">
+ <h2 id="accounts">
Accounts
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -423,7 +423,7 @@ page.image=/distribute/images/gpfe-faq.jpg
schools in the program use Google Accounts and Google Apps for Education,
offering Google Single Sign-on is ideal.
</p>
-<div class="headerLine"><h1 id="related-resources">Related Resources</h1><hr></div>
+<div class="headerLine"><h2 id="related-resources">Related Resources</h2></div>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/toolsreference/gpfefaq"
diff --git a/docs/html/distribute/googleplay/edu/start.jd b/docs/html/distribute/googleplay/edu/start.jd
index 260ae85..4886b5a 100644
--- a/docs/html/distribute/googleplay/edu/start.jd
+++ b/docs/html/distribute/googleplay/edu/start.jd
@@ -32,12 +32,12 @@ page.metaDescription=Join Google Play for Education in just a few simple steps.
"border:1px solid #ddd;padding:0px;width:100%;">
</div>
-<div class="headerLine clearfloat">
- <h1 id="register">
+<div class="headerLine">
+ <h2 id="register">
Register for a Publisher Account
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -49,11 +49,11 @@ page.metaDescription=Join Google Play for Education in just a few simple steps.
</p>
<div class="headerLine">
- <h1 id="prepare">
+ <h2 id="prepare">
Prepare Your Apps
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure-right">
@@ -138,11 +138,11 @@ page.metaDescription=Join Google Play for Education in just a few simple steps.
</p>
<div class="headerLine">
- <h1 id="publish">
+ <h2 id="publish">
Publish Your Apps
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -298,7 +298,7 @@ page.metaDescription=Join Google Play for Education in just a few simple steps.
</li>
</ul>
<div class="headerLine">
-<h1 id="related-resources">Related Resources</h1><hr>
+<h2 id="related-resources">Related Resources</h2>
</div>
<div class="dynamic-grid">
diff --git a/docs/html/distribute/googleplay/start.jd b/docs/html/distribute/googleplay/start.jd
index 6dc397b..2ba5880 100644
--- a/docs/html/distribute/googleplay/start.jd
+++ b/docs/html/distribute/googleplay/start.jd
@@ -33,11 +33,11 @@ page.image=/distribute/images/getting-started.jpg
</p>
<div class="headerLine">
- <h1>
+ <h2>
Register for a Publisher Account
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="sidebox-wrapper" style="float:right;">
@@ -92,11 +92,11 @@ page.image=/distribute/images/getting-started.jpg
</ol>
<div class="headerLine">
- <h1 id="merchant-account">
+ <h2 id="merchant-account">
Set Up a Google Wallet Merchant Account
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure" style="width:200px;">
@@ -135,11 +135,11 @@ page.image=/distribute/images/getting-started.jpg
</p>
<div class="headerLine">
- <h1>
+ <h2>
Explore the Developer Console
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -153,7 +153,7 @@ page.image=/distribute/images/getting-started.jpg
</div>
<div class="headerLine">
-<h1 id="related-resources">Related Resources</h1><hr />
+<h2 id="related-resources">Related Resources</h2><hr />
</div>
<div class="resource-widget resource-flow-layout col-13"
diff --git a/docs/html/distribute/monetize/ads.jd b/docs/html/distribute/monetize/ads.jd
index 40120c3..bcb1e52 100644
--- a/docs/html/distribute/monetize/ads.jd
+++ b/docs/html/distribute/monetize/ads.jd
@@ -104,7 +104,7 @@ page.image=/distribute/images/advertising.png
DoubleClick for Publishers Small Business</a>.
</p>
-<div class="headerLine"><h1 id="related-resources">Related resources</h1><hr></div>
+<div class="headerLine"><h2 id="related-resources">Related resources</h2></div>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/monetize/advertising"
diff --git a/docs/html/distribute/monetize/ecommerce.jd b/docs/html/distribute/monetize/ecommerce.jd
index b3f790d..65e2b20 100644
--- a/docs/html/distribute/monetize/ecommerce.jd
+++ b/docs/html/distribute/monetize/ecommerce.jd
@@ -44,12 +44,14 @@ page.tags="monetizing", "physical goods", "wallet"
Account</a>.
</p>
-<div class="headerLine clearfloat">
- <h1 id="related-resources">
+<p style="clear:both">
+</p>
+<div class="headerLine">
+ <h2 id="related-resources">
Related Resources
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/monetize/ecommerce"
diff --git a/docs/html/distribute/monetize/freemium.jd b/docs/html/distribute/monetize/freemium.jd
index ec86d19..0d33054 100644
--- a/docs/html/distribute/monetize/freemium.jd
+++ b/docs/html/distribute/monetize/freemium.jd
@@ -66,11 +66,11 @@ page.tags="in-app", "billing", "iap", "monetizing"
</p>
<div class="headerLine">
- <h1 id="related-resources">
+ <h2 id="related-resources">
Related Resources
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="resource-widget resource-flow-layout col-13"
diff --git a/docs/html/distribute/monetize/payments.jd b/docs/html/distribute/monetize/payments.jd
index 37b4d44..55c289f 100644
--- a/docs/html/distribute/monetize/payments.jd
+++ b/docs/html/distribute/monetize/payments.jd
@@ -17,11 +17,11 @@ page.tags="google play", "payments", "gift card"
</p>
<div class="headerLine">
- <h1 id="dcb">
+ <h2 id="dcb">
Direct Carrier Billing
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -33,10 +33,10 @@ page.tags="google play", "payments", "gift card"
</p>
<div class="headerLine">
- <h1 id="credit">
+ <h2 id="credit">
Credit Cards
- </h1>
- <hr>
+ </h2>
+
</div>
<p>
@@ -47,12 +47,12 @@ page.tags="google play", "payments", "gift card"
setup process.
</p>
-<div class="headerLine clearfloat">
- <h1 id="gift-cards">
+<div class="headerLine">
+ <h2 id="gift-cards">
Google Play Gift Cards
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure">
@@ -67,12 +67,14 @@ page.tags="google play", "payments", "gift card"
"_android">here</a>.
</p>
-<div class="headerLine clearfloat">
- <h1 id="balance">
+<p style="clear:both">
+</p>
+<div class="headerLine">
+ <h2 id="balance">
Google Play Balance
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure">
@@ -94,7 +96,9 @@ page.tags="google play", "payments", "gift card"
network, and other factors.
</p>
-<div class="headerLine clearfloat"><h1 id="related-resources">Related Resources</h1><hr></div>
+<p style="clear:both">
+</p>
+<div class="headerLine"><h2 id="related-resources">Related Resources</h2></div>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/monetize/paymentmethods"
diff --git a/docs/html/distribute/monetize/premium.jd b/docs/html/distribute/monetize/premium.jd
index b66cd03..c8823d1 100644
--- a/docs/html/distribute/monetize/premium.jd
+++ b/docs/html/distribute/monetize/premium.jd
@@ -35,11 +35,13 @@ page.tags="monetizing", "paid"
<a href="{@docRoot}distribute/monetize/ads.html">advertising</a> models.
</p>
-<div class="headerLine clearfloat">
- <h1>
+<p style="clear:both">
+</p>
+<div class="headerLine">
+ <h2>
Related Resources
- </h1>
- <hr>
+ </h2>
+
</div>
<div class="resource-widget resource-flow-layout col-13"
diff --git a/docs/html/distribute/monetize/subscriptions.jd b/docs/html/distribute/monetize/subscriptions.jd
index a838e30..6a4d9b1 100644
--- a/docs/html/distribute/monetize/subscriptions.jd
+++ b/docs/html/distribute/monetize/subscriptions.jd
@@ -61,7 +61,9 @@ page.tags="in-app", "iap", "monetizing", "free", "trials"
</p>
</div>
-<div class="headerLine clearfloat"><h1 id="related-resources">Related Resources</h1><hr></div>
+<p style="clear:both">
+</p>
+<div class="headerLine"><h2 id="related-resources">Related Resources</h2></div>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/monetize/subscriptions"
diff --git a/docs/html/distribute/tools/launch-checklist.jd b/docs/html/distribute/tools/launch-checklist.jd
index 3b0dd55..f310800 100644
--- a/docs/html/distribute/tools/launch-checklist.jd
+++ b/docs/html/distribute/tools/launch-checklist.jd
@@ -62,11 +62,11 @@ src="{@docRoot}distribute/images/launch-checklist.jpg"></div>
</p>
<div class="headerLine">
- <h1 id="understand-publishing">
+ <h2 id="understand-publishing">
1. Understand the Publishing Process
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -85,9 +85,7 @@ src="{@docRoot}distribute/images/launch-checklist.jpg"></div>
Play.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/launchchecklist/understanding"
@@ -95,12 +93,12 @@ data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3"
data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="understand-policies">
+<div class="headerLine">
+ <h2 id="understand-policies">
2. Understand Google Play Policies and Agreements
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -110,21 +108,19 @@ data-maxresults="6">
repeated violations, termination of your developer account.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/launchchecklist/policies" data-sortorder=
"-timestamp" data-cardsizes="6x3" data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="test-quality">
+<div class="headerLine">
+ <h2 id="test-quality">
3. Test for Quality
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -154,21 +150,19 @@ data-maxresults="6">
should exhibit.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/launchchecklist/quality" data-sortorder=
"-timestamp" data-cardsizes="6x3,6x3,6x3,9x3,9x3,9x3" data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="determine-rating">
+<div class="headerLine">
+ <h2 id="determine-rating">
4. Determine your App’s Content Rating
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -212,21 +206,19 @@ data-maxresults="6">
no changes are required in your app binary.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/launchchecklist/rating" data-sortorder=
"-timestamp" data-cardsizes="9x3,6x3,6x3,9x3,9x3,9x3" data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="determine-country">
+<div class="headerLine">
+ <h2 id="determine-country">
5. Determine Country Distribution
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -280,21 +272,19 @@ data-maxresults="6">
Checklist</a> for key steps and considerations in the localization process.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/launchchecklist/country" data-sortorder=
"-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="confirm-size">
+<div class="headerLine">
+ <h2 id="confirm-size">
6. Confirm the App's Overall Size
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -335,21 +325,19 @@ data-maxresults="6">
on your code when building your release-ready APK.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/launchchecklist/size" data-sortorder=
"-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="confirm-platform">
+<div class="headerLine">
+ <h2 id="confirm-platform">
7. Confirm the App's Platform and Screen Compatibility Ranges
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -387,21 +375,19 @@ data-maxresults="6">
<a href="{@docRoot}about/dashboards/index.html">Device Dashboard</a> charts.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/launchchecklist/platform" data-sortorder=
"-timestamp" data-cardsizes="6x3,6x3,6x3" data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="decide-price">
+<div class="headerLine">
+ <h2 id="decide-price">
8. Decide Whether your App will be Free or Priced
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure">
@@ -450,21 +436,19 @@ data-maxresults="6">
set up a Google Wallet Merchant Account</a> before you can publish.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/launchchecklist/price" data-sortorder=
"-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="consider-billing">
+<div class="headerLine">
+ <h2 id="consider-billing">
9. Consider using In-app Billing
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -485,9 +469,7 @@ data-maxresults="6">
complete and test your implementation before creating your release-ready APK.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/launchchecklist/purchasemethod"
@@ -495,12 +477,12 @@ data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3"
data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="set-prices">
+<div class="headerLine">
+ <h2 id="set-prices">
10. Set Prices for your Products
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -517,21 +499,19 @@ data-maxresults="6">
available currencies through the Developer Console.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/launchchecklist/setprice" data-sortorder=
"-timestamp" data-cardsizes="9x3,9x3,9x3,9x3,9x3,9x3" data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="start-localization">
+<div class="headerLine">
+ <h2 id="start-localization">
11. Start Localization
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -599,9 +579,7 @@ data-maxresults="6">
listing.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/launchchecklist/localization"
@@ -609,12 +587,12 @@ data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3"
data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="prepare-graphics">
+<div class="headerLine">
+ <h2 id="prepare-graphics">
12. Prepare Promotional Graphics, Screenshots, and Videos
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -659,21 +637,19 @@ data-maxresults="6">
publishing date.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/launchchecklist/graphics" data-sortorder=
"-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="build-upload">
+<div class="headerLine">
+ <h2 id="build-upload">
13. Build and Upload the Release-ready APK
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -701,7 +677,7 @@ data-maxresults="6">
Developer Console. If necessary, you can replace an APK with a more recent
version before publishing.
</p>
-<!--<h3>Related resources</h3>
+<!--<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/toolsreference/launchchecklist/build"
@@ -709,12 +685,12 @@ data-maxresults="6">
data-cardSizes="9x3,9x3,6x3,9x3,9x3,9x3"
data-maxResults="6"></div>-->
-<div class="headerLine clearfloat">
- <h1 id="plan-beta">
+<div class="headerLine">
+ <h2 id="plan-beta">
14. Plan a Beta Release
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="sidebox-wrapper" style="float:right;">
@@ -765,11 +741,11 @@ See how you can facilitate testing with Google Play.</td>
</table> -->
<div class="headerLine">
- <h1 id="complete-details">
+ <h2 id="complete-details">
15. Complete the Apps’ Store Listing
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -815,9 +791,7 @@ See how you can facilitate testing with Google Play.</td>
elsewhere.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/launchchecklist/productdetails"
@@ -825,12 +799,12 @@ data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3"
data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="use-badges">
+<div class="headerLine">
+ <h2 id="use-badges">
16. Use Google Play Badges and Links in your Promotional Campaigns
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -853,21 +827,19 @@ data-maxresults="6">
available.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/launchchecklist/badges" data-sortorder=
"-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3" data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="final-checks">
+<div class="headerLine">
+ <h2 id="final-checks">
17. Final Checks and Publishing
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -959,9 +931,7 @@ data-maxresults="6">
linking from your promotional campaigns.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/launchchecklist/finalchecks"
@@ -969,12 +939,12 @@ data-sortorder="-timestamp" data-cardsizes="6x3,6x3,6x3,9x3,9x3,9x3"
data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="support-users">
+<div class="headerLine">
+ <h2 id="support-users">
18. Support Users after Launch
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -1063,7 +1033,7 @@ data-maxresults="6">
</ul>
</ul>
-<h3>Related resources</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/toolsreference/launchchecklist/afterlaunch"
diff --git a/docs/html/distribute/tools/localization-checklist.jd b/docs/html/distribute/tools/localization-checklist.jd
index 7a638ed..08a8143 100644
--- a/docs/html/distribute/tools/localization-checklist.jd
+++ b/docs/html/distribute/tools/localization-checklist.jd
@@ -41,11 +41,11 @@ page.image=/distribute/images/localization-checklist.jpg
</p>
<div class="headerLine">
- <h1 id="identify-languages">
+ <h2 id="identify-languages">
1. Identify target languages and locales
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -84,21 +84,19 @@ page.image=/distribute/images/localization-checklist.jpg
development, translation, testing, and marketing efforts to these markets.
</p>
-<h3 id="related-resources">
- Related Resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/localizationchecklist/identifylocales"
data-sortorder="-timestamp" data-cardsizes="9x3," data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="design">
+<div class="headerLine">
+ <h2 id="design">
2. Design for localization
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -224,21 +222,19 @@ data-sortorder="-timestamp" data-cardsizes="9x3," data-maxresults="6">
directories, without language or locale qualifiers.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/tools/loc/designforloc" data-sortorder="-timestamp"
data-cardsizes="9x3" data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="manage-strings">
+<div class="headerLine">
+ <h2 id="manage-strings">
3. Manage strings for localization
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -399,21 +395,19 @@ data-cardsizes="9x3" data-maxresults="6">
&lt;/resources&gt;
</pre>
-<h3 class="clearfloat">
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/localizationchecklist/managestrings"
data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="translate-strings">
+<div class="headerLine">
+ <h2 id="translate-strings">
4. Translate UI strings and other resources
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -570,21 +564,19 @@ data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
<img src="{@docRoot}images/gp-localization-trans-0.png" class="border-img">
</div>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/localizationchecklist/translatestrings"
data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="test">
+<div class="headerLine">
+ <h2 id="test">
5. Test your localized app
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -690,7 +682,7 @@ data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
your localized apps. One way to do that is through beta testing with regional
users &mdash; Google Play can help you do this. <!-- </p>
-<h3 class="clearfloat">Related resources</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/toolsreference/localizationchecklist/test"
@@ -699,12 +691,12 @@ data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
data-maxResults="6"></div> -->
</p>
-<div class="headerLine clearfloat">
- <h1 id="prepare-launch">
+<div class="headerLine">
+ <h2 id="prepare-launch">
6. Prepare for international launch
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -887,9 +879,7 @@ data-sortorder="-timestamp" data-cardsizes="9x3" data-maxresults="6">
helpful reminders for a successful localized launch.
</p>
-<h3>
- Related resources
-</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13" data-query=
"collection:distribute/toolsreference/localizationchecklist/preplaunch"
@@ -897,12 +887,12 @@ data-sortorder="-timestamp" data-cardsizes="9x3,9x3,6x3,9x3,9x3,9x3"
data-maxresults="6">
</div>
-<div class="headerLine clearfloat">
- <h1 id="support-users">
+<div class="headerLine">
+ <h2 id="support-users">
7. Support international users after launch
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -968,7 +958,7 @@ data-maxresults="6">
"{@docRoot}distribute/tools/launch-checklist.html">Launch Checklist</a> to
learn more about how to plan, build, and launch your app on Google Play.
</p>
-<h3 class="clearfloat">Related resources</h3>
+<h3 class="rel-resources clearfloat">Related resources</h3>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/toolsreference/localizationchecklist/supportlaunch"
diff --git a/docs/html/distribute/tools/open-distribution.jd b/docs/html/distribute/tools/open-distribution.jd
index f804af2..e28102d 100644
--- a/docs/html/distribute/tools/open-distribution.jd
+++ b/docs/html/distribute/tools/open-distribution.jd
@@ -26,11 +26,11 @@ page.image=/distribute/images/alt-distribution.jpg
</p>
<div class="headerLine">
- <h1>
+ <h2>
Distributing Through an App Marketplace
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -55,11 +55,11 @@ page.image=/distribute/images/alt-distribution.jpg
</p>
<div class="headerLine">
- <h1>
+ <h2>
Distributing Your Apps by Email
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure" style="width:300px;">
@@ -95,11 +95,11 @@ page.image=/distribute/images/alt-distribution.jpg
</p>
<div class="headerLine">
- <h1>
+ <h2>
Distributing Through a Website
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -119,12 +119,12 @@ page.image=/distribute/images/alt-distribution.jpg
sources</a>.
</p>
-<div class="headerLine clearfloat">
- <h1>
+<div class="headerLine">
+ <h2>
User Opt-In for Apps from Unknown Sources
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure" style="width:325px;">
diff --git a/docs/html/distribute/tools/promote/badge-files.jd b/docs/html/distribute/tools/promote/badge-files.jd
index cce3632..e65e698 100644
--- a/docs/html/distribute/tools/promote/badge-files.jd
+++ b/docs/html/distribute/tools/promote/badge-files.jd
@@ -12,7 +12,7 @@ table tr td {border:0}
<p>The following links provide the Adobe&reg; Illustrator&reg; (.ai) file for the
two Google Play badges.</p>
-<hr>
+
<img src="{@docRoot}images/brand/en_generic_rgb_wo_60.png" alt="Get It On Google Play">
<div style="clear:left">&nbsp;</div>
@@ -21,9 +21,10 @@ two Google Play badges.</p>
<a href="{@docRoot}downloads/brand/v2/english_get.ai">English (English)</a><br/>
+ <a href="{@docRoot}downloads/brand/af_generic_rgb_wo.ai">Afrikaans (Afrikaans)</a><br/>
+
<a href="{@docRoot}downloads/brand/v2/amharic_get.ai">ኣማርኛ (Amharic)</a><br/>
- <a href="{@docRoot}downloads/brand/af_generic_rgb_wo.ai">Afrikaans (Afrikaans)</a><br/>
<!--
<a href="{@docRoot}downloads/brand/ar_generic_rgb_wo.ai">العربية (Arabic)</a><br/>
-->
@@ -137,7 +138,7 @@ two Google Play badges.</p>
-<hr>
+
<img src="{@docRoot}images/brand/en_app_rgb_wo_60.png" alt="Android App On Google Play">
<div style="clear:left">&nbsp;</div>
@@ -286,6 +287,3 @@ Guidelines</a>.
<p>To quickly create a badge that links to your apps on Google Play,
use the <a
href="{@docRoot}distribute/tools/promote/badges.html">Googe Play badge generator</a>.</p>
-
-
- \ No newline at end of file
diff --git a/docs/html/distribute/tools/promote/brand.jd b/docs/html/distribute/tools/promote/brand.jd
index 2116c0f..9b9f9a3 100644
--- a/docs/html/distribute/tools/promote/brand.jd
+++ b/docs/html/distribute/tools/promote/brand.jd
@@ -9,6 +9,11 @@ page.tags="brand, bugdroid, assets"
promotional materials. You can use the icons and other assets on this page
provided that you follow the guidelines.</p>
+<p>Use of the Android or Google Play brands must be reviewed by the Android
+Partner Marketing team. Use the <a
+href="https://docs.google.com/forms/d/1YE5gZpAAcFKjYcUddCsK1Bv9a9Y-luaLVnkazVlaJ2w/viewform">Android and Google Play Brand Permissions Inquiry form</a> to submit your
+marketing for review.</p>
+
<h2 id="brand-android">Android</h2>
<p>The following are guidelines for the Android brand
@@ -29,10 +34,12 @@ provided that you follow the guidelines.</p>
<li><span style="color:red">Incorrect</span>: "Android MediaPlayer"</li>
<li><span style="color:green">Correct</span>: "MediaPlayer for Android"</li>
</ul>
- <p>If used with your logo, "for Android" needs to be smaller in size than your logo.
+ <p>If used with your logo, "for Android" should be no larger than 90% of your logo’s size.
First instance of this use should be followed by a TM symbol, "for Android&trade;".</p>
</li>
- <li>Android may be used as a descriptor, as long as it is followed by a proper generic term.
+ <li>Android may be used as a descriptor, as long as it is followed by a
+ proper generic term. (Think of "Android" as a term used in place of
+ "the Android platform.")
<ul>
<li><span style="color:red">Incorrect</span>: "Android MediaPlayer" or "Android XYZ app"</li>
<li><span style="color:green">Correct</span>: "Android features" or "Android applications"</li>
@@ -62,14 +69,14 @@ provided that you follow the guidelines.</p>
<p>When using the Android Robot or any modification of it, proper attribution is
required under the terms of the <a href="http://creativecommons.org/licenses/by/3.0/">Creative
-Commons Attribution</a> license:</p>
+ Commons Attribution 3.0</a> license:</p>
<blockquote><em>The Android robot is reproduced or modified from work created and shared by Google and
used according to terms described in the Creative Commons 3.0 Attribution License.</em></blockquote>
- <p>You may not file trademark applications incorporating the Android robot logo or
-derivatives thereof. We want to ensure that the Android robot remains available
-for all to use.</p>
+ <p>You may not file trademark applications incorporating the Android robot
+ logo or derivatives thereof within your company logo or business name. We
+ want to ensure that the Android robot remains available for all to use.</p>
<h4 style="clear:right">Android logo</h4>
@@ -78,11 +85,9 @@ for all to use.</p>
<img alt="" src="{@docRoot}images/brand/android_logo_no.png">
</div>
-<p>The Android logo may not be used. Nor can this be used with the Android robot.</p>
-<p>The custom typeface may not be used.</p>
-
-
+<p>The Android logo may not be used.</p>
+<p>The custom typeface may not be used.</p>
<h2 id="brand-google_play">Google Play</h2>
@@ -98,7 +103,7 @@ in text.</p>
<p>When referring to the mobile experience, use "Google Play" unless the text is clearly
instructional for the user. For example, a marketing headline might read "Download our
games on Google Play&trade;," but instructional text would read "Download our games using the Google
-Play&trade; Store app."
+Play&trade; store app."
<p>Any use of the Google Play name or icon needs to include this
attribution in your communication:</p>
@@ -111,16 +116,16 @@ Play&trade; Store app."
<p style="text-align:center">
<a href="{@docRoot}images/brand/Google_Play_Store_48.png">48x48</a> |
<a href="{@docRoot}images/brand/Google_Play_Store_96.png">96x96</a><br>
- <a href="{@docRoot}downloads/brand/Google_Play_Store.ai">Illustrator (.ai)</a>
+ <a href="{@docRoot}images/brand/Google_Play_Store_600.png">600x576</a>
</p>
</div>
-<h4>Google Play Store icon</h4>
+<h4>Google Play store icon</h4>
-<p>You may use the Google Play Store icon, but you may not modify it.</p>
+<p>You may use the Google Play store icon, but you may not modify it.</p>
-<p>As mentioned above, when referring to the Google Play Store app in copy, use the full name:
-"Google Play Store." However, when labeling the Google Play Store icon directly, it's OK to use
+<p>As mentioned above, when referring to the Google Play store app in copy, use the full name:
+"Google Play store." However, when labeling the Google Play store icon directly, it's OK to use
"Play Store" alone to accurately reflect the icon label as it appears on a device.</p>
@@ -140,9 +145,14 @@ Play&trade; Store app."
<a href="{@docRoot}images/brand/en_generic_rgb_wo_60.png">172x60</a></p>
</div>
- <p>The "Get it on Google Play" and "Android App on Google Play" logos are badges that you
- can use on your website and promotional materials, to point to your products on Google
- Play.</p>
+ <p>The "Get it on Google Play" and "Android App on Google Play" logos are
+ badges that you can use on your website and promotional materials, to point
+ to your products on Google Play. Additional Google Play badge formats and
+ badges for music, books, magazines, movies, and TV shows are also available.
+ Use the <a
+ href="https://docs.google.com/forms/d/1YE5gZpAAcFKjYcUddCsK1Bv9a9Y-luaLVnkazVlaJ2w/viewform">Android
+ and Google Play Brand Permissions Inquiry form</a> to request
+ those badges.</p>
<ul>
<li>Don't modify the color, proportions, spacing, or any other aspect of the badge image.
@@ -163,7 +173,7 @@ Play&trade; Store app."
<p>To quickly create a badge that links to your apps on Google Play,
use the <a
- href="{@docRoot}distribute/tools/promote/badges.html">Googe Play badge generator</a>
+ href="{@docRoot}distribute/tools/promote/badges.html">Google Play badge generator</a>
(provides the badge in over 40 languages).</p>
<p>To create your own size, download an Adobe&reg; Illustrator&reg; (.ai) file for the
@@ -171,25 +181,11 @@ Play&trade; Store app."
badge in over 40 languages</a>.</p>
<p>For details on all the ways that you can link to your product details page in Google Play,
- see <a href="{@docRoot}distribute/tools/promote/linking.html">Linking to your products</a></p>
-
-
-
-<h2 id="Questions">Questions</h2>
-
-<p>To view our full guidelines or for any further brand usage questions, please contact our
-Android Partner Marketing team:</p>
-<ul>
- <li>For North and South America, please contact <a
- href="mailto:android-brand-approvals@google.com?Subject=Brand%20Approval%20Questions"
- >android-brand-approvals@google.com</a></li>
-
- <li>For Europe and Emerging Markets, please contact <a
- href="mailto:emea-android-brand@google.com?Subject=Brand%20Approval%20Questions"
- >emea-android-brand@google.com</a></li>
+ see <a href="{@docRoot}distribute/tools/promote/linking.html">Linking to your products</a>.</p>
- <li>For Asia and Pacific-America, please contact <a
- href="mailto:apac-android-brand-approvals@google.com?Subject=Brand%20Approval%20Questions"
- >apac-android-brand-approvals@google.com</a></li>
-</ul>
+<h2 id="Marketing_Review">Marketing Reviews and Brand Inquiries</h2>
+<p>Use the <a
+href="https://docs.google.com/forms/d/1YE5gZpAAcFKjYcUddCsK1Bv9a9Y-luaLVnkazVlaJ2w/viewform">Android
+and Google Play Brand Permissions Inquiry form</a> to submit any marketing
+reviews or brand inquires. Typical response time is at least one week.</p>
diff --git a/docs/html/distribute/tools/promote/device-art.jd b/docs/html/distribute/tools/promote/device-art.jd
index b0b5f84..a204ea1 100644
--- a/docs/html/distribute/tools/promote/device-art.jd
+++ b/docs/html/distribute/tools/promote/device-art.jd
@@ -12,7 +12,7 @@ Xnonavpage=true
<p class="note"><strong>Note</strong>: Do <em>not</em> use graphics created here in your 1024x500
feature image or screenshots for your Google Play app listing.</p>
-<hr>
+
<div class="supported-browser">
@@ -28,7 +28,7 @@ feature image or screenshots for your Google Play app listing.</p>
</div>
</div>
-<hr>
+
<div class="layout-content-row">
<div class="layout-content-col span-3">
diff --git a/docs/html/distribute/users/build-buzz.jd b/docs/html/distribute/users/build-buzz.jd
index b76498e..412589f 100644
--- a/docs/html/distribute/users/build-buzz.jd
+++ b/docs/html/distribute/users/build-buzz.jd
@@ -65,11 +65,11 @@ page.tags="users, growth, promotion"
</p>
<div class="headerLine">
- <h1 id="link-to-your-apps">
+ <h2 id="link-to-your-apps">
Link to Your Apps in Google Play
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -101,12 +101,12 @@ page.tags="users, growth, promotion"
</li>
</ul>
-<div class="headerLine clearfloat">
- <h1 id="use-the-google-play-badge">
+<div class="headerLine">
+ <h2 id="use-the-google-play-badge">
Use the Google Play Badge
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure" style="margin:0 3em;">
@@ -126,12 +126,12 @@ page.tags="users, growth, promotion"
also easy to make and available in multiple languages.
</p>
-<div class="headerLine clearfloat">
- <h1 id="cross-promote-from-your-other-apps">
+<div class="headerLine">
+ <h2 id="cross-promote-from-your-other-apps">
Cross-Promote from Your Other Apps
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure-right">
@@ -158,11 +158,11 @@ page.tags="users, growth, promotion"
</p>
<div class="headerLine">
- <h1 id="hold-a-contest">
+ <h2 id="hold-a-contest">
Hold a Contest
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -180,11 +180,11 @@ page.tags="users, growth, promotion"
</p>
<div class="headerLine">
- <h1 id="leverage-pr">
+ <h2 id="leverage-pr">
Leverage PR
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -196,11 +196,11 @@ page.tags="users, growth, promotion"
</p>
<div class="headerLine">
- <h1 id="use-social-media">
+ <h2 id="use-social-media">
Use Social Media
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -220,12 +220,12 @@ page.tags="users, growth, promotion"
review your apps. A review on the right blog is a great promotion.
</p>
-<div class="headerLine clearfloat">
- <h1 id="publish-youtube-videos">
+<div class="headerLine">
+ <h2 id="publish-youtube-videos">
Publish YouTube Videos
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="center-img" style="padding-top:1em;">
@@ -240,11 +240,11 @@ page.tags="users, growth, promotion"
</p>
<div class="headerLine">
- <h1 id="advertise">
+ <h2 id="advertise">
Advertise
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure">
@@ -262,12 +262,12 @@ page.tags="users, growth, promotion"
Sign up for an AdMob account</a> to get started.
</p>
-<div class="headerLine clearfloat">
- <h1 id="maximize-your-marketing-spend">
+<div class="headerLine">
+ <h2 id="maximize-your-marketing-spend">
Maximize your Marketing Spend
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure" style="margin: 0 3em;">
@@ -285,12 +285,12 @@ page.tags="users, growth, promotion"
platforms simultaneously helps you maximize your return on investment.
</p>
-<div class="headerLine clearfloat">
- <h1 id="related-resources">
+<div class="headerLine">
+ <h2 id="related-resources">
Related Resources
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="resource-widget resource-flow-layout col-13"
diff --git a/docs/html/distribute/users/build-community.jd b/docs/html/distribute/users/build-community.jd
index 1623939..5cdabea 100644
--- a/docs/html/distribute/users/build-community.jd
+++ b/docs/html/distribute/users/build-community.jd
@@ -43,11 +43,11 @@ page.tags="users, growth, community"
</p>
<div class="headerLine">
- <h1 id="starting-your-community">
+ <h2 id="starting-your-community">
Starting Your Community
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -116,11 +116,11 @@ page.tags="users, growth, community"
</p>
<div class="headerLine">
- <h1 id="tools-to-build-your-community">
+ <h2 id="tools-to-build-your-community">
Tools to Build Your Community
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -158,11 +158,11 @@ page.tags="users, growth, community"
</p>
<div class="headerLine">
- <h1 id="managing-your-community">
+ <h2 id="managing-your-community">
Managing Your Community
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure">
@@ -189,11 +189,11 @@ page.tags="users, growth, community"
versions or new apps to make them feel special.
</p>
-<div class="headerLine clearfloat">
- <h1 id="related-resources">
+<div class="headerLine">
+ <h2 id="related-resources">
Related Resources
- </h1>
- <hr>
+ </h2>
+
</div>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/users/buildcommunity"
diff --git a/docs/html/distribute/users/expand-to-new-markets.jd b/docs/html/distribute/users/expand-to-new-markets.jd
index cc94a92..df1a0fb 100644
--- a/docs/html/distribute/users/expand-to-new-markets.jd
+++ b/docs/html/distribute/users/expand-to-new-markets.jd
@@ -77,11 +77,11 @@ page.tags="users, growth, global"
</p>
<div class="headerLine">
- <h1 id="localize-your-product">
+ <h2 id="localize-your-product">
Localize Your Product
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="sidebox-wrapper" style="float:right;">
@@ -124,20 +124,16 @@ page.tags="users, growth, global"
high-quality professional translations at competitive prices.
</p>
-<div style="float:left; width:48%; padding:8px;">
- <img src="{@docRoot}images/gp-listing-3.jpg">
-</div>
+<img src="{@docRoot}images/gp-listing-3.jpg" style="padding:8px 0">
-<div style="width:48%; padding:8px; float:left">
- <img src="{@docRoot}images/gp-expand-2.jpg">
-</div>
+<img src="{@docRoot}images/gp-expand-2.jpg" style="padding:8px 0">
-<div class="headerLine clearfloat">
- <h1 id="testing-and-support">
+<div class="headerLine">
+ <h2 id="testing-and-support">
Testing and Support
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -162,11 +158,11 @@ page.tags="users, growth, global"
</p>
<div class="headerLine">
- <h1 id="localize-your-google-play-listing">
+ <h2 id="localize-your-google-play-listing">
Localize Your Google Play Store Listing
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="sidebox-wrapper" style="float:right;">
@@ -295,11 +291,11 @@ page.tags="users, growth, global"
</p>
<div class="headerLine">
- <h1 id="marketing">
+ <h2 id="marketing">
Marketing
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="figure">
@@ -316,7 +312,7 @@ page.tags="users, growth, global"
for each language you support.
</p>
-<div class="headerLine clearfloat"><h1 id="related-resources">Related Resources</h1><hr></div>
+<div class="headerLine"><h2 id="related-resources">Related Resources</h2></div>
<div class="resource-widget resource-flow-layout col-13"
data-query="collection:distribute/getusers/expandnewmarkets"
diff --git a/docs/html/distribute/users/know-your-user.jd b/docs/html/distribute/users/know-your-user.jd
index fb91a05..1fbcb9c 100644
--- a/docs/html/distribute/users/know-your-user.jd
+++ b/docs/html/distribute/users/know-your-user.jd
@@ -15,13 +15,9 @@ page.tags="users, growth, global"
when they use your app, and how often they return to it.
</p>
-<div class="headerLine">
- <h1 id="read-ratings-comments">
+ <h2 id="read-ratings-comments">
Read Ratings Comments
- </h1>
-
- <hr>
-</div>
+ </h2>
<p>
The most obvious way to get to know your users is by reading review comments
@@ -46,11 +42,11 @@ page.tags="users, growth, global"
</div>
<div class="headerLine">
- <h1 id="start-community">
+ <h2 id="start-community">
Start a Community
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -68,11 +64,11 @@ page.tags="users, growth, global"
</p>
<div class="headerLine">
- <h1 id="create-survey">
+ <h2 id="create-survey">
Create a Survey
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -92,11 +88,11 @@ page.tags="users, growth, global"
</p>
<div class="headerLine">
- <h1 id="add-analytics">
+ <h2 id="add-analytics">
Add Analytics to your Apps
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -121,11 +117,11 @@ page.tags="users, growth, global"
</div>
<div class="headerLine">
- <h1 id="use-google">
+ <h2 id="use-google">
Use Google+
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -142,8 +138,8 @@ page.tags="users, growth, global"
<img src="{@docRoot}images/gp-your-user-2.jpg">
</div>
-<div class="headerLine clearfloat">
-<h1 id="related-resources">Related Resources</h1><hr>
+<div class="headerLine">
+<h2 id="related-resources">Related Resources</h2>
</div>
<div class="resource-widget resource-flow-layout col-13"
diff --git a/docs/html/distribute/users/your-listing.jd b/docs/html/distribute/users/your-listing.jd
index cc72fff..f869950 100644
--- a/docs/html/distribute/users/your-listing.jd
+++ b/docs/html/distribute/users/your-listing.jd
@@ -13,11 +13,11 @@ page.tags="listing, google play, users, growth"
</p>
<div class="headerLine">
- <h1 id="graphics-imagery">
+ <h2 id="graphics-imagery">
Graphics &amp; Imagery Tips
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -94,12 +94,12 @@ page.tags="listing, google play, users, growth"
Featured-Image Guidelines</a>.
</p>
-<div class="headerLine clearfloat">
- <h1 id="localization-tips">
+<div class="headerLine">
+ <h2 id="localization-tips">
Localization Tips
- </h1>
+ </h2>
+
- <hr>
</div>
<div class="sidebox-wrapper" style="float:right;">
@@ -125,16 +125,14 @@ page.tags="listing, google play, users, growth"
the growing international audience</a>.
</p>
-<div style="float:left;">
<img src="{@docRoot}images/gp-listing-3.jpg">
-</div>
-<div class="headerLine clearfloat">
- <h1 id="keyword-tips">
+<div class="headerLine">
+ <h2 id="keyword-tips">
Keyword Tips
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -146,11 +144,11 @@ page.tags="listing, google play, users, growth"
</p>
<div class="headerLine">
- <h1 id="app-indexing">
+ <h2 id="app-indexing">
Sign Up for App Indexing
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -164,11 +162,11 @@ page.tags="listing, google play, users, growth"
</div>
<div class="headerLine">
- <h1 id="education-app">
+ <h2 id="education-app">
Education App Tips
- </h1>
+ </h2>
+
- <hr>
</div>
<p>
@@ -181,7 +179,7 @@ page.tags="listing, google play, users, growth"
</p>
<div class="headerLine">
-<h1 id="related-resources">Related Resources</h1><hr>
+<h2 id="related-resources">Related Resources</h2>
</div>
<div class="resource-widget resource-flow-layout col-13"
diff --git a/docs/html/google/play-services/setup.jd b/docs/html/google/play-services/setup.jd
index d502e8d..744e191 100644
--- a/docs/html/google/play-services/setup.jd
+++ b/docs/html/google/play-services/setup.jd
@@ -95,7 +95,9 @@ you can continue development with the Google Play services SDK, but must instead
<li>Open the <code>build.gradle</code> file inside your application module directory.
<p class="note"><strong>Note:</strong> Android Studio projects contain a top-level
<code>build.gradle</code> file and a <code>build.gradle</code> file for each module.
- Be sure to edit the file for your application module.</p></li>
+ Be sure to edit the file for your application module. See
+ <a href="{@docRoot}sdk/installing/studio-build.html">Building Your Project with
+ Gradle</a> for more information about Gradle.</p></li>
<li>Add a new build rule under <code>dependencies</code> for the latest version of
<code>play-services</code>. For example:
<pre class="no-pretty-print">
diff --git a/docs/html/google/play/billing/billing_admin.jd b/docs/html/google/play/billing/billing_admin.jd
index 46ad905..5904b03 100644
--- a/docs/html/google/play/billing/billing_admin.jd
+++ b/docs/html/google/play/billing/billing_admin.jd
@@ -66,7 +66,8 @@ storing and delivering the digital content that you sell in your applications.</
</p>
</div>
-<p>You can create a product list for any published application or any draft application that's been
+<p>You can create a product list for any published application, or any
+application in the alpha or beta channels, that's been
uploaded and saved to the Developer Console. However, you must have a Google Wallet merchant
account and the application's manifest must include the <code>com.android.vending.BILLING</code>
permission. If an application's manifest does not include this permission, you will be able to edit
@@ -75,6 +76,13 @@ information about this permission, see
<a href="{@docRoot}google/play/billing/billing_integrate.html#billing-permission">Updating Your
Application's Manifest</a>.</p>
+<p class="note"><strong>Note:</strong> Previously you could test an app by
+uploading an unpublished "draft" version. This functionality is no longer
+supported; instead, you must publish it to the alpha or beta distribution
+channel. For more information, see <a
+href="{@docRoot}google/play/billing/billing_testing.html#draft_apps">Draft Apps
+are No Longer Supported</a>.
+
<p>In addition, an application package can have only one product list. If you create a product
list for an application, and you use the <a
href="{@docRoot}google/play/publishing/multiple-apks.html">multiple APK feature</a> to distribute
diff --git a/docs/html/google/play/billing/billing_testing.jd b/docs/html/google/play/billing/billing_testing.jd
index df6c657..8a49433 100644
--- a/docs/html/google/play/billing/billing_testing.jd
+++ b/docs/html/google/play/billing/billing_testing.jd
@@ -8,8 +8,9 @@ parent.link=index.html
<h2>In this document</h2>
<ol>
<li><a href="#testing-purchases">Testing In-app Purchases</a></li>
- <li><a href="#billing-testing-static">Testing with static responses</a></li>
+ <li><a href="#billing-testing-static">Testing with Static Responses</a></li>
<li><a href="#billing-testing-real">Setting Up for Test Purchases</a></li>
+ <li><a href="#draft_apps">Draft Apps are No Longer Supported</a></li>
</ol>
<h2>See also</h2>
<ol>
@@ -79,8 +80,7 @@ method).</p>
<p>First, upload and publish in-app products that you want testers to be able to
purchase. You can upload and publish in-app products in the Developer Console.
Note that you can upload and publish your in-app items before you publish the
-APK itself. For example, you can publish your in-app items while your APK is
-still a draft. </p>
+APK itself.</p>
<p>Next, create license test accounts for authorized users. In the Developer
Console, go to <strong>Settings</strong> &gt; <strong>Account details</strong>,
@@ -149,11 +149,12 @@ license accounts in your alpha and beta distribution groups, those users will
only be able to make test purchases. </p>
-<h2 id="billing-testing-static">Testing with static responses</h2>
+<h2 id="billing-testing-static">Testing with Static Responses</h2>
<p>We recommend that you first test your In-app Billing implementation using static responses from
Google Play. This enables you to verify that your application is handling the primary Google
-Play responses correctly and that your application is able to verify signatures correctly.</p>
+Play responses correctly and that your application is able to verify signatures correctly. You can do this
+even if the app hasn't been published yet.</p>
<p>To test your implementation with static responses, you make an In-app Billing request using a
special item that has a reserved product ID. Each reserved product ID returns a specific static
@@ -173,6 +174,12 @@ the Developer Console to perform static response tests with the reserved product
install your application on a device, log into the device, and make billing requests using the
reserved product IDs.</p>
+<p class="note"><strong>Note:</strong> Previously you could test an app by
+uploading an unpublished "draft" version. This functionality is no longer
+supported. However, you can test your app with static responses even before you
+upload it to the Google Play store. For more information, see <a
+href="#draft_apps">Draft Apps are No Longer Supported</a>.
+
<p>There are four reserved product IDs for testing static In-app Billing responses:</p>
<ul>
@@ -205,67 +212,12 @@ Pricing</a>.</p>
</li>
</ul>
-<p>In some cases, the reserved items may return signed static responses, which lets you test
-signature verification in your application. To test signature verification with the special reserved
-product IDs, you may need to set up <a
-href="{@docRoot}google/play/billing/billing_admin.html#billing-testing-setup">test accounts</a> or
-upload your application as a unpublished draft application. Table 1 shows you the conditions under
-which static responses are signed.</p>
-
-<p class="table-caption" id="static-responses-table"><strong>Table 1.</strong>
-Conditions under which static responses are signed.</p>
-
-<table>
-<tr>
-<th>Application ever been published?</th>
-<th>Draft application uploaded and unpublished?</th>
-<th>User who is running the application</th>
-<th>Static response signature</th>
-</tr>
-
-<tr>
-<td>No</td>
-<td>No</td>
-<td>Any</td>
-<td>Unsigned</td>
-</tr>
-
-<tr>
-<td>No</td>
-<td>No</td>
-<td>Developer</td>
-<td>Signed</td>
-</tr>
-
-<tr>
-<td>Yes</td>
-<td>No</td>
-<td>Any</td>
-<td>Unsigned</td>
-</tr>
-
-<tr>
-<td>Yes</td>
-<td>No</td>
-<td>Developer</td>
-<td>Signed</td>
-</tr>
-
-<tr>
-<td>Yes</td>
-<td>No</td>
-<td>Test account</td>
-<td>Signed</td>
-</tr>
-
-<tr>
-<td>Yes</td>
-<td>Yes</td>
-<td>Any</td>
-<td>Signed</td>
-</tr>
-
-</table>
+<p>In some cases, the reserved items may return signed static responses, which
+lets you test signature verification in your application. The reserved items
+only return signed responses if the user running the application has a <a
+href="{@docRoot}distribute/googleplay/start.html">developer</a> or <a
+href="{@docRoot}google/play/billing/billing_admin.html#billing-testing-setup">test
+account.</a>
<p>To make an In-app Billing request with a reserved product ID, you simply construct a normal
<code>REQUEST_PURCHASE</code> request, but instead of using a real product ID from your
@@ -310,9 +262,11 @@ purchases. Testing real in-app purchases enables you to test the end-to-end In-a
experience, including the actual purchases from Google Play and the actual checkout flow that
users will experience in your application.</p>
-<p class="note"><strong>Note</strong>: You do not need to publish your application to do end-to-end
-testing. You only need to upload your application as a draft application to perform end-to-end
-testing.</p>
+<p class="note"><strong>Note:</strong> You can do end-to-end testing of your app
+ by publishing it to an <a
+ href="{@docRoot}distribute/googleplay/developer-console.html#alpha-beta">alpha
+ distribution channel</a>. This allows you to publish the app to the Google
+ Play store, but limit its availability to just the testers you designate. </p>
<p>To test your In-app Billing implementation with actual in-app purchases, you will need to
register at least one test account on the Google Play Developer Console. You cannot use your
@@ -327,14 +281,16 @@ application does not need to be published, but the item does need to be publishe
<p>To test your In-app Billing implementation with actual purchases, follow these steps:</p>
<ol>
- <li><strong>Upload your application as a draft application to the Developer Console.</strong>
- <p>You do not need to publish your application to perform end-to-end testing with real product
- IDs; you only need to upload your application as a draft application. However, you must sign
- your application with your release key before you upload it as a draft application. Also, the
- version number of the uploaded application must match the version number of the application you
- load to your device for testing. To learn how to upload an application to Google Play, see
- <a href="http://support.google.com/googleplay/android-developer/bin/answer.py?hl=en&answer=113469">Uploading
- applications</a>.</p>
+ <li><strong>Upload your application to the <a
+ href="{@docRoot}distribute/googleplay/developer-console.html#alpha-beta">alpha
+ distribution channel</a> with the Developer Console.</strong>
+
+ <p class="note"><strong>Note:</strong> Previously you could test an app by
+ uploading an unpublished "draft" version. This functionality is no longer
+ supported; instead, you must publish it to the alpha or beta distribution
+ channel. For more information, see <a href="#draft_apps">Draft Apps are No
+ Longer Supported</a>.
+
</li>
<li><strong>Add items to the application's product list.</strong>
<p>Make sure that you publish the items (the application can remain unpublished). See <a
@@ -370,3 +326,24 @@ href="{@docRoot}tools/publishing/app-signing.html">signing</a>, and <a
href="{@docRoot}distribute/tools/launch-checklist.html">publishing on Google Play</a>.
</p>
+<h2 id="draft_apps">Draft Apps are No Longer Supported</h2>
+
+<p>Previously, you could publish a "draft" version of your app for testing. This
+functionality is no longer supported. Instead, there are two ways you can test
+how a pre-release app functions on the Google Play store:</p>
+
+<ul>
+
+ <li>You can publish an app to the <a
+ href="{@docRoot}distribute/googleplay/developer-console.html#alpha-beta">alpha
+ or beta distribution channels</a>. This makes the app available on the Google
+ Play store, but only to the testers you put on a "whitelist".</li>
+
+ <li>In a few cases, you can test Google Play functionality with an unpublished
+ app. For example, you can test an unpublished app's in-app billing support by
+ using <a
+ href="{@docRoot}google/play/billing/billing_testing.html#billing-testing-static">static
+ responses</a>, special reserved product IDs that always return a specific
+ result (like "purchased" or "refunded").</li>
+
+</ul>
diff --git a/docs/html/google/play/billing/v2/billing_integrate.jd b/docs/html/google/play/billing/v2/billing_integrate.jd
index ca41e0b..5eb17d5 100644
--- a/docs/html/google/play/billing/v2/billing_integrate.jd
+++ b/docs/html/google/play/billing/v2/billing_integrate.jd
@@ -208,6 +208,14 @@ following:</p>
a draft to the Google Play Developer Console. You also need to create a product list for the in-app
items that are available for purchase in the sample application. The following instructions show you
how to do this.</p>
+
+<p class="caution"><strong>Caution:</strong> Draft applications are no longer
+supported. To test an application, publish it in the <a
+href="{@docRoot}distribute/googleplay/developer-console.html#alpha-beta">alpha
+or beta channels</a>. For more information, see <a
+href="{@docRoot}google/play/billing/billing_testing.html#draft_apps">Draft Apps
+are No Longer Supported</a>.</p>
+
<ol>
<li><strong>Upload the release version of the sample application to Google Play.</strong>
<p>Do not publish the sample application; leave it as an unpublished draft application. The
@@ -928,10 +936,12 @@ public class BillingReceiver extends BroadcastReceiver {
// Intent actions that we receive in the BillingReceiver from Google Play.
// These are defined by Google Play and cannot be changed.
// The sample application defines these in the Consts.java file.
- public static final String ACTION_NOTIFY = "com.android.vending.billing.IN_APP_NOTIFY";
- public static final String ACTION_RESPONSE_CODE = "com.android.vending.billing.RESPONSE_CODE";
+ public static final String ACTION_NOTIFY =
+ "com.android.vending.billing.IN_APP_NOTIFY";
+ public static final String ACTION_RESPONSE_CODE =
+ "com.android.vending.billing.RESPONSE_CODE";
public static final String ACTION_PURCHASE_STATE_CHANGED =
- "com.android.vending.billing.PURCHASE_STATE_CHANGED";
+ "com.android.vending.billing.PURCHASE_STATE_CHANGED";
// The intent extras that are passed in an intent from Google Play.
// These are defined by Google Play and cannot be changed.
@@ -962,7 +972,8 @@ public class BillingReceiver extends BroadcastReceiver {
Log.w(TAG, "unexpected action: " + action);
}
}
- // Perform other processing here, such as forwarding intent messages to your local service.
+ // Perform other processing here, such as forwarding intent messages
+ // to your local service.
}
</pre>
diff --git a/docs/html/google/play/expansion-files.jd b/docs/html/google/play/expansion-files.jd
index e90f8fa..601ea48 100644
--- a/docs/html/google/play/expansion-files.jd
+++ b/docs/html/google/play/expansion-files.jd
@@ -527,17 +527,21 @@ are:</p>
&lt;!-- Required to download files from Google Play -->
&lt;uses-permission android:name="android.permission.INTERNET" />
- &lt;!-- Required to keep CPU alive while downloading files (NOT to keep screen awake) -->
+ &lt;!-- Required to keep CPU alive while downloading files
+ (NOT to keep screen awake) -->
&lt;uses-permission android:name="android.permission.WAKE_LOCK" />
- &lt;!-- Required to poll the state of the network connection and respond to changes -->
- &lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+ &lt;!-- Required to poll the state of the network connection
+ and respond to changes -->
+ &lt;uses-permission
+ android:name="android.permission.ACCESS_NETWORK_STATE" />
&lt;!-- Required to check whether Wi-Fi is enabled -->
&lt;uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
&lt;!-- Required to read and write the expansion files on shared storage -->
- &lt;uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ &lt;uses-permission
+ android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
...
&lt;/manifest>
</pre>
@@ -650,8 +654,8 @@ public class SampleAlarmReceiver extends BroadcastReceiver {
&#64;Override
public void onReceive(Context context, Intent intent) {
try {
- DownloaderClientMarshaller.startDownloadServiceIfRequired(context, intent,
- SampleDownloaderService.class);
+ DownloaderClientMarshaller.startDownloadServiceIfRequired(context,
+ intent, SampleDownloaderService.class);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
@@ -693,16 +697,19 @@ versionCode)}</li>
<p>For example, the sample app provided in the Apk Expansion package calls the
following method in the activity's {@link android.app.Activity#onCreate onCreate()} method to check
whether the expansion files already exist on the device:</p>
+
<pre>
boolean expansionFilesDelivered() {
for (XAPKFile xf : xAPKS) {
- String fileName = Helpers.getExpansionAPKFileName(this, xf.mIsBase, xf.mFileVersion);
+ String fileName = Helpers.getExpansionAPKFileName(this, xf.mIsBase,
+ xf.mFileVersion);
if (!Helpers.doesFileExist(this, fileName, xf.mFileSize, false))
return false;
}
return true;
}
</pre>
+
<p>In this case, each {@code XAPKFile} object holds the version number and file size of a known
expansion file and a boolean as to whether it's the main expansion file. (See the sample
application's {@code SampleDownloaderActivity} class for details.)</p>
@@ -740,6 +747,7 @@ the Downloader Library begins the download and you should update your activity U
display the download progress (see the next step). If the response <em>is</em> {@code
NO_DOWNLOAD_REQUIRED}, then the files are available and your application can start.</p>
<p>For example:</p>
+
<pre>
&#64;Override
public void onCreate(Bundle savedInstanceState) {
@@ -754,11 +762,14 @@ public void onCreate(Bundle savedInstanceState) {
notifierIntent, PendingIntent.FLAG_UPDATE_CURRENT);
// Start the download service (if required)
- int startResult = DownloaderClientMarshaller.startDownloadServiceIfRequired(this,
+ int startResult =
+ DownloaderClientMarshaller.startDownloadServiceIfRequired(this,
pendingIntent, SampleDownloaderService.class);
- // If download has started, initialize this activity to show download progress
+ // If download has started, initialize this activity to show
+ // download progress
if (startResult != DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED) {
- // This is where you do set up to display the download progress (next step)
+ // This is where you do set up to display the download
+ // progress (next step)
...
return;
} // If the download wasn't necessary, fall through to start the app
@@ -766,6 +777,7 @@ public void onCreate(Bundle savedInstanceState) {
startApp(); // Expansion files are available, start the app
}
</pre>
+
</li>
<li>When the {@code startDownloadServiceIfRequired()} method returns anything <em>other
than</em> {@code NO_DOWNLOAD_REQUIRED}, create an instance of {@code IStub} by
@@ -783,9 +795,11 @@ android.app.Activity#onCreate onCreate()} method, after {@code startDownloadServ
starts the download. </p>
<p>For example, in the previous code sample for {@link android.app.Activity#onCreate
onCreate()}, you can respond to the {@code startDownloadServiceIfRequired()} result like this:</p>
+
<pre>
// Start the download service (if required)
- int startResult = DownloaderClientMarshaller.startDownloadServiceIfRequired(this,
+ int startResult =
+ DownloaderClientMarshaller.startDownloadServiceIfRequired(this,
pendingIntent, SampleDownloaderService.class);
// If download has started, initialize activity to show progress
if (startResult != DownloaderClientMarshaller.NO_DOWNLOAD_REQUIRED) {
@@ -892,7 +906,8 @@ others. By default, this flag is <em>not</em> enabled, so the user must be on Wi
expansion files. You might want to provide a user preference to enable downloads over
the cellular network. In which case, you can call:
<pre>
-mRemoteService.setDownloadFlags(IDownloaderService.FLAGS_DOWNLOAD_OVER_CELLULAR);
+mRemoteService
+ .setDownloadFlags(IDownloaderService.FLAGS_DOWNLOAD_OVER_CELLULAR);
</pre>
</dd>
</dl>
@@ -975,10 +990,12 @@ to both your expansion files:</p>
// The shared path to all app expansion files
private final static String EXP_PATH = "/Android/obb/";
-static String[] getAPKExpansionFiles(Context ctx, int mainVersion, int patchVersion) {
+static String[] getAPKExpansionFiles(Context ctx, int mainVersion,
+ int patchVersion) {
String packageName = ctx.getPackageName();
Vector&lt;String> ret = new Vector&lt;String>();
- if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+ if (Environment.getExternalStorageState()
+ .equals(Environment.MEDIA_MOUNTED)) {
// Build the full path to the app's expansion files
File root = Environment.getExternalStorageDirectory();
File expPath = new File(root.toString() + EXP_PATH + packageName);
@@ -1102,7 +1119,8 @@ following:</p>
<pre>
// Get a ZipResourceFile representing a merger of both the main and patch files
-ZipResourceFile expansionFile = APKExpansionSupport.getAPKExpansionZipFile(appContext,
+ZipResourceFile expansionFile =
+ APKExpansionSupport.getAPKExpansionZipFile(appContext,
mainVersion, patchVersion);
// Get an input stream for a known file inside the expansion file ZIPs
@@ -1190,28 +1208,18 @@ android.content.Context#getExternalFilesDir getExternalFilesDir()}.</li>
opens, it's important that you test this process to be sure your application can successfully query
for the URLs, download the files, and save them to the device.</p>
-<p>To test your application's implementation of the manual download procedure, you must upload
-your application to Google Play as a "draft" to make your expansion files available for
-download:</p>
-
-<ol>
- <li>Upload your APK and corresponding expansion files using the Google Play Developer
-Console.</li>
- <li>Fill in the necessary application details (title, screenshots, etc.). You can come back and
-finalize these details before publishing your application.
- <p>Click the <strong>Save</strong> button. <em>Do not click Publish.</em> This saves
-the application as a draft, such that your application is not published for Google Play users,
-but the expansion files are available for you to test the download process.</p></li>
- <li>Install the application on your test device using the Eclipse tools or <a
-href="{@docRoot}tools/help/adb.html">{@code adb}</a>.</li>
- <li>Launch the app.</li>
-</ol>
-
-<p>If everything works as expected, your application should begin downloading the expansion
+<p>To test your application's implementation of the manual download procedure,
+you can publish it to the alpha or beta channel, so it will only be available to
+authorized testers.
+If everything works as expected, your application should begin downloading the expansion
files as soon as the main activity starts.</p>
-
-
+<p class="note"><strong>Note:</strong> Previously you could test an app by
+uploading an unpublished "draft" version. This functionality is no longer
+supported; instead, you must publish it to the alpha or beta distribution
+channel. For more information, see <a
+href="{@docRoot}google/play/billing/billing_testing.html#draft_apps">Draft Apps
+are No Longer Supported</a>.
<h2 id="Updating">Updating Your Application</h2>
diff --git a/docs/html/google/play/licensing/licensing-reference.jd b/docs/html/google/play/licensing/licensing-reference.jd
index 7bfa61a..d4ca79a 100644
--- a/docs/html/google/play/licensing/licensing-reference.jd
+++ b/docs/html/google/play/licensing/licensing-reference.jd
@@ -151,7 +151,8 @@ returned by the Google Play server in a license response.</p>
<tr>
<td>{@code LICENSED}</td>
<td>The application is licensed to the user. The user has purchased the
-application or the application only exists as a draft.</td>
+application, or is authorized to download and install the alpha or beta version
+of the application.</td>
<td>Yes</td>
<td><code>VT</code>,&nbsp;<code>GT</code>, <code>GR</code></td>
<td><em>Allow access according to {@code Policy} constraints.</em></td>
@@ -233,16 +234,14 @@ implementation.</p>
href="{@docRoot}google/play/licensing/setting-up.html#test-env">
Setting Up The Testing Environment</a>, the response code can be manually
overridden for the application developer and any registered test users via the
-Google Play Developer Console.
-<br/><br/>
-Additionally, as noted above, applications that are in draft mode (in other
-words, applications that have been uploaded but have <em>never</em> been
-published) will return {@code LICENSED} for all users, even if not listed as a test
-user. Since the application has never been offered for download, it is assumed
-that any users running it must have obtained it from an authorized channel for
-testing purposes.</p>
-
+Google Play Developer Console.</p>
+<p class="note"><strong>Note:</strong> Previously you could test an app by
+uploading an unpublished "draft" version. This functionality is no longer
+supported; instead, you must publish it to the alpha or beta distribution
+channel. For more information, see <a
+href="{@docRoot}google/play/billing/billing_testing.html#draft_apps">Draft Apps
+are No Longer Supported</a>.
<h2 id="extras">Server Response Extras</h2>
@@ -430,8 +429,8 @@ public boolean allowAccess() {
}
} else if (mLastResponse == LicenseResponse.RETRY &amp;&amp;
ts &lt; mLastResponseTime + MILLIS_PER_MINUTE) {
- // Only allow access if we are within the retry period or we haven't used up our
- // max retries.
+ // Only allow access if we are within the retry period
+ // or we haven't used up our max retries.
return (ts &lt;= mRetryUntil || mRetryCount &lt;= mMaxRetries);
}
return false;
diff --git a/docs/html/google/play/licensing/overview.jd b/docs/html/google/play/licensing/overview.jd
index 4e1a9c9..a2d5379 100644
--- a/docs/html/google/play/licensing/overview.jd
+++ b/docs/html/google/play/licensing/overview.jd
@@ -38,12 +38,11 @@ the licensing server and receives the result. The Google Play application sends
the result to your application, which can allow or disallow further use of the
application as needed.</p>
-<p class="note"><strong>Note:</strong> If a paid application has been uploaded
-to Google Play, but saved only as a draft application (the app is
-unpublished), the licensing server considers all users to be licensed users of
-the application (because it's not even possible to purchase the app). This
-exception is necessary in order for you to perform testing of your licensing
-implementation.</p>
+<p class="note"><strong>Note:</strong> If a version of an app is in the alpha or
+beta channel, all users who are authorized to download and install that app are
+considered to be licensed users of the app. For more information, see <a
+href="{@docRoot}distribute/googleplay/developer-console.html#alpha-beta">Alpha
+and Beta Testing</a>.</p>
<div class="figure" style="width:469px">
<img src="{@docRoot}images/licensing_arch.png" alt=""/>
@@ -52,6 +51,12 @@ license check through the License Verification Library and the Google Play
client, which handles communication with the Google Play server.</p>
</div>
+<p class="note"><strong>Note:</strong> Previously you could test an app by
+uploading an unpublished "draft" version. This functionality is no longer
+supported; instead, you must publish it to the alpha or beta distribution
+channel. For more information, see <a
+href="{@docRoot}google/play/billing/billing_testing.html#draft_apps">Draft Apps
+are No Longer Supported</a>.
<p>To properly identify the user and determine the license status, the licensing server requires
information about the application and user&mdash;your application and the Google Play client work
diff --git a/docs/html/guide/components/fundamentals.jd b/docs/html/guide/components/fundamentals.jd
index 9ac063e..fd1a7a8 100644
--- a/docs/html/guide/components/fundamentals.jd
+++ b/docs/html/guide/components/fundamentals.jd
@@ -335,8 +335,8 @@ documentation. </p>
{@link android.content.Intent} to start activities, services, and broadcast receivers. You can do so
by explicitly naming the target component (using the component class name) in the intent. However,
the real power of intents lies in the concept of <em>implicit intents</em>. An implicit intent
-simply describe the type of action to perform (and optionally, the data upon which you’d like to
-perform the action) and allow the system to find a component on the device that can perform the
+simply describes the type of action to perform (and, optionally, the data upon which you’d like to
+perform the action) and allows the system to find a component on the device that can perform the
action and start it. If there are multiple components that can perform the action described by the
intent, then the user selects which one to use.</p>
diff --git a/docs/html/guide/topics/ui/settings.jd b/docs/html/guide/topics/ui/settings.jd
index 1d36430..f454c4e 100644
--- a/docs/html/guide/topics/ui/settings.jd
+++ b/docs/html/guide/topics/ui/settings.jd
@@ -820,7 +820,8 @@ public class SettingsActivity extends PreferenceActivity
public static final String KEY_PREF_SYNC_CONN = "pref_syncConnectionType";
...
- public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
+ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
+ String key) {
if (key.equals(KEY_PREF_SYNC_CONN)) {
Preference connectionPref = findPreference(key);
// Set summary to be the user-description for the selected value
@@ -863,7 +864,40 @@ protected void onPause() {
}
</pre>
+<p class="caution"><strong>Caution:</strong> When you call {@link
+android.content.SharedPreferences#registerOnSharedPreferenceChangeListener
+registerOnSharedPreferenceChangeListener()}, the preference manager does not
+currently store a strong reference to the listener. You must store a strong
+reference to the listener, or it will be susceptible to garbage collection. We
+recommend you keep a reference to the listener in the instance data of an object
+that will exist as long as you need the listener.</p>
+
+<p>For example, in the following code, the caller does not keep a reference to
+the listener. As a result, the listener will be subject to garbage collection,
+and it will fail at some indeterminate time in the future:</p>
+
+<pre>
+prefs.registerOnSharedPreferenceChangeListener(
+ // Bad! The listener is subject to garbage collection!
+ new SharedPreferences.OnSharedPreferenceChangeListener() {
+ public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
+ // listener implementation
+ }
+});
+</pre>
+
+<p>Instead, store a reference to the listener in an instance data field of an
+object that will exist as long as the listener is needed:</p>
+<pre>
+SharedPreferences.OnSharedPreferenceChangeListener listener =
+ new SharedPreferences.OnSharedPreferenceChangeListener() {
+ public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
+ // listener implementation
+ }
+};
+prefs.registerOnSharedPreferenceChangeListener(listener);
+</pre>
<h2 id="NetworkUsage">Managing Network Usage</h2>
@@ -1142,13 +1176,15 @@ protected Parcelable onSaveInstanceState() {
final Parcelable superState = super.onSaveInstanceState();
// Check whether this Preference is persistent (continually saved)
if (isPersistent()) {
- // No need to save instance state since it's persistent, use superclass state
+ // No need to save instance state since it's persistent,
+ // use superclass state
return superState;
}
// Create instance of custom BaseSavedState
final SavedState myState = new SavedState(superState);
- // Set the state's value with the class member that holds current setting value
+ // Set the state's value with the class member that holds current
+ // setting value
myState.value = mNewValue;
return myState;
}
diff --git a/docs/html/images/brand/Google_Play_Store_600.png b/docs/html/images/brand/Google_Play_Store_600.png
new file mode 100644
index 0000000..f748652
--- /dev/null
+++ b/docs/html/images/brand/Google_Play_Store_600.png
Binary files differ
diff --git a/docs/html/images/training/volley-request.png b/docs/html/images/training/volley-request.png
new file mode 100644
index 0000000..85f0681
--- /dev/null
+++ b/docs/html/images/training/volley-request.png
Binary files differ
diff --git a/docs/html/sdk/installing/studio.jd b/docs/html/sdk/installing/studio.jd
index a2c32f0..1b47f7f 100644
--- a/docs/html/sdk/installing/studio.jd
+++ b/docs/html/sdk/installing/studio.jd
@@ -395,7 +395,9 @@ screen that offers several ways to get started:</p>
<p class="note"><strong>Note:</strong> If you previously developed your Android project
with Eclipse, you should first use the new export feature in the ADT plugin to prepare
your project with the new Gradle build system. For more information, read
- <a href="{@docRoot}sdk/installing/migrate.html">Migrating from Eclipse</a>.</p>
+ <a href="{@docRoot}sdk/installing/migrate.html">Migrating from Eclipse</a> and
+ <a href="{@docRoot}sdk/installing/studio-build.html">Building Your Project with
+ Gradle</a>.</p>
</li>
</ul>
diff --git a/docs/html/tools/device.jd b/docs/html/tools/device.jd
index e9caa44..e748b12 100644
--- a/docs/html/tools/device.jd
+++ b/docs/html/tools/device.jd
@@ -280,6 +280,10 @@ above.</p>
<td><code>0fce</code></td>
</tr>
<tr>
+ <td>Sony Mobile Communications</td>
+ <td><code>0fce</code></td>
+ </tr>
+ <tr>
<td>Teleepoch</td>
<td><code>2340</code></td>
</tr>
diff --git a/docs/html/tools/sdk/tools-notes.jd b/docs/html/tools/sdk/tools-notes.jd
index 9b06a9d..f490053 100644
--- a/docs/html/tools/sdk/tools-notes.jd
+++ b/docs/html/tools/sdk/tools-notes.jd
@@ -28,6 +28,39 @@ href="http://tools.android.com/knownissues">http://tools.android.com/knownissues
<div class="toggle-content opened">
<p><a href="#" onclick="return toggleContent(this)">
<img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img"
+ alt=""/>SDK Tools, Revision 22.6.4</a> <em>(June 2014)</em>
+ </p>
+
+ <div class="toggle-content-toggleme">
+
+ <dl>
+ <dt>Dependencies:</dt>
+
+ <dd>
+ <ul>
+ <li>Android SDK Platform-tools revision 18 or later.</li>
+ <li>If you are developing in Eclipse with ADT, note that this version of SDK Tools is
+ designed for use with ADT 22.6.3 and later. If you haven't already, update your
+ <a href="{@docRoot}tools/sdk/eclipse-adt.html">ADT Plugin</a> to 22.6.3.</li>
+ <li>If you are developing outside Eclipse, you must have
+ <a href="http://ant.apache.org/">Apache Ant</a> 1.8 or later.</li>
+ </ul>
+ </dd>
+
+ <dt>General Notes:</dt>
+ <dd>
+ <ul>
+ <li>Fixed an issue with the x86 emulator that caused Google Maps to crash.
+ (<a href="http://b.android.com/69385">Issue 69385</a>)</li>
+ <li>Fixed minor OpenGL issues.</li>
+ </ul>
+ </dd>
+ </div>
+</div>
+
+<div class="toggle-content closed">
+ <p><a href="#" onclick="return toggleContent(this)">
+ <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img"
alt=""/>SDK Tools, Revision 22.6.3</a> <em>(April 2014)</em>
</p>
diff --git a/docs/html/training/basics/network-ops/connecting.jd b/docs/html/training/basics/network-ops/connecting.jd
index 50a9e1b..1452ded 100644
--- a/docs/html/training/basics/network-ops/connecting.jd
+++ b/docs/html/training/basics/network-ops/connecting.jd
@@ -25,6 +25,7 @@ next.link=managing.html
<h2>You should also read</h2>
<ul>
+ <li><a href="{@docRoot}training/volley/index.html">Transmitting Network Data Using Volley</a></li>
<li><a href="{@docRoot}training/monitoring-device-state/index.html">Optimizing Battery Life</a></li>
<li><a href="{@docRoot}training/efficient-downloads/index.html">Transferring Data Without Draining the Battery</a></li>
<li><a href="{@docRoot}guide/webapps/index.html">Web Apps Overview</a></li>
diff --git a/docs/html/training/basics/network-ops/index.jd b/docs/html/training/basics/network-ops/index.jd
index 89ab539..1f6493f 100644
--- a/docs/html/training/basics/network-ops/index.jd
+++ b/docs/html/training/basics/network-ops/index.jd
@@ -24,6 +24,7 @@ next.link=connecting.html
<li><a href="{@docRoot}training/monitoring-device-state/index.html">Optimizing Battery Life</a></li>
<li><a href="{@docRoot}training/efficient-downloads/index.html">Transferring Data Without Draining the Battery</a></li>
<li><a href="{@docRoot}guide/webapps/index.html">Web Apps Overview</a></li>
+ <li><a href="{@docRoot}training/volley/index.html">Transmitting Network Data Using Volley</a></li>
</ul>
@@ -51,6 +52,14 @@ as a source of reusable code for your own application.</p>
fundamental building blocks for creating Android applications that download
content and parse data efficiently, while minimizing network traffic.</p>
+<p class="note"><strong>Note:</strong> See the class <a href="{@docRoot}
+training/volley/index.html">Transmitting Network Data Using Volley</a>
+for information on Volley, an HTTP library that makes networking for Android apps
+easier and faster. Volley is available through the open
+<a href="https://android.googlesource.com/platform/frameworks/volley">AOSP</a>
+repository. Volley may be able to help you streamline and improve the performance
+of your app's network operations.</p>
+
<h2>Lessons</h2>
diff --git a/docs/html/training/contacts-provider/retrieve-names.jd b/docs/html/training/contacts-provider/retrieve-names.jd
index b034a6a..7106889 100644
--- a/docs/html/training/contacts-provider/retrieve-names.jd
+++ b/docs/html/training/contacts-provider/retrieve-names.jd
@@ -102,9 +102,9 @@ trainingnavtop=true
<p>
To display the search results in a {@link android.widget.ListView}, you need a main layout file
that defines the entire UI including the {@link android.widget.ListView}, and an item layout
- file that defines one line of the {@link android.widget.ListView}. For example, you can define
- the main layout file <code>res/layout/contacts_list_view.xml</code> that contains the
- following XML:
+ file that defines one line of the {@link android.widget.ListView}. For example, you could create
+ the main layout file <code>res/layout/contacts_list_view.xml</code> with
+ the following XML:
</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
@@ -250,7 +250,8 @@ public class ContactsFragment extends Fragment implements
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the fragment layout
- return inflater.inflate(R.layout.contacts_list_layout, container, false);
+ return inflater.inflate(R.layout.contact_list_fragment,
+ container, false);
}
</pre>
<h3 id="DefineAdapter">Set up the CursorAdapter for the ListView</h3>
@@ -268,7 +269,8 @@ public class ContactsFragment extends Fragment implements
super.onActivityCreated(savedInstanceState);
...
// Gets the ListView from the View list of the parent activity
- mContactsList = (ListView) getActivity().findViewById(R.layout.contact_list_view);
+ mContactsList =
+ (ListView) getActivity().findViewById(R.layout.contact_list_view);
// Gets a CursorAdapter
mCursorAdapter = new SimpleCursorAdapter(
getActivity(),
diff --git a/docs/html/training/training_toc.cs b/docs/html/training/training_toc.cs
index 0616b62..c5dc3c5 100644
--- a/docs/html/training/training_toc.cs
+++ b/docs/html/training/training_toc.cs
@@ -609,6 +609,35 @@ include the action bar on devices running Android 2.1 or higher."
</li>
</ul>
</li>
+ <li class="nav-section">
+ <div class="nav-section-header">
+ <a href="<?cs var:toroot ?>training/volley/index.html"
+ description="How to perform fast, scalable UI operations over the network using Volley"
+ >Transmitting Network Data Using Volley</a>
+ </div>
+ <ul>
+ <li>
+ <a href="<?cs var:toroot ?>training/volley/simple.html">
+ Sending a Simple Request
+ </a>
+ </li>
+ <li>
+ <a href="<?cs var:toroot ?>training/volley/requestqueue.html">
+ Setting Up a RequestQueue
+ </a>
+ </li>
+ <li>
+ <a href="<?cs var:toroot ?>training/volley/request.html">
+ Making a Standard Request
+ </a>
+ </li>
+ <li>
+ <a href="<?cs var:toroot ?>training/volley/request-custom.html">
+ Implementing a Custom Request
+ </a>
+ </li>
+ </ul>
+ </li>
</ul>
</li>
diff --git a/docs/html/training/volley/index.jd b/docs/html/training/volley/index.jd
new file mode 100644
index 0000000..ba5b09f
--- /dev/null
+++ b/docs/html/training/volley/index.jd
@@ -0,0 +1,133 @@
+page.title=Transmitting Network Data Using Volley
+page.tags=""
+
+trainingnavtop=true
+startpage=true
+
+
+@jd:body
+
+
+
+<div id="tb-wrapper">
+<div id="tb">
+
+
+<!-- Required platform, tools, add-ons, devices, knowledge, etc. -->
+<h2>Dependencies and prerequisites</h2>
+
+<ul>
+ <li>Android 1.6 (API Level 4) or higher</li>
+</ul>
+
+<h2>You should also see</h2>
+<ul>
+ <li>For a production quality app that uses Volley, see the 2013 Google I/O
+ <a href="https://github.com/google/iosched">schedule app</a>. In particular, see:
+ <ul>
+ <li><a
+ href="https://github.com/google/iosched/blob/master/android/src/main/java/com/google/android/apps/iosched/util/ImageLoader.java">
+ ImageLoader</a></li>
+ <li><a
+ href="https://github.com/google/iosched/blob/master/android/src/main/java/com/google/android/apps/iosched/util/BitmapCache.java">
+ BitmapCache</a></li>
+ </ul>
+ </li>
+</ul>
+
+</div>
+</div>
+
+<a class="notice-developers-video wide" href="https://developers.google.com/events/io/sessions/325304728">
+<div>
+ <h3>Video</h3>
+ <p>Volley: Easy, Fast Networking for Android</p>
+</div>
+</a>
+
+
+<p>Volley is an HTTP library that makes networking for Android apps easier and most importantly,
+faster. Volley is available through the open
+<a href="https://android.googlesource.com/platform/frameworks/volley">AOSP</a> repository.</p>
+
+<p>Volley offers the following benefits:</p>
+
+<ul>
+
+<li>Automatic scheduling of network requests.</li>
+<li>Multiple concurrent network connections.</li>
+<li>Transparent disk and memory response caching with standard HTTP
+<a href=http://en.wikipedia.org/wiki/Cache_coherence">cache coherence</a>.</li>
+<li>Support for request prioritization.</li>
+<li>Cancellation request API. You can cancel a single request, or you can set blocks or
+scopes of requests to cancel.</li>
+<li>Ease of customization, for example, for retry and backoff.</li>
+<li>Strong ordering that makes it easy to correctly populate your UI with data fetched
+asynchronously from the network.</li>
+<li>Debugging and tracing tools.</li>
+
+</ul>
+
+<p>Volley excels at RPC-type operations used to populate a UI, such as fetching a page of
+search results as structured data. It integrates easily with any protocol and comes out of
+the box with support for raw strings, images, and JSON. By providing built-in support for
+the features you need, Volley frees you from writing boilerplate code and allows you to
+concentrate on the logic that is specific to your app.</p>
+<p>Volley is not suitable for large download or streaming operations, since Volley holds
+all responses in memory during parsing. For large download operations, consider using an
+alternative like {@link android.app.DownloadManager}.</p>
+
+<p>The core Volley library is developed in the open
+<a href="https://android.googlesource.com/platform/frameworks/volley">AOSP</a>
+repository at {@code frameworks/volley} and contains the main request dispatch pipeline
+as well as a set of commonly applicable utilities, available in the Volley "toolbox." The
+easiest way to add Volley to your project is to clone the Volley repository and set it as
+a library project:</p>
+
+<ol>
+<li>Git clone the repository by typing the following at the command line:
+
+<pre>
+git clone https://android.googlesource.com/platform/frameworks/volley
+</pre>
+</li>
+
+<li>Import the downloaded source into your app project as an Android library project
+(as described in <a href="{@docRoot}tools/projects/projects-eclipse.html">
+Managing Projects from Eclipse with ADT</a>, if you're using Eclipse) or make a
+<a href="{@docRoot}guide/faq/commontasks.html#addexternallibrary"><code>.jar</code> file</a>.</li>
+</ol>
+
+<h2>Lessons</h2>
+
+<dl>
+ <dt>
+ <strong><a href="simple.html">Sending a Simple Request</a></strong>
+ </dt>
+ <dd>
+ Learn how to send a simple request using the default behaviors of Volley, and how
+ to cancel a request.
+
+ </dd>
+ <dt>
+ <strong><a href="requestqueue.html">Setting Up a RequestQueue</a></strong>
+ </dt>
+ <dd>
+ Learn how to set up a {@code RequestQueue}, and how to implement a singleton
+ pattern to create a {@code RequestQueue} that lasts the lifetime of your app.
+ </dd>
+ <dt>
+ <strong><a href="request.html">Making a Standard Request</a></strong>
+ </dt>
+ <dd>
+ Learn how to send a request using one of Volley's out-of-the-box request types
+ (raw strings, images, and JSON).
+ </dd>
+ <dt>
+ <strong><a href="request-custom.html">Implementing a Custom Request</a></strong>
+ </dt>
+ <dd>
+ Learn how to implement a custom request.
+ </dd>
+
+</dl>
diff --git a/docs/html/training/volley/request-custom.jd b/docs/html/training/volley/request-custom.jd
new file mode 100644
index 0000000..7b669b9
--- /dev/null
+++ b/docs/html/training/volley/request-custom.jd
@@ -0,0 +1,163 @@
+page.title=Implementing a Custom Request
+
+trainingnavtop=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+
+<!-- table of contents -->
+<h2>This lesson teaches you to</h2>
+<ol>
+ <li><a href="#custom-request">Write a Custom Request</a></li>
+</ol>
+
+</div>
+</div>
+
+<a class="notice-developers-video wide" href="https://developers.google.com/events/io/sessions/325304728">
+<div>
+ <h3>Video</h3>
+ <p>Volley: Easy, Fast Networking for Android</p>
+</div>
+</a>
+
+<p>This lesson describes how to implement your own custom request types, for types that
+don't have out-of-the-box Volley support.</p>
+
+<h2 id="custom-request">Write a Custom Request</h2>
+
+Most requests have ready-to-use implementations in the toolbox; if your response is a string,
+image, or JSON, you probably won't need to implement a custom {@code Request}.</p>
+
+<p>For cases where you do need to implement a custom request, this is all you need
+to do:</p>
+
+<ul>
+
+<li>Extend the {@code Request&lt;T&gt;} class, where
+{@code &lt;T&gt;} represents the type of parsed response
+the request expects. So if your parsed response is a string, for example,
+create your custom request by extending {@code Request&lt;String&gt;}. See the Volley
+toolbox classes {@code StringRequest} and {@code ImageRequest} for examples of
+extending {@code Request&lt;T&gt;}.</li>
+
+<li>Implement the abstract methods {@code parseNetworkResponse()}
+and {@code deliverResponse()}, described in more detail below.</li>
+
+</ul>
+
+<h3>parseNetworkResponse</h3>
+
+<p>A {@code Response} encapsulates a parsed response for delivery, for a given type
+(such as string, image, or JSON). Here is a sample implementation of
+{@code parseNetworkResponse()}:</p>
+
+<pre>
+&#64;Override
+protected Response&lt;T&gt; parseNetworkResponse(
+ NetworkResponse response) {
+ try {
+ String json = new String(response.data,
+ HttpHeaderParser.parseCharset(response.headers));
+ return Response.success(gson.fromJson(json, clazz),
+ HttpHeaderParser.parseCacheHeaders(response));
+ }
+ // handle errors
+...
+}
+</pre>
+
+<p>Note the following:</p>
+
+<ul>
+<li>{@code parseNetworkResponse()} takes as its parameter a {@code NetworkResponse}, which
+contains the response payload as a byte[], HTTP status code, and response headers.</li>
+<li>Your implementation must return a {@code Response&lt;T&gt;}, which contains your typed
+response object and cache metadata or an error, such as in the case of a parse failure.</li>
+</ul>
+
+<p>If your protocol has non-standard cache semantics, you can build a {@code Cache.Entry}
+yourself, but most requests are fine with something like this:
+</p>
+<pre>return Response.success(myDecodedObject,
+ HttpHeaderParser.parseCacheHeaders(response));</pre>
+<p>
+Volley calls {@code parseNetworkResponse()} from a worker thread. This ensures that
+expensive parsing operations, such as decoding a JPEG into a Bitmap, don't block the UI
+thread.</p>
+
+<h3>deliverResponse</h3>
+
+<p>Volley calls you back on the main thread with the object you returned in
+{@code parseNetworkResponse()}. Most requests invoke a callback interface here,
+for example:
+</p>
+
+<pre>
+protected void deliverResponse(T response) {
+ listener.onResponse(response);
+</pre>
+
+<h3>Example: GsonRequest</h3>
+
+<p><a href="http://code.google.com/p/google-gson/">Gson</a> is a library for converting
+Java objects to and from JSON using reflection. You can define Java objects that have the
+same names as their corresponding JSON keys, pass Gson the class object, and Gson will fill
+in the fields for you. Here's a complete implementation of a Volley request that uses
+Gson for parsing:</p>
+
+<pre>
+public class GsonRequest&lt;T&gt; extends Request&lt;T&gt; {
+ private final Gson gson = new Gson();
+ private final Class&lt;T&gt; clazz;
+ private final Map&lt;String, String&gt; headers;
+ private final Listener&lt;T&gt; listener;
+
+ /**
+ * Make a GET request and return a parsed object from JSON.
+ *
+ * &#64;param url URL of the request to make
+ * &#64;param clazz Relevant class object, for Gson's reflection
+ * &#64;param headers Map of request headers
+ */
+ public GsonRequest(String url, Class&lt;T&gt; clazz, Map&lt;String, String&gt; headers,
+ Listener&lt;T&gt; listener, ErrorListener errorListener) {
+ super(Method.GET, url, errorListener);
+ this.clazz = clazz;
+ this.headers = headers;
+ this.listener = listener;
+ }
+
+ &#64;Override
+ public Map&lt;String, String&gt; getHeaders() throws AuthFailureError {
+ return headers != null ? headers : super.getHeaders();
+ }
+
+ &#64;Override
+ protected void deliverResponse(T response) {
+ listener.onResponse(response);
+ }
+
+ &#64;Override
+ protected Response&lt;T&gt; parseNetworkResponse(NetworkResponse response) {
+ try {
+ String json = new String(
+ response.data,
+ HttpHeaderParser.parseCharset(response.headers));
+ return Response.success(
+ gson.fromJson(json, clazz),
+ HttpHeaderParser.parseCacheHeaders(response));
+ } catch (UnsupportedEncodingException e) {
+ return Response.error(new ParseError(e));
+ } catch (JsonSyntaxException e) {
+ return Response.error(new ParseError(e));
+ }
+ }
+}
+</pre>
+
+<p>Volley provides ready-to-use {@code JsonArrayRequest} and {@code JsonArrayObject} classes
+if you prefer to take that approach. See <a href="request.html">
+Using Standard Request Types</a> for more information.</p>
diff --git a/docs/html/training/volley/request.jd b/docs/html/training/volley/request.jd
new file mode 100644
index 0000000..d8ccab2
--- /dev/null
+++ b/docs/html/training/volley/request.jd
@@ -0,0 +1,281 @@
+page.title=Making a Standard Request
+
+trainingnavtop=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+
+<!-- table of contents -->
+<h2>This lesson teaches you to</h2>
+<ol>
+ <li><a href="#request-image">Request an Image</a></li>
+ <li><a href="#request-json">Request JSON</a></li>
+</ol>
+
+</div>
+</div>
+
+<a class="notice-developers-video wide" href="https://developers.google.com/events/io/sessions/325304728">
+<div>
+ <h3>Video</h3>
+ <p>Volley: Easy, Fast Networking for Android</p>
+</div>
+</a>
+
+<p>
+This lesson describes how to use the common request types that Volley supports:</p>
+
+<ul>
+ <li>{@code StringRequest}. Specify a URL and receive a raw string in response. See
+ <a href="requestqueue.html">Setting Up a Request Queue</a> for an example.</li>
+ <li>{@code ImageRequest}. Specify a URL and receive an image in response.</li>
+ <li>{@code JsonObjectRequest} and {@code JsonArrayRequest} (both subclasses of
+ {@code JsonRequest}). Specify a URL and get a JSON object or array (respectively) in
+ response.</li>
+</ul>
+
+<p>If your expected response is one of these types, you probably won't have to implement a
+custom request. This lesson describes how to use these standard request types. For
+information on how to implement your own custom request, see <a href="requests-custom.html">
+Implementing a Custom Request</a>.</p>
+
+
+<h2 id="request-image">Request an Image</h2>
+
+<p>Volley offers the following classes for requesting images. These classes layer on top
+of each other to offer different levels of support for processing images:</p>
+
+<ul>
+ <li>{@code ImageRequest}&mdash;a canned request for getting an image at a given URL and
+ calling back with a decoded bitmap. It also provides convenience features like specifying
+ a size to resize to. Its main benefit is that Volley's thread scheduling ensures that
+ expensive image operations (decoding, resizing) automatically happen on a worker thread.</li>
+
+ <li>{@code ImageLoader}&mdash;a helper class that handles loading and caching images from
+ remote URLs. {@code ImageLoader} is a an orchestrator for large numbers of {@code ImageRequest}s,
+ for example when putting multiple thumbnails in a {@link android.widget.ListView}.
+ {@code ImageLoader} provides an in-memory cache to sit in front of the normal Volley
+ cache, which is important to prevent flickering. This makes it possible to achieve a
+ cache hit without blocking or deferring off the main thread, which is impossible when
+ using disk I/O. {@code ImageLoader} also does response coalescing, without which almost
+ every response handler would set a bitmap on a view and cause a layout pass per image.
+ Coalescing makes it possible to deliver multiple responses simultaneously, which improves
+ performance.</li>
+ <li>{@code NetworkImageView}&mdash;builds on {@code ImageLoader} and effectively replaces
+ {@link android.widget.ImageView} for situations where your image is being fetched over
+ the network via URL. {@code NetworkImageView} also manages canceling pending requests if
+ the view is detached from the hierarchy.</li>
+</ul>
+
+<h3>Use ImageRequest</h3>
+
+<p>Here is an example of using {@code ImageRequest}. It retrieves the image specified by
+the URL and displays it in the app. Note that this snippet interacts with the
+{@code RequestQueue} through a singleton class (see <a href="{@docRoot}
+training/volley/requestqueue.html#singleton">Setting Up a RequestQueue</a> for more discussion of
+this topic):</p>
+
+<pre>
+ImageView mImageView;
+String url = "http://i.imgur.com/7spzG.png";
+mImageView = (ImageView) findViewById(R.id.myImage);
+...
+
+// Retrieves an image specified by the URL, displays it in the UI.
+ImageRequest request = new ImageRequest(url,
+ new Response.Listener<Bitmap>() {
+ &#64;Override
+ public void onResponse(Bitmap bitmap) {
+ mImageView.setImageBitmap(bitmap);
+ }
+ }, 0, 0, null,
+ new Response.ErrorListener() {
+ public void onErrorResponse(VolleyError error) {
+ mImageView.setImageResource(R.drawable.image_load_error);
+ }
+ });
+// Access the RequestQueue through your singleton class.
+MySingleton.getInstance(this).addToRequestQueue(request);</pre>
+
+
+<h3>Use ImageLoader and NetworkImageView</h3>
+
+<p>You can use {@code ImageLoader} and {@code NetworkImageView} in concert to efficiently
+manage the display of multiple images, such as in a {@link android.widget.ListView}. In your
+layout XML file, you use {@code NetworkImageView} in much the same way you would use
+{@link android.widget.ImageView}, for example:</p>
+
+<pre>&lt;com.android.volley.toolbox.NetworkImageView
+ android:id=&quot;&#64;+id/networkImageView&quot;
+ android:layout_width=&quot;150dp&quot;
+ android:layout_height=&quot;170dp&quot;
+ android:layout_centerHorizontal=&quot;true&quot; /&gt;</pre>
+
+<p>You can use {@code ImageLoader} by itself to display an image, for example:</p>
+
+<pre>
+ImageLoader mImageLoader;
+ImageView mImageView;
+// The URL for the image that is being loaded.
+private static final String IMAGE_URL =
+ "http://developer.android.com/images/training/system-ui.png";
+...
+mImageView = (ImageView) findViewById(R.id.regularImageView);
+
+// Get the ImageLoader through your singleton class.
+mImageLoader = MySingleton.getInstance(this).getImageLoader();
+mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView,
+ R.drawable.def_image, R.drawable.err_image));
+</pre>
+
+<p>However, {@code NetworkImageView} can do this for you if all you're doing is populating
+an {@link android.widget.ImageView}. For example:</p>
+
+<pre>
+ImageLoader mImageLoader;
+NetworkImageView mNetworkImageView;
+private static final String IMAGE_URL =
+ "http://developer.android.com/images/training/system-ui.png";
+...
+
+// Get the NetworkImageView that will display the image.
+mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView);
+
+// Get the ImageLoader through your singleton class.
+mImageLoader = MySingleton.getInstance(this).getImageLoader();
+
+// Set the URL of the image that should be loaded into this view, and
+// specify the ImageLoader that will be used to make the request.
+mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);
+</pre>
+
+<p>The above snippets access the {@code RequestQueue} and the {@code ImageLoader}
+through a singleton class, as described in <a href="{@docRoot}training/volley/requestqueue.html#singleton">
+Setting Up a RequestQueue</a>. This approach ensures that your app creates single instances of
+these classes that last the lifetime of your app. The reason that this is important for
+{@code ImageLoader} (the helper class that handles loading and caching images) is that
+the main function of the in-memory cache is to allow for flickerless rotation. Using a
+singleton pattern allows the bitmap cache to outlive the activity. If instead you create the
+{@code ImageLoader} in an activity, the {@code ImageLoader} would be recreated along with
+the activity every time the user rotates the device. This would cause flickering.</p>
+
+<h4 id="lru-cache">Example LRU cache</h4>
+
+<p>The Volley toolbox provides a standard cache implementation via the
+{@code DiskBasedCache} class. This class caches files directly onto the hard disk in the
+specified directory. But to use {@code ImageLoader}, you should provide a custom
+in-memory LRU bitmap cache that implements the {@code ImageLoader.ImageCache} interface.
+You may want to set up your cache as a singleton; for more discussion of this topic, see
+<a href="{@docRoot}training/volley/requestqueue.html#singleton">
+Setting Up a RequestQueue</a>.</p>
+
+<p>Here is a sample implementation for an in-memory {@code LruBitmapCache} class.
+It extends the {@link android.support.v4.util.LruCache} class and implements the
+{@code ImageLoader.ImageCache} interface:</p>
+
+<pre>
+import android.graphics.Bitmap;
+import android.support.v4.util.LruCache;
+import android.util.DisplayMetrics;
+import com.android.volley.toolbox.ImageLoader.ImageCache;
+
+public class LruBitmapCache extends LruCache&lt;String, Bitmap&gt;
+ implements ImageCache {
+
+ public LruBitmapCache(int maxSize) {
+ super(maxSize);
+ }
+
+ public LruBitmapCache(Context ctx) {
+ this(getCacheSize(ctx));
+ }
+
+ &#64;Override
+ protected int sizeOf(String key, Bitmap value) {
+ return value.getRowBytes() * value.getHeight();
+ }
+
+ &#64;Override
+ public Bitmap getBitmap(String url) {
+ return get(url);
+ }
+
+ &#64;Override
+ public void putBitmap(String url, Bitmap bitmap) {
+ put(url, bitmap);
+ }
+
+ // Returns a cache size equal to approximately three screens worth of images.
+ public static int getCacheSize(Context ctx) {
+ final DisplayMetrics displayMetrics = ctx.getResources().
+ getDisplayMetrics();
+ final int screenWidth = displayMetrics.widthPixels;
+ final int screenHeight = displayMetrics.heightPixels;
+ // 4 bytes per pixel
+ final int screenBytes = screenWidth * screenHeight * 4;
+
+ return screenBytes * 3;
+ }
+}
+</pre>
+
+<p>Here is an example of how to instantiate an {@code ImageLoader} to use this
+cache:</p>
+
+<pre>
+RequestQueue mRequestQueue; // assume this exists.
+ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new LruBitmapCache(
+ LruBitmapCache.getCacheSize()));
+</pre>
+
+
+<h2 id="request-json">Request JSON</h2>
+
+<p>Volley provides the following classes for JSON requests:</p>
+
+<ul>
+ <li>{@code JsonArrayRequest}&mdash;A request for retrieving a
+ {@link org.json.JSONArray}
+ response body at a given URL.</li>
+ <li>{@code JsonObjectRequest}&mdash;A request for retrieving a
+ {@link org.json.JSONObject}
+ response body at a given URL, allowing for an optional
+ {@link org.json.JSONObject}
+ to be passed in as part of the request body.</li>
+</ul>
+
+<p>Both classes are based on the common base class {@code JsonRequest}. You use them
+following the same basic pattern you use for other types of requests. For example, this
+snippet fetches a JSON feed and displays it as text in the UI:</p>
+
+<pre>
+TextView mTxtDisplay;
+ImageView mImageView;
+mTxtDisplay = (TextView) findViewById(R.id.txtDisplay);
+String url = "http://my-json-feed";
+
+JsonObjectRequest jsObjRequest = new JsonObjectRequest
+ (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
+
+ &#64;Override
+ public void onResponse(JSONObject response) {
+ mTxtDisplay.setText("Response: " + response.toString());
+ }
+}, new Response.ErrorListener() {
+
+ &#64;Override
+ public void onErrorResponse(VolleyError error) {
+ // TODO Auto-generated method stub
+
+ }
+});
+
+// Access the RequestQueue through your singleton class.
+MySingleton.getInstance(this).addToRequestQueue(jsObjRequest);
+</pre>
+
+For an example of implementing a custom JSON request based on
+<a href="http://code.google.com/p/google-gson/">Gson</a>, see the next lesson,
+<a href="request-custom.html">Implementing a Custom Request</a>.
diff --git a/docs/html/training/volley/requestqueue.jd b/docs/html/training/volley/requestqueue.jd
new file mode 100644
index 0000000..6858d91
--- /dev/null
+++ b/docs/html/training/volley/requestqueue.jd
@@ -0,0 +1,204 @@
+page.title=Setting Up a RequestQueue
+
+trainingnavtop=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+
+<!-- table of contents -->
+<h2>This lesson teaches you to</h2>
+<ol>
+ <li><a href="#network">Set Up a Network and Cache</a></li>
+ <li><a href="#singleton">Use a Singleton Pattern</a></li>
+</ol>
+
+</div>
+</div>
+
+<a class="notice-developers-video wide" href="https://developers.google.com/events/io/sessions/325304728">
+<div>
+ <h3>Video</h3>
+ <p>Volley: Easy, Fast Networking for Android</p>
+</div>
+</a>
+
+
+<p>The previous lesson showed you how to use the convenience method
+<code>Volley.newRequestQueue</code> to set up a {@code RequestQueue}, taking advantage of
+Volley's default behaviors. This lesson walks you through the explicit steps of creating a
+{@code RequestQueue}, to allow you to supply your own custom behavior.</p>
+
+<p>This lesson also describes the recommended practice of creating a {@code RequestQueue}
+as a singleton, which makes the {@code RequestQueue} last the lifetime of your app.</p>
+
+<h2 id="network">Set Up a Network and Cache</h2>
+
+<p>A {@code RequestQueue} needs two things to do its job: a network to perform transport
+of the requests, and a cache to handle caching. There are standard implementations of these
+available in the Volley toolbox: {@code DiskBasedCache} provides a one-file-per-response
+cache with an in-memory index, and {@code BasicNetwork} provides a network transport based
+on your choice of {@link android.net.http.AndroidHttpClient} or {@link java.net.HttpURLConnection}.</p>
+
+<p>{@code BasicNetwork} is Volley's default network implementation. A {@code BasicNetwork}
+must be initialized with the HTTP client your app is using to connect to the network.
+Typically this is {@link android.net.http.AndroidHttpClient} or
+{@link java.net.HttpURLConnection}:</p>
+<ul>
+<li>Use {@link android.net.http.AndroidHttpClient} for apps targeting Android API levels
+lower than API Level 9 (Gingerbread). Prior to Gingerbread, {@link java.net.HttpURLConnection}
+was unreliable. For more discussion of this topic, see
+<a href="http://android-developers.blogspot.com/2011/09/androids-http-clients.html">
+Android's HTTP Clients</a>. </li>
+
+<li>Use {@link java.net.HttpURLConnection} for apps targeting Android API Level 9
+(Gingerbread) and higher.</li>
+</ul>
+<p>To create an app that runs on all versions of Android, you can check the version of
+Android the device is running and choose the appropriate HTTP client, for example:</p>
+
+<pre>
+HttpStack stack;
+...
+// If the device is running a version >= Gingerbread...
+if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
+ // ...use HttpURLConnection for stack.
+} else {
+ // ...use AndroidHttpClient for stack.
+}
+Network network = new BasicNetwork(stack);
+</pre>
+
+<p>This snippet shows you the steps involved in setting up a
+{@code RequestQueue}:</p>
+
+<pre>
+RequestQueue mRequestQueue;
+
+// Instantiate the cache
+Cache cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap
+
+// Set up the network to use HttpURLConnection as the HTTP client.
+Network network = new BasicNetwork(new HurlStack());
+
+// Instantiate the RequestQueue with the cache and network.
+mRequestQueue = new RequestQueue(cache, network);
+
+// Start the queue
+mRequestQueue.start();
+
+String url ="http://www.myurl.com";
+
+// Formulate the request and handle the response.
+StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
+ new Response.Listener&lt;String&gt;() {
+ &#64;Override
+ public void onResponse(String response) {
+ // Do something with the response
+ }
+},
+ new Response.ErrorListener() {
+ &#64;Override
+ public void onErrorResponse(VolleyError error) {
+ // Handle error
+ }
+});
+
+// Add the request to the RequestQueue.
+mRequestQueue.add(stringRequest);
+...
+</pre>
+
+<p>If you just need to make a one-time request and don't want to leave the thread pool
+around, you can create the {@code RequestQueue} wherever you need it and call {@code stop()} on the
+{@code RequestQueue} once your response or error has come back, using the
+{@code Volley.newRequestQueue()} method described in <a href="simple.html">Sending a Simple
+Request</a>. But the more common use case is to create the {@code RequestQueue} as a
+singleton to keep it running for the lifetime of your app, as described in the next section.</p>
+
+
+<h2 id="singleton">Use a Singleton Pattern</h2>
+
+<p>If your application makes constant use of the network, it's probably most efficient to
+set up a single instance of {@code RequestQueue} that will last the lifetime of your app.
+You can achieve this in various ways. The recommended approach is to implement a singleton
+class that encapsulates {@code RequestQueue} and other Volley
+functionality. Another approach is to subclass {@link android.app.Application} and set up the
+{@code RequestQueue} in {@link android.app.Application#onCreate Application.onCreate()}.
+But this approach is <a href="{@docRoot}reference/android/app/Application.html">
+discouraged</a>; a static singleton can provide the same functionality in a more modular
+way. </p>
+
+<p>A key concept is that the {@code RequestQueue} must be instantiated with the
+{@link android.app.Application} context, not an {@link android.app.Activity} context. This
+ensures that the {@code RequestQueue} will last for the lifetime of your app, instead of
+being recreated every time the activity is recreated (for example, when the user
+rotates the device).
+
+<p>Here is an example of a singleton class that provides {@code RequestQueue} and
+{@code ImageLoader} functionality:</p>
+
+<pre>private static MySingleton mInstance;
+ private RequestQueue mRequestQueue;
+ private ImageLoader mImageLoader;
+ private static Context mCtx;
+
+ private MySingleton(Context context) {
+ mCtx = context;
+ mRequestQueue = getRequestQueue();
+
+ mImageLoader = new ImageLoader(mRequestQueue,
+ new ImageLoader.ImageCache() {
+ private final LruCache&lt;String, Bitmap&gt;
+ cache = new LruCache&lt;String, Bitmap&gt;(20);
+
+ &#64;Override
+ public Bitmap getBitmap(String url) {
+ return cache.get(url);
+ }
+
+ &#64;Override
+ public void putBitmap(String url, Bitmap bitmap) {
+ cache.put(url, bitmap);
+ }
+ });
+ }
+
+ public static synchronized MySingleton getInstance(Context context) {
+ if (mInstance == null) {
+ mInstance = new MySingleton(context);
+ }
+ return mInstance;
+ }
+
+ public RequestQueue getRequestQueue() {
+ if (mRequestQueue == null) {
+ // getApplicationContext() is key, it keeps you from leaking the
+ // Activity or BroadcastReceiver if someone passes one in.
+ mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
+ }
+ return mRequestQueue;
+ }
+
+ public &lt;T&gt; void addToRequestQueue(Request&lt;T&gt; req) {
+ getRequestQueue().add(req);
+ }
+
+ public ImageLoader getImageLoader() {
+ return mImageLoader;
+ }
+}</pre>
+
+<p>Here are some examples of performing {@code RequestQueue} operations using the singleton
+class:</p>
+
+<pre>
+// Get a RequestQueue
+RequestQueue queue = MySingleton.getInstance(this.getApplicationContext()).
+ getRequestQueue();
+...
+
+// Add a request (in this example, called stringRequest) to your RequestQueue.
+MySingleton.getInstance(this).addToRequestQueue(stringRequest);
+</pre>
diff --git a/docs/html/training/volley/simple.jd b/docs/html/training/volley/simple.jd
new file mode 100644
index 0000000..942c57f
--- /dev/null
+++ b/docs/html/training/volley/simple.jd
@@ -0,0 +1,169 @@
+page.title=Sending a Simple Request
+
+trainingnavtop=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+
+<!-- table of contents -->
+<h2>This lesson teaches you to</h2>
+<ol>
+ <li><a href="#manifest">Add the INTERNET Permission</a></li>
+ <li><a href="#simple">Use newRequestQueue</a></li>
+ <li><a href="#send">Send a Request</a></li>
+ <li><a href="#cancel">Cancel a Request</a></li>
+</ol>
+
+</div>
+</div>
+
+<a class="notice-developers-video wide" href="https://developers.google.com/events/io/sessions/325304728">
+<div>
+ <h3>Video</h3>
+ <p>Volley: Easy, Fast Networking for Android</p>
+</div>
+</a>
+
+<p>At a high level, you use Volley by creating a {@code RequestQueue} and passing it
+{@code Request} objects. The {@code RequestQueue} manages worker threads for running the
+network operations, reading from and writing to the cache, and parsing responses. Requests
+do the parsing of raw responses and Volley takes care of dispatching the parsed response
+back to the main thread for delivery.</p>
+
+<p> This lesson describes how to send a request using the <code>Volley.newRequestQueue</code>
+convenience method, which sets up a {@code RequestQueue} for you.
+See the next lesson,
+<a href="requestqueue.html">Setting Up a RequestQueue</a>, for information on how to set
+up a {@code RequestQueue} yourself.</p>
+
+<p>This lesson also describes how to add a request to a {@code RequestQueue} and cancel a
+request.</p>
+
+<h2 id="manifest">Add the INTERNET Permission</h2>
+
+<p>To use Volley, you must add the
+{@link android.Manifest.permission#INTERNET android.permission.INTERNET} permission
+to your app's manifest. Without this, your app won't be able to connect to the network.</p>
+
+
+<h2 id="simple">Use newRequestQueue</h2>
+
+<p>Volley provides a convenience method <code>Volley.newRequestQueue</code> that sets up a
+{@code RequestQueue} for you, using default values, and starts the queue. For example:</p>
+
+<pre>
+final TextView mTextView = (TextView) findViewById(R.id.text);
+...
+
+// Instantiate the RequestQueue.
+RequestQueue queue = Volley.newRequestQueue(this);
+String url ="http://www.google.com";
+
+// Request a string response from the provided URL.
+StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
+ new Response.Listener<String>() {
+ &#64;Override
+ public void onResponse(String response) {
+ // Display the first 500 characters of the response string.
+ mTextView.setText("Response is: "+ response.substring(0,500));
+ }
+}, new Response.ErrorListener() {
+ &#64;Override
+ public void onErrorResponse(VolleyError error) {
+ mTextView.setText("That didn't work!");
+ }
+});
+// Add the request to the RequestQueue.
+queue.add(stringRequest);
+</pre>
+
+<p>Volley always delivers parsed responses on the main thread. Running on the main thread
+is convenient for populating UI controls with received data, as you can freely modify UI
+controls directly from your response handler, but it's especially critical to many of the
+important semantics provided by the library, particularly related to canceling requests.
+</p>
+
+<p>See <a href="requestqueue.html">Setting Up a RequestQueue</a> for a
+description of how to set up a {@code RequestQueue} yourself, instead of using the
+<code>Volley.newRequestQueue</code> convenience method.</p>
+
+<h2 id="send">Send a Request</h2>
+
+<p>To send a request, you simply construct one and add it to the {@code RequestQueue} with
+{@code add()}, as shown above. Once you add the request it moves through the pipeline,
+gets serviced, and has its raw response parsed and delivered.</p>
+
+<p>When you call {@code add()}, Volley runs one cache processing thread and a pool of
+network dispatch threads. When you add a request to the queue, it is picked up by the cache
+thread and triaged: if the request can be serviced from cache, the cached response is
+parsed on the cache thread and the parsed response is delivered on the main thread. If the
+request cannot be serviced from cache, it is placed on the network queue. The first
+available network thread takes the request from the queue, performs the HTTP transaction,
+parsse the response on the worker thread, writes the response to cache, and posts the parsed
+response back to the main thread for delivery.</p>
+
+<p>Note that expensive operations like blocking I/O and parsing/decoding are done on worker
+threads. You can add a request from any thread, but responses are always delivered on the
+main thread.</p>
+
+<p>Figure 1 illustrates the life of a request:</p>
+
+ <img src="{@docRoot}images/training/volley-request.png"
+ alt="system bars">
+<p class="img-caption"><strong>Figure 1.</strong> Life of a request.</p>
+
+
+<h2 id="cancel">Cancel a Request</h2>
+
+<p>To cancel a request, call {@code cancel()} on your {@code Request} object. Once cancelled,
+Volley guarantees that your response handler will never be called. What this means in
+practice is that you can cancel all of your pending requests in your activity's
+{@link android.app.Activity#onStop onStop()} method and you don't have to litter your
+response handlers with checks for {@code getActivity() == null},
+whether {@code onSaveInstanceState()} has been called already, or other defensive
+boilerplate.</p>
+
+<p>To take advantage of this behavior, you would typically have to
+track all in-flight requests in order to be able to cancel them at the
+appropriate time. There is an easier way: you can associate a tag object with each
+request. You can then use this tag to provide a scope of requests to cancel. For
+example, you can tag all of your requests with the {@link android.app.Activity} they
+are being made on behalf of, and call {@code requestQueue.cancelAll(this)} from
+{@link android.app.Activity#onStop onStop()}.
+Similarly, you could tag all thumbnail image requests in a
+{@link android.support.v4.view.ViewPager} tab with their respective tabs and cancel on swipe
+to make sure that the new tab isn't being held up by requests from another one.</p>
+
+<p>Here is an example that uses a string value for the tag:</p>
+
+<ol>
+<li>Define your tag and add it to your requests.
+<pre>
+public static final String TAG = "MyTag";
+StringRequest stringRequest; // Assume this exists.
+RequestQueue mRequestQueue; // Assume this exists.
+
+// Set the tag on the request.
+stringRequest.setTag(TAG);
+
+// Add the request to the RequestQueue.
+mRequestQueue.add(stringRequest);</pre>
+</li>
+
+<li>In your activity's {@link android.app.Activity#onStop onStop()} method, cancel all requests that have this tag.
+<pre>
+&#64;Override
+protected void onStop () {
+ super.onStop();
+ if (mRequestQueue != null) {
+ mRequestQueue.cancelAll(TAG);
+ }
+}
+</pre></li></ol>
+
+<p>Take care when canceling requests. If you are depending on your response handler to
+advance a state or kick off another process, you need to account for this. Again, the
+response handler will not be called.
+</p>