diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt index 12753b35..bd42914f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/luckynumberwidget/LuckyNumberWidgetProvider.kt @@ -1,21 +1,14 @@ package io.github.wulkanowy.ui.modules.luckynumberwidget -import android.annotation.TargetApi import android.app.PendingIntent import android.app.PendingIntent.FLAG_UPDATE_CURRENT import android.appwidget.AppWidgetManager -import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_DELETED -import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_OPTIONS_CHANGED -import android.appwidget.AppWidgetManager.ACTION_APPWIDGET_UPDATE -import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_ID -import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_IDS -import android.appwidget.AppWidgetManager.EXTRA_APPWIDGET_OPTIONS import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT -import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH -import android.content.BroadcastReceiver +import android.appwidget.AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH +import android.appwidget.AppWidgetProvider import android.content.Context import android.content.Intent -import android.os.Build +import android.os.Bundle import android.view.View.GONE import android.view.View.VISIBLE import android.widget.RemoteViews @@ -34,7 +27,7 @@ import io.reactivex.Maybe import timber.log.Timber import javax.inject.Inject -class LuckyNumberWidgetProvider : BroadcastReceiver() { +class LuckyNumberWidgetProvider : AppWidgetProvider() { @Inject lateinit var studentRepository: StudentRepository @@ -59,20 +52,20 @@ class LuckyNumberWidgetProvider : BroadcastReceiver() { fun getStudentWidgetKey(appWidgetId: Int) = "lucky_number_widget_student_$appWidgetId" fun getThemeWidgetKey(appWidgetId: Int) = "lucky_number_widget_theme_$appWidgetId" + + fun getHeightWidgetKey(appWidgetId: Int) = "lucky_number_widget_height_$appWidgetId" + + fun getWidthWidgetKey(appWidgetId: Int) = "lucky_number_widget_width_$appWidgetId" } - @TargetApi(Build.VERSION_CODES.JELLY_BEAN) override fun onReceive(context: Context, intent: Intent) { AndroidInjection.inject(this, context) - when (intent.action) { - ACTION_APPWIDGET_UPDATE -> onUpdate(context, intent) - ACTION_APPWIDGET_DELETED -> onDelete(intent) - ACTION_APPWIDGET_OPTIONS_CHANGED -> onOptionsChange(context, intent) - } + super.onReceive(context, intent) } - private fun onUpdate(context: Context, intent: Intent) { - intent.getIntArrayExtra(EXTRA_APPWIDGET_IDS)?.forEach { appWidgetId -> + override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray?) { + super.onUpdate(context, appWidgetManager, appWidgetIds) + appWidgetIds?.forEach { appWidgetId -> val savedTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0) val layoutId = if (savedTheme == 0L) R.layout.widget_luckynumber else R.layout.widget_luckynumber_dark @@ -85,14 +78,64 @@ class LuckyNumberWidgetProvider : BroadcastReceiver() { setOnClickPendingIntent(R.id.luckyNumberWidgetContainer, appIntent) } - setStyles(remoteView, intent) + setStyles(remoteView, appWidgetId) appWidgetManager.updateAppWidget(appWidgetId, remoteView) } } - private fun onDelete(intent: Intent) { - val appWidgetId = intent.getIntExtra(EXTRA_APPWIDGET_ID, 0) - if (appWidgetId != 0) sharedPref.delete(getStudentWidgetKey(appWidgetId)) + override fun onDeleted(context: Context?, appWidgetIds: IntArray?) { + super.onDeleted(context, appWidgetIds) + appWidgetIds?.forEach { appWidgetId -> + if (appWidgetId != 0) sharedPref.delete(getStudentWidgetKey(appWidgetId)) + } + } + + override fun onAppWidgetOptionsChanged(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int, newOptions: Bundle?) { + super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions) + + val savedTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0) + val layoutId = if (savedTheme == 0L) R.layout.widget_luckynumber else R.layout.widget_luckynumber_dark + + val remoteView = RemoteViews(context.packageName, layoutId) + + setStyles(remoteView, appWidgetId, newOptions) + appWidgetManager.updateAppWidget(appWidgetId, remoteView) + } + + private fun setStyles(views: RemoteViews, appWidgetId: Int, options: Bundle? = null) { + val width = options?.getInt(OPTION_APPWIDGET_MIN_WIDTH) ?: sharedPref.getLong(getWidthWidgetKey(appWidgetId), 74).toInt() + val height = options?.getInt(OPTION_APPWIDGET_MAX_HEIGHT) ?: sharedPref.getLong(getHeightWidgetKey(appWidgetId), 74).toInt() + + sharedPref.putLong(getWidthWidgetKey(appWidgetId), width.toLong()) + sharedPref.putLong(getHeightWidgetKey(appWidgetId), height.toLong()) + + val rows = getCellsForSize(height) + val cols = getCellsForSize(width) + + Timber.d("New lucky number widget measurement: %dx%d", width, height) + Timber.d("Widget size: $cols x $rows") + + when { + 1 == cols && 1 == rows -> views.setVisibility(imageTop = false, imageLeft = false) + 1 == cols && 1 < rows -> views.setVisibility(imageTop = true, imageLeft = false) + 1 < cols && 1 == rows -> views.setVisibility(imageTop = false, imageLeft = true) + 1 == cols && 1 == rows -> views.setVisibility(imageTop = true, imageLeft = false) + 2 == cols && 1 == rows -> views.setVisibility(imageTop = false, imageLeft = true) + else -> views.setVisibility(imageTop = false, imageLeft = false, title = true) + } + } + + private fun RemoteViews.setVisibility(imageTop: Boolean, imageLeft: Boolean, title: Boolean = false) { + setViewVisibility(R.id.luckyNumberWidgetImageTop, if (imageTop) VISIBLE else GONE) + setViewVisibility(R.id.luckyNumberWidgetImageLeft, if (imageLeft) VISIBLE else GONE) + setViewVisibility(R.id.luckyNumberWidgetTitle, if (title) VISIBLE else GONE) + setViewVisibility(R.id.luckyNumberWidgetNumber, VISIBLE) + } + + private fun getCellsForSize(size: Int): Int { + var n = 2 + while (74 * n - 30 < size) ++n + return n - 1 } private fun getLuckyNumber(studentId: Long, appWidgetId: Int): LuckyNumber? { @@ -124,69 +167,4 @@ class LuckyNumberWidgetProvider : BroadcastReceiver() { null } } - - private fun onOptionsChange(context: Context, intent: Intent) { - intent.extras?.getInt(EXTRA_APPWIDGET_ID)?.let { appWidgetId -> - val savedTheme = sharedPref.getLong(getThemeWidgetKey(appWidgetId), 0) - val layoutId = if (savedTheme == 0L) R.layout.widget_luckynumber else R.layout.widget_luckynumber_dark - - val remoteView = RemoteViews(context.packageName, layoutId) - - setStyles(remoteView, intent) - appWidgetManager.updateAppWidget(appWidgetId, remoteView) - } - } - - @TargetApi(Build.VERSION_CODES.JELLY_BEAN) - private fun setStyles(views: RemoteViews, intent: Intent) { - val options = intent.extras?.getBundle(EXTRA_APPWIDGET_OPTIONS) - - val maxWidth = options?.getInt(OPTION_APPWIDGET_MAX_WIDTH) ?: 150 - val maxHeight = options?.getInt(OPTION_APPWIDGET_MAX_HEIGHT) ?: 40 - - Timber.d("New lucky number widget measurement: %dx%d", maxWidth, maxHeight) - - when { - // 1x1 - maxWidth < 150 && maxHeight < 110 -> { - Timber.d("Lucky number widget size: 1x1") - with(views) { - setViewVisibility(R.id.luckyNumberWidgetImageTop, GONE) - setViewVisibility(R.id.luckyNumberWidgetImageLeft, GONE) - setViewVisibility(R.id.luckyNumberWidgetTitle, GONE) - setViewVisibility(R.id.luckyNumberWidgetNumber, VISIBLE) - } - } - // 1x2 - maxWidth < 150 && maxHeight > 110 -> { - Timber.d("Lucky number widget size: 1x2") - with(views) { - setViewVisibility(R.id.luckyNumberWidgetImageTop, VISIBLE) - setViewVisibility(R.id.luckyNumberWidgetImageLeft, GONE) - setViewVisibility(R.id.luckyNumberWidgetTitle, GONE) - setViewVisibility(R.id.luckyNumberWidgetNumber, VISIBLE) - } - } - // 2x1 - maxWidth >= 150 && maxHeight <= 110 -> { - Timber.d("Lucky number widget size: 2x1") - with(views) { - setViewVisibility(R.id.luckyNumberWidgetImageTop, GONE) - setViewVisibility(R.id.luckyNumberWidgetImageLeft, VISIBLE) - setViewVisibility(R.id.luckyNumberWidgetTitle, GONE) - setViewVisibility(R.id.luckyNumberWidgetNumber, VISIBLE) - } - } - // 2x2 and bigger - else -> { - Timber.d("Lucky number widget size: 2x2 and bigger") - with(views) { - setViewVisibility(R.id.luckyNumberWidgetImageTop, GONE) - setViewVisibility(R.id.luckyNumberWidgetImageLeft, GONE) - setViewVisibility(R.id.luckyNumberWidgetTitle, VISIBLE) - setViewVisibility(R.id.luckyNumberWidgetNumber, VISIBLE) - } - } - } - } }