Skip to content

Most visited

Recently visited

navigation

Adding Complications to a Watch Face

A watch face Complications displays data from a data provider. With the Complications API, watch faces can choose the data providers they want to use to get the underlying data. This enables watch faces to display information beyond time without needing code for getting the data.

Complications API also enables users to select data providers of their choice. Additionally, Android Wear provides a user interface for data source selection.

Complications

To add complications to a watch face, do the following:

Setting Default Providers for Watch Faces

Watch faces can specify default providers that are used until a user selects a provider. Set default providers using the setDefaultComplicationProvider() method in WatchFaceService.Engine. This method may be called at any time, but it does nothing if the user already chose a provider for the given complication.

For most providers, the RECEIVE_COMPLICATION_DATA permission must be granted to a watch face before data can flow to it. However, some system providers are considered safe because they only supply information that the watch face already could obtain itself. Safe providers does not require the watch face to have the permission for data to be sent (see System providers). These providers may be preferable to use as defaults, as they can supply data immediately.

Alternatively, if a watch face has a partnership with a certain provider and wishes to use it as a default, it can request that the provider list it as a safe watch face.

System providers

The system includes providers that can be used as defaults. The setDefaultSystemComplicationProvider() method, in the WatchFaceService.Engine class, sets a default system provider for a complication. This method takes an ID (as an integer) that represents a system provider. The available IDs are listed in the SystemProviders class.

The following table has details about some of the supported system providers:

Method name in the SystemProviders class Safety Can be the default Notes
dateProvider() Yes Yes The standard system date provider. Tapping opens the standard Agenda app.
currentTimeProvider() Yes Yes The standard system "time and date" provider. No tap action.
batteryProvider() Yes Yes The standard system battery provider. No tap action.
stepCountProvider() Yes Yes Shows a daily total of steps, as reported by readDailyTotal.
unreadCountProvider() Yes Yes Shows the number of unread notifications in the stream.
worldClockProvider() Yes Yes Will default to London or New York. Can be tapped to change the time zone.
appsProvider() Yes Yes Will show an "apps" icon at first, which can be tapped to choose an app.
nextEventProvider() No Yes (but not a safe provider) The standard system "next event" provider. Tapping opens the standard Agenda app.

Allowing Users to Choose Data Providers

Android Wear provides a user interface (via an Activity) that enables users to choose providers for a particular complication. Watch faces can call the createProviderChooserHelperIntent method to obtain an intent that can be used to show the chooser interface.

When a watch face calls createProviderChooserHelperIntent, the watch face supplies a watch face complication ID and a list of supported types. The types should be listed in order of preference, usually with types offering more information, such as ranged value, given higher preference.

When the user selects a data provider, the configuration is saved automatically; nothing more is required from the watch face.

See the Watch Face sample app for the full-featured, recommended code for the settings user interface.

That code includes:

A starting point for reviewing that code is the AnalogComplicationConfigActivity class, which has a getDataToPopulateAdapter() method that returns a list of the settings entries available in the UI.

Opening the provider chooser

A watch face must have the following permission to receive complication data and open the provider chooser:

com.google.android.wearable.permission.RECEIVE_COMPLICATION_DATA

A watch face that was not granted the above permission will be unable to start the provider chooser.

To make it easier to request the permission and start the chooser, the ComplicationHelperActivity class is available in the wearable support library. This class should be used instead of ProviderChooserIntent class to start the chooser in almost all cases.

Requesting the necessary permission

To use ComplicationHelperActivity, add it to the watch face in the manifest file:

<activity android:name="android.support.wearable.complications.ComplicationHelperActivity"/>

To start the provider chooser, call the ComplicationHelperActivity.createProviderChooserHelperIntent method, to obtain an intent.

The new intent can be used with either startActivity or startActivityForResult to launch the chooser.

Here is an example of using the new intent with startActivityForResult:

startActivityForResult(
  ComplicationHelperActivity.createProviderChooserHelperIntent(
     getActivity(),
     watchFace,
     complicationId,
     ComplicationData.TYPE_LARGE_IMAGE),
  PROVIDER_CHOOSER_REQUEST_CODE);

When the helper activity is started, the helper activity checks if the permission was granted. If the permission was not granted, the helper activity makes a runtime permission request. If the permission request is accepted (or is unneeded), the provider chooser is shown.

If startActivityForResult was used with the intent, the result delivered back to the calling Activity will have a result code of RESULT_OK if a provider was successfully set, or a result code of RESULT_CANCELLED if no provider was set.

In the case where a provider was set, ComplicationProviderInfo class for the chosen provider will be included in the data intent of the result, as an extra with the key ProviderChooserIntent#EXTRA_PROVIDER_INFO.

Receiving Complication Data

To start receiving complication data, a watch face calls setActiveComplications(), in the WatchFaceService.Engine class, with a list of watch face complication IDs. A watch face creates these IDs to uniquely identify slots on the watch face where complications can appear, and passes them to the createProviderChooserIntent() method to allow the user to decide which complication should go in which slot. Complication data is delivered via the onComplicationDataUpdate() callback.

In general, watch faces need the above permission in order to receive complication data, but there are some exceptions. Specifically, a watch face can only receive data from a provider if one of the following is true:

If none of the above is true, then when ComplicationData normally would be sent by a provider to a watch face, the system instead sends data of the type TYPE_NO_PERMISSION. This type includes an icon (an exclamation mark) and short text ("--") to allow it to be rendered as if it were of the short text type or icon type, for convenience.

When a watch face receives data of TYPE_NO_PERMISSION, the watch face should render this appropriately, so the user can see that action is needed for the complication to work. If possible, a tap on a complication in this state should launch a permission request. This can be done using ComplicationHelperActivity.createPermissionRequestHelperIntent(), if the helper activity was added to the watch face app.

If a user accepts the permission request created by the helper activity, updates are requested for all the active complications on the watch face automatically, allowing the TYPE_NO_PERMISSION data to be replaced by real data.

Rendering Complications

The watch face may render the data as desired as long as the expected fields are represented; the required fields should always be included. Depending on the type, some of the optional fields should also be included (see the Notes column in the table below).

We provide design guidelines for our style, as a suggestion for standard complications, but developers can use their own styles or incorporate the data into the watch face in different ways.

Drawing complications

The ComplicationDrawable class enables you to render an entire complication on a canvas.

The class supports all six of the main complication types, and does the following for you:

If you target API level 24, a ComplicationDrawable object can be defined in XML as a resource. Alternatively, you can create a ComplicationDrawable object programmatically. You use the draw() method to draw a complication and set style options for the interactive and ambient modes.

For detailed instructions and examples for drawing complications, see ComplicationDrawable, which includes sample XML. For a sample watch face that utilizes this class and includes sample XML, see the AnalogComplicationWatchFaceService sample in the Watch Face sample app.

If you don't use a ComplicationDrawable object, use TextRenderer for the text of a complication.

Rendering text

The TextRenderer class is intended for use in complications, and eases the drawing of text on a canvas. The class includes these features:

When you initialize your watch face engine, you can create a TextRenderer object and pass in the TextPaint object that you want the TextRenderer object to use. The TextPaint object defines the font, text size, color, and more. You should create a TextRenderer object for each field, e.g. one for a text field and one for a title field.

For example code, including for specifying bounds on the text you want to render, see TextRenderer.

Tapping on complications

Providers can specify an action that occurs if the user taps on a complication, so it should be possible for most complications to be tappable. This action will be specified as a PendingIntent included in the ComplicationData object. The watch face is responsible for detecting taps on complications, and should fire the pending intent when a tap occurs.

It may be infeasible to make some complications tappable (e.g., in the case of a complication that fills the entire background of the watch face), but it is expected that watch faces accept taps on complications where possible.

See Creating Interactive Watch Faces to learn how to create watch faces that respond to user taps.

Complication Types

Complication types determine the kinds of data shown in a complication. For example, the SHORT_TEXT type is available when the key data is a short string. In the example of the SHORT_TEXT type, optional data are an icon and a short title.

Data providers use these complication types differently from the way watch face providers use these types:

A ComplicationData object will always have a single complication type. Each complication type has required and optional fields. Generally, a required field represents the primary piece of data; most types take their name from the required field.

A given type may include different sets of fields. For example, SHORT_TEXT may be just a single piece of text, or a title and text, or an icon and text. A complication that supports a given type must be able to display all the expected variants. However, some optional fields do not need to be displayed (see the Notes column of the table below). For example, the Short title field of the RANGED_VALUE type is not required so that, for example, gauges can be shown without including text.

Examples of Complication Types

The following shows examples of complication types:

Complication types

Types and fields

The following table describes the types and fields of the ComplicationData object. If a watch face requests a field that is invalid for a complication type, a default value for the field is returned. For example, if a watch face tries to access a Long text field in a SHORT_TEXT type, the default value for the Long text field (null) is returned.

Type Required fields Optional fields Notes
SHORT_TEXT Short text Icon
Burn-in protection icon
Short title
Exactly one of Icon/Short title is expected to be shown if either or both are provided.
ICON Icon Burn-in protection icon Used when text is not needed. The icon is expected to be single-color, and may be tinted by the watch face.
RANGED_VALUE Value
Min value
Max value
Icon
Burn-in protection icon
Short text
Short title
Optional fields are not guaranteed to be displayed.
LONG_TEXT Long text Long title
Icon
Burn-in protection icon
Small image
Title is expected to be shown if provided.
SMALL_IMAGE Small image A small image has one of two styles: photo style or icon style. Photo style means it should fill the space and can be cropped; icon style means it should not be cropped and may be padded. Image variability can result in an unsuitable image for display in ambient mode on devices with burn-in protection or with low-bit ambient mode. Since it is hard for a watch face to determine suitability for display, a watch face should not display an image in ambient mode if burn-in protection or low-bit ambient is enabled.
LARGE_IMAGE Large image This image is expected to be large enough to fill the watch face. Image variability can result in an unsuitable image for display in ambient mode on devices with burn-in protection or with low-bit ambient mode. Since it is hard for a watch face to determine suitability for display, a watch face should not display an image in ambient mode if burn-in protection or low-bit ambient is enabled.

The types in the table below are for empty data and may be sent for any complication slot. These types have no fields and do not need to be included in a list of supported types. These types enable watch faces to differentiate among the following three cases:

Providers should not send TYPE_EMPTY in response to update requests. Providers should send TYPE_NO_DATA instead.

Details on the complication types for "empty" data are in the following table:

Complication type Description
TYPE_NOT_CONFIGURED Sent by the system when a complication is activated but the user has not selected a provider, and no default was set.

Cannot be sent by providers.

TYPE_EMPTY Sent by the system when a complication is activated and the user has chosen "empty" instead of a provider, or when the watch face has chosen no provider, and this type, as the default.

Cannot be sent by providers.

TYPE_NO_DATA Sent by the system when a complication (that has a provider) is activated, to clear the complication before actual data is received from the provider.

Should be sent by providers if they have no actual data to send.

Using Fields for Complication Data

The fields of a ComplicationData object have different functions. For example, a text field contains the primary data while a title field is descriptive; a step count complication might have a text field value of "2,543" with a title field value of "steps."

The following table contains descriptions of the fields in a ComplicationData object. The fields may or may not be populated, depending on the complication type.

Field Description
Short text Primary text field for small complications. The maximum length of this field should not exceed seven characters (including any time-dependent text). Watch faces are expected to have the ability to render any seven-character string. Strings vary in width, depending on the characters used. A watch face should adjust the text size to allow it to fit in the complication. If the text exceeds seven characters, it may be truncated.
Icon A single-color image representing the data or the source of the data. Must be tintable. Vector drawables are recommended for this field.
Burn-in protection icon Field to enable an icon to be displayed in ambient mode on devices that use burn-in protection. In ambient mode, watch faces on devices that use burn-in protection should not display solid blocks of pixels. The Burn-in protection icon field is optional for any complication type that includes the icon field. The Burn-in protection icon field should not contain any solid blocks of pixels. The Burn-in protection icon field should be supplied by providers if their standard icon is unsuitable for burn-in protection. A watch face rendering in ambient mode on a device with burn-in protection enabled should use the Burn-in protection icon field, if available, instead of the icon field.
Short title Descriptive field for small complications. May only be meaningful in combination with the Short text field. The maximum length of this field should not exceed seven characters (including any time-dependent text). Watch faces are expected to have the ability to render any seven-character string. Strings vary in width, depending on the characters used. A watch face should adjust the text size to allow it to fit in the complication. If the text exceeds seven characters, it may be truncated.
Long text Primary data field for large, text-based complications.
Long title Descriptive field for large, text-based complications. May only be meaningful in combination with Long text.
Value A numerical (float) representation of the data. Expected to be depicted relative to the bounds the Min value and Max value fields (but not required to be between those bounds).
Min value The lower bound for the range within which Value should be depicted. Only meaningful in combination with Value and Max value.
Max value The upper bound for the range within which value should be depicted. Only meaningful in combination with Value and Min value.
Small image A small image to represent the data or the source of the data. May be full color. Not expected to fill the entire watch face.
Large image An image with sufficient resolution to fill the watch face. May be full color.

Testing Complication Types

Each complication type has fields, such as text and icons. If your watch face supports a complication type, you need to support all of the valid field combinations.

You can test the way complication data is displayed on a watch face. Specifically, a test suite enables you to test the display of the complication types. Thus, you don't need to write code to test the valid field combinations for a ComplicationData object.

The test suite is a data provider, available as a sample, which cycles through the valid field combinations for a given complication type.

To use the test suite:

  1. Install the test suite APK on a device or emulator.
  2. Access your watch face and tap its main settings icon.
  3. Use the settings UI to choose the test suite: WearComplication-ProviderTestSuite
  4. Choose a complication data type to test.
  5. Tap your complication to view the variations of the data type.
  6. Repeatedly tap your complication to verify that all relevant field combinations are properly displayed.

For example, if a complication supports short text, tap your complication to see all the main combinations of fields for short text.

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Follow Google Developers on WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience.
(Sep 2017 survey)