@@ -2,16 +2,25 @@ package com.github.droidworksstudio.launcher.ui.home
2
2
3
3
import android.annotation.SuppressLint
4
4
import android.content.pm.PackageManager
5
- import android.util.Log
5
+ import android.graphics.Bitmap
6
+ import android.graphics.Canvas
7
+ import android.graphics.Color
8
+ import android.graphics.drawable.BitmapDrawable
9
+ import android.graphics.drawable.Drawable
6
10
import android.view.Gravity
7
11
import android.view.View
8
- import androidx.appcompat.widget.LinearLayoutCompat
12
+ import androidx.core.content.ContextCompat
13
+ import androidx.core.graphics.ColorUtils
14
+ import androidx.core.graphics.drawable.DrawableCompat
15
+ import androidx.palette.graphics.Palette
9
16
import androidx.recyclerview.widget.RecyclerView
17
+ import com.github.droidworksstudio.launcher.R
10
18
import com.github.droidworksstudio.launcher.data.entities.AppInfo
11
19
import com.github.droidworksstudio.launcher.databinding.ItemHomeBinding
12
20
import com.github.droidworksstudio.launcher.helper.PreferenceHelper
13
21
import com.github.droidworksstudio.launcher.listener.OnItemClickedListener
14
22
import javax.inject.Inject
23
+ import kotlin.math.min
15
24
16
25
class HomeViewHolder @Inject constructor(
17
26
private val binding : ItemHomeBinding ,
@@ -22,46 +31,60 @@ class HomeViewHolder @Inject constructor(
22
31
@SuppressLint(" ClickableViewAccessibility" )
23
32
fun bind (appInfo : AppInfo ) {
24
33
binding.apply {
25
- // Get the current LayoutParams of appHomeName
26
- val layoutParams = appHomeName.layoutParams as LinearLayoutCompat .LayoutParams
27
-
28
- // Set the margins
29
- layoutParams.topMargin = preferenceHelper.homeAppPadding.toInt()
30
- layoutParams.bottomMargin = preferenceHelper.homeAppPadding.toInt()
31
-
32
- appHomeName.layoutParams = layoutParams
34
+ // Update appHomeName properties
33
35
appHomeName.text = appInfo.appName
34
36
appHomeName.setTextColor(preferenceHelper.appColor)
35
37
appHomeName.textSize = preferenceHelper.appTextSize
36
38
appHomeName.gravity = preferenceHelper.homeAppAlignment
37
- Log .d(" Tag" , " Home Adapter Color: ${preferenceHelper.appColor} " )
38
39
39
40
if (preferenceHelper.showAppIcon) {
40
41
val pm: PackageManager = binding.root.context.packageManager
41
-
42
42
val appIcon = pm.getApplicationIcon(appInfo.packageName)
43
- when (preferenceHelper.homeAppAlignment) {
44
- Gravity .START -> {
45
- appHomeLeftIcon.setImageDrawable(appIcon)
46
- appHomeLeftIcon.layoutParams.width =
47
- preferenceHelper.appTextSize.toInt() * 3
48
- appHomeLeftIcon.layoutParams.height =
49
- preferenceHelper.appTextSize.toInt() * 3
50
- appHomeLeftIcon.visibility = View .VISIBLE
51
- }
52
43
53
- Gravity .END -> {
54
- appHomeRightIcon.setImageDrawable(appIcon)
55
- appHomeRightIcon.layoutParams.width =
56
- preferenceHelper.appTextSize.toInt() * 3
57
- appHomeRightIcon.layoutParams.height =
58
- preferenceHelper.appTextSize.toInt() * 3
59
- appHomeRightIcon.visibility = View .VISIBLE
44
+ if (preferenceHelper.showAppIconAsDots) {
45
+ val appNewIcon: Drawable = ContextCompat .getDrawable(itemView.context, R .drawable.app_dot_icon)!!
46
+
47
+ val bitmap = drawableToBitmap(appIcon)
48
+ val dominantColor = getDominantColor(bitmap)
49
+ val recoloredDrawable = recolorDrawable(appNewIcon, dominantColor)
50
+
51
+ val appIconSize = (preferenceHelper.appTextSize * 1.1f ).toInt()
52
+ appHomeDotsIcon.setImageDrawable(recoloredDrawable)
53
+ appHomeDotsIcon.layoutParams.width = appIconSize
54
+ appHomeDotsIcon.layoutParams.height = appIconSize
55
+ appHomeDotsIcon.visibility = View .VISIBLE
56
+ } else {
57
+ val appIconSize = (preferenceHelper.appTextSize * 2f ).toInt()
58
+ when (preferenceHelper.homeAppAlignment) {
59
+ Gravity .START -> {
60
+ appHomeLeftIcon.setImageDrawable(appIcon)
61
+ appHomeLeftIcon.layoutParams.width = appIconSize
62
+ appHomeLeftIcon.layoutParams.height = appIconSize
63
+ appHomeLeftIcon.visibility = View .VISIBLE
64
+ }
65
+
66
+ Gravity .END -> {
67
+ appHomeRightIcon.setImageDrawable(appIcon)
68
+ appHomeRightIcon.layoutParams.width = appIconSize
69
+ appHomeRightIcon.layoutParams.height = appIconSize
70
+ appHomeRightIcon.visibility = View .VISIBLE
71
+ }
72
+
73
+ else -> {
74
+ appHomeLeftIcon.visibility = View .GONE
75
+ appHomeRightIcon.visibility = View .GONE
76
+ }
60
77
}
61
78
}
79
+ } else {
80
+ // Hide icons if app icon is not shown
81
+ appHomeLeftIcon.visibility = View .GONE
82
+ appHomeRightIcon.visibility = View .GONE
83
+ appHomeDotsIcon.visibility = View .GONE
62
84
}
63
85
}
64
86
87
+
65
88
itemView.setOnClickListener {
66
89
onAppClickedListener.onAppClicked(appInfo)
67
90
}
@@ -71,4 +94,77 @@ class HomeViewHolder @Inject constructor(
71
94
true
72
95
}
73
96
}
97
+
98
+ private fun drawableToBitmap (drawable : Drawable ): Bitmap {
99
+ if (drawable is BitmapDrawable ) {
100
+ return drawable.bitmap
101
+ }
102
+
103
+ val width = drawable.intrinsicWidth.coerceAtLeast(1 )
104
+ val height = drawable.intrinsicHeight.coerceAtLeast(1 )
105
+
106
+ val bitmap = Bitmap .createBitmap(width, height, Bitmap .Config .ARGB_8888 )
107
+ val canvas = Canvas (bitmap)
108
+ drawable.setBounds(0 , 0 , canvas.width, canvas.height)
109
+ drawable.draw(canvas)
110
+
111
+ return bitmap
112
+ }
113
+
114
+ private fun getDominantColor (bitmap : Bitmap ): Int {
115
+ // Scale the bitmap to a manageable size
116
+ val scaledBitmap = Bitmap .createScaledBitmap(
117
+ bitmap,
118
+ min(bitmap.width / 4 , 1280 ),
119
+ min(bitmap.height / 4 , 1280 ),
120
+ true
121
+ )
122
+
123
+ // Generate a palette from the scaled bitmap
124
+ val palette = Palette .from(scaledBitmap)
125
+ .maximumColorCount(128 )
126
+ .generate()
127
+
128
+ // Extract the colors from the palette
129
+ val colors = palette.swatches.map { it.rgb }
130
+
131
+ // Combine the colors into a single color
132
+ return increaseColorVibrancy(combineColors(colors))
133
+ }
134
+
135
+ private fun combineColors (colors : List <Int >): Int {
136
+ if (colors.isEmpty()) return Color .DKGRAY
137
+
138
+ var red = 0
139
+ var green = 0
140
+ var blue = 0
141
+
142
+ // Calculate the average color values
143
+ for (color in colors) {
144
+ red + = Color .red(color)
145
+ green + = Color .green(color)
146
+ blue + = Color .blue(color)
147
+ }
148
+
149
+ val count = colors.size
150
+ return Color .rgb(red / count, green / count, blue / count)
151
+ }
152
+
153
+ private fun increaseColorVibrancy (color : Int ): Int {
154
+ // Convert RGB to HSL
155
+ val hsl = FloatArray (3 )
156
+ ColorUtils .colorToHSL(color, hsl)
157
+
158
+ // Increase the saturation
159
+ hsl[1 ] = (hsl[1 ] * 15f ).coerceIn(0f , 1f )
160
+
161
+ // Convert HSL back to RGB
162
+ return ColorUtils .HSLToColor (hsl)
163
+ }
164
+
165
+ private fun recolorDrawable (drawable : Drawable , color : Int ): Drawable {
166
+ val wrappedDrawable = DrawableCompat .wrap(drawable)
167
+ DrawableCompat .setTint(wrappedDrawable, color)
168
+ return wrappedDrawable
169
+ }
74
170
}
0 commit comments