Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -31,21 +31,27 @@ import androidx.wear.protolayout.material3.Typography.TITLE_LARGE
import androidx.wear.protolayout.material3.Typography.TITLE_MEDIUM
import androidx.wear.protolayout.material3.icon
import androidx.wear.protolayout.material3.iconEdgeButton
import androidx.wear.protolayout.material3.materialScope
import androidx.wear.protolayout.ProtoLayoutScope
import androidx.wear.protolayout.TimelineBuilders
import androidx.wear.protolayout.layout.androidImageResource
import androidx.wear.protolayout.layout.imageResource
import androidx.wear.protolayout.material3.materialScopeWithResources
import androidx.wear.protolayout.material3.primaryLayout
import androidx.wear.protolayout.material3.text
import androidx.wear.protolayout.material3.titleCard
import androidx.wear.protolayout.modifiers.LayoutModifier
import androidx.wear.protolayout.modifiers.clickable
import androidx.wear.protolayout.modifiers.contentDescription
import androidx.wear.protolayout.types.layoutString
import androidx.wear.tiles.RequestBuilders
import androidx.wear.tiles.TileBuilders
import androidx.wear.tiles.TileService
import androidx.wear.tiles.tooling.preview.TilePreviewData
import androidx.wear.tiles.tooling.preview.TilePreviewHelper
import com.example.wear.tiles.R
import com.example.wear.tiles.tools.MultiRoundDevicesWithFontScalePreviews
import com.example.wear.tiles.tools.addIdToImageMapping
import com.example.wear.tiles.tools.isLargeScreen
import com.example.wear.tiles.tools.resources
import com.google.common.util.concurrent.Futures
import java.time.LocalTime

fun MaterialScope.styledTime(time: LocalTime): LayoutElement {
Expand Down Expand Up @@ -85,8 +91,13 @@ object Alarm {
val clickable: Clickable
)

fun layout(context: Context, deviceParameters: DeviceParameters, data: AlarmData) =
materialScope(context, deviceParameters) {
fun layout(
context: Context,
scope: ProtoLayoutScope,
deviceParameters: DeviceParameters,
data: AlarmData
) =
materialScopeWithResources(context, scope, deviceParameters) {
primaryLayout(
titleSlot = { text("Alarm".layoutString) },
mainSlot = {
Expand Down Expand Up @@ -116,28 +127,26 @@ object Alarm {
colors = filledTonalButtonColors(),
modifier = LayoutModifier.contentDescription("Plus"),
iconContent = {
icon(context.resources.getResourceName(R.drawable.outline_add_2_24))
icon(
imageResource(
androidImageResource(R.drawable.outline_add_2_24)
)
)
}
)
}
)
}

fun resources(context: Context) = resources {
addIdToImageMapping(
context.resources.getResourceName(R.drawable.outline_add_2_24),
R.drawable.outline_add_2_24
)
}
}

@MultiRoundDevicesWithFontScalePreviews
internal fun alarmPreview(context: Context) =
TilePreviewData(Alarm.resources(context)) {
TilePreviewData { request ->
TilePreviewHelper.singleTimelineEntryTileBuilder(
Alarm.layout(
context,
it.deviceConfiguration,
request.scope,
request.deviceConfiguration,
Alarm.AlarmData(
alarmTime = LocalTime.parse("14:58"),
alarmDays = "Mon—Fri",
Expand All @@ -148,17 +157,24 @@ internal fun alarmPreview(context: Context) =
.build()
}

class AlarmTileService : BaseTileService() {
override fun layout(context: Context, deviceParameters: DeviceParameters): LayoutElement =
Alarm.layout(
context,
deviceParameters,
Alarm.AlarmData(
alarmTime = LocalTime.parse("14:58"),
alarmDays = "Mon—Fri",
clickable = clickable()
)
class AlarmTileService : TileService() {
override fun onTileRequest(requestParams: RequestBuilders.TileRequest) =
Futures.immediateFuture(
TileBuilders.Tile.Builder()
.setTileTimeline(
TimelineBuilders.Timeline.fromLayoutElement(
Alarm.layout(
this,
requestParams.scope,
requestParams.deviceConfiguration,
Alarm.AlarmData(
alarmTime = LocalTime.parse("14:58"),
alarmDays = "Mon—Fri",
clickable = clickable()
)
)
)
)
.build()
)

override fun resources(context: Context) = Alarm.resources(context)
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,11 @@ import androidx.wear.protolayout.material3.backgroundImage
import androidx.wear.protolayout.material3.buttonGroup
import androidx.wear.protolayout.material3.icon
import androidx.wear.protolayout.material3.iconButton
import androidx.wear.protolayout.material3.materialScope
import androidx.wear.protolayout.ProtoLayoutScope
import androidx.wear.protolayout.TimelineBuilders
import androidx.wear.protolayout.layout.androidImageResource
import androidx.wear.protolayout.layout.imageResource
import androidx.wear.protolayout.material3.materialScopeWithResources
import androidx.wear.protolayout.material3.primaryLayout
import androidx.wear.protolayout.material3.text
import androidx.wear.protolayout.material3.textButton
Expand All @@ -39,15 +43,17 @@ import androidx.wear.protolayout.modifiers.LayoutModifier
import androidx.wear.protolayout.modifiers.clickable
import androidx.wear.protolayout.modifiers.contentDescription
import androidx.wear.protolayout.types.layoutString
import androidx.wear.tiles.RequestBuilders
import androidx.wear.tiles.TileBuilders
import androidx.wear.tiles.TileService
import androidx.wear.tiles.tooling.preview.TilePreviewData
import androidx.wear.tiles.tooling.preview.TilePreviewHelper
import com.example.wear.tiles.R
import com.example.wear.tiles.tools.MultiRoundDevicesWithFontScalePreviews
import com.example.wear.tiles.tools.addIdToImageMapping
import com.example.wear.tiles.tools.box
import com.example.wear.tiles.tools.column
import com.example.wear.tiles.tools.isLargeScreen
import com.example.wear.tiles.tools.resources
import com.google.common.util.concurrent.Futures

object Calendar {
data class Event(
Expand All @@ -59,8 +65,13 @@ object Calendar {
val clickable: Clickable
)

fun layout(context: Context, deviceParameters: DeviceParameters, data: Event) =
materialScope(context, deviceParameters) {
fun layout(
context: Context,
scope: ProtoLayoutScope,
deviceParameters: DeviceParameters,
data: Event
) =
materialScopeWithResources(context, scope, deviceParameters) {
primaryLayout(
mainSlot = {
column {
Expand All @@ -86,8 +97,10 @@ object Calendar {
onClick = data.clickable,
iconContent = {
icon(
context.resources.getResourceName(
R.drawable.outline_add_24
imageResource(
androidImageResource(
R.drawable.outline_add_24
)
)
)
},
Expand Down Expand Up @@ -131,10 +144,12 @@ object Calendar {
},
colors = filledVariantCardColors(),
backgroundContent =
data.imageId?.let { id ->
data.imageId?.let {
{
backgroundImage(
protoLayoutResourceId = id,
resource = imageResource(
androidImageResource(R.drawable.photo_38)
),
contentScaleMode = CONTENT_SCALE_MODE_CROP
)
}
Comment on lines +147 to 155
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The imageId from the Event data is being ignored here. The let block checks if data.imageId is not null, but then a hardcoded drawable R.drawable.photo_38 is used for the background image. This means the tile will always show the same background image regardless of the imageId provided in the Event data.

This seems to be due to an incomplete migration for this file. To fix this, you should update the Event data class to use an Int? for imageId instead of String?, and update its call sites. This is the pattern used in other files in this PR, like Media.kt.

After updating the data class, this block should be changed to use the imageId from the data, for example:

data.imageId?.let { imageResId ->
    {
        backgroundImage(
            resource = imageResource(
                androidImageResource(imageResId)
            ),
            contentScaleMode = CONTENT_SCALE_MODE_CROP
        )
    }
}

Expand All @@ -149,17 +164,6 @@ object Calendar {
}
)
}

fun resources(context: Context) = resources {
addIdToImageMapping(
context.resources.getResourceName(R.drawable.outline_add_24),
R.drawable.outline_add_24
)
addIdToImageMapping(
context.resources.getResourceName(R.drawable.photo_38),
R.drawable.photo_38
)
}
}

@MultiRoundDevicesWithFontScalePreviews
Expand All @@ -170,11 +174,12 @@ internal fun calendar2Preview(context: Context) =
calendarPreviewX(context, context.resources.getResourceName(R.drawable.photo_38))

fun calendarPreviewX(context: Context, eventImageId: String? = null) =
TilePreviewData(Calendar.resources(context)) {
TilePreviewData { request ->
TilePreviewHelper.singleTimelineEntryTileBuilder(
Calendar.layout(
context,
it.deviceConfiguration,
request.scope,
request.deviceConfiguration,
Calendar.Event(
date = "25 July",
time = "6:30-7:30 PM",
Expand All @@ -188,38 +193,52 @@ fun calendarPreviewX(context: Context, eventImageId: String? = null) =
.build()
}

class Calendar1TileService : BaseTileService() {
override fun layout(context: Context, deviceParameters: DeviceParameters): LayoutElement =
Calendar.layout(
context,
deviceParameters,
Calendar.Event(
date = "25 July",
time = "6:30-7:30 PM",
name = "Advanced Tennis Coaching with Christina Lloyd",
location = "216 Market Street",
imageId = null,
clickable = clickable()
)
class Calendar1TileService : TileService() {
override fun onTileRequest(requestParams: RequestBuilders.TileRequest) =
Futures.immediateFuture(
TileBuilders.Tile.Builder()
.setTileTimeline(
TimelineBuilders.Timeline.fromLayoutElement(
Calendar.layout(
this,
requestParams.scope,
requestParams.deviceConfiguration,
Calendar.Event(
date = "25 July",
time = "6:30-7:30 PM",
name = "Advanced Tennis Coaching with Christina Lloyd",
location = "216 Market Street",
imageId = null,
clickable = clickable()
)
)
)
)
.build()
)

override fun resources(context: Context) = Calendar.resources(context)
}

class Calendar2TileService : BaseTileService() {
override fun layout(context: Context, deviceParameters: DeviceParameters): LayoutElement =
Calendar.layout(
context,
deviceParameters,
Calendar.Event(
date = "25 July",
time = "6:30-7:30 PM",
name = "Advanced Tennis Coaching with Christina Lloyd",
location = "216 Market Street",
imageId = context.resources.getResourceName(R.drawable.photo_38),
clickable = clickable()
)
class Calendar2TileService : TileService() {
override fun onTileRequest(requestParams: RequestBuilders.TileRequest) =
Futures.immediateFuture(
TileBuilders.Tile.Builder()
.setTileTimeline(
TimelineBuilders.Timeline.fromLayoutElement(
Calendar.layout(
this,
requestParams.scope,
requestParams.deviceConfiguration,
Calendar.Event(
date = "25 July",
time = "6:30-7:30 PM",
name = "Advanced Tennis Coaching with Christina Lloyd",
location = "216 Market Street",
imageId = resources.getResourceName(R.drawable.photo_38),
clickable = clickable()
)
)
)
)
.build()
)

override fun resources(context: Context) = Calendar.resources(context)
}
Loading
Loading