@@ -11,14 +11,15 @@ import android.graphics.BitmapFactory
11
11
import android.net.Uri
12
12
import android.view.KeyEvent
13
13
import androidx.compose.runtime.Composable
14
+ import androidx.compose.runtime.remember
14
15
import androidx.compose.ui.graphics.Color
16
+ import androidx.compose.ui.graphics.toArgb
15
17
import androidx.compose.ui.unit.Dp
16
18
import androidx.compose.ui.unit.dp
17
19
import androidx.compose.ui.unit.sp
18
20
import androidx.glance.GlanceId
19
21
import androidx.glance.GlanceModifier
20
22
import androidx.glance.Image
21
- import androidx.glance.ImageProvider
22
23
import androidx.glance.action.ActionParameters
23
24
import androidx.glance.action.actionParametersOf
24
25
import androidx.glance.action.clickable
@@ -58,7 +59,7 @@ class SchwarzSechsPrototypeMkII : GlanceAppWidget() {
58
59
}
59
60
60
61
private var _latestImagePath : String? = null
61
- private var _currentImageProvider : Bitmap ? = null
62
+ private var _currentImageProviderWrapper : ImageProviderWrapper ? = null
62
63
private var _fallbackImageProvider : Bitmap ? = null
63
64
64
65
@Composable
@@ -72,48 +73,53 @@ class SchwarzSechsPrototypeMkII : GlanceAppWidget() {
72
73
val isFav = data.getBoolean(" favourite" , false )
73
74
val imagePath = data.getString(" image" , null )
74
75
75
- val colors =
76
- if (isDarkModeEnabled(context)) NamidaWidgetColors .dark else NamidaWidgetColors .light
77
-
78
- val boxColor = colors.boxColor
79
- val imageColor = colors.imageColor
80
- val titleColor = colors.titleColor
81
- val subtitleColor = colors.subtitleColor
82
- val iconsColor = colors.iconsColor
83
-
84
76
val imageSize = 84 .dp
85
77
val imageCornerRadiusFloat = 64f
86
78
87
79
if (imagePath == null ) {
88
- _currentImageProvider = null
80
+ _currentImageProviderWrapper = null
89
81
} else {
90
- if (_currentImageProvider == null ||
82
+ if (_currentImageProviderWrapper == null ||
91
83
_latestImagePath != imagePath ||
92
84
data.getBoolean(" evict" , false )
93
85
) {
86
+ _currentImageProviderWrapper ?.bitmap?.recycle()
94
87
try {
95
88
val bitmap = BitmapFactory .decodeFile(imagePath)
96
89
val roundedBitmap = bitmap.toRoundedBitmap(imageCornerRadiusFloat)
97
- _currentImageProvider = roundedBitmap
90
+ // TODO: provide good color
91
+ _currentImageProviderWrapper = ImageProviderWrapper (roundedBitmap, null )
98
92
} catch (_: Exception ) {
99
- _currentImageProvider = null
93
+ _currentImageProviderWrapper = null
100
94
}
101
95
}
102
96
}
103
- if (_currentImageProvider == null ) {
97
+
98
+ val isDark = isDarkModeEnabled(context)
99
+ val mainColor = _currentImageProviderWrapper ?.mainColor;
100
+ val colors: NamidaWidgetColors = remember(mainColor, isDark) { NamidaWidgetColors .buildColors(mainColor, isDark) }
101
+
102
+ val boxColor = colors.boxColor
103
+ val imageColor = colors.imageColor
104
+ val titleColor = colors.titleColor
105
+ val subtitleColor = colors.subtitleColor
106
+ val iconsColor = colors.iconsColor
107
+
108
+ if (_currentImageProviderWrapper == null ) {
104
109
if (_fallbackImageProvider == null ) {
105
110
val imageSizeInt = imageSize.toPxInt(context)
106
111
val bitmap =
107
112
ImageWrapper .createRoundedBitmap(
108
113
imageSizeInt * 2 ,
109
114
imageSizeInt * 2 ,
110
115
imageCornerRadiusFloat,
111
- imageColor
116
+ imageColor.toArgb()
112
117
)
113
118
_fallbackImageProvider = bitmap
114
119
}
115
120
}
116
121
122
+ val finalBitmap = _currentImageProviderWrapper ?.bitmap ? : _fallbackImageProvider !!
117
123
_latestImagePath = imagePath
118
124
119
125
@@ -131,12 +137,14 @@ class SchwarzSechsPrototypeMkII : GlanceAppWidget() {
131
137
) {
132
138
133
139
Image (
134
- androidx.glance.ImageProvider (_currentImageProvider ? : _fallbackImageProvider !! ),
140
+ androidx.glance.ImageProvider (
141
+ finalBitmap
142
+ ),
135
143
null ,
136
144
modifier = GlanceModifier .fillMaxHeight().size(imageSize)
137
145
)
138
146
139
- horizontalSpace (12 )
147
+ HorizontalSpace (12 )
140
148
141
149
Column (
142
150
verticalAlignment = Alignment .Vertical .CenterVertically ,
@@ -195,15 +203,15 @@ class SchwarzSechsPrototypeMkII : GlanceAppWidget() {
195
203
additionalModifier = additionalModifier
196
204
)
197
205
198
- horizontalSpace (4 )
206
+ HorizontalSpace (4 )
199
207
MediaControlButton (
200
208
color = iconsColor,
201
209
drawableRes = com.ryanheise.audioservice.R .drawable.audio_service_skip_previous,
202
210
contentDescription = " Previous" ,
203
211
keyEvent = KeyEvent .KEYCODE_MEDIA_PREVIOUS ,
204
212
additionalModifier = additionalModifier
205
213
)
206
- horizontalSpace (4 )
214
+ HorizontalSpace (4 )
207
215
if (isPlaying)
208
216
MediaControlButton (
209
217
color = iconsColor,
@@ -221,7 +229,7 @@ class SchwarzSechsPrototypeMkII : GlanceAppWidget() {
221
229
keyEvent = KeyEvent .KEYCODE_MEDIA_PLAY ,
222
230
additionalModifier = additionalModifier
223
231
)
224
- horizontalSpace (4 )
232
+ HorizontalSpace (4 )
225
233
MediaControlButton (
226
234
color = iconsColor,
227
235
drawableRes = com.ryanheise.audioservice.R .drawable.audio_service_skip_next,
@@ -235,6 +243,7 @@ class SchwarzSechsPrototypeMkII : GlanceAppWidget() {
235
243
}
236
244
}
237
245
}
246
+
238
247
}
239
248
}
240
249
@@ -305,6 +314,8 @@ class MediaButtonAction : ActionCallback {
305
314
}
306
315
}
307
316
317
+ private class ImageProviderWrapper (val bitmap : Bitmap , val mainColor : Int? ) { }
318
+
308
319
inline fun <reified T : Activity > _startCustomActivity (
309
320
context : Context ,
310
321
uri : Uri ? = null,
@@ -322,7 +333,7 @@ inline fun <reified T : Activity> _startCustomActivity(
322
333
}
323
334
324
335
@Composable
325
- private fun horizontalSpace (width : Int ): Unit {
336
+ private fun HorizontalSpace (width : Int ): Unit {
326
337
return Spacer (GlanceModifier .width(width.dp))
327
338
}
328
339
0 commit comments