Androidx wearos watchface set default complication data source

561 Views Asked by At

I can't manage to set my own default complications on my own watchface (same app, same package). I'v used DefaultComplicationDataSourcePolicy for the complicationSlotManager :

sealed class ComplicationConfig(val id: Int, val supportedTypes: List<ComplicationType>) {
    object Left : ComplicationConfig(
        LEFT_COMPLICATION_ID,
        listOf(
            ComplicationType.SMALL_IMAGE,
            ComplicationType.SHORT_TEXT
        )
    )

   ...
}

// Utility function that initializes default complication slots (left and right).
fun createComplicationSlotManager(
    context: Context,
    currentUserStyleRepository: CurrentUserStyleRepository,
    drawableId: Int = DEFAULT_COMPLICATION_STYLE_DRAWABLE_ID
): ComplicationSlotsManager {
    val defaultCanvasComplicationFactory =
        CanvasComplicationFactory { watchState, listener ->
            CanvasComplicationDrawable(
                ComplicationDrawable.getDrawable(context, drawableId)!!,
                watchState,
                listener
            )
        }

    val protectionComplicationComponentName = ComponentName(
        context,
        ProtectionStatusComplicationService::class.java
    )

    Log.d("ComplicationUtils",protectionComplicationComponentName.flattenToString())

    ...

    val leftComplication = ComplicationSlot.createRoundRectComplicationSlotBuilder(
        id = ComplicationConfig.Left.id,
        canvasComplicationFactory = defaultCanvasComplicationFactory,
        supportedTypes = ComplicationConfig.Left.supportedTypes,
        defaultDataSourcePolicy = DefaultComplicationDataSourcePolicy(
            protectionComplicationComponentName,
            ComplicationType.SMALL_IMAGE,
            SystemDataSources.DATA_SOURCE_STEP_COUNT,
            ComplicationType.SHORT_TEXT
        ),
        bounds = ComplicationSlotBounds(
            RectF(
                LEFT_COMPLICATION_LEFT_BOUND,
                LEFT_AND_RIGHT_COMPLICATIONS_TOP_BOUND,
                LEFT_COMPLICATION_RIGHT_BOUND,
                LEFT_AND_RIGHT_COMPLICATIONS_BOTTOM_BOUND
            )
        )
    ).build()

    ...

    return ComplicationSlotsManager(
        listOf(leftComplication, rightComplication,topComplication,bottomComplication),
        currentUserStyleRepository
    )
}

And I set my watchface as safe in the manifest :

<!-- Required to act as a custom watch face. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.permission.PROVIDE_BACKGROUND" />

<!-- Required for complications to receive complication data and open the provider chooser. -->
<uses-permission android:name="com.google.android.wearable.permission.RECEIVE_COMPLICATION_DATA" />
<uses-permission android:name="com.google.android.wearable.permission.RECEIVE_COMPLICATION_DATA_PRIVILEGED" />

...

<application

    ...

    <service
            android:name=".complications.ProtectionStatusComplicationService"
            android:exported="true"
            android:icon="@drawable/shield_black_24dp"
            android:label="Protection complication"
            android:permission="com.google.android.wearable.permission.BIND_COMPLICATION_PROVIDER">
            <intent-filter>
                <action android:name="android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST" />
            </intent-filter>

            <meta-data
                android:name="android.support.wearable.complications.UPDATE_PERIOD_SECONDS"
                android:value="300" />

            <meta-data
                android:name="android.support.wearable.complications.SAFE_WATCH_FACES"
                android:value="com.waryme.wearos/com.waryme.wearos.watchface.WaryMeWatchFaceService"/>

            <meta-data
                android:name="android.support.wearable.complications.SUPPORTED_TYPES"
                android:value="SMALL_IMAGE" />
    </service>

    ...

</application>

The step count is working as expected as fallback. I've logged the flattenToString() of the componentName and everything is good. According to the documentation, there could be 3 origins to this problem :

  • complication isn't installed (i can add manually the complication with config activity so not this)
  • complication doesn't support the requested type (The complication is in the list of available complication so not this)
  • the watch face lacks the necessary permission (I gave the safe permission in the manifest, is there any others ?)

Am I missing something ? There is not much documentation on new androidx wearos libraries.

Thanks

EDIT : I know there is already an answer to this question, but it deals with the android.support.wearable library which is now deprecated.

1

There are 1 best solutions below

0
On BEST ANSWER

After further reading of the documentation :

"primaryDataSourceDefaultType - The default ComplicationType if primaryDataSource is selected. Note Pre-R this will be ignored in favour of systemDataSourceFallbackDefaultType."

Assuming that Pre-R is Pre-Rendering, the default type of the system complication should be the same as the primary data source default type. So i changed it and this works :)

    val leftComplication = ComplicationSlot.createRoundRectComplicationSlotBuilder(
        id = ComplicationConfig.Left.id,
        canvasComplicationFactory = defaultCanvasComplicationFactory,
        supportedTypes = ComplicationConfig.Left.supportedTypes,
        defaultDataSourcePolicy = DefaultComplicationDataSourcePolicy(
            protectionComplicationComponentName,
            ComplicationType.SMALL_IMAGE,
            SystemDataSources.DATA_SOURCE_APP_SHORTCUT,
            ComplicationType.SMALL_IMAGE
        ),
        bounds = ComplicationSlotBounds(
            RectF(
                LEFT_COMPLICATION_LEFT_BOUND,
                LEFT_AND_RIGHT_COMPLICATIONS_TOP_BOUND,
                LEFT_COMPLICATION_RIGHT_BOUND,
                LEFT_AND_RIGHT_COMPLICATIONS_BOTTOM_BOUND
            )
        )
    ).build()