YASAN
04/13/2021, 6:15 PMNader Jawad
04/13/2021, 6:36 PMNader Jawad
04/13/2021, 6:37 PMModifier.drawBehind { drawIntoCanvas -> drawable.setBounds(/* bounds */)
drawable.draw(canvas.nativeCanvas)
}
YASAN
04/13/2021, 6:40 PMYASAN
04/13/2021, 8:05 PMNader Jawad
04/13/2021, 8:06 PMNader Jawad
04/13/2021, 8:06 PMYASAN
04/13/2021, 8:08 PMYASAN
04/13/2021, 8:09 PMYASAN
04/13/2021, 8:09 PMNader Jawad
04/13/2021, 8:10 PMYASAN
04/13/2021, 8:16 PMNader Jawad
04/13/2021, 8:16 PMNader Jawad
04/13/2021, 8:17 PMNader Jawad
04/13/2021, 8:18 PMYASAN
04/13/2021, 8:18 PMYASAN
04/13/2021, 8:19 PMNader Jawad
04/13/2021, 8:19 PMNader Jawad
04/13/2021, 8:20 PMYASAN
04/13/2021, 8:24 PMNader Jawad
04/13/2021, 8:25 PMNader Jawad
04/13/2021, 8:25 PMNader Jawad
04/13/2021, 8:25 PMGabriele Mariotti
04/13/2021, 8:28 PMDrawable.toPainter()
function in the accompanist libraryYASAN
04/13/2021, 8:31 PMYASAN
04/13/2021, 8:31 PMYASAN
04/13/2021, 8:32 PMYASAN
04/13/2021, 8:32 PMNader Jawad
04/13/2021, 8:32 PMGabriele Mariotti
04/13/2021, 8:39 PMmodifier = Modifier.drawBehind {
drawIntoCanvas { canvas ->
drawable!!.setBounds(0, 0, size.width.toInt(), size.height.toInt())
canvas.withSave {
if (drawable.intrinsicWidth > 0 && drawable.intrinsicHeight > 0) {
canvas.scale(
sx = size.width / drawable.intrinsicWidth,
sy = size.height / drawable.intrinsicHeight
)
}
drawable.draw(canvas.nativeCanvas)
}
}
YASAN
04/13/2021, 8:39 PMYASAN
04/13/2021, 8:44 PMNader Jawad
04/13/2021, 8:45 PMCanvas(my modifier){ drawIntoCanvas -> drawable.setBounds(/* bounds */)
drawable.draw(canvas.nativeCanvas)
}
Nader Jawad
04/13/2021, 8:46 PMYASAN
04/13/2021, 8:51 PMNader Jawad
04/13/2021, 8:52 PMYASAN
04/13/2021, 9:03 PM@Composable
fun AppHome(
app: App,
activity: MainActivity
) {
val drawable = app.requireIcon(activity)!!
Image(
painter = drawable.toPainter(),
contentDescription = app.label,
modifier = Modifier
.requiredHeight(64.dp)
.requiredWidth(64.dp)
.padding(12.dp)
.clickable {
app.launch(activity)
},
alignment = Alignment.Center
)
}
I just am using the toPainter method since it works fine for now. I am now trying to make a lazyVerticalGrid show these properlyNader Jawad
04/13/2021, 9:06 PMYASAN
04/13/2021, 9:22 PMYASAN
04/13/2021, 9:23 PMNader Jawad
04/13/2021, 9:26 PMNader Jawad
04/13/2021, 9:26 PMYASAN
04/13/2021, 9:27 PMNader Jawad
04/13/2021, 9:28 PMYASAN
04/13/2021, 9:29 PMYASAN
04/13/2021, 9:29 PMYASAN
04/13/2021, 9:30 PMNader Jawad
04/13/2021, 9:30 PMYASAN
04/13/2021, 9:30 PMYASAN
04/13/2021, 9:30 PMYASAN
04/13/2021, 9:34 PMYASAN
04/13/2021, 9:35 PMNader Jawad
04/13/2021, 9:36 PMNader Jawad
04/13/2021, 9:36 PMYASAN
04/13/2021, 9:37 PMYASAN
04/13/2021, 9:37 PMNader Jawad
04/13/2021, 9:37 PMNader Jawad
04/13/2021, 9:37 PMYASAN
04/13/2021, 9:38 PMNader Jawad
04/13/2021, 9:38 PMNader Jawad
04/13/2021, 9:38 PMNader Jawad
04/13/2021, 9:38 PMYASAN
04/13/2021, 9:40 PMNader Jawad
04/13/2021, 9:40 PMYASAN
04/13/2021, 9:41 PMYASAN
04/13/2021, 9:47 PMYASAN
04/13/2021, 9:47 PMYASAN
04/13/2021, 9:48 PMNader Jawad
04/13/2021, 9:49 PMNader Jawad
04/13/2021, 9:49 PMYASAN
04/13/2021, 9:50 PMNader Jawad
04/13/2021, 9:50 PMYASAN
04/13/2021, 9:50 PMYASAN
04/13/2021, 9:50 PMYASAN
04/13/2021, 9:50 PMYASAN
04/13/2021, 9:53 PMYASAN
04/13/2021, 9:53 PMYASAN
04/13/2021, 9:53 PMNader Jawad
04/13/2021, 9:55 PMYASAN
04/13/2021, 9:56 PMYASAN
04/13/2021, 9:57 PMYASAN
04/13/2021, 9:57 PMYASAN
04/13/2021, 9:59 PMNader Jawad
04/13/2021, 10:06 PMNader Jawad
04/13/2021, 10:06 PMYASAN
04/13/2021, 10:07 PMYASAN
04/13/2021, 10:07 PMYASAN
04/13/2021, 10:07 PMNader Jawad
04/13/2021, 10:08 PMYASAN
04/13/2021, 10:09 PMYASAN
04/13/2021, 10:09 PMYASAN
04/13/2021, 10:10 PMNader Jawad
04/13/2021, 10:37 PMYASAN
04/13/2021, 10:50 PMYASAN
04/13/2021, 10:51 PMNader Jawad
04/13/2021, 10:51 PMYASAN
04/13/2021, 10:52 PMfun Drawable.toPainter(): Painter = when (this) {
is BitmapDrawable -> BitmapPainter(bitmap.asImageBitmap())
is ColorDrawable -> ColorPainter(Color(color))
else -> AndroidDrawablePainter(mutate())
}
Nader Jawad
04/13/2021, 10:52 PMYASAN
04/13/2021, 10:53 PMYASAN
04/13/2021, 10:53 PMclass AndroidDrawablePainter(
private val drawable: Drawable
) : Painter() {
private var invalidateTick by mutableStateOf(0)
private var startedAnimatable = drawable is Animatable && drawable.isRunning
init {
drawable.callback = object : Drawable.Callback {
override fun invalidateDrawable(d: Drawable) {
// Update the tick so that we get re-drawn
invalidateTick++
}
override fun scheduleDrawable(d: Drawable, what: Runnable, time: Long) {
MAIN_HANDLER.postAtTime(what, time)
}
override fun unscheduleDrawable(d: Drawable, what: Runnable) {
MAIN_HANDLER.removeCallbacks(what)
}
}
}
override fun applyAlpha(alpha: Float): Boolean {
drawable.alpha = (alpha * 255).roundToInt().coerceIn(0, 255)
return true
}
override fun applyColorFilter(colorFilter: ColorFilter?): Boolean {
drawable.colorFilter = colorFilter?.asAndroidColorFilter()
return true
}
override fun applyLayoutDirection(layoutDirection: LayoutDirection): Boolean {
if (Build.VERSION.SDK_INT >= 23) {
return drawable.setLayoutDirection(
when (layoutDirection) {
LayoutDirection.Ltr -> View.LAYOUT_DIRECTION_LTR
LayoutDirection.Rtl -> View.LAYOUT_DIRECTION_RTL
}
)
}
return false
}
override val intrinsicSize: Size
get() = Size(
width = drawable.intrinsicWidth.toFloat(),
height = drawable.intrinsicHeight.toFloat()
)
override fun DrawScope.onDraw() {
if (!startedAnimatable && drawable is Animatable && !drawable.isRunning) {
// If the drawable is Animatable, start it on the first draw
drawable.start()
startedAnimatable = true
}
drawIntoCanvas { canvas ->
// Reading this ensures that we invalidate when invalidateDrawable() is called
invalidateTick
drawable.setBounds(0, 0, size.width.toInt(), size.height.toInt())
canvas.withSave {
// Painters are responsible for scaling content to meet the canvas size
if (drawable.intrinsicWidth > 0 && drawable.intrinsicHeight > 0) {
canvas.scale(
sx = size.width / drawable.intrinsicWidth,
sy = size.height / drawable.intrinsicHeight
)
}
drawable.draw(canvas.nativeCanvas)
}
}
}
}
/**
* Allows wrapping of a [Drawable] into a [Painter], attempting to un-wrap the drawable contents
* and use Compose primitives where possible.
*/
fun Drawable.toPainter(): Painter = when (this) {
is BitmapDrawable -> BitmapPainter(bitmap.asImageBitmap())
is ColorDrawable -> ColorPainter(Color(color))
else -> AndroidDrawablePainter(mutate())
}
Nader Jawad
04/13/2021, 11:16 PMYASAN
04/13/2021, 11:20 PMprivate fun getIconFromPackageManager(context: Context): Drawable? {
var drawable: Drawable? = null
try {
val intent = Intent(Intent.ACTION_MAIN)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
intent.setClassName(appPackageName, appClassName)
drawable = context.packageManager.getActivityIcon(intent)
} catch (e: Exception) {
try {
drawable = context.packageManager.getApplicationIcon(appPackageName)
} catch (e: Exception) {
e.printStackTrace()
}
}
return drawable
}
YASAN
04/13/2021, 11:21 PMNader Jawad
04/13/2021, 11:40 PMNader Jawad
04/13/2021, 11:41 PMNader Jawad
04/13/2021, 11:42 PMNader Jawad
04/13/2021, 11:42 PMYASAN
04/13/2021, 11:50 PMYASAN
04/13/2021, 11:50 PMNader Jawad
04/13/2021, 11:52 PMYASAN
04/13/2021, 11:55 PM