1+ package io.rebble.libpebblecommon.util
2+
3+ import io.rebble.libpebblecommon.packets.blobdb.TimelineAttribute
4+ import io.rebble.libpebblecommon.packets.blobdb.TimelineIcon
5+ import io.rebble.libpebblecommon.packets.blobdb.TimelineItem
6+ import io.rebble.libpebblecommon.structmapper.SFixedList
7+ import io.rebble.libpebblecommon.structmapper.SUInt
8+ import io.rebble.libpebblecommon.structmapper.StructMapper
9+ import kotlin.math.round
10+
11+ object TimelineAttributeFactory {
12+ private fun createAttribute (attributeId : UByte , content : UByteArray , contentEndianness : Char = '|'): TimelineItem .Attribute {
13+ return TimelineItem .Attribute (attributeId, content, contentEndianness)
14+ }
15+
16+ private fun createTextAttribute (type : TimelineAttribute , text : String ): TimelineItem .Attribute {
17+ require(type.maxLength != - 1 ) { " Attribute type $type is not a text attribute" }
18+ return createAttribute(type.id, text.encodeToByteArrayTrimmed(type.maxLength).toUByteArray())
19+ }
20+
21+ private fun createStringListAttribute (type : TimelineAttribute , list : List <String >): TimelineItem .Attribute {
22+ val content = list.joinToString(" \u0000 " )
23+ .encodeToByteArrayTrimmed(type.maxLength).toUByteArray()
24+ return createAttribute(type.id, content)
25+ }
26+
27+ private fun createUByteAttribute (type : TimelineAttribute , value : UByte ): TimelineItem .Attribute {
28+ val content = byteArrayOf(value.toByte()).toUByteArray()
29+ return createAttribute(type.id, content)
30+ }
31+
32+ private fun createUIntAttribute (type : TimelineAttribute , value : UInt ): TimelineItem .Attribute {
33+ val content = SUInt (StructMapper (), value, ' <' ).toBytes()
34+ return createAttribute(type.id, content)
35+ }
36+
37+ fun title (text : String , ellipsis : Boolean = true): TimelineItem .Attribute {
38+ return createTextAttribute(TimelineAttribute .Title , text)
39+ }
40+
41+ fun subtitle (text : String , ellipsis : Boolean = true): TimelineItem .Attribute {
42+ return createTextAttribute(TimelineAttribute .Subtitle , text)
43+ }
44+
45+ fun body (text : String , ellipsis : Boolean = true): TimelineItem .Attribute {
46+ return createTextAttribute(TimelineAttribute .Body , text)
47+ }
48+
49+ fun tinyIcon (icon : TimelineIcon , offsetId : Boolean = true): TimelineItem .Attribute {
50+ val id = if (offsetId) {
51+ icon.id or 0x80000000u
52+ } else {
53+ icon.id
54+ }
55+ return createUIntAttribute(TimelineAttribute .TinyIcon , id)
56+ }
57+
58+ fun smallIcon (icon : TimelineIcon , offsetId : Boolean = true): TimelineItem .Attribute {
59+ val id = if (offsetId) {
60+ icon.id or 0x80000000u
61+ } else {
62+ icon.id
63+ }
64+ return createUIntAttribute(TimelineAttribute .SmallIcon , id)
65+ }
66+
67+ fun largeIcon (icon : TimelineIcon , offsetId : Boolean = true): TimelineItem .Attribute {
68+ val id = if (offsetId) {
69+ icon.id or 0x80000000u
70+ } else {
71+ icon.id
72+ }
73+ return createUIntAttribute(TimelineAttribute .LargeIcon , id)
74+ }
75+
76+ fun ancsAction (action : UInt ): TimelineItem .Attribute {
77+ return createUIntAttribute(TimelineAttribute .ANCSAction , action)
78+ }
79+
80+ fun cannedResponse (responses : List <String >): TimelineItem .Attribute {
81+ return createStringListAttribute(TimelineAttribute .CannedResponse , responses)
82+ }
83+
84+ fun shortTitle (text : String ): TimelineItem .Attribute {
85+ return createTextAttribute(TimelineAttribute .ShortTitle , text)
86+ }
87+
88+ fun locationName (text : String ): TimelineItem .Attribute {
89+ return createTextAttribute(TimelineAttribute .LocationName , text)
90+ }
91+
92+ fun sender (text : String ): TimelineItem .Attribute {
93+ return createTextAttribute(TimelineAttribute .Sender , text)
94+ }
95+
96+ fun launchCode (code : UInt ): TimelineItem .Attribute {
97+ return createUIntAttribute(TimelineAttribute .LaunchCode , code)
98+ }
99+
100+ fun lastUpdated (msSinceEpoch : Int ): TimelineItem .Attribute {
101+ return createUIntAttribute(TimelineAttribute .LastUpdated , round(msSinceEpoch / 1000f ).toUInt())
102+ }
103+
104+ fun rankAway (rank : String ): TimelineItem .Attribute {
105+ return createTextAttribute(TimelineAttribute .RankAway , rank)
106+ }
107+
108+ fun rankHome (rank : String ): TimelineItem .Attribute {
109+ return createTextAttribute(TimelineAttribute .RankHome , rank)
110+ }
111+
112+ fun nameAway (name : String ): TimelineItem .Attribute {
113+ return createTextAttribute(TimelineAttribute .NameAway , name)
114+ }
115+
116+ fun nameHome (name : String ): TimelineItem .Attribute {
117+ return createTextAttribute(TimelineAttribute .NameHome , name)
118+ }
119+
120+ fun recordAway (record : String ): TimelineItem .Attribute {
121+ return createTextAttribute(TimelineAttribute .RecordAway , record)
122+ }
123+
124+ fun recordHome (record : String ): TimelineItem .Attribute {
125+ return createTextAttribute(TimelineAttribute .RecordHome , record)
126+ }
127+
128+ fun scoreAway (score : String ): TimelineItem .Attribute {
129+ return createTextAttribute(TimelineAttribute .ScoreAway , score)
130+ }
131+
132+ fun scoreHome (score : String ): TimelineItem .Attribute {
133+ return createTextAttribute(TimelineAttribute .ScoreHome , score)
134+ }
135+
136+ fun sportsGameState (state : UByte ): TimelineItem .Attribute {
137+ return createUByteAttribute(TimelineAttribute .SportsGameState , state)
138+ }
139+
140+ fun broadcaster (text : String ): TimelineItem .Attribute {
141+ return createTextAttribute(TimelineAttribute .Broadcaster , text)
142+ }
143+
144+ fun headings (headings : List <String >): TimelineItem .Attribute {
145+ return createStringListAttribute(TimelineAttribute .Headings , headings)
146+ }
147+
148+ fun paragraphs (paragraphs : List <String >): TimelineItem .Attribute {
149+ return createStringListAttribute(TimelineAttribute .Body , paragraphs)
150+ }
151+
152+ fun foregroundColor (color : PebbleColor ): TimelineItem .Attribute {
153+ return createUIntAttribute(TimelineAttribute .ForegroundColor , color.toProtocolNumber())
154+ }
155+
156+ fun primaryColor (color : PebbleColor ): TimelineItem .Attribute {
157+ return createUIntAttribute(TimelineAttribute .PrimaryColor , color.toProtocolNumber())
158+ }
159+
160+ fun secondaryColor (color : PebbleColor ): TimelineItem .Attribute {
161+ return createUIntAttribute(TimelineAttribute .SecondaryColor , color.toProtocolNumber())
162+ }
163+
164+ fun displayRecurring (recurring : Boolean ): TimelineItem .Attribute {
165+ return createUByteAttribute(TimelineAttribute .DisplayRecurring , if (recurring) 1u else 0u )
166+ }
167+
168+ fun shortSubtitle (text : String ): TimelineItem .Attribute {
169+ return createTextAttribute(TimelineAttribute .ShortSubtitle , text)
170+ }
171+
172+ fun timestamp (timestamp : UInt ): TimelineItem .Attribute {
173+ return createUIntAttribute(TimelineAttribute .LastUpdated , timestamp / 1000u )
174+ }
175+
176+ fun displayTime (displayTime : Boolean ): TimelineItem .Attribute {
177+ return createUByteAttribute(TimelineAttribute .DisplayRecurring , if (displayTime) 1u else 0u )
178+ }
179+
180+ fun subtitleTemplateString (text : String ): TimelineItem .Attribute {
181+ return createTextAttribute(TimelineAttribute .SubtitleTemplateString , text)
182+ }
183+
184+ fun icon (icon : TimelineIcon ): TimelineItem .Attribute {
185+ return createUIntAttribute(TimelineAttribute .Icon , icon.id)
186+ }
187+ }
0 commit comments