From fa22eb4d71c5c44dbad9cf1c84ccd0dc57cb8ace Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sat, 4 Dec 2021 13:51:38 +0100 Subject: [PATCH] Replace TextDrawable with an implementation that supports tint --- app/build.gradle.kts | 1 - .../mm20/launcher2/graphics/TextDrawable.kt | 47 +++++ .../launcher2/licenses/OpenSourceLicenses.kt | 8 - calendar/build.gradle.kts | 1 - .../launcher2/search/data/CalendarEvent.kt | 189 ++++++++++-------- contacts/build.gradle.kts | 1 - .../de/mm20/launcher2/search/data/Contact.kt | 112 ++++++----- settings.gradle.kts | 4 - ui/build.gradle.kts | 1 - .../ui/legacy/data/InformationText.kt | 7 +- websites/build.gradle.kts | 1 - .../de/mm20/launcher2/search/data/Website.kt | 6 +- 12 files changed, 217 insertions(+), 161 deletions(-) create mode 100644 base/src/main/java/de/mm20/launcher2/graphics/TextDrawable.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b7c623cb..081c093a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -107,7 +107,6 @@ dependencies { implementation(libs.lottie.core) - implementation(libs.textdrawable) implementation(libs.bundles.materialdialogs) diff --git a/base/src/main/java/de/mm20/launcher2/graphics/TextDrawable.kt b/base/src/main/java/de/mm20/launcher2/graphics/TextDrawable.kt new file mode 100644 index 00000000..2df62e99 --- /dev/null +++ b/base/src/main/java/de/mm20/launcher2/graphics/TextDrawable.kt @@ -0,0 +1,47 @@ +package de.mm20.launcher2.graphics + +import android.content.res.ColorStateList +import android.graphics.* +import android.graphics.drawable.Drawable + +class TextDrawable( + val text: String, + val color: Int = Color.WHITE, + fontSize: Float = 13f, + typeface: Typeface = Typeface.DEFAULT +): Drawable() { + + private val paint = Paint() + private val rect = Rect() + + init { + paint.textAlign = Paint.Align.CENTER + paint.textSize = fontSize + paint.color = color + paint.isAntiAlias = true + paint.typeface = typeface + paint.style = Paint.Style.FILL + } + + override fun draw(canvas: Canvas) { + val bounds = bounds + paint.getTextBounds(text, 0, text.length, rect) + canvas.drawText(text, bounds.exactCenterX(), bounds.exactCenterY() + rect.height() / 2f, paint) + } + + override fun setAlpha(alpha: Int) { + paint.alpha = alpha + } + + override fun setColorFilter(colorFilter: ColorFilter?) { + paint.colorFilter = colorFilter + } + + override fun getOpacity(): Int { + return PixelFormat.TRANSLUCENT + } + + override fun setTintList(tint: ColorStateList?) { + paint.color = tint?.defaultColor ?: color + } +} \ No newline at end of file diff --git a/base/src/main/java/de/mm20/launcher2/licenses/OpenSourceLicenses.kt b/base/src/main/java/de/mm20/launcher2/licenses/OpenSourceLicenses.kt index 8c5db535..f0fbbfe6 100644 --- a/base/src/main/java/de/mm20/launcher2/licenses/OpenSourceLicenses.kt +++ b/base/src/main/java/de/mm20/launcher2/licenses/OpenSourceLicenses.kt @@ -77,14 +77,6 @@ val OpenSourceLicenses = arrayOf( copyrightNote = "Copyright (c) 2009-2021 Jonathan Hedley ", url = "https://jsoup.org/" ), - OpenSourceLibrary( - name = "TextDrawable", - description = "A light-weight library providing images with letter/text like the Gmail app", - licenseName = R.string.mit_license_name, - licenseText = R.raw.license_mit, - copyrightNote = "Copyright (c) 2014 Amulya Khare", - url = "https://github.com/amulyakhare/TextDrawable" - ), OpenSourceLibrary( name = "Glide", description = "A fast and efficient open source media management and image loading framework for Android", diff --git a/calendar/build.gradle.kts b/calendar/build.gradle.kts index cb25bf5f..a9fdc83a 100644 --- a/calendar/build.gradle.kts +++ b/calendar/build.gradle.kts @@ -40,7 +40,6 @@ dependencies { implementation(libs.androidx.core) implementation(libs.androidx.appcompat) - implementation(libs.textdrawable) implementation(libs.koin.android) diff --git a/calendar/src/main/java/de/mm20/launcher2/search/data/CalendarEvent.kt b/calendar/src/main/java/de/mm20/launcher2/search/data/CalendarEvent.kt index 464b871c..96c6d47f 100644 --- a/calendar/src/main/java/de/mm20/launcher2/search/data/CalendarEvent.kt +++ b/calendar/src/main/java/de/mm20/launcher2/search/data/CalendarEvent.kt @@ -4,7 +4,6 @@ import android.Manifest import android.content.ContentUris import android.content.Context import android.content.Intent -import android.content.pm.PackageManager import android.graphics.Color import android.graphics.Typeface import android.graphics.drawable.ColorDrawable @@ -16,29 +15,27 @@ import androidx.core.graphics.ColorUtils import androidx.core.graphics.blue import androidx.core.graphics.green import androidx.core.graphics.red -import com.amulyakhare.textdrawable.TextDrawable import de.mm20.launcher2.calendar.R -import de.mm20.launcher2.permissions.PermissionsManager +import de.mm20.launcher2.graphics.TextDrawable import de.mm20.launcher2.icons.LauncherIcon import de.mm20.launcher2.ktx.checkPermission import de.mm20.launcher2.ktx.dp +import de.mm20.launcher2.permissions.PermissionsManager import de.mm20.launcher2.preferences.LauncherPreferences -import org.json.JSONObject -import java.lang.NullPointerException import java.text.SimpleDateFormat import java.util.* class CalendarEvent( - override val label: String, - val id: Long, - val color: Int, - val startTime: Long, - val endTime: Long, - val allDay: Boolean, - val location: String, - val attendees: List, - val description: String, - val calendar: Long + override val label: String, + val id: Long, + val color: Int, + val startTime: Long, + val endTime: Long, + val allDay: Boolean, + val location: String, + val attendees: List, + val description: String, + val calendar: Long ) : Searchable() { override val key: String @@ -51,31 +48,27 @@ class CalendarEvent( df.applyPattern("MMM") val month = df.format(startTime) val fgLayers = arrayOf( - TextDrawable - .builder() - .beginConfig() - .textColor(Color.WHITE) - .useFont(Typeface.DEFAULT_BOLD) - .fontSize((36 * context.dp).toInt()) - .endConfig() - .buildRect(day, 0), - TextDrawable - .builder() - .beginConfig() - .textColor(Color.WHITE) - .bold() - .fontSize((26 * context.dp).toInt()) - .endConfig() - .buildRect(month, 0) + TextDrawable( + day, + color = Color.WHITE, + fontSize = 40 * context.dp, + typeface = Typeface.DEFAULT_BOLD + ), + TextDrawable( + month, + color = Color.WHITE, + fontSize = 26 * context.dp, + typeface = Typeface.DEFAULT_BOLD + ) ) val foreground = LayerDrawable(fgLayers) foreground.setLayerInset(0, 0, 0, 0, (26 * context.dp).toInt()) - foreground.setLayerInset(1, 0, (36 * context.dp).toInt(), 0, 0) + foreground.setLayerInset(1, 0, (40 * context.dp).toInt(), 0, 0) val background = ColorDrawable(getDisplayColor(context, color)) return LauncherIcon( - foreground = foreground, - background = background, - foregroundScale = 0.74f + foreground = foreground, + background = background, + foregroundScale = 0.74f ) } @@ -84,14 +77,15 @@ class CalendarEvent( } companion object { - fun search(context: Context, - query: String, - intervalStart: Long, - intervalEnd: Long, - limit: Int = 10, - hideAllDayEvents: Boolean = false, - unselectedCalendars: List = emptyList(), - hiddenEvents: List = emptyList() + fun search( + context: Context, + query: String, + intervalStart: Long, + intervalEnd: Long, + limit: Int = 10, + hideAllDayEvents: Boolean = false, + unselectedCalendars: List = emptyList(), + hiddenEvents: List = emptyList() ): List { val results = mutableListOf() if (!query.isEmpty() && query.length < 3) return results @@ -104,15 +98,15 @@ class CalendarEvent( ContentUris.appendId(builder, intervalEnd) val uri = builder.build() val projection = arrayOf( - CalendarContract.Instances.EVENT_ID, - CalendarContract.Instances.TITLE, - CalendarContract.Instances.BEGIN, - CalendarContract.Instances.END, - CalendarContract.Instances.ALL_DAY, - CalendarContract.Instances.DISPLAY_COLOR, - CalendarContract.Instances.EVENT_LOCATION, - CalendarContract.Instances.CALENDAR_ID, - CalendarContract.Instances.DESCRIPTION + CalendarContract.Instances.EVENT_ID, + CalendarContract.Instances.TITLE, + CalendarContract.Instances.BEGIN, + CalendarContract.Instances.END, + CalendarContract.Instances.ALL_DAY, + CalendarContract.Instances.DISPLAY_COLOR, + CalendarContract.Instances.EVENT_LOCATION, + CalendarContract.Instances.CALENDAR_ID, + CalendarContract.Instances.DESCRIPTION ) val selection = mutableListOf() if (query.isNotEmpty()) selection.add("${CalendarContract.Instances.TITLE} LIKE ?") @@ -120,25 +114,32 @@ class CalendarEvent( if (unselectedCalendars.isNotEmpty()) selection.add("${CalendarContract.Instances.CALENDAR_ID} NOT IN (${unselectedCalendars.joinToString()})") if (hideAllDayEvents) selection.add("${CalendarContract.Instances.ALL_DAY} = 0") val selArgs = if (query.isBlank()) null else arrayOf("%$query%") - val sort = "${CalendarContract.Instances.BEGIN} ASC" + if (limit > -1) " LIMIT $limit" else "" - val cursor = context.contentResolver.query(uri, projection, selection.joinToString(separator = " AND "), selArgs, sort) - ?: return mutableListOf() + val sort = + "${CalendarContract.Instances.BEGIN} ASC" + if (limit > -1) " LIMIT $limit" else "" + val cursor = context.contentResolver.query( + uri, + projection, + selection.joinToString(separator = " AND "), + selArgs, + sort + ) + ?: return mutableListOf() val proj = arrayOf( - CalendarContract.Attendees.EVENT_ID, - CalendarContract.Attendees.ATTENDEE_NAME, - CalendarContract.Attendees.ATTENDEE_EMAIL + CalendarContract.Attendees.EVENT_ID, + CalendarContract.Attendees.ATTENDEE_NAME, + CalendarContract.Attendees.ATTENDEE_EMAIL ) val s = "${CalendarContract.Attendees.ATTENDEE_NAME} COLLATE NOCASE ASC" while (cursor.moveToNext()) { val sel = "${CalendarContract.Attendees.EVENT_ID} = ${cursor.getLong(0)}" val cur = context.contentResolver.query( - CalendarContract.Attendees.CONTENT_URI, - proj, sel, null, s + CalendarContract.Attendees.CONTENT_URI, + proj, sel, null, s ) ?: return mutableListOf() val attendees = mutableListOf() while (cur.moveToNext()) { attendees.add(cur.getString(1).takeUnless { it.isNullOrBlank() } - ?: cur.getString(2)) + ?: cur.getString(2)) } cur.close() val allday = cursor.getInt(4) > 0 @@ -150,17 +151,17 @@ class CalendarEvent( 0 } val event = CalendarEvent( - label = cursor.getString(1) ?: "", - id = cursor.getLong(0), - color = cursor.getInt(5), - startTime = begin - tzOffset, - endTime = cursor.getLong(3) - tzOffset - if (allday) 1 else 0, - allDay = allday, - location = cursor.getString(6) ?: "", - attendees = attendees, - description = cursor.getStringOrNull(8) - ?: "", - calendar = cursor.getLong(7) + label = cursor.getString(1) ?: "", + id = cursor.getLong(0), + color = cursor.getInt(5), + startTime = begin - tzOffset, + endTime = cursor.getLong(3) - tzOffset - if (allday) 1 else 0, + allDay = allday, + location = cursor.getString(6) ?: "", + attendees = attendees, + description = cursor.getStringOrNull(8) + ?: "", + calendar = cursor.getLong(7) ) results.add(event) } @@ -173,24 +174,26 @@ class CalendarEvent( val calendars = mutableListOf() val uri = CalendarContract.Calendars.CONTENT_URI val proj = arrayOf( - CalendarContract.Calendars._ID, - CalendarContract.Calendars.NAME, - CalendarContract.Calendars.ACCOUNT_NAME, - CalendarContract.Calendars.CALENDAR_COLOR, - CalendarContract.Calendars.VISIBLE, - CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, + CalendarContract.Calendars._ID, + CalendarContract.Calendars.NAME, + CalendarContract.Calendars.ACCOUNT_NAME, + CalendarContract.Calendars.CALENDAR_COLOR, + CalendarContract.Calendars.VISIBLE, + CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, ) if (!context.checkPermission(Manifest.permission.READ_CALENDAR)) return calendars val cursor = context.contentResolver.query(uri, proj, null, null, null) - ?: return emptyList() + ?: return emptyList() while (cursor.moveToNext()) { try { - calendars.add(UserCalendar( + calendars.add( + UserCalendar( id = cursor.getLong(0), name = cursor.getString(5) ?: cursor.getString(1) ?: "", owner = cursor.getString(2), color = cursor.getInt(3) - )) + ) + ) } catch (e: NullPointerException) { continue } @@ -206,7 +209,13 @@ class CalendarEvent( it } return if (context.resources.getBoolean(R.bool.is_dark_theme)) { - if (ColorUtils.calculateContrast(ContextCompat.getColor(context, R.color.calendar_foreground_color), color) < 2.5 || true) { + if (ColorUtils.calculateContrast( + ContextCompat.getColor( + context, + R.color.calendar_foreground_color + ), color + ) < 2.5 || true + ) { if (color.red == color.green && color.red == color.blue) { val level = 0xFF - ((0xFF - color.red) * 0.7f).toInt() Color.rgb(level, level, level) @@ -217,7 +226,13 @@ class CalendarEvent( } } else return color } else { - if (ColorUtils.calculateContrast(ContextCompat.getColor(context, R.color.calendar_foreground_color), color) < 1.8) { + if (ColorUtils.calculateContrast( + ContextCompat.getColor( + context, + R.color.calendar_foreground_color + ), color + ) < 1.8 + ) { if (color.red == color.green && color.red == color.blue) { val level = (color.red * 0.7f).toInt() Color.rgb(level, level, level) @@ -235,8 +250,8 @@ class CalendarEvent( } data class UserCalendar( - val id: Long, - val name: String, - val owner: String, - val color: Int + val id: Long, + val name: String, + val owner: String, + val color: Int ) \ No newline at end of file diff --git a/contacts/build.gradle.kts b/contacts/build.gradle.kts index b39689bd..2c791cbc 100644 --- a/contacts/build.gradle.kts +++ b/contacts/build.gradle.kts @@ -40,7 +40,6 @@ dependencies { implementation(libs.androidx.core) implementation(libs.androidx.appcompat) - implementation(libs.textdrawable) implementation(libs.koin.android) diff --git a/contacts/src/main/java/de/mm20/launcher2/search/data/Contact.kt b/contacts/src/main/java/de/mm20/launcher2/search/data/Contact.kt index dad9e930..54fc8ed1 100644 --- a/contacts/src/main/java/de/mm20/launcher2/search/data/Contact.kt +++ b/contacts/src/main/java/de/mm20/launcher2/search/data/Contact.kt @@ -1,33 +1,33 @@ package de.mm20.launcher2.search.data -import android.Manifest import android.content.Context import android.content.Intent -import android.content.pm.PackageManager +import android.graphics.Color +import android.graphics.Typeface +import android.graphics.drawable.ColorDrawable import android.provider.ContactsContract import androidx.core.content.ContextCompat import androidx.core.database.getStringOrNull import androidx.core.graphics.drawable.toDrawable -import com.amulyakhare.textdrawable.TextDrawable import de.mm20.launcher2.contacts.R -import de.mm20.launcher2.ktx.asBitmap -import de.mm20.launcher2.ktx.jsonObjectOf +import de.mm20.launcher2.graphics.TextDrawable import de.mm20.launcher2.icons.LauncherIcon +import de.mm20.launcher2.ktx.asBitmap +import de.mm20.launcher2.ktx.sp import de.mm20.launcher2.permissions.PermissionsManager import de.mm20.launcher2.preferences.LauncherPreferences -import org.json.JSONObject class Contact( - val id: Long, - val firstName: String, - val lastName: String, - val displayName: String, - val lookupKey: String, - val phones: Set, - val emails: Set, - val telegram: Set, - val whatsapp: Set, - val postals: Set + val id: Long, + val firstName: String, + val lastName: String, + val displayName: String, + val lookupKey: String, + val phones: Set, + val emails: Set, + val telegram: Set, + val whatsapp: Set, + val postals: Set ) : Searchable() { override val key: String get() = "contact://$id" @@ -40,19 +40,22 @@ class Contact( } override fun getPlaceholderIcon(context: Context): LauncherIcon { - val iconText = if (firstName.isNotEmpty()) firstName[0].toString() else "" + if (lastName.isNotEmpty()) lastName[0].toString() else "" + val iconText = + if (firstName.isNotEmpty()) firstName[0].toString() else "" + if (lastName.isNotEmpty()) lastName[0].toString() else "" return LauncherIcon( - foreground = TextDrawable.builder().buildRect(iconText, ContextCompat.getColor(context, R.color.blue)) + foreground = TextDrawable(iconText, Color.WHITE, fontSize = 40 * context.sp, typeface = Typeface.DEFAULT_BOLD), + background = ColorDrawable(ContextCompat.getColor(context, R.color.blue)) ) } override suspend fun loadIconAsync(context: Context, size: Int): LauncherIcon? { val contentResolver = context.contentResolver val uri = ContactsContract.Contacts.getLookupUri(id, lookupKey) ?: return null - val bmp = ContactsContract.Contacts.openContactPhotoInputStream(contentResolver, uri, false)?.asBitmap() - ?: return null + val bmp = ContactsContract.Contacts.openContactPhotoInputStream(contentResolver, uri, false) + ?.asBitmap() + ?: return null return LauncherIcon( - foreground = bmp.toDrawable(context.resources) + foreground = bmp.toDrawable(context.resources) ) } @@ -70,13 +73,14 @@ class Contact( return mutableListOf() } val proj = arrayOf( - ContactsContract.RawContacts.CONTACT_ID, - ContactsContract.RawContacts._ID + ContactsContract.RawContacts.CONTACT_ID, + ContactsContract.RawContacts._ID ) val sel = "${ContactsContract.RawContacts.DISPLAY_NAME_PRIMARY} LIKE ?" val selArgs = arrayOf("%$query%") val cursor = context.contentResolver.query( - ContactsContract.RawContacts.CONTENT_URI, proj, sel, selArgs, null) ?: return mutableListOf() + ContactsContract.RawContacts.CONTENT_URI, proj, sel, selArgs, null + ) ?: return mutableListOf() //Maps raw contact ids to contact ids val contactMap = mutableMapOf>() while (cursor.moveToNext()) { @@ -92,7 +96,7 @@ class Contact( internal fun contactById(context: Context, id: Long, rawIds: Set): Contact? { val s = "(" + rawIds.joinToString(separator = " OR ", - transform = { "${ContactsContract.Data.RAW_CONTACT_ID} = $it" }) + ")" + + transform = { "${ContactsContract.Data.RAW_CONTACT_ID} = $it" }) + ")" + " AND (${ContactsContract.Data.MIMETYPE} = \"${ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE}\"" + " OR ${ContactsContract.Data.MIMETYPE} = \"${ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE}\"" + " OR ${ContactsContract.Data.MIMETYPE} = \"${ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE}\"" + @@ -101,8 +105,8 @@ class Contact( " OR ${ContactsContract.Data.MIMETYPE} = \"vnd.android.cursor.item/vnd.com.whatsapp.profile\"" + ")" val dataCursor = context.contentResolver.query( - ContactsContract.Data.CONTENT_URI, - null, s, null, null + ContactsContract.Data.CONTENT_URI, + null, s, null, null ) ?: return null val phones = mutableSetOf() val emails = mutableSetOf() @@ -113,12 +117,18 @@ class Contact( var lastName = "" var displayName = "" val mimeTypeColumn = dataCursor.getColumnIndex(ContactsContract.Data.MIMETYPE) - val emailAddressColumn = dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS) - val numberColumn = dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER) - val addressColumn = dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS) - val displayNameColumn = dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME) - val givenNameColumn = dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME) - val familyNameColumn = dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME) + val emailAddressColumn = + dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS) + val numberColumn = + dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER) + val addressColumn = + dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS) + val displayNameColumn = + dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME) + val givenNameColumn = + dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME) + val familyNameColumn = + dataCursor.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME) val data1Column = dataCursor.getColumnIndex(ContactsContract.Data.DATA1) val data3Column = dataCursor.getColumnIndex(ContactsContract.Data.DATA3) val idColumn = dataCursor.getColumnIndex(ContactsContract.Data._ID) @@ -139,14 +149,14 @@ class Contact( } "vnd.android.cursor.item/vnd.org.telegram.messenger.android.profile" -> { val data1 = dataCursor.getStringOrNull(data1Column) - ?: continue@loop + ?: continue@loop val data3 = dataCursor.getStringOrNull(data3Column) - ?: continue@loop + ?: continue@loop telegram.add("$data1$$data3") } "vnd.android.cursor.item/vnd.com.whatsapp.profile" -> { val data1 = dataCursor.getStringOrNull(data1Column) - ?: continue@loop + ?: continue@loop val dataId = dataCursor.getLong(idColumn) whatsapp.add("$dataId$+${data1.substringBefore('@')}") } @@ -155,11 +165,11 @@ class Contact( dataCursor.close() val lookupKeyCursor = context.contentResolver.query( - ContactsContract.Contacts.CONTENT_URI, - arrayOf(ContactsContract.Contacts.LOOKUP_KEY), - "${ContactsContract.Contacts._ID} = ?", - arrayOf(id.toString()), - null + ContactsContract.Contacts.CONTENT_URI, + arrayOf(ContactsContract.Contacts.LOOKUP_KEY), + "${ContactsContract.Contacts._ID} = ?", + arrayOf(id.toString()), + null ) ?: return null var lookUpKey = "" if (lookupKeyCursor.moveToNext()) { @@ -168,16 +178,16 @@ class Contact( lookupKeyCursor.close() return Contact( - id = id, - emails = emails, - phones = phones, - firstName = firstName, - lastName = lastName, - displayName = displayName, - postals = postals, - telegram = telegram, - whatsapp = whatsapp, - lookupKey = lookUpKey + id = id, + emails = emails, + phones = phones, + firstName = firstName, + lastName = lastName, + displayName = displayName, + postals = postals, + telegram = telegram, + whatsapp = whatsapp, + lookupKey = lookUpKey ) } diff --git a/settings.gradle.kts b/settings.gradle.kts index 5290ef83..3afa5f2d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -291,10 +291,6 @@ dependencyResolutionManagement { .to("org.jsoup", "jsoup") .version("1.14.2") - alias("textdrawable") - .to("com.amulyakhare", "com.amulyakhare.textdrawable") - .version("1.0.1") - alias("glide") .to("com.github.bumptech.glide", "glide") .version("4.12.0") diff --git a/ui/build.gradle.kts b/ui/build.gradle.kts index 28109208..cfd15e0e 100644 --- a/ui/build.gradle.kts +++ b/ui/build.gradle.kts @@ -68,7 +68,6 @@ dependencies { implementation(libs.androidx.transition) implementation(libs.materialcomponents) implementation(libs.viewpropertyobjectanimator) - implementation(libs.textdrawable) implementation(libs.glide) implementation(libs.draglinearlayout) implementation(libs.lottie.core) diff --git a/ui/src/main/java/de/mm20/launcher2/ui/legacy/data/InformationText.kt b/ui/src/main/java/de/mm20/launcher2/ui/legacy/data/InformationText.kt index b6be79b1..bea8e211 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/legacy/data/InformationText.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/legacy/data/InformationText.kt @@ -1,12 +1,12 @@ package de.mm20.launcher2.ui.legacy.data import android.content.Context -import android.graphics.Color import android.graphics.drawable.ColorDrawable import androidx.core.content.ContextCompat -import com.amulyakhare.textdrawable.TextDrawable +import de.mm20.launcher2.graphics.TextDrawable import de.mm20.launcher2.ui.R import de.mm20.launcher2.icons.LauncherIcon +import de.mm20.launcher2.ktx.sp import de.mm20.launcher2.search.data.Searchable /** @@ -22,8 +22,7 @@ class InformationText( override fun getPlaceholderIcon(context: Context): LauncherIcon { return LauncherIcon( - foreground = TextDrawable.builder() - .buildRect("i", Color.WHITE), + foreground = TextDrawable("i", fontSize = 40 * context.sp), background = ColorDrawable(ContextCompat.getColor(context, R.color.grey)) ) } diff --git a/websites/build.gradle.kts b/websites/build.gradle.kts index 2252eb2f..687319e1 100644 --- a/websites/build.gradle.kts +++ b/websites/build.gradle.kts @@ -46,7 +46,6 @@ dependencies { implementation(libs.okhttp) implementation(libs.glide) - implementation(libs.textdrawable) implementation(libs.jsoup) implementation(libs.koin.android) diff --git a/websites/src/main/java/de/mm20/launcher2/search/data/Website.kt b/websites/src/main/java/de/mm20/launcher2/search/data/Website.kt index e93cf989..90be25cb 100644 --- a/websites/src/main/java/de/mm20/launcher2/search/data/Website.kt +++ b/websites/src/main/java/de/mm20/launcher2/search/data/Website.kt @@ -3,6 +3,7 @@ package de.mm20.launcher2.search.data import android.content.Context import android.content.Intent import android.graphics.Color +import android.graphics.Typeface import android.graphics.drawable.ColorDrawable import android.net.Uri import android.util.Log @@ -10,11 +11,12 @@ import android.webkit.URLUtil import androidx.core.graphics.drawable.toBitmap import androidx.core.graphics.toColorInt import androidx.palette.graphics.Palette -import com.amulyakhare.textdrawable.TextDrawable import com.bumptech.glide.Glide +import de.mm20.launcher2.graphics.TextDrawable import de.mm20.launcher2.helper.NetworkUtils import de.mm20.launcher2.icons.LauncherIcon import de.mm20.launcher2.ktx.jsonObjectOf +import de.mm20.launcher2.ktx.sp import de.mm20.launcher2.preferences.LauncherPreferences import de.mm20.launcher2.preferences.WebsiteProtocols import de.mm20.launcher2.websites.R @@ -67,7 +69,7 @@ class Website( override fun getPlaceholderIcon(context: Context): LauncherIcon { val drawable = if (label.isNotEmpty()) { - TextDrawable.builder().buildRect(label[0].toString(), 0) + TextDrawable(label[0].toString(), typeface = Typeface.DEFAULT_BOLD, fontSize = 40 * context.sp) } else context.getDrawable(R.drawable.ic_website)!! return LauncherIcon( foreground = drawable,