Adjust the layout carefully, so that remote grid views perfectly overlap the bitmap generated from the binding view, whether left-aligned, right-aligned or centered, and regardless of the size of the widget, text, margins or spacing. Display the clock in the correct text size.
98 lines
3.7 KiB
Kotlin
98 lines
3.7 KiB
Kotlin
package com.tommasoberlose.anotherwidget.helpers
|
|
|
|
import android.appwidget.AppWidgetManager
|
|
import android.content.Context
|
|
import android.content.res.Configuration.ORIENTATION_PORTRAIT
|
|
import android.graphics.Typeface
|
|
import android.os.Handler
|
|
import android.os.HandlerThread
|
|
import android.os.Looper
|
|
import android.util.Log
|
|
import androidx.core.provider.FontRequest
|
|
import androidx.core.provider.FontsContractCompat
|
|
import com.google.firebase.crashlytics.FirebaseCrashlytics
|
|
import com.tommasoberlose.anotherwidget.R
|
|
import com.tommasoberlose.anotherwidget.db.EventRepository
|
|
import com.tommasoberlose.anotherwidget.global.Preferences
|
|
import com.tommasoberlose.anotherwidget.ui.widgets.MainWidget
|
|
import com.tommasoberlose.anotherwidget.utils.toPixel
|
|
import kotlin.math.min
|
|
|
|
object WidgetHelper {
|
|
class WidgetSizeProvider(
|
|
private val context: Context,
|
|
private val appWidgetManager: AppWidgetManager
|
|
) {
|
|
|
|
fun getWidgetsSize(widgetId: Int): Pair<Int, Int> {
|
|
val portrait = context.resources.configuration.orientation == ORIENTATION_PORTRAIT
|
|
val width = getWidgetSizeInDp(
|
|
widgetId,
|
|
if (portrait) AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH else AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH
|
|
)
|
|
val height = getWidgetSizeInDp(
|
|
widgetId,
|
|
if (portrait) AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT else AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT
|
|
)
|
|
val widthInPx = context.dip(width)
|
|
val heightInPx = context.dip(height)
|
|
FirebaseCrashlytics.getInstance().setCustomKey("widthInPx", widthInPx)
|
|
FirebaseCrashlytics.getInstance().setCustomKey("heightInPx", heightInPx)
|
|
return widthInPx to heightInPx
|
|
}
|
|
|
|
private fun getWidgetWidth(widgetId: Int): Int = getWidgetSizeInDp(widgetId, AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH)
|
|
|
|
private fun getWidgetHeight(widgetId: Int): Int = getWidgetSizeInDp(widgetId, AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT)
|
|
|
|
private fun getWidgetSizeInDp(widgetId: Int, key: String): Int =
|
|
appWidgetManager.getAppWidgetOptions(widgetId).getInt(key, 0)
|
|
|
|
private fun Context.dip(value: Int): Int = (value * resources.displayMetrics.density).toInt()
|
|
|
|
}
|
|
|
|
fun Pair<Int, Int>.reduceDimensionWithMaxWidth(width: Int): Pair<Int, Int> {
|
|
return if (first < width) {
|
|
this
|
|
} else {
|
|
val factor = width / first
|
|
width to second * factor
|
|
}
|
|
}
|
|
|
|
fun runWithCustomTypeface(context: Context, function: (typeface: Typeface?) -> Unit) {
|
|
if (Preferences.customFontFile != "") {
|
|
val request = FontRequest(
|
|
"com.google.android.gms.fonts",
|
|
"com.google.android.gms",
|
|
Preferences.customFontFile,
|
|
R.array.com_google_android_gms_fonts_certs
|
|
)
|
|
|
|
val handlerThread = HandlerThread("generateView")
|
|
val callback = object : FontsContractCompat.FontRequestCallback() {
|
|
override fun onTypefaceRetrieved(typeface: Typeface) {
|
|
handlerThread.quit()
|
|
function.invoke(typeface)
|
|
}
|
|
|
|
override fun onTypefaceRequestFailed(reason: Int) {
|
|
handlerThread.quit()
|
|
function.invoke(null)
|
|
}
|
|
}
|
|
|
|
handlerThread.start()
|
|
//if (Looper.myLooper() == null) {
|
|
// Looper.prepare()
|
|
//}
|
|
|
|
Handler(handlerThread.looper).run {
|
|
FontsContractCompat.requestFont(context, request, callback, this)
|
|
}
|
|
} else {
|
|
function.invoke(null)
|
|
}
|
|
}
|
|
} |