diff options
Diffstat (limited to 'docs/html/training')
19 files changed, 529 insertions, 277 deletions
diff --git a/docs/html/training/articles/keystore.jd b/docs/html/training/articles/keystore.jd index fca958e..52cb13e 100644 --- a/docs/html/training/articles/keystore.jd +++ b/docs/html/training/articles/keystore.jd @@ -32,7 +32,7 @@ page.title=Android Keystore System keystore, they can be used for cryptographic operations with the key material remaining non-exportable. Moreover, it offers facilities to restrict when and how keys can be used, such as requiring user authentication for key use or - restricting encryption keys to be used only in certain block modes. See + restricting keys to be used only in certain cryptographic modes. See <a href="#SecurityFeatures">Security Features</a> section for more information.</p> <p>The Keystore system is used by the {@link @@ -48,7 +48,8 @@ Android Keystore system protects key material from unauthorized use. Firstly, An mitigates unauthorized use of key material outside of the Android device by preventing extraction of the key material from application processes and from the Android device as a whole. Secondly, Android KeyStore mitigates unauthorized use of key material on the Android device by making apps -specify authorized uses of their keys and then enforcing these restrictions. +specify authorized uses of their keys and then enforcing these restrictions outside of the apps' +processes. <h3 id="ExtractionPrevention">Extraction Prevention</h3> @@ -78,14 +79,16 @@ Key material of Android Keystore keys is protected from extraction using two sec To mitigate unauthorized use of keys on the Android device, Android Keystore lets apps specify authorized uses of their keys when generating or importing the keys. Once a key is generated or imported, its authorizations can not be changed. Authorizations are then enforced by the Android -Keystore whenever the key is used. +Keystore whenever the key is used. This is an advanced security feature which is generally useful +only if your requirements are that a compromise of your application process after key +generation/import (but not before or during) cannot lead to unauthorized uses of the key. <p>Supported key use authorizations fall into the following categories: <ul> <li><em>cryptography</em>: authorized key algorithm, operations or purposes (encrypt, decrypt, sign, - verify), padding schemes, block modes, digests with which the key can be used</li> + verify), padding schemes, block modes, digests with which the key can be used;</li> <li><em>temporal validity interval</em>: interval of time during which the key is authorized for - use</li> + use;</li> <li><em>user authentication</em>: the key can only be used if the user has been authenticated recently enough. See <a href="#UserAuthentication">Requiring User Authentication For Key Use</a>. </li> @@ -181,23 +184,33 @@ and {@link java.security.KeyPairGenerator} or <h3 id="UserAuthentication">Requiring User Authentication For Key Use</h3> <p>When generating or importing a key into the {@code AndroidKeyStore} you can specify that the key -can only be used if user has been authenticated. The user is authenticated using a subset of their -secure lock screen credentials. This is a security measure which makes it possible to generate -cryptographic assertions about the user having been authenticated. +is only authorized to be used if the user has been authenticated. The user is authenticated using a +subset of their secure lock screen credentials (pattern/PIN/password, fingerprint). -<p>When a key is configured to require user authentication, it is also configured to operate in one -of the two modes: +<p>This is an advanced security feature which is generally useful only if your requirements are that +a compromise of your application process after key generation/import (but not before or during) +cannot bypass the requirement for the user to be authenticated to use the key. + +<p>When a key is authorized to be used only if the user has been authenticated, it is configured to +operate in one of the two modes: <ul> -<li>User authentication is valid for a duration of time. All keys in this mode are authorized - for use as soon as the user unlocks the secure lock screen or confirms their secure lock screen - credentials using the {@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(CharSequence, CharSequence) KeyguardManager.createConfirmDeviceCredentialIntent} - flow. Each key specifies for how long the authorization remains valid for that key. Such keys - can only be generated or imported if the secure lock screen is enabled (see {@link android.app.KeyguardManager#isDeviceSecure() KeyguardManager.isDeviceSecure()}). - These keys become permanently invalidated once the secure lock screen is disabled or forcibly - reset (e.g. by a Device Admin).</li> -<li>User authentication is required for every use of the key. In this mode, a specific operation - involving a specific key is authorized by the user. Currently, the only means of such - authorization is fingerprint authentication: {@link android.hardware.fingerprint.FingerprintManager#authenticate(CryptoObject, CancellationSignal, int, AuthenticationCallback, Handler) FingerprintManager.authenticate}. - Such keys can only be generated or imported if at least one fingerprint is enrolled (see {@link android.hardware.fingerprint.FingerprintManager#hasEnrolledFingerprints() FingerprintManager.hasEnrolledFingerprints}). - These keys become permanently invalidated once all fingerprints are unenrolled.</li> -</ul> +<li>User authentication authorizes the use of keys for a duration of time. All keys in this mode are + authorized for use as soon as the user unlocks the secure lock screen or confirms their secure + lock screen credential using the + {@link android.app.KeyguardManager#createConfirmDeviceCredentialIntent(CharSequence, CharSequence) KeyguardManager.createConfirmDeviceCredentialIntent} + flow. The duration for which the authorization remains valid is specific to each key, as specified + using {@code setUserAuthenticationValidityDurationSeconds} during key generation or import. Such + keys can only be generated or imported if the secure lock screen is enabled (see + {@link android.app.KeyguardManager#isDeviceSecure() KeyguardManager.isDeviceSecure()}). These keys + become permanently invalidated once the secure lock screen is disabled (reconfigured to None, + Swipe or other mode which does not authenticate the user) or forcibly reset (e.g. by a Device + Administrator).</li> +<li>User authentication authorizes a specific cryptographic operation associated with one key. In + this mode, each operation involving such a key must be individually authorized by the user. + Currently, the only means of such authorization is fingerprint authentication: + {@link android.hardware.fingerprint.FingerprintManager#authenticate(CryptoObject, CancellationSignal, int, AuthenticationCallback, Handler) FingerprintManager.authenticate}. + Such keys can only be generated or imported if at least one fingerprint is enrolled (see + {@link android.hardware.fingerprint.FingerprintManager#hasEnrolledFingerprints() FingerprintManager.hasEnrolledFingerprints}). + These keys become permanently invalidated once a new fingerprint is enrolled or all fingerprints + are unenrolled.</li> +</ul>
\ No newline at end of file diff --git a/docs/html/training/enterprise/index.jd b/docs/html/training/enterprise/index.jd index fce09b9..d54607c 100644 --- a/docs/html/training/enterprise/index.jd +++ b/docs/html/training/enterprise/index.jd @@ -6,10 +6,10 @@ page.article=true @jd:body -<img src="{@docRoot}images/enterprise/work-launcher.png" - width="300" - style="float:right;margin:0 0 20px 20px" - alt="Android for Work apps in a managed profile"> +<iframe width="448" height="252" + src="//www.youtube.com/embed/jQWB_-o1kz4?autohide=1&showinfo=0" + frameborder="0" allowfullscreen="" + style="float: right; margin: 0 0 20px 20px;"></iframe> <p> The Android framework provides features to support the security, data separation, and @@ -32,7 +32,6 @@ page.article=true the enterprise environment or build enterprise-specific solutions. </p> - <h2 id="apps">App Development for Enterprises</h2> <p> @@ -44,7 +43,7 @@ page.article=true <div class="dynamic-grid"> <div class="resource-widget resource-flow-layout landing col-12" data-query="collection:training/work/apps" - data-cardSizes="9x3" + data-cardSizes="6x6" data-maxResults="6"> </div> </div> @@ -60,7 +59,7 @@ page.article=true <div class="dynamic-grid"> <div class="resource-widget resource-flow-layout landing col-12" data-query="collection:training/work/admin" - data-cardSizes="9x3" + data-cardSizes="6x6" data-maxResults="4"> </div> </div> diff --git a/docs/html/training/training_toc.cs b/docs/html/training/training_toc.cs index ccefe72..e1e6838 100644 --- a/docs/html/training/training_toc.cs +++ b/docs/html/training/training_toc.cs @@ -1023,8 +1023,8 @@ include the action bar on devices running Android 2.1 or higher." <li class="nav-section"> <div class="nav-section-header"> <a href="<?cs var:toroot ?>training/tv/tif/index.html" - description="How to build Live TV apps."> - Building Live TV Apps</a> + description="How to build channels for TV."> + Building TV Channels</a> </div> <ul> <li> diff --git a/docs/html/training/tv/discovery/searchable.jd b/docs/html/training/tv/discovery/searchable.jd index 27a1c33..4ca7abb 100644 --- a/docs/html/training/tv/discovery/searchable.jd +++ b/docs/html/training/tv/discovery/searchable.jd @@ -90,7 +90,7 @@ more important columns are described below.</p> <td>The production year of your content <strong>(required)</strong></td> </tr><tr> <td>{@code SUGGEST_COLUMN_DURATION}</td> - <td>The duration in milliseconds of your media</td> + <td>The duration in milliseconds of your media <strong>(required)</strong></td> </tr> </table> @@ -99,6 +99,7 @@ more important columns are described below.</p> <li>{@link android.app.SearchManager#SUGGEST_COLUMN_TEXT_1}</li> <li>{@link android.app.SearchManager#SUGGEST_COLUMN_CONTENT_TYPE}</li> <li>{@link android.app.SearchManager#SUGGEST_COLUMN_PRODUCTION_YEAR}</li> + <li>{@link android.app.SearchManager#SUGGEST_COLUMN_DURATION}</li> </ul> <p>When the values of these columns for your content match the values for the same content from other diff --git a/docs/html/training/tv/publishing/checklist.jd b/docs/html/training/tv/publishing/checklist.jd index 865a89b..6259721 100644 --- a/docs/html/training/tv/publishing/checklist.jd +++ b/docs/html/training/tv/publishing/checklist.jd @@ -67,12 +67,12 @@ page.article=true <li> Eliminate requirements for unsupported hardware in your app. - <p>See <a href="training/tv/start/hardware.html#declare-hardware-requirements">Declaring hardware requirements for TV</a>.</p> + <p>See <a href="{@docRoot}training/tv/start/hardware.html#declare-hardware-requirements">Declaring hardware requirements for TV</a>.</p> </li> <li> Ensure permissions do not imply hardware requirements - <p>See <a href="training/tv/start/hardware.html#hardware-permissions">Declaring permissions that imply hardware features</a>.</p> + <p>See <a href="{@docRoot}training/tv/start/hardware.html#hardware-permissions">Declaring permissions that imply hardware features</a>.</p> </li> </ol> diff --git a/docs/html/training/tv/tif/index.jd b/docs/html/training/tv/tif/index.jd index 5739294..92b6139 100644 --- a/docs/html/training/tv/tif/index.jd +++ b/docs/html/training/tv/tif/index.jd @@ -1,4 +1,4 @@ -page.title=Building Live TV Apps +page.title=Building TV Channels page.tags=tv, tif helpoutsWidget=true startpage=true @@ -25,12 +25,17 @@ startpage=true </div> <p> - Watching live television shows and other continuous, channel-based content is a big part of the - TV experience. Android supports receiving and playback of live video content through the TV Input - Framework in Android 5.0 (API level 21). - This framework provides a unified method for receiving audio and video channel content - from hardware sources, such as HDMI ports and built-in-tuners, and software sources, such as - video streamed over the internet. +Watching live TV shows and other continuous, channel-based content is a big part of the TV +experience. Users are accustomed to selecting and watching shows on TV by channel browsing. +To provide your users a similar experience, use the TV Input Framework to create channels for +publishing video or music content so that your media appears alongside traditional TV channels in +the programming guide. +</p> +<p> +Android supports receiving and playback of live video content through the TV Input Framework in +Android 5.0 (API level 21). This framework provides a unified method for receiving audio and video +channel content from hardware sources, such as HDMI ports and built-in-tuners, and software +sources, such as video streamed over the internet. </p> <p> The framework enables developers to define live TV input sources by implementing a TV input diff --git a/docs/html/training/wearables/apps/creating.jd b/docs/html/training/wearables/apps/creating.jd index a8b5ec6..f1491e4 100644 --- a/docs/html/training/wearables/apps/creating.jd +++ b/docs/html/training/wearables/apps/creating.jd @@ -9,9 +9,9 @@ helpoutsWidget=true <h2>This lesson teaches you to</h2> <ol> <li><a href="#UpdateSDK">Update Your SDK</a></li> - <li><a href="#SetupEmulator">Set Up an Android Wear Emulator</a></li> - <li><a href="#SetupDevice">Set Up an Android Wear Device</a></li> + <li><a href="#SetupEmulator">Set Up an Android Wear Emulator or Device</a></li> <li><a href="#CreateProject">Create a Project</a></li> + <li><a href="#Install">Install the Wearable App</a></li> <li><a href="#Libraries">Include the Correct Libraries</a></li> </ol> </div> @@ -112,18 +112,20 @@ types of screen shapes, which is useful for testing.</p> <li>Tap <strong>ADB Debugging</strong> to enable adb.</li> </ol> <li>Connect the wearable to your machine through USB, so you can install apps directly to it - as you develop. A message appears on both the wearable and the Android Wear app prompting you to allow debugging.</li> - <p class="note"><strong>Note:</strong> If you can not connect your wearable to your machine via USB, - follow the directions on - <a href="{@docRoot}training/wearables/apps/bt-debugging.html">Debugging over - Bluetooth</a>. + as you develop. A message appears on both the wearable and the Android Wear app prompting you to + allow debugging.</li> + + <p class="note"><strong>Note:</strong> If you can not connect your wearable + to your machine via USB, you can try + <a href="{@docRoot}training/wearables/apps/bt-debugging.html">connecting over Bluetooth</a>. </p> + <li>On the Android Wear app, check <strong>Always allow from this computer</strong> and tap <strong>OK</strong>.</li> </ol> -<p>The <strong>Android</strong> tool window on Android Studio shows the system log from the wearable. -The wearable should also be listed when you run the <code>adb devices</code> command.</p> +<p>The <i>Android</i> tool window on Android Studio shows the system log from the +wearable. The wearable should also be listed when you run the <code>adb devices</code> command.</p> <h2 id="CreateProject">Create a Project</h2> @@ -147,18 +149,23 @@ Project</a>. As you follow the wizard, enter the following information:</p> <li>In the first <b>Add an Activity</b> window, add a blank activity for mobile.</li> <li>In the second <b>Add an Activity</b> window, add a blank activity for Wear.</li> </ol> - <p>When the wizard completes, Android Studio creates a new project with two modules, <b>mobile</b> and - <b>wear</b>. You now have a project for both your handheld and wearable apps that you can create activities, - services, custom layouts, and much more in. On the handheld app, you do most of the heavy lifting, - such as network communications, intensive processing, or tasks that require long - amounts of user interaction. When these are done, - you usually notify the wearable of the results through notifications or by syncing and sending - data to the wearable.</p> - - <p class="note"><b>Note:</b> The <b>wear</b> module also contains a "Hello World" activity that uses a - <code>WatchViewStub</code> that inflates a layout based on whether the device's screen - is round or square. The <code>WatchViewStub</code> class is one of the UI widgets that's provided - by the <a href="{@docRoot}training/wearables/apps/layouts.html#UiLibrary">wearable support library</a>.</p> + <p>When the wizard completes, Android Studio creates a new project with two modules, <b>mobile</b> + and <b>wear</b>. You now have a project for both your handheld and wearable apps for which you can + create activities, services, and custom layouts. The handheld app does most of + the heavy lifting, such as network communications, intensive processing, or tasks that require + long amounts of user interaction. When the app completes these operations, your app should + notify the wearable of the results through notifications or by syncing and sending data to + the wearable.</p> + + <p class="note"><b>Note:</b> The <b>wear</b> module also contains a "Hello World" activity that + uses a + <a href="{@docRoot}reference/android/support/wearable/view/WatchViewStub.html"><code>WatchViewStub</code></a>. + This class inflates a layout based on whether the device's screen is round or square. The + <a href="{@docRoot}reference/android/support/wearable/view/WatchViewStub.html"><code>WatchViewStub</code></a> + class is one of the UI widgets that the + <a href="{@docRoot}training/wearables/apps/layouts.html#UiLibrary">wearable support library</a> + provides. + </p> </li> <h2 id="Install">Install the Wearable App</h2> @@ -167,8 +174,8 @@ Project</a>. As you follow the wizard, enter the following information:</p> either <code>adb install</code> or the <b>Play</b> button on Android Studio.</p> <p>When you're ready to publish your app to users, you embed the wearable app inside of the -handheld app. When users install the handheld app from Google Play, a connected wearable automatically -receives the wearable app.</p> +handheld app. When a user installs the handheld app from Google Play, a connected wearable +automatically receives the wearable app.</p> <p class="note"><b>Note:</b> The automatic installation of wearable apps does not work when you are signing apps with a debug key and only works with release keys. See @@ -184,7 +191,8 @@ wearable and prints out "Hello world!" <p>As part of the Project Wizard, the correct dependencies are imported for you in the appropriate module's <code>build.gradle</code> file. -However, these dependencies are not required, so read the following descriptions to find out if you need them or not:</p> +However, these dependencies are not required, so read the following descriptions to find out if you +need them or not:</p> <b>Notifications</b> <p>The <a href="{@docRoot}tools/support-library/features.html#v4">Android diff --git a/docs/html/training/wearables/apps/layouts.jd b/docs/html/training/wearables/apps/layouts.jd index 1d0e49b..197b94b0c 100644 --- a/docs/html/training/wearables/apps/layouts.jd +++ b/docs/html/training/wearables/apps/layouts.jd @@ -10,7 +10,7 @@ helpoutsWidget=true <h2>This lesson teaches you to</h2> <ol> <li><a href="#CustomNotifications">Create custom notifications</a></li> - <li><a href="#UiLibrary">Create Layouts with the Wearable UI Library</li> + <li><a href="#UiLibrary">Create Layouts with the Wearable UI Library</a></li> </ol> <h2>You should also read</h2> @@ -73,8 +73,8 @@ public void onCreate(Bundle bundle){ For example: <pre> Intent notificationIntent = new Intent(this, NotificationActivity.class); -PendingIntent notificationPendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, - PendingIntent.FLAG_UPDATE_CURRENT); +PendingIntent notificationPendingIntent = PendingIntent.getActivity( + this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); </pre> </li> <li>Build a {@link android.app.Notification} and call @@ -110,35 +110,88 @@ dependencies { <p>Here are some of the major classes in the Wearable UI Library:</p> -<ul> - <li><code>BoxInsetLayout</code> - A FrameLayout that's aware of screen shape and can box its - children in the center square of a round screen.</li> - <li><code>CardFragment</code> - A fragment that presents content within an expandable, - vertically scrollable card.</li> - <li><code>CircledImageView</code> - An image view surrounded by a circle.</li> - <li><code>ConfirmationActivity</code> - An activity that displays confirmation animations after the user - completes an action.</li> - <li><code>CrossFadeDrawable</code> - A drawable that contains two child drawables and provides - methods to directly adjust the blend between the two.</li> - <li><code>DelayedConfirmationView</code> - A view that provides a circular countdown timer, - typically used to automatically confirm an operation after a short delay has elapsed.</li> - <li><code>DismissOverlayView</code> - A view for implementing long-press-to-dismiss.</li> - <li><code>DotsPageIndicator</code> - A page indicator for GridViewPager that identifies the - current page in relation to all available pages on the current row.</li> - <li><code>GridViewPager</code> - A layout manager that allows the user to both vertically and - horizontally through pages of data. You supply an implementation of a GridPagerAdapter to - generate the pages that the view shows.</li> - <li><code>GridPagerAdapter</code> - An adapter that supplies pages to a GridViewPager.</li> - <li><code>FragmentGridPagerAdapter</code> - An implementation of GridPagerAdapter that - represents each page as a fragment.</li> - </li> - <li><code>WatchViewStub</code> - A class that can inflate a specific layout, - depending on the shape of the device's screen.</li> - <li><code>WearableListView</code> - An alternative version of ListView that is optimized for - ease of use on small screen wearable devices. It displays a vertically scrollable list of items, - and automatically snaps to the nearest item when the user stops scrolling. - </li> -</ul> +<dl> + <dt><a href="{@docRoot}reference/android/support/wearable/view/BoxInsetLayout.html"><code>BoxInsetLayout</code></a> + </dt> + <dd>A {@link android.widget.FrameLayout} object + that's aware of screen shape and can box its children in the center square of a round screen. + </dd> + + <dt><a href="{@docRoot}reference/android/support/wearable/view/CardFragment.html"><code>CardFragment</code></a> + </dt> + <dd>A fragment that presents content within an expandable, vertically scrollable card. + </dd> + + <dt><a href="{@docRoot}reference/android/support/wearable/view/CircledImageView.html"><code>CircledImageView</code></a> + </dt> + <dd>An image view surrounded by a circle. + </dd> + + <dt><a href="{@docRoot}reference/android/support/wearable/activity/ConfirmationActivity.html"><code>ConfirmationActivity</code></a> + </dt> + <dd>An activity that displays confirmation animations after the user completes an action. + </dd> + + <dt><a href="{@docRoot}reference/android/support/wearable/view/CrossfadeDrawable.html"><code>CrossFadeDrawable</code></a> + </dt> + <dd>A drawable that contains two child drawables and provides methods to directly adjust the blend + between the two. + </dd> + + <dt><a href="{@docRoot}reference/android/support/wearable/view/DelayedConfirmationView.html"><code>DelayedConfirmationView</code></a> + </dt> + <dd>A view that provides a circular countdown timer, typically used to automatically confirm an + operation after a short delay has elapsed. + </dd> + + <dt><a href="{@docRoot}reference/android/support/wearable/view/DismissOverlayView.html"><code>DismissOverlayView</code></a> + </dt> + <dd>A view for implementing long-press-to-dismiss. + </dd> + + <dt><a href="{@docRoot}reference/android/support/wearable/view/GridViewPager.html"><code>GridViewPager</code></a> + </dt> + <dd>A layout manager that allows the user to navigate both vertically and + horizontally through pages of data. You supply an implementation of a + <a href="{@docRoot}reference/android/support/wearable/view/GridPagerAdapter.html"><code>GridPagerAdapter</code></a> + instance to generate the pages that the view shows. + </dd> + + <dt><a href="{@docRoot}reference/android/support/wearable/view/GridPagerAdapter.html"><code>GridPagerAdapter</code></a> + </dt> + <dd>An adapter that supplies pages to a + <a href="{@docRoot}reference/android/support/wearable/view/GridViewPager.html"><code>GridViewPager</code></a> + object. + </dd> + + <dt><a href="{@docRoot}reference/android/support/wearable/view/FragmentGridPagerAdapter.html"><code>FragmentGridPagerAdapter</code></a> + </dt> + <dd>An implementation of a + <a href="{@docRoot}reference/android/support/wearable/view/GridPagerAdapter.html"><code>GridPagerAdapter</code></a> + instance that represents each page as a fragment. + </dd> + + <dt><a href="{@docRoot}reference/android/support/wearable/view/DotsPageIndicator.html"><code>DotsPageIndicator</code></a> + </dt> + <dd>A page indicator for a + <a href="{@docRoot}reference/android/support/wearable/view/GridViewPager.html"><code>GridViewPager</code></a> + implementation that identifies the current page in relation to all available pages on the current + row. + </dd> + + <dt><a href="{@docRoot}reference/android/support/wearable/view/WatchViewStub.html"><code>WatchViewStub</code></a> + </dt> + <dd>A class that can inflate a specific layout, depending on the shape of the device's screen. + </dd> + + <dt><a href="{@docRoot}reference/android/support/wearable/view/WearableListView.html"><code>WearableListView</code></a> + </dt> + <dd>An alternative version of a {@link android.widget.ListView} + object that is optimized for ease of use on small screen wearable devices. It displays a + vertically scrollable list of items, and automatically snaps to the nearest item when the user + stops scrolling. + </dd> +</dl> <h3 id="UiLibReference">Wear UI library API reference</h3> diff --git a/docs/html/training/wearables/ui/2d-picker.jd b/docs/html/training/wearables/ui/2d-picker.jd index 8f4d8af..68f98b7 100644 --- a/docs/html/training/wearables/ui/2d-picker.jd +++ b/docs/html/training/wearables/ui/2d-picker.jd @@ -9,6 +9,11 @@ page.title=Creating a 2D Picker <li><a href="#add-page-grid">Add a Page Grid</a></li> <li><a href="#implement-adapter">Implement a Page Adapter</a></li> </ol> +<h2>Related Samples</h2> +<ul> + <li><a href="{@docRoot}samples/GridViewPager/index.html"> + GridViewPager</a></li> +</ul> <h2>You should also read</h2> <ul> <li><a href="{@docRoot}design/wear/index.html">Android Wear Design Principles</a></li> @@ -21,18 +26,19 @@ Wear allows users to navigate and choose from a set of items shown as pages. The Library lets you easily implement this pattern using a page grid, which is a layout manager that allows users to scroll vertically and horizontally through pages of data.</p> -<p>To implement this pattern, you add a <code>GridViewPager</code> element to the layout -of your activity and implement an adapter that provides a set of pages by extending -the <code>FragmentGridPagerAdapter</code> class.</p> - -<p class="note"><strong>Note:</strong> The <em>GridViewPager</em> sample in the Android SDK -demonstrates how to use the <code>GridViewPager</code> layout in your apps. This sample is -located in the <code>android-sdk/samples/android-20/wearable/GridViewPager</code> directory.</p> +<p>To implement this pattern, you add a +<a href="{@docRoot}reference/android/support/wearable/view/GridViewPager.html"><code>GridViewPager</code></a> +element to the layout of your activity and implement an adapter that provides a set of pages by +extending the +<a href="{@docRoot}reference/android/support/wearable/view/FragmentGridPagerAdapter.html"><code>FragmentGridPagerAdapter</code></a> +class.</p> <h2 id="add-page-grid">Add a Page Grid</h2> -<p>Add a <code>GridViewPager</code> element to your layout definition as follows:</p> +<p>Add a +<a href="{@docRoot}reference/android/support/wearable/view/GridViewPager.html"><code>GridViewPager</code></a> +element to your layout definition as follows:</p> <pre> <android.support.wearable.view.GridViewPager @@ -49,18 +55,20 @@ your 2D picker works on both round and square devices.</p> <h2 id="implement-adapter">Implement a Page Adapter</h2> -<p>A page adapter provides a set of pages to populate a <code>GridViewPager</code> component. To -implement this adapter, you extend the <code>FragmentGridPageAdapter</code> class from the -Wearable UI Library</p> +<p>A page adapter provides a set of pages to populate a +<a href="{@docRoot}reference/android/support/wearable/view/GridViewPager.html"><code>GridViewPager</code></a> +component. To implement this adapter, you extend the +<a href="{@docRoot}reference/android/support/wearable/view/FragmentGridPagerAdapter.html"><code>FragmentGridPagerAdapter</code></a> +class from the Wearable UI Library</p> -<p>For example, the <em>GridViewPager</em> sample in the Android SDK contains -the following adapter implementation that provides a set of static cards with custom background +<p>The following snippet shows how to provide a set of static cards with custom background images:</p> <pre> public class SampleGridPagerAdapter extends FragmentGridPagerAdapter { private final Context mContext; + private List<Row> mRows; public SampleGridPagerAdapter(Context ctx, FragmentManager fm) { super(fm); @@ -68,8 +76,8 @@ public class SampleGridPagerAdapter extends FragmentGridPagerAdapter { } static final int[] BG_IMAGES = new int[] { - R.drawable.debug_background_1, ... - R.drawable.debug_background_5 + R.drawable.debug_background_1, ... + R.drawable.debug_background_5 }; // A simple container for static data in each page @@ -89,8 +97,11 @@ public class SampleGridPagerAdapter extends FragmentGridPagerAdapter { } </pre> -<p>The picker calls <code>getFragment</code> and <code>getBackground</code> to retrieve the content -to display at each position of the grid:</p> +<p>The adapter calls +<a href="{@docRoot}reference/android/support/wearable/view/FragmentGridPagerAdapter.html#getFragment(int, int)"><code>getFragment()</code></a> +and +<a href="{@docRoot}reference/android/support/wearable/view/GridPagerAdapter.html#getBackgroundForRow(int)"><code>getBackgroundForRow()</code></a> +to retrieve the content to display for each row:</p> <pre> // Obtain the UI fragment at the specified position @@ -111,16 +122,39 @@ public Fragment getFragment(int row, int col) { return fragment; } -// Obtain the background image for the page at the specified position +// Obtain the background image for the row +@Override +public Drawable getBackgroundForRow(int row) { + return mContext.getResources().getDrawable( + (BG_IMAGES[row % BG_IMAGES.length]), null); +} + +</pre> + +<p>The following example shows how to retrieve the background to display for a specific page +in the grid: +</p> + +<pre> +// Obtain the background image for the specific page @Override -public ImageReference getBackground(int row, int column) { - return ImageReference.forDrawable(BG_IMAGES[row % BG_IMAGES.length]); +public Drawable getBackgroundForPage(int row, int column) { + if( row == 2 && column == 1) { + // Place image at specified position + return mContext.getResources().getDrawable(R.drawable.bugdroid_large, null); + } else { + // Default to background image for row + return GridPagerAdapter.BACKGROUND_NONE; + } } </pre> -<p>The <code>getRowCount</code> method tells the picker how many rows of content are -available, and the <code>getColumnCount</code> method tells the picker how many columns -of content are available for each of the rows.</p> +<p>The +<a href="{@docRoot}reference/android/support/wearable/view/GridPagerAdapter.html#getRowCount()"><code>getRowCount()</code></a> +method tells the adapter how many rows of content are +available, and the +<a href="{@docRoot}reference/android/support/wearable/view/GridPagerAdapter.html#getColumnCount(int)"><code>getColumnCount()</code></a> +method tells the adapter how many columns of content are available for each of the rows.</p> <pre> // Obtain the number of pages (vertical) @@ -137,10 +171,13 @@ public int getColumnCount(int rowNum) { </pre> <p>The adapter implementation details depend on your particular set of pages. Each page provided -by the adapter is of type <code>Fragment</code>. In this example, each page is a -<code>CardFragment</code> instance that uses one of the default card layouts. However, you can -combine different types of pages in the same 2D picker, such as cards, action icons, and custom -layouts depending on your use cases.</p> +by the adapter is of type +<a href="{@docRoot}reference/android/app/Fragment.html"><code>Fragment</code></a>. +In this example, each page is a +<a href="{@docRoot}reference/android/support/wearable/view/CardFragment.html"><code>CardFragment</code></a> +instance that uses one of the default card layouts. However, you can combine different types of +pages in the same 2D picker, such as cards, action icons, and custom layouts depending on your use +cases.</p> <div style="float:right;margin-left:25px;width:250px"> <img src="{@docRoot}wear/images/07_uilib.png" width="250" height="250" alt=""/> @@ -149,24 +186,30 @@ The <em>GridViewPager</em> sample.</p> </div> <p>Not all rows need to have the same number of pages. Notice that in this example the number of -colums is different for each row. You can also use a <code>GridViewPager</code> component to -implement a 1D picker with only one row or only one column.</p> +colums is different for each row. You can also use a +<a href="{@docRoot}reference/android/support/wearable/view/GridViewPager.html"><code>GridViewPager</code></a> +component to implement a 1D picker with only one row or only one column.</p> -<p><code>GridViewPager</code> provides support for scrolling in cards whose content does not fit +<p>The +<a href="{@docRoot}reference/android/support/wearable/view/GridViewPager.html"><code>GridViewPager</code></a> +class provides support for scrolling in cards whose content does not fit the device screen. This example configures each card to expand as required, so users can scroll through the card's content. When users reach the end of a scrollable card, a swipe in the same direction shows the next page on the grid, if one is available.</p> -<p>You can specify a custom background for each page with the <code>getBackground()</code> method. -When users swipe to navigate across pages, <code>GridViewPager</code> applies parallax -and crossfade effects between different backgrounds automatically.</p> +<p>You can specify a custom background for each page with the +<a href="{@docRoot}reference/android/support/wearable/view/GridPagerAdapter.html#getBackgroundForPage(int, int)"><code>getBackgroundForPage()</code></a> +method. When users swipe to navigate across pages, the +<a href="{@docRoot}reference/android/support/wearable/view/GridViewPager.html"><code>GridViewPager</code></a> +class applies parallax and crossfade effects between different backgrounds automatically.</p> <h3>Assign an adapter instance to the page grid</h3> <p>In your activity, assign an instance of your adapter implementation to the -<code>GridViewPager</code> component:</p> +<a href="{@docRoot}reference/android/support/wearable/view/GridViewPager.html"><code>GridViewPager</code></a> +component:</p> -<pre> +<pre style="clear:both"> public class MainActivity extends Activity { @Override diff --git a/docs/html/training/wearables/ui/cards.jd b/docs/html/training/wearables/ui/cards.jd index 21f7e5c..9ad87ad 100644 --- a/docs/html/training/wearables/ui/cards.jd +++ b/docs/html/training/wearables/ui/cards.jd @@ -21,16 +21,23 @@ page.title=Creating Cards This lesson shows you how to create cards in your Android Wear apps.</p> <p>The Wearable UI Library provides implementations of cards specifically designed for wearable -devices. This library contains the <code>CardFrame</code> class, which wraps views inside -a card-styled frame with a white background, rounded corners, and a light-drop shadow. -<code>CardFrame</code> can only contain one direct child, usually a layout manager, to which +devices. This library contains the +<a href="{@docRoot}reference/android/support/wearable/view/CardFrame.html"><code>CardFrame</code></a> +class, which wraps views inside a card-styled frame with a white background, rounded corners, and a +light-drop shadow. A +<a href="{@docRoot}reference/android/support/wearable/view/CardFrame.html"><code>CardFrame</code></a> +instance can only contain one direct child, usually a layout manager, to which you can add other views to customize the content inside the card.</p> <p>You can add cards to your app in two ways:</p> <ul> - <li>Use or extend the <code>CardFragment</code> class.</li> - <li>Add a card inside a <code>CardScrollView</code> in your layout.</li> + <li>Use or extend the + <a href="{@docRoot}reference/android/support/wearable/view/CardFragment.html"><code>CardFragment</code></a> + class.</li> + <li>Add a card inside a + <a href="{@docRoot}reference/android/support/wearable/view/CardScrollView.html"><code>CardScrollView</code></a> + instance in your layout.</li> </ul> <p class="note"><strong>Note:</strong> This lesson shows you how to add cards to Android Wear @@ -41,22 +48,31 @@ Features to Notifications</a>.</p> <h2 id="card-fragment">Create a Card Fragment</h2> -<p>The <code>CardFragment</code> class provides a default card layout with a title, a -description, and an icon. Use this approach to add cards to your app if the default card layout -shown in figure 1 meets your needs.</p> +<p>The +<a href="{@docRoot}reference/android/support/wearable/view/CardFragment.html"><code>CardFragment</code></a> +class provides a default card layout with a title, a description, and an icon. Use this approach to +add cards to your app if the default card layout shown in figure 1 meets your needs.</p> <img src="{@docRoot}wear/images/05_uilib.png" width="500" height="245" alt=""/> -<p class="img-caption"><strong>Figure 1.</strong> The default <code>CardFragment</code> layout.</p> +<p class="img-caption"><strong>Figure 1.</strong> The default +<a href="{@docRoot}reference/android/support/wearable/view/CardFragment.html"><code>CardFragment</code></a> +layout.</p> -<p>To add a <code>CardFragment</code> to your app:</p> +<p>To add a +<a href="{@docRoot}reference/android/support/wearable/view/CardFragment.html"><code>CardFragment</code></a> +instance to your app:</p> <ol> <li>In your layout, assign an ID to the element that contains the card</li> -<li>Create a <code>CardFragment</code> instance in your activity</li> -<li>Use the fragment manager to add the <code>CardFragment</code> instance to its container</li> +<li>Create a +<a href="{@docRoot}reference/android/support/wearable/view/CardFragment.html"><code>CardFragment</code></a> +instance in your activity</li> +<li>Use the fragment manager to add the +<a href="{@docRoot}reference/android/support/wearable/view/CardFragment.html"><code>CardFragment</code></a> +instance to its container</li> </ol> -<p>The following sample code shows the code for the screen display shown in Figure 1:</p> +<p>The following sample code shows the code for the screen display shown in figure 1:</p> <pre> <android.support.wearable.view.BoxInsetLayout @@ -76,7 +92,9 @@ android:layout_width="match_parent"> </android.support.wearable.view.BoxInsetLayout> </pre> -<p>The following code adds the <code>CardFragment</code> instance to the activity in Figure 1:</p> +<p>The following code adds the +<a href="{@docRoot}reference/android/support/wearable/view/CardFragment.html"><code>CardFragment</code></a> +instance to the activity in figure 1:</p> <pre> protected void onCreate(Bundle savedInstanceState) { @@ -93,8 +111,11 @@ protected void onCreate(Bundle savedInstanceState) { } </pre> -<p>To create a card with a custom layout using <code>CardFragment</code>, extend this class -and override its <code>onCreateContentView</code> method.</p> +<p>To create a card with a custom layout using the +<a href="{@docRoot}reference/android/support/wearable/view/CardFragment.html"><code>CardFragment</code></a> +class, extend the class and override its +<a href="{@docRoot}reference/android/support/wearable/view/CardFragment.html#onCreateContentView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle)"><code>onCreateContentView</code></a> +method.</p> <h2 id="card-layout">Add a CardFrame to Your Layout</h2> @@ -103,8 +124,9 @@ and override its <code>onCreateContentView</code> method.</p> approach when you want to define a custom layout for the card inside a layout definition file.</p> <img src="{@docRoot}wear/images/04_uilib.png" width="500" height="248" alt=""/> -<p class="img-caption"><strong>Figure 2.</strong> Adding a <code>CardFrame</code> to your -layout.</p> +<p class="img-caption"><strong>Figure 2.</strong> Adding a +<a href="{@docRoot}reference/android/support/wearable/view/CardFrame.html"><code>CardFrame</code></a> +to your layout.</p> <p>The following layout code sample demonstrates a vertical linear layout with two elements. You can create more complex layouts to fit the needs of your app.</p> @@ -152,7 +174,9 @@ android:layout_width="match_parent"> </android.support.wearable.view.BoxInsetLayout> </pre> -<p>The <code>CardScrollView</code> element in the example layout above lets you assign gravity to +<p>The +<a href="{@docRoot}reference/android/support/wearable/view/CardScrollView.html><code><CardScrollView></code></a> +element in the example layout above lets you assign gravity to the card when its content is smaller than the container. This example aligns the card to the bottom of the screen:</p> @@ -168,8 +192,13 @@ protected void onCreate(Bundle savedInstanceState) { } </pre> -<p><code>CardScrollView</code> detects the shape of the screen and displays the card differently +<p>The +<a href="{@docRoot}reference/android/support/wearable/view/CardScrollView.html"><code><CardScrollView></code></a> +element detects the shape of the screen and displays the card differently on round and square devices, using wider side margins on round screens. However, -placing the <code>CardScrollView</code> element inside a <code>BoxInsetLayout</code> and using the -<code>layout_box="bottom"</code> attribute is useful to align the card to the bottom of round -screens without cropping its content.</p> +placing the +<a href="{@docRoot}reference/android/supprot/wearable/view/CardScrollView.html"><code><CardScrollView></code></a> +element inside a +<a href="{@docRoot}reference/android/support/wearable/view/BoxInsetLayout.html"><code><BoxInsetLayout></code></a> +and using the <code>layout_box="bottom"</code> attribute is useful to align the card to the bottom +of round screens without cropping its content.</p> diff --git a/docs/html/training/wearables/ui/confirm.jd b/docs/html/training/wearables/ui/confirm.jd index 07a352f..1f33085 100644 --- a/docs/html/training/wearables/ui/confirm.jd +++ b/docs/html/training/wearables/ui/confirm.jd @@ -52,12 +52,18 @@ gets notified if the user cancels the action and when the timer expires.</p> <p>To show a confirmation timer when users complete an action in your app:</p> <ol> -<li>Add a <code>DelayedConfirmationView</code> element to your layout.</li> -<li>Implement the <code>DelayedConfirmationListener</code> interface in your activity.</li> +<li>Add a +<a href="{@docRoot}reference/android/support/wearable/view/DelayedConfirmationView.html"><code><DelayedConfirmationView></code></a> +element to your layout.</li> +<li>Implement the +<a href="{@docRoot}reference/android/support/wearable/view/DelayedConfirmationView.DelayedConfirmationListener.html"><code>DelayedConfirmationListener</code></a> +interface in your activity.</li> <li>Set the duration of the timer and start it when the user completes an action.</li> </ol> -<p>Add the <code>DelayedConfirmationView</code> element to your layout as follows:</p> +<p>Add the +<a href="{@docRoot}reference/android/support/wearable/view/DelayedConfirmationView.html"><code><DelayedConfirmationView></code></a> +element to your layout as follows:</p> <pre> <android.support.wearable.view.DelayedConfirmationView @@ -125,19 +131,24 @@ A confirmation animation.</p> <h2 id="show-confirmation">Show Confirmation Animations</h2> <p>To show a confirmation animation when users complete an action in your app, create an intent -that starts <code>ConfirmationActivity</code> from one of your activities. You can specify -one of the these animations with the <code>EXTRA_ANIMATION_TYPE</code> intent extra:</p> +that starts +<a href="{@docRoot}reference/android/support/wearable/activity/ConfirmationActivity.html"><code>ConfirmationActivity</code></a> +from one of your activities. You can specify +one of the these animations with the +<a href="{@docRoot}reference/android/support/wearable/activity/ConfirmationActivity.html#EXTRA_ANIMATION_TYPE"><code>EXTRA_ANIMATION_TYPE</code></a> +intent extra:</p> <ul> -<li><code>SUCCESS_ANIMATION</code></li> -<li><code>FAILURE_ANIMATION</code></li> -<li><code>OPEN_ON_PHONE_ANIMATION</code></li> +<li><a href="{@docRoot}reference/android/support/wearable/activity/ConfirmationActivity.html#SUCCESS_ANIMATION"><code>SUCCESS_ANIMATION</code></a></li> +<li><a href="{@docRoot}reference/android/support/wearable/activity/ConfirmationActivity.html#FAILURE_ANIMATION"><code>FAILURE_ANIMATION</code></a></li> +<li><a href="{@docRoot}reference/android/support/wearable/activity/ConfirmationActivity.html#OPEN_ON_PHONE_ANIMATION"><code>OPEN_ON_PHONE_ANIMATION</code></a></li> </ul> <p>You can also add a message that appears under the confirmation icon.</p> -<p>To use the <code>ConfirmationActivity</code> in your app, first declare this activity in your -manifest file:</p> +<p>To use the +<a href="{@docRoot}reference/android/support/wearable/activity/ConfirmationActivity.html"><code>ConfirmationActivity</code></a> +in your app, first declare this activity in your manifest file:</p> <pre> <manifest> @@ -161,5 +172,6 @@ intent.putExtra(ConfirmationActivity.EXTRA_MESSAGE, startActivity(intent); </pre> -<p>After showing the confirmation animation, <code>ConfirmationActivity</code> finishes and your -activity resumes.</p> +<p>After showing the confirmation animation, +<a href="{@docRoot}reference/android/support/wearable/activity/ConfirmationActivity.html"><code>ConfirmationActivity</code></a> +finishes and your activity resumes.</p> diff --git a/docs/html/training/wearables/ui/exit.jd b/docs/html/training/wearables/ui/exit.jd index 84e1e45..9c55673 100644 --- a/docs/html/training/wearables/ui/exit.jd +++ b/docs/html/training/wearables/ui/exit.jd @@ -24,9 +24,9 @@ content and then swipe again from left to right to exit the app.</p> <p>For more immersive experiences, like an app that can scroll a map in any direction, you can disable the swipe to exit gesture in your app. However, if you disable it, you must implement the long-press-to-dismiss UI pattern to let users exit your app using the -<code>DismissOverlayView</code> class from the Wearable UI Library. -You must also inform your users the first time they run your app that they can exit using -a long press.</p> +<a href="{@docRoot}reference/android/support/wearable/view/DismissOverlayView.html"><code>DismissOverlayView</code></a> +class from the Wearable UI Library. You must also inform your users the first time they run your app +that they can exit using a long press.</p> <p>For design guidelines about exiting Android Wear activities, see <a href="{@docRoot}design/wear/structure.html#Custom">Breaking out of the card</a>.</p> @@ -51,9 +51,14 @@ exit your app, as described in the next section.</p> <h2 id="long-press">Implement the Long Press to Dismiss Pattern</h2> -<p>To use the <code>DissmissOverlayView</code> class in your activity, add this element to -your layout definition such that it covers the whole screen and is placed above all other views. -For example:</p> +<p>To use the +<a href="{@docRoot}reference/android/support/wearable/view/DismissOverlayView.html"><code>DismissOverlayView</code></a> +class in your activity, add this element to your layout definition such that it covers the whole +screen and is placed above all other views.</p> + +<p>The following example shows how to add the +<a href="{@docRoot}reference/android/support/wearable/view/DismissOverlayView.html"><code><DismissOverlayView></code></a> +element:</p> <pre> <FrameLayout @@ -70,10 +75,12 @@ For example:</p> <FrameLayout> </pre> -<p>In your activity, obtain the <code>DismissOverlayView</code> element and set some introductory -text. This text is shown to users the first time they run your app to inform them that they -can exit the app using a long press gesture. Then use a <code>GestureDetector</code> to detect -a long press:</p> +<p>In your activity, obtain the +<a href="{@docRoot}reference/android/support/wearable/view/DismissOverlayView.html"><code><DismissOverlayView></code></a> +element and set some introductory text. This text is shown to users the first time they run your app +to inform them that they can exit the app using a long press gesture. Then use a +<a href="{@docRoot}reference/android/view/GestureDetector.html"><code>GestureDetector</code></a> +to detect a long press:</p> <pre> public class WearActivity extends Activity { @@ -106,5 +113,7 @@ public class WearActivity extends Activity { } </pre> -<p>When the system detects a long press gesture, <code>DismissOverlayView</code> shows an -<strong>Exit</strong> button, which terminates your activity if the user presses it.</p>
\ No newline at end of file +<p>When the system detects a long press gesture, the +<a href="{@docRoot}reference/android/support/wearable/view/DismissOverlayView.html"><code><DismissOverlayView></code></a> +element shows an <strong>Exit</strong> button, which terminates your activity if the user presses +it.</p>
\ No newline at end of file diff --git a/docs/html/training/wearables/ui/layouts.jd b/docs/html/training/wearables/ui/layouts.jd index 0eb1395..f1f18f3 100644 --- a/docs/html/training/wearables/ui/layouts.jd +++ b/docs/html/training/wearables/ui/layouts.jd @@ -94,14 +94,18 @@ API reference documentation</a> for the Wearable UI Library classes.</p> <h2 id="different-layouts">Specify Different Layouts for Square and Round Screens</h2> -<p>The <code>WatchViewStub</code> class included in the Wearable UI Library lets you specify -different layout definitions for square and round screens. This class detects the screen shape -at runtime and inflates the corresponding layout.</p> +<p>The +<a href="{@docRoot}reference/android/support/wearable/view/WatchViewStub.html"><code>WatchViewStub</code></a> +class included in the Wearable UI Library lets you specify different layout definitions for square +and round screens. This class detects the screen shape at runtime and inflates the corresponding +layout.</p> <p>To use this class for handling different screen shapes in your app:</p> <ol> -<li>Add <code>WatchViewStub</code> as the main element of your activity's layout.</li> +<li>Add +<a href="{@docRoot}reference/android/support/wearable/view/WatchViewStub.html"><code>WatchViewStub</code></a> +as the main element of your activity's layout.</li> <li>Specify a layout definition file for square screens with the <code>rectLayout</code> attribute.</li> <li>Specify a layout definition file for round screens with the <code>roundLayout</code> @@ -142,7 +146,8 @@ The system inflates the correct layout at runtime depending on the screen shape. <h3>Accessing layout views</h3> <p>The layouts that you specify for square or round screens are not inflated until -<code>WatchViewStub</code> detects the shape of the screen, so your app cannot access their views +<a href="{@docRoot}reference/android/support/wearable/view/WatchViewStub.html"><code>WatchViewStub</code></a> +detects the shape of the screen, so your app cannot access their views immediately. To access these views, set a listener in your activity to be notified when the shape-specific layout has been inflated:</p> @@ -171,14 +176,18 @@ protected void onCreate(Bundle savedInstanceState) { <p class="img-caption"><strong>Figure 2.</strong> Window insets on a round screen.</p> </div> -<p>The <code>BoxInsetLayout</code> class included in the Wearable UI Library extends +<p>The +<a href="{@docRoot}reference/android/support/wearable/view/BoxInsetLayout.html"><code>BoxInsetLayout</code></a> +class included in the Wearable UI Library extends {@link android.widget.FrameLayout} and lets you define a single layout that works for both square and round screens. This class applies the required window insets depending on the screen shape and lets you easily align views on the center or near the edges of the screen.</p> -<p>The gray square in figure 2 shows the area where <code>BoxInsetLayout</code> can automatically -place its child views on round screens after applying the required window insets. To be displayed -inside this area, children views specify the <code>layout_box</code> atribute with these values: +<p>The gray square in figure 2 shows the area where +<a href="{@docRoot}reference/android/support/wearable/view/BoxInsetLayout.html"><code>BoxInsetLayout</code></a> +can automatically place its child views on round screens after applying the required window insets. +To be displayed inside this area, children views specify the <code>layout_box</code> atribute with +these values: </p> <ul> @@ -196,8 +205,9 @@ ignored.</p> <p class="img-caption"><strong>Figure 3.</strong> A layout definition that works on both square and round screens.</p> -<p>The layout shown in figure 3 uses <code>BoxInsetLayout</code> and works on square and -round screens:</p> +<p>The layout shown in figure 3 uses the +<a href="{@docRoot}reference/android/support/wearable/view/BoxInsetLayout.html"><code><BoxInsetLayout></code></a> +element and works on square and round screens:</p> <pre> <<strong>android.support.wearable.view.BoxInsetLayout</strong> @@ -243,19 +253,21 @@ round screens:</p> <ul> <li> <p><code>android:padding="15dp"</code></p> - <p>This line assigns padding to the <code>BoxInsetLayout</code> element. Because the window - insets on round devices are larger than 15dp, this padding only applies to square screens.</p> + <p>This line assigns padding to the + <a href="{@docRoot}reference/android/support/wearable/view/BoxInsetLayout.html"><code><BoxInsetLayout></code></a> + element. Because the window insets on round devices are larger than 15dp, this padding only + applies to square screens.</p> </li> <li> <p><code>android:padding="5dp"</code></p> - <p>This line assigns padding to the inner <code>FrameLayout</code> element. This padding applies - to both square and round screens. The total padding between the buttons and the window insets - is 20 dp on square screens (15+5) and 5 dp on round screens.</p> + <p>This line assigns padding to the inner {@link android.widget.FrameLayout} element. This padding + applies to both square and round screens. The total padding between the buttons and the window + insets is 20 dp on square screens (15+5) and 5 dp on round screens.</p> </li> <li> <p><code>app:layout_box="all"</code></p> - <p>This line ensures that the <code>FrameLayout</code> element and its children are boxed inside - the area defined by the window insets on round screens. This line has no effect on square - screens.</p> + <p>This line ensures that the {@link android.widget.FrameLayout} element and its children are + boxed inside the area defined by the window insets on round screens. This line has no effect on + square screens.</p> </li> </ul>
\ No newline at end of file diff --git a/docs/html/training/wearables/ui/lists.jd b/docs/html/training/wearables/ui/lists.jd index 20f8bbd..0972a77 100644 --- a/docs/html/training/wearables/ui/lists.jd +++ b/docs/html/training/wearables/ui/lists.jd @@ -12,6 +12,11 @@ page.title=Creating Lists <li><a href="#adapter">Create an Adapter to Populate the List</a></li> <li><a href="#adapter-listener">Associate the Adapter and Set a Click Listener</a></li> </ol> +<h2>Related Samples</h2> +<ul> + <li><a href="{@docRoot}samples/Notifications/index.html"> + Notifications</a></li> +</ul> <h2>You should also read</h2> <ul> <li><a href="{@docRoot}design/wear/index.html">Android Wear Design Principles</a></li> @@ -23,35 +28,36 @@ page.title=Creating Lists <p>Lists let users select an item from a set of choices easily on wearable devices. This lesson shows you how to create lists in your Android Wear apps.</p> -<p>The Wearable UI Library includes the <code>WearableListView</code> class, which is a list -implementation optimized for wearable devices..</p> - -<p class="note"><strong>Note:</strong> The <em>Notifications</em> sample in the Android SDK -demonstrates how to use <code>WearableListView</code> in your apps. This sample is located in -the <code>android-sdk/samples/android-20/wearable/Notifications</code> directory.</p> +<p>The Wearable UI Library includes the +<a href="{@docRoot}reference/android/support/wearable/view/WearableListView.html"><code>WearableListView</code></a> +class, which is a list implementation optimized for wearable devices.</p> <p>To create a list in your Android Wear apps:</p> <ol> -<li>Add a <code>WearableListView</code> element to your activity's layout definition.</li> +<li>Add a +<a href="{@docRoot}reference/android/support/wearable/view/WearableListView.html"><code>WearableListView</code></a> +element to your activity's layout definition.</li> <li>Create a custom layout implementation for your list items.</li> <li>Use this implementation to create a layout definition file for your list items.</li> -<div style="float:right;margin-left:25px;width:220px;margin-top:-25px"> -<img src="{@docRoot}wear/images/06_uilib.png" width="200" height="200" alt=""/> -<p class="img-caption" style="text-align:center;margin-left:-10px"><strong>Figure 3:</strong> -A list view on Android Wear.</p> -</div> <li>Create an adapter to populate the list.</li> -<li>Assign the adapter to the <code>WearableListView</code> element.</li> +<li>Assign the adapter to the +<a href="{@docRoot}reference/android/support/wearable/view/WearableListView.html"><code>WearableListView</code></a> +element.</li> </ol> +<img src="{@docRoot}wear/images/06_uilib.png" width="200" height="200" alt=""/> +<p class="img-caption"><strong>Figure 1.</strong> +A list view on Android Wear.</p> + <p>These steps are described in detail in the following sections.</p> <h2 id="add-list">Add a List View</h2> -<p>The following layout adds a list view to an activity using a <code>BoxInsetLayout</code>, so -the list is displayed properly on both round and square devices:</p> +<p>The following layout adds a list view to an activity using a +<a href="{@docRoot}reference/android/support/wearable/view/BoxInsetLayout.html"><code><BoxInsetLayout></code></a> +element, so the list is displayed properly on both round and square devices:</p> <pre> <android.support.wearable.view.BoxInsetLayout @@ -80,12 +86,14 @@ the list is displayed properly on both round and square devices:</p> <h2 id="layout-impl">Create a Layout Implementation for List Items</h2> <p>In many cases, each list item consists of an icon and a description. The -<em>Notifications</em> sample from the Android SDK implements a custom layout that extends +<a href="{@docRoot}samples/Notifications/index.html">Notifications</a> sample implements a custom +layout that extends {@link android.widget.LinearLayout} to incorporate these two elements inside each list item. This layout also implements the methods in the -<code>WearableListView.OnCenterProximityListener</code> interface -to change the color of the item's icon and fade the text in response to events from -<code>WearableListView</code> as the user scrolls through the list.</p> +<a href="{@docRoot}reference/android/support/wearable/view/WearableListView.OnCenterProximityListener.html"<code>WearableListView.OnCenterProximityListener</code></a> +interface to change the color of the item's icon and fade the text in response to events from the +<a href="{@docRoot}reference/android/support/wearable/view/WearableListView.html"><code>WearableListView</code></a> +element as the user scrolls through the list.</p> <pre> public class WearableListItemLayout extends LinearLayout @@ -141,9 +149,13 @@ public class WearableListItemLayout extends LinearLayout </pre> <p>You can also create animator objects to enlarge the icon of the center item in the list. You can -use the <code>onCenterPosition()</code> and <code>onNonCenterPosition()</code> callback methods -in the <code>WearableListView.OnCenterProximityListener</code> interface to manage your -animators. For more information about animators, see +use the +<a href="{@docRoot}reference/android/support/wearable/view/WearableListView.OnCenterProximityListener.html#onCenterPosition(boolean)"><code>onCenterPosition()</code></a> +and +<a href="{@docRoot}reference/android/support/wearable/view/WearableListView.OnCenterProximityListener.html#onNonCenterPosition(boolean)"><code>onNonCenterPosition()</code></a> +callback methods in the +<a href="{@docRoot}reference/android/support/wearable/view/WearableListView.html"><code>WearableListView.OnCenterProximityListener</code></a> +interface to manage your animators. For more information about animators, see <a href="{@docRoot}guide/topics/graphics/prop-animation.html#object-animator">Animating with ObjectAnimator</a>.</p> @@ -185,7 +197,9 @@ and a text view whose IDs match those in the layout implementation class:</p> <h2 id="adapter">Create an Adapter to Populate the List</h2> -<p>The adapter populates the <code>WearableListView</code> with content. The following simple +<p>The adapter populates the +<a href="{@docRoot}reference/android/support/wearable/view/WearableListView.html"><code>WearableListView.OnCenterProximityListener</code></a> +element with content. The following simple adapter populates the list with elements based on an array of strings:</p> <pre> @@ -247,9 +261,10 @@ private static final class Adapter extends WearableListView.Adapter { <h2 id="adapter-listener">Associate the Adapter and Set a Click Listener</h2> -<p>In your activity, obtain a reference to the <code>WearableListView</code> element from -your layout, assign an instance of the adapter to populate the list, and set a click listener -to complete an action when the user selects a particular list item.</p> +<p>In your activity, obtain a reference to the +<a href="{@docRoot}reference/android/support/wearable/view/WearableListView.html"><code>WearableListView.OnCenterProximityListener</code></a> +element from your layout, assign an instance of the adapter to populate the list, and set a click +listener to complete an action when the user selects a particular list item.</p> <pre> public class WearActivity extends Activity diff --git a/docs/html/training/wearables/watch-faces/configuration.jd b/docs/html/training/wearables/watch-faces/configuration.jd index 5a4585d..4bd6943 100644 --- a/docs/html/training/wearables/watch-faces/configuration.jd +++ b/docs/html/training/wearables/watch-faces/configuration.jd @@ -10,6 +10,11 @@ page.title=Providing Configuration Activities <li><a href="#WearableActivity">Create a Wearable Configuration Activity</a></li> <li><a href="#CompanionActivity">Create a Companion Configuration Activity</a></li> </ol> +<h2>Related Samples</h2> +<ul> +<li><a href="{@docRoot}samples/WatchFace/index.html"> +WatchFace</a></li> +</ul> <h2>You should also read</h2> <ul> <li><a href="{@docRoot}design/wear/watchfaces.html">Watch Faces for Android Wear</a></li> @@ -34,10 +39,10 @@ an activity in the wearable app, an activity on the handheld app, or both. Users wearable configuration activity on the wearable device, and they can start the companion configuration activity from the Android Wear companion app.</p> -<p>The digital watch face from the <em>WatchFace</em> sample in the Android SDK demonstrates how to +<p>The digital watch face from the +<a href="{@docRoot}samples/WatchFace/index.html">WatchFace</a> sample demonstrates how to implement handheld and wearable configuration activities and how to update a watch face in -response to configuration changes. This sample is located in the -<code>android-sdk/samples/android-21/wearable/WatchFace</code> directory.</p> +response to configuration changes.</p> @@ -107,7 +112,8 @@ href="{@docRoot}training/wearables/data-layer/index.html">Wearable Data Layer AP communicate the configuration change to the watch face activity.</p> <p>For more details, see the <code>DigitalWatchFaceWearableConfigActivity</code> and -<code>DigitalWatchFaceUtil</code> classes in the <em>WatchFace</em> sample.</p> +<code>DigitalWatchFaceUtil</code> classes in the +<a href="{@docRoot}samples/WatchFace/index.html">WatchFace</a> sample.</p> @@ -141,17 +147,20 @@ href="{@docRoot}training/wearables/data-layer/index.html">Wearable Data Layer AP communicate the configuration change to the watch face activity.</p> <p>For more details, see the <code>DigitalWatchFaceCompanionConfigActivity</code> class in the -<em>WatchFace</em> sample.</p> +<a href="{@docRoot}samples/WatchFace/index.html">WatchFace</a> sample.</p> <h2 id="Listener">Create a Listener Service in the Wearable App</h2> <p>To receive updated configuration parameters from the configuration activities, create a -service that implements the <code>WearableListenerService</code> interface from the <a -href="{@docRoot}training/wearables/data-layer/index.html">Wearable Data Layer API</a> in your +service that implements the +<a href="//developers.google.com/android/reference/com/google/android/gms/wearable/WearableListenerService"><code>WearableListenerService</code></a> +interface from the +<a href="{@docRoot}training/wearables/data-layer/index.html">Wearable Data Layer API</a> in your wearable app. Your watch face implementation can redraw the watch face when the configuration parameters change.</p> <p>For more details, see the <code>DigitalWatchFaceConfigListenerService</code> and -<code>DigitalWatchFaceService</code> classes in the <em>WatchFace</em> sample.</p> +<code>DigitalWatchFaceService</code> classes in the +<a href="{@docRoot}samples/WatchFace/index.html">WatchFace</a> sample.</p> diff --git a/docs/html/training/wearables/watch-faces/information.jd b/docs/html/training/wearables/watch-faces/information.jd index 41319a1..ed0cc22 100644 --- a/docs/html/training/wearables/watch-faces/information.jd +++ b/docs/html/training/wearables/watch-faces/information.jd @@ -9,6 +9,11 @@ page.title=Showing Information in Watch Faces <li><a href="#Experience">Create a Compelling Experience</a></li> <li><a href="#AddData">Add Data to Your Watch Face</a></li> </ol> +<h2>Related Samples</h2> +<ul> +<li><a href="{@docRoot}samples/WatchFace/index.html"> +WatchFace</a></li> +</ul> <h2>You should also read</h2> <ul> <li><a href="{@docRoot}design/wear/watchfaces.html">Watch Faces for Android Wear</a></li> @@ -77,10 +82,11 @@ weather.</p> <p class="img-caption"><strong>Figure 2.</strong> The calendar watch face.</p> </div> -<p>The <em>WatchFace</em> sample in the Android SDK demonstrates how to obtain calendar data -from the user’s profile in the <code>CalendarWatchFaceService</code> class and shows how many -meetings there are in the following twenty-four hours. This sample is located in the -<code>android-sdk/samples/android-21/wearable/WatchFace</code> directory.</p> +<p>The +<a href="{@docRoot}samples/WatchFace/index.html">WatchFace</a> +sample demonstrates how to obtain calendar data from the user’s profile in the +<code>CalendarWatchFaceService</code> class and shows how many +meetings there are in the following twenty-four hours.</p> <p>To implement a watch face that incorporates contextual data, follow these steps:</p> @@ -95,9 +101,10 @@ meetings there are in the following twenty-four hours. This sample is located in <h3 id="Task">Provide a task to retrieve data</h3> -<p>Create a class inside your <code>CanvasWatchFaceService.Engine</code> implementation that -extends {@link android.os.AsyncTask} and add the code to retrieve the data you’re interested -in.</p> +<p>Create a class inside your +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html"><code>CanvasWatchFaceService.Engine</code></a> +implementation that extends {@link android.os.AsyncTask} and add the code to retrieve the data +you’re interested in.</p> <p>The <code>CalendarWatchFaceService</code> class obtains the number of meetings in the next day as follows:</p> @@ -130,8 +137,10 @@ private class LoadMeetingsTask extends AsyncTask<Void, Void, Integer> { } </pre> -<p>The <code>WearableCalendarContract</code> class from the Wearable Support Library provides -direct access to the user's calendar events from the companion device.</p> +<p>The +<a href="{@docRoot}reference/android/support/wearable/provider/WearableCalendarContract.html"><code>WearableCalendarContract</code></a> +class from the Wearable Support Library provides direct access to the user's calendar events from +the companion device.</p> <p>When the task finishes retrieving data, your code invokes a callback method. The following sections describe how to implement the callback method in detail.</p> @@ -189,9 +198,12 @@ section.</p> <h3 id="Redraw">Redraw your watch face with the updated data</h3> -<p>When the task that retrieves your data finishes, call the <code>invalidate()</code> method -so the system redraws your watch face. Store your data inside member variables of the -<code>Engine</code> class so you can access it inside the <code>onDraw()</code> method.</p> +<p>When the task that retrieves your data finishes, call the +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html#invalidate()"><code>invalidate()</code></a> +method so the system redraws your watch face. Store your data inside member variables of the +<code>Engine</code> class so you can access it inside the +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html#onDraw(android.graphics.Canvas, android.graphics.Rect)"><code>onDraw()</code></a> +method.</p> <p>The <code>CalendarWatchFaceService</code> class provides a callback method for the task to invoke when it finishes retrieving calendar data:</p> diff --git a/docs/html/training/wearables/watch-faces/issues.jd b/docs/html/training/wearables/watch-faces/issues.jd index 47c5e8c..2b61724 100644 --- a/docs/html/training/wearables/watch-faces/issues.jd +++ b/docs/html/training/wearables/watch-faces/issues.jd @@ -31,8 +31,11 @@ should adapt to and take advantage of the particular shape of the screen, as des <a href="{@docRoot}design/wear/watchfaces.html">design guidelines</a>.</p> <p>Android Wear lets your watch face determine the screen shape at runtime. To detect whether -the screen is square or round, override the <code>onApplyWindowInsets()</code> method in the -<code>CanvasWatchFaceService.Engine</code> class as follows:</p> +the screen is square or round, override the +<a href="{@docRoot}reference/android/service/wallpaper/WallpaperService.Engine.html#onApplyWindowInsets(android.view.WindowInsets)"><code>onApplyWindowInsets()</code></a> +method in the +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html"><code>CanvasWatchFaceService.Engine</code></a> +class as follows:</p> <pre> private class Engine extends CanvasWatchFaceService.Engine { @@ -75,7 +78,9 @@ the notification card is present.</p> down the watch face to fit inside the portion of the screen not covered by the peek card. Digital watch faces that display the time in the area of the screen not covered by peek cards do not usually require adjustments. To determine the free space above the peek card so you can adapt -your watch face, use the <code>WatchFaceService.getPeekCardPosition()</code> method.</p> +your watch face, use the +<a href="{@docRoot}reference/android/support/wearable/watchface/WatchFaceService.Engine.html#getPeekCardPosition()"><code>WatchFaceService.Engine.getPeekCardPosition()</code></a> +method.</p> <p>In ambient mode, peek cards have a transparent background. If your watch face contains details near the card in ambient mode, consider drawing a black rectangle over them to ensure that users @@ -93,16 +98,21 @@ can read the contents of the card.</p> </div> <p>To ensure that the system indicators remain visible, you can configure their position on the -screen and whether they need background protection when you create a <code>WatchFaceStyle</code> +screen and whether they need background protection when you create a +<a href="{@docRoot}reference/android/support/wearable/watchface/WatchFaceStyle.html"><code>WatchFaceStyle</code></a> instance:</p> <ul> -<li>To set the position of the status bar, use the <code>setStatusBarGravity()</code> method.</li> -<li>To set the position of the hotword, use the <code>setHotwordIndicatorGravity()</code> +<li>To set the position of the status bar, use the +<a href="{@docRoot}reference/android/support/wearable/watchface/WatchFaceStyle.Builder.html#setStatusBarGravity(int)"><code>setStatusBarGravity()</code></a> +method.</li> +<li>To set the position of the hotword, use the +<a href="{@docRoot}reference/android/support/wearable/watchface/WatchFaceStyle.Builder.html#setHotwordIndicatorGravity(int)"><code>setHotwordIndicatorGravity()</code></a> method.</li> <li>To protect the status bar and hotword with a semi-transparent gray background, use the -<code>setViewProtection()</code> method. This is usually necessary if your watch face has a -light background, since the system indicators are white.</li> +<a href="{@docRoot}reference/android/support/wearable/watchface/WatchFaceStyle.Builder.html#setViewProtection(int)"><code>setViewProtection()</code></a> +method. This is usually necessary if your watch face has a light background, since the system +indicators are white.</li> </ul> <p>For more information about the system indicators, see <a diff --git a/docs/html/training/wearables/watch-faces/performance.jd b/docs/html/training/wearables/watch-faces/performance.jd index 118bc6a..c2c411c 100644 --- a/docs/html/training/wearables/watch-faces/performance.jd +++ b/docs/html/training/wearables/watch-faces/performance.jd @@ -34,13 +34,15 @@ power on the device.</p> <p>Many watch faces consist of a background image and other graphic assets that are transformed and overlapped on top of the background image, such as clock hands and other elements of the design that move over time. Typically these graphic elements are rotated (and sometimes scaled) inside the -<code>Engine.onDraw()</code> method every time the system redraws the watch face, as described in +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html#onDraw(android.graphics.Canvas, android.graphics.Rect)"><code>Engine.onDraw()</code></a> +method every time the system redraws the watch face, as described in <a href="{@docRoot}training/wearables/watch-faces/drawing.html#Drawing">Draw Your Watch Face</a>.</p> <p>The larger these graphic assets are, the more computationally expensive it is to transform them. -Transforming large graphic assets in the <code>Engine.onDraw()</code> method drastically reduces -the frame rate at which the system can run your animations.</p> +Transforming large graphic assets in the +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html#onDraw(android.graphics.Canvas, android.graphics.Rect)"><code>Engine.onDraw()</code></a> +method drastically reduces the frame rate at which the system can run your animations.</p> <div id="fig1" style="float:right;width:250px;margin-left:25px"> <img src="{@docRoot}training/wearables/watch-faces/images/ClockHandFull.png" alt="" @@ -105,11 +107,14 @@ active, disable bitmap filtering.</p> <h2 id="OutDrawing">Move Expensive Operations Outside the Drawing Method</h2> -<p>The system calls the <code>Engine.onDraw()</code> method every time it redraws your watch -face, so you should only include operations that are strictly required to update the watch -face inside this method to improve performance.<p> +<p>The system calls the +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html#onDraw(android.graphics.Canvas, android.graphics.Rect)"><code>Engine.onDraw()</code></a> +method every time it redraws your watch face, so you should only include operations that are +strictly required to update the watch face inside this method to improve performance.<p> -<p>When possible, avoid performing these operations inside the <code>onDraw()</code> method:</p> +<p>When possible, avoid performing these operations inside the +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html#onDraw(android.graphics.Canvas, android.graphics.Rect)"><code>Engine.onDraw()</code></a> +method:</p> <ul> <li>Loading images and other resources.</li> @@ -118,13 +123,17 @@ face inside this method to improve performance.<p> <li>Performing computations whose result does not change between frames.</li> </ul> -<p>You can usually perform these operations in the <code>Engine.onCreate()</code> method instead. +<p>You can usually perform these operations in the +<a href="{@docRoot}reference/android/support/wearable/watchface/WatchFaceService.Engine.html#onCreate(android.view.SurfaceHolder)"><code>Engine.onCreate()</code></a> +method instead. You can resize images ahead of time in the {@link android.service.wallpaper.WallpaperService.Engine#onSurfaceChanged(android.view.SurfaceHolder, int, int, int) Engine.onSurfaceChanged()} method, which provides you with the size of the canvas.</p> <p>To analyze the performance of your watch face, use the Android Device Monitor. In particular, -ensure that the execution time for your <code>Engine.onDraw()</code> implementation is short and +ensure that the execution time for your +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html#onDraw(android.graphics.Canvas, android.graphics.Rect)"><code>Engine.onDraw()</code></a> +implementation is short and consistent across invocations. For more information, see <a href="{@docRoot}tools/debugging/ddms.html">Using DDMS</a>.</p> diff --git a/docs/html/training/wearables/watch-faces/service.jd b/docs/html/training/wearables/watch-faces/service.jd index 35366c5..578e8c0 100644 --- a/docs/html/training/wearables/watch-faces/service.jd +++ b/docs/html/training/wearables/watch-faces/service.jd @@ -10,6 +10,11 @@ page.title=Building a Watch Face Service <li><a href="#CallbackMethods">Implement the Service Callback Methods</a></li> <li><a href="#RegisterService">Register the Service Implementation</a></li> </ol> +<h2>Related Samples</h2> +<ul> +<li><a href="{@docRoot}samples/WatchFace/index.html"> +WatchFace</a></li> +</ul> <h2>You should also read</h2> <ul> <li><a href="{@docRoot}design/wear/watchfaces.html">Watch Faces for Android Wear</a></li> @@ -64,7 +69,9 @@ Project</a>.</p> <h3 id="Dependencies">Dependencies</h3> -<p>The Wearable Support Library provides the necessary classes that you extend to create watch +<p>The +<a href="{@docRoot}reference/android/support/wearable/watchface/package-summary.html">Wearable Support Library</a> +provides the necessary classes that you extend to create watch face implementations. The Google Play services client libraries (<code>play-services</code> and <code>play-services-wearable</code>) are required to sync data items between the companion device and the wearable with the <a href="{@docRoot}training/wearables/data-layer/index.html">Wearable @@ -116,10 +123,15 @@ or when an important event occurs (like switching to ambient mode or receiving a notification). The service implementation then draws the watch face on the screen using the updated time and any other relevant data.</p> -<p>To implement a watch face, you extend the <code>CanvasWatchFaceService</code> -and <code>CanvasWatchFaceService.Engine</code> classes, and then you override the callback methods -in the <code>CanvasWatchFaceService.Engine</code> class. These classes are included in the -Wearable Support Library.</p> +<p>To implement a watch face, you extend the +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.html"><code>CanvasWatchFaceService</code></a> +and +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html"><code>CanvasWatchFaceService.Engine</code></a> +classes, and then you override the callback methods in the +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html"><code>CanvasWatchFaceService.Engine</code></a> +class. These classes are included in the +<a href="{@docRoot}reference/android/support/wearable/watchface/package-summary.html">Wearable Support Library</a>. +</p> <p>The following snippet outlines the key methods you need to implement:</p> @@ -173,20 +185,21 @@ public class AnalogWatchFaceService extends CanvasWatchFaceService { } </pre> -<p class="note"><strong>Note:</strong> The <em>WatchFace</em> sample in the Android SDK -demonstrates how to implement analog and digital watch faces extending the -<code>CanvasWatchFaceService</code> class. This sample is located in the -<code>android-sdk/samples/android-21/wearable/WatchFace</code> directory.</p> - -<p>The <code>CanvasWatchFaceService</code> class provides an invalidate mechanism similar to +<p>The +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.html"><code>CanvasWatchFaceService</code></a> +class provides an invalidate mechanism similar to the {@link android.view.View#invalidate View.invalidate()} method. You can call the -<code>invalidate()</code> method throughout your implementation when you want the system to -redraw the watch face. You can only use the <code>invalidate()</code> method in the main UI -thread. To invalidate the canvas from another thread, call the <code>postInvalidate()</code> +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html#invalidate()"><code>invalidate()</code></a> +method throughout your implementation when +you want the system to redraw the watch face. You can only use the +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html#invalidate()"><code>invalidate()</code></a> +method in the main UI thread. To invalidate the canvas from another thread, call the +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html#postInvalidate()"><code>postInvalidate()</code></a> method.</p> <p>For more information about implementing the methods in the -<code>CanvasWatchFaceService.Engine</code> class, see <a +<a href="{@docRoot}reference/android/support/wearable/watchface/CanvasWatchFaceService.Engine.html"><code>CanvasWatchFaceService.Engine</code></a> +class, see <a href="{@docRoot}training/wearables/watch-faces/drawing.html">Drawing Watch Faces</a>.</p> |