mirror of
				https://github.com/SimpleMobileTools/Simple-Launcher.git
				synced 2025-06-05 21:59:15 +02:00 
			
		
		
		
	Generate folder icon from icons inside of it
This commit is contained in:
		| @@ -10,6 +10,7 @@ import android.appwidget.AppWidgetProviderInfo | ||||
| import android.content.Context | ||||
| import android.graphics.* | ||||
| import android.graphics.drawable.BitmapDrawable | ||||
| import android.graphics.drawable.Drawable | ||||
| import android.os.Bundle | ||||
| import android.text.Layout | ||||
| import android.text.StaticLayout | ||||
| @@ -27,8 +28,7 @@ import androidx.core.view.accessibility.AccessibilityNodeInfoCompat | ||||
| import androidx.customview.widget.ExploreByTouchHelper | ||||
| import com.google.android.material.math.MathUtils | ||||
| import com.simplemobiletools.commons.extensions.* | ||||
| import com.simplemobiletools.commons.helpers.ensureBackgroundThread | ||||
| import com.simplemobiletools.commons.helpers.isSPlus | ||||
| import com.simplemobiletools.commons.helpers.* | ||||
| import com.simplemobiletools.launcher.R | ||||
| import com.simplemobiletools.launcher.activities.MainActivity | ||||
| import com.simplemobiletools.launcher.databinding.HomeScreenGridBinding | ||||
| @@ -65,6 +65,8 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|     private var emptyPageIndicatorPaint: Paint | ||||
|     private var currentPageIndicatorPaint: Paint | ||||
|     private var folderBackgroundPaint: Paint | ||||
|     private var folderIconBackgroundPaint: Paint | ||||
|     private var folderIconBorderPaint: Paint | ||||
|     private var draggedItem: HomeScreenGridItem? = null | ||||
|     private var resizedWidget: HomeScreenGridItem? = null | ||||
|     private var isFirstDraw = true | ||||
| @@ -157,6 +159,17 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|             style = Paint.Style.FILL | ||||
|         } | ||||
|  | ||||
|         folderIconBackgroundPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { | ||||
|             color = context.getProperBackgroundColor().adjustAlpha(MEDIUM_ALPHA) | ||||
|             style = Paint.Style.FILL | ||||
|         } | ||||
|  | ||||
|         folderIconBorderPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { | ||||
|             color = context.getProperBackgroundColor().adjustAlpha(HIGHER_ALPHA) | ||||
|             strokeWidth = context.resources.getDimension(R.dimen.page_indicator_stroke_width) * 5 | ||||
|             style = Paint.Style.STROKE | ||||
|         } | ||||
|  | ||||
|         val sideMargin = context.resources.getDimension(com.simplemobiletools.commons.R.dimen.normal_margin).toInt() | ||||
|         sideMargins.apply { | ||||
|             top = context.statusBarHeight | ||||
| @@ -181,8 +194,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|                 if (item.type == ITEM_TYPE_ICON) { | ||||
|                     item.drawable = context.getDrawableForPackageName(item.packageName) | ||||
|                 } else if (item.type == ITEM_TYPE_FOLDER) { | ||||
|                     item.drawable = | ||||
|                         resources.getColoredDrawableWithColor(com.simplemobiletools.commons.R.drawable.ic_folder_vector, context.getProperPrimaryColor()) | ||||
|                     item.drawable = item.generateFolderDrawable() | ||||
|                 } else if (item.type == ITEM_TYPE_SHORTCUT) { | ||||
|                     if (item.icon != null) { | ||||
|                         item.drawable = BitmapDrawable(item.icon) | ||||
| @@ -258,8 +270,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|  | ||||
|         if (draggedItem!!.drawable == null) { | ||||
|             if (draggedItem?.type == ITEM_TYPE_FOLDER) { | ||||
|                 draggedItem!!.drawable = | ||||
|                     resources.getColoredDrawableWithColor(com.simplemobiletools.commons.R.drawable.ic_folder_vector, context.getProperPrimaryColor()) | ||||
|                 draggedItem!!.drawable = draggedGridItem!!.generateFolderDrawable() | ||||
|             } else { | ||||
|                 draggedItem!!.drawable = context.getDrawableForPackageName(draggedGridItem.packageName) | ||||
|             } | ||||
| @@ -972,7 +983,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|                 val drawableX = baseItemX + iconMargin + extraXMargin | ||||
|  | ||||
|                 val drawable = if (item.type == ITEM_TYPE_FOLDER) { | ||||
|                     resources.getColoredDrawableWithColor(com.simplemobiletools.commons.R.drawable.ic_folder_vector, context.getProperPrimaryColor()) | ||||
|                     item.generateFolderDrawable() | ||||
|                 } else { | ||||
|                     item.drawable!! | ||||
|                 } | ||||
| @@ -980,10 +991,10 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|                 if (item.docked) { | ||||
|                     val drawableY = cellYCoords[rowCount - 1] + cellHeight - iconMargin - iconSize + sideMargins.top | ||||
|  | ||||
|                     drawable.setBounds(drawableX, drawableY, drawableX + iconSize, drawableY + iconSize) | ||||
|                     drawable?.setBounds(drawableX, drawableY, drawableX + iconSize, drawableY + iconSize) | ||||
|                 } else { | ||||
|                     val drawableY = baseItemY + iconMargin + extraYMargin | ||||
|                     drawable.setBounds(drawableX, drawableY, drawableX + iconSize, drawableY + iconSize) | ||||
|                     drawable?.setBounds(drawableX, drawableY, drawableX + iconSize, drawableY + iconSize) | ||||
|  | ||||
|                     if (item.id != draggedItem?.id && item.title.isNotEmpty()) { | ||||
|                         val textX = baseItemX.toFloat() + labelSideMargin | ||||
| @@ -1007,7 +1018,7 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|                     } | ||||
|                 } | ||||
|  | ||||
|                 drawable.draw(canvas) | ||||
|                 drawable?.draw(canvas) | ||||
|             } | ||||
|         } | ||||
|  | ||||
| @@ -1494,6 +1505,35 @@ class HomeScreenGrid(context: Context, attrs: AttributeSet, defStyle: Int) : Rel | ||||
|     private fun HomeScreenGridItem.getFolderItems() = | ||||
|         gridItems.filter { (it.drawable != null && it.type == ITEM_TYPE_ICON || it.type == ITEM_TYPE_SHORTCUT) && it.parentId == id } | ||||
|  | ||||
|     private fun HomeScreenGridItem.generateFolderDrawable(): Drawable? { | ||||
|         if (iconSize == 0) { | ||||
|             return null | ||||
|         } | ||||
|  | ||||
|         val bitmap = Bitmap.createBitmap(iconSize, iconSize, Bitmap.Config.ARGB_8888) | ||||
|         val canvas = Canvas(bitmap) | ||||
|         val circlePath = Path().apply { addCircle((iconSize / 2).toFloat(), (iconSize / 2).toFloat(), (iconSize / 2).toFloat(), Path.Direction.CCW) } | ||||
|         canvas.clipPath(circlePath) | ||||
|         canvas.drawPaint(folderIconBackgroundPaint) | ||||
|         val items = getFolderItems() | ||||
|         val itemsCount = getFolderItems().count() | ||||
|         val folderColumnCount = ceil(sqrt(itemsCount.toDouble())).roundToInt() | ||||
|         val folderRowCount = ceil(itemsCount.toFloat() / folderColumnCount).roundToInt() | ||||
|         val scaledCellSize = (iconSize.toFloat() / folderColumnCount) | ||||
|         val scaledGap = scaledCellSize / 5f | ||||
|         val scaledIconSize = (iconSize - (folderColumnCount + 1) * scaledGap) / folderColumnCount | ||||
|         val extraYMargin = if (folderRowCount < folderColumnCount) scaledIconSize / 2 else 0f | ||||
|         items.forEach { | ||||
|             val (row, column) = it.getPositionInFolder(this@generateFolderDrawable) | ||||
|             val drawableX = (scaledGap + column * scaledIconSize + column * scaledGap).toInt() | ||||
|             val drawableY = (extraYMargin + scaledGap + row * scaledIconSize + row * scaledGap).toInt() | ||||
|             it.drawable?.setBounds(drawableX, drawableY, drawableX + scaledIconSize.toInt(), drawableY + scaledIconSize.toInt()) | ||||
|             it.drawable?.draw(canvas) | ||||
|         } | ||||
|         canvas.drawPath(circlePath, folderIconBorderPaint) | ||||
|         return BitmapDrawable(resources, bitmap) | ||||
|     } | ||||
|  | ||||
|     private fun HomeScreenGridItem.getFolderRect(): RectF { | ||||
|         val count = getFolderItems().count() | ||||
|         val columnsCount = ceil(sqrt(count.toDouble())).roundToInt() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user