summaryrefslogtreecommitdiffstats
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/downloads/design/Android_Navigation_Drawer_Icon_20130516.zipbin0 -> 21548 bytes
-rw-r--r--docs/downloads/training/NavigationDrawer.zipbin0 -> 920196 bytes
-rw-r--r--docs/html/_redirects.yaml21
-rw-r--r--docs/html/design/building-blocks/buttons.jd13
-rw-r--r--docs/html/design/building-blocks/dialogs.jd27
-rw-r--r--docs/html/design/building-blocks/grid-lists.jd7
-rw-r--r--docs/html/design/building-blocks/lists.jd7
-rw-r--r--docs/html/design/building-blocks/pickers.jd13
-rw-r--r--docs/html/design/building-blocks/spinners.jd13
-rw-r--r--docs/html/design/building-blocks/switches.jd36
-rw-r--r--docs/html/design/building-blocks/tabs.jd13
-rw-r--r--docs/html/design/building-blocks/text-fields.jd14
-rw-r--r--docs/html/design/design_toc.cs1
-rw-r--r--docs/html/design/media/actionbar_drawer.pngbin49964 -> 0 bytes
-rw-r--r--docs/html/design/media/app_structure_default_tabs.png (renamed from docs/html/design/media/action_bar_pattern_default_tabs.png)bin5097 -> 5097 bytes
-rw-r--r--docs/html/design/media/app_structure_drawer.pngbin0 -> 103657 bytes
-rw-r--r--docs/html/design/media/app_structure_spinner.png (renamed from docs/html/design/media/action_bar_pattern_spinner.png)bin22443 -> 22443 bytes
-rw-r--r--[-rwxr-xr-x]docs/html/design/media/navigation_between_apps_back.pngbin92319 -> 92319 bytes
-rw-r--r--[-rwxr-xr-x]docs/html/design/media/navigation_between_apps_inward.pngbin90976 -> 90976 bytes
-rw-r--r--[-rwxr-xr-x]docs/html/design/media/navigation_between_apps_up.pngbin101487 -> 101487 bytes
-rw-r--r--[-rwxr-xr-x]docs/html/design/media/navigation_between_siblings_market1.pngbin27752 -> 27752 bytes
-rw-r--r--[-rwxr-xr-x]docs/html/design/media/navigation_between_siblings_market2.pngbin36652 -> 36652 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_CAB.pngbin0 -> 60382 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_collapse.pngbin0 -> 25219 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_cross_nav.pngbin0 -> 56565 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_first_run.pngbin0 -> 221640 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_holo_dark_light.pngbin0 -> 30676 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_indicator_big.pngbin0 -> 8238 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_layout.pngbin0 -> 39233 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_nav_and_actions.pngbin0 -> 12899 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_navigation_hubs.pngbin0 -> 58150 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_open_from_lower.pngbin0 -> 105745 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_open_overflow.pngbin0 -> 121859 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_overview.pngbin0 -> 109941 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_peek.pngbin0 -> 165288 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_quick_to_top.pngbin0 -> 51900 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_reset_backstack.pngbin0 -> 61073 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_settings_help.pngbin0 -> 14060 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_titles_icons.pngbin0 -> 14552 bytes
-rw-r--r--docs/html/design/media/navigation_drawer_top_out.pngbin0 -> 136043 bytes
-rw-r--r--docs/html/design/patterns/accessibility.jd14
-rw-r--r--docs/html/design/patterns/actionbar.jd167
-rw-r--r--docs/html/design/patterns/app-structure.jd121
-rw-r--r--docs/html/design/patterns/compatibility.jd7
-rw-r--r--docs/html/design/patterns/multi-pane-layouts.jd17
-rw-r--r--docs/html/design/patterns/navigation-drawer.jd338
-rw-r--r--docs/html/design/patterns/navigation.jd19
-rw-r--r--docs/html/design/patterns/notifications.jd16
-rw-r--r--docs/html/design/patterns/selection.jd7
-rw-r--r--docs/html/design/patterns/settings.jd14
-rw-r--r--docs/html/design/patterns/swipe-views.jd16
-rw-r--r--docs/html/design/patterns/widgets.jd14
-rw-r--r--docs/html/develop/index.jd73
-rw-r--r--docs/html/distribute/googleplay/quality/tablet.jd14
-rw-r--r--docs/html/google/backup/signup.jd1
-rw-r--r--docs/html/google/backup/terms.jd1
-rw-r--r--docs/html/google/gcm/index.jd13
-rw-r--r--docs/html/google/play-services/location.jd4
-rw-r--r--docs/html/guide/appendix/media-formats.jd1
-rw-r--r--docs/html/guide/topics/location/strategies.jd2
-rw-r--r--docs/html/guide/topics/media/camera.jd2
-rw-r--r--docs/html/images/home/io-gdl-2013.pngbin31617 -> 90322 bytes
-rw-r--r--docs/html/index.jd13
-rw-r--r--docs/html/sdk/exploring.jd1
-rw-r--r--docs/html/sdk/installing/installing-adt.jd8
-rw-r--r--docs/html/sdk/installing/migrate.jd4
-rw-r--r--docs/html/sdk/installing/studio.jd62
-rw-r--r--docs/html/tools/adk/adk.jd1
-rw-r--r--docs/html/tools/adk/adk2.jd1
-rw-r--r--docs/html/tools/adk/index.jd1
-rw-r--r--docs/html/tools/extras/support-library.jd39
-rw-r--r--docs/html/tools/help/adb.jd107
-rw-r--r--docs/html/tools/help/adt.jd1
-rw-r--r--docs/html/tools/publishing/app-signing.jd4
-rw-r--r--docs/html/tools/samples/index.jd2
-rw-r--r--docs/html/tools/sdk/installing.jd1
-rw-r--r--docs/html/tools/workflow/app-signing.jd618
-rw-r--r--docs/html/tools/workflow/publishing/app-signing.jd618
-rw-r--r--docs/html/tools/workflow/publishing/preparing.jd358
-rw-r--r--docs/html/tools/workflow/publishing/publishing.jd703
-rwxr-xr-xdocs/html/tools/workflow/publishing/publishing_overview.jd231
-rw-r--r--docs/html/tools/workflow/publishing/versioning.jd174
-rwxr-xr-xdocs/html/tools/workflow/publishing_overview.jd231
-rw-r--r--docs/html/tools/workflow/versioning.jd174
-rw-r--r--docs/html/training/camera/index.jd8
-rw-r--r--docs/html/training/implementing-navigation/ancestral.jd199
-rw-r--r--docs/html/training/implementing-navigation/index.jd43
-rw-r--r--docs/html/training/implementing-navigation/lateral.jd271
-rw-r--r--docs/html/training/implementing-navigation/nav-drawer.jd382
-rw-r--r--docs/html/training/implementing-navigation/temporal.jd215
-rw-r--r--docs/html/training/training_toc.cs13
91 files changed, 1774 insertions, 3735 deletions
diff --git a/docs/downloads/design/Android_Navigation_Drawer_Icon_20130516.zip b/docs/downloads/design/Android_Navigation_Drawer_Icon_20130516.zip
new file mode 100644
index 0000000..852df7d
--- /dev/null
+++ b/docs/downloads/design/Android_Navigation_Drawer_Icon_20130516.zip
Binary files differ
diff --git a/docs/downloads/training/NavigationDrawer.zip b/docs/downloads/training/NavigationDrawer.zip
new file mode 100644
index 0000000..3375a5c
--- /dev/null
+++ b/docs/downloads/training/NavigationDrawer.zip
Binary files differ
diff --git a/docs/html/_redirects.yaml b/docs/html/_redirects.yaml
index c70084c..a147350 100644
--- a/docs/html/_redirects.yaml
+++ b/docs/html/_redirects.yaml
@@ -107,6 +107,21 @@ redirects:
- from: /guide/topics/connectivity/usb/adk.html
to: /tools/adk/index.html
+- from: /tools/workflow/publishing/versioning.html
+ to: /tools/publishing/versioning.html
+
+- from: /tools/workflow/publishing/publishing.html
+ to: /tools/publishing/publishing_overview.html
+
+- from: /tools/workflow/publishing_overview.html
+ to: /tools/publishing/publishing_overview.html
+
+- from: /tools/workflow/publishing/publishing_overview.html
+ to: /tools/publishing/publishing_overview.html
+
+- from: /tools/workflow/app-signing.html
+ to: /tools/publishing/app-signing.html
+
- from: /tools/adk/aoa.html
to: http://source.android.com/tech/accessories/aoap/aoa.html
@@ -340,8 +355,8 @@ redirects:
- from: /deviceart
to: http://developer.android.com/distribute/promote/device-art.html
-- from: /edu
- to: /distribute/googleplay/edu/index.html
-
- from: /edu/signup
to: https://services.google.com/fb/forms/playedu
+
+- from: /edu
+ to: /distribute/googleplay/edu/index.html
diff --git a/docs/html/design/building-blocks/buttons.jd b/docs/html/design/building-blocks/buttons.jd
index 600ec6c..7957ef8 100644
--- a/docs/html/design/building-blocks/buttons.jd
+++ b/docs/html/design/building-blocks/buttons.jd
@@ -2,6 +2,13 @@ page.title=Buttons
page.tags="button","input"
@jd:body
+<a class="notice-developers" href="{@docRoot}guide/topics/ui/controls/button.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Buttons</p>
+ </div>
+</a>
+
<p>A button consists of text and/or an image that clearly communicates what action will occur when the
user touches it. Android supports two different types of buttons: <em>basic buttons</em> and <em>borderless
buttons</em>. Both can contain text labels and/or images.</p>
@@ -38,9 +45,3 @@ than basic buttons and integrate nicely with other content.</p>
<img src="{@docRoot}design/media/buttons_borderless.png">
-
-<div class="note develop">
-<p><strong>Developer Guide</strong></p>
- <p>For information about how to build and customize buttons in your app,
- see the <a href="{@docRoot}guide/topics/ui/controls/button.html">Buttons</a> API guide.</p>
-</div>
diff --git a/docs/html/design/building-blocks/dialogs.jd b/docs/html/design/building-blocks/dialogs.jd
index 2f6ca27..f4bb87e 100644
--- a/docs/html/design/building-blocks/dialogs.jd
+++ b/docs/html/design/building-blocks/dialogs.jd
@@ -2,6 +2,13 @@ page.title=Dialogs
page.tags="dialog","alert","popup","toast"
@jd:body
+<a class="notice-developers" href="{@docRoot}guide/topics/ui/dialogs.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Dialogs</p>
+ </div>
+</a>
+
<p>Dialogs prompt the user for decisions or additional information required by the app to continue a
task. Such requests can range from simple Cancel/OK decisions to more complex layouts asking the
user to adjust settings or enter text.</p>
@@ -123,11 +130,6 @@ available based on the title and the text of the action buttons.</p>
</div>
</div>
-<div class="note develop">
-<p><strong>Developer Guide</strong></p>
- <p>For information about how to build dialogs in your app,
- see the <a href="{@docRoot}guide/topics/ui/dialogs.html">Dialogs</a> API guide.</p>
-</div>
<h2 id="popups">Popups</h2>
@@ -144,12 +146,19 @@ advances the workflow, and simply touching outside the popup dismisses it.</p>
<div class="layout-content-row">
<div class="layout-content-col span-6">
- <div class="vspace size-6"></div>
+ <div class="vspace size-3"></div>
<p>Toasts provide lightweight feedback about an operation in a small popup. For example, navigating
away from an email before you send it triggers a "Draft saved" toast to let you know that you can
continue editing later. Toasts automatically disappear after a timeout.</p>
+<a class="notice-developers left" href="{@docRoot}guide/topics/ui/notifiers/toasts.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Toasts</p>
+ </div>
+</a>
+
</div>
<div class="layout-content-col span-7">
@@ -158,9 +167,3 @@ continue editing later. Toasts automatically disappear after a timeout.</p>
</div>
</div>
-
-<div class="note develop">
-<p><strong>Developer Guide</strong></p>
- <p>For information about how to create toasts,
- see the <a href="{@docRoot}guide/topics/ui/notifiers/toasts.html">Toasts</a> API guide.</p>
-</div>
diff --git a/docs/html/design/building-blocks/grid-lists.jd b/docs/html/design/building-blocks/grid-lists.jd
index 8c82ba9..1a09ef5 100644
--- a/docs/html/design/building-blocks/grid-lists.jd
+++ b/docs/html/design/building-blocks/grid-lists.jd
@@ -4,6 +4,13 @@ page.tags="gridview","layout","listview"
<img src="{@docRoot}design/media/gridview_overview.png">
+<a class="notice-developers" href="{@docRoot}guide/topics/ui/layout/gridview.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Grid View</p>
+ </div>
+</a>
+
<p>Grid lists are an alternative to standard list views. They are best suited for showing data sets
that represent themselves through images. In contrast to simple lists, grid lists may scroll either
vertically or horizontally.</p>
diff --git a/docs/html/design/building-blocks/lists.jd b/docs/html/design/building-blocks/lists.jd
index 16927a6..5514824 100644
--- a/docs/html/design/building-blocks/lists.jd
+++ b/docs/html/design/building-blocks/lists.jd
@@ -2,6 +2,13 @@ page.title=Lists
page.tags="listview","layout"
@jd:body
+<a class="notice-developers" href="{@docRoot}guide/topics/ui/layout/listview.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>List View</p>
+ </div>
+</a>
+
<p>Lists present multiple line items in a vertical arrangement. They can be used for data selection as
well as drilldown navigation.</p>
diff --git a/docs/html/design/building-blocks/pickers.jd b/docs/html/design/building-blocks/pickers.jd
index 47363d0..6dd72ba 100644
--- a/docs/html/design/building-blocks/pickers.jd
+++ b/docs/html/design/building-blocks/pickers.jd
@@ -2,6 +2,13 @@ page.title=Pickers
page.tags="datepicker","timepicker"
@jd:body
+<a class="notice-developers" href="{@docRoot}guide/topics/ui/controls/pickers.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Pickers</p>
+ </div>
+</a>
+
<p>Pickers provide a simple way to select a single value from a set. In addition to touching the
up/down arrow buttons, it's possible to set the desired value from the keyboard or via a swipe
gesture.</p>
@@ -31,9 +38,3 @@ correctly. The format of a time and date picker adjusts automatically to the loc
<img src="{@docRoot}design/media/picker_datetime.png">
-
-<div class="note develop">
-<p><strong>Developer Guide</strong></p>
- <p>For information about how to create date and time pickers,
- see the <a href="{@docRoot}guide/topics/ui/controls/pickers.html">Pickers</a> API guide.</p>
-</div>
diff --git a/docs/html/design/building-blocks/spinners.jd b/docs/html/design/building-blocks/spinners.jd
index 3550b0c..c00b639 100644
--- a/docs/html/design/building-blocks/spinners.jd
+++ b/docs/html/design/building-blocks/spinners.jd
@@ -2,6 +2,13 @@ page.title=Spinners
page.tags="spinner","dropdown"
@jd:body
+<a class="notice-developers" href="{@docRoot}guide/topics/ui/controls/spinner.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Spinners</p>
+ </div>
+</a>
+
<p>Spinners provide a quick way to select one value from a set. In the default state, a spinner shows
its currently selected value. Touching the spinner displays a dropdown menu with all other available
values, from which the user can select a new one.</p>
@@ -37,9 +44,3 @@ tabs.</p>
Spinners in the Holo Dark and Holo Light themes, in various states.
</div>
-
-<div class="note develop">
-<p><strong>Developer Guide</strong></p>
- <p>For information about how to create spinners,
- see the <a href="{@docRoot}guide/topics/ui/controls/spinner.html">Spinners</a> API guide.</p>
-</div>
diff --git a/docs/html/design/building-blocks/switches.jd b/docs/html/design/building-blocks/switches.jd
index 0b195b9..74cab5a 100644
--- a/docs/html/design/building-blocks/switches.jd
+++ b/docs/html/design/building-blocks/switches.jd
@@ -4,31 +4,53 @@ page.tags="switch","checkbox","radiobutton","button"
<p>Switches allow the user to select options. There are three kinds of switches: checkboxes, radio
buttons, and on/off switches.</p>
+
+
+
<h2 id="checkboxes">Checkboxes</h2>
+<a class="notice-developers" href="{@docRoot}guide/topics/ui/controls/checkbox.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Checkboxes</p>
+ </div>
+</a>
+
<p>Checkboxes allow the user to select multiple options from a set. Avoid using a single checkbox to
turn an option off or on. Instead, use an on/off switch.</p>
<img src="{@docRoot}design/media/switches_checkboxes.png">
+
+
<h2 id="radio-buttons">Radio Buttons</h2>
+<a class="notice-developers" href="{@docRoot}guide/topics/ui/controls/radiobutton.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Radio Buttons</p>
+ </div>
+</a>
+
<p>Radio buttons allow the user to select one option from a set. Use radio buttons for exclusive
selection if you think that the user needs to see all available options side-by-side. Otherwise,
consider a spinner, which uses less space.</p>
<img src="{@docRoot}design/media/switches_radios.png">
+
+
<h2 id="switches">On/off Switches</h2>
+<a class="notice-developers" href="{@docRoot}guide/topics/ui/controls/togglebutton.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Toggle Buttons</p>
+ </div>
+</a>
+
<p>On/off switches toggle the state of a single settings option.</p>
<img src="{@docRoot}design/media/switches_switches.png">
-<div class="note develop">
-<p><strong>Developer Guide</strong></p>
- <p>For information about how to create these different switches,
- see the <a href="{@docRoot}guide/topics/ui/controls/checkbox.html">Checkboxes</a>,
- <a href="{@docRoot}guide/topics/ui/controls/radiobutton.html">Radio Buttons</a>, or
- <a href="{@docRoot}guide/topics/ui/controls/togglebutton.html">Toggle Buttons</a> API guides.</p>
-</div>
+
diff --git a/docs/html/design/building-blocks/tabs.jd b/docs/html/design/building-blocks/tabs.jd
index 79cc9c7..4778400 100644
--- a/docs/html/design/building-blocks/tabs.jd
+++ b/docs/html/design/building-blocks/tabs.jd
@@ -4,6 +4,13 @@ page.tags="tabs","actionbar","navigation","viewpager"
<img src="{@docRoot}design/media/tabs_overview.png">
+<a class="notice-developers" href="{@docRoot}training/implementing-navigation/lateral.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Creating Swipe Views with Tabs</p>
+ </div>
+</a>
+
<p>Tabs in the action bar make it easy to explore and switch between different views or functional
aspects of your app, or to browse categorized data sets.</p>
@@ -59,9 +66,3 @@ permits fast view switching even on narrower screens.</p>
<img src="{@docRoot}design/media/tabs_stacked.png">
-
-<div class="note develop">
-<p><strong>Developer Guide</strong></p>
- <p>For information about how to create tabs,
- see the <a href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a> API guide.</p>
-</div>
diff --git a/docs/html/design/building-blocks/text-fields.jd b/docs/html/design/building-blocks/text-fields.jd
index 82321f0..383531b 100644
--- a/docs/html/design/building-blocks/text-fields.jd
+++ b/docs/html/design/building-blocks/text-fields.jd
@@ -2,6 +2,13 @@ page.title=Text Fields
page.tags="text","edittext","input"
@jd:body
+<a class="notice-developers" href="{@docRoot}guide/topics/ui/controls/text.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Text Fields</p>
+ </div>
+</a>
+
<p>Text fields allow the user to type text into your app. They can be either single line or multi-line.
Touching a text field places the cursor and automatically displays the keyboard. In addition to
typing, text fields allow for a variety of other activities, such as text selection (cut, copy,
@@ -70,10 +77,3 @@ Selection mode includes:</p>
</div>
</div>
-
-<div class="note develop">
-<p><strong>Developer Guide</strong></p>
- <p>For information about how to create text fields, provide auto-complete suggestions,
- and specify the input mode,
- see the <a href="{@docRoot}guide/topics/ui/controls/text.html">Text Fields</a> API guide.</p>
-</div>
diff --git a/docs/html/design/design_toc.cs b/docs/html/design/design_toc.cs
index c3020e1..ff465bf 100644
--- a/docs/html/design/design_toc.cs
+++ b/docs/html/design/design_toc.cs
@@ -31,6 +31,7 @@
<li><a href="<?cs var:toroot ?>design/patterns/app-structure.html">App Structure</a></li>
<li><a href="<?cs var:toroot ?>design/patterns/navigation.html">Navigation</a></li>
<li><a href="<?cs var:toroot ?>design/patterns/actionbar.html">Action Bar</a></li>
+ <li><a href="<?cs var:toroot ?>design/patterns/navigation-drawer.html">Navigation Drawer</a></li>
<li><a href="<?cs var:toroot ?>design/patterns/multi-pane-layouts.html">Multi-pane Layouts</a></li>
<li><a href="<?cs var:toroot ?>design/patterns/swipe-views.html">Swipe Views</a></li>
<li><a href="<?cs var:toroot ?>design/patterns/selection.html">Selection</a></li>
diff --git a/docs/html/design/media/actionbar_drawer.png b/docs/html/design/media/actionbar_drawer.png
deleted file mode 100644
index 95e04f5..0000000
--- a/docs/html/design/media/actionbar_drawer.png
+++ /dev/null
Binary files differ
diff --git a/docs/html/design/media/action_bar_pattern_default_tabs.png b/docs/html/design/media/app_structure_default_tabs.png
index a6d0d90..a6d0d90 100644
--- a/docs/html/design/media/action_bar_pattern_default_tabs.png
+++ b/docs/html/design/media/app_structure_default_tabs.png
Binary files differ
diff --git a/docs/html/design/media/app_structure_drawer.png b/docs/html/design/media/app_structure_drawer.png
new file mode 100644
index 0000000..560e834
--- /dev/null
+++ b/docs/html/design/media/app_structure_drawer.png
Binary files differ
diff --git a/docs/html/design/media/action_bar_pattern_spinner.png b/docs/html/design/media/app_structure_spinner.png
index 9aff412..9aff412 100644
--- a/docs/html/design/media/action_bar_pattern_spinner.png
+++ b/docs/html/design/media/app_structure_spinner.png
Binary files differ
diff --git a/docs/html/design/media/navigation_between_apps_back.png b/docs/html/design/media/navigation_between_apps_back.png
index d5cd979..d5cd979 100755..100644
--- a/docs/html/design/media/navigation_between_apps_back.png
+++ b/docs/html/design/media/navigation_between_apps_back.png
Binary files differ
diff --git a/docs/html/design/media/navigation_between_apps_inward.png b/docs/html/design/media/navigation_between_apps_inward.png
index 7394b1c..7394b1c 100755..100644
--- a/docs/html/design/media/navigation_between_apps_inward.png
+++ b/docs/html/design/media/navigation_between_apps_inward.png
Binary files differ
diff --git a/docs/html/design/media/navigation_between_apps_up.png b/docs/html/design/media/navigation_between_apps_up.png
index 99c3112..99c3112 100755..100644
--- a/docs/html/design/media/navigation_between_apps_up.png
+++ b/docs/html/design/media/navigation_between_apps_up.png
Binary files differ
diff --git a/docs/html/design/media/navigation_between_siblings_market1.png b/docs/html/design/media/navigation_between_siblings_market1.png
index b12a432..b12a432 100755..100644
--- a/docs/html/design/media/navigation_between_siblings_market1.png
+++ b/docs/html/design/media/navigation_between_siblings_market1.png
Binary files differ
diff --git a/docs/html/design/media/navigation_between_siblings_market2.png b/docs/html/design/media/navigation_between_siblings_market2.png
index a09d9d7..a09d9d7 100755..100644
--- a/docs/html/design/media/navigation_between_siblings_market2.png
+++ b/docs/html/design/media/navigation_between_siblings_market2.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_CAB.png b/docs/html/design/media/navigation_drawer_CAB.png
new file mode 100644
index 0000000..9d4a5b5
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_CAB.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_collapse.png b/docs/html/design/media/navigation_drawer_collapse.png
new file mode 100644
index 0000000..7ca56da
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_collapse.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_cross_nav.png b/docs/html/design/media/navigation_drawer_cross_nav.png
new file mode 100644
index 0000000..bf8d238
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_cross_nav.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_first_run.png b/docs/html/design/media/navigation_drawer_first_run.png
new file mode 100644
index 0000000..728f29f
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_first_run.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_holo_dark_light.png b/docs/html/design/media/navigation_drawer_holo_dark_light.png
new file mode 100644
index 0000000..dcb91ab
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_holo_dark_light.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_indicator_big.png b/docs/html/design/media/navigation_drawer_indicator_big.png
new file mode 100644
index 0000000..5faa93b
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_indicator_big.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_layout.png b/docs/html/design/media/navigation_drawer_layout.png
new file mode 100644
index 0000000..e59b37c
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_layout.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_nav_and_actions.png b/docs/html/design/media/navigation_drawer_nav_and_actions.png
new file mode 100644
index 0000000..0df04e9
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_nav_and_actions.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_navigation_hubs.png b/docs/html/design/media/navigation_drawer_navigation_hubs.png
new file mode 100644
index 0000000..9f4b244
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_navigation_hubs.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_open_from_lower.png b/docs/html/design/media/navigation_drawer_open_from_lower.png
new file mode 100644
index 0000000..ec5f03d
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_open_from_lower.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_open_overflow.png b/docs/html/design/media/navigation_drawer_open_overflow.png
new file mode 100644
index 0000000..112a414
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_open_overflow.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_overview.png b/docs/html/design/media/navigation_drawer_overview.png
new file mode 100644
index 0000000..42d21fa
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_overview.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_peek.png b/docs/html/design/media/navigation_drawer_peek.png
new file mode 100644
index 0000000..c59881e
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_peek.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_quick_to_top.png b/docs/html/design/media/navigation_drawer_quick_to_top.png
new file mode 100644
index 0000000..0e44915
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_quick_to_top.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_reset_backstack.png b/docs/html/design/media/navigation_drawer_reset_backstack.png
new file mode 100644
index 0000000..c0c2f61
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_reset_backstack.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_settings_help.png b/docs/html/design/media/navigation_drawer_settings_help.png
new file mode 100644
index 0000000..ed29971
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_settings_help.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_titles_icons.png b/docs/html/design/media/navigation_drawer_titles_icons.png
new file mode 100644
index 0000000..b726c9b
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_titles_icons.png
Binary files differ
diff --git a/docs/html/design/media/navigation_drawer_top_out.png b/docs/html/design/media/navigation_drawer_top_out.png
new file mode 100644
index 0000000..ad92b77
--- /dev/null
+++ b/docs/html/design/media/navigation_drawer_top_out.png
Binary files differ
diff --git a/docs/html/design/patterns/accessibility.jd b/docs/html/design/patterns/accessibility.jd
index 5f46082..16a39d6 100644
--- a/docs/html/design/patterns/accessibility.jd
+++ b/docs/html/design/patterns/accessibility.jd
@@ -2,6 +2,13 @@ page.title=Accessibility
page.tags="accessibility","navigation","input"
@jd:body
+<a class="notice-developers" href="{@docRoot}training/accessibility/index.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Implementing Accessibility</p>
+ </div>
+</a>
+
<p>One of Android's missions is to organize the world's information and make it universally accessible and useful. Accessibility is the measure of how successfully a product can be used by people with varying abilities. Our mission applies to all users-including people with disabilities such as visual impairment, color deficiency, hearing loss, and limited dexterity.</p>
<p><a href="https://www.google.com/#hl=en&q=universal+design&fp=1">Universal design</a> is the practice of making products that are inherently accessible to all users, regardless of ability. The Android design patterns were created in accordance with universal design principles, and following them will help your app meet basic usability standards. Adhering to universal design and enabling Android's accessibility tools will make your app as accessible as possible.</p>
<p>Robust support for accessibility will increase your app's user base. It may also be required for adoption by some organizations.</p>
@@ -71,13 +78,6 @@ page.tags="accessibility","navigation","input"
<p>Turn on the TalkBack service in <strong>Settings > Accessibility</strong> and navigate your application using directional controls or eyes-free navigation.</p>
-<div class="note develop">
-<p><strong>Developer Guide</strong></p>
- <p>For information about how to properly implement accessibility in your app, see the
- <a href="{@docRoot}guide/topics/ui/accessibility/index.html">Accessibility</a>
- API guide.</p>
-</div>
-
<h2>Checklist</h2>
<ul>
diff --git a/docs/html/design/patterns/actionbar.jd b/docs/html/design/patterns/actionbar.jd
index da9c3c3..6020034 100644
--- a/docs/html/design/patterns/actionbar.jd
+++ b/docs/html/design/patterns/actionbar.jd
@@ -4,6 +4,14 @@ page.tags="actionbar","navigation"
<img src="{@docRoot}design/media/action_bar_pattern_overview.png">
+<a class="notice-developers" href="{@docRoot}guide/topics/ui/actionbar.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Action Bar</p>
+ </div>
+</a>
+
+
<p>The <em>action bar</em> is a dedicated piece of real estate at the top of each screen that is generally persistent throughout the app.</p>
<p><strong>It provides several key functions</strong>:</p>
<ul>
@@ -48,7 +56,7 @@ Up navigation, see the <a href="{@docRoot}design/patterns/navigation.html">Navig
<p>
If your app displays data in different views, this segment of the action bar allows users to switch
-views. Examples of view-switching controls are drop-down menus or tab controls.
+views. Examples of view-switching controls are drop-down menus or tab controls. For more information on view-switching, see the <a href="{@docRoot}design/patterns/app-structure.html">App Structure</a> pattern.
</p>
<p>
@@ -115,132 +123,11 @@ the top bar.</p>
</div>
</div>
-<h2 id="contextual">Contextual Action Bars</h2>
-
-<p>A <em>contextual action bar (CAB)</em> is a temporary action bar that overlays the app's action bar for the
-duration of a particular sub-task. CABs are most typically used for tasks that involve acting on
-selected data or text.</p>
-
-<img src="{@docRoot}design/media/action_bar_cab.png">
-<div class="figure-caption">
- Contextual action bar shown in Browser and Gmail
-</div>
-
-<p>The selection CAB appears after a long press on a selectable data item triggers selection mode.</p>
-<p><strong>From here the user can</strong>:</p>
-<ul>
-<li>Select additional elements by touching them.</li>
-<li>Trigger an action from the CAB that applies to all selected data items. The CAB then
- automatically dismisses itself.</li>
-<li>Dismiss the CAB via the navigation bar's Back button or the CAB's checkmark button. This removes
- the CAB along with all selection highlights.</li>
-</ul>
-<p>Use CABs whenever you allow the user to select data via long press. You can control the action
-content of a CAB in order to insert the actions you would like the user to be able to perform.</p>
-<p>For more information, refer to the <a href="{@docRoot}design/patterns/selection.html">Selection
-pattern</a>.</p>
-
-<h2 id="elements">View Controls</h2>
-<p>If your app displays data in different views, the action bar has three different controls to allow users to switch between them: tabs, spinners, and drawers.</p>
-
-<h4>Tabs</h4>
-<p><em>Tabs</em> display app views concurrently and make it easy to explore and switch between them. Tabs may be fixed, where all tabs are simultaneously displayed, or may scroll, allowing a larger number of views to be presented.</p>
-
-<img src="{@docRoot}design/media/tabs_youtube.png">
-
-<p><strong>Use tabs if</strong>:</p>
-<ul>
-<li>You expect your app's users to switch views frequently.</li>
-<li>You want the user to be highly aware of the alternate views.</li>
-</ul>
-
-<h4>Fixed tabs</h4>
-<div class="layout-content-row">
- <div class="layout-content-col span-6">
-<p><em>Fixed tabs</em> are always visible on the screen, and can't be moved out of the way like scrollable
-tabs. Fixed tabs in the main action bar can move to the top bar when the screen orientation changes.</p>
-
-<p>Use fixed tabs to support quick changes between two or three app views. Fixed tabs should always allow the user to navigate between the views by swiping left or right on the content area.</p>
-
- </div>
- <div class="layout-content-col span-7">
-
- <img src="{@docRoot}design/media/action_bar_pattern_default_tabs.png">
- <div class="figure-caption">
- Default fixed tabs shown in Holo Dark &amp; Light.
- </div>
-
- </div>
-</div>
-
-<h4>Scrollable tabs</h4>
-<div class="layout-content-row">
- <div class="layout-content-col span-6">
-<p><em>Scrollable tabs</em> always take up the entire width of the bar, with the currently active view item in the center, and therefore need to live in a dedicated bar. Scrollable tabs can themselves be scrolled horizontally to bring more tabs into view.</p>
-<p>Use scrollable tabs if you have a large number of views or if you're unsure how many views will be displayed because your app inserts views dynamically (for example, open chats in a messaging app that the user can navigate between). Scrollable tabs should always allow the user to navigate between the views by swiping left or right on the content area as well as swiping the tabs themselves.</p>
-
- </div>
- <div class="layout-content-col span-7">
-
- <video width="400" class="with-shadow play-on-hover" autoplay>
- <source src="{@docRoot}design/media/tabs_scrolly.mp4" type="video/mp4">
- <source src="{@docRoot}design/media/tabs_scrolly.webm" type="video/webm">
- <source src="{@docRoot}design/media/tabs_scrolly.ogv" type="video/ogg">
- </video>
- <div class="figure-caption">
- Scrolling tabs in the Play Store app.
- <div class="video-instructions">&nbsp;</div>
- </div>
-
- </div>
-</div>
-
-<div class="layout-content-row">
- <div class="layout-content-col span-6">
-
-<h4>Spinners</h4>
-<p>A <em>spinner</em> is a drop-down menu that allows users to switch between views of your app. </p>
-<p><strong>Use a spinner in the main action bar if</strong>:</p>
-<ul>
-<li>You don't want to give up the vertical screen real estate for a dedicated tab bar.</li>
-<li>The user is switching between views of the same data set (for example: calendar events viewed by day, week, or month) or data sets of the same type (such as content for two different accounts).</li>
-</ul>
-
- </div>
- <div class="layout-content-col span-7">
-
- <img src="{@docRoot}design/media/action_bar_pattern_spinner.png">
- <div class="figure-caption">
- Action bar spinner from Calendar application.
- </div>
-
- </div>
-</div>
-
-<h4>Drawers</h4>
-<div class="layout-content-row">
- <div class="layout-content-col span-6">
-<p>A <em>drawer</em> is a slide-out menu that allows users to switch between views of your app. It can be opened by touching the action bar's app icon (decorated with the Up caret.) Additionally, a drawer can be revealed by an edge swipe from the left of the screen, and dismissed by swiping from the right edge of the drawer. However, because many users will rely on Up navigation to open a drawer, it is only suitable for use at the topmost level of your app's hierarchy.</p>
-
-<p><strong>Open a drawer from the main action bar if</strong>:</p>
-<ul>
-<li>You don't want to give up the vertical screen real estate for a dedicated tab bar.</li>
-<li>You want to provide direct navigation to a number of views within your app which don't have direct relationships between each other.</li>
-</ul>
-
- </div>
- <div class="layout-content-col span-7">
- <img src="{@docRoot}design/media/actionbar_drawer.png">
- </div>
-</div>
-
-<h2>Action buttons</h2>
+<h2>Action Buttons</h2>
<p><em>Action buttons</em> on the action bar surface your app's most important activities. Think about which
buttons will get used most often, and order them accordingly. Depending on available screen real
estate, the system shows your most important actions as action buttons and moves the rest to the
-action overflow. The action bar and the action overflow should only present actions to the user that
-are available. If an action is unavailable in the current context, hide it. Do not show it as
-disabled.</p>
+action overflow. The action bar should show only those actions that are available to the user. If an action is unavailable in the current context, hide it. Do not show it as disabled.</p>
<img src="{@docRoot}design/media/action_bar_pattern_action_icons.png">
<div class="figure-caption">
@@ -350,16 +237,32 @@ sharing options.</p>
The Gallery app's share action provider with extended spinner for additional sharing options.
</div>
+<h2 id="contextual">Contextual Action Bars</h2>
-<div class="note develop">
-<p><strong>Developer Guide</strong></p>
- <p>For information about how to build an action bar
- see the <a href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a> API guide.
- For information about contextual action bars, read
- <a href="{@docRoot}guide/topics/ui/menus.html#context-menu">Creating Contextual Menus</a>.
- </p>
+<p>A <em>contextual action bar (CAB)</em> is a temporary action bar that overlays the app's action bar for the
+duration of a particular sub-task. CABs are most typically used for tasks that involve acting on
+selected data or text.</p>
+
+<img src="{@docRoot}design/media/action_bar_cab.png">
+<div class="figure-caption">
+ Contextual action bar in Browser and Gmail
</div>
+<p>The selection CAB appears after a long press on a selectable data item triggers selection mode.</p>
+<p><strong>From here the user can</strong>:</p>
+<ul>
+<li>Select additional elements by touching them.</li>
+<li>Trigger an action from the CAB that applies to all selected data items. The CAB then
+ automatically dismisses itself.</li>
+<li>Dismiss the CAB via the navigation bar's Back button or the CAB's checkmark button. This removes
+ the CAB along with all selection highlights.</li>
+</ul>
+<p>Use CABs whenever you allow the user to select data via long press. You can control the action
+content of a CAB in order to insert the actions you would like the user to be able to perform.</p>
+<p>For more information, refer to the <a href="{@docRoot}design/patterns/selection.html">Selection
+pattern</a>.</p>
+
+
<h2 id="checklist">Action Bar Checklist</h2>
@@ -374,4 +277,4 @@ actions exceeds the capacity of the main action bar, display them separately in
<p>Sometimes it is important to display contextual information for your app that's always visible.
Examples are the number of unread messages in a messaging inbox view or the Now Playing information
in a music player. Carefully plan which important information you would like to display and
-structure your action bars accordingly.</p>
+structure your action bars accordingly.</p> \ No newline at end of file
diff --git a/docs/html/design/patterns/app-structure.jd b/docs/html/design/patterns/app-structure.jd
index 1809ecd..0dc20e2 100644
--- a/docs/html/design/patterns/app-structure.jd
+++ b/docs/html/design/patterns/app-structure.jd
@@ -2,7 +2,7 @@ page.title=Application Structure
page.tags="navigation","layout","tablet"
@jd:body
-<p>Apps come in many varieties that address very different needs. For example:</p>
+ <p>Apps come in many varieties that address very different needs. For example:</p>
<ul>
<li>Apps such as Calculator or Camera that are built around a single focused activity handled from a
single screen</li>
@@ -62,7 +62,7 @@ layouts that are visually engaging and appropriate for the data type and screen
<img src="{@docRoot}design/media/app_structure_market.png">
<div class="figure-caption">
The Play Store app's start screen primarily allows navigation into the stores for Apps, Music, Books,
- Movies and Games. It is also enriched with tailored recommendations and promotions that
+ Movies, and Games. It is also enriched with tailored recommendations and promotions that
surface content of interest to the user. Search is readily available from the action bar.
</div>
@@ -72,23 +72,40 @@ layouts that are visually engaging and appropriate for the data type and screen
<div class="layout-content-row">
<div class="layout-content-col span-5">
+<h4>Create an identity for your app</h4>
+<p>Creating an identity for your app goes beyond the action bar. Your app communicates its identity
+through its data, the way that data is arranged, and how people interact with it. Especially for
+media-rich applications, try to create unique layouts that showcase your data and go beyond the
+monotony of simple list views.</p>
+
+ </div>
+ <div class="layout-content-col span-8">
+
+ <img src="{@docRoot}design/media/app_structure_music_lndscp.png">
+ <div class="figure-caption">
+ The 3D carousel celebrates cover art and establishes a unique identity for the Music app.
+ Defaulting to the Recent view keeps the focus on music the user has been listening to lately.
+ </div>
+
+ </div>
+</div>
+
<h4>Set up action bars for navigation and actions</h4>
-<p>All screens in your app should display action bars to provide consistent navigation and surface
+
+<div class="layout-content-row">
+ <div class="layout-content-col span-5">
+
+ <p>All screens in your app should display action bars to provide consistent navigation and surface
important actions.</p>
-<p>At the top level, special considerations apply to the action bar:</p>
-<ul>
-<li>Use the action bar to display your app's icon or title.</li>
-<li>If your top level consists of multiple views, or if switching between data from different user
- accounts is a significant use case, make sure that it's easy for the user to navigate between them
- by adding view controls to your action bar.</li>
-<li>If your app allows people to create content, consider making the content accessible right from the
+ <p>At the top level, special considerations apply to the action bar:</p>
+ <ul>
+ <li>Use the action bar to display your app's icon or title.</li>
+ <li>If your top level consists of multiple views, make sure that it's easy for the user to navigate between them by adding view controls to your action bar.</li>
+ <li>If your app allows people to create content, consider making the content accessible right from the
top level.</li>
-<li>If your content is searchable, include the Search action in the action bar so people can cut
+ <li>If your content is searchable, include the Search action in the action bar so people can cut
through the navigation hierarchy.</li>
-</ul>
-
-<p>For more discussion, see the <a href="{@docRoot}design/patterns/actionbar.html">Action Bar</a>
-design guide.</p>
+ </ul>
</div>
<div class="layout-content-col span-8">
@@ -103,27 +120,79 @@ design guide.</p>
</div>
</div>
+<h2 id="top-level-switching">Top Level Switching With View Controls</h2>
+<p>The top level communicates your app’s capabilities by introducing the user to the major functional areas. In many cases the top level will consist of multiple views, and you need to make sure that the user can navigate between them efficiently. Android supports a number of view controls for this task. Use the control that best matches your app's navigation needs:</p>
+
+<h4>Fixed tabs</h4>
<div class="layout-content-row">
- <div class="layout-content-col span-5">
+ <div class="layout-content-col span-6">
+<p><em>Fixed tabs</em> display top-level views concurrently and make it easy to explore and switch between them. They are always visible on the screen, and can't be moved out of the way like scrollable tabs. <em>Fixed tabs</em> should always allow the user to navigate between the views by swiping left or right on the content area.</p>
+<p><strong>Use tabs if</strong>:</p>
+<ul>
+<li>You expect your app's users to switch views frequently.</li>
+<li>You have a limited number of up to three top-level views.</li>
+<li>You want the user to be highly aware of the alternate views.</li>
+</ul>
-<h4>Create an identity for your app</h4>
-<p>Creating an identity for your app goes beyond the action bar. Your app communicates its identity
-through its data, the way that data is arranged, and how people interact with it. Especially for
-media-rich applications, try to create unique layouts that showcase your data and go beyond the
-monotony of simple list views.</p>
+ </div>
+ <div class="layout-content-col span-7">
+
+ <img src="{@docRoot}design/media/app_structure_default_tabs.png">
+ <div class="figure-caption">
+ Default fixed tabs shown in Holo Dark &amp; Light.
+ </div>
</div>
- <div class="layout-content-col span-8">
+</div>
- <img src="{@docRoot}design/media/app_structure_music_lndscp.png">
+<div class="layout-content-row">
+ <div class="layout-content-col span-6">
+
+<h4>Spinners</h4>
+<p>A <em>spinner</em> is a drop-down menu that allows users to switch between views of your app. </p>
+<p><strong>Use a spinner in the main action bar if</strong>:</p>
+<ul>
+<li>You don't want to give up the vertical screen real estate for a dedicated tab bar.</li>
+<li>The user is switching between views of the same data set (for example: calendar events viewed by day, week, or month) or data sets of the same type (such as content for two different accounts).</li>
+</ul>
+
+ </div>
+ <div class="layout-content-col span-7">
+
+ <img src="{@docRoot}design/media/app_structure_spinner.png">
<div class="figure-caption">
- The 3D carousel celebrates cover art and establishes a unique identity for the Music app.
- Defaulting to the Recent view keeps the focus on music the user has been listening to lately.
+ Action bar spinner from Calendar application.
</div>
</div>
</div>
+<h4>Navigation drawers</h4>
+<div class="layout-content-row">
+ <div class="layout-content-col span-6">
+<p>A <em>navigation drawer</em> is a slide-out menu that allows users to switch between views of your app. It can hold a large number of items and is accessible from anywhere in your app. Navigation drawers show your app's top-level views, but can also provide navigation to lower-level screens. This makes them particularly suitable for complex apps.</p>
+
+<p><strong>Use navigation drawers if</strong>:</p>
+<ul>
+<li>You don't want to give up the vertical screen real estate for a dedicated tab bar.</li>
+<li>You have a large number of top-level views.</li>
+<li>You want to provide direct access to screens on lower levels.</li>
+<li>You want to provide quick navigation to views which don't have direct relationships between each other.</li>
+<li>You have particularly deep navigation branches.</li>
+</ul>
+
+ </div>
+ <div class="layout-content-col span-7">
+ <img src="{@docRoot}design/media/app_structure_drawer.png">
+ <div class="figure-caption">
+ Navigation drawer from the Shopper app.
+ </div>
+ </div>
+</div>
+
+<h4>Don't mix and match</h4>
+<p>After choosing the best top-level navigation for your app, don't mix and match patterns. For example, if you decide to use tabs for top-level switching, don't add a drawer, even if your navigation branches are deep. In this case, the navigation drawer would simply duplicate the information on the tabs, confusing your users.</p>
+
<h2 id="categories">Categories</h2>
<p>Generally, the purpose of a deep, data-driven app is to navigate through organizational categories
@@ -275,4 +344,4 @@ design guide.</p>
<li>
<p>Allow for quick navigation between detail items with swipe views.</p>
</li>
-</ul>
+</ul> \ No newline at end of file
diff --git a/docs/html/design/patterns/compatibility.jd b/docs/html/design/patterns/compatibility.jd
index 3a56f52..5ca6d8b 100644
--- a/docs/html/design/patterns/compatibility.jd
+++ b/docs/html/design/patterns/compatibility.jd
@@ -2,6 +2,13 @@ page.title=Backwards Compatibility
page.tags="support"
@jd:body
+<a class="notice-developers" href="{@docRoot}training/basics/supporting-devices/index.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Supporting Different Devices</p>
+ </div>
+</a>
+
<p>Significant changes in Android 3.0 included:</p>
<ul>
<li>Deprecation of navigation hardware keys (Back, Menu, Search, Home) in favor of handling navigation
diff --git a/docs/html/design/patterns/multi-pane-layouts.jd b/docs/html/design/patterns/multi-pane-layouts.jd
index cbf29cb..06c8189 100644
--- a/docs/html/design/patterns/multi-pane-layouts.jd
+++ b/docs/html/design/patterns/multi-pane-layouts.jd
@@ -2,6 +2,14 @@ page.title=Multi-pane Layouts
page.tags="tablet","navigation","layout","fragment"
@jd:body
+
+<a class="notice-developers" href="{@docRoot}training/basics/fragments/index.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Building a Dynamic UI with Fragments</p>
+ </div>
+</a>
+
<p>When writing an app for Android, keep in mind that Android devices come in many different screen
sizes and types. Make sure that your app consistently provides a balanced and aesthetically pleasing
layout by adjusting its content to varying screen sizes and orientations.</p>
@@ -88,15 +96,6 @@ you can use to adjust the layout after orientation change while keeping function
</div>
-<div class="note develop">
-<p><strong>Developer Guide</strong></p>
- <p>For information about how to create multi-pane layouts, read
- see the <a href="{@docRoot}training/basics/fragments/index.html">Building
- a Dynamic UI with Fragments</a> and
- <a href="{@docRoot}training/multiscreen/index.html">Designing for Multiple Screens</a>.
- </p>
-</div>
-
<h2 id="checklist">Checklist</h2>
diff --git a/docs/html/design/patterns/navigation-drawer.jd b/docs/html/design/patterns/navigation-drawer.jd
new file mode 100644
index 0000000..bf6609e
--- /dev/null
+++ b/docs/html/design/patterns/navigation-drawer.jd
@@ -0,0 +1,338 @@
+page.title=Navigation Drawer
+page.tags="DrawerLayout","SlidingPaneLayout"
+@jd:body
+
+
+<a class="notice-developers" href="{@docRoot}training/implementing-navigation/nav-drawer.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Creating a Navigation Drawer</p>
+ </div>
+</a>
+
+
+<p>The navigation drawer is a panel that transitions in from the left edge of the screen and
+displays the app’s main navigation options.</p>
+
+
+<h4>Displaying the navigation drawer</h4>
+
+<p>The user can bring the navigation drawer onto the screen by swiping from the left edge of the
+screen or by touching the application icon on the action bar.</p>
+
+<p>As the navigation drawer expands, it overlays the content but not the action bar. When the
+drawer is fully extended, the action bar adjusts its content by replacing the current action
+bar title with the app name and removing all actions that are contextual to the view underneath
+the navigation drawer. The overflow menu with the standard action items for Settings and Help
+remains visible.</p>
+
+<img src="{@docRoot}design/media/navigation_drawer_overview.png">
+<div class="figure-caption">
+ The user can open the drawer panel by touching the navigation drawer indicator.
+</div>
+
+<p>Because they are transient, navigation drawers make views less cluttered. You can also use
+them at deeper levels in the navigation hierarchy, allowing users to switch to your app's most
+important screens from anywhere in the app.</p>
+
+<img src="{@docRoot}design/media/navigation_drawer_open_from_lower.png">
+<div class="figure-caption">
+ Open the drawer from anywhere in your app by swiping from the left edge of the screen.
+</div>
+
+
+<h4>Dismissing the navigation drawer</h4>
+
+<p> When the navigation drawer is expanded, the user can dismiss it in one of four ways: </p>
+<ul>
+ <li>Touching the content outside the navigation drawer</li>
+ <li>Swiping to the left anywhere on the screen (including edge swipe from right)</li>
+ <li>Touching the app icon/title in the action bar</li>
+ <li>Pressing Back</li>
+</ul>
+
+
+<h2 id="WhenToUse"> When to Use the Navigation Drawer </h2>
+
+<p> The navigation drawer is not a general replacement for top-level navigation via spinners
+or tabs. The structure of your app should guide your choice of which pattern to use for
+top-level switching. For more information on top-level switching mechanisms, see the
+<a href="{@docRoot}design/patterns/app-structure.html">Application Structure</a> design pattern.</p>
+<p> Here are some examples of where navigation drawers work best:</p>
+
+<h4>More than 3 top-level views</h4>
+<p> Navigation drawers are great for displaying a large number of navigation targets
+concurrently. Use the navigation drawer if you have more than 3 unique top-level views.
+If not, use fixed tabs for top-level organization to ease discovery and interaction.</p>
+
+<h4>Cross-navigation from lower levels</h4>
+<p> If your app requires cross-navigating between lower-level screens, consider using the
+navigation drawer. Because it is accessible from anywhere in the app, the drawer enables
+efficient navigation from lower-level screens to other important places in your app.</p>
+
+<img src="{@docRoot}design/media/navigation_drawer_cross_nav.png">
+<div class="figure-caption">
+ The navigation drawer makes cross-navigation at lower levels possible.
+</div>
+
+
+<h4>Deep navigation branches</h4>
+<p> If you have particularly deep branches, navigating to the top-level of your app can become
+repetitive and cumbersome with Up and Back alone. Since navigation drawers are accessible from
+anywhere in the app, navigation up to the top level is faster and more efficient.</p>
+
+<img src="{@docRoot}design/media/navigation_drawer_quick_to_top.png">
+<div class="figure-caption">
+ The navigation drawer allows for quick jumps to the top-level of your app, removing the need
+ for repetitive Back or Up sequences.
+</div>
+
+
+<h2 id="Hubs">Navigation Hubs</h2>
+
+<p>The navigation drawer is a reflection of your app’s structure and displays its major
+navigation hubs. Think of navigation hubs as those places in your app that a user will want
+to visit frequently or use as a jumping-off point to other parts of the app.
+At a minimum, the navigation hubs are the top-level views, since they correspond to your app’s
+major functional areas.</p>
+<p> If your app’s structure is deep, you can add screens from lower levels that your users will
+likely visit often and make those navigation hubs as well.</p>
+
+<img src="{@docRoot}design/media/navigation_drawer_navigation_hubs.png">
+<div class="figure-caption">
+ The navigation drawer contains all of your app's navigation hubs. Include your top level
+ screens as well as important lower-level screens.
+</div>
+
+<div class="layout-content-row">
+ <div class="layout-content-col span-8">
+ <p> To facilitate access to the navigation drawer on navigation hubs, all screens that
+ correspond to an entry in your navigation drawer should show the navigation drawer indicator
+ next to the application icon in the action bar. Touching the app icon causes the navigation
+ drawer to slide in from the left. </p>
+ <p> All other lower-level screens show the traditional Up indicator next to the application
+ icon. The drawer is still accessible with an edge-swipe, but is not featured in the action bar.</p>
+ </div>
+ <div class="layout-content-col span-5">
+ <img src="{@docRoot}design/media/navigation_drawer_indicator_big.png">
+ <div class="figure-caption">
+ App icon with navigation drawer indicator.
+ </div>
+ </div>
+</div>
+
+
+<h2 id="Content">Content of the Navigation Drawer</h2>
+
+<p> Keep the content of the navigation drawer focused on app navigation. Expose the navigation
+hubs of your app as list items inside the navigation drawer - one item per row.
+
+<div class="layout-content-row">
+ <div class="layout-content-col span-8">
+ <h4>Titles, icons, and counters</h4>
+ <p> You can structure navigation targets by adding titles. The titles are not interactive,
+ but just organize navigation targets into functional topics. If you have many navigation
+ targets, use titles to orient the user within the drawer.</p>
+ <p> Navigation targets can have optional leading icons as well as trailing counters. Use
+ the counters to inform users about a changed state of data in the corresponding view.</p>
+ </div>
+ <div class="layout-content-col span-5">
+ <img src="{@docRoot}design/media/navigation_drawer_titles_icons.png">
+ <div class="figure-caption">
+ Use titles and icons to organize your drawer.
+ </div>
+ </div>
+</div>
+
+<div class="layout-content-row">
+ <div class="layout-content-col span-8">
+ <img src="{@docRoot}design/media/navigation_drawer_collapse.png">
+ <div class="figure-caption">
+ Collapsible navigation items are split. Use the left side for navigation and the right
+ to collapse and expand items.
+ </div>
+ </div>
+ <div class="layout-content-col span-5">
+ <h4>Collapsible navigation items</h4>
+ <p>If you have many views with some subordinate to others, consider collapsing them into one
+ expandable item to conserve space.
+ The parent in the navigation drawer then turns into a split item. The left side allows
+ navigation to the parent item’s view, and the right side collapses or expands the list of
+ child items. </p>
+ <p> At launch, the initial state of the collapsible items is up to you. As a rule, all
+ top-level view entries of the navigation drawer should be visible. If you have many collapsible
+ items, consider collapsing all items to allow the user to see the top-level views in their
+ entirety.</p>
+ <p> When the user opens the drawer from a lower-level screen, expand the associated branch
+ of the top-level view to give a stronger sense of place and highlight navigation opportunities
+ close to the user’s current
+ location in the app.</p>
+ </div>
+</div>
+
+
+<h2 id="ActionBar">Navigation Drawers and Action Bars</h2>
+
+<p> When the user expands the navigation drawer, the task focus switches to selecting an item
+from the drawer. Because the drawer does not overlay the action bar, users may not realize that
+the items in the action bar do not pertain to the navigation drawer. </p>
+<p> To reduce confusion, adjust the content of the action bar to the following, once the drawer
+is fully expanded:</p>
+<ul>
+ <li>App icon</li>
+ <li>App name</li>
+ <li>Remove actions from the action bar that are contextual to the underlying view (such as
+ Create new, Refresh). You may retain actions with global scope, such as “Search”.</li>
+ <li>Overflow menu with expected navigation targets, such as Settings and Help.</li>
+</ul>
+
+<img src="{@docRoot}design/media/navigation_drawer_open_overflow.png">
+<div class="figure-caption">
+ Clean up the action bar when the drawer is fully expanded. Remove actions that are not needed
+ and display your app's name in the title area.
+</div>
+
+<h4>Actions</h4>
+<div class="layout-content-row">
+ <div class="layout-content-col span-6">
+ <img src="{@docRoot}design/media/navigation_drawer_nav_and_actions.png">
+ <div class="figure-caption">
+ Keep actions on the right side of the action bar and in the overflow
+ </div>
+ </div>
+ <div class="layout-content-col span-6">
+ <p> Don’t place actions in the navigation drawer. Actions belong in the action bar, and the
+ user expects to see them there. Keep in mind that not all applications use the navigation
+ drawer pattern. It may be tempting to expose all your app’s capabilities in a single place,
+ but keep the bigger picture in mind. Place your actions where all apps display them.</p>
+ </div>
+</div>
+<div class="layout-content-row">
+ <div class="layout-content-col span-6">
+ <p> This also applies to common navigation targets, such as access to Help or the app’s
+ Settings. As per style guide convention Help and Settings are always located in the action
+ overflow.</p>
+ </div>
+ <div class="layout-content-col span-6">
+ <img src="{@docRoot}design/media/navigation_drawer_settings_help.png">
+ <div class="figure-caption">
+ Keep Help and Settings in the overflow.
+ </div>
+ </div>
+</div>
+
+
+<h4>Contextual action bars</h4>
+<p> Sometimes the user will be in a state where a contextual action bar (CAB) appears instead
+of the app’s action bar. This typically happens when the user selects text or selects multiple
+items after a press-and-hold gesture. While the CAB is visible, you should still allow the
+user to open the navigation drawer using an edge swipe. However, replace the CAB with the
+standard action bar while the navigation drawer is open. When the user dismisses the drawer,
+re-display the CAB.</p>
+
+<img src="{@docRoot}design/media/navigation_drawer_CAB.png">
+<div class="figure-caption">
+ Hide contextual action bars while the drawer is visible.
+</div>
+
+<p>If the user navigates away from a view with selected content, deselect the content before
+before navigating to the new view.</p>
+
+
+<h2 id="Interaction">Interaction Details</h2>
+
+<h4>Introduce the user to the drawer at first use</h4>
+<p> Upon first launch of your app, introduce the user to the navigation drawer by
+automatically opening it. This ensures that users know about the navigation drawer and prompts
+them to learn about the structure of your app by exploring its content. Continue showing the
+drawer upon subsequent launches until the user actively expands the navigation drawer manually.
+Once you know that the user understands how to open the drawer, launch the app with the
+navigation drawer closed. </p>
+
+<img src="{@docRoot}design/media/navigation_drawer_first_run.png">
+<div class="figure-caption">
+ At first use, show the navigation drawer automatically to help the user learn the
+ functionality and structure of your app.
+</div>
+
+<h4>Give the user a quick peek</h4>
+<p> If the user touches the very left edge of the screen (within 20 dp from the left), have the
+drawer peek out as soon as the finger makes contact with the display. This promotes accidental
+discovery and provides richer feedback. </p>
+
+<img src="{@docRoot}design/media/navigation_drawer_peek.png">
+<div class="figure-caption">
+ The navigation drawer peeks out when the user touches the very left edge of the screen.
+</div>
+
+<h4>Highlights</h4>
+<p> When you open the navigation drawer from a screen that is represented inside the drawer,
+highlight its entry in the drawer. Vice versa, if you open the drawer from a screen that is
+not listed in the drawer, none of the items of the drawer should be highlighted.</p>
+
+
+<h2 id="ImpactOnNav">Impact of Drawer on Overall App Navigation</h2>
+
+<p>The navigation drawer is an alternative to other top-level navigation patterns. To make apps
+with navigation drawers work consistently with apps that use a tab or spinner pattern, remember
+that all navigation requirements for system Back and Up apply.</p>
+<p>Pay special attention to the following situations:</p>
+
+<h4>System Back at the top level of the app</h4>
+<p>Touching System Back at the app’s top level never opens the navigation drawer. Instead,
+System Back behaves according to the navigation rules for the top level, such as navigating
+to the previous app within the task or navigating to the Home screen.</p>
+
+<img src="{@docRoot}design/media/navigation_drawer_top_out.png">
+<div class="figure-caption">
+ System Back does not show the drawer, but behaves according to the navigation rules for
+ the top level.
+</div>
+
+<h4>System Back after cross navigation to lower hierarchy levels</h4>
+<p>If the user navigates to a lower hierarchy screen from the navigation drawer and the screen
+has a direct parent, then the Back stack is reset and Back points to the target screen’s parent.
+This Back behavior is the same as when a user navigates into an app from a notification.</p>
+
+<img src="{@docRoot}design/media/navigation_drawer_reset_backstack.png">
+<div class="figure-caption">
+ Reset the Back stack if your lower-level navigation target has direct parents.
+</div>
+
+
+<h2 id="Style">Style</h2>
+
+<p>The width of the navigation drawer depends on the content you want to display, but should be
+between a minimum of 240 dp and a maximum of 320 dp. The height of the individual line items
+should not fall below 48 dp. See the layout guideline below for recommendations on padding and
+spacing.</p>
+
+<img src="{@docRoot}design/media/navigation_drawer_layout.png">
+<div class="figure-caption">
+ Layout guidelines for the navigation drawer.
+</div>
+
+
+<p>Pick the drawer background to best match your app’s theme. See the following examples
+for a Holo light and a Holo dark themed drawer.</p>
+
+<img src="{@docRoot}design/media/navigation_drawer_holo_dark_light.png">
+<div class="figure-caption">
+ Navigation drawers in Holo light and Holo dark themed apps.
+</div>
+
+
+<h2 id="Checklist">Navigation Drawer Checklist</h2>
+
+<p>Even if you already support a similar navigation drawer, update your drawer to this
+pattern to make sure that:</p>
+<ul>
+ <li>The action bar remains in place and adjusts its content.</li>
+ <li>Your navigation drawer overlays the content.</li>
+ <li>Any view represented in the drawer has a navigation drawer indicator in its action bar
+ that allows the drawer to be opened by touching the app icon.</li>
+ <li>You take advantage of the new visual drawer transition.</li>
+ <li>Any view not represented in the drawer maintains the traditional Up indicator in its action bar.</li>
+ <li>You stay in sync with the general navigation patterns for Up and Back.</li>
+</ul>
+
diff --git a/docs/html/design/patterns/navigation.jd b/docs/html/design/patterns/navigation.jd
index b717884..4da87b9 100644
--- a/docs/html/design/patterns/navigation.jd
+++ b/docs/html/design/patterns/navigation.jd
@@ -2,6 +2,13 @@ page.title=Navigation with Back and Up
page.tags="navigation","activity","task"
@jd:body
+<a class="notice-developers" href="{@docRoot}training/implementing-navigation/index.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Implementing Effective Navigation</p>
+ </div>
+</a>
+
<p>Consistent navigation is an essential component of the overall user experience. Few things frustrate
users more than basic navigation that behaves in inconsistent and unexpected ways. Android 3.0
introduced significant changes to the global navigation behavior. Thoughtfully following the
@@ -203,15 +210,3 @@ with Task B&mdash;the prior context is abandoned in favor of the user's new goal
<p>When your app registers to handle intents with an activity deep within the app's hierarchy,
refer to <a href="#into-your-app">Navigation into Your App via Home Screen Widgets and
Notifications</a> for guidance on how to specify Up navigation.</p>
-
-
-
-<div class="note develop">
-<p><strong>Developer Guide</strong></p>
- <p>For information about how to build your app with proper Up and Back navigation, read
- <a href="{@docRoot}training/implementing-navigation/ancestral.html">Implementing
- Ancestral Navigation</a> and
- <a href="{@docRoot}training/implementing-navigation/temporal.html">Implementing
- Temporal Navigation</a>, respectively.
- </p>
-</div>
diff --git a/docs/html/design/patterns/notifications.jd b/docs/html/design/patterns/notifications.jd
index 3ae827e..018b7b9 100644
--- a/docs/html/design/patterns/notifications.jd
+++ b/docs/html/design/patterns/notifications.jd
@@ -1,7 +1,13 @@
page.title=Notifications
-page.tags="notification"
@jd:body
+<a class="notice-developers" href="{@docRoot}training/notify-user/index.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Notifying the User</p>
+ </div>
+</a>
+
<p>The notification system allows your app to keep the user informed about events, such as new chat messages or a calendar event. Think of notifications as a news channel that alerts the user to important events as they happen or a log that chronicles events while the user is not paying attention.</p>
<h4>New in Jelly Bean</h4>
@@ -258,11 +264,3 @@ develop a widget that they can choose to place on their home screen.</p>
</div>
</div>
-
-
-<div class="note develop">
-<p><strong>Developer Guide</strong></p>
- <p>For information about how to build notifications, see the
- <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Notifications</a>
- API guide.</p>
-</div>
diff --git a/docs/html/design/patterns/selection.jd b/docs/html/design/patterns/selection.jd
index d16e86c..973ffde 100644
--- a/docs/html/design/patterns/selection.jd
+++ b/docs/html/design/patterns/selection.jd
@@ -2,6 +2,13 @@ page.title=Selection
page.tags="actionmode","navigation","contextual"
@jd:body
+<a class="notice-developers" href="{@docRoot}guide/topics/ui/menus.html#context-menu">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Menus: Creating Contextual Menus</p>
+ </div>
+</a>
+
<p>Android 3.0 changed the <em>long press</em> gesture&mdash;that is, a touch that's held in the same position for a moment&mdash;to be the global gesture to select data.. This affects the way you should
handle multi-select and contextual actions in your apps.</p>
diff --git a/docs/html/design/patterns/settings.jd b/docs/html/design/patterns/settings.jd
index 4748e48..fa3e538 100644
--- a/docs/html/design/patterns/settings.jd
+++ b/docs/html/design/patterns/settings.jd
@@ -2,6 +2,13 @@ page.title=Settings
page.tags="preferences","sharedpreferences"
@jd:body
+<a class="notice-developers" href="{@docRoot}guide/topics/ui/settings.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Settings</p>
+ </div>
+</a>
+
<p>Settings is a place in your app where users indicate their preferences for how your app should
behave. This benefits users because:</p>
@@ -681,13 +688,6 @@ it doesn't mean anything to most users and would have taken up a lot of space.</
</div>
-<div class="note develop">
-<p><strong>Developer Guide</strong></p>
- <p>For information about how to build a settings interface, see the
- <a href="{@docRoot}guide/topics/ui/settings.html">Settings</a>
- API guide.</p>
-</div>
-
<h2 id="checklist">Checklist</h2>
<ul>
diff --git a/docs/html/design/patterns/swipe-views.jd b/docs/html/design/patterns/swipe-views.jd
index f18fc63..630a4b9 100644
--- a/docs/html/design/patterns/swipe-views.jd
+++ b/docs/html/design/patterns/swipe-views.jd
@@ -2,6 +2,13 @@ page.title=Swipe Views
page.tags="viewpager","navigation","tabs"
@jd:body
+<a class="notice-developers" href="{@docRoot}training/implementing-navigation/lateral.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>Creating Swipe Views with Tabs</p>
+ </div>
+</a>
+
<p>Efficient navigation is one of the cornerstones of a well-designed app. While apps are generally
built in a hierarchical fashion, there are instances where horizontal navigation can flatten
vertical hierarchies and make access to related data items faster and more enjoyable. Swipe views
@@ -79,12 +86,3 @@ using the swipe gesture to navigate to the next/previous detail view.</p>
</div>
</div>
-
-<div class="note develop">
-<p><strong>Developer Guide</strong></p>
- <p>For information about how to create swipe views, read
- <a href="{@docRoot}training/implementing-navigation/lateral.html">Implementing Lateral Navigation</a>.
- </p>
-</div>
-
-
diff --git a/docs/html/design/patterns/widgets.jd b/docs/html/design/patterns/widgets.jd
index 3152e91..87ebbb9 100644
--- a/docs/html/design/patterns/widgets.jd
+++ b/docs/html/design/patterns/widgets.jd
@@ -2,6 +2,13 @@ page.title=Widgets
page.tags="appwidget","home"
@jd:body
+<a class="notice-developers" href="{@docRoot}guide/topics/appwidgets/index.html">
+ <div>
+ <h3>Developer Docs</h3>
+ <p>App Widgets</p>
+ </div>
+</a>
+
<p>Widgets are an essential aspect of home screen customization. You can imagine them as "at-a-glance" views of an app's most important data and functionality that is accessible right from the user's home screen. Users can move widgets across their home screen panels, and, if supported, resize them to tailor the amount of information within a widget to their preference.</p>
<h2>Widget types</h2>
@@ -124,13 +131,6 @@ A music player widget is primarily a control widget, but also keeps the user inf
</div>
-<div class="note develop">
-<p><strong>Developer Guide</strong></p>
- <p>For information about how to build widgets for the home screen, see the
- <a href="{@docRoot}guide/topics/appwidgets/index.html">App Widgets</a>
- API guide.</p>
-</div>
-
<h2>Checklist</h2>
<ul>
<li>Focus on small portions of glanceable information on your widget. Expand on the information in your app.</li>
diff --git a/docs/html/develop/index.jd b/docs/html/develop/index.jd
index 0cb2635..e4dd2cb 100644
--- a/docs/html/develop/index.jd
+++ b/docs/html/develop/index.jd
@@ -33,19 +33,35 @@ position:absolute;top:50%;left:0;width:100%;z-index:-1;text-align:center;display
<li class="item carousel-home">
<div class="col-8">
+ <img src="{@docRoot}images/google/gps-location.png"
+class="play no-shadow no-transform" style="margin:0 0 0 70px;height:230px;width:340px" />
+ </div>
+ <div class="content-right col-6" style="width:350px">
+ <h2>New Location APIs from Google</h2>
+ <p>The latest version of Google Play services includes new APIs that provide more
+ efficient and immediate user location data on devices running Android 2.2
+ and higher. Features include geofencing APIs, user activity recognition, and
+ power-efficient location updates.</p>
+ <p><a
+href="{@docRoot}google/play-services/location.html" class="button">Read more</a></p>
+ </div>
+ </li>
+
+ <li class="item carousel-home">
+ <div class="col-8">
<img src="{@docRoot}images/google/gps-plus-signin-hero.jpg"
class="play no-shadow no-transform" style="margin:0 0 0 40px;max-height:250px;height:250px;
max-width:409px;width:409px" />
</div>
<div class="content-right col-6" style="width:350px">
- <h2>Google+ Sign-in for your Android Apps</h2>
- <p>Google+ Sign-In is an easy, trusted way to sign a user into your app,
- and get more Android installs when people visit your website.
- When users sign in with Google on the web, they have the option to instantly
- install your Android app without ever leaving your website.</p>
+ <h2>New Cross-Platform Single Sign On</h2>
+ <p>Google+ Sign-In is an easy, trusted way to sign a user into your app.
+ Now it's even more seamless. A user can sign in to your app on one device and
+ pick it up on another&mdash;without signing in again. Best of all, it's built
+ into Google+ Sign-in, so there's no change needed in your app.</p>
<p><a
href="{@docRoot}google/play-services/plus.html" class="button">Read more</a></p>
- </div>
+ </div>
</li>
<li class="item carousel-home">
@@ -92,19 +108,6 @@ href="{@docRoot}google/play/billing/v2/billing_subscriptions.html#trials">Read
more</a></p>
</div>
</li>
- <li class="item carousel-home">
- <div class="col-8">
- <img
-src="//lh4.ggpht.com/-MgN5DnoO5XU/UHYGYzTcAOI/AAAAAAAABs4/jTS7sKkfBcM/s1600/pubsites.png" class="play"></div>
- <div class="content-right col-6">
- <p class="title-intro">From the blog:</p>
- <h2>New Google Play Developer Console</h2>
- <p>All developers can now try the <strong>new Google Play Developer Console</strong>. With a streamlined publishing flow, new language options, and new user ratings statistics, you’ll have better tools for delivering great Android apps that delight users.</p>
- <p><a
-href="http://android-developers.blogspot.com/2012/10/new-google-play-developer-console.html" class="button">Read
-more</a></p>
- </div>
- </li>
</ul>
</div>
</div>
@@ -121,6 +124,16 @@ more</a></p>
<div class="feed-frame">
<!-- DEVELOPER NEWS -->
<ul>
+ <li><a href="//android-developers.blogspot.com/2013/05/new-ways-to-optimize-your-business-in.html">
+ <div class="feed-image" style="background:url('//4.bp.blogspot.com/-VmHMT66JjxU/UZZdfPUaJsI/AAAAAAAACQc/kDx5-Ep5YRo/s1600/framed_designed-tablets.png') no-repeat 0 0;background-size:180px"></div>
+ <h4>New Ways to Optimize Your Business in Google Play</h4>
+ <p>Many of you have invested in making great tablet experiences for your users, and we want to ensure that that work pays off...</p>
+ </a></li>
+ <li><a href="//android-developers.blogspot.com/2013/05/android-studio-ide-built-for-android.html">
+ <div class="feed-image" style="background:url('//1.bp.blogspot.com/-u5dfSsMOMC0/UZO_5DC_W9I/AAAAAAAACM8/YCMn15HPzpE/s320/Studio_table.png') no-repeat 0 0;background-size:180px"></div>
+ <h4>Android Studio: An IDE built for Android</h4>
+ <p>To develop Android Studio, we cooperated with JetBrains, creators of one of the most advanced Java IDEs available today...</p>
+ </a></li>
<li><a href="//android-developers.blogspot.com/2013/01/verifying-back-end-calls-from-android.html">
<div class="feed-image" style="background:url('//lh4.ggpht.com/7z4NItEg-X21zvFGAarKonk-VaysBYthJ30u1JjaQ0-5fjyHNawnmoNeG--4FCACog=w124') no-repeat 0 0"></div>
<h4>Verifying Back-End Calls from Android Apps</h4>
@@ -131,16 +144,6 @@ more</a></p>
<h4>Daydream: Interactive Screen Savers</h4>
<p>Daydream is an interactive screen-saver mode introduced in Android 4.2. Learn how to add Daydreams to your apps...</p>
</a></li>
- <li><a href="//android-developers.blogspot.com/2012/11/designing-for-tablets-were-here-to-help.html">
- <div class="feed-image" style="background:url('//developer.android.com/design/media/multipane_expand.png') no-repeat 0 0; background-position:right top;"></div>
- <h4>Designing for Tablets?</h4>
- <p>Essential resources for everyone in the app development pipeline—from product managers, to designers, to developers, and QA engineers...</p>
- </a></li>
- <li><a href="//android-developers.blogspot.com/2012/12/in-app-billing-version-3.html">
- <div class="feed-image" style="background:url('//developer.android.com/images/iab-thumb.png') no-repeat 0 0;background-position:center right;"></div>
- <h4>In-app Billing Version 3 Now Available</h4>
- <p>A new version of In-app Billing is available that lets you sell digital goods in your app with just a few lines of code...</p>
- </a></li>
</ul>
<!-- FEATURED DOCS -->
<ul>
@@ -265,7 +268,7 @@ function renderVideoPlaylists(data) {
if (feed.entry.length > MAX_LIST_LENGTH) {
// add item to go to youtube for playlist
- $ulVideos.append('<li class="more"><a href="//www.youtube.com/playlist?list=PL' + playlistId + '">More &raquo;</a></li>');
+ $ulVideos.append('<li class="more"><a href="//www.youtube.com/playlist?list=' + playlistId + '">More &raquo;</a></li>');
}
$liPlaylist.append($ulVideos);
@@ -315,14 +318,14 @@ var playlists = {
'designinaction' : {
'ids': ["PLWz5rJ2EKKc8j2B95zGMb8muZvrIy-wcF"]
},
- 'about' : {
- 'ids': ["PL611F8C5DBF49CEC6"]
+ 'bizdevbytes' : {
+ 'ids': ["PLWz5rJ2EKKc8-Osr0TuHyTMEhKV0xJ6ql"]
},
'developersstrikeback' : {
'ids': ["PLWz5rJ2EKKc8nhhIOieejm1PxYHmPkIPh"]
},
'googleio' : {
- 'ids': ["PL4C6BCDE45E05F49E"]
+ 'ids': ["PLWz5rJ2EKKc9WGUwq2gQ-coU3fSyexgOx"]
}
};
@@ -333,7 +336,7 @@ function showVideosPlaylists() {
for (var i in ids) {
var script = "<script type='text/javascript' src='//gdata.youtube.com/feeds/api/playlists/"
+ ids[i] +
- "?v=2&alt=json-in-script&max-results=50&callback=renderVideoPlaylists&orderby=published'><\/script>";
+ "?v=2&alt=json-in-script&max-results=50&callback=renderVideoPlaylists&orderby=position'><\/script>";
$("body").append(script);
}
}
@@ -345,7 +348,7 @@ function showDevelopersLivePlaylist() {
var playlistId = "PLWz5rJ2EKKc_XOgcRukSoKKjewFJZrKV0"; /* DevBytes */
var script = "<script type='text/javascript' src='//gdata.youtube.com/feeds/api/playlists/"
+ playlistId +
- "?v=2&alt=json-in-script&max-results=10&callback=renderDevelopersLivePlaylist&orderby=reversedPosition'><\/script > ";
+ "?v=2&alt=json-in-script&max-results=10&callback=renderDevelopersLivePlaylist&orderby=position'><\/script > ";
$("body").append(script);
}
diff --git a/docs/html/distribute/googleplay/quality/tablet.jd b/docs/html/distribute/googleplay/quality/tablet.jd
index f65cf93..03c180b 100644
--- a/docs/html/distribute/googleplay/quality/tablet.jd
+++ b/docs/html/distribute/googleplay/quality/tablet.jd
@@ -822,7 +822,7 @@ the left navigation.</p>
<div class="sidebox-wrapper">
<div class="sidebox">
-<h2 style="line-height:1em;">How to Send Feedback</h2>
+<h2 style="line-height:1em;">How to send feedback</h2>
<p>Please use the link below to send
feedback or request a manual review of your Optimization Tips.</p>
@@ -830,9 +830,8 @@ feedback or request a manual review of your Optimization Tips.</p>
<p>Make sure to read the relevant sections of the Tablet App Quality
Guidelines prior to sending feedback.</p>
-<p><strong><a href="https://support.google.com/googleplay/android-developer/contact/tabletf"
-target="_googleplay" style="white-space:nowrap">Tablet Optimization
-Tips Feedback Form &raquo;</a></strong></p>
+<p><strong><a href="https://support.google.com/googleplay/android-developer/contact/tabletq"
+target="_googleplay" style="white-space:nowrap">Designed for Tablets Contact Form &raquo;</a></strong></p>
</div>
</div>
@@ -845,13 +844,12 @@ items in the Optimization Tips page.</p>
to visit the Optimization Tips page to see how your app is doing
against the basic checks. If there are any issues listed, we
recommend addressing them in your app and uploading a new binary for
-distribution, if needed.</p>
+distribution, if needed. </p>
<p>If the Optimization Tips page lists "To Do" issues that you feel don't
apply to your app or affect its quality on tablets, please notify us
-using the <a href="https://support.google.com/googleplay/android-developer/contact/tabletf"
-target="_googleplay" style="white-space:nowrap">Tablet Optimization
-Tips Feedback Form</a>. We
+using the <a href="https://support.google.com/googleplay/android-developer/contact/tabletq"
+target="_googleplay" style="white-space:nowrap">Designed for Tablets Contact Form &raquo;</a>. We
will review your app and update your Optimization Tips page as
appropriate.</p>
diff --git a/docs/html/google/backup/signup.jd b/docs/html/google/backup/signup.jd
index 70f7de2..550d590 100644
--- a/docs/html/google/backup/signup.jd
+++ b/docs/html/google/backup/signup.jd
@@ -1,4 +1,5 @@
page.title=Register for Android Backup Service
+excludeFromSuggestions=true
@jd:body
diff --git a/docs/html/google/backup/terms.jd b/docs/html/google/backup/terms.jd
index decb0d8..e5b00a4 100644
--- a/docs/html/google/backup/terms.jd
+++ b/docs/html/google/backup/terms.jd
@@ -1,4 +1,5 @@
page.title=Android Backup Service Terms of Service
+excludeFromSuggestions=true
@jd:body
diff --git a/docs/html/google/gcm/index.jd b/docs/html/google/gcm/index.jd
index f9c3ed3..aeba86f 100644
--- a/docs/html/google/gcm/index.jd
+++ b/docs/html/google/gcm/index.jd
@@ -1,10 +1,11 @@
page.title=Google Cloud Messaging for Android
+page.tags="gcm"
header.hide=1
@jd:body
<div class="landing-banner">
-
+
<div class="col-5" style="min-height:100px">
<img src="{@docRoot}images/gcm/gcm-logo.png" />
</div>
@@ -15,7 +16,7 @@ header.hide=1
Google Cloud Messaging for Android (GCM) is a service that allows you to send data
from your server to your users' Android-powered device, and also to receive messages from devices on the same connection. The GCM service handles all aspects of queueing of messages and delivery to the target Android application running on the target device. GCM is completely free no matter how big your messaging needs are, and there are no quotas.
</p>
-
+
</div>
</div>
@@ -27,12 +28,12 @@ from your server to your users' Android-powered device, and also to receive mess
message telling your app there is new data to be fetched from the
server (for instance, a movie uploaded by a friend), or it could be a message containing
up to 4kb of payload data (so apps like instant messaging can consume the message directly). <a href="{@docRoot}google/gcm/gcm.html">GCM Architectural Overview.</a></p>
-
+
<h4>Send "send-to-sync" messages</h4>
- <p>A send-to-sync (collapsible) message is often a "tickle" that tells a mobile application to sync data from the server. For example, suppose you have an email application. When a user receives new email on the server, the server pings the mobile application with a "New mail" message. This tells the application to sync to the server to pick up the new email.
+ <p>A send-to-sync (collapsible) message is often a "tickle" that tells a mobile application to sync data from the server. For example, suppose you have an email application. When a user receives new email on the server, the server pings the mobile application with a "New mail" message. This tells the application to sync to the server to pick up the new email.
<a href="{@docRoot}google/gcm/adv.html#s2s">Send-to-sync messages</a>.</p>
</a>
-
+
<h4>Send messages with payload</h4>
<p>Unlike a send-to-sync message, every "message with payload" (non-collapsible message) is delivered. The payload the message contains can be up to 4kb.
<a href="{@docRoot}google/gcm/adv.html#payload">Messages with payload</a>.</p>
@@ -45,7 +46,7 @@ up to 4kb of payload data (so apps like instant messaging can consume the messag
<p>Streamlined registration makes it simple and fast to add GCM support to your Android app. <a href="{@docRoot}google/gcm/gs.html">Learn more &raquo;</a></p>
<h4>Upstream messaging over XMPP</h4>
<p>GCM's Cloud Connection Service (CCS) lets you communicate with Android devices over a persistent XMPP connection. The primary advantages of CCS are speed, and the ability to receive upstream messages (that is, messages from a device to the cloud). You can use the service in tandem with existing GCM APIs. Use <a href="https://services.google.com/fb/forms/gcm/">this form</a> to sign up for CCS. <a href="{@docRoot}google/gcm/ccs.html">Learn more &raquo;</a></p>
-
+
<h4>Seamless multi-device messaging</h4>
<p>Maps a single user to a notification key, which you can then use to send a single message to multiple devices owned by the user. Use <a href="https://services.google.com/fb/forms/gcm/">this form</a> to sign up for User Notifications. <a href="{@docRoot}google/gcm/notifications.html">Learn more &raquo;</a></p>
</div>
diff --git a/docs/html/google/play-services/location.jd b/docs/html/google/play-services/location.jd
index ddaa890..1cdd247 100644
--- a/docs/html/google/play-services/location.jd
+++ b/docs/html/google/play-services/location.jd
@@ -1,5 +1,5 @@
page.title=Location APIs
-page.tags="location","geofence", "geofencing", "activity recognition", "activity detection", "gps"
+page.tags="location","geofence", "geofencing", "gps"
header.hide=1
@jd:body
@@ -93,4 +93,4 @@ header.hide=1
</li>
</ul>
</div>
-</div> \ No newline at end of file
+</div>
diff --git a/docs/html/guide/appendix/media-formats.jd b/docs/html/guide/appendix/media-formats.jd
index feacdc6..2342087 100644
--- a/docs/html/guide/appendix/media-formats.jd
+++ b/docs/html/guide/appendix/media-formats.jd
@@ -1,4 +1,5 @@
page.title=Android Supported Media Formats
+page.tags="video","audio","mpeg","mp4","m4a","mp3","3gp","3gpp","flac","wave","wav"
@jd:body
<div id="qv-wrapper">
diff --git a/docs/html/guide/topics/location/strategies.jd b/docs/html/guide/topics/location/strategies.jd
index f5f61a0..f1eb66e 100644
--- a/docs/html/guide/topics/location/strategies.jd
+++ b/docs/html/guide/topics/location/strategies.jd
@@ -1,7 +1,5 @@
page.title=Location Strategies
excludeFromSuggestions=true
-page.tags="geolocation","maps","mapview"
-
@jd:body
<div id="tb-wrapper">
diff --git a/docs/html/guide/topics/media/camera.jd b/docs/html/guide/topics/media/camera.jd
index 8ebb349..e48109a 100644
--- a/docs/html/guide/topics/media/camera.jd
+++ b/docs/html/guide/topics/media/camera.jd
@@ -1,5 +1,5 @@
page.title=Camera
-page.tags="mediarecorder"
+page.tags="photo","video","picture","mediarecorder"
@jd:body
<div id="qv-wrapper">
diff --git a/docs/html/images/home/io-gdl-2013.png b/docs/html/images/home/io-gdl-2013.png
index 78b6820..ec3b4ff 100644
--- a/docs/html/images/home/io-gdl-2013.png
+++ b/docs/html/images/home/io-gdl-2013.png
Binary files differ
diff --git a/docs/html/index.jd b/docs/html/index.jd
index c9e508e..0799802 100644
--- a/docs/html/index.jd
+++ b/docs/html/index.jd
@@ -14,17 +14,18 @@ page.metaDescription=The official site for Android developers. Provides the Andr
<ul>
<li class="item carousel-home">
<div class="content-left col-10">
- <a href="http://goo.gl/9lM2d">
+ <a href="https://developers.google.com/live/android/browse">
<img src="{@docRoot}images/home/io-gdl-2013.png" style="margin:60px 0 0">
</a>
</div>
<div class="content-right col-5">
- <h1>Google I/O Live Stream</h1>
- <p>Watch Android sessions live from Google I/O 2013. Hear about the latest in
- Android straight from the source.</p>
- <p>Brought to you by
+ <h1>Watch the Android talks from Google I/O</h1>
+ <p>If you weren't able to attend Google I/O in person or couldn't make it
+ to all the talks, you can catch up on the action
+ with all the recordings, brought to you by
<a href="http://developers.google.com/live">Google Developers Live</a>.</p>
- <p><a href="http://goo.gl/9lM2d" class="button">Tune in now</a></p>
+ <p><a href="https://developers.google.com/live/android/browse" class="button"
+ >See the Android talks</a></p>
</div>
</li>
<li class="item carousel-home">
diff --git a/docs/html/sdk/exploring.jd b/docs/html/sdk/exploring.jd
index e8d8e37..9323f2e 100644
--- a/docs/html/sdk/exploring.jd
+++ b/docs/html/sdk/exploring.jd
@@ -1,4 +1,5 @@
page.title=Exploring the SDK
+excludeFromSuggestions=true
walkthru=1
@jd:body
diff --git a/docs/html/sdk/installing/installing-adt.jd b/docs/html/sdk/installing/installing-adt.jd
index 8d47f4e..4286db1 100644
--- a/docs/html/sdk/installing/installing-adt.jd
+++ b/docs/html/sdk/installing/installing-adt.jd
@@ -106,13 +106,13 @@ href="{@docRoot}distribute/googleplay/publish/localizing.html#gp-trans">Purchase
<li>In Eclipse, select <strong>Help</strong> &gt; <strong>Install New
Software</strong>.</li>
<li>Click <strong>Add</strong>, in the top-right corner.</li>
- <li>In the Add Repository dialog that appears, enter "Translation Manager Plugin" for the <em>Name</em> and the
-following URL for the <em>Location</em>:
+ <li>In the Add Repository dialog that appears, enter a repository name for the <em>Name</em>
+ and the following URL for the <em>Location</em>:
<pre>https://dl.google.com/alt/</pre>
</li>
<li>Click <strong>OK</strong>.
- <li>In the Available Software dialog, select the checkbox next to Translation Manager Plugin and click
-<strong>Next</strong>.</li>
+ <li>In the Available Software dialog, select the checkbox next to <strong>Android Developer Tools
+ - Translation Manager</strong> and click <strong>Next</strong>.</li>
<li>In the next window, you'll see a list of the tools to be downloaded. Click
<strong>Next</strong>. </li>
<li>Read and accept the license agreements, then click <strong>Finish</strong>.
diff --git a/docs/html/sdk/installing/migrate.jd b/docs/html/sdk/installing/migrate.jd
index ea5a648..d988a95 100644
--- a/docs/html/sdk/installing/migrate.jd
+++ b/docs/html/sdk/installing/migrate.jd
@@ -19,8 +19,8 @@ build files</strong>.</li>
<strong>Finish</strong>.</li>
</ol>
-<p>Your selected projects remain in the same location but now contain a {@code .gradle}
-build file and are ready for Android Studio.</p>
+<p>Your selected projects remain in the same location but now contain a {@code build.gradle}
+file and are ready for Android Studio.</p>
<h2 id="Export">Import into Android Studio</h2>
diff --git a/docs/html/sdk/installing/studio.jd b/docs/html/sdk/installing/studio.jd
index 856121a..f3e181e 100644
--- a/docs/html/sdk/installing/studio.jd
+++ b/docs/html/sdk/installing/studio.jd
@@ -1,4 +1,5 @@
page.title=Getting Started with Android Studio
+page.tags="studio"
@jd:body
@@ -252,36 +253,36 @@ download (or continue to use) the
<td>Windows</td>
<td>
<a onclick="return onDownload(this)" id="win-studio"
- href="http://dl.google.com/android/studio/android-studio-bundle-130.676883-windows.exe">
- android-studio-bundle-130.676883-windows.exe
+ href="http://dl.google.com/android/studio/android-studio-bundle-130.677228-windows.exe">
+ android-studio-bundle-130.677228-windows.exe
</a>
</td>
- <td>381763627 bytes</td>
- <td>592129b7aee608ad706752369d99a2a1</td>
+ <td>382109250 bytes</td>
+ <td>eb90d50a6ccd975bf19c6930c2006300</td>
</tr>
<tr>
<td><nobr>Mac OS X</nobr></td>
<td>
<a onclick="return onDownload(this)" id="mac-studio"
- href="http://dl.google.com/android/studio/android-studio-bundle-130.676883-mac.dmg">
- android-studio-bundle-130.676883-mac.dmg
+ href="http://dl.google.com/android/studio/android-studio-bundle-130.677228-mac.dmg">
+ android-studio-bundle-130.677228-mac.dmg
</a>
</td>
- <td>371232906 bytes</td>
- <td>16192870d1a1e99e2d96d5fa9fc3fccb</td>
+ <td>371607412 bytes</td>
+ <td>119e8e7170f451bec82cfa321e53d780</td>
</tr>
<tr>
<td>Linux</td>
<td>
<a onclick="return onDownload(this)" id="linux-studio"
- href="http://dl.google.com/android/studio/android-studio-bundle-130.676883-linux.tgz">
- android-studio-bundle-130.676883-linux.tgz
+ href="http://dl.google.com/android/studio/android-studio-bundle-130.677228-linux.tgz">
+ android-studio-bundle-130.677228-linux.tgz
</a>
</td>
- <td>400151208 bytes</td>
- <td>2b25f4ee51a2e076b0ede6da94508761</td>
+ <td>400487529 bytes</td>
+ <td>62b9ce75e4b74b7c1236ea2f1f99da34</td>
</tr>
</table>
@@ -300,13 +301,35 @@ download (or continue to use) the
<li>Install Android Studio and the SDK tools:
<p><b>Windows:</b></p>
<ol>
- <li>Launch the downloaded EXE file, {@code android-studio-bundle-&lt;version&gt;.exe}.
+ <li>Launch the downloaded EXE file, {@code android-studio-bundle-&lt;version&gt;.exe}.</li>
<li>Follow the setup wizard to install Android Studio.
+
+ <div class="caution"><p><strong>Known issue:</strong>
+ On some Windows systems, the launcher script does not find where Java is installed.
+ If you encounter this problem,
+ you need to set an environment variable indicating the correct location.</p>
+ <p>Select <strong>Start menu > Computer > System Properties >
+ Advanced System Properties</strong>. Then open <strong>Advanced tab > Environment
+ Variables</strong> and add a new system variable <code>JAVA_HOME</code> that points to
+ your JDK folder, for example <code>C:\Program Files\Java\jdk1.7.0_21</code>.</p>
+ </div>
+ </li>
+
</ol>
<p><b>Mac OS X:</b></p>
<ol>
- <li>Open the downloaded DMG file, {@code android-studio-bundle-&lt;version&gt;.dmg}.
+ <li>Open the downloaded DMG file, {@code android-studio-bundle-&lt;version&gt;.dmg}.</li>
<li>Drag and drop Android Studio into the Applications folder.
+
+ <div class="caution"><p><strong>Known issue:</strong>
+ Depending on your security settings, when you attempt to open Android Studio, you might
+ see a warning that says the package is damaged and should be moved to the trash. If this
+ happens, go to <strong>System Preferences > Security &amp; Privacy</strong> and under
+ <strong>Allow applications downloaded from</strong>, select <strong>Anywhere</strong>.
+ Then open Android Studio again.</p>
+ </div>
+ </li>
+
</ol>
<p><b>Linux:</b></p>
<ol>
@@ -332,6 +355,9 @@ the {@code sdk/} directory. For example:</p>
<p>Mac: <code>/Applications/Android\ Studio.app/sdk/</code></p>
</div>
+<p>For a list of some known issues, see <a
+href="http://tools.android.com/knownissues">tools.android.com/knownissues</a>.</p>
+
<h2 id="Start">Starting a Project</h2>
@@ -419,16 +445,18 @@ style="vertical-align:bottom;margin:0;height:19px" /> in the toolbar.</p>
function onDownload(link, button) {
-
+ var $studioLink;
+
/* set text for download button */
if (button) {
+ $studioLink = $("a#"+$(link).attr('href'));
$("#downloadForRealz").html($(link).text());
} else {
+ $studioLink = $(link);
$("#downloadForRealz").html("Download " + $(link).text());
}
- $studioLink = $("a#"+$(link).attr('href'));
- $("#downloadForRealz").attr('href',$studioLink.attr('href'));
+ $("#downloadForRealz").attr('href', $studioLink.attr('href'));
$("#tos").fadeIn('fast');
$("#main").fadeOut('fast');
diff --git a/docs/html/tools/adk/adk.jd b/docs/html/tools/adk/adk.jd
index 049b6e9..1651747 100644
--- a/docs/html/tools/adk/adk.jd
+++ b/docs/html/tools/adk/adk.jd
@@ -1,4 +1,5 @@
page.title=Accessory Development Kit 2011 Guide
+page.tags="adk"
@jd:body
<div id="qv-wrapper">
diff --git a/docs/html/tools/adk/adk2.jd b/docs/html/tools/adk/adk2.jd
index 0b18583..c60e920 100644
--- a/docs/html/tools/adk/adk2.jd
+++ b/docs/html/tools/adk/adk2.jd
@@ -1,4 +1,5 @@
page.title=Accessory Development Kit 2012 Guide
+page.tags="adk"
@jd:body
<div id="qv-wrapper">
diff --git a/docs/html/tools/adk/index.jd b/docs/html/tools/adk/index.jd
index d492e96..e035115 100644
--- a/docs/html/tools/adk/index.jd
+++ b/docs/html/tools/adk/index.jd
@@ -1,4 +1,5 @@
page.title=Accessory Development Kit
+page.tags="adk"
@jd:body
<p>The Accessory Development Kit (ADK) is a reference implementation for hardware manufacturers and
diff --git a/docs/html/tools/extras/support-library.jd b/docs/html/tools/extras/support-library.jd
index 6475e3c..0ec6592 100644
--- a/docs/html/tools/extras/support-library.jd
+++ b/docs/html/tools/extras/support-library.jd
@@ -49,6 +49,45 @@ the Support Package, as denoted by revision number.</p>
<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=""
+/>Support Package, revision 13</a> <em>(May 2013)</em>
+ </p>
+ <div class="toggle-content-toggleme">
+ <dl>
+ <dt>Changes for v4 support library:</dt>
+ <dd>
+ <ul>
+ <li>Added {@link android.support.v4.widget.DrawerLayout} for creating a
+ <a href="{@docRoot}training/implementing-navigation/nav-drawer.html">Navigation
+ Drawer</a> that can be pulled in from the edge of a window.</li>
+ <li>Added {@link android.support.v4.widget.SlidingPaneLayout} widget for creating linked
+ summary and detail views that appropriately adapt to various screen sizes.</li>
+ <li>Added {@link android.support.v4.app.ActionBarDrawerToggle} as a way to tie
+ together the functions of {@link android.support.v4.widget.DrawerLayout} and {@link
+ android.app.ActionBar}.</li>
+ <li>Added {@link android.support.v4.widget.ViewDragHelper} as a new common component
+ for dragging views within a parent view.</li>
+ <li>Added {@link android.support.v4.widget.ScrollerCompat} to provide {@link
+ android.widget.Scroller} and {@link android.widget.OverScroller} compatibility support.
+ </li>
+ <li>Updated {@link android.support.v4.view.ViewPager} to throw an exception if the
+ associated {@link android.support.v4.view.PagerAdapter} class is modified without a call
+ to {@link android.support.v4.view.PagerAdapter#notifyDataSetChanged notifyDataSetChanged()}.
+ </li>
+ <li>Fixed an issue with {@link android.support.v4.view.ViewPager} children drawing sort
+ order.</li>
+ <li>Fixed {@link android.support.v4.view.GestureDetectorCompat} to dispatch missing
+ {@link android.view.GestureDetector.SimpleOnGestureListener#onSingleTapConfirmed} calls
+ between tap timeout and long press events.</li>
+ </ul>
+ </dd>
+ </dl>
+ </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=""
/>Support Package, revision 12</a> <em>(February 2013)</em>
</p>
<div class="toggle-content-toggleme">
diff --git a/docs/html/tools/help/adb.jd b/docs/html/tools/help/adb.jd
index c8afca5..74f6c07 100644
--- a/docs/html/tools/help/adb.jd
+++ b/docs/html/tools/help/adb.jd
@@ -1,6 +1,7 @@
page.title=Android Debug Bridge
parent.title=Tools
parent.link=index.html
+page.tags="adb"
@jd:body
<div id="qv-wrapper">
@@ -101,10 +102,10 @@ option to specify the target device to which the command should be directed. </p
<p class="table-caption"><strong>Table 1.</strong> Available adb commands</p>
<table>
<tr>
- <th>Category</th>
- <th>Command</th>
- <th>Description</th>
- <th>Comments</th>
+ <th>Category</th>
+ <th>Command</th>
+ <th>Description</th>
+ <th>Comments</th>
</tr>
<tr>
@@ -191,7 +192,7 @@ Commands to a Specific Emulator/Device Instance</a>.</td>
<td rowspan="2">Ports and Networking</td>
<td><code>forward&nbsp;&lt;local&gt;&nbsp;&lt;remote&gt;</code></td>
<td>Forwards socket connections from a specified local port to a specified remote port on the emulator/device instance. </td>
-<td>Port specifications can use these schemes:
+<td>Port specifications can use these schemes:
<ul><li><code>tcp:&lt;portnum&gt;</code></li>
<li><code>local:&lt;UNIX domain socket name&gt;</code></li>
<li><code>dev:&lt;character device name&gt;</code></li>
@@ -226,10 +227,10 @@ Commands to a Specific Emulator/Device Instance</a>.</td>
<tr>
<td><code>wait-for-device</code></td>
<td>Blocks execution until the device is online &mdash; that is, until the instance state is <code>device</code>.</td>
-<td>You can prepend this command to other adb commands, in which case adb will wait until the emulator/device instance is connected before issuing the other commands. Here's an example:
+<td>You can prepend this command to other adb commands, in which case adb will wait until the emulator/device instance is connected before issuing the other commands. Here's an example:
<pre class="no-pretty-print">adb wait-for-device shell getprop</pre>
-Note that this command does <em>not</em> cause adb to wait until the entire system is fully booted. For that reason, you should not prepend it to other commands that require a fully booted system. As an example, the <code>install</code> requires the Android package manager, which is available only after the system is fully booted. A command such as
+Note that this command does <em>not</em> cause adb to wait until the entire system is fully booted. For that reason, you should not prepend it to other commands that require a fully booted system. As an example, the <code>install</code> requires the Android package manager, which is available only after the system is fully booted. A command such as
<pre class="no-pretty-print">adb wait-for-device install &lt;app&gt;.apk</pre>
@@ -280,34 +281,34 @@ would issue the <code>install</code> command as soon as the emulator or device i
<p>Before issuing adb commands, it is helpful to know what emulator/device instances are connected to the adb server. You can generate a list of attached emulators/devices using the <code>devices</code> command: </p>
- <pre class="no-pretty-print">adb devices</pre>
+ <pre class="no-pretty-print">adb devices</pre>
<p>In response, adb prints this status information for each instance:</p>
<ul>
- <li>Serial number &mdash; A string created by adb to uniquely identify an emulator/device instance by its
- console port number. The format of the serial number is <code>&lt;type&gt;-&lt;consolePort&gt;</code>.
- Here's an example serial number: <code>emulator-5554</code></li>
- <li>State &mdash; The connection state of the instance may be one of the following:
- <ul>
- <li><code>offline</code> &mdash; the instance is not connected to adb or is not responding.</li>
- <li><code>device</code> &mdash; the instance is now connected to the adb server. Note that this state does not
- imply that the Android system is fully booted and operational, since the instance connects to adb
- while the system is still booting. However, after boot-up, this is the normal operational state of
- an emulator/device instance.</li>
- <li><code>no device</code> &mdash; there is no emulator/device connected.
- </ul>
- </li>
+ <li>Serial number &mdash; A string created by adb to uniquely identify an emulator/device instance by its
+ console port number. The format of the serial number is <code>&lt;type&gt;-&lt;consolePort&gt;</code>.
+ Here's an example serial number: <code>emulator-5554</code></li>
+ <li>State &mdash; The connection state of the instance may be one of the following:
+ <ul>
+ <li><code>offline</code> &mdash; the instance is not connected to adb or is not responding.</li>
+ <li><code>device</code> &mdash; the instance is now connected to the adb server. Note that this state does not
+ imply that the Android system is fully booted and operational, since the instance connects to adb
+ while the system is still booting. However, after boot-up, this is the normal operational state of
+ an emulator/device instance.</li>
+ <li><code>no device</code> &mdash; there is no emulator/device connected.
+ </ul>
+ </li>
</ul>
<p>The output for each instance is formatted like this: </p>
- <pre class="no-pretty-print">[serialNumber] [state]</pre>
+ <pre class="no-pretty-print">[serialNumber] [state]</pre>
<p>Here's an example showing the <code>devices</code> command and its output:</p>
- <pre class="no-pretty-print">adb devices
-List of devices attached
+ <pre class="no-pretty-print">adb devices
+List of devices attached
emulator-5554&nbsp;&nbsp;device
emulator-5556&nbsp;&nbsp;device
emulator-5558&nbsp;&nbsp;device</pre>
@@ -323,13 +324,13 @@ emulator-5558&nbsp;&nbsp;device</pre>
when issuing adb commands. To do so, use the <code>-s</code> option in the commands. The usage
for the <code>-s</code> option is:</p>
- <pre class="no-pretty-print">adb -s &lt;serialNumber&gt; &lt;command&gt; </pre>
-
+<pre class="no-pretty-print">adb -s &lt;serialNumber&gt; &lt;command&gt; </pre>
+
<p>As shown, you specify the target instance for a command using its adb-assigned serial number.
You can use the <code>devices</code> command to obtain the serial numbers of running
emulator/device instances. For example: </p>
- <pre class="no-pretty-print">adb -s emulator-5556 install helloWorld.apk</pre>
+<pre class="no-pretty-print">adb -s emulator-5556 install helloWorld.apk</pre>
<p>Note that, if you issue a command without specifying a target emulator/device instance
while multiple devices are available, adb generates an error.
@@ -377,10 +378,10 @@ commands let you copy arbitrary directories and files to any location in an
emulator/device instance. </p>
<p>To copy a file or directory (and its sub-directories) <em>from</em> the emulator or device, use</p>
-<pre class="no-pretty-print">adb pull &lt;remote&gt; &lt;local&gt;</pre>
+<pre class="no-pretty-print">adb pull &lt;remote&gt; &lt;local&gt;</pre>
<p>To copy a file or directory (and its sub-directories) <em>to</em> the emulator or device, use</p>
- <pre class="no-pretty-print">adb push &lt;local&gt; &lt;remote&gt;</pre>
+ <pre class="no-pretty-print">adb push &lt;local&gt; &lt;remote&gt;</pre>
<p>In the commands, <code>&lt;local&gt;</code> and <code>&lt;remote&gt;</code> refer to the
paths to the target files/directory on your development machine (local) and on the
@@ -397,8 +398,8 @@ emulator/device instance (remote). For example: </p>
<h2 id="shellcommands">Issuing Shell Commands</h2>
-<p>Adb provides a Unix shell that you can use to run a variety of commands on an emulator
-or connected device. The command binaries are stored in the file system of the emulator or device,
+<p>Adb provides a Unix shell that you can use to run a variety of commands on an emulator
+or connected device. The command binaries are stored in the file system of the emulator or device,
at <code>/system/bin/...</code>
<p>Two of the most common command tools are <a href="#am">activity manager</a> ({@code am}) and
@@ -408,11 +409,11 @@ at <code>/system/bin/...</code>
the adb remote shell on the emulator/device. To issue a single command without entering a
remote shell, use the <code>shell</code> command like this: </p>
- <pre class="no-pretty-print">adb [-d|-e|-s &lt;serialNumber&gt;] shell &lt;shell_command&gt;</pre>
-
+ <pre class="no-pretty-print">adb [-d|-e|-s &lt;serialNumber&gt;] shell &lt;shell_command&gt;</pre>
+
<p>Or enter a remote shell on an emulator/device like this:</p>
- <pre class="no-pretty-print">adb [-d|-e|-s &lt;serialNumber&gt;] shell</pre>
+ <pre class="no-pretty-print">adb [-d|-e|-s &lt;serialNumber&gt;] shell</pre>
<p>When you are ready to exit the remote shell, press CTRL+D or type
<code>exit</code>. </p>
@@ -441,8 +442,8 @@ adb shell am start -a android.intent.action.VIEW
<p class="table-caption"><strong>Table 2.</strong> Available activity manager commands</p>
<table>
<tr>
- <th>Command</th>
- <th>Description</th>
+ <th>Command</th>
+ <th>Description</th>
</tr>
<tr>
@@ -641,7 +642,7 @@ screen resolution using a device with a large screen, and vice versa.
<td><code>
display-density &lt;dpi>
</code></td>
-<td>Override emulator/device display density.
+<td>Override emulator/device display density.
This command is helpful for testing your app across different screen densities on high-density
screen environment using a low density screen, and vice versa.
<p>Example:<br><code>am display-density 480</code>
@@ -662,7 +663,7 @@ to-uri &lt;INTENT>
to-intent-uri &lt;INTENT>
</code></td>
<td>Print the given intent specification as an {@code intent:} URI. <p>See the
-<a href="#IntentSpec">Specification for &lt;INTENT> arguments</a>.
+<a href="#IntentSpec">Specification for &lt;INTENT> arguments</a>.
</td>
</tr>
</table>
@@ -688,7 +689,7 @@ specify the intent with the following options:</p>
<dt>{@code -d &lt;DATA_URI>}</dt>
<dd>Specify the intent data URI, such as "content://contacts/people/1".
You can declare this only once.
-
+
<dt>{@code -t &lt;MIME_TYPE>}</dt>
<dd>Specify the intent MIME type, such as "image/png".
You can declare this only once.
@@ -843,8 +844,8 @@ adb shell pm uninstall com.example.MyApp
<p class="table-caption"><strong>Table 3.</strong> Available package manager commands.</p>
<table>
<tr>
- <th>Command</th>
- <th>Description</th>
+ <th>Command</th>
+ <th>Description</th>
</tr>
<tr>
@@ -1097,12 +1098,12 @@ get-max-users
<h3 id="sqlite">Examining sqlite3 databases from a remote shell</h3>
-<p>From an adb remote shell, you can use the
-<a href="http://www.sqlite.org/sqlite.html">sqlite3</a> command-line program to
-manage SQLite databases created by Android applications. The
-<code>sqlite3</code> tool includes many useful commands, such as
-<code>.dump</code> to print out the contents of a table and
-<code>.schema</code> to print the SQL CREATE statement for an existing table.
+<p>From an adb remote shell, you can use the
+<a href="http://www.sqlite.org/sqlite.html">sqlite3</a> command-line program to
+manage SQLite databases created by Android applications. The
+<code>sqlite3</code> tool includes many useful commands, such as
+<code>.dump</code> to print out the contents of a table and
+<code>.schema</code> to print the SQL CREATE statement for an existing table.
The tool also gives you the ability to execute SQLite commands on the fly.</p>
<p>To use <code>sqlite3</code>, enter a remote shell on the emulator instance, as described above, then invoke the tool using the <code>sqlite3</code> command. Optionally, when invoking <code>sqlite3</code> you can specify the full path to the database you want to explore. Emulator/device instances store SQLite3 databases in the folder <code><span chatdir="1"><span chatindex="259474B4B070F261">/data/data/<em>&lt;package_name&gt;</em>/databases</span></span>/</code>. </p>
@@ -1126,7 +1127,7 @@ sqlite&gt; .exit </pre>
<h3 id="monkey">UI/Application Exerciser Monkey</h3>
<p>The Monkey is a program that runs on your emulator or device and generates pseudo-random
-streams of user events such as clicks, touches, or gestures, as well as a number of system-level
+streams of user events such as clicks, touches, or gestures, as well as a number of system-level
events. You can use the Monkey to stress-test applications that you are developing,
in a random yet repeatable manner.</p>
@@ -1135,7 +1136,7 @@ application and sends 500 pseudo-random events to it.</p>
<pre class="no-pretty-print">adb shell monkey -v -p your.package.name 500</pre>
-<p>For more information about command options for Monkey, see the complete
+<p>For more information about command options for Monkey, see the complete
<a href="{@docRoot}tools/help/monkey.html" title="monkey">UI/Application Exerciser Monkey</a> documentation page.</p>
@@ -1155,15 +1156,15 @@ application and sends 500 pseudo-random events to it.</p>
<p class="table-caption"><strong>Table 4.</strong> Some other adb shell commands</p>
<table>
<tr>
- <th>Shell Command</th>
- <th>Description</th>
- <th>Comments</th>
+ <th>Shell Command</th>
+ <th>Description</th>
+ <th>Comments</th>
</tr>
<tr>
<td><code>dumpsys</code></td>
<td>Dumps system data to the screen.</td>
-<td rowspan=4">The <a href="{@docRoot}tools/debugging/ddms.html">Dalvik Debug Monitor Server</a>
+<td rowspan=4">The <a href="{@docRoot}tools/debugging/ddms.html">Dalvik Debug Monitor Server</a>
(DDMS) tool offers integrated debug environment that you may find easier to use.</td>
</tr>
diff --git a/docs/html/tools/help/adt.jd b/docs/html/tools/help/adt.jd
index 18e7443..4dac574 100644
--- a/docs/html/tools/help/adt.jd
+++ b/docs/html/tools/help/adt.jd
@@ -1,4 +1,5 @@
page.title=Android Developer Tools
+page.tags="adt"
@jd:body
<div id="qv-wrapper">
diff --git a/docs/html/tools/publishing/app-signing.jd b/docs/html/tools/publishing/app-signing.jd
index 608780e..1de1fd7 100644
--- a/docs/html/tools/publishing/app-signing.jd
+++ b/docs/html/tools/publishing/app-signing.jd
@@ -466,7 +466,7 @@ the keystore containing your private key.</td>
</tr>
<tr>
<td><code>-sigalg</code></td><td>The name of the signature algorithim to use in signing the APK.
-Use the value {@code MD5withRSA}.</td>
+Use the value {@code SHA1withRSA}.</td>
</tr>
<tr>
<td><code>-digestalg</code></td><td>The message digest algorithim to use in processing the entries
@@ -492,7 +492,7 @@ way, your password is not stored in your shell history.</p></td>
<code>my_application.apk</code>, using the example keystore created above.
</p>
-<pre>$ jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore
+<pre>$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore
my_application.apk alias_name</pre>
<p>Running the example command above, Jarsigner prompts you to provide
diff --git a/docs/html/tools/samples/index.jd b/docs/html/tools/samples/index.jd
index ed416e6..76ba37a 100644
--- a/docs/html/tools/samples/index.jd
+++ b/docs/html/tools/samples/index.jd
@@ -1,5 +1,5 @@
page.title=Samples
-
+page.tags="example","code"
@jd:body
<p>To help you understand some fundamental Android APIs and coding practices, a variety of sample
diff --git a/docs/html/tools/sdk/installing.jd b/docs/html/tools/sdk/installing.jd
index d7f1957..19e8990 100644
--- a/docs/html/tools/sdk/installing.jd
+++ b/docs/html/tools/sdk/installing.jd
@@ -1,4 +1,5 @@
page.title=Installing the SDK
+excludeFromSuggestions=true
@jd:body
diff --git a/docs/html/tools/workflow/app-signing.jd b/docs/html/tools/workflow/app-signing.jd
deleted file mode 100644
index ac45242..0000000
--- a/docs/html/tools/workflow/app-signing.jd
+++ /dev/null
@@ -1,618 +0,0 @@
-page.title=Signing Your Applications
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-
-<h2>Quickview</h2>
-
-<ul>
-<li>All Android apps <em>must</em> be signed</li>
-<li>You can sign with a self-signed key</li>
-<li>How you sign your apps is critical &mdash; read this document carefully</li>
-<li>Determine your signing strategy early in the development process</li>
-</ul>
-
-<h2>In this document</h2>
-
-<ol>
-<li><a href="#signing">Signing Process</a></li>
-<li><a href="#strategies">Signing Strategies</a></li>
-<li><a href="#setup">Basic Setup for Signing</a></li>
-<li><a href="#debugmode">Signing in Debug Mode</a></li>
-<li><a href="#releasemode">Signing Release Mode</a>
- <ol>
- <li><a href="#cert">Obtain a suitable private key</a></li>
- <li><a href="#releasecompile">Compile the application in release mode</a></li>
- <li><a href="#signapp">Sign your application with your private key</a></li>
- <li><a href="#align">Align the final APK package</a></li>
- <li><a href="#ExportWizard">Compile and sign with Eclipse ADT</a></li>
- </ol>
-</li>
-<li><a href="#secure-key">Securing Your Private Key</a></li>
-
-</ol>
-
-<h2>See also</h2>
-
-<ol>
-<li><a href="{@docRoot}tools/publishing/versioning.html">Versioning Your Applications</a></li>
-<li><a href="{@docRoot}tools/publishing/preparing.html">Preparing to Publish</a></li>
-</ol>
-
-</div>
-</div>
-
-<p>The Android system requires that all installed applications be digitally signed with a
-certificate whose private key is held by the application's developer. The Android system uses the
-certificate as a means of identifying the author of an application and establishing trust
-relationships between applications. The certificate is not used to control which applications the
-user can install. The certificate does not need to be signed by a certificate authority: it is
-perfectly allowable, and typical, for Android applications to use self-signed certificates.</p>
-
-<p>The important points to understand about signing Android applications are:</p>
-
-<ul>
- <li>All applications <em>must</em> be signed. The system will not install an application
-on an emulator or a device if it is not signed.</li>
- <li>To test and debug your application, the build tools sign your application with a special debug
- key that is created by the Android SDK build tools.</li>
- <li>When you are ready to release your application for end-users, you must sign it with a suitable
- private key. You cannot publish an application that is signed with the debug key generated
- by the SDK tools.</li>
- <li>You can use self-signed certificates to sign your applications. No certificate authority is
- needed.</li>
- <li>The system tests a signer certificate's expiration date only at install time. If an
-application's signer certificate expires after the application is installed, the application
-will continue to function normally.</li>
- <li>You can use standard tools &mdash; Keytool and Jarsigner &mdash; to generate keys and
-sign your application {@code .apk} files.</li>
- <li>After you sign your application for release, we recommend that you use the
- <code>zipalign</code> tool to optimize the final APK package.</li>
-</ul>
-
-<p>The Android system will not install or run an application that is not signed appropriately. This
-applies wherever the Android system is run, whether on an actual device or on the emulator.
-For this reason, you must <a href="#setup">set up signing</a> for your application before you can
-run it or debug it on an emulator or device.</p>
-
-<h2 id="signing">Signing Process</h3>
-
-<p>The Android build process signs your application differently depending on which build mode you
-use to build your application. There are two build modes: <em>debug mode</em> and <em>release
-mode</em>. You use debug mode when you are developing and testing your application. You use
-release mode when you want to build a release version of your application that you can
-distribute directly to users or publish on an application marketplace such as Google Play.</p>
-
-<p>When you build in <em>debug mode</em> the Android SDK build tools use the Keytool utility
-(included in the JDK) to create a debug key. Because the SDK build tools created the debug key,
-they know the debug key's alias and password. Each time you compile your application in debug mode,
-the build tools use the debug key along with the Jarsigner utility (also included in the JDK) to
-sign your application's <code>.apk</code> file. Because the alias and password are known to the SDK
-build tools, the tools don't need to prompt you for the debug key's alias and password each time
-you compile.</p>
-
-<p>When you build in <em>release mode</em> you use your own private key to sign your application. If
-you don't have a private key, you can use the Keytool utility to create one for you. When you
-compile your application in release mode, the build tools use your private key along with the
-Jarsigner utility to sign your application's <code>.apk</code> file. Because the certificate and
-private key you use are your own, you will have to provide the password for the keystore and key
-alias.</p>
-
-<p>The debug signing process happens automatically when you run or debug your application using
-Eclipse with the ADT plugin. Debug signing also happens automatically when you use the Ant build
-script with the <code>debug</code> option. You can automate the release signing process by using the
-Eclipse Export Wizard or by modifying the Ant build script and building with the
-<code>release</code> option.</p>
-
-<h2 id="strategies">Signing Strategies</h2>
-
-<p>Some aspects of application signing may affect how you approach the development
-of your application, especially if you are planning to release multiple
-applications. </p>
-
-<p>In general, the recommended strategy for all developers is to sign
-all of your applications with the same certificate, throughout the expected
-lifespan of your applications. There are several reasons why you should do so: </p>
-
-<ul>
-<li>Application upgrade &ndash; As you release updates to your application, you
-will want to continue to sign the updates with the same certificate or set of
-certificates, if you want users to upgrade seamlessly to the new version. When
-the system is installing an update to an application, it compares the
-certificate(s) in the new version with those in the existing version. If the
-certificates match exactly, including both the certificate data and order, then
-the system allows the update. If you sign the new version without using matching
-certificates, you will also need to assign a different package name to the
-application &mdash; in this case, the user installs the new version as a
-completely new application. </li>
-
-<li>Application modularity &ndash; The Android system allows applications that
-are signed by the same certificate to run in the same process, if the
-applications so requests, so that the system treats them as a single application.
-In this way you can deploy your application in modules, and users can update
-each of the modules independently if needed.</li>
-
-<li>Code/data sharing through permissions &ndash; The Android system provides
-signature-based permissions enforcement, so that an application can expose
-functionality to another application that is signed with a specified
-certificate. By signing multiple applications with the same certificate and
-using signature-based permissions checks, your applications can share code and
-data in a secure manner. </li>
-
-</ul>
-
-<p>Another important consideration in determining your signing strategy is
-how to set the validity period of the key that you will use to sign your
-applications.</p>
-
-<ul>
-<li>If you plan to support upgrades for a single application, you should ensure
-that your key has a validity period that exceeds the expected lifespan of
-that application. A validity period of 25 years or more is recommended.
-When your key's validity period expires, users will no longer be
-able to seamlessly upgrade to new versions of your application.</li>
-
-<li>If you will sign multiple distinct applications with the same key,
-you should ensure that your key's validity period exceeds the expected
-lifespan of <em>all versions of all of the applications</em>, including
-dependent applications that may be added to the suite in the future. </li>
-
-<li>If you plan to publish your application(s) on Google Play, the
-key you use to sign the application(s) must have a validity period
-ending after 22 October 2033. Google Play enforces this requirement
-to ensure that users can seamlessly upgrade applications when
-new versions are available. </li>
-</ul>
-
-<p>As you design your application, keep these points in mind and make sure to
-use a <a href="#cert">suitable certificate</a> to sign your applications. </p>
-
-<h2 id="setup">Basic Setup for Signing</h2>
-
-<p>Before you begin, make sure that the Keytool utility and Jarsigner utility are available to
-the SDK build tools. Both of these tools are available in the JDK. In most cases, you can tell
-the SDK build tools how to find these utilities by setting your <code>JAVA_HOME</code> environment
-variable so it references a suitable JDK. Alternatively, you can add the JDK version of Keytool and
-Jarsigner to your <code>PATH</code> variable.</p>
-
-<p>If you are developing on a version of Linux that originally came with GNU Compiler for
-Java, make sure that the system is using the JDK version of Keytool, rather than the gcj
-version. If Keytool is already in your <code>PATH</code>, it might be pointing to a symlink at
-<code>/usr/bin/keytool</code>. In this case, check the symlink target to be sure it points
-to the Keytool in the JDK.</p>
-
-<h2 id="debugmode">Signing in Debug Mode</h2>
-
-<p>The Android build tools provide a debug signing mode that makes it easier for you
-to develop and debug your application, while still meeting the Android system
-requirement for signing your APK.
-When using debug mode to build your app, the SDK tools invoke Keytool to automatically create
-a debug keystore and key. This debug key is then used to automatically sign the APK, so
-you do not need to sign the package with your own key.</p>
-
-<p>The SDK tools create the debug keystore/key with predetermined names/passwords:</p>
-<ul>
-<li>Keystore name: "debug.keystore"</li>
-<li>Keystore password: "android"</li>
-<li>Key alias: "androiddebugkey"</li>
-<li>Key password: "android"</li>
-<li>CN: "CN=Android Debug,O=Android,C=US"</li>
-</ul>
-
-<p>If necessary, you can change the location/name of the debug keystore/key or
-supply a custom debug keystore/key to use. However, any custom debug
-keystore/key must use the same keystore/key names and passwords as the default
-debug key (as described above). (To do so in Eclipse/ADT, go to
-<strong>Windows</strong> &gt; <strong>Preferences</strong> &gt;
-<strong>Android</strong> &gt; <strong>Build</strong>.) </p>
-
-<p class="caution"><strong>Caution:</strong> You <em>cannot</em> release your application
-to the public when signed with the debug certificate.</p>
-
-<h3>Eclipse Users</h3>
-
-<p>If you are developing in Eclipse/ADT (and have set up Keytool and Jarsigner as described above in
-<a href="#setup">Basic Setup for Signing</a>),
-signing in debug mode is enabled by default. When you run or debug your
-application, ADT signs the {@code .apk} file with the debug certificate, runs {@code zipalign} on
-the package, then installs it on
-the selected emulator or connected device. No specific action on your part is needed,
-provided ADT has access to Keytool.</p>
-
-<h3>Ant Users</h3>
-
-<p>If you are using Ant to build your {@code .apk} file, debug signing mode
-is enabled by using the <code>debug</code> option with the <code>ant</code> command
-(assuming that you are using a <code>build.xml</code> file generated by the
-<code>android</code> tool). When you run <code>ant debug</code> to
-compile your app, the build script generates a keystore/key and signs the APK for you.
-The script then also aligns the APK with the <code>zipalign</code> tool.
-No other action on your part is needed. Read
-<a href="{@docRoot}tools/building/building-cmdline.html#DebugMode">Building and Running Apps
-on the Command Line</a> for more information.</p>
-
-
-<h3 id="debugexpiry">Expiry of the Debug Certificate</h3>
-
-<p>The self-signed certificate used to sign your application in debug mode (the default on
-Eclipse/ADT and Ant builds) will have an expiration date of 365 days from its creation date.</p>
-
-<p>When the certificate expires, you will get a build error. On Ant builds, the error
-looks like this:</p>
-
-<pre>debug:
-[echo] Packaging bin/samples-debug.apk, and signing it with a debug key...
-[exec] Debug Certificate expired on 8/4/08 3:43 PM</pre>
-
-<p>In Eclipse/ADT, you will see a similar error in the Android console.</p>
-
-<p>To fix this problem, simply delete the <code>debug.keystore</code> file.
-The default storage location for AVDs is in <code>~/.android/</code> on OS X and Linux,
-in <code>C:\Documents and Settings\&lt;user>\.android\</code> on Windows XP, and in
-<code>C:\Users\&lt;user>\.android\</code> on Windows Vista and Windows 7.</p>
-
-
-<p>The next time you build, the build tools will regenerate a new keystore and debug key.</p>
-
-<p>Note that, if your development machine is using a non-Gregorian locale, the build
-tools may erroneously generate an already-expired debug certificate, so that you get an
-error when trying to compile your application. For workaround information, see the
-troubleshooting topic <a href="{@docRoot}resources/faq/troubleshooting.html#signingcalendar">
-I&nbsp;can't&nbsp;compile my app because the build tools generated an expired debug
-certificate</a>. </p>
-
-
-<h2 id="releasemode">Signing in Release Mode</h2>
-
-<p>When your application is ready for release to other users, you must:</p>
-<ol>
- <li><a href="#cert">Obtain a suitable private key</a></li>
- <li><a href="#releasecompile">Compile the application in release mode</a></li>
- <li><a href="#signapp">Sign your application with your private key</a></li>
- <li><a href="#align">Align the final APK package</a></li>
-</ol>
-
-<p>If you are developing in Eclipse with the ADT plugin, you can use the Export Wizard
-to perform the compile, sign, and align procedures. The Export Wizard even allows you to
-generate a new keystore and private key in the process. So if you use Eclipse, you can
-skip to <a href="#ExportWizard">Compile and sign with Eclipse ADT</a>.</p>
-
-
-
-<h3 id="cert">1. Obtain a suitable private key</h3>
-
-<p>In preparation for signing your application, you must first ensure that
-you have a suitable private key with which to sign. A suitable private
-key is one that:</p>
-
-<ul>
-<li>Is in your possession</li>
-<li>Represents the personal, corporate, or organizational entity to be identified
-with the application</li>
-<li>Has a validity period that exceeds the expected lifespan of the application
-or application suite. A validity period of more than 25 years is recommended.
-<p>If you plan to publish your application(s) on Google Play, note that a
-validity period ending after 22 October 2033 is a requirement. You can not upload an
-application if it is signed with a key whose validity expires before that date.
-</p></li>
-<li>Is not the debug key generated by the Android SDK tools. </li>
-</ul>
-
-<p>The key may be self-signed. If you do not have a suitable key, you must
-generate one using Keytool. Make sure that you have Keytool available, as described
-in <a href="#setup">Basic Setup</a>.</p>
-
-<p>To generate a self-signed key with Keytool, use the <code>keytool</code>
-command and pass any of the options listed below (and any others, as
-needed). </p>
-
-<p class="warning"><strong>Warning:</strong> Keep your private key secure.
-Before you run Keytool, make sure to read
-<a href="#secure-key">Securing Your Private Key</a> for a discussion of how to keep
-your key secure and why doing so is critically important to you and to users. In
-particular, when you are generating your key, you should select strong passwords
-for both the keystore and key.</p>
-
-<table>
-<tr>
-<th>Keytool Option</th>
-<th>Description</th>
-</tr>
-<tr>
-<td><code>-genkey</code></td><td>Generate a key pair (public and private
-keys)</td>
-</tr>
-<tr>
-<td><code>-v</code></td><td>Enable verbose output.</td>
-</tr>
-<tr>
-<td><code>-alias &lt;alias_name&gt;</code></td><td>An alias for the key. Only
-the first 8 characters of the alias are used.</td>
-</tr>
-<tr>
-<td><code>-keyalg &lt;alg&gt;</code></td><td>The encryption algorithm to use
-when generating the key. Both DSA and RSA are supported.</td>
-</tr>
-<tr>
-<td><code>-keysize &lt;size&gt;</code></td><td>The size of each generated key
-(bits). If not supplied, Keytool uses a default key size of 1024 bits. In
-general, we recommend using a key size of 2048 bits or higher. </td>
-</tr>
-<tr>
-<td><code>-dname &lt;name&gt;</code></td><td><p>A Distinguished Name that describes
-who created the key. The value is used as the issuer and subject fields in the
-self-signed certificate. </p><p>Note that you do not need to specify this option
-in the command line. If not supplied, Jarsigner prompts you to enter each
-of the Distinguished Name fields (CN, OU, and so on).</p></td>
-</tr>
-<tr>
-<td><code>-keypass &lt;password&gt;</code></td><td><p>The password for the
-key.</p> <p>As a security precaution, do not include this option in your command
-line. If not supplied, Keytool prompts you to enter the password. In this way,
-your password is not stored in your shell history.</p></td>
-</tr>
-<tr>
-<td><code>-validity &lt;valdays&gt;</code></td><td><p>The validity period for the
-key, in days. </p><p><strong>Note:</strong> A value of 10000 or greater is recommended.</p></td>
-</tr>
-<tr>
-<td><code>-keystore&nbsp;&lt;keystore-name&gt;.keystore</code></td><td>A name
-for the keystore containing the private key.</td>
-</tr>
-<tr>
-<td><code>-storepass &lt;password&gt;</code></td><td><p>A password for the
-keystore.</p><p>As a security precaution, do not include this option in your
-command line. If not supplied, Keytool prompts you to enter the password. In
-this way, your password is not stored in your shell history.</p></td>
-</tr>
-</table>
-
-<p>Here's an example of a Keytool command that generates a private key:</p>
-
-<pre>$ keytool -genkey -v -keystore my-release-key.keystore
--alias alias_name -keyalg RSA -keysize 2048 -validity 10000</pre>
-
-<p>Running the example command above, Keytool prompts you to provide
-passwords for the keystore and key, and to provide the Distinguished
-Name fields for your key. It then generates the keystore as a file called
-<code>my-release-key.keystore</code>. The keystore and key are
-protected by the passwords you entered. The keystore contains
-a single key, valid for 10000 days. The alias is a name that you &mdash;
-will use later, to refer to this keystore when signing your application. </p>
-
-<p>For more information about Keytool, see the documentation at
-<a
-href="http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html">
-http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html</a></p>
-
-
-
-<h3 id="releasecompile">2. Compile the application in release mode</h3>
-
-<p>In order to release your application to users, you must compile it in release mode.
-In release mode, the compiled application is not signed by default and you will need
-to sign it with your private key.</p>
-
-<p class="caution"><strong>Caution:</strong>
-You can not release your application unsigned, or signed with the debug key.</p>
-
-<h4>With Eclipse</h4>
-
-<p>To export an <em>unsigned</em> APK from Eclipse, right-click the project in the Package
-Explorer and select <strong>Android Tools</strong> > <strong>Export Unsigned Application
-Package</strong>. Then specify the file location for the unsigned APK.
-(Alternatively, open your <code>AndroidManifest.xml</code> file in Eclipse, select
-the <strong>Manifest</strong> tab, and click <strong>Export an unsigned APK</strong>.)</p>
-
-<p>Note that you can combine the compiling and signing steps with the Export Wizard. See
-<a href="#ExportWizard">Compiling and signing with Eclipse ADT</a>.</p>
-
-<h4>With Ant</h4>
-
-<p>If you are using Ant, you can enable release mode by using the <code>release</code> option
-with the <code>ant</code> command. For example, if you are running Ant from the
-directory containing your {@code build.xml} file, the command would look like this:</p>
-
-<pre>$ ant release</pre>
-
-<p>By default, the build script compiles the application APK without signing it. The output file
-in your project {@code bin/} will be <code><em>&lt;your_project_name></em>-unsigned.apk</code>.
-Because the application APK is still unsigned, you must manually sign it with your private
-key and then align it using {@code zipalign}.</p>
-
-<p>However, the Ant build script can also perform the signing
-and aligning for you, if you have provided the path to your keystore and the name of
-your key alias in the project's {@code ant.properties} file. With this information provided,
-the build script will prompt you for your keystore and alias password when you perform
-<code>ant release</code>, it will sign the package and then align it. The final output
-file in {@code bin/} will instead be
-<code><em>&lt;your_project_name></em>-release.apk</code>. With these steps
-automated for you, you're able to skip the manual procedures below (steps 3 and 4).
-To learn how to specify your keystore and alias in the {@code ant.properties} file,
-see <a href="{@docRoot}tools/building/building-cmdline.html#ReleaseMode">
-Building and Running Apps on the Command Line</a>.</p>
-
-
-
-<h3 id="signapp">3. Sign your application with your private key</h3>
-
-<p>When you have an application package that is ready to be signed, you can do sign it
-using the Jarsigner tool. Make sure that you have Jarsigner available on your
-machine, as described in <a href="#setup">Basic Setup</a>. Also, make sure that
-the keystore containing your private key is available.</p>
-
-<p>To sign your application, you run Jarsigner, referencing both the
-application's APK and the keystore containing the private key with which to
-sign the APK. The table below shows the options you could use. </p>
-
-<table>
-<tr>
-<th>Jarsigner Option</th>
-<th>Description</th>
-</tr>
-<tr>
-<td><code>-keystore&nbsp;&lt;keystore-name&gt;.keystore</code></td><td>The name of
-the keystore containing your private key.</td>
-</tr>
-<tr>
-<td><code>-verbose</code></td><td>Enable verbose output.</td>
-</tr>
-<tr>
-<td><code>-sigalg</code></td><td>The name of the signature algorithim to use in signing the APK.
-Use the value {@code MD5withRSA}.</td>
-</tr>
-<tr>
-<td><code>-digestalg</code></td><td>The message digest algorithim to use in processing the entries
-of an APK. Use the value {@code SHA1}.</td>
-</tr>
-<tr>
-<td><code>-storepass &lt;password&gt;</code></td><td><p>The password for the
-keystore. </p><p>As a security precaution, do not include this option
-in your command line unless you are working at a secure computer.
-If not supplied, Jarsigner prompts you to enter the password. In this
-way, your password is not stored in your shell history.</p></td>
-</tr>
-<tr>
-<td><code>-keypass &lt;password&gt;</code></td><td><p>The password for the private
-key. </p><p>As a security precaution, do not include this option
-in your command line unless you are working at a secure computer.
-If not supplied, Jarsigner prompts you to enter the password. In this
-way, your password is not stored in your shell history.</p></td>
-</tr>
-</table>
-
-<p>Here's how you would use Jarsigner to sign an application package called
-<code>my_application.apk</code>, using the example keystore created above.
-</p>
-
-<pre>$ jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore
-my_application.apk alias_name</pre>
-
-<p>Running the example command above, Jarsigner prompts you to provide
-passwords for the keystore and key. It then modifies the APK
-in-place, meaning the APK is now signed. Note that you can sign an
-APK multiple times with different keys.</p>
-
-<p class="caution"><strong>Caution:</strong> As of JDK 7, the default signing algorithim has
-changed, requiring you to specify the signature and digest algorithims ({@code -sigalg} and {@code
--digestalg}) when you sign an APK.</p>
-
-<p>To verify that your APK is signed, you can use a command like this:</p>
-
-<pre>$ jarsigner -verify my_signed.apk</pre>
-
-<p>If the APK is signed properly, Jarsigner prints "jar verified".
-If you want more details, you can try one of these commands:</p>
-
-<pre>$ jarsigner -verify -verbose my_application.apk</pre>
-
-<p>or</p>
-
-<pre>$ jarsigner -verify -verbose -certs my_application.apk</pre>
-
-<p>The command above, with the <code>-certs</code> option added, will show you the
-"CN=" line that describes who created the key.</p>
-
-<p class="note"><strong>Note:</strong> If you see "CN=Android Debug", this means the APK was
-signed with the debug key generated by the Android SDK. If you intend to release
-your application, you must sign it with your private key instead of the debug
-key.</p>
-
-<p>For more information about Jarsigner, see the documentation at
-<a href="http://docs.oracle.com/javase/6/docs/technotes/tools/windows/jarsigner.html">
-http://docs.oracle.com/javase/6/docs/technotes/tools/windows/jarsigner.html</a></p>
-
-
-<h3 id="align">4. Align the final APK package</h3>
-
-<p>Once you have signed the APK with your private key, run <code>zipalign</code> on the file.
-This tool ensures that all uncompressed data starts with a particular byte alignment,
-relative to the start of the file. Ensuring alignment at 4-byte boundaries provides
-a performance optimization when installed on a device. When aligned, the Android
-system is able to read files with {@code mmap()}, even if
-they contain binary data with alignment restrictions, rather than copying all
-of the data from the package. The benefit is a reduction in the amount of
-RAM consumed by the running application.</p>
-
-<p>The <code>zipalign</code> tool is provided with the Android SDK, inside the
-<code>tools/</code> directory. To align your signed APK, execute:</p>
-
-<pre>$ zipalign -v 4 <em>your_project_name</em>-unaligned.apk <em>your_project_name</em>.apk</pre>
-
-<p>The {@code -v} flag turns on verbose output (optional). {@code 4} is the
-byte-alignment (don't use anything other than 4). The first file argument is
-your signed {@code .apk} file (the input) and the second file is the destination {@code .apk} file
-(the output). If you're overriding an existing APK, add the {@code -f} flag.</p>
-
-<p class="caution"><strong>Caution:</strong> Your input APK must be signed with your
-private key <strong>before</strong> you optimize the package with {@code zipalign}.
-If you sign it after using {@code zipalign}, it will undo the alignment.</p>
-
-<p>For more information, read about the
-<a href="{@docRoot}tools/help/zipalign.html">zipalign</a> tool.
-
-
-<h3 id="ExportWizard">Compile and sign with Eclipse ADT</h3>
-
-<p>If you are using Eclipse with the ADT plugin, you can use the Export Wizard to
-export a <em>signed</em> APK (and even create a new keystore,
-if necessary). The Export Wizard performs all the interaction with
-the Keytool and Jarsigner for you, which allows you to sign the package using a GUI
-instead of performing the manual procedures to compile, sign,
-and align, as discussed above. Once the wizard has compiled and signed your package,
-it will also perfom package alignment with {@code zipalign}.
-Because the Export Wizard uses both Keytool and Jarsigner, you should
-ensure that they are accessible on your computer, as described above
-in the <a href="#setup">Basic Setup for Signing</a>.</p>
-
-<p>To create a signed and aligned APK in Eclipse:</p>
-
-<ol>
- <li>Select the project in the Package
-Explorer and select <strong>File > Export</strong>.</li>
- <li>Open the Android folder, select Export Android Application,
- and click <strong>Next</strong>.
- <p>The Export Android Application wizard now starts, which will
- guide you through the process of signing your application,
- including steps for selecting the private key with which to sign the APK
- (or creating a new keystore and private key).</p>
- <li>Complete the Export Wizard and your application will be compiled,
- signed, aligned, and ready for distribution.</li>
-</ol>
-
-
-
-<h2 id="secure-key">Securing Your Private Key</h2>
-
-<p>Maintaining the security of your private key is of critical importance, both
-to you and to the user. If you allow someone to use your key, or if you leave
-your keystore and passwords in an unsecured location such that a third-party
-could find and use them, your authoring identity and the trust of the user
-are compromised. </p>
-
-<p>If a third party should manage to take your key without your knowledge or
-permission, that person could sign and distribute applications that maliciously
-replace your authentic applications or corrupt them. Such a person could also
-sign and distribute applications under your identity that attack other
-applications or the system itself, or corrupt or steal user data. </p>
-
-<p>Your reputation as a developer entity depends on your securing your private
-key properly, at all times, until the key is expired. Here are some tips for
-keeping your key secure: </p>
-
-<ul>
-<li>Select strong passwords for the keystore and key.</li>
-<li>When you generate your key with Keytool, <em>do not</em> supply the
-<code>-storepass</code> and <code>-keypass</code> options at the command line.
-If you do so, your passwords will be available in your shell history,
-which any user on your computer could access.</li>
-<li>Similarly, when signing your applications with Jarsigner,
-<em>do not</em> supply the <code>-storepass</code> and <code>-keypass</code>
-options at the command line. </li>
-<li>Do not give or lend anyone your private key, and do not let unauthorized
-persons know your keystore and key passwords.</li>
-</ul>
-
-<p>In general, if you follow common-sense precautions when generating, using,
-and storing your key, it will remain secure. </p> \ No newline at end of file
diff --git a/docs/html/tools/workflow/publishing/app-signing.jd b/docs/html/tools/workflow/publishing/app-signing.jd
deleted file mode 100644
index ac45242..0000000
--- a/docs/html/tools/workflow/publishing/app-signing.jd
+++ /dev/null
@@ -1,618 +0,0 @@
-page.title=Signing Your Applications
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-
-<h2>Quickview</h2>
-
-<ul>
-<li>All Android apps <em>must</em> be signed</li>
-<li>You can sign with a self-signed key</li>
-<li>How you sign your apps is critical &mdash; read this document carefully</li>
-<li>Determine your signing strategy early in the development process</li>
-</ul>
-
-<h2>In this document</h2>
-
-<ol>
-<li><a href="#signing">Signing Process</a></li>
-<li><a href="#strategies">Signing Strategies</a></li>
-<li><a href="#setup">Basic Setup for Signing</a></li>
-<li><a href="#debugmode">Signing in Debug Mode</a></li>
-<li><a href="#releasemode">Signing Release Mode</a>
- <ol>
- <li><a href="#cert">Obtain a suitable private key</a></li>
- <li><a href="#releasecompile">Compile the application in release mode</a></li>
- <li><a href="#signapp">Sign your application with your private key</a></li>
- <li><a href="#align">Align the final APK package</a></li>
- <li><a href="#ExportWizard">Compile and sign with Eclipse ADT</a></li>
- </ol>
-</li>
-<li><a href="#secure-key">Securing Your Private Key</a></li>
-
-</ol>
-
-<h2>See also</h2>
-
-<ol>
-<li><a href="{@docRoot}tools/publishing/versioning.html">Versioning Your Applications</a></li>
-<li><a href="{@docRoot}tools/publishing/preparing.html">Preparing to Publish</a></li>
-</ol>
-
-</div>
-</div>
-
-<p>The Android system requires that all installed applications be digitally signed with a
-certificate whose private key is held by the application's developer. The Android system uses the
-certificate as a means of identifying the author of an application and establishing trust
-relationships between applications. The certificate is not used to control which applications the
-user can install. The certificate does not need to be signed by a certificate authority: it is
-perfectly allowable, and typical, for Android applications to use self-signed certificates.</p>
-
-<p>The important points to understand about signing Android applications are:</p>
-
-<ul>
- <li>All applications <em>must</em> be signed. The system will not install an application
-on an emulator or a device if it is not signed.</li>
- <li>To test and debug your application, the build tools sign your application with a special debug
- key that is created by the Android SDK build tools.</li>
- <li>When you are ready to release your application for end-users, you must sign it with a suitable
- private key. You cannot publish an application that is signed with the debug key generated
- by the SDK tools.</li>
- <li>You can use self-signed certificates to sign your applications. No certificate authority is
- needed.</li>
- <li>The system tests a signer certificate's expiration date only at install time. If an
-application's signer certificate expires after the application is installed, the application
-will continue to function normally.</li>
- <li>You can use standard tools &mdash; Keytool and Jarsigner &mdash; to generate keys and
-sign your application {@code .apk} files.</li>
- <li>After you sign your application for release, we recommend that you use the
- <code>zipalign</code> tool to optimize the final APK package.</li>
-</ul>
-
-<p>The Android system will not install or run an application that is not signed appropriately. This
-applies wherever the Android system is run, whether on an actual device or on the emulator.
-For this reason, you must <a href="#setup">set up signing</a> for your application before you can
-run it or debug it on an emulator or device.</p>
-
-<h2 id="signing">Signing Process</h3>
-
-<p>The Android build process signs your application differently depending on which build mode you
-use to build your application. There are two build modes: <em>debug mode</em> and <em>release
-mode</em>. You use debug mode when you are developing and testing your application. You use
-release mode when you want to build a release version of your application that you can
-distribute directly to users or publish on an application marketplace such as Google Play.</p>
-
-<p>When you build in <em>debug mode</em> the Android SDK build tools use the Keytool utility
-(included in the JDK) to create a debug key. Because the SDK build tools created the debug key,
-they know the debug key's alias and password. Each time you compile your application in debug mode,
-the build tools use the debug key along with the Jarsigner utility (also included in the JDK) to
-sign your application's <code>.apk</code> file. Because the alias and password are known to the SDK
-build tools, the tools don't need to prompt you for the debug key's alias and password each time
-you compile.</p>
-
-<p>When you build in <em>release mode</em> you use your own private key to sign your application. If
-you don't have a private key, you can use the Keytool utility to create one for you. When you
-compile your application in release mode, the build tools use your private key along with the
-Jarsigner utility to sign your application's <code>.apk</code> file. Because the certificate and
-private key you use are your own, you will have to provide the password for the keystore and key
-alias.</p>
-
-<p>The debug signing process happens automatically when you run or debug your application using
-Eclipse with the ADT plugin. Debug signing also happens automatically when you use the Ant build
-script with the <code>debug</code> option. You can automate the release signing process by using the
-Eclipse Export Wizard or by modifying the Ant build script and building with the
-<code>release</code> option.</p>
-
-<h2 id="strategies">Signing Strategies</h2>
-
-<p>Some aspects of application signing may affect how you approach the development
-of your application, especially if you are planning to release multiple
-applications. </p>
-
-<p>In general, the recommended strategy for all developers is to sign
-all of your applications with the same certificate, throughout the expected
-lifespan of your applications. There are several reasons why you should do so: </p>
-
-<ul>
-<li>Application upgrade &ndash; As you release updates to your application, you
-will want to continue to sign the updates with the same certificate or set of
-certificates, if you want users to upgrade seamlessly to the new version. When
-the system is installing an update to an application, it compares the
-certificate(s) in the new version with those in the existing version. If the
-certificates match exactly, including both the certificate data and order, then
-the system allows the update. If you sign the new version without using matching
-certificates, you will also need to assign a different package name to the
-application &mdash; in this case, the user installs the new version as a
-completely new application. </li>
-
-<li>Application modularity &ndash; The Android system allows applications that
-are signed by the same certificate to run in the same process, if the
-applications so requests, so that the system treats them as a single application.
-In this way you can deploy your application in modules, and users can update
-each of the modules independently if needed.</li>
-
-<li>Code/data sharing through permissions &ndash; The Android system provides
-signature-based permissions enforcement, so that an application can expose
-functionality to another application that is signed with a specified
-certificate. By signing multiple applications with the same certificate and
-using signature-based permissions checks, your applications can share code and
-data in a secure manner. </li>
-
-</ul>
-
-<p>Another important consideration in determining your signing strategy is
-how to set the validity period of the key that you will use to sign your
-applications.</p>
-
-<ul>
-<li>If you plan to support upgrades for a single application, you should ensure
-that your key has a validity period that exceeds the expected lifespan of
-that application. A validity period of 25 years or more is recommended.
-When your key's validity period expires, users will no longer be
-able to seamlessly upgrade to new versions of your application.</li>
-
-<li>If you will sign multiple distinct applications with the same key,
-you should ensure that your key's validity period exceeds the expected
-lifespan of <em>all versions of all of the applications</em>, including
-dependent applications that may be added to the suite in the future. </li>
-
-<li>If you plan to publish your application(s) on Google Play, the
-key you use to sign the application(s) must have a validity period
-ending after 22 October 2033. Google Play enforces this requirement
-to ensure that users can seamlessly upgrade applications when
-new versions are available. </li>
-</ul>
-
-<p>As you design your application, keep these points in mind and make sure to
-use a <a href="#cert">suitable certificate</a> to sign your applications. </p>
-
-<h2 id="setup">Basic Setup for Signing</h2>
-
-<p>Before you begin, make sure that the Keytool utility and Jarsigner utility are available to
-the SDK build tools. Both of these tools are available in the JDK. In most cases, you can tell
-the SDK build tools how to find these utilities by setting your <code>JAVA_HOME</code> environment
-variable so it references a suitable JDK. Alternatively, you can add the JDK version of Keytool and
-Jarsigner to your <code>PATH</code> variable.</p>
-
-<p>If you are developing on a version of Linux that originally came with GNU Compiler for
-Java, make sure that the system is using the JDK version of Keytool, rather than the gcj
-version. If Keytool is already in your <code>PATH</code>, it might be pointing to a symlink at
-<code>/usr/bin/keytool</code>. In this case, check the symlink target to be sure it points
-to the Keytool in the JDK.</p>
-
-<h2 id="debugmode">Signing in Debug Mode</h2>
-
-<p>The Android build tools provide a debug signing mode that makes it easier for you
-to develop and debug your application, while still meeting the Android system
-requirement for signing your APK.
-When using debug mode to build your app, the SDK tools invoke Keytool to automatically create
-a debug keystore and key. This debug key is then used to automatically sign the APK, so
-you do not need to sign the package with your own key.</p>
-
-<p>The SDK tools create the debug keystore/key with predetermined names/passwords:</p>
-<ul>
-<li>Keystore name: "debug.keystore"</li>
-<li>Keystore password: "android"</li>
-<li>Key alias: "androiddebugkey"</li>
-<li>Key password: "android"</li>
-<li>CN: "CN=Android Debug,O=Android,C=US"</li>
-</ul>
-
-<p>If necessary, you can change the location/name of the debug keystore/key or
-supply a custom debug keystore/key to use. However, any custom debug
-keystore/key must use the same keystore/key names and passwords as the default
-debug key (as described above). (To do so in Eclipse/ADT, go to
-<strong>Windows</strong> &gt; <strong>Preferences</strong> &gt;
-<strong>Android</strong> &gt; <strong>Build</strong>.) </p>
-
-<p class="caution"><strong>Caution:</strong> You <em>cannot</em> release your application
-to the public when signed with the debug certificate.</p>
-
-<h3>Eclipse Users</h3>
-
-<p>If you are developing in Eclipse/ADT (and have set up Keytool and Jarsigner as described above in
-<a href="#setup">Basic Setup for Signing</a>),
-signing in debug mode is enabled by default. When you run or debug your
-application, ADT signs the {@code .apk} file with the debug certificate, runs {@code zipalign} on
-the package, then installs it on
-the selected emulator or connected device. No specific action on your part is needed,
-provided ADT has access to Keytool.</p>
-
-<h3>Ant Users</h3>
-
-<p>If you are using Ant to build your {@code .apk} file, debug signing mode
-is enabled by using the <code>debug</code> option with the <code>ant</code> command
-(assuming that you are using a <code>build.xml</code> file generated by the
-<code>android</code> tool). When you run <code>ant debug</code> to
-compile your app, the build script generates a keystore/key and signs the APK for you.
-The script then also aligns the APK with the <code>zipalign</code> tool.
-No other action on your part is needed. Read
-<a href="{@docRoot}tools/building/building-cmdline.html#DebugMode">Building and Running Apps
-on the Command Line</a> for more information.</p>
-
-
-<h3 id="debugexpiry">Expiry of the Debug Certificate</h3>
-
-<p>The self-signed certificate used to sign your application in debug mode (the default on
-Eclipse/ADT and Ant builds) will have an expiration date of 365 days from its creation date.</p>
-
-<p>When the certificate expires, you will get a build error. On Ant builds, the error
-looks like this:</p>
-
-<pre>debug:
-[echo] Packaging bin/samples-debug.apk, and signing it with a debug key...
-[exec] Debug Certificate expired on 8/4/08 3:43 PM</pre>
-
-<p>In Eclipse/ADT, you will see a similar error in the Android console.</p>
-
-<p>To fix this problem, simply delete the <code>debug.keystore</code> file.
-The default storage location for AVDs is in <code>~/.android/</code> on OS X and Linux,
-in <code>C:\Documents and Settings\&lt;user>\.android\</code> on Windows XP, and in
-<code>C:\Users\&lt;user>\.android\</code> on Windows Vista and Windows 7.</p>
-
-
-<p>The next time you build, the build tools will regenerate a new keystore and debug key.</p>
-
-<p>Note that, if your development machine is using a non-Gregorian locale, the build
-tools may erroneously generate an already-expired debug certificate, so that you get an
-error when trying to compile your application. For workaround information, see the
-troubleshooting topic <a href="{@docRoot}resources/faq/troubleshooting.html#signingcalendar">
-I&nbsp;can't&nbsp;compile my app because the build tools generated an expired debug
-certificate</a>. </p>
-
-
-<h2 id="releasemode">Signing in Release Mode</h2>
-
-<p>When your application is ready for release to other users, you must:</p>
-<ol>
- <li><a href="#cert">Obtain a suitable private key</a></li>
- <li><a href="#releasecompile">Compile the application in release mode</a></li>
- <li><a href="#signapp">Sign your application with your private key</a></li>
- <li><a href="#align">Align the final APK package</a></li>
-</ol>
-
-<p>If you are developing in Eclipse with the ADT plugin, you can use the Export Wizard
-to perform the compile, sign, and align procedures. The Export Wizard even allows you to
-generate a new keystore and private key in the process. So if you use Eclipse, you can
-skip to <a href="#ExportWizard">Compile and sign with Eclipse ADT</a>.</p>
-
-
-
-<h3 id="cert">1. Obtain a suitable private key</h3>
-
-<p>In preparation for signing your application, you must first ensure that
-you have a suitable private key with which to sign. A suitable private
-key is one that:</p>
-
-<ul>
-<li>Is in your possession</li>
-<li>Represents the personal, corporate, or organizational entity to be identified
-with the application</li>
-<li>Has a validity period that exceeds the expected lifespan of the application
-or application suite. A validity period of more than 25 years is recommended.
-<p>If you plan to publish your application(s) on Google Play, note that a
-validity period ending after 22 October 2033 is a requirement. You can not upload an
-application if it is signed with a key whose validity expires before that date.
-</p></li>
-<li>Is not the debug key generated by the Android SDK tools. </li>
-</ul>
-
-<p>The key may be self-signed. If you do not have a suitable key, you must
-generate one using Keytool. Make sure that you have Keytool available, as described
-in <a href="#setup">Basic Setup</a>.</p>
-
-<p>To generate a self-signed key with Keytool, use the <code>keytool</code>
-command and pass any of the options listed below (and any others, as
-needed). </p>
-
-<p class="warning"><strong>Warning:</strong> Keep your private key secure.
-Before you run Keytool, make sure to read
-<a href="#secure-key">Securing Your Private Key</a> for a discussion of how to keep
-your key secure and why doing so is critically important to you and to users. In
-particular, when you are generating your key, you should select strong passwords
-for both the keystore and key.</p>
-
-<table>
-<tr>
-<th>Keytool Option</th>
-<th>Description</th>
-</tr>
-<tr>
-<td><code>-genkey</code></td><td>Generate a key pair (public and private
-keys)</td>
-</tr>
-<tr>
-<td><code>-v</code></td><td>Enable verbose output.</td>
-</tr>
-<tr>
-<td><code>-alias &lt;alias_name&gt;</code></td><td>An alias for the key. Only
-the first 8 characters of the alias are used.</td>
-</tr>
-<tr>
-<td><code>-keyalg &lt;alg&gt;</code></td><td>The encryption algorithm to use
-when generating the key. Both DSA and RSA are supported.</td>
-</tr>
-<tr>
-<td><code>-keysize &lt;size&gt;</code></td><td>The size of each generated key
-(bits). If not supplied, Keytool uses a default key size of 1024 bits. In
-general, we recommend using a key size of 2048 bits or higher. </td>
-</tr>
-<tr>
-<td><code>-dname &lt;name&gt;</code></td><td><p>A Distinguished Name that describes
-who created the key. The value is used as the issuer and subject fields in the
-self-signed certificate. </p><p>Note that you do not need to specify this option
-in the command line. If not supplied, Jarsigner prompts you to enter each
-of the Distinguished Name fields (CN, OU, and so on).</p></td>
-</tr>
-<tr>
-<td><code>-keypass &lt;password&gt;</code></td><td><p>The password for the
-key.</p> <p>As a security precaution, do not include this option in your command
-line. If not supplied, Keytool prompts you to enter the password. In this way,
-your password is not stored in your shell history.</p></td>
-</tr>
-<tr>
-<td><code>-validity &lt;valdays&gt;</code></td><td><p>The validity period for the
-key, in days. </p><p><strong>Note:</strong> A value of 10000 or greater is recommended.</p></td>
-</tr>
-<tr>
-<td><code>-keystore&nbsp;&lt;keystore-name&gt;.keystore</code></td><td>A name
-for the keystore containing the private key.</td>
-</tr>
-<tr>
-<td><code>-storepass &lt;password&gt;</code></td><td><p>A password for the
-keystore.</p><p>As a security precaution, do not include this option in your
-command line. If not supplied, Keytool prompts you to enter the password. In
-this way, your password is not stored in your shell history.</p></td>
-</tr>
-</table>
-
-<p>Here's an example of a Keytool command that generates a private key:</p>
-
-<pre>$ keytool -genkey -v -keystore my-release-key.keystore
--alias alias_name -keyalg RSA -keysize 2048 -validity 10000</pre>
-
-<p>Running the example command above, Keytool prompts you to provide
-passwords for the keystore and key, and to provide the Distinguished
-Name fields for your key. It then generates the keystore as a file called
-<code>my-release-key.keystore</code>. The keystore and key are
-protected by the passwords you entered. The keystore contains
-a single key, valid for 10000 days. The alias is a name that you &mdash;
-will use later, to refer to this keystore when signing your application. </p>
-
-<p>For more information about Keytool, see the documentation at
-<a
-href="http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html">
-http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html</a></p>
-
-
-
-<h3 id="releasecompile">2. Compile the application in release mode</h3>
-
-<p>In order to release your application to users, you must compile it in release mode.
-In release mode, the compiled application is not signed by default and you will need
-to sign it with your private key.</p>
-
-<p class="caution"><strong>Caution:</strong>
-You can not release your application unsigned, or signed with the debug key.</p>
-
-<h4>With Eclipse</h4>
-
-<p>To export an <em>unsigned</em> APK from Eclipse, right-click the project in the Package
-Explorer and select <strong>Android Tools</strong> > <strong>Export Unsigned Application
-Package</strong>. Then specify the file location for the unsigned APK.
-(Alternatively, open your <code>AndroidManifest.xml</code> file in Eclipse, select
-the <strong>Manifest</strong> tab, and click <strong>Export an unsigned APK</strong>.)</p>
-
-<p>Note that you can combine the compiling and signing steps with the Export Wizard. See
-<a href="#ExportWizard">Compiling and signing with Eclipse ADT</a>.</p>
-
-<h4>With Ant</h4>
-
-<p>If you are using Ant, you can enable release mode by using the <code>release</code> option
-with the <code>ant</code> command. For example, if you are running Ant from the
-directory containing your {@code build.xml} file, the command would look like this:</p>
-
-<pre>$ ant release</pre>
-
-<p>By default, the build script compiles the application APK without signing it. The output file
-in your project {@code bin/} will be <code><em>&lt;your_project_name></em>-unsigned.apk</code>.
-Because the application APK is still unsigned, you must manually sign it with your private
-key and then align it using {@code zipalign}.</p>
-
-<p>However, the Ant build script can also perform the signing
-and aligning for you, if you have provided the path to your keystore and the name of
-your key alias in the project's {@code ant.properties} file. With this information provided,
-the build script will prompt you for your keystore and alias password when you perform
-<code>ant release</code>, it will sign the package and then align it. The final output
-file in {@code bin/} will instead be
-<code><em>&lt;your_project_name></em>-release.apk</code>. With these steps
-automated for you, you're able to skip the manual procedures below (steps 3 and 4).
-To learn how to specify your keystore and alias in the {@code ant.properties} file,
-see <a href="{@docRoot}tools/building/building-cmdline.html#ReleaseMode">
-Building and Running Apps on the Command Line</a>.</p>
-
-
-
-<h3 id="signapp">3. Sign your application with your private key</h3>
-
-<p>When you have an application package that is ready to be signed, you can do sign it
-using the Jarsigner tool. Make sure that you have Jarsigner available on your
-machine, as described in <a href="#setup">Basic Setup</a>. Also, make sure that
-the keystore containing your private key is available.</p>
-
-<p>To sign your application, you run Jarsigner, referencing both the
-application's APK and the keystore containing the private key with which to
-sign the APK. The table below shows the options you could use. </p>
-
-<table>
-<tr>
-<th>Jarsigner Option</th>
-<th>Description</th>
-</tr>
-<tr>
-<td><code>-keystore&nbsp;&lt;keystore-name&gt;.keystore</code></td><td>The name of
-the keystore containing your private key.</td>
-</tr>
-<tr>
-<td><code>-verbose</code></td><td>Enable verbose output.</td>
-</tr>
-<tr>
-<td><code>-sigalg</code></td><td>The name of the signature algorithim to use in signing the APK.
-Use the value {@code MD5withRSA}.</td>
-</tr>
-<tr>
-<td><code>-digestalg</code></td><td>The message digest algorithim to use in processing the entries
-of an APK. Use the value {@code SHA1}.</td>
-</tr>
-<tr>
-<td><code>-storepass &lt;password&gt;</code></td><td><p>The password for the
-keystore. </p><p>As a security precaution, do not include this option
-in your command line unless you are working at a secure computer.
-If not supplied, Jarsigner prompts you to enter the password. In this
-way, your password is not stored in your shell history.</p></td>
-</tr>
-<tr>
-<td><code>-keypass &lt;password&gt;</code></td><td><p>The password for the private
-key. </p><p>As a security precaution, do not include this option
-in your command line unless you are working at a secure computer.
-If not supplied, Jarsigner prompts you to enter the password. In this
-way, your password is not stored in your shell history.</p></td>
-</tr>
-</table>
-
-<p>Here's how you would use Jarsigner to sign an application package called
-<code>my_application.apk</code>, using the example keystore created above.
-</p>
-
-<pre>$ jarsigner -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore my-release-key.keystore
-my_application.apk alias_name</pre>
-
-<p>Running the example command above, Jarsigner prompts you to provide
-passwords for the keystore and key. It then modifies the APK
-in-place, meaning the APK is now signed. Note that you can sign an
-APK multiple times with different keys.</p>
-
-<p class="caution"><strong>Caution:</strong> As of JDK 7, the default signing algorithim has
-changed, requiring you to specify the signature and digest algorithims ({@code -sigalg} and {@code
--digestalg}) when you sign an APK.</p>
-
-<p>To verify that your APK is signed, you can use a command like this:</p>
-
-<pre>$ jarsigner -verify my_signed.apk</pre>
-
-<p>If the APK is signed properly, Jarsigner prints "jar verified".
-If you want more details, you can try one of these commands:</p>
-
-<pre>$ jarsigner -verify -verbose my_application.apk</pre>
-
-<p>or</p>
-
-<pre>$ jarsigner -verify -verbose -certs my_application.apk</pre>
-
-<p>The command above, with the <code>-certs</code> option added, will show you the
-"CN=" line that describes who created the key.</p>
-
-<p class="note"><strong>Note:</strong> If you see "CN=Android Debug", this means the APK was
-signed with the debug key generated by the Android SDK. If you intend to release
-your application, you must sign it with your private key instead of the debug
-key.</p>
-
-<p>For more information about Jarsigner, see the documentation at
-<a href="http://docs.oracle.com/javase/6/docs/technotes/tools/windows/jarsigner.html">
-http://docs.oracle.com/javase/6/docs/technotes/tools/windows/jarsigner.html</a></p>
-
-
-<h3 id="align">4. Align the final APK package</h3>
-
-<p>Once you have signed the APK with your private key, run <code>zipalign</code> on the file.
-This tool ensures that all uncompressed data starts with a particular byte alignment,
-relative to the start of the file. Ensuring alignment at 4-byte boundaries provides
-a performance optimization when installed on a device. When aligned, the Android
-system is able to read files with {@code mmap()}, even if
-they contain binary data with alignment restrictions, rather than copying all
-of the data from the package. The benefit is a reduction in the amount of
-RAM consumed by the running application.</p>
-
-<p>The <code>zipalign</code> tool is provided with the Android SDK, inside the
-<code>tools/</code> directory. To align your signed APK, execute:</p>
-
-<pre>$ zipalign -v 4 <em>your_project_name</em>-unaligned.apk <em>your_project_name</em>.apk</pre>
-
-<p>The {@code -v} flag turns on verbose output (optional). {@code 4} is the
-byte-alignment (don't use anything other than 4). The first file argument is
-your signed {@code .apk} file (the input) and the second file is the destination {@code .apk} file
-(the output). If you're overriding an existing APK, add the {@code -f} flag.</p>
-
-<p class="caution"><strong>Caution:</strong> Your input APK must be signed with your
-private key <strong>before</strong> you optimize the package with {@code zipalign}.
-If you sign it after using {@code zipalign}, it will undo the alignment.</p>
-
-<p>For more information, read about the
-<a href="{@docRoot}tools/help/zipalign.html">zipalign</a> tool.
-
-
-<h3 id="ExportWizard">Compile and sign with Eclipse ADT</h3>
-
-<p>If you are using Eclipse with the ADT plugin, you can use the Export Wizard to
-export a <em>signed</em> APK (and even create a new keystore,
-if necessary). The Export Wizard performs all the interaction with
-the Keytool and Jarsigner for you, which allows you to sign the package using a GUI
-instead of performing the manual procedures to compile, sign,
-and align, as discussed above. Once the wizard has compiled and signed your package,
-it will also perfom package alignment with {@code zipalign}.
-Because the Export Wizard uses both Keytool and Jarsigner, you should
-ensure that they are accessible on your computer, as described above
-in the <a href="#setup">Basic Setup for Signing</a>.</p>
-
-<p>To create a signed and aligned APK in Eclipse:</p>
-
-<ol>
- <li>Select the project in the Package
-Explorer and select <strong>File > Export</strong>.</li>
- <li>Open the Android folder, select Export Android Application,
- and click <strong>Next</strong>.
- <p>The Export Android Application wizard now starts, which will
- guide you through the process of signing your application,
- including steps for selecting the private key with which to sign the APK
- (or creating a new keystore and private key).</p>
- <li>Complete the Export Wizard and your application will be compiled,
- signed, aligned, and ready for distribution.</li>
-</ol>
-
-
-
-<h2 id="secure-key">Securing Your Private Key</h2>
-
-<p>Maintaining the security of your private key is of critical importance, both
-to you and to the user. If you allow someone to use your key, or if you leave
-your keystore and passwords in an unsecured location such that a third-party
-could find and use them, your authoring identity and the trust of the user
-are compromised. </p>
-
-<p>If a third party should manage to take your key without your knowledge or
-permission, that person could sign and distribute applications that maliciously
-replace your authentic applications or corrupt them. Such a person could also
-sign and distribute applications under your identity that attack other
-applications or the system itself, or corrupt or steal user data. </p>
-
-<p>Your reputation as a developer entity depends on your securing your private
-key properly, at all times, until the key is expired. Here are some tips for
-keeping your key secure: </p>
-
-<ul>
-<li>Select strong passwords for the keystore and key.</li>
-<li>When you generate your key with Keytool, <em>do not</em> supply the
-<code>-storepass</code> and <code>-keypass</code> options at the command line.
-If you do so, your passwords will be available in your shell history,
-which any user on your computer could access.</li>
-<li>Similarly, when signing your applications with Jarsigner,
-<em>do not</em> supply the <code>-storepass</code> and <code>-keypass</code>
-options at the command line. </li>
-<li>Do not give or lend anyone your private key, and do not let unauthorized
-persons know your keystore and key passwords.</li>
-</ul>
-
-<p>In general, if you follow common-sense precautions when generating, using,
-and storing your key, it will remain secure. </p> \ No newline at end of file
diff --git a/docs/html/tools/workflow/publishing/preparing.jd b/docs/html/tools/workflow/publishing/preparing.jd
deleted file mode 100644
index 9925037..0000000
--- a/docs/html/tools/workflow/publishing/preparing.jd
+++ /dev/null
@@ -1,358 +0,0 @@
-page.title=Preparing for Release
-@jd:body
-
-<div id="qv-wrapper">
- <div id="qv">
- <h2>Quickview</h2>
- <ul>
- <li>Learn which resources you'll need to release your app.</li>
- <li>Find out how to configure and build your app for release.</li>
- <li>Learn best practices for releasing your app.</li>
- </ul>
- <h2>In this document</h2>
- <ol>
- <li><a href="#publishing-intro">Introduction</a></li>
- <li><a href="#publishing-gather">Gathering Materials and Resources</a></li>
- <li><a href="#publishing-configure">Configuring Your Application</a></li>
- <li><a href="#publishing-build">Building Your Application</a></li>
- <li><a href="#publishing-resources">Preparing External Servers and Resources</a></li>
- <li><a href="#publishing-test">Testing Your Application for Release</a></li>
- </ol>
- <h2>See also</h2>
- <ol>
- <li><a href="{@docRoot}tools/publishing/publishing_overview.html">Publishing Overview</a></li>
- <li><a href="{@docRoot}tools/publishing/app-signing.html">Signing Your Applications</a></li>
- <li><a href="{@docRoot}tools/publishing/publishing.html">Publishing on Google Play</a></li>
- </ol>
- </div>
-</div>
-
-<p>Before you distribute your Android application to users you need to prepare it for release. The
-preparation process is a required <a href="{@docRoot}tools/workflow/index.html">development
-task</a> for all Android applications and is the first step in the publishing process (see figure
-1).</p>
-
-<p>When you prepare your application for release, you configure, build, and test a release
-version of your application. The configuration tasks are straightforward, involving basic code
-cleanup and code modification tasks that help optimize your application. The build process is
-similar to the debug build process and can be done using JDK and Android SDK tools. The testing
-tasks serve as a final check, ensuring that your application performs as expected under real-world
-conditions. When you are finished preparing your application for release you have a signed
-<code>.apk</code> file, which you can distribute directly to users or distribute through an
-application marketplace such as Google Play.</p>
-
-<p>This document summarizes the main tasks you need to perform to prepare your application for
-release. The tasks that are described in this document apply to all Android applications regardless
-how they are released or distributed to users. If you are releasing your application through Google
-Play, you should also read <a href="{@docRoot}tools/publishing/publishing.html">Publishing on
-Google Play</a> to be sure your release-ready application satisfies all Google Play
-requirements.</p>
-
-<p class="note"><strong>Note:</strong> As a best practice, your application should meet all of your
-release criteria for functionality, performance, and stability before you perform the tasks outlined
-in this document.</p>
-
-<img src="{@docRoot}images/publishing/publishing_overview_prep.png"
- alt="Shows how the preparation process fits into the development process"
- height="190"
- id="figure1" />
-<p class="img-caption">
- <strong>Figure 1.</strong> Preparing for release is a required <a
-href="{@docRoot}tools/workflow/index.html">development
-task</a> and is the first step in the publishing process.
-</p>
-
-<h2 id="publishing-intro">Introduction</h2>
-
-<p>To release your application to users you need to create a release-ready package that users can
-install and run on their Android-powered devices. The release-ready package contains the same
-components as the debug <code>.apk</code> file &mdash; compiled source code, resources, manifest
-file, and so on &mdash; and it is built using the same build tools. However, unlike the debug
-<code>.apk</code> file, the release-ready <code>.apk</code> file is signed with your own certificate
-and it is optimized with the zipalign tool.</p>
-
-<div class="figure" style="width:331px">
- <img src="{@docRoot}images/publishing/publishing_preparing.png"
- alt="Shows the five tasks you perform to prepare your app for release"
- height="450" />
- <p class="img-caption">
- <strong>Figure 2.</strong> You perform five main tasks to prepare your application for
- release.
- </p>
-</div>
-
-<p>The signing and optimization tasks are usually seamless if you are building your application with
-Eclipse and the ADT plugin or with the Ant build script (included with the Android SDK). For
-example, you can use the Eclipse Export Wizard to compile, sign, and optimize your application all
-at once. You can also configure the Ant build script to do the same when you build from the command
-line.</p>
-
-<p>To prepare your application for release you typically perform five main tasks (see figure 2).
-Each main task may include one or more smaller tasks depending on how you are releasing your
-application. For example, if you are releasing your application through Google Play you may want
-to add special filtering rules to your manifest while you are configuring your application for
-release. Similarly, to meet Google Play publishing guidelines you may have to prepare screenshots
-and create promotional text while you are gathering materials for release.</p>
-
-<p>You usually perform the tasks listed in figure 2 after you have throroughly debugged and tested
-your application. The Android SDK contains several tools to help you test and debug your Android
-applications. For more information, see the <a
-href="{@docRoot}tools/debugging/index.html">Debugging</a> and <a
-href="{@docRoot}tools/testing/index.html">Testing</a> sections in the Dev Guide.</p>
-
-<h2 id="publishing-gather">Gathering Materials and Resources</h2>
-
-<p>To begin preparing your application for release you need to gather several supporting items. At a
-minimum this includes cryptographic keys for signing your application and an application icon. You
-might also want to include an end-user license agreement.</p>
-
-<h4 id="publishing-keys">Cryptographic keys</h4>
-
-<p>The Android system requires that each installed application be digitally signed with a
-certificate that is owned by the application's developer (that is, a certificate for which the
-developer holds the private key). The Android system uses the certificate as a means of identifying
-the author of an application and establishing trust relationships between applications. The
-certificate that you use for signing does not need to be signed by a certificate authority; the
-Android system allows you to sign your applications with a self-signed certificate. To learn about
-certificate requirements, see <a href="{@docRoot}tools/publishing/app-signing.html#cert">Obtain a
-suitable private key</a>.</p>
-
-<p class="caution"><strong>Important:</strong> Your application must be signed with a cryptographic
-key whose validity period ends after 22 October 2033.</p>
-
-<p>You may also have to obtain other release keys if your application accesses a service or uses a
-third-party library that requires you to use a key that is based on your private key. For example,
-if your application uses the <a
-href="http://code.google.com/android/add-ons/google-apis/reference/com/google/android/maps/MapView.html">MapView</a>
-class, which is part of the <a
-href="http://code.google.com/android/add-ons/google-apis/maps-overview.html">Google Maps external
-library</a>, you will need to register your application with the Google Maps service and obtain
-a Maps API key. For information about getting a Maps API key, see <a
-href="http://code.google.com/android/add-ons/google-apis/mapkey.html"> Obtaining a Maps API
-key</a>.</p>
-
-<h4>Application Icon</h4>
-
-<p>Be sure you have an application icon and that it meets the recommended <a
-href="{@docRoot}guide/practices/ui_guidelines/icon_design_launcher.html">icon guidelines</a>. Your
-application's icon helps users identify your application on a device's Home
-screen and in the Launcher window. It also appears in Manage Applications, My Downloads, and
-elsewhere. In addition, publishing services such as Google Play display your icon to users.</p>
-
-<p class="note"><strong>Note:</strong> If you are releasing your application on Google Play, you
-need to create a high resolution
- version of your icon. See <a
-href="https://www.google.com/support/androidmarket/developer/bin/answer.py?answer=1078870">Graphic
-Assets for your Application</a> for more information.</p>
-
-<h4>End-user License Agreement</h4>
-
-<p>Consider preparing an End User License Agreement (EULA) for your application. A EULA can help
-protect your person, organization, and intellectual property, and we recommend that you provide one
-with your application.</p>
-
-<h4>Miscellaneous Materials</h4>
-
-<p>You might also have to prepare promotional and marketing materials to publicize your application.
-For example, if you are releasing your application on Google Play you will need to prepare some
-promotional text and you will need to create screenshots of your application. For more
-information, see
-<a href="https://www.google.com/support/androidmarket/developer/bin/answer.py?answer=1078870">
-Graphic Assets for your Application</a></p>
-
-<h2 id="publishing-configure">Configuring Your Application for Release</h2>
-
-<p>After you gather all of your supporting materials you can start configuring your application
-for release. This section provides a summary of the configuration changes we recommend that you make
-to your source code, resource files, and application manifest prior to releasing your application.
-Although most of the configuration changes listed in this section are optional, they are
-considered good coding practices and we encourage you to implement them. In some cases,
-you may have already made these configuration changes as part of your development process.</p>
-
-<h4>Choose a good package name</h4>
-
-<p>Make sure you choose a package name that is suitable over the life of your application. You
-cannot change the package name after you distribute your application to users. You can set the
-package name in application's manifest file. For more information, see the <a
-href="{@docRoot}guide/topics/manifest/manifest-element.html#package">package</a> attribute
-documentation.</p>
-
-<h4>Turn off logging and debugging</h4>
-
-<p>Make sure you deactivate logging and disable the debugging option before you build your
-application for release. You can deactivate logging by removing calls to
-{@link android.util.Log} methods in your source files. You can disable debugging by removing the
-<code>android:debuggable</code> attribute from the <code>&lt;application&gt;</code> tag in your
-manifest file, or by setting the <code>android:debuggable</code> attribute to
-<code>false</code> in your manifest file. Also, remove any log files or static test files that
-were created in your project.</p>
-
-<p>Also, you should remove all {@link android.os.Debug} tracing calls that you
-added to your code, such as {@link android.os.Debug#startMethodTracing()} and
-{@link android.os.Debug#stopMethodTracing()} method calls.</p>
-
-<h4>Clean up your project directories</h4>
-
-<p>Clean up your project and make sure it conforms to the directory structure described in <a
-href="{@docRoot}tools/projects/index.html#ApplicationProjects">Android Projects</a>.
-Leaving stray or orphaned files in your project can prevent your application from compiling and
-cause your application to behave unpredictably. At a minimum you should do the following cleanup
-tasks:</p>
-
-<ul>
- <li>Review the contents of your <code>jni/</code>, <code>lib/</code>, and <code>src/</code>
- directories. The <code>jni/</code> directory should contain only source files associated with the
- <a href="{@docRoot}tools/sdk/ndk/index.html">Android NDK</a>, such as
- <code>.c</code>, <code>.cpp</code>, <code>.h</code>, and <code>.mk</code> files. The
- <code>lib/</code> directory should contain only third-party library files or private library
- files, including prebuilt shared and static libraries (for example, <code>.so</code> files). The
- <code>src/</code> directory should contain only the source files for your application
- (<code>.java</code> and <code>.aidl</code> files). The <code>src/</code> directory should not
- contain any <code>.jar</code> files.</li>
- <li>Check your project for private or proprietary data files that your application does not use
- and remove them. For example, look in your project's <code>res/</code> directory for old
- drawable files, layout files, and values files that you are no longer using and delete them.</li>
- <li>Check your <code>lib/</code> directory for test libraries and remove them if they are no
- longer being used by your application.</li>
- <li>Review the contents of your <code>assets/</code> directory and your <code>res/raw/</code>
- directory for raw asset files and static files that you need to update or remove prior to
- release.</li>
-</ul>
-
-<h4>Review and update your manifest settings</h4>
-
-<p>Verify that the following manifest items are set correctly:</p>
-
-<ul>
- <li><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">
- &lt;uses-permission&gt;</a> element
- <p>You should specify only those permissions that are relevant and required for your application.</p>
- </li>
- <li><code>android:icon</code> and <code>android:label</code> attributes
- <p>You must specify values for these attributes, which are located in the
- <a href="{@docRoot}guide/topics/manifest/application-element.html">&lt;application&gt;</a>
- element.</p>
- </li>
- <li><code>android:versionCode</code> and <code>android:versionName</code> attributes.
- <p>We recommend that you specify values for these attributes, which are located in the
- <a href="{@docRoot}guide/topics/manifest/manifest-element.html">&lt;manifest&gt;</a>
- element. For more information see
- <a href="{@docRoot}tools/publishing/versioning.html">Versioning your Application</a>.</p>
- </li>
-</ul>
-
-<p>There are several additional manifest elements that you can set if you are releasing your
-application on Google Play. For example, the <code>android:minSdkVersion</code> and
-<code>android:targetSdkVersion</code> attributes, which are located in the <a
-href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"> &lt;uses-sdk&gt;</a> element. For more
-information about these and other Google Play settings, see <a
-href="{@docRoot}/guide//appendix/market-filters.html">Filters on Google Play</a>.</p>
-
-<h4>Address compatibility issues</h4>
-
-<p>Android provides several tools and techniques to make your application compatible with a wide
-range of devices. To make your application available to the largest number of users, consider
-doing the following:</p>
-
-<ul>
- <li><strong>Add support for multiple screen configurations</strong>
- <p>Make sure you meet the
- <a href="{@docRoot}guide/practices/screens_support.html#screen-independence">
- best practices for supporting multiple screens</a>. By supporting multiple screen configurations
- you can create an application that functions properly and looks good on any of the screen sizes
- supported by Android.</p>
- </li>
- <li><strong>Optimize your application for Android 3.0 devices.</strong>
- <p>If your application is designed for devices older than Android 3.0, make it compatible
- with Android 3.0 devices by following the guidelines and best practices described in
- <a href="{@docRoot}guide/practices/optimizing-for-3.0.html">Optimizing Apps for Android 3.0
- </a>.</p>
- </li>
- <li><strong>Consider using the Support Library</strong>
- <p>If your application is designed for devices running Android 3.x, make your application
- compatible with older versions of Android by adding the
- <a href="{@docRoot}tools/extras/support-library.html">Support Library</a> to your
- application project. The Support Library provides static support libraries that you can add to
- your Android application, which enables you to use APIs that are either not available on
- older platform versions or use utility APIs that are not part of the framework APIs.</p>
- </li>
-</ul>
-
-<h4>Update URLs for servers and services</h4>
-
-<p>If your application accesses remote servers or services, make sure you are using the production
-URL or path for the server or service and not a test URL or path.</p>
-
-<h4>Implement Licensing (if you are releasing on Google Play)</h4>
-
-<p>If you are releasing a paid application through Google Play, consider adding support for
-Google Play Licensing. Licensing lets you control access to your application based on whether the
-current user has purchased it. Using Google Play Licensing is optional even if you are
-releasing your app through Google Play.</p>
-
-<p>For more information about Google Play Licensing Service and how to use it in your
-application, see <a href="{@docRoot}google/play/licensing/index.html">Application Licensing</a>.</p>
-
-<h2 id="publishing-build">Building Your Application for Release</h2>
-
-<p>After you finish configuring your application you can build it into a release-ready
-<code>.apk</code> fle that is signed and optimized. The JDK includes the tools for signing the
-<code>.apk</code> file (Keytool and Jarsigner); the Android SDK includes the tools for compiling and
-optimizing the <code>.apk</code> file. If you are using Eclipse with the ADT plugin or you are using
-the Ant build script from the command line, you can automate the entire build process.</p>
-
-<h3>Building with Eclipse</h3>
-
-<p>You can use the Eclipse Export Wizard to build a release-ready <code>.apk</code> file that is
-signed with your private key and optimized. To learn how to run the Export Wizard, see
-<a href="{@docRoot}tools/publishing/app-signing.html#ExportWizard">Compile and sign with Eclipse
-ADT</a>. The Export Wizard compiles your application for release, signs your application with your
-private key, and optimizes your application with the zipalign tool. The Export Wizard should run
-successfully if you have run or debugged your application from Eclipse and you have no errors in
-your application (see <a href="{@docRoot}tools/building/building-eclipse.html">Building
-and Running from Eclipse with ADT</a> for more information.</p>
-
-<p>The Export Wizard assumes that you have a <a href="#billing-keys">certificate and private key</a>
-suitable for signing your application. If you do not have a suitable certificate and private key,
-the Export Wizard will help you generate one (see
-<a href="{@docRoot}tools/publishing/app-signing.html">Signing Your Applications</a> for more
-information about the signing process and signing guidelines.</p>
-
-<h3>Building with Ant</h3>
-
-<p>You can use the Ant build script (included in the Android SDK) to build a release-ready
-<code>.apk</code> file that is signed with your private key and optimized. To learn how to do this,
-see <a href="{@docRoot}tools/building/building-cmdline.html#ReleaseMode">Building in
-Release Mode</a>. This build method assumes you have a <a href="#billing-keys">certificate and
-private key</a> suitable for signing your application. If you do not have a suitable certificate and
-private key, the Export Wizard will help you generate one (see
-<a href="{@docRoot}tools/publishing/app-signing.html">Signing Your Applications</a> for more
-information about the signing process and signing guidelines.</p>
-
-<h2 id="publishing-resources">Preparing External Servers and Resources</h2>
-
-<p>If your application relies on a remote server, make sure the server is secure and that it is
-configured for production use. This is particularly important if you are implementing <a
-href="{@docRoot}google/play/billing/index.html">in-app billing</a> in your application and you are
-performing the signature verification step on a remote server.</p>
-
-<p>Also, if your application fetches content from a remote server or a real-time service (such as a
-content feed), be sure the content you are providing is up to date and production-ready.</p>
-
-<h2 id="publishing-test">Testing Your Application for Release</h2>
-
-<p>Testing the release version of your application helps ensure that your application runs properly
-under realistic device and network conditions. Ideally, you should test your application on at least
-one handset-sized device and one tablet-sized device to verify that your user interface elements are
-sized correctly and that your application's performance and battery efficiency are acceptable.</p>
-
-<p>As a starting point for testing, see
-<a href="{@docRoot}tools/testing/what_to_test.html">What to Test</a>. This article provides
-a summary of common Android situations that you should consider when you are testing. When you are
-done testing and you are satisfied that the release version of your application
-behaves correctly, you can release your application to users. For more information, see
-<a href="{@docRoot}tools/publishing/publishing_overview.html#publishing-release">Releasing Your
-Application to Users</a>. If you are publishing your application on Google Play, see
-<a href="{@docRoot}tools/publishing/publishing.html">Publishing on Google Play</a>.</p>
-
-
diff --git a/docs/html/tools/workflow/publishing/publishing.jd b/docs/html/tools/workflow/publishing/publishing.jd
deleted file mode 100644
index ab6321c..0000000
--- a/docs/html/tools/workflow/publishing/publishing.jd
+++ /dev/null
@@ -1,703 +0,0 @@
-page.title=Publishing on Google Play
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-
-<h2>Quickview</h2>
-
-<ul>
-<li>Learn how to publish and update apps on Google Play.</li>
-<li>Find out how to create links to apps that are published on Google Play.</li>
-<li>Learn about Google Play features.</li>
-</ul>
-
-
-<h2>In this document</h2>
-
-<ol>
-<li><a href="#overview">About Google Play</a>
-<li><A href="#marketpublish">Publishing Apps on Google Play</a></li>
-<li><a href="#marketupgrade">Publishing Updates on Google Play</a></li>
-<li><a href="#marketLicensing">Using Google Play Licensing Service</a></li>
-<li><a href="#marketinappbilling">Using Google Play In-app Billing</a></li>
-<li><a href="#marketintent">Linking to Your Apps on Google Play</a>
- <ol>
- <li><a href="#OpeningDetails">Opening an app's details page</a></li>
- <li><a href="#PerformingSearch">Performing a search</a></li>
- <li><a href="#BuildaButton">Build a Google Play button</a></li>
- <li><a href="#UriSummary">Summary of URI formats</a></li>
- </ol>
-</li>
-</ol>
-
-<h2>See also</h2>
-
-<ol>
-<li><a href="{@docRoot}tools/publishing/publishing_overview.html">Publishing Overview</a></li>
-<li><a href="{@docRoot}tools/publishing/preparing.html">Preparing for Release</a></li>
-</ol>
-
-<div id="qv-extra">
- <img id="rule" src="{@docRoot}assets/images/grad-rule-qv.png">
- <div id="qv-sub-rule">
- <img src="{@docRoot}assets/images/icon_play.png" style="float:left;margin:0;padding:0 5px;">
- <h2 style="color:#669999;">Already know about Google Play and want to get started?</h2>
- <p>Go to <a href="http://play.google.com/apps/publish">Google Play</a>, create a developer
-account, and upload your application. For more information about required assets, listing details,
-and publishing options, see <a
-href="http://market.android.com/support/bin/answer.py?answer=113469">Upload
-Applications</a>.</p>
- </div>
-</div>
-
-</div>
-</div>
-
-<p>One of the most effective ways to get your application into users' hands is to
-publish it on an application marketplace like Google Play. Publishing on Google Play is a
-straightforward process that you can do in just a few simple steps&mdash;register, configure,
-upload, and publish. Registration takes only a few minutes and needs to be done only once.
-The configuration and publishing steps can all be done through the Google Play Developer Console
-after you register as a Google Play developer.</p>
-
-<p>To start publishing on Google Play, first read this topic and then go to the <a
-href="https://play.google.com/apps/publish">Google Play Developer Console</a> and register as
-a Google Play developer.</p>
-
-
-<h2 id="overview">About Google Play</h2>
-
-<p>Google Play is a robust publishing platform that helps you publicize, sell, and distribute
-your Android applications to users around the world. When you release your applications through
-Google Play you have access to a suite of developer tools that let you analyze your sales,
-identify market trends, and control who your applications are being distributed to. You also have
-access to several revenue-enhancing features, such as <a
-href="{@docRoot}google/play/billing/index.html">in-app billing</a> and
-<a href="{@docRoot}google/play/licensing/index.html">application licensing</a>.</p>
-
-<p>Before you can publish applications on Google Play, you need to <a
-href="http://play.google.com/apps/publish">register</a> as a Google Play developer. During the
-registration process you will need to create a developer profile, pay a registration fee, and agree
-to the <a href="http://www.android.com/us/developer-distribution-agreement.html">Google Play
-Developer Distribution Agreement</a>. After you register you can access the Developer
-Console, where you can upload applications, configure publishing options, and monitor publishing
-data. If you want to sell your applications or use the in-app billing feature, you will also need
-to set up a Google Wallet merchant account. For more information about the registration process,
-see <a href="https://support.google.com/androidmarket/developer/bin/answer.py?hl=en&answer=113468">
-Developer Registration</a>.</p>
-
-<h2 id="marketpublish">Publishing Apps on Google Play</h2>
-
-<p>Publishing your application on Google Play is a simple process that involves three basic
-tasks (see figure 1):</p>
-
-<ul>
- <li>Creating various graphical assets that
-accompany your app on Google Play.</li>
- <li>Using the Google Play <a
-href="http://play.google.com/apps/publish">Developer Console</a> to configure publishing options,
-specify listing details, and upload your app and graphical assets to Google Play.</li>
- <li>Reviewing your publishing settings and changing the release
-status of your app from Unpublished to Published.</li>
-</ul>
-
-<img src="{@docRoot}images/publishing/publishing_android_market.png"
- alt="Shows the three steps that are required to publish on Google Play"
- height="168"
- id="figure1" />
-<p class="img-caption">
- <strong>Figure 1.</strong> To publish apps on Google Play you must first <a
-href="{@docRoot}tools/publishing/preparing.html">prepare your app for release</a> and then perform
-three simple tasks.
-</p>
-
-<p class="caution"><strong>Important:</strong> You must <a
-href="{@docRoot}tools/publishing/preparing.html">prepare your application for release</a> before you
-can publish it on Google Play. When you prepare your application for release you configure it for
-release and build it in release mode. Building in release mode signs your application's {@code .apk}
-file with your private release key. You cannot publish an application on Google Play unless it is
-signed with your own private release key.</p>
-
-<h3>Preparing promotional materials</h3>
-
-<p>To fully leverage the marketing and publicity capabilities of Google Play, you need to create
-several graphical assets that accompany your app on Google Play, such as screenshots, videos,
-promotional graphics, and promotional text. At a minimum you must provide two screenshots of your
-application and a high resolution application icon. The screenshots are displayed on the details
-page for your application on Google Play, and the high resolution application icon is displayed
-in various locations throughout Google Play. The high resolution icon does not replace the
-launcher icon for your application, rather, it serves as a supplemental icon and should look
-the same as your launcher icon. Promotional video,
-graphics, and text are optional, although we strongly recommended that you prepare these for your
-app. For more information about the graphic assets that accompany your application, see <a
-href="http://support.google.com/androidmarket/developer/bin/answer.py?hl=en&answer=1078870">Graphic
-Assets for your Application</a>.</p>
-
-<h3>Configuring options and uploading assets</h3>
-
-<p>Google Play lets you target your application to a worldwide pool of users and devices. To
-reach these users you can use the Developer Console to configure various publishing
-options and listing details for your app. For example, you can choose the <a
-href="http://support.google.com/androidmarket/developer/bin/answer.py?hl=en&answer=138294&topic=
-2365624&ctx=topic">countries</a> you want to reach, the listing languages you want to use, and the
-<a
-href="http://support.google.com/androidmarket/developer/bin/answer.py?hl=en&answer=138412&topic=
-15867&ctx=topic">price</a> you want to charge in each country. You can also configure listing
-details such as the application type, <a
-href="https://support.google.com/androidmarket/developer/bin/answer.py?hl=en&answer=113475&topic=
-2365760&ctx=topic">category</a>, and <a
-href="http://support.google.com/androidmarket/developer/bin/answer.py?hl=en&answer=188189&topic=
-2364761&ctx=topic">content rating</a>. In addition, if you want to sell items within your app using
-the in-app billing feature, you can use the Developer Console to <a
-href="http://grendel.sea.corp.google.com:48014/google/play/billing/billing_admin.html#billing-list
-- setup">create a product list</a> and control which items are available for purchase in your
-app.</p>
-
-<p>When you are finished setting publishing options and listing details, you can upload your assets
-and your application to Google Play. You can also upload your application as a draft
-(unpublished) application, which lets you do final testing before you publish it for final
-release.</p>
-
-<p>To learn more about Google Play publishing settings, see the following resources:</p>
-
-<ul>
- <li><a
-href="http://support.google.com/androidmarket/developer/bin/answer.py?hl=en&answer=113469&topic=
-236562&ctx=topic">Upload Applications</a>&mdash;provides a summary of the publishing settings
-you can configure for an app.</li>
- <li><a
-href="http://support.google.com/androidmarket/developer/bin/topic.py?hl=en&topic=15867">Selling
-Your Apps</a>&mdash;provides guidance about pricing, supported currencies, tax rates, and many
-other topics related to selling apps.</li>
- <li><a
-href="https://support.google.com/androidmarket/developer/bin/answer.py?hl=en&answer=1169947&topic=
-15867&ctx=topic">Selling Apps in Multiple Currencies</a>&mdash;provides a description of how
-pricing, payouts, and exchange rates work.</li>
-</ul>
-
-<h3>Publishing your application</h3>
-
-<p>When you are satisfied that your publishing settings are correctly configured and your uploaded
-application is ready to be released to the public, you can simply click <strong>Publish</strong> in
-the Developer Console to make your app available for download
-around the world. Keep in mind, it can take several hours for your app to appear on Google
-Play after you click <strong>Publish</strong> in the Developer Console.</p>
-
-<h3>Controlling Distribution to Devices</h3>
-
-<p>If your application targets different device configurations, you can control which Android-powered
-devices have access to your application on Google Play by
-using Google Play filters. Filtering compares device configurations that you declare in your
-app's manifest file to the configuration defined by a device. For example, if you declare the camera
-filter in your manifest, only those devices that have a camera will see your app on Google
-Play. Filters must be configured in your application's manifest file when you are <a
-href="{@docRoot}tools/publishing/preparing.html">preparing your app for release</a> (that is, before
-you upload your app to Google Play). For more information, see <a
-href="{@docRoot}google/play/filters.html">Filters on Google Play</a>.</p>
-
-<p>You can also use the multiple APK feature to distribute different {@code .apk} files under the same
-application listing and the same package name; however, you should use this option only as a last
-resort. Android applications usually run on most compatible devices with a single APK, by supplying
-alternative resources for different configurations (for example, different layouts for different screen
-sizes) and the Android system selects the appropriate resources for the device at runtime. In a
-few cases, however, a single APK is unable to support all device configurations, because alternative
-resources make the APK file too big (greater than 50MB) or other technical challenges prevent a
-single APK from working on all devices. Although we encourage you to develop and publish a single
-APK that supports as many device configurations as possible, doing so is sometimes
-not possible. To help you publish your application for as many devices as possible, Google Play
-allows you to publish multiple APKs under the same application listing. Google Play then supplies
-each APK to the appropriate devices based on configuration support you've declared in the manifest
-file of each APK. To use this feature, you need to build your separate {@code .apk} files when you are <a
-href="{@docRoot}tools/publishing/preparing.html">preparing your app for release</a> (that is, before
-you upload your app to Google Play). For more information, see <a
-href="{@docRoot}google/play/publishing/multiple-apks.html">Multiple APK Support</a>.</p>
-
-<h2 id="marketupgrade">Publishing Updates on Google Play</h2>
-
-<p>At any time after publishing an application on Google Play, you can upload
-and publish an update to the same application package. When you publish an
-update to an application, users who have already installed the
-application may receive a notification that an update is
-available for the application. They can then choose to update the application
-to the latest version.</p>
-
-<p>Before uploading the updated application, be sure that you have incremented
-the <code>android:versionCode</code> and <code>android:versionName</code>
-attributes in the <a
-href="{@docRoot}guide/topics/manifest/manifest-element.html"><code>&lt;manifest&gt;</code></a>
-element of the manifest file. Also, the package name must be the same as the existing version and
-the {@code .apk} file must be signed with the same private key. If the package name and signing
-certificate do <em>not</em> match those of the existing version, Google Play will
-consider it a new application, publish it as such, and will not offer it to existing users as an
-update.</p>
-
-<p>If you plan to publish your application on Google Play, you must make sure
- that it meets the requirements listed below, which are enforced by Google Play
- when you upload the application.</p>
-
-<h2 id="marketLicensing">Using Google Play Licensing Service</h2>
-
-<p>Google Play offers a licensing service that lets you enforce licensing
-policies for paid applications that you publish through Google Play. With
-Google Play Licensing, your applications can query Google Play at runtime
-to obtain the licensing status for the current user, then allow or disallow
-further use of the application as appropriate. Using the service, you can apply a flexible
-licensing policy on an application-by-application basis&mdash;each
-application can enforce its licensing status in the way most appropriate
-for it. </p>
-
-<p>Any application that you publish through Google Play can use the Google
-Play Licensing Service. The service uses no dedicated framework APIs, so you can
-add licensing to any application that uses a minimum API Level of 3 or
-higher.</p>
-
-<p>For complete information about Google Play Licensing Service and how to
-use it in your application, read <a
-href="{@docRoot}google/play/licensing/index.html">Application Licensing</a>.</p>
-
-<h2 id="marketinappbilling">Using Google Play In-app Billing</h2>
-
-<p><a href="{@docRoot}google/play/billing/billing_overview.html">Google Play In-app Billing</a>
-is a Google Play service that lets you sell digital content in your applications. You can use
-the service to sell a wide range of content, including downloadable content such as media files or
-photos, and virtual content such as game levels or potions.</p>
-
-<p>When you use Google Play's in-app billing service to sell an item, Google Play handles all
-billing details so your application never has to directly process any financial transactions.
-Google Play uses the same checkout service that is used for application purchases, so your users
-experience a consistent and familiar purchase flow (see figure 1). Also, the transaction fee for
-in-app purchases is the same as the transaction fee for application purchases (30%).</p>
-
-<p>Any application that you publish through Google Play can implement in-app billing. No special
-account or registration is required other than a Google Play publisher account and a Google
-Wallet merchant account. Also, because the service uses no dedicated framework APIs, you can add
-in-app billing to any application that uses a minimum API level of 4 or higher.</p>
-
-<p>To help you integrate in-app billing into your application, the Android SDK provides a <a
-href="{@docRoot}google/play/billing/billing_integrate.html#billing-download">sample application</a>
-that demonstrates a simple implementation of in-app billing. The sample application contains
-examples of billing-related classes you can use to implement in-app billing in your application. It
-also contains examples of the database, user interface, and business logic you might use to
-implement in-app billing. For more information about the in-app billing feature, see the
-<a href="{@docRoot}google/play/billing/index.html">In-app Billing documentation</a>.</p>
-
-<h2 id="marketintent">Linking to Your Apps on Google Play</h2>
-
-<p>To help users discover your published applications, you can use two special Google Play URIs
-that direct users to your application's details page or perform a search for all of your published
-applications on Google Play. You can use these URIs to create a button in your application or a
-link on a web page that:</p>
-
-<ul>
- <li>Opens your application's details page in the Google Play application or web site.</li>
- <li>Searches for all your published applications in the Google Play application or web
-site.</li>
-</ul>
-
-<p>You can launch the Google Play application or web site in the following ways:</p>
-<ul>
- <li>Initiate an {@link android.content.Intent} from your application that launches the
-Google Play application on the user's device.</li>
- <li>Provide a link on a web page that opens the Google Play web site (but will also
-open the Google Play application if clicked from a device).</li>
-</ul>
-
-<p>In both cases, whether you want to initiate the action from your application or from a web
-page, the URIs are quite similar. The only difference is the URI prefix.</p>
-
-<p>To open the Google Play application from your application, the prefix for the intent's data
-URI is:</p>
-
-<p style="margin-left:2em"><code>market://</code></p>
-
-<p>To open Google Play store from your web site, the prefix for the link URI is:</p>
-
-<p style="margin-left:2em"><code>http://play.google.com/store/</code></p>
-
-<p>The following sections describe how to create a complete URI for each action.</p>
-
-<p class="note"><strong>Note:</strong> If you create a link to open Google Play from your web
-site and the user selects it from an Android-powered device, the device's Google Play application will
-resolve the link so the user can use the Google Play application on the device instead of opening the web
-site. As such, you should always use {@code http://play.google.com/store/apps/...} URIs when
-creating a link on
-a web page. When pointing to your apps from within your Android app, use the
-{@code market://} URIs in an intent, so that the Google Play application always opens.</p>
-
-
-<h3 id="OpeningDetails">Opening an app's details page</h3>
-
-<p>As described above, you can open the details page for a specific application either on the
-Google Play application or the Google Play web site. The details page allows the user to see
-the application description, screenshots, reviews and more, and choose to install it.</p>
-
-<p>The format for the URI that opens the details page is:</p>
-
-<p style="margin-left:2em"><code>&lt;URI_prefix&gt;<b>apps/details?id=</b>&lt;package_name&gt;</code></p>
-
-<p>The <code>&lt;package_name&gt;</code> is a placeholder for the target application's
-fully-qualified package name, as declared in the <a
-href="{@docRoot}guide/topics/manifest/manifest-element.html#package">{@code
-package}</a> attribute of the <a href="{@docRoot}guide/topics/manifest/manifest-element.html">{@code
-&lt;manifest&gt;}</a> element.</p>
-
-<p>For example: <code>http://play.google.com/store/apps/details?id=com.example.myapp</code></p>
-
-
-<h4>Opening the app details page from your Android app</h4>
-
-<p>To open the Google Play details page from your application,
-create an intent with the {@link android.content.Intent#ACTION_VIEW} action and include a data URI
-in this format:</p>
-
-<p style="margin-left:2em"><code>market://details?id=&lt;package_name&gt;</code></p>
-
-<p>For example, here's how you can create an intent and open an application's details page in
-Google Play:</p>
-
-<pre>
-Intent intent = new Intent(Intent.ACTION_VIEW);
-intent.setData(Uri.parse("market://details?id=com.example.android"));
-startActivity(intent);
-</pre>
-
-<p>This will open the Google Play application on the device to view the {@code
-com.example.android} application.</p>
-
-
-<h4>Opening the app details page from a web site</h4>
-
-<p>To open the details page from your web site, create a link with a URI in this
-format:</p>
-
-<p style="margin-left:2em">
- <code>http://play.google.com/store/apps/details?id=&lt;package_name&gt;</code>
-</p>
-
-<p>For example, here's a link that opens an application's details page on Google Play:</p>
-
-<pre>
-&lt;a href="http://play.google.com/store/apps/details?id=com.example.android">App Link&lt;/a>
-</pre>
-
-<p>When clicked from a desktop web browser, this opens the Google Play web site to view the
-{@code com.example.android} application. When clicked from an Android-powered device, users are
-given the option to use either their web browser or the Google Play application to view the
-application.</p>
-
-
-
-<h3 id="PerformingSearch">Performing a search</h3>
-
-<p>To initiate a search on Google Play, the format for the URI is:</p>
-
-<p style="margin-left:2em">
- <code>&lt;URI_prefix&gt;<b>search?q=</b>&lt;query&gt;</code>
-</p>
-
-<p>The <code>&lt;query&gt;</code> is a placeholder for the search query to execute in Google
-Play. The query can be a raw text string or you can include a parameter that performs a search
-based on the publisher name:</p>
-
-<ul>
- <li>To perform a raw text search, append the query string:
- <p><code>&lt;URI_prefix&gt;<b>search?q=</b>&lt;search_query&gt;</code></p></li>
-
- <li>To search based on the publisher name, use the {@code pub:} parameter in the query, followed
-by the publisher name:
- <p><code>&lt;URI_prefix&gt;<b>search?q=pub:</b>&lt;publisher_name&gt;</code></p>
- <p>You can use this type of search to show all of your published applications.</p></li>
-</ul>
-
-
-<h4>Searching from your Android app</h4>
-
-<p>To initiate a search on Google Play from your application, create an intent with the
-{@link android.content.Intent#ACTION_VIEW} action and include a data URI in this format:</p>
-
-<p style="margin-left:2em"><code>market://search?q=&lt;query&gt;</code></p>
-
-<p>The query may include the {@code pub:} parameter described above.</p>
-
-<p>For example, here's how you can initiate a search in the Google Play application, based on the
-publisher name:</p>
-
-<pre>
-Intent intent = new Intent(Intent.ACTION_VIEW);
-intent.setData(Uri.parse("market://search?q=pub:Your Publisher Name"));
-startActivity(intent);
-</pre>
-
-<p>This opens the Google Play application to perform the search. The search result shows all
-applications published by the publisher that are compatible with the current device.</p>
-
-
-<h4>Searching from a web site</h4>
-
-<p>To initiate a search on Google Play from your web site, create a link with a URI in this
-format:</p>
-
-<p style="margin-left:2em">
- <code>http://play.google.com/store/search?q=&lt;query&gt;</code>
-</p>
-
-<p>The query may include the {@code pub:} parameter described above.</p>
-
-<p>For example, here's a link that initiates a search on Google Play, based on the
-publisher name:</p>
-
-<pre>
-&lt;a href="http://play.google.com/store/search?q=pub:Your Publisher Name">Search Link&lt;/a>
-</pre>
-
-<p>When clicked from a desktop web browser, this opens the Google Play web site and performs the
-search. When clicked from an Android-powered device, users are given the option to use either their
-web browser or the Google Play application to perform the search.</p>
-
-
-
-<h3 id="BuildaButton">Build a Google Play button</h3>
-
-<p>Use the following form to create a button for your web site that takes users to your application
-on Google Play. Input either your application's package name or your publisher name and the button
-will take users to Google Play to either view your application's information or view a list of your
-published apps. If users click the button while on an Android-powered device, the Google Play
-application will respond to show users your application(s).</p>
-
-<p>This form offers two styles of the official brand badge each at recommended sizes. You can pick
-between either "Get it on Google Play" or "Android app on Google Play." You should not modify the
-badge images in any way. For more usage guidelines,
-see the <a href="http://www.android.com/branding.html">Android Brand Guidelines</a>.</p>
-
-<style type="text/css">
-
-form.button-form {
- margin-top:2em;
-}
-
-/* the label and input elements are blocks that float left in order to
- keep the left edgets of the input aligned, and IE 6/7 do not fully support "inline-block" */
-label.block {
- display: block;
- float: left;
- width: 100px;
- padding-right: 10px;
-}
-
-input.text {
- display: block;
- float: left;
- width: 250px;
-}
-
-div.button-row {
- white-space:nowrap;
- min-height:80px;
-}
-
-div.button-row input {
- vertical-align:120%;
-}
-
-#jd-content div.button-row img {
- margin: 0;
-}
-
-</style>
-
-<script type="text/javascript">
-
-// variables for creating 'try it out' demo button
-var imagePath = "http://www.android.com/images/brand/"
-var linkStart = "<a href=\"http://play.google.com/store/";
-var imageStart = "\">\n"
- + " <img alt=\"";
- // leaves opening for the alt text value
-var imageSrc = "\"\n src=\"" + imagePath;
- // leaves opening for the image file name
-var imageEnd = ".png\" />\n</a>";
-
-// variables for creating code snippet
-var linkStartCode = "&lt;a href=\"http://play.google.com/store/";
-var imageStartCode = "\"&gt;\n"
- + " &lt;img alt=\"";
- // leaves opening for the alt text value
-var imageSrcCode = "\"\n src=\"" + imagePath;
- // leaves opening for the image file name
-var imageEndCode = ".png\" />\n&lt;/a>";
-
-/** Generate the HTML snippet and demo based on form values */
-function buildButton(form) {
- var selectedValue = $('form input[type=radio]:checked').val();
- var altText = selectedValue.indexOf("get_it") != -1 ? "Get it on Google Play" : "Android app on Google Play";
-
- if (form["package"].value != "com.example.android") {
- $("#preview").show();
- $("#snippet").show().html(linkStartCode + "apps/details?id=" + form["package"].value
- + imageStartCode + altText + imageSrcCode
- + selectedValue + imageEndCode);
- $("#button-preview").html(linkStart + "apps/details?id=" + form["package"].value
- + imageStart + altText + imageSrc
- + selectedValue + imageEnd);
- } else if (form["publisher"].value != "Example, Inc.") {
- $("#preview").show();
- $("#snippet").show().html(linkStartCode + "search?q=pub:" + form["publisher"].value
- + imageStartCode + altText + imageSrcCode
- + selectedValue + imageEndCode);
- $("#button-preview").html(linkStart + "search?q=pub:" + form["publisher"].value
- + imageStart + altText + imageSrc
- + selectedValue + imageEnd);
- } else {
- alert("Please enter your package name or publisher name");
- }
- return false;
-}
-
-/** Listen for Enter key */
-function onTextEntered(event, form, me) {
- // 13 = enter
- if (event.keyCode == 13) {
- buildButton(form);
- }
-}
-
-/** When input is focused, remove example text and disable other input */
-function onInputFocus(object, example) {
- if (object.value == example) {
- $(object).val('').css({'color' : '#000'});
- }
- $('input[type="text"]:not(input[name='+object.name+'])',
- object.parentNode).attr('disabled','true');
- $('#'+object.name+'-clear').show();
-}
-
-/** When input is blured, restore example text if appropriate and enable other input */
-function onInputBlur(object, example) {
- if (object.value.length < 1) {
- $(object).attr('value',example).css({'color':'#ccc'});
- $('input[type="text"]', object.parentNode).removeAttr('disabled');
- $('#'+object.name+'-clear').hide();
- }
-}
-
-/** Clear the form to start over */
-function clearLabel(id, example) {
- $("#preview").hide();
- $('#'+id+'').html('').attr('value',example).css({'color':'#ccc'});
- $('input[type="text"]', $('#'+id+'').parent()).removeAttr('disabled');
- $('#'+id+'-clear').hide();
- return false;
-}
-
-/** When the doc is ready, find the inputs and color the input grey if the value is the example
- text. This is necessary to handle back-navigation, which can auto-fill the form with previous
- values (and text should not be grey) */
-$(document).ready(function() {
- $(".button-form input.text").each(function(index) {
- if ($(this).val() == $(this).attr("default")) {
- $(this).css("color","#ccc");
- } else {
- /* This is necessary to handle back-navigation to the page after form was filled */
- $('input[type="text"]:not(input[name='+this.name+'])',
- this.parentNode).attr('disabled','true');
- $('#'+this.name+'-clear').show();
- }
- });
-});
-
-</script>
-
-<form class="button-form">
- <label class="block" for="package">Package name:</label>
- <input class="text" type="text" id="package" name="package"
- value="com.example.android"
- default="com.example.android"
- onfocus="onInputFocus(this, 'com.example.android')"
- onblur="onInputBlur(this, 'com.example.android')"
- onkeyup="return onTextEntered(event, this.parentNode, this)"/>&nbsp;
- <a id="package-clear" style="display:none" href="#"
- onclick="return clearLabel('package','com.example.android');">clear</a>
- <p style="clear:both;margin:0">&nbsp;<em>or</em></p>
- <label class="block" style="margin-top:5px" for="publisher">Publisher name:</label>
- <input class="text" type="text" id="publisher" name="publisher"
- value="Example, Inc."
- default="Example, Inc."
- onfocus="onInputFocus(this, 'Example, Inc.')"
- onblur="onInputBlur(this, 'Example, Inc.')"
- onkeyup="return onTextEntered(event, this.parentNode, this)"/>&nbsp;
- <a id="publisher-clear" style="display:none" href="#"
- onclick="return clearLabel('publisher','Example, Inc.');">clear</a>
- <br/><br/>
-
-<div class="button-row">
- <input type="radio" name="buttonStyle" value="get_it_on_play_logo_small" id="ns" checked="checked" />
- <label for="ns"><img src="//www.android.com/images/brand/get_it_on_play_logo_small.png"
-alt="Get it on Google Play (small)" /></label>
- &nbsp;&nbsp;&nbsp;&nbsp;
- <input type="radio" name="buttonStyle" value="get_it_on_play_logo_large" id="nm" />
- <label for="nm"><img src="//www.android.com/images/brand/get_it_on_play_logo_large.png"
-alt="Get it on Google Play (large)" /></label>
-</div>
-
-<div class="button-row">
- <input type="radio" name="buttonStyle" value="android_app_on_play_logo_small" id="ws" />
- <label for="ws"><img src="//www.android.com/images/brand/android_app_on_play_logo_small.png"
-alt="Android app on Google Play (small)" /></label>
- &nbsp;&nbsp;&nbsp;&nbsp;
- <input type="radio" name="buttonStyle" value="android_app_on_play_logo_large" id="wm" />
- <label for="wm"><img src="//www.android.com/images/brand/android_app_on_play_logo_large.png"
-alt="Android app on Google Play (large)" /></label>
-</div>
-
- <input type="button" onclick="return buildButton(this.parentNode)" value="Build my button"
-style="padding:5px" />
- <br/>
-</form>
-
-<div id="preview" style="display:none">
- <p>Copy and paste this HTML into your web site:</p>
- <textarea id="snippet" cols="100" rows="5" onclick="this.select()"
-style="font-family:monospace;background-color:#efefef;padding:5px;display:none;margin-bottom:1em">
- </textarea >
-
-<p>Try it out:</p>
-<div id="button-preview" style="margin-top:1em"></div>
-</div>
-
-
-
-
-
-
-<h3 id="UriSummary">Summary of URI formats</h3>
-
-<p>The table below provides a summary of the URIs currently supported by the Google Play (both on
-the web and in the Android application), as discussed in the previous sections.</p>
-
-<table>
-<tr>
-<th>For this result</th>
-<th>Use this URI in a web page link</th>
-<th>Or this URI in an {@link android.content.Intent#ACTION_VIEW} intent</th>
-</tr>
-
-<tr>
-<td>Display the details screen for a specific application</td>
-<td><code>http://play.google.com/store/apps/details?id=&lt;package_name&gt;</code>
-<td><code>market://details?id=&lt;package_name&gt;</code></td>
-</tr>
-
-<tr>
-<td>Search for applications using a general string query.</td>
-<td><code>http://play.google.com/store/search?q=&lt;query&gt;</code></td>
-<td><code>market://search?q=&lt;query&gt;</code></td>
-</tr>
-
-<tr>
-<td>Search for applications by publisher name</td>
-<td><nobr><code>http://play.google.com/store/search?q=pub:&lt;publisher_name&gt;</code></nobr></td>
-<td><nobr><code>market://search?q=pub:&lt;publisher_name&gt;</code></nobr></td>
-</tr>
-
-</table>
diff --git a/docs/html/tools/workflow/publishing/publishing_overview.jd b/docs/html/tools/workflow/publishing/publishing_overview.jd
deleted file mode 100755
index a1973c9..0000000
--- a/docs/html/tools/workflow/publishing/publishing_overview.jd
+++ /dev/null
@@ -1,231 +0,0 @@
-page.title=Publishing Overview
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
- <h2>Quickview</h2>
- <ul>
- <li>Learn how to publish Android apps.</li>
- <li>Find out how to prepare apps for release.</li>
- <li>Learn how to release apps to users.</li>
- </ul>
- <h2>In this document</h2>
- <ol>
- <li><a href="#publishing-prepare">Preparing Your Application for Release</a></li>
- <li><a href="#publishing-release">Releasing Your Application to Users</a>
- <ol>
- <li><a href="#publishing-market">Releasing on Google Play</a></li>
- <li><a href="#publishing-website">Releasing on your own website</a></li>
- <li><a href="#publishing-email">Releasing through email</a></li>
- </ol>
- </ol>
- <h2>See also</h2>
- <ol>
- <li><a href="{@docRoot}tools/publishing/preparing.html">Preparing for
- Release</a></li>
- <li><a href="{@docRoot}tools/publishing/publishing.html">Publishing on Google Play</a></li>
- </ol>
-</div>
-</div>
-
-<p>Publishing is the process that makes your Android applications available to users. When you
-publish an Android application you perform two main tasks:</p>
-
-<ul>
- <li>You prepare the application for release.
- <p>During the preparation step you build a release version of your application, which users can
- download and install on their Android-powered devices.</p>
- </li>
- <li>You release the application to users.
- <p>During the release step you publicize, sell, and distribute the release version of your
- application to users.</p>
- </li>
-</ul>
-
-<p>Usually, you release your application through an application marketplace, such as Google Play.
-However, you can also release applications by sending them directly to users or by letting users
-download them from your own website.</p>
-
-<p>Figure 1 shows how the publishing process fits into the overall Android <a
-href="{@docRoot}tools/workflow/index.html">application development process</a>.
-The publishing process is typically performed after you finish testing your application in a debug
-environment. Also, as a best practice, your application should meet all of your release criteria for
-functionality, performance, and stability before you begin the publishing process.</p>
-
-<img src="{@docRoot}images/publishing/publishing_overview.png" alt="Shows where the publishing
- process fits into the overall development process" height="86" id="figure1" />
-<p class="img-caption">
- <strong>Figure 1.</strong> Publishing is the last phase of the Android <a
-href="{@docRoot}tools/workflow/index.html">application development process</a>.
-</p>
-
-<h2 id="publishing-prepare">Preparing Your Application for Release</h2>
-
-<p>Preparing your application for release is a multi-step process that involves the following
-tasks:</p>
-
-<ul>
-
- <li>Configuring your application for release.
- <p>At a minimum you need to remove {@link android.util.Log} calls and remove the
- <a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a>
- attribute from your manifest file. You should also provide values for the
- <code>android:versionCode</code> and <code>android:versionName</code> attributes, which are
- located in the
- <a href="{@docRoot}guide/topics/manifest/manifest-element.html">&lt;manifest&gt;</a>
- element. You may also have to configure several other settings to meet Google Play
- requirements or accomodate whatever method you're using to release your application.</p>
- </li>
- <li>Building and signing a release version of your application.
- <p>The Android Development Tools (ADT) plugin and the Ant build script that are provided
- with the Android SDK tools provide everything you need to build and sign a release version of
- your application.</p>
- </li>
- <li>Testing the release version of your application.
- <p>Before you distribute your application, you should thoroughly test the release version on at
- least one target handset device and one target tablet device.</p>
- </li>
- <li>Updating application resources for release.
- <p>You need to be sure that all application resources such as multimedia files and graphics
- are updated and included with your application or staged on the proper production servers.</p>
- </li>
- <li>Preparing remote servers and services that your application depends on.
- <p>If your application depends on external servers or services, you need to be sure they
- are secure and production ready.</p>
- </li>
-</ul>
-
-<p>You may have to perform several other tasks as part of the preparation process. For example, you
-will need to get a private key for signing your application, and you may need to get a Maps API
-release key if you are using the <a
-href="http://code.google.com/android/add-ons/google-apis/maps-overview.html">Google Maps external
-library</a>. You will also need to create an icon for your application, and you may want to prepare
-an End User License Agreement (EULA) to protect your person, organization, and intellectual
-property.</p>
-
-<p>When you are finished preparing your application for release you will have a signed
-<code>.apk</code> file that you can distribute to users.</p>
-
-<p>To learn how to prepare your application for release, see <a
-href="{@docRoot}tools/publishing/preparing.html">Preparing for Release</a> in the Dev Guide. This
-topic provides step-by-step instructions for configuring and building a release version of your
-application.</p>
-
-<h2 id="publishing-release">Releasing Your Application to Users</h2>
-
-<p>You can release your Android applications several ways. Usually, you release applications
-through an application marketplace, such as Google Play, but you can also release applications
-on your own website or by sending an application directly to a user. Google Play is the
-recommended marketplace for Android applications and is particularly useful if you want to
-distribute your applications to a large global audience. The other two release methods&mdash;server
-distribution and email distribution&mdash;are useful if you are releasing an application to a small
-group of users (for example, a work group in an enterprise environment), or if you do not want to
-make your application available to the general public.</p>
-
-<h3 id="publishing-market">Releasing Your Applications on Google Play</h3>
-
-<p>Google Play is a robust publishing platform that helps you publicize, sell, and distribute
-your Android applications to users around the world. When you release your applications through
-Google Play you have access to a suite of developer tools that let you analyze your sales,
-identify market trends, and control who your applications are being distributed to. You also have
-access to several revenue-enhancing features that are not available anywhere else, such as <a
-href="{@docRoot}google/play/billing/index.html">in-app billing</a> and <a
-href="{@docRoot}google/play/licensing.html">application licensing</a>. This rich array of tools
-and features, coupled with numerous end-user community features, makes Google Play the premier
-marketplace for selling and buying Android applications.</p>
-
-<p>Releasing your application on Google Play is a simple process that involves three basic
- steps:</p>
-
-<div class="figure" style="width:275px">
- <img src="{@docRoot}images/publishing/publishing_unknown_sources.png"
- alt="Screenshot showing the graphical user interface element that allows unknown sources
- to be installed" />
- <p class="img-caption">
- <strong>Figure 2.</strong> The <strong>Unknown sources</strong> setting lets you install
- applications that are not published on Google Play .
- </p>
-</div>
-
-<ul>
- <li>Preparing promotional materials.
- <p>To fully leverage the marketing and publicity capabilities of Google Play, you need to
- create promotional materials for your application, such as screenshots, videos, graphics, and
- promotional text.</p>
- </li>
- <li>Configuring options and uploading assets.
- <p>Google Play lets you target your application to a worldwide pool of users and devices.
- By configuring various Google Play settings, you can choose the countries you want to
- reach, the listing languages you want to use, and the price you want to charge in each
- country. You can also configure listing details such as the application type, category, and
- content rating. When you are done configuring options you can upload your promotional materials
- and your application as a draft (unpublished) application.</p>
- </li>
- <li>Publishing the release version of your application.
- <p>If you are satisfied that your publishing settings are correctly configured and your
- uploaded application is ready to be released to the public, you can simply click
- <strong>Publish</strong > in the developer console and within minutes your application will be
- live and available for download around the world.</p>
- </li>
-</ul>
-
-<p>For information about Google Play, see <a
-href="{@docRoot}tools/publishing/publishing.html#market">Publishing on Google Play</a>. This
-topic provides an introduction to Google Play features and provides a step-by-step guide for
-distributing your applications on Google Play.</p>
-
-<h3 id="publishing-website">Releasing your application on your own website</h3>
-
-<p>If you do not want to release your application on an application marketplace like Google Play,
-you can release your application by making it available for download on your own website or server.
-To do this, you must first prepare your application for release (that is, you must build it for
-release and sign it). Then all you need to do is host the release-ready application on your website
-and provide a download link for the application. When users browse to your website with their
-Android-powered devices and download your application, the Android system will automatically start
-installing the application on the device. However, the installation process will start automatically
-only if the user has configured their device to allow the installation of non-Google Play
-applications.</p>
-
-<div class="figure" style="width:275px">
- <img src="{@docRoot}images/publishing/publishing_via_email.png"
- alt="Screenshot showing the graphical user interface users see when you send them an app"
- height="453" />
- <p class="img-caption">
- <strong>Figure 3.</strong> Users can simply click <strong>Install</strong> when you send them
- an application via email.
- </p>
-</div>
-
-<p>By default, Android-powered devices allow users to install applications only if the applications
-have been downloaded from Google Play. To allow the installation of applications from other
-sources, users need to enable the <strong>Unknown sources</strong> setting on their devices, and
-they need to make this configuration change before they download your application to their
-device (see figure 2).</p>
-
-<p class="note"><strong>Note:</strong> Some network providers do not allow users to install
-applications from unknown sources.</p>
-
-<p>Although it is relatively easy to release your application on your own website, it can be
-inefficient and cumbersome. For example, if you want to monetize your application you will
-have to process and track all financial transactions yourself and you will not be able to use
-Google Play's in-app billing feature to sell in-app products. In addition, you will not be
-able to use the licensing feature to help prevent unauthorized installation and use of your
-application.</p>
-
-<h3 id="publishing-email">Releasing your application through email</h3>
-
-<p>The easiest and quickest way to release your application is to send it to a user through
-email. To do this, you prepare your application for release and then attach it to an email
-and send it to a user. When the user opens your email message on their Android-powered device
-the Android system will recognize the <code>.apk</code> and display an <strong>Install Now</strong>
-button in the email message (see figure 3). Users can install your application by touching the
-button.</p>
-
-<p class="note"><strong>Note:</strong> The <strong>Install Now</strong> button appears only if a
-user has configured their device to allow the installation of non-Google Play applications and
-they open your email with the native Gmail application.</p>
-
-<p>Releasing applications through email is convenient if you are sending your application to
-only a few trusted users, but it provides few protections from piracy and unauthorized
-distribution; that is, anyone you send your application to can simply forward it to someone else.
-else.
diff --git a/docs/html/tools/workflow/publishing/versioning.jd b/docs/html/tools/workflow/publishing/versioning.jd
deleted file mode 100644
index e0b4435..0000000
--- a/docs/html/tools/workflow/publishing/versioning.jd
+++ /dev/null
@@ -1,174 +0,0 @@
-page.title=Versioning Your Applications
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-
-<h2>Quickview</h2>
-
-<ul>
-<li>Your application <em>must</em> be versioned</a></li>
-<li>You set the version in the application's manifest file</li>
-<li>How you version your applications affects how users upgrade </li>
-<li>Determine your versioning strategy early in the development process, including considerations for future releases.</li>
-</ul>
-
-<h2>In this document</h2>
-
-<ol>
-<li><a href="#appversioning">Setting Application Version</a></li>
-<li><a href="#minsdkversion">Specifying Your Application's System API Requirements</a>
-</ol>
-
-
-<h2>See also</h2>
-
-<ol>
-<li><a href="{@docRoot}tools/publishing/preparing.html">Preparing to Publish Your Application</a></li>
-<li><a href="{@docRoot}tools/publishing/publishing.html#market">Publishing On Google Play</a></li>
-<li><a href="{@docRoot}guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml File</a></li>
-</ol>
-
-</div>
-</div>
-
-<p>Versioning is a critical component of your application upgrade and maintenance
-strategy. Versioning is important because:</p>
-
-<ul>
-<li>Users need to have specific information about the application version that
-is installed on their devices and the upgrade versions available for
-installation. </li>
-<li>Other applications &mdash; including other applications that you publish as
-a suite &mdash; need to query the system for your application's version, to
-determine compatibility and identify dependencies.</li>
-<li>Services through which you will publish your application(s) may also need to
-query your application for its version, so that they can display the version to
-users. A publishing service may also need to check the application version to
-determine compatibility and establish upgrade/downgrade relationships.</li>
-</ul>
-
-<p>The Android system does not use app version information to enforce
-restrictions on upgrades, downgrades, or compatibility of third-party apps. Instead, you (the
-developer) are responsible for enforcing version restrictions within your application or by
-informing users of the version restrictions and limitations. The Android system does, however,
-enforce system version compatibility as expressed by the <code>minSdkVersion</code> attribute in the
-manifest. This attribute allows an application to specify the minimum system API with which it is
-compatible. For more information see <a href="#minsdkversion">Specifying Minimum System API
-Version</a>.</p>
-
-<h2 id="appversioning">Setting Application Version</h2>
-<p>To define the version information for your application, you set attributes in
-the application's manifest file. Two attributes are available, and you should
-always define values for both of them: </p>
-
-<ul>
-<li><code>android:versionCode</code> &mdash; An integer value that represents
-the version of the application code, relative to other versions.
-
-<p>The value is an integer so that other applications can programmatically
-evaluate it, for example to check an upgrade or downgrade relationship. You can
-set the value to any integer you want, however you should make sure that each
-successive release of your application uses a greater value. The system does not
-enforce this behavior, but increasing the value with successive releases is
-normative. </p>
-
-<p>Typically, you would release the first version of your application with
-versionCode set to 1, then monotonically increase the value with each release,
-regardless whether the release constitutes a major or minor release. This means
-that the <code>android:versionCode</code> value does not necessarily have a
-strong resemblance to the application release version that is visible to the
-user (see <code>android:versionName</code>, below). Applications and publishing
-services should not display this version value to users.</p>
-</li>
-<li><code>android:versionName</code> &mdash; A string value that represents the
-release version of the application code, as it should be shown to users.
-<p>The value is a string so that you can describe the application version as a
-&lt;major&gt;.&lt;minor&gt;.&lt;point&gt; string, or as any other type of
-absolute or relative version identifier. </p>
-
-<p>As with <code>android:versionCode</code>, the system does not use this value
-for any internal purpose, other than to enable applications to display it to
-users. Publishing services may also extract the <code>android:versionName</code>
-value for display to users.</p>
-</li>
-</ul>
-
-<p>You define both of these version attributes in the
-<code>&lt;manifest&gt;</code> element of the manifest file. </p>
-
-<p>Here's an example manifest that shows the <code>android:versionCode</code>
-and <code>android:versionName</code> attributes in the
-<code>&lt;manifest&gt;</code> element. </p>
-
-<pre>
-&lt;?xml version="1.0" encoding="utf-8"?&gt;
-&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.package.name"
- android:versionCode="2"
- android:versionName="1.1"&gt;
- &lt;application android:icon="@drawable/icon" android:label="@string/app_name"&gt;
- ...
- &lt;/application&gt;
-&lt;/manifest&gt;
-</pre>
-
-<p>In this example, note that <code>android:versionCode</code> value indicates
-that the current .apk contains the second release of the application code, which
-corresponds to a minor follow-on release, as shown by the
-<code>android:versionName</code> string. </p>
-
-<p>The Android framework provides an API to let applications query the system
-for version information about your application. To obtain version information,
-applications use the
-{@link android.content.pm.PackageManager#getPackageInfo(java.lang.String, int)}
-method of {@link android.content.pm.PackageManager PackageManager}. </p>
-
-<h2 id="minsdkversion">Specifying Your Application's System API Requirements</h2>
-
-<p>If your application requires a specific minimum version of the Android
-platform, or is designed only to support a certain range of Android platform
-versions, you can specify those version requirements as API Level identifiers
-in the application's manifest file. Doing so ensures that your
-application can only be installed on devices that
-are running a compatible version of the Android system. </p>
-
-<p>To specify API Level requirements, add a <code>&lt;uses-sdk&gt;</code>
-element in the application's manifest, with one or more of these attributes: </p>
-
-<ul>
-<li><code>android:minSdkVersion</code> &mdash; The minimum version
-of the Android platform on which the application will run, specified
-by the platform's API Level identifier. </li>
-<li><code>android:targetSdkVersion</code> &mdash; Specifies the API Level
-on which the application is designed to run. In some cases, this allows the
-application to use manifest elements or behaviors defined in the target
-API Level, rather than being restricted to using only those defined
-for the minimum API Level.</li>
-<li><code>android:maxSdkVersion</code> &mdash; The maximum version
-of the Android platform on which the application is designed to run,
-specified by the platform's API Level identifier. <strong>Important:</strong> Please read the <a
-href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code>&lt;uses-sdk&gt;</code></a>
-documentation before using this attribute. </li>
-</ul>
-
-<p>When preparing to install your application, the system checks the value of this
-attribute and compares it to the system version. If the
-<code>android:minSdkVersion</code> value is greater than the system version, the
-system aborts the installation of the application. Similarly, the system
-installs your application only if its <code>android:maxSdkVersion</code>
-is compatible with the platform version.</p>
-
-<p>If you do not specify these attributes in your manifest, the system assumes
-that your application is compatible with all platform versions, with no
-maximum API Level. </p>
-
-<p>To specify a minimum platform version for your application, add a
-<code>&lt;uses-sdk&gt;</code> element as a child of
-<code>&lt;manifest&gt;</code>, then define the
-<code>android:minSdkVersion</code> as an attribute. </p>
-
-<p>For more information, see the <a
-href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code>&lt;uses-sdk&gt;</code></a>
-manifest element documentation and the <a
-href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">API Levels</a> document.</p>
diff --git a/docs/html/tools/workflow/publishing_overview.jd b/docs/html/tools/workflow/publishing_overview.jd
deleted file mode 100755
index a1973c9..0000000
--- a/docs/html/tools/workflow/publishing_overview.jd
+++ /dev/null
@@ -1,231 +0,0 @@
-page.title=Publishing Overview
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
- <h2>Quickview</h2>
- <ul>
- <li>Learn how to publish Android apps.</li>
- <li>Find out how to prepare apps for release.</li>
- <li>Learn how to release apps to users.</li>
- </ul>
- <h2>In this document</h2>
- <ol>
- <li><a href="#publishing-prepare">Preparing Your Application for Release</a></li>
- <li><a href="#publishing-release">Releasing Your Application to Users</a>
- <ol>
- <li><a href="#publishing-market">Releasing on Google Play</a></li>
- <li><a href="#publishing-website">Releasing on your own website</a></li>
- <li><a href="#publishing-email">Releasing through email</a></li>
- </ol>
- </ol>
- <h2>See also</h2>
- <ol>
- <li><a href="{@docRoot}tools/publishing/preparing.html">Preparing for
- Release</a></li>
- <li><a href="{@docRoot}tools/publishing/publishing.html">Publishing on Google Play</a></li>
- </ol>
-</div>
-</div>
-
-<p>Publishing is the process that makes your Android applications available to users. When you
-publish an Android application you perform two main tasks:</p>
-
-<ul>
- <li>You prepare the application for release.
- <p>During the preparation step you build a release version of your application, which users can
- download and install on their Android-powered devices.</p>
- </li>
- <li>You release the application to users.
- <p>During the release step you publicize, sell, and distribute the release version of your
- application to users.</p>
- </li>
-</ul>
-
-<p>Usually, you release your application through an application marketplace, such as Google Play.
-However, you can also release applications by sending them directly to users or by letting users
-download them from your own website.</p>
-
-<p>Figure 1 shows how the publishing process fits into the overall Android <a
-href="{@docRoot}tools/workflow/index.html">application development process</a>.
-The publishing process is typically performed after you finish testing your application in a debug
-environment. Also, as a best practice, your application should meet all of your release criteria for
-functionality, performance, and stability before you begin the publishing process.</p>
-
-<img src="{@docRoot}images/publishing/publishing_overview.png" alt="Shows where the publishing
- process fits into the overall development process" height="86" id="figure1" />
-<p class="img-caption">
- <strong>Figure 1.</strong> Publishing is the last phase of the Android <a
-href="{@docRoot}tools/workflow/index.html">application development process</a>.
-</p>
-
-<h2 id="publishing-prepare">Preparing Your Application for Release</h2>
-
-<p>Preparing your application for release is a multi-step process that involves the following
-tasks:</p>
-
-<ul>
-
- <li>Configuring your application for release.
- <p>At a minimum you need to remove {@link android.util.Log} calls and remove the
- <a href="{@docRoot}guide/topics/manifest/application-element.html#debug">android:debuggable</a>
- attribute from your manifest file. You should also provide values for the
- <code>android:versionCode</code> and <code>android:versionName</code> attributes, which are
- located in the
- <a href="{@docRoot}guide/topics/manifest/manifest-element.html">&lt;manifest&gt;</a>
- element. You may also have to configure several other settings to meet Google Play
- requirements or accomodate whatever method you're using to release your application.</p>
- </li>
- <li>Building and signing a release version of your application.
- <p>The Android Development Tools (ADT) plugin and the Ant build script that are provided
- with the Android SDK tools provide everything you need to build and sign a release version of
- your application.</p>
- </li>
- <li>Testing the release version of your application.
- <p>Before you distribute your application, you should thoroughly test the release version on at
- least one target handset device and one target tablet device.</p>
- </li>
- <li>Updating application resources for release.
- <p>You need to be sure that all application resources such as multimedia files and graphics
- are updated and included with your application or staged on the proper production servers.</p>
- </li>
- <li>Preparing remote servers and services that your application depends on.
- <p>If your application depends on external servers or services, you need to be sure they
- are secure and production ready.</p>
- </li>
-</ul>
-
-<p>You may have to perform several other tasks as part of the preparation process. For example, you
-will need to get a private key for signing your application, and you may need to get a Maps API
-release key if you are using the <a
-href="http://code.google.com/android/add-ons/google-apis/maps-overview.html">Google Maps external
-library</a>. You will also need to create an icon for your application, and you may want to prepare
-an End User License Agreement (EULA) to protect your person, organization, and intellectual
-property.</p>
-
-<p>When you are finished preparing your application for release you will have a signed
-<code>.apk</code> file that you can distribute to users.</p>
-
-<p>To learn how to prepare your application for release, see <a
-href="{@docRoot}tools/publishing/preparing.html">Preparing for Release</a> in the Dev Guide. This
-topic provides step-by-step instructions for configuring and building a release version of your
-application.</p>
-
-<h2 id="publishing-release">Releasing Your Application to Users</h2>
-
-<p>You can release your Android applications several ways. Usually, you release applications
-through an application marketplace, such as Google Play, but you can also release applications
-on your own website or by sending an application directly to a user. Google Play is the
-recommended marketplace for Android applications and is particularly useful if you want to
-distribute your applications to a large global audience. The other two release methods&mdash;server
-distribution and email distribution&mdash;are useful if you are releasing an application to a small
-group of users (for example, a work group in an enterprise environment), or if you do not want to
-make your application available to the general public.</p>
-
-<h3 id="publishing-market">Releasing Your Applications on Google Play</h3>
-
-<p>Google Play is a robust publishing platform that helps you publicize, sell, and distribute
-your Android applications to users around the world. When you release your applications through
-Google Play you have access to a suite of developer tools that let you analyze your sales,
-identify market trends, and control who your applications are being distributed to. You also have
-access to several revenue-enhancing features that are not available anywhere else, such as <a
-href="{@docRoot}google/play/billing/index.html">in-app billing</a> and <a
-href="{@docRoot}google/play/licensing.html">application licensing</a>. This rich array of tools
-and features, coupled with numerous end-user community features, makes Google Play the premier
-marketplace for selling and buying Android applications.</p>
-
-<p>Releasing your application on Google Play is a simple process that involves three basic
- steps:</p>
-
-<div class="figure" style="width:275px">
- <img src="{@docRoot}images/publishing/publishing_unknown_sources.png"
- alt="Screenshot showing the graphical user interface element that allows unknown sources
- to be installed" />
- <p class="img-caption">
- <strong>Figure 2.</strong> The <strong>Unknown sources</strong> setting lets you install
- applications that are not published on Google Play .
- </p>
-</div>
-
-<ul>
- <li>Preparing promotional materials.
- <p>To fully leverage the marketing and publicity capabilities of Google Play, you need to
- create promotional materials for your application, such as screenshots, videos, graphics, and
- promotional text.</p>
- </li>
- <li>Configuring options and uploading assets.
- <p>Google Play lets you target your application to a worldwide pool of users and devices.
- By configuring various Google Play settings, you can choose the countries you want to
- reach, the listing languages you want to use, and the price you want to charge in each
- country. You can also configure listing details such as the application type, category, and
- content rating. When you are done configuring options you can upload your promotional materials
- and your application as a draft (unpublished) application.</p>
- </li>
- <li>Publishing the release version of your application.
- <p>If you are satisfied that your publishing settings are correctly configured and your
- uploaded application is ready to be released to the public, you can simply click
- <strong>Publish</strong > in the developer console and within minutes your application will be
- live and available for download around the world.</p>
- </li>
-</ul>
-
-<p>For information about Google Play, see <a
-href="{@docRoot}tools/publishing/publishing.html#market">Publishing on Google Play</a>. This
-topic provides an introduction to Google Play features and provides a step-by-step guide for
-distributing your applications on Google Play.</p>
-
-<h3 id="publishing-website">Releasing your application on your own website</h3>
-
-<p>If you do not want to release your application on an application marketplace like Google Play,
-you can release your application by making it available for download on your own website or server.
-To do this, you must first prepare your application for release (that is, you must build it for
-release and sign it). Then all you need to do is host the release-ready application on your website
-and provide a download link for the application. When users browse to your website with their
-Android-powered devices and download your application, the Android system will automatically start
-installing the application on the device. However, the installation process will start automatically
-only if the user has configured their device to allow the installation of non-Google Play
-applications.</p>
-
-<div class="figure" style="width:275px">
- <img src="{@docRoot}images/publishing/publishing_via_email.png"
- alt="Screenshot showing the graphical user interface users see when you send them an app"
- height="453" />
- <p class="img-caption">
- <strong>Figure 3.</strong> Users can simply click <strong>Install</strong> when you send them
- an application via email.
- </p>
-</div>
-
-<p>By default, Android-powered devices allow users to install applications only if the applications
-have been downloaded from Google Play. To allow the installation of applications from other
-sources, users need to enable the <strong>Unknown sources</strong> setting on their devices, and
-they need to make this configuration change before they download your application to their
-device (see figure 2).</p>
-
-<p class="note"><strong>Note:</strong> Some network providers do not allow users to install
-applications from unknown sources.</p>
-
-<p>Although it is relatively easy to release your application on your own website, it can be
-inefficient and cumbersome. For example, if you want to monetize your application you will
-have to process and track all financial transactions yourself and you will not be able to use
-Google Play's in-app billing feature to sell in-app products. In addition, you will not be
-able to use the licensing feature to help prevent unauthorized installation and use of your
-application.</p>
-
-<h3 id="publishing-email">Releasing your application through email</h3>
-
-<p>The easiest and quickest way to release your application is to send it to a user through
-email. To do this, you prepare your application for release and then attach it to an email
-and send it to a user. When the user opens your email message on their Android-powered device
-the Android system will recognize the <code>.apk</code> and display an <strong>Install Now</strong>
-button in the email message (see figure 3). Users can install your application by touching the
-button.</p>
-
-<p class="note"><strong>Note:</strong> The <strong>Install Now</strong> button appears only if a
-user has configured their device to allow the installation of non-Google Play applications and
-they open your email with the native Gmail application.</p>
-
-<p>Releasing applications through email is convenient if you are sending your application to
-only a few trusted users, but it provides few protections from piracy and unauthorized
-distribution; that is, anyone you send your application to can simply forward it to someone else.
-else.
diff --git a/docs/html/tools/workflow/versioning.jd b/docs/html/tools/workflow/versioning.jd
deleted file mode 100644
index e0b4435..0000000
--- a/docs/html/tools/workflow/versioning.jd
+++ /dev/null
@@ -1,174 +0,0 @@
-page.title=Versioning Your Applications
-@jd:body
-
-<div id="qv-wrapper">
-<div id="qv">
-
-<h2>Quickview</h2>
-
-<ul>
-<li>Your application <em>must</em> be versioned</a></li>
-<li>You set the version in the application's manifest file</li>
-<li>How you version your applications affects how users upgrade </li>
-<li>Determine your versioning strategy early in the development process, including considerations for future releases.</li>
-</ul>
-
-<h2>In this document</h2>
-
-<ol>
-<li><a href="#appversioning">Setting Application Version</a></li>
-<li><a href="#minsdkversion">Specifying Your Application's System API Requirements</a>
-</ol>
-
-
-<h2>See also</h2>
-
-<ol>
-<li><a href="{@docRoot}tools/publishing/preparing.html">Preparing to Publish Your Application</a></li>
-<li><a href="{@docRoot}tools/publishing/publishing.html#market">Publishing On Google Play</a></li>
-<li><a href="{@docRoot}guide/topics/manifest/manifest-intro.html">The AndroidManifest.xml File</a></li>
-</ol>
-
-</div>
-</div>
-
-<p>Versioning is a critical component of your application upgrade and maintenance
-strategy. Versioning is important because:</p>
-
-<ul>
-<li>Users need to have specific information about the application version that
-is installed on their devices and the upgrade versions available for
-installation. </li>
-<li>Other applications &mdash; including other applications that you publish as
-a suite &mdash; need to query the system for your application's version, to
-determine compatibility and identify dependencies.</li>
-<li>Services through which you will publish your application(s) may also need to
-query your application for its version, so that they can display the version to
-users. A publishing service may also need to check the application version to
-determine compatibility and establish upgrade/downgrade relationships.</li>
-</ul>
-
-<p>The Android system does not use app version information to enforce
-restrictions on upgrades, downgrades, or compatibility of third-party apps. Instead, you (the
-developer) are responsible for enforcing version restrictions within your application or by
-informing users of the version restrictions and limitations. The Android system does, however,
-enforce system version compatibility as expressed by the <code>minSdkVersion</code> attribute in the
-manifest. This attribute allows an application to specify the minimum system API with which it is
-compatible. For more information see <a href="#minsdkversion">Specifying Minimum System API
-Version</a>.</p>
-
-<h2 id="appversioning">Setting Application Version</h2>
-<p>To define the version information for your application, you set attributes in
-the application's manifest file. Two attributes are available, and you should
-always define values for both of them: </p>
-
-<ul>
-<li><code>android:versionCode</code> &mdash; An integer value that represents
-the version of the application code, relative to other versions.
-
-<p>The value is an integer so that other applications can programmatically
-evaluate it, for example to check an upgrade or downgrade relationship. You can
-set the value to any integer you want, however you should make sure that each
-successive release of your application uses a greater value. The system does not
-enforce this behavior, but increasing the value with successive releases is
-normative. </p>
-
-<p>Typically, you would release the first version of your application with
-versionCode set to 1, then monotonically increase the value with each release,
-regardless whether the release constitutes a major or minor release. This means
-that the <code>android:versionCode</code> value does not necessarily have a
-strong resemblance to the application release version that is visible to the
-user (see <code>android:versionName</code>, below). Applications and publishing
-services should not display this version value to users.</p>
-</li>
-<li><code>android:versionName</code> &mdash; A string value that represents the
-release version of the application code, as it should be shown to users.
-<p>The value is a string so that you can describe the application version as a
-&lt;major&gt;.&lt;minor&gt;.&lt;point&gt; string, or as any other type of
-absolute or relative version identifier. </p>
-
-<p>As with <code>android:versionCode</code>, the system does not use this value
-for any internal purpose, other than to enable applications to display it to
-users. Publishing services may also extract the <code>android:versionName</code>
-value for display to users.</p>
-</li>
-</ul>
-
-<p>You define both of these version attributes in the
-<code>&lt;manifest&gt;</code> element of the manifest file. </p>
-
-<p>Here's an example manifest that shows the <code>android:versionCode</code>
-and <code>android:versionName</code> attributes in the
-<code>&lt;manifest&gt;</code> element. </p>
-
-<pre>
-&lt;?xml version="1.0" encoding="utf-8"?&gt;
-&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.package.name"
- android:versionCode="2"
- android:versionName="1.1"&gt;
- &lt;application android:icon="@drawable/icon" android:label="@string/app_name"&gt;
- ...
- &lt;/application&gt;
-&lt;/manifest&gt;
-</pre>
-
-<p>In this example, note that <code>android:versionCode</code> value indicates
-that the current .apk contains the second release of the application code, which
-corresponds to a minor follow-on release, as shown by the
-<code>android:versionName</code> string. </p>
-
-<p>The Android framework provides an API to let applications query the system
-for version information about your application. To obtain version information,
-applications use the
-{@link android.content.pm.PackageManager#getPackageInfo(java.lang.String, int)}
-method of {@link android.content.pm.PackageManager PackageManager}. </p>
-
-<h2 id="minsdkversion">Specifying Your Application's System API Requirements</h2>
-
-<p>If your application requires a specific minimum version of the Android
-platform, or is designed only to support a certain range of Android platform
-versions, you can specify those version requirements as API Level identifiers
-in the application's manifest file. Doing so ensures that your
-application can only be installed on devices that
-are running a compatible version of the Android system. </p>
-
-<p>To specify API Level requirements, add a <code>&lt;uses-sdk&gt;</code>
-element in the application's manifest, with one or more of these attributes: </p>
-
-<ul>
-<li><code>android:minSdkVersion</code> &mdash; The minimum version
-of the Android platform on which the application will run, specified
-by the platform's API Level identifier. </li>
-<li><code>android:targetSdkVersion</code> &mdash; Specifies the API Level
-on which the application is designed to run. In some cases, this allows the
-application to use manifest elements or behaviors defined in the target
-API Level, rather than being restricted to using only those defined
-for the minimum API Level.</li>
-<li><code>android:maxSdkVersion</code> &mdash; The maximum version
-of the Android platform on which the application is designed to run,
-specified by the platform's API Level identifier. <strong>Important:</strong> Please read the <a
-href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code>&lt;uses-sdk&gt;</code></a>
-documentation before using this attribute. </li>
-</ul>
-
-<p>When preparing to install your application, the system checks the value of this
-attribute and compares it to the system version. If the
-<code>android:minSdkVersion</code> value is greater than the system version, the
-system aborts the installation of the application. Similarly, the system
-installs your application only if its <code>android:maxSdkVersion</code>
-is compatible with the platform version.</p>
-
-<p>If you do not specify these attributes in your manifest, the system assumes
-that your application is compatible with all platform versions, with no
-maximum API Level. </p>
-
-<p>To specify a minimum platform version for your application, add a
-<code>&lt;uses-sdk&gt;</code> element as a child of
-<code>&lt;manifest&gt;</code>, then define the
-<code>android:minSdkVersion</code> as an attribute. </p>
-
-<p>For more information, see the <a
-href="{@docRoot}guide/topics/manifest/uses-sdk-element.html"><code>&lt;uses-sdk&gt;</code></a>
-manifest element documentation and the <a
-href="{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">API Levels</a> document.</p>
diff --git a/docs/html/training/camera/index.jd b/docs/html/training/camera/index.jd
index fa754a0..d6305d6 100644
--- a/docs/html/training/camera/index.jd
+++ b/docs/html/training/camera/index.jd
@@ -1,5 +1,5 @@
page.title=Capturing Photos
-page.tags="camera","video"
+page.tags="camera","video","picture"
trainingnavtop=true
startpage=true
@@ -42,7 +42,7 @@ prevalent. Remember Gopher? We don't, either. For your app to become
part of your users' lives, give them a way to put their lives into it.
Using the on-board cameras, your application can enable users to augment what
they see around them, make unique avatars, look for zombies around the corner,
-or simply share their experiences.</p>
+or simply share their experiences.</p>
<p>This class gets you clicking fast with some super-easy ways of
leveraging existing camera applications. In later lessons, you dive deeper
@@ -50,7 +50,7 @@ and learn how to control the camera hardware directly.</p>
<h2>Lessons</h2>
-
+
<dl>
<dt><b><a href="photobasics.html">Taking Photos Simply</a></b></dt>
<dd>Leverage other applications and capture photos with just a few lines of code.</dd>
@@ -58,5 +58,5 @@ and learn how to control the camera hardware directly.</p>
<dd>Leverage other applications and record videos with just a few lines of code.</dd>
<dt><b><a href="cameradirect.html">Controlling the Camera</a></b></dt>
<dd>Control the camera hardware directly and implement your own camera application.</dd>
-</dl>
+</dl>
diff --git a/docs/html/training/implementing-navigation/ancestral.jd b/docs/html/training/implementing-navigation/ancestral.jd
index ac35e64..c3c7ef8 100644
--- a/docs/html/training/implementing-navigation/ancestral.jd
+++ b/docs/html/training/implementing-navigation/ancestral.jd
@@ -1,12 +1,7 @@
-page.title=Implementing Ancestral Navigation
-parent.title=Implementing Effective Navigation
-parent.link=index.html
+page.title=Providing Up Navigation
+page.tags="up navigation","NavUtils","TaskStackBuilder"
trainingnavtop=true
-previous.title=Implementing Lateral Navigation
-previous.link=lateral.html
-next.title=Implementing Temporal Navigation
-next.link=temporal.html
@jd:body
@@ -15,8 +10,9 @@ next.link=temporal.html
<h2>This lesson teaches you to:</h2>
<ol>
- <li><a href="#up">Implement <em>Up</em> Navigation</a></li>
- <li><a href="#app-home">Properly Handle the Application Home Screen</a></li>
+ <li><a href="#SpecifyParent">Specify the Parent Activity</a></li>
+ <li><a href="#up">Add Up Action</a></li>
+ <li><a href="#NavigateUp">Navigate Up to Parent Activity</a></li>
</ol>
<h2>You should also read</h2>
@@ -38,87 +34,180 @@ next.link=temporal.html
</div>
-<p><em>Ancestral navigation</em> is up the application's information hierarchy, where the top of the hierarchy (or root) is the application's home screen. This navigation concept is described in <a href="{@docRoot}training/design-navigation/ancestral-temporal.html">Designing Effective Navigation</a>. This lesson discusses how to provide ancestral navigation using the <em>Up</em> button in the action bar.</p>
+<p>All screens in your app that are not the main entrance to your app (the "home" screen)
+should offer the user a way to navigate to the logical parent screen in the app's hierarchy by
+pressing the <em>Up</em> button in the <a
+href="{@docRoot}guide/topics/ui/actionbar.html">action bar</a>.
+This lesson shows you how to properly implement this behavior.</p>
+
+<div class="note design">
+<p><strong>Up Navigation Design</strong></p>
+<p>The concepts and principles for <em>Up</em> navigation are described in <a
+href="{@docRoot}training/design-navigation/ancestral-temporal.html">Designing Effective
+Navigation</a> and the <a href="{@docRoot}design/patterns/navigation.html">Navigation</a> design
+guide.</p>
+</div>
-<h2 id="up">Implement <em>Up</em> Navigation</h2>
+<img src="{@docRoot}images/training/implementing-navigation-up.png" id="figure-up">
+<p class="img-caption"><strong>Figure 1.</strong> The <em>Up</em> button in the action bar.</p>
-<p>When implementing ancestral navigation, all screens in your application that aren't the home screen should offer a means of navigating to the immediate parent screen in the hierarchy via the <em>Up</em> button in the action bar.</p>
-<img src="{@docRoot}images/training/implementing-navigation-up.png"
- alt="The Up button in the action bar." id="figure-up">
+<h2 id="SpecifyParent">Specify the Parent Activity</h2>
-<p class="img-caption"><strong>Figure 1.</strong> The <em>Up</em> button in the action bar.</p>
+<p>To implement <em>Up</em> navigation, the first step is to declare which activity is the
+appropriate parent for each activity. Doing so allows the system to facilitate navigation patterns
+such as <em>Up</em> because the system can determine the logical parent activity from
+the manifest file.</p>
+
+<p>Beginning in Android 4.1 (API level 16), you can declare the logical parent of each
+activity by specifying the <a
+href="{@docRoot}guide/topics/manifest/activity-element.html#parent">{@code
+android:parentActivityName}</a> attribute
+in the <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity>}</a>
+element.</p>
+
+<p>If your app supports Android 4.0 and lower, include the
+<a href="{@docRoot}tools/extras/support-library.html">Support Library</a> with your app and
+add a <a href="{@docRoot}guide/topics/manifest/meta-data-element.html">{@code &lt;meta-data>}</a>
+element inside the <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
+&lt;activity>}</a>. Then specify the parent activity as the value
+for {@code android.support.PARENT_ACTIVITY}, matching the <a
+href="{@docRoot}guide/topics/manifest/activity-element.html#parent">{@code
+android:parentActivityName}</a> attribute.</p>
+
+<p>For example:</p>
-<p>Regardless of how the current screen was reached, pressing this button should always take the user to the same screen in the hierarchy.</p>
+<pre>
+&lt;application ... >
+ ...
+ &lt;!-- The main/home activity (it has no parent activity) -->
+ &lt;activity
+ android:name="com.example.myfirstapp.MainActivity" ...>
+ ...
+ &lt;/activity>
+ &lt;!-- A child of the main activity -->
+ &lt;activity
+ android:name="com.example.myfirstapp.DisplayMessageActivity"
+ android:label="&#64;string/title_activity_display_message"
+ android:parentActivityName="com.example.myfirstapp.MainActivity" >
+ &lt;!-- Parent activity meta-data to support 4.0 and lower -->
+ &lt;meta-data
+ android:name="android.support.PARENT_ACTIVITY"
+ android:value="com.example.myfirstapp.MainActivity" />
+ &lt;/activity>
+&lt;/application>
+</pre>
+
+<p>With the parent activity declared this way, you can navigate <em>Up</em>
+to the appropriate parent using the {@link android.support.v4.app.NavUtils} APIs, as shown in
+the following sections.</p>
-<p>To implement <em>Up</em>, enable it in the action bar in your activity's {@link android.app.Activity#onCreate onCreate()} method:</p>
+
+<h2 id="up">Add Up Action</h2>
+
+<p>To allow <em>Up</em> navigation with the app icon in the action bar, call
+{@link android.app.ActionBar#setDisplayHomeAsUpEnabled setDisplayHomeAsUpEnabled()}:</p>
<pre>
{@literal @}Override
public void onCreate(Bundle savedInstanceState) {
...
getActionBar().setDisplayHomeAsUpEnabled(true);
- ...
}
</pre>
-<p>You should also handle <code>android.R.id.home</code> in {@link android.app.Activity#onOptionsItemSelected onOptionsItemSelected()}. This resource is the menu item ID for the <em>Home</em> (or <em>Up</em>) button. To ensure that a specific parent activity is shown, <em>DO NOT</em> simply call {@link android.app.Activity#finish finish()}. Instead, use an intent such as the one described below.</p>
+<p>This adds a left-facing caret alongside the app icon and enables it as an action button
+such that when the user presses it, your activity receives a call to
+{@link android.app.Activity#onOptionsItemSelected onOptionsItemSelected()}. The
+ID for the action is {@code android.R.id.home}.</p>
+
+
+
+<h2 id="NavigateUp">Navigate Up to Parent Activity</h2>
+
+<p>To navigate up when the user presses the app icon, you can use the {@link
+android.support.v4.app.NavUtils} class's static method,
+{@link android.support.v4.app.NavUtils#navigateUpFromSameTask
+navigateUpFromSameTask()}. When you call this method, it finishes the current activity and
+starts (or resumes) the appropriate parent activity.
+If the target parent activity is in the task's back stack, it is brought
+forward as defined by {@link android.content.Intent#FLAG_ACTIVITY_CLEAR_TOP}.</p>
+
+<p>For example:</p>
<pre>
{@literal @}Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
- case android.R.id.home:
- // This is called when the Home (Up) button is pressed
- // in the Action Bar.
- Intent parentActivityIntent = new Intent(this, MyParentActivity.class);
- parentActivityIntent.addFlags(
- Intent.FLAG_ACTIVITY_CLEAR_TOP |
- Intent.FLAG_ACTIVITY_NEW_TASK);
- startActivity(parentActivityIntent);
- finish();
- return true;
+ // Respond to the action bar's Up/Home button
+ case android.R.id.home:
+ NavUtils.navigateUpFromSameTask(this);
+ return true;
}
return super.onOptionsItemSelected(item);
}
</pre>
-<p>When the current activity belongs to a task from a different application&mdash;for example if it was reached via an intent from another application&mdash;pressing <em>Up</em> should create a new task for the application with a synthesized back stack. This approach is described in <a href="{@docRoot}design/patterns/navigation.html">Android Design: Navigation</a> and the {@link android.support.v4.app.TaskStackBuilder} class reference.</p>
+<p>However, using {@link android.support.v4.app.NavUtils#navigateUpFromSameTask
+navigateUpFromSameTask()} is suitable <strong>only when your app is the owner of the current
+task</strong> (that is, the user began this task from your app). If that's not true and your
+activity was started in a task that belongs to a different app, then
+navigating <em>Up</em> should create a new task that belongs to your app, which
+requires that you create a new back stack.</p>
+
+
+<h3 id="BuildBackStack">Navigate up with a new back stack</h3>
-<p>The {@link android.support.v4.app.NavUtils} and {@link android.support.v4.app.TaskStackBuilder} classes in the <a href="{@docRoot}tools/extras/support-library.html">Android Support Package</a> provide helpers for implementing this behavior correctly. An example usage of these two helper classes is below:</p>
+<p>If your activity provides any <a
+href="{@docRoot}guide/components/intents-filters.html#ifs">intent filters</a>
+that allow other apps to start the
+activity, you should implement the {@link android.app.Activity#onOptionsItemSelected
+onOptionsItemSelected()} callback such that if the user presses the <em>Up</em> button
+after entering your activity from another app's task, your app starts a new task
+with the appropriate back stack before navigating up.</p>
+
+<p>You can do so by first calling
+{@link android.support.v4.app.NavUtils#shouldUpRecreateTask shouldUpRecreateTask()} to check
+whether the current activity instance exists in a different app's task. If
+it returns true, then build a new task with {@link android.support.v4.app.TaskStackBuilder}.
+Otherwise, you can use the {@link android.support.v4.app.NavUtils#navigateUpFromSameTask
+navigateUpFromSameTask()} method as shown above.</p>
+
+<p>For example:</p>
<pre>
{@literal @}Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
- case android.R.id.home:
- Intent upIntent = new Intent(this, MyParentActivity.class);
- if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
- // This activity is not part of the application's task, so create a new task
- // with a synthesized back stack.
- TaskStackBuilder.from(this)
- .addNextIntent(new Intent(this, MyGreatGrandParentActivity.class))
- .addNextIntent(new Intent(this, MyGrandParentActivity.class))
- .addNextIntent(upIntent)
- .startActivities();
- finish();
- } else {
- // This activity is part of the application's task, so simply
- // navigate up to the hierarchical parent activity.
- NavUtils.navigateUpTo(this, upIntent);
- }
- return true;
+ // Respond to the action bar's Up/Home button
+ case android.R.id.home:
+ Intent upIntent = NavUtils.getParentActivityIntent(this);
+ if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
+ // This activity is NOT part of this app's task, so create a new task
+ // when navigating up, with a synthesized back stack.
+ TaskStackBuilder.create(this)
+ // Add all of this activity's parents to the back stack
+ .addNextIntentWithParentStack(upIntent)
+ // Navigate up to the closest parent
+ .startActivities();
+ } else {
+ // This activity is part of this app's task, so simply
+ // navigate up to the logical parent activity.
+ NavUtils.navigateUpTo(this, upIntent);
+ }
+ return true;
}
return super.onOptionsItemSelected(item);
}
</pre>
-<h2 id="app-home">Properly Handle the Application Home Screen</h2>
-
-<p>By default, the <em>Home</em> button in the action bar is interactive. Since it does not make much sense to navigate home&mdash;or up one level&mdash;while on the home screen, you should disable the button like so:</p>
-
-<pre>
-getActionBar().setHomeButtonEnabled(false);
-</pre>
+<p class="note"><strong>Note:</strong> In order for the {@link
+android.support.v4.app.TaskStackBuilder#addNextIntentWithParentStack addNextIntentWithParentStack()}
+method to work,
+you must declare the logical parent of each activity in your manifest file, using the
+<a href="{@docRoot}guide/topics/manifest/activity-element.html#parent">{@code
+android:parentActivityName}</a> attribute (and corresponding <a
+href="{@docRoot}guide/topics/manifest/meta-data-element.html">{@code &lt;meta-data>}</a> element)
+as described above.</p>
diff --git a/docs/html/training/implementing-navigation/index.jd b/docs/html/training/implementing-navigation/index.jd
index 990bcfe..519f6bb 100644
--- a/docs/html/training/implementing-navigation/index.jd
+++ b/docs/html/training/implementing-navigation/index.jd
@@ -1,5 +1,4 @@
page.title=Implementing Effective Navigation
-page.tags="viewpager","tasks","back","up"
trainingnavtop=true
startpage=true
@@ -12,9 +11,9 @@ startpage=true
<h2>Dependencies and prerequisites</h2>
<ul>
- <li>API level 14</li>
+ <li>Android 2.2 or higher</li>
<li>Understanding of fragments and Android layouts</li>
- <li><a href="{@docRoot}tools/extras/support-library.html">The Android Support Package</a></li>
+ <li><a href="{@docRoot}tools/extras/support-library.html">Android Support Library</a></li>
<li><a href="{@docRoot}training/design-navigation/index.html">Designing Effective Navigation</a></li>
</ul>
@@ -40,28 +39,38 @@ startpage=true
<p>This class demonstrates how to implement the key navigation design patterns detailed in the
<a href="{@docRoot}training/design-navigation/index.html">Designing Effective Navigation</a> class.
-The lessons in this class cover implementing navigation up, down, and across your application's <a
-href="{@docRoot}training/design-navigation/screen-planning.html#diagram- relationships">screen
-map</a>.</p>
+</p>
-<p>After reading through the lessons in this class and exploring the associated sample application
-(see right), you should also have a basic understanding of how to use
-{@link android.app.ActionBar} and {@link android.support.v4.view.ViewPager}, two components that are fundamental to core app navigation.</p>
+<p>After reading the lessons in this class, you should have a strong understanding of how to
+implement navigation patterns with tabs, swipe views, and a navigation drawer. You should also
+understand how to provide proper <em>Up</em> and <em>Back</em> navigation.</p>
+<p class="note"><strong>Note:</strong> Several elements of this class require the
+<a href="{@docRoot}tools/extras/support-library.html">Support Library</a> APIs.
+If you have not used the Support Library before, follow the lesson about <a
+href="{@docRoot}training/basics/fragments/support-lib.html">Using the Support Library</a>
+to get your project set up.</p>
-<h2 id="lessons">Lessons</h2>
+<h2 id="lessons">Lessons</h2>
<dl>
- <dt><strong><a href="lateral.html">Implementing Lateral Navigation</a></strong></dt>
- <dd>Learn how to implement tabs and horizontal paging (swipe views).</dd>
+ <dt><strong><a href="lateral.html">Creating Swipe Views with Tabs</a></strong></dt>
+ <dd>Learn how to implement tabs in the action bar and provide
+ horizontal paging (swipe views) to navigate between tabs.</dd>
+
+ <dt><strong><a href="nav-drawer.html">Creating a Navigation Drawer</a></strong></dt>
+ <dd>Learn how to build an interface with a hidden navigation drawer on the side
+ of the screen that opens with a swipe or by pressing the action bar's app icon.</dd>
- <dt><strong><a href="ancestral.html">Implementing Ancestral Navigation</a></strong></dt>
- <dd>Learn how to implement <em>Up</em> navigation.</dd>
+ <dt><strong><a href="ancestral.html">Providing Up Navigation</a></strong></dt>
+ <dd>Learn how to implement <em>Up</em> navigation using the action bar's app icon.</dd>
- <dt><strong><a href="temporal.html">Implementing Temporal Navigation</a></strong></dt>
- <dd>Learn how to correctly handle the <em>Back</em> button.</dd>
+ <dt><strong><a href="temporal.html">Providing Proper Back Navigation</a></strong></dt>
+ <dd>Learn how to correctly handle the <em>Back</em> button in special cases,
+ including how to insert activities into the back stack when deep-linking the user
+ from notifications or app widgets.</dd>
<dt><strong><a href="descendant.html">Implementing Descendant Navigation</a></strong></dt>
- <dd>Learn the finer points of implementing navigation into your application's information hierarchy.</dd>
+ <dd>Learn the finer points of navigating down into your application's information hierarchy.</dd>
</dl>
diff --git a/docs/html/training/implementing-navigation/lateral.jd b/docs/html/training/implementing-navigation/lateral.jd
index c8f57a2..3784372 100644
--- a/docs/html/training/implementing-navigation/lateral.jd
+++ b/docs/html/training/implementing-navigation/lateral.jd
@@ -1,10 +1,7 @@
-page.title=Implementing Lateral Navigation
-parent.title=Implementing Effective Navigation
-parent.link=index.html
+page.title=Creating Swipe Views with Tabs
+page.tags="viewpager","horizontal","paging"
trainingnavtop=true
-next.title=Implementing Ancestral Navigation
-next.link=ancestral.html
@jd:body
@@ -13,11 +10,13 @@ next.link=ancestral.html
<h2>This lesson teaches you to</h2>
<ol>
- <li><a href="#tabs">Implement Tabs</a></li>
- <li><a href="#horizontal-paging">Implement Horizontal Paging (Swipe Views)</a></li>
- <li><a href="#swipe-tabs">Implement Swiping Between Tabs</a></li>
+ <li><a href="#horizontal-paging">Implement Swipe Views</a></li>
+ <li><a href="#tabs">Add Tabs to the Action Bar</a></li>
+ <li><a href="#swipe-tabs">Change Tabs with Swipe Views</a></li>
+ <li><a href="#PagerTitleStrip">Use a Title Strip Instead of Tabs</a></li>
</ol>
+
<h2>You should also read</h2>
<ul>
<li><a href="{@docRoot}training/design-navigation/descendant-lateral.html">Providing Descendant and Lateral Navigation</a></li>
@@ -37,92 +36,60 @@ next.link=ancestral.html
</div>
-<p><em>Lateral navigation</em> is navigation between sibling screens in the application's screen hierarchy (sometimes referred to as a screen map). The most prominent lateral navigation patterns are tabs and horizontal paging (also known as swipe views). This pattern and others are described in <a href="{@docRoot}training/design-navigation/descendant-lateral.html">Designing Effective Navigation</a>. This lesson covers how to implement several of the primary lateral navigation patterns in Android.</p>
+<p>Swipe views provide lateral navigation between sibling screens such as tabs with
+a horizontal finger gesture (a pattern sometimes known as horizontal paging). This lesson teaches
+you how to create a tab layout with swipe views for switching between tabs, or how to show
+a title strip instead of tabs.</p>
-<h2 id="tabs">Implement Tabs</h2>
+<div class="note design">
+<p><strong>Swipe View Design</strong></p>
+<p>Before implementing these features, you should understand the concepts and recommendations
+as described in <a href="{@docRoot}training/design-navigation/descendant-lateral.html">Designing
+Effective Navigation</a> and the <a href="{@docRoot}design/patterns/swipe-views.html">Swipe
+Views</a> design guide.</p>
+</div>
-<p>Tabs allow the user to navigate between sibling screens by selecting the appropriate tab indicator available at the top of the display. In Android 3.0 and later, tabs are implemented using the {@link android.app.ActionBar} class, and are generally set up in {@link android.app.Activity#onCreate Activity.onCreate()}. In some cases, such as when horizontal space is limited and/or the number of tabs is large, an appropriate alternate presentation for tabs is a dropdown list (sometimes implemented using a {@link android.widget.Spinner}).</p>
-<p>In previous versions of Android, tabs could be implemented using a
-{@link android.widget.TabWidget} and {@link android.widget.TabHost}.</p>
-<p>As of Android 3.0, however, you should use either {@link android.app.ActionBar#NAVIGATION_MODE_TABS} or {@link android.app.ActionBar#NAVIGATION_MODE_LIST} along with the {@link android.app.ActionBar} class.</p>
-<h3>Implement the Tabs Pattern with NAVIGATION_MODE_TABS</h3>
-<p>To create tabs, you can use the following code in your activity's {@link android.app.Activity#onCreate onCreate()} method. Note that the exact presentation of tabs may vary per device and by the current device configuration, to make best use of available screen space. For example, Android may automatically collapse tabs into a dropdown list if tabs don't fit horizontally in the action bar.</p>
+<h2 id="horizontal-paging">Implement Swipe Views</h2>
-<pre>
-{@literal @}Override
-public void onCreate(Bundle savedInstanceState) {
- ...
- final ActionBar actionBar = getActionBar();
+<p>You can create swipe views in your app using the {@link android.support.v4.view.ViewPager}
+widget, available in the
+<a href="{@docRoot}tools/extras/support-library.html">Support Library</a>. The
+{@link android.support.v4.view.ViewPager} is a layout widget in which each child view is
+a separate page (a separate tab) in the layout.</p>
- // Specify that tabs should be displayed in the action bar.
- actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
-
- // Create a tab listener that is called when the user changes tabs.
- ActionBar.TabListener tabListener = new ActionBar.TabListener() {
- public void onTabSelected(ActionBar.Tab tab,
- FragmentTransaction ft) { }
-
- public void onTabUnselected(ActionBar.Tab tab,
- FragmentTransaction ft) { }
-
- public void onTabReselected(ActionBar.Tab tab,
- FragmentTransaction ft) { }
- };
-
- // Add 3 tabs.
- for (int i = 0; i &lt; 3; i++) {
- actionBar.addTab(
- actionBar.newTab()
- .setText("Tab " + (i + 1))
- .setTabListener(tabListener));
- }
- ...
-}
-</pre>
-
-<h3>Implement the Tabs Pattern with NAVIGATION_MODE_LIST</h3>
-
-<p>To use a dropdown list instead, use the following code in your activity's {@link android.app.Activity#onCreate onCreate()} method. Dropdown lists are often preferable in cases where more information must be shown per navigation item, such as unread message counts, or where the number of available navigation items is large.</p>
+<p>To set up your layout with {@link android.support.v4.view.ViewPager}, add a
+{@code &lt;ViewPager>} element to your XML layout. For example, if each page in the swipe view
+should consume the entire layout, then your layout looks like this:</p>
<pre>
-{@literal @}Override
-public void onCreate(Bundle savedInstanceState) {
- ...
- final ActionBar actionBar = getActionBar();
-
- // Specify that a dropdown list should be displayed in the action bar.
- actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
-
- actionBar.setListNavigationCallbacks(
- // Specify a SpinnerAdapter to populate the dropdown list.
- new ArrayAdapter<String>(
- actionBar.getThemedContext(),
- android.R.layout.simple_list_item_1,
- android.R.id.text1,
- new String[]{ "Tab 1", "Tab 2", "Tab 3" }),
-
- // Provide a listener to be called when an item is selected.
- new ActionBar.OnNavigationListener() {
- public boolean onNavigationItemSelected(
- int position, long id) {
- // Take action here, e.g. switching to the
- // corresponding fragment.
- return true;
- }
- });
- ...
-}
+&lt;?xml version="1.0" encoding="utf-8"?>
+&lt;android.support.v4.view.ViewPager
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/pager"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
</pre>
-<h2 id="horizontal-paging">Implement Horizontal Paging (Swipe Views)</h2>
+<p>To insert child views that represent each page,
+you need to hook this layout to a {@link android.support.v4.view.PagerAdapter}.
+There are two kinds of adapter you can use:</p>
-<p>Horizontal paging, or swipe views, allow users to <a href="{@docRoot}design/patterns/swipe-views.html">swipe</a> horizontally on the current screen to navigate to adjacent screens. This pattern can be implemented using the {@link android.support.v4.view.ViewPager} widget, currently available as part of the <a href="{@docRoot}tools/extras/support-library.html">Android Support Package</a>. For navigating between sibling screens representing a fixed number of sections, it's best to provide the {@link android.support.v4.view.ViewPager} with a {@link android.support.v4.app.FragmentPagerAdapter}. For horizontal paging across collections of objects, it's best to use a {@link android.support.v4.app.FragmentStatePagerAdapter}, which destroys fragments as the user navigates to other pages, minimizing memory usage.</p>
+<dl>
+ <dt>{@link android.support.v4.app.FragmentPagerAdapter}</dt>
+ <dd>This is best when navigating between sibling screens representing a fixed, small
+ number of pages.</dd>
+ <dt>{@link android.support.v4.app.FragmentStatePagerAdapter}</dt>
+ <dd>This is best for paging across a collection of objects
+for which the number of pages is undetermined. It destroys
+fragments as the user navigates to other pages, minimizing memory usage.</dd>
+</dl>
-<p>Below is an example of using a {@link android.support.v4.view.ViewPager} to swipe across a collection of objects.</p>
+<p>For example, here's how you might use {@link android.support.v4.app.FragmentStatePagerAdapter}
+to swipe across a collection of {@link android.app.Fragment} objects:</p>
<pre>
public class CollectionDemoActivity extends FragmentActivity {
@@ -147,8 +114,7 @@ public class CollectionDemoActivity extends FragmentActivity {
// Since this is an object collection, use a FragmentStatePagerAdapter,
// and NOT a FragmentPagerAdapter.
-public class DemoCollectionPagerAdapter extends
- FragmentStatePagerAdapter {
+public class DemoCollectionPagerAdapter extends FragmentStatePagerAdapter {
public DemoCollectionPagerAdapter(FragmentManager fm) {
super(fm);
}
@@ -194,38 +160,99 @@ public static class DemoObjectFragment extends Fragment {
}
</pre>
-<p>You can also add indicators to your horizontal paging UI by adding a {@link android.support.v4.view.PagerTitleStrip}. Below is an example layout XML file for an activity whose entire contents are a {@link android.support.v4.view.ViewPager} and a top-aligned {@link android.support.v4.view.PagerTitleStrip} inside it. Individual pages (provided by the adapter) occupy the remaining space inside the {@link android.support.v4.view.ViewPager}.</p>
+<p>This example shows only the code necessary to create the swipe views. The following
+sections show how you can add tabs to help facilitate navigation between pages.</p>
+
+
+<h2 id="tabs">Add Tabs to the Action Bar</h2>
+
+<p>Action bar
+<a href="{@docRoot}design/building-blocks/tabs.html">tabs</a> offer users a familiar interface
+for navigating between and identifying sibling screens in your app.</p>
+
+<p>To create tabs using {@link android.app.ActionBar}, you need to enable
+{@link android.app.ActionBar#NAVIGATION_MODE_TABS}, then create several instances of
+{@link android.app.ActionBar.Tab} and supply an implementation of
+the {@link android.app.ActionBar.TabListener} interface for each one.
+For example, in your activity's {@link
+android.app.Activity#onCreate onCreate()} method, you can use code similar to this:</p>
<pre>
-&lt;android.support.v4.view.ViewPager
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/pager"
- android:layout_width="match_parent"
- android:layout_height="match_parent"&gt;
+{@literal @}Override
+public void onCreate(Bundle savedInstanceState) {
+ final ActionBar actionBar = getActionBar();
+ ...
- &lt;android.support.v4.view.PagerTitleStrip
- android:id="@+id/pager_title_strip"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="top"
- android:background="#33b5e5"
- android:textColor="#fff"
- android:paddingTop="4dp"
- android:paddingBottom="4dp" /&gt;
+ // Specify that tabs should be displayed in the action bar.
+ actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
-&lt;/android.support.v4.view.ViewPager&gt;
+ // Create a tab listener that is called when the user changes tabs.
+ ActionBar.TabListener tabListener = new ActionBar.TabListener() {
+ public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
+ // show the given tab
+ }
+
+ public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
+ // hide the given tab
+ }
+
+ public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
+ // probably ignore this event
+ }
+ };
+
+ // Add 3 tabs, specifying the tab's text and TabListener
+ for (int i = 0; i &lt; 3; i++) {
+ actionBar.addTab(
+ actionBar.newTab()
+ .setText("Tab " + (i + 1))
+ .setTabListener(tabListener));
+ }
+}
</pre>
-<h2 id="swipe-tabs">Implement Swiping Between Tabs</h2>
+<p>How you handle the {@link android.app.ActionBar.TabListener} callbacks to change tabs
+depends on how you've constructed your content. But if you're using fragments for each tab with
+{@link android.support.v4.view.ViewPager} as shown above, the following
+section shows how to switch between pages when the user selects a tab and also update the selected
+tab when the user swipes between pages.</p>
+
-<p>One of the key design recommendations in Android 4.0 for tabs is to <a href="{@docRoot}design/patterns/swipe-views.html">allow swiping</a> between them where appropriate. This behavior enables users to swipe horizontally across the selected tab's contents to navigate to adjacent tabs, without needed to directly interact with the tabs themselves. To implement this, you can use a {@link android.support.v4.view.ViewPager} in conjunction with the {@link android.app.ActionBar} tabs API.</p>
+<h2 id="swipe-tabs">Change Tabs with Swipe Views</h2>
-<p>Upon observing the current page changing, select the corresponding tab. You can set up this behavior using an {@link android.support.v4.view.ViewPager.OnPageChangeListener} in your activity's {@link android.app.Activity#onCreate onCreate()} method:</p>
+<p>To switch between pages in a {@link android.support.v4.view.ViewPager} when the user selects
+a tab, implement your {@link android.app.ActionBar.TabListener} to select the appropriate page
+by calling {@link android.support.v4.view.ViewPager#setCurrentItem setCurrentItem()} on your
+{@link android.support.v4.view.ViewPager}:</p>
<pre>
{@literal @}Override
public void onCreate(Bundle savedInstanceState) {
...
+
+ // Create a tab listener that is called when the user changes tabs.
+ ActionBar.TabListener tabListener = new ActionBar.TabListener() {
+ public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
+ // When the tab is selected, switch to the
+ // corresponding page in the ViewPager.
+ mViewPager.setCurrentItem(tab.getPosition());
+ }
+ ...
+ };
+}
+</pre>
+
+<p>Likewise, you should select the corresponding tab when the user swipes between pages with a
+touch gesture. You can set up this behavior by implementing the
+{@link android.support.v4.view.ViewPager.OnPageChangeListener} interface to change
+the current tab each time the page changes. For example:</p>
+
+<pre>
+{@literal @}Override
+public void onCreate(Bundle savedInstanceState) {
+ ...
+
+ mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOnPageChangeListener(
new ViewPager.SimpleOnPageChangeListener() {
{@literal @}Override
@@ -239,18 +266,36 @@ public void onCreate(Bundle savedInstanceState) {
}
</pre>
-<p>And upon selecting a tab, switch to the corresponding page in the {@link android.support.v4.view.ViewPager}. To do this, add an {@link android.app.ActionBar.TabListener} to your tab when creating it using the {@link android.app.ActionBar#newTab newTab()} method:</p>
+
+
+<h2 id="PagerTitleStrip">Use a Title Strip Instead of Tabs</h2>
+
+<p>If you don't want to include action bar tabs and prefer to provide
+<a href="{@docRoot}design/building-blocks/tabs.html#scrollable">scrollable tabs</a> for a shorter
+visual profile, you can use {@link android.support.v4.view.PagerTitleStrip} with
+your swipe views.</p>
+
+<p>Below is an example layout XML file for an
+activity whose entire contents are a {@link android.support.v4.view.ViewPager} and a top-aligned
+{@link android.support.v4.view.PagerTitleStrip} inside it. Individual pages (provided by the
+adapter) occupy the remaining space inside the {@link android.support.v4.view.ViewPager}.</p>
<pre>
-actionBar.newTab()
- ...
- .setTabListener(new ActionBar.TabListener() {
- public void onTabSelected(ActionBar.Tab tab,
- FragmentTransaction ft) {
- // When the tab is selected, switch to the
- // corresponding page in the ViewPager.
- mViewPager.setCurrentItem(tab.getPosition());
- }
- ...
- }));
+&lt;android.support.v4.view.ViewPager
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/pager"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"&gt;
+
+ &lt;android.support.v4.view.PagerTitleStrip
+ android:id="@+id/pager_title_strip"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="top"
+ android:background="#33b5e5"
+ android:textColor="#fff"
+ android:paddingTop="4dp"
+ android:paddingBottom="4dp" /&gt;
+
+&lt;/android.support.v4.view.ViewPager&gt;
</pre>
diff --git a/docs/html/training/implementing-navigation/nav-drawer.jd b/docs/html/training/implementing-navigation/nav-drawer.jd
new file mode 100644
index 0000000..527d570
--- /dev/null
+++ b/docs/html/training/implementing-navigation/nav-drawer.jd
@@ -0,0 +1,382 @@
+page.title=Creating a Navigation Drawer
+page.tags="DrawerLayout", "navigation"
+
+trainingnavtop=true
+
+@jd:body
+
+<div id="tb-wrapper">
+<div id="tb">
+
+<h2>This lesson teaches you to:</h2>
+<ol>
+ <li><a href="#DrawerLayout">Create a Drawer Layout</a></li>
+ <li><a href="#Init">Initialize the Drawer List</a></li>
+ <li><a href="#ListItemClicks">Handle Navigation Click Events</a></li>
+ <li><a href="#OpenClose">Listen for Open and Close Events</a></li>
+ <li><a href="#ActionBarIcon">Open and Close with the App Icon</a></li>
+</ol>
+
+<h2>Try it out</h2>
+
+<div class="download-box">
+<a href="http://developer.android.com/shareables/training/NavigationDrawer.zip"
+ class="button">Download the sample app</a>
+<p class="filename">NavigationDrawer.zip</p>
+</div>
+
+<div class="download-box">
+<a href="http://developer.android.com/downloads/design/Android_Navigation_Drawer_Icon_20130516.zip"
+ class="button">Download the nav drawer icons</a>
+<p class="filename">Android_Navigation_Drawer_Icon_20130516.zip</p>
+</div>
+
+</div>
+</div>
+
+
+
+<p>The navigation drawer is a panel that displays the app’s main navigation options
+on the left edge of the screen. It is hidden most of the time, but is revealed
+when the user swipes a finger from the left edge of the screen or, while at the top level of the
+app, the user touches the app icon in the action bar.</p>
+
+<p>This lesson describes how to implement a navigation drawer using the
+{@link android.support.v4.widget.DrawerLayout} APIs available in the
+<a href="{@docRoot}tools/extras/support-library.html">Support Library</a>.</p>
+
+<div class="note design">
+<p><strong>Navigation Drawer Design</strong></p>
+<p>Before you decide to use a navigation drawer in your app, you should understand the use
+cases and design principles defined in the
+<a href="{@docRoot}design/patterns/navigation-drawer.html">Navigation Drawer</a> design guide.</p>
+</div>
+
+
+<h2 id="DrawerLayout">Create a Drawer Layout</h2>
+
+<p>To add a navigation drawer, declare your user interface with a
+{@link android.support.v4.widget.DrawerLayout} object as the root view of your layout.
+Inside the {@link android.support.v4.widget.DrawerLayout}, add one view that contains
+the main content for the screen (your primary layout when the drawer is hidden) and another view
+that contains the contents of the navigation drawer.</p>
+
+<p>For example, the following layout uses a {@link
+android.support.v4.widget.DrawerLayout} with two child views: a {@link android.widget.FrameLayout}
+to contain the main content (populated by a {@link android.app.Fragment} at
+runtime), and a {@link android.widget.ListView} for the navigation drawer.</p>
+
+<pre>
+&lt;android.support.v4.widget.DrawerLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/drawer_layout"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ &lt;!-- The main content view -->
+ &lt;FrameLayout
+ android:id="@+id/content_frame"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+ &lt;!-- The navigation drawer -->
+ &lt;ListView android:id="@+id/left_drawer"
+ android:layout_width="240dp"
+ android:layout_height="match_parent"
+ android:layout_gravity="start"
+ android:choiceMode="singleChoice"
+ android:divider="&#64;android:color/transparent"
+ android:dividerHeight="0dp"
+ android:background="#111"/>
+&lt;/android.support.v4.widget.DrawerLayout>
+</pre>
+
+<p>This layout demonstrates some important layout characteristics:</p>
+<ul>
+ <li>The main content view (the {@link android.widget.FrameLayout} above)
+ <strong>must be the first child</strong> in the {@link
+ android.support.v4.widget.DrawerLayout} because the XML order implies z-ordering
+ and the drawer must be on top of the content.</li>
+ <li>The main content view is set to match the parent
+ view's width and height, because it represents the entire UI when the
+ navigation drawer is hidden.</li>
+ <li>The drawer view (the {@link android.widget.ListView}) <strong>must specify its horizontal
+ gravity</strong> with the {@code android:layout_gravity} attribute. To
+ support right-to-left (RTL) languages, specify the value with {@code "start"}
+ instead of {@code "left"} (so the drawer appears on the right when the layout is RTL).</p>
+ </li>
+ <li>The drawer view specifies its width in {@code dp} units and the height matches the parent
+ view. The drawer width should be no more than 320dp so the user can always
+ see a portion of the main content.</li>
+</ul>
+
+
+
+<h2 id="Init">Initialize the Drawer List</h2>
+
+<p>In your activity, one of the first things to do is initialize
+the navigation drawer's list of items. How you do so depends on the content of your app, but
+a navigation drawer often consists of a {@link android.widget.ListView}, so the list
+should be populated by an {@link android.widget.Adapter} (such as {@link
+android.widget.ArrayAdapter} or {@link android.widget.SimpleCursorAdapter}).</p>
+
+<p>For example, here's how you can initialize the navigation list with a
+<a href="{@docRoot}guide/topics/resources/string-resource.html#StringArray">string array</a>:</p>
+
+<pre>
+public class MainActivity extends Activity {
+ private String[] mPlanetTitles;
+ private ListView mDrawerList;
+ ...
+
+ &#64;Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+
+ mPlanetTitles = getResources().getStringArray(R.array.planets_array);
+ mDrawerList = (ListView) findViewById(R.id.left_drawer);
+
+ // Set the adapter for the list view
+ mDrawerList.setAdapter(new ArrayAdapter&lt;String>(this,
+ R.layout.drawer_list_item, mPlanetTitles));
+ // Set the list's click listener
+ mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
+
+ ...
+ }
+}
+</pre>
+
+<p>This code also calls {@link android.widget.ListView#setOnItemClickListener
+setOnItemClickListener()} to receive click events in the navigation drawer's list.
+The next section shows how to implement this interface
+and change the content view when the user selects an item.</p>
+
+
+
+<h2 id="ListItemClicks">Handle Navigation Click Events</h2>
+
+<p>When the user selects an item in the drawer's list, the system calls {@link
+android.widget.AdapterView.OnItemClickListener#onItemClick onItemClick()} on the
+{@link android.widget.AdapterView.OnItemClickListener OnItemClickListener} given to
+{@link android.widget.ListView#setOnItemClickListener setOnItemClickListener()}.</p>
+
+<p>What you do in the {@link
+android.widget.AdapterView.OnItemClickListener#onItemClick onItemClick()} method
+depends on how you've implemented your <a
+href="{@docRoot}design/patterns/app-structure.html">app structure</a>. In the following example,
+selecting each item in the list inserts a different {@link
+android.app.Fragment} into the main content view (the
+{@link android.widget.FrameLayout} element identified by the {@code R.id.content_frame} ID):</p>
+
+<pre>
+private class DrawerItemClickListener implements ListView.OnItemClickListener {
+ &#64;Override
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
+ selectItem(position);
+ }
+}
+
+/** Swaps fragments in the main content view */
+private void selectItem(int position) {
+ // Create a new fragment and specify the planet to show based on position
+ Fragment fragment = new PlanetFragment();
+ Bundle args = new Bundle();
+ args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
+ fragment.setArguments(args);
+
+ // Insert the fragment by replacing any existing fragment
+ FragmentManager fragmentManager = getFragmentManager();
+ fragmentManager.beginTransaction()
+ .replace(R.id.content_frame, fragment)
+ .commit();
+
+ // Highlight the selected item, update the title, and close the drawer
+ mDrawer.setItemChecked(position, true);
+ setTitle(mPlanetTitles[position]);
+ mDrawerLayout.closeDrawer(mDrawer);
+}
+
+&#64;Override
+public void setTitle(CharSequence title) {
+ mTitle = title;
+ getActionBar().setTitle(mTitle);
+}
+
+</pre>
+
+
+
+
+<h2 id="OpenClose">Listen for Open and Close Events</h2>
+
+<p>To listen for drawer open and close events, call {@link
+android.support.v4.widget.DrawerLayout#setDrawerListener setDrawerListener()} on your
+{@link android.support.v4.widget.DrawerLayout} and pass it an implementation of
+{@link android.support.v4.widget.DrawerLayout.DrawerListener}. This interface provides callbacks
+for drawer events such as {@link
+android.support.v4.widget.DrawerLayout.DrawerListener#onDrawerOpened onDrawerOpened()} and {@link
+android.support.v4.widget.DrawerLayout.DrawerListener#onDrawerClosed onDrawerClosed()}.</p>
+
+<p>However, rather than implementing the {@link
+android.support.v4.widget.DrawerLayout.DrawerListener}, if your activity includes the
+<a href="{@docRoot}guide/topics/ui/actionbar.html">action bar</a>, you can instead
+extend the {@link android.support.v4.app.ActionBarDrawerToggle} class. The
+{@link android.support.v4.app.ActionBarDrawerToggle} implements
+{@link android.support.v4.widget.DrawerLayout.DrawerListener} so you can still override those
+callbacks, but it also facilitates the proper
+interaction behavior between the action bar icon and the navigation drawer (discussed further in
+the next section).</p>
+
+<p>As discussed in the <a href="{@docRoot}design/patterns/navigation-drawer.html">Navigation
+Drawer</a> design guide, you should modify the contents of the action bar
+when the drawer is visible, such as to change the title and remove action items that are
+contextual to the main content. The following code shows how you can do so by overriding {@link
+android.support.v4.widget.DrawerLayout.DrawerListener} callback methods with an instance
+of the {@link android.support.v4.app.ActionBarDrawerToggle} class:</p>
+
+<pre>
+public class MainActivity extends Activity {
+ private DrawerLayout mDrawerLayout;
+ private ActionBarDrawerToggle mDrawerToggle;
+ private CharSequence mDrawerTitle;
+ private CharSequence mTitle;
+ ...
+
+ &#64;Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ ...
+
+ mTitle = mDrawerTitle = getTitle();
+ mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+ mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
+ R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {
+
+ /** Called when a drawer has settled in a completely closed state. */
+ public void onDrawerClosed(View view) {
+ getActionBar().setTitle(mTitle);
+ invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
+ }
+
+ /** Called when a drawer has settled in a completely open state. */
+ public void onDrawerOpened(View drawerView) {
+ getActionBar().setTitle(mDrawerTitle);
+ invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
+ }
+ };
+
+ // Set the drawer toggle as the DrawerListener
+ mDrawerLayout.setDrawerListener(mDrawerToggle);
+ }
+
+ /* Called whenever we call invalidateOptionsMenu() */
+ &#64;Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ // If the nav drawer is open, hide action items related to the content view
+ boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
+ menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
+ return super.onPrepareOptionsMenu(menu);
+ }
+}
+</pre>
+
+<p>The next section describes the {@link android.support.v4.app.ActionBarDrawerToggle} constructor
+arguments and the other steps required to set it up to handle interaction with the
+action bar icon.</p>
+
+
+
+<h2 id="ActionBarIcon">Open and Close with the App Icon</h2>
+
+<p>Users can open and close the navigation drawer with a swipe gesture from or towards the left
+edge of the screen, but if you're using the <a
+href="{@docRoot}guide/topics/ui/actionbar.html">action bar</a>, you should also allow users to
+open and close it by touching the app icon. And the app icon should also indicate the presence of
+the navigation drawer with a special icon. You can implement all this behavior by using the
+{@link android.support.v4.app.ActionBarDrawerToggle} shown in the previous section.</p>
+
+<p>To make {@link android.support.v4.app.ActionBarDrawerToggle} work, create an instance of
+it with its constructor, which requires the following arguments:</p>
+<ul>
+ <li>The {@link android.app.Activity} hosting the drawer.
+ <li>The {@link android.support.v4.widget.DrawerLayout}.
+ <li>A drawable resource to use as the drawer indicator.
+ <p><a href="http://developer.android.com/downloads/design/Android_Navigation_Drawer_Icon_20130516.zip"
+>Download the standard navigation icons</a> (available for both dark and light themes).</p>
+ <li>A String resource to describe the "open drawer" action (for accessibility).
+ <li>A String resource to describe the "close drawer" action (for accessibility).
+</ul>
+
+<p>Then, whether or not you've created a subclass of
+{@link android.support.v4.app.ActionBarDrawerToggle} as your drawer listener, you need to call
+upon your {@link android.support.v4.app.ActionBarDrawerToggle} in a few places throughout your
+activity lifecycle:</p>
+
+<pre>
+public class MainActivity extends Activity {
+ private DrawerLayout mDrawerLayout;
+ private ActionBarDrawerToggle mDrawerToggle;
+ ...
+
+ public void onCreate(Bundle savedInstanceState) {
+ ...
+
+ mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
+ mDrawerToggle = new ActionBarDrawerToggle(
+ this, /* host Activity */
+ mDrawerLayout, /* DrawerLayout object */
+ R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */
+ R.string.drawer_open, /* "open drawer" description */
+ R.string.drawer_close /* "close drawer" description */
+ ) {
+
+ /** Called when a drawer has settled in a completely closed state. */
+ public void onDrawerClosed(View view) {
+ getActionBar().setTitle(mTitle);
+ }
+
+ /** Called when a drawer has settled in a completely open state. */
+ public void onDrawerOpened(View drawerView) {
+ getActionBar().setTitle(mDrawerTitle);
+ }
+ };
+
+ // Set the drawer toggle as the DrawerListener
+ mDrawerLayout.setDrawerListener(mDrawerToggle);
+
+ getActionBar().setDisplayHomeAsUpEnabled(true);
+ getActionBar().setHomeButtonEnabled(true);
+ }
+
+ &#64;Override
+ protected void onPostCreate(Bundle savedInstanceState) {
+ super.onPostCreate(savedInstanceState);
+ // Sync the toggle state after onRestoreInstanceState has occurred.
+ mDrawerToggle.syncState();
+ }
+
+ &#64;Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ mDrawerToggle.onConfigurationChanged(newConfig);
+ }
+
+ &#64;Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ // Pass the event to ActionBarDrawerToggle, if it returns
+ // true, then it has handled the app icon touch event
+ if (mDrawerToggle.onOptionsItemSelected(item)) {
+ return true;
+ }
+ // Handle your other action bar items...
+
+ return super.onOptionsItemSelected(item);
+ }
+
+ ...
+}
+</pre>
+
+<p>For a complete example of a navigation drawer, download the sample available at the
+<a href="#top">top of the page</a>.</p>
diff --git a/docs/html/training/implementing-navigation/temporal.jd b/docs/html/training/implementing-navigation/temporal.jd
index 1c41732..0719ba6 100644
--- a/docs/html/training/implementing-navigation/temporal.jd
+++ b/docs/html/training/implementing-navigation/temporal.jd
@@ -1,12 +1,7 @@
-page.title=Implementing Temporal Navigation
-parent.title=Implementing Effective Navigation
-parent.link=index.html
+page.title=Providing Proper Back Navigation
+page.tags="back navigation","NavUtils","TaskStackBuilder"
trainingnavtop=true
-previous.title=Implementing Ancestral Navigation
-previous.link=ancestral.html
-next.title=Implementing Descendant Navigation
-next.link=descendant.html
@jd:body
@@ -15,8 +10,9 @@ next.link=descendant.html
<h2>This lesson teaches you to:</h2>
<ol>
- <li><a href="#back-fragments">Implement <em>Back</em> Navigation with Fragments</a></li>
- <li><a href="#back-webviews">Implement <em>Back</em> Navigation with WebViews</a></li>
+ <li><a href="#SynthesizeBackStack">Synthesize a new Back Stack for Deep Links</a></li>
+ <li><a href="#back-fragments">Implement Back Navigation for Fragments</a></li>
+ <li><a href="#back-webviews">Implement Back Navigation for WebViews</a></li>
</ol>
<h2>You should also read</h2>
@@ -30,32 +26,191 @@ next.link=descendant.html
</div>
-<p><em>Temporal navigation</em> is navigation to previously visited screens. Users can visit previous screens by pressing the device <em>Back</em> button. This user interface pattern is described further in <a href="{@docRoot}training/design-navigation/ancestral-temporal.html">Providing Ancestral and Temporal Navigation</a> in <em>Designing Effective Navigation</em> and in <a href="{@docRoot}design/patterns/navigation.html">Android Design: Navigation</a>.</p>
+<p><em>Back</em> navigation is how users move backward through the history of screens
+they previously visited. All Android devices provide a <em>Back</em> button for this
+type of navigation, so <strong>your app should not add a Back button to the UI</strong>.</p>
-<p>Android handles basic <em>Back</em> navigation for you (see <a href="{@docRoot}guide/components/tasks-and-back-stack.html">Tasks and Back Stack</a> for details on this behavior). This lesson discusses a number of cases where applications should provide specialized logic for the <em>Back</em> button.</p>
+<p>In almost all situations, the system maintains a back stack of activities while the user
+navigates your application. This allows the system to properly navigate backward when the user
+presses the <em>Back</em> button. However, there are a few cases in which your app should manually
+specify the <em>Back</em> behavior in order to provide the best user experience.</p>
+<div class="note design">
+<p><strong>Back Navigation Design</strong></p>
+<p>Before continuing with this document, you should understand the
+concepts and principles for <em>Back</em> navigation as described in
+the <a href="{@docRoot}design/patterns/navigation.html">Navigation</a> design
+guide.</p>
+</div>
+
+<p>Navigation patterns that require you to manually specify the <em>Back</em> behavior include:</p>
+<ul>
+ <li>When the user enters a deep-level activity directly from a <a
+ href="{@docRoot}guide/topics/ui/notifiers/notifications.html">notification</a>, an <a
+ href="{@docRoot}guide/topics/appwidgets/index.html">app widget</a>, or the <a
+ href="{@docRoot}training/implementing-navigation/nav-drawer.html">navigation drawer</a>.</li>
+ <li>Certain cases in which the user navigates between <a
+ href="{@docRoot}guide/components/fragments.html">fragments</a>.</li>
+ <li>When the user navigates web pages in a {@link android.webkit.WebView}.</li>
+</ul>
+
+<p>How to implement proper <em>Back</em> navigation in these situations is described
+in the following sections.</p>
+
+
+
+<h2 id="SynthesizeBackStack">Synthesize a new Back Stack for Deep Links</h2>
+
+<p>Ordinarily, the system incrementally builds the back stack as the user navigates from one
+activity to the next. However, when the user enters your app with a <em>deep link</em> that
+starts the activity in its own task, it's necessary for you to synthesize a new
+back stack because the activity is running in a new task without any back stack at all.</p>
+
+<p>For example, when a notification takes the user to an activity deep in your app hierarchy,
+you should add activities into your task's back stack so that pressing <em>Back</em> navigates
+up the app hierarchy instead of exiting the app. This pattern is described further in the
+<a href="{@docRoot}design/patterns/navigation.html#into-your-app"
+>Navigation</a> design guide.</p>
+
+
+<h3 id="SpecifyParent">Specify parent activities in the manifest</h3>
+
+<p>Beginning in Android 4.1 (API level 16), you can declare the logical parent of each
+activity by specifying the <a
+href="{@docRoot}guide/topics/manifest/activity-element.html#parent">{@code
+android:parentActivityName}</a> attribute
+in the <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
+&lt;activity>}</a> element. This allows the system to facilitate navigation patterns
+because it can determine the logical <em>Back</em> or <em>Up</em> navigation path with this
+information.</p>
+
+<p>If your app supports Android 4.0 and lower, include the
+<a href="{@docRoot}tools/extras/support-library.html">Support Library</a> with your app and
+add a <a href="{@docRoot}guide/topics/manifest/meta-data-element.html">{@code &lt;meta-data>}</a>
+element inside the <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
+&lt;activity>}</a>. Then specify the parent activity as the value
+for {@code android.support.PARENT_ACTIVITY}, matching the <a
+href="{@docRoot}guide/topics/manifest/activity-element.html#parent">{@code
+android:parentActivityName}</a> attribute.</p>
+
+<p>For example:</p>
+
+<pre>
+&lt;application ... >
+ ...
+ &lt;!-- The main/home activity (it has no parent activity) -->
+ &lt;activity
+ android:name="com.example.myfirstapp.MainActivity" ...>
+ ...
+ &lt;/activity>
+ &lt;!-- A child of the main activity -->
+ &lt;activity
+ android:name="com.example.myfirstapp.DisplayMessageActivity"
+ android:label="&#64;string/title_activity_display_message"
+ android:parentActivityName="com.example.myfirstapp.MainActivity" >
+ &lt;!-- The meta-data element is needed for versions lower than 4.1 -->
+ &lt;meta-data
+ android:name="android.support.PARENT_ACTIVITY"
+ android:value="com.example.myfirstapp.MainActivity" />
+ &lt;/activity>
+&lt;/application>
+</pre>
+
+<p>With the parent activity declared this way, you can use the
+{@link android.support.v4.app.NavUtils} APIs to synthesize a new back stack by identifying which
+activity is the appropriate parent for each activity.</p>
-<h2 id="back-fragments">Implement <em>Back</em> Navigation with Fragments</h2>
-<p>When using fragments in your application, individual {@link android.app.FragmentTransaction} objects can represent context changes that should be added to the back stack. For example, if you are implementing a <a href="descendant.html#master-detail">master/detail flow</a> on a handset by swapping out fragments (thus emulating a {@link android.app.Activity#startActivity startActivity()} call), you should ensure that pressing the <em>Back</em> button on a detail screen returns the user to the master screen. To do so, you can use {@link android.app.FragmentTransaction#addToBackStack addToBackStack()}:</p>
+
+<h3 id="CreateBackStack">Create back stack when starting the activity</h3>
+
+<p>Adding activities to the back stack begins upon the event that takes the user into your app.
+That is, instead of calling {@link android.content.Context#startActivity startActivity()}, use the
+{@link android.support.v4.app.TaskStackBuilder} APIs to define each activity that should
+be placed into a new back stack. Then begin the target activity by calling {@link
+android.support.v4.app.TaskStackBuilder#startActivities startActivities()}, or create the
+appropriate {@link android.app.PendingIntent} by calling {@link
+android.support.v4.app.TaskStackBuilder#getPendingIntent getPendingIntent()}.</p>
+
+<p>For example, when a notification takes the user to an activity deep in your app hierarchy,
+you can use this code to create a {@link android.app.PendingIntent}
+that starts an activity and inserts a new back stack into the target task:</p>
+
+<pre>
+// Intent for the activity to open when user selects the notification
+Intent detailsIntent = new Intent(this, DetailsActivity.class);
+
+// Use TaskStackBuilder to build the back stack and get the PendingIntent
+PendingIntent pendingIntent =
+ TaskStackBuilder.create(this)
+ // add all of DetailsActivity's parents to the stack,
+ // followed by DetailsActivity itself
+ .addNextIntentWithParentStack(upIntent)
+ .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
+
+NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
+builder.setContentIntent(pendingIntent);
+...
+</pre>
+
+<p>The resulting {@link android.app.PendingIntent} specifies not only the activity to
+start (as defined by {@code detailsIntent}), but also the back stack that should be inserted
+into the task (all parents of the {@code DetailsActivity} defined by {@code detailsIntent}).
+So when the {@code DetailsActivity} starts, pressing <em>Back</em>
+navigates backward through each of the {@code DetailsActivity} class's parent activities.</p>
+
+<p class="note"><strong>Note:</strong> In order for the {@link
+android.support.v4.app.TaskStackBuilder#addNextIntentWithParentStack addNextIntentWithParentStack()}
+method to work,
+you must declare the logical parent of each activity in your manifest file, using the
+<a href="{@docRoot}guide/topics/manifest/activity-element.html#parent">{@code
+android:parentActivityName}</a> attribute (and corresponding <a
+href="{@docRoot}guide/topics/manifest/meta-data-element.html">{@code &lt;meta-data>}</a> element)
+as described above.</p>
+
+
+
+
+
+<h2 id="back-fragments">Implement Back Navigation for Fragments</h2>
+
+<p>When using fragments in your app, individual {@link android.app.FragmentTransaction}
+objects may represent context changes that should be added to the back stack. For example, if you
+are implementing a <a href="descendant.html#master-detail">master/detail flow</a> on a handset by
+swapping out fragments, you should ensure that pressing the <em>Back</em> button on a detail
+screen returns the user to the master screen. To do so, call {@link
+android.app.FragmentTransaction#addToBackStack addToBackStack()} before you commit
+the transaction:</p>
<pre>
// Works with either the framework FragmentManager or the
// support package FragmentManager (getSupportFragmentManager).
-getFragmentManager().beginTransaction()
- .add(detailFragment, "detail")
-
- // Add this transaction to the back stack and commit.
- .addToBackStack()
- .commit();
+getSupportFragmentManager().beginTransaction()
+ .add(detailFragment, "detail")
+ // Add this transaction to the back stack
+ .addToBackStack()
+ .commit();
</pre>
-<p>The activity's {@link android.app.FragmentManager} handles <em>Back</em> button presses if there are {@link android.app.FragmentTransaction} objects on the back stack. When this happens, the {@link android.app.FragmentManager} pops the most recent transaction off the back stack and performs the reverse action (e.g., removing a fragment if the transaction added it).</p>
+<p>When there are {@link android.app.FragmentTransaction} objects on the back stack and the user
+presses the <em>Back</em> button,
+the {@link android.app.FragmentManager} pops the most recent transaction off the back stack and
+performs the reverse action (such as removing a fragment if the transaction added it).</p>
-<p>If your application updates other user interface elements to reflect the current state of your fragments, such as the action bar, remember to update the UI when you commit the transaction. You should update your user interface after the fragment manager back stack changes in addition to when you commit the transaction. You can listen for when a <code>FragmentTransaction</code> is reverted by setting up an {@link android.app.FragmentManager.OnBackStackChangedListener}:</p>
+<p class="note"><strong>Note:</strong> You <strong>should not add transactions to the back
+stack</strong> when the transaction is for horizontal navigation (such as when switching tabs)
+or when modifying the content appearance (such as when adjusting filters). For more information,
+about when <em>Back</em> navigation is appropriate,
+see the <a href="{@docRoot}design/patterns/navigation.html">Navigation</a> design guide.</p>
+
+<p>If your application updates other user interface elements to reflect the current state of your
+fragments, such as the action bar, remember to update the UI when you commit the transaction. You
+should update your user interface after the back stack changes in addition to
+when you commit the transaction. You can listen for when a {@link android.app.FragmentTransaction}
+is reverted by setting up an {@link android.app.FragmentManager.OnBackStackChangedListener}:</p>
<pre>
-getFragmentManager().addOnBackStackChangedListener(
+getSupportFragmentManager().addOnBackStackChangedListener(
new FragmentManager.OnBackStackChangedListener() {
public void onBackStackChanged() {
// Update your UI here.
@@ -63,9 +218,14 @@ getFragmentManager().addOnBackStackChangedListener(
});
</pre>
-<h2 id="back-webviews">Implement <em>Back</em> Navigation with WebViews</h2>
-<p>If a part of your application is contained in a {@link android.webkit.WebView}, it may be appropriate for <em>Back</em> to traverse browser history. To do so, you can override {@link android.app.Activity#onBackPressed onBackPressed()} and proxy to the <code>WebView</code> if it has history state:</p>
+
+<h2 id="back-webviews">Implement Back Navigation for WebViews</h2>
+
+<p>If a part of your application is contained in a {@link android.webkit.WebView}, it may be
+appropriate for <em>Back</em> to traverse browser history. To do so, you can override {@link
+android.app.Activity#onBackPressed onBackPressed()} and proxy to the
+{@link android.webkit.WebView} if it has history state:</p>
<pre>
{@literal @}Override
@@ -80,4 +240,9 @@ public void onBackPressed() {
}
</pre>
-<p>Be careful when using this mechanism with highly dynamic web pages that can grow a large history. Pages that generate an extensive history, such as those that make frequent changes to the document hash, may make it tedious for users to get out of your activity.</p>
+<p>Be careful when using this mechanism with highly dynamic web pages that can grow a large
+history. Pages that generate an extensive history, such as those that make frequent changes to
+the document hash, may make it tedious for users to get out of your activity.</p>
+
+<p>For more information about using {@link android.webkit.WebView}, read <a
+href="{@docRoot}guide/webapps/webview.html">Building Web Apps in WebView</a>.
diff --git a/docs/html/training/training_toc.cs b/docs/html/training/training_toc.cs
index ee6913c..61517e0 100644
--- a/docs/html/training/training_toc.cs
+++ b/docs/html/training/training_toc.cs
@@ -624,20 +624,25 @@
<div class="nav-section-header">
<a href="<?cs var:toroot ?>training/implementing-navigation/index.html"
description=
- "How to implement various navigation patterns such as swipe views and up navigation."
+ "How to implement various navigation patterns such as swipe views,
+ a navigation drawer, and up navigation."
>Implementing Effective Navigation</a>
</div>
<ul>
<li><a href="<?cs var:toroot ?>training/implementing-navigation/lateral.html">
- Implementing Lateral Navigation
+ Creating Swipe Views with Tabs
+ </a>
+ </li>
+ <li><a href="<?cs var:toroot ?>training/implementing-navigation/nav-drawer.html">
+ Creating a Navigation Drawer
</a>
</li>
<li><a href="<?cs var:toroot ?>training/implementing-navigation/ancestral.html">
- Implementing Ancestral Navigation
+ Providing Up Navigation
</a>
</li>
<li><a href="<?cs var:toroot ?>training/implementing-navigation/temporal.html">
- Implementing Temporal Navigation
+ Providing Proper Back Navigation
</a>
</li>
<li><a href="<?cs var:toroot ?>training/implementing-navigation/descendant.html">