91 lines
3.3 KiB
Kotlin
91 lines
3.3 KiB
Kotlin
/*
|
|
* Copyright (c) 2020 Hemanth Savarla.
|
|
*
|
|
* Licensed under the GNU General Public License v3
|
|
*
|
|
* This is free software: you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
|
*
|
|
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
* See the GNU General Public License for more details.
|
|
*
|
|
*/
|
|
package code.name.monkey.retromusic.appshortcuts
|
|
|
|
import android.content.Context
|
|
import android.graphics.Bitmap
|
|
import android.graphics.Canvas
|
|
import android.graphics.drawable.Drawable
|
|
import android.graphics.drawable.Icon
|
|
import android.graphics.drawable.LayerDrawable
|
|
import android.os.Build
|
|
import android.util.TypedValue
|
|
import androidx.annotation.RequiresApi
|
|
import code.name.monkey.appthemehelper.ThemeStore
|
|
import code.name.monkey.retromusic.R
|
|
import code.name.monkey.retromusic.util.PreferenceUtil
|
|
import code.name.monkey.retromusic.util.RetroUtil
|
|
|
|
@RequiresApi(Build.VERSION_CODES.N_MR1)
|
|
object AppShortcutIconGenerator {
|
|
fun generateThemedIcon(context: Context, iconId: Int): Icon {
|
|
return if (PreferenceUtil.isColoredAppShortcuts) {
|
|
generateUserThemedIcon(context, iconId)
|
|
} else {
|
|
generateDefaultThemedIcon(context, iconId)
|
|
}
|
|
}
|
|
|
|
private fun generateDefaultThemedIcon(context: Context, iconId: Int): Icon {
|
|
// Return an Icon of iconId with default colors
|
|
return generateThemedIcon(
|
|
context,
|
|
iconId,
|
|
context.getColor(R.color.app_shortcut_default_foreground),
|
|
context.getColor(R.color.app_shortcut_default_background)
|
|
)
|
|
}
|
|
|
|
private fun generateUserThemedIcon(context: Context, iconId: Int): Icon {
|
|
// Get background color from context's theme
|
|
val typedColorBackground = TypedValue()
|
|
context.theme.resolveAttribute(android.R.attr.colorBackground, typedColorBackground, true)
|
|
|
|
// Return an Icon of iconId with those colors
|
|
return generateThemedIcon(
|
|
context, iconId, ThemeStore.accentColor(context), typedColorBackground.data
|
|
)
|
|
}
|
|
|
|
private fun generateThemedIcon(
|
|
context: Context,
|
|
iconId: Int,
|
|
foregroundColor: Int,
|
|
backgroundColor: Int
|
|
): Icon {
|
|
// Get and tint foreground and background drawables
|
|
val vectorDrawable = RetroUtil.getTintedVectorDrawable(context, iconId, foregroundColor)
|
|
val backgroundDrawable = RetroUtil.getTintedVectorDrawable(
|
|
context, R.drawable.ic_app_shortcut_background, backgroundColor
|
|
)
|
|
|
|
// Squash the two drawables together
|
|
val layerDrawable = LayerDrawable(arrayOf(backgroundDrawable, vectorDrawable))
|
|
|
|
// Return as an Icon
|
|
return Icon.createWithBitmap(drawableToBitmap(layerDrawable))
|
|
}
|
|
|
|
private fun drawableToBitmap(drawable: Drawable): Bitmap {
|
|
val bitmap = Bitmap.createBitmap(
|
|
drawable.intrinsicWidth, drawable.intrinsicHeight, Bitmap.Config.ARGB_8888
|
|
)
|
|
val canvas = Canvas(bitmap)
|
|
drawable.setBounds(0, 0, canvas.width, canvas.height)
|
|
drawable.draw(canvas)
|
|
return bitmap
|
|
}
|
|
}
|