From e81d4b6d1721d91968a418ca52e2280830b35471 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Fri, 6 Aug 2021 11:45:13 -0600 Subject: [PATCH] widgets: fix responsiveness issues Fix some problems with the Pre-12 widget responsiveness backport, most notably the wrong layout being chosen on more dense launcher grids. Also change the default widget size from 2x2 to 3x2 so that it's more readable. --- .../java/org/oxycblt/auxio/widgets/Forms.kt | 116 ++++++++++++++++ .../oxycblt/auxio/widgets/WidgetProvider.kt | 124 ++++++++++-------- .../auxio/widgets/forms/FullWidgetForm.kt | 98 -------------- .../auxio/widgets/forms/SmallWidgetForm.kt | 64 --------- .../oxycblt/auxio/widgets/forms/WidgetForm.kt | 20 --- .../main/res/drawable/ui_widget_preview.png | Bin 16480 -> 17213 bytes app/src/main/res/layout/widget_full.xml | 2 +- app/src/main/res/layout/widget_small.xml | 2 +- app/src/main/res/values/styles_component.xml | 4 + app/src/main/res/xml-v31/widget_minimal.xml | 2 +- app/src/main/res/xml/widget_minimal.xml | 4 +- 11 files changed, 193 insertions(+), 243 deletions(-) create mode 100644 app/src/main/java/org/oxycblt/auxio/widgets/Forms.kt delete mode 100644 app/src/main/java/org/oxycblt/auxio/widgets/forms/FullWidgetForm.kt delete mode 100644 app/src/main/java/org/oxycblt/auxio/widgets/forms/SmallWidgetForm.kt delete mode 100644 app/src/main/java/org/oxycblt/auxio/widgets/forms/WidgetForm.kt diff --git a/app/src/main/java/org/oxycblt/auxio/widgets/Forms.kt b/app/src/main/java/org/oxycblt/auxio/widgets/Forms.kt new file mode 100644 index 000000000..aa9c43869 --- /dev/null +++ b/app/src/main/java/org/oxycblt/auxio/widgets/Forms.kt @@ -0,0 +1,116 @@ +package org.oxycblt.auxio.widgets + +import android.content.Context +import android.widget.RemoteViews +import androidx.annotation.LayoutRes +import org.oxycblt.auxio.R +import org.oxycblt.auxio.playback.state.LoopMode +import org.oxycblt.auxio.playback.system.PlaybackService +import org.oxycblt.auxio.ui.newBroadcastIntent +import org.oxycblt.auxio.ui.newMainIntent + +private fun createBaseView( + context: Context, + @LayoutRes layout: Int, + state: WidgetState +): RemoteViews { + val views = RemoteViews(context.packageName, layout) + + views.setOnClickPendingIntent( + android.R.id.background, + context.newMainIntent() + ) + + views.setOnClickPendingIntent( + R.id.widget_skip_prev, + context.newBroadcastIntent( + PlaybackService.ACTION_SKIP_PREV + ) + ) + + views.setOnClickPendingIntent( + R.id.widget_play_pause, + context.newBroadcastIntent( + PlaybackService.ACTION_PLAY_PAUSE + ) + ) + + views.setOnClickPendingIntent( + R.id.widget_skip_next, + context.newBroadcastIntent( + PlaybackService.ACTION_SKIP_NEXT + ) + ) + + views.setTextViewText(R.id.widget_song, state.song.name) + views.setTextViewText(R.id.widget_artist, state.song.album.artist.name) + + views.setImageViewResource( + R.id.widget_play_pause, + if (state.isPlaying) { + R.drawable.ic_pause + } else { + R.drawable.ic_play + } + ) + + if (state.albumArt != null) { + views.setImageViewBitmap(R.id.widget_cover, state.albumArt) + views.setCharSequence( + R.id.widget_cover, "setContentDescription", + context.getString(R.string.desc_album_cover, state.song.album.name) + ) + } else { + views.setImageViewResource(R.id.widget_cover, R.drawable.ic_song) + views.setCharSequence( + R.id.widget_cover, + "setContentDescription", + context.getString(R.string.desc_no_cover) + ) + } + + return views +} + +fun createSmallWidget(context: Context, state: WidgetState): RemoteViews { + return createBaseView(context, R.layout.widget_small, state) +} + +fun createFullWidget(context: Context, state: WidgetState): RemoteViews { + val views = createBaseView(context, R.layout.widget_full, state) + + // The main way the large widget differs from the other widgets is the addition of extra + // controls. However, since the context we use to load attributes is from the main process, + // attempting to dynamically color anything will result in an error. More duplicate + // resources it is. This is getting really tiring. + + views.setOnClickPendingIntent( + R.id.widget_loop, + context.newBroadcastIntent( + PlaybackService.ACTION_LOOP + ) + ) + + views.setOnClickPendingIntent( + R.id.widget_shuffle, + context.newBroadcastIntent( + PlaybackService.ACTION_SHUFFLE + ) + ) + + val shuffleRes = if (state.isShuffled) + R.drawable.ic_shuffle_tinted + else + R.drawable.ic_shuffle + + val loopRes = when (state.loopMode) { + LoopMode.NONE -> R.drawable.ic_loop + LoopMode.ALL -> R.drawable.ic_loop_all_tinted + LoopMode.TRACK -> R.drawable.ic_loop_one_tinted + } + + views.setImageViewResource(R.id.widget_shuffle, shuffleRes) + views.setImageViewResource(R.id.widget_loop, loopRes) + + return views +} diff --git a/app/src/main/java/org/oxycblt/auxio/widgets/WidgetProvider.kt b/app/src/main/java/org/oxycblt/auxio/widgets/WidgetProvider.kt index 9d2996b21..de0d7a2d2 100644 --- a/app/src/main/java/org/oxycblt/auxio/widgets/WidgetProvider.kt +++ b/app/src/main/java/org/oxycblt/auxio/widgets/WidgetProvider.kt @@ -17,9 +17,6 @@ import org.oxycblt.auxio.logD import org.oxycblt.auxio.playback.state.PlaybackStateManager import org.oxycblt.auxio.ui.isLandscape import org.oxycblt.auxio.ui.newMainIntent -import org.oxycblt.auxio.widgets.forms.FullWidgetForm -import org.oxycblt.auxio.widgets.forms.SmallWidgetForm -import org.oxycblt.auxio.widgets.forms.WidgetForm /** * Auxio's one and only appwidget. This widget follows a more unorthodox approach, effectively @@ -28,7 +25,7 @@ import org.oxycblt.auxio.widgets.forms.WidgetForm * - For widgets Wx2 or higher, show an expanded view with album art and basic controls * - For widgets 4x2 or higher, show a complete view with all playback controls * - * For more specific details about these sub-widgets, see [WidgetForm]. + * For more specific details about these sub-widgets, see Forms.kt. */ class WidgetProvider : AppWidgetProvider() { override fun onUpdate( @@ -40,6 +37,21 @@ class WidgetProvider : AppWidgetProvider() { requestUpdate(context) } + override fun onAppWidgetOptionsChanged( + context: Context, + appWidgetManager: AppWidgetManager, + appWidgetId: Int, + newOptions: Bundle? + ) { + super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions) + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { + // We can't resize the widget until we can generate the views, so request an update + // from PlaybackService. + requestUpdate(context) + } + } + /* * Update the widget based on the playback state. */ @@ -65,59 +77,14 @@ class WidgetProvider : AppWidgetProvider() { // Map each widget form to the rough dimensions where it would look at least okay. val views = mapOf( - SizeF(110f, 110f) to SmallWidgetForm().createViews(context, state), - SizeF(272f, 110f) to FullWidgetForm().createViews(context, state) + SizeF(110f, 110f) to createSmallWidget(context, state), + SizeF(250f, 110f) to createFullWidget(context, state) ) appWidgetManager.applyViewsCompat(context, views) } } - /* - * Revert this widget to its default view - */ - fun reset(context: Context) { - logD("Resetting widget") - - applyDefaultViews(context, AppWidgetManager.getInstance(context)) - } - - @SuppressLint("RemoteViewLayout") - private fun applyDefaultViews(context: Context, manager: AppWidgetManager) { - val views = RemoteViews(context.packageName, R.layout.widget_default) - - views.setOnClickPendingIntent( - android.R.id.background, - context.newMainIntent() - ) - - manager.updateAppWidget(ComponentName(context, this::class.java), views) - } - - override fun onAppWidgetOptionsChanged( - context: Context, - appWidgetManager: AppWidgetManager, - appWidgetId: Int, - newOptions: Bundle? - ) { - super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions) - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { - // We can't resize the widget until we can generate the views, so request an update - // from PlaybackService. - requestUpdate(context) - } - } - - private fun requestUpdate(context: Context) { - logD("Sending update intent to PlaybackService") - - val intent = Intent(ACTION_WIDGET_UPDATE) - .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY) - - context.sendBroadcast(intent) - } - private fun AppWidgetManager.applyViewsCompat( context: Context, views: Map @@ -134,10 +101,6 @@ class WidgetProvider : AppWidgetProvider() { // problems [most notably UI jittering when resizing]. Its better than just using // one layout though. It may be improved once Android 12's source is released. - // Theres a non-zero likelihood that this code ends up being copy-pasted all over - // by other apps that are trying to refresh their widgets for Android 12. So, if - // you're doing that than uh...hi. - // Each widget has independent dimensions, so we iterate through them all // and do this for each. val ids = getAppWidgetIds(ComponentName(context, WidgetProvider::class.java)) @@ -159,13 +122,20 @@ class WidgetProvider : AppWidgetProvider() { height = options.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT) } - logD("Assuming widget dimens are ${width}x$height") + // Widget dimens pre-12 are weird. Basically, they correspond to columns + // but with 2 columns worth of DiP added for some insane reason. Take + // the dimens, normalize them into cells, and then turn them back into dimens. + // This is super lossy and may result in wonky layouts, but it *seems* to work. + width = normalizeDimen(width) + height = normalizeDimen(height) + + logD("Assuming true widget dimens are ${width}x$height") // Find layouts that fit into the widget val candidates = mutableListOf() for (size in views.keys) { - if (size.width < width && size.height < height) { + if (size.width <= width && size.height <= height) { candidates.add(size) } } @@ -195,6 +165,46 @@ class WidgetProvider : AppWidgetProvider() { } } + private fun normalizeDimen(dimen: Int): Int { + var cells = 0 + + while (70 * cells - 30 < dimen) { + cells++ + } + + return 70 * (cells - 2) - 30 + } + + /* + * Revert this widget to its default view + */ + fun reset(context: Context) { + logD("Resetting widget") + + applyDefaultViews(context, AppWidgetManager.getInstance(context)) + } + + @SuppressLint("RemoteViewLayout") + private fun applyDefaultViews(context: Context, manager: AppWidgetManager) { + val views = RemoteViews(context.packageName, R.layout.widget_default) + + views.setOnClickPendingIntent( + android.R.id.background, + context.newMainIntent() + ) + + manager.updateAppWidget(ComponentName(context, this::class.java), views) + } + + private fun requestUpdate(context: Context) { + logD("Sending update intent to PlaybackService") + + val intent = Intent(ACTION_WIDGET_UPDATE) + .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY) + + context.sendBroadcast(intent) + } + companion object { const val ACTION_WIDGET_UPDATE = BuildConfig.APPLICATION_ID + ".action.WIDGET_UPDATE" } diff --git a/app/src/main/java/org/oxycblt/auxio/widgets/forms/FullWidgetForm.kt b/app/src/main/java/org/oxycblt/auxio/widgets/forms/FullWidgetForm.kt deleted file mode 100644 index 8f5231cee..000000000 --- a/app/src/main/java/org/oxycblt/auxio/widgets/forms/FullWidgetForm.kt +++ /dev/null @@ -1,98 +0,0 @@ -package org.oxycblt.auxio.widgets.forms - -import android.content.Context -import android.widget.RemoteViews -import org.oxycblt.auxio.R -import org.oxycblt.auxio.playback.state.LoopMode -import org.oxycblt.auxio.playback.system.PlaybackService -import org.oxycblt.auxio.ui.newBroadcastIntent -import org.oxycblt.auxio.widgets.WidgetState - -class FullWidgetForm : WidgetForm(R.layout.widget_full) { - override fun createViews(context: Context, state: WidgetState): RemoteViews { - val views = super.createViews(context, state) - - views.setOnClickPendingIntent( - R.id.widget_loop, - context.newBroadcastIntent( - PlaybackService.ACTION_LOOP - ) - ) - - views.setOnClickPendingIntent( - R.id.widget_skip_prev, - context.newBroadcastIntent( - PlaybackService.ACTION_SKIP_PREV - ) - ) - - views.setOnClickPendingIntent( - R.id.widget_play_pause, - context.newBroadcastIntent( - PlaybackService.ACTION_PLAY_PAUSE - ) - ) - - views.setOnClickPendingIntent( - R.id.widget_skip_next, - context.newBroadcastIntent( - PlaybackService.ACTION_SKIP_NEXT - ) - ) - - views.setOnClickPendingIntent( - R.id.widget_shuffle, - context.newBroadcastIntent( - PlaybackService.ACTION_SHUFFLE - ) - ) - - views.setTextViewText(R.id.widget_song, state.song.name) - views.setTextViewText(R.id.widget_artist, state.song.album.artist.name) - - views.setImageViewResource( - R.id.widget_play_pause, - if (state.isPlaying) { - R.drawable.ic_pause - } else { - R.drawable.ic_play - } - ) - - if (state.albumArt != null) { - views.setImageViewBitmap(R.id.widget_cover, state.albumArt) - views.setCharSequence( - R.id.widget_cover, "setContentDescription", - context.getString(R.string.desc_album_cover, state.song.album.name) - ) - } else { - views.setImageViewResource(R.id.widget_cover, R.drawable.ic_song) - views.setCharSequence( - R.id.widget_cover, - "setContentDescription", - context.getString(R.string.desc_no_cover) - ) - } - - // The main way the large widget differs from the other widgets is the addition of extra - // controls. However, since the context we use to load attributes is from the main process, - // attempting to dynamically color anything will result in an error. More duplicate - // resources it is, then. This is getting really tiring. - - val shuffleRes = if (state.isShuffled) - R.drawable.ic_shuffle_tinted - else - R.drawable.ic_shuffle - - val loopRes = when (state.loopMode) { - LoopMode.NONE -> R.drawable.ic_loop - LoopMode.ALL -> R.drawable.ic_loop_all_tinted - LoopMode.TRACK -> R.drawable.ic_loop_one_tinted - } - - views.setImageViewResource(R.id.widget_shuffle, shuffleRes) - views.setImageViewResource(R.id.widget_loop, loopRes) - - return views - } -} diff --git a/app/src/main/java/org/oxycblt/auxio/widgets/forms/SmallWidgetForm.kt b/app/src/main/java/org/oxycblt/auxio/widgets/forms/SmallWidgetForm.kt deleted file mode 100644 index 351052f03..000000000 --- a/app/src/main/java/org/oxycblt/auxio/widgets/forms/SmallWidgetForm.kt +++ /dev/null @@ -1,64 +0,0 @@ -package org.oxycblt.auxio.widgets.forms - -import android.content.Context -import android.widget.RemoteViews -import org.oxycblt.auxio.R -import org.oxycblt.auxio.playback.system.PlaybackService -import org.oxycblt.auxio.ui.newBroadcastIntent -import org.oxycblt.auxio.widgets.WidgetState - -class SmallWidgetForm : WidgetForm(R.layout.widget_small) { - override fun createViews(context: Context, state: WidgetState): RemoteViews { - val views = super.createViews(context, state) - - views.setOnClickPendingIntent( - R.id.widget_skip_prev, - context.newBroadcastIntent( - PlaybackService.ACTION_SKIP_PREV - ) - ) - - views.setOnClickPendingIntent( - R.id.widget_play_pause, - context.newBroadcastIntent( - PlaybackService.ACTION_PLAY_PAUSE - ) - ) - - views.setOnClickPendingIntent( - R.id.widget_skip_next, - context.newBroadcastIntent( - PlaybackService.ACTION_SKIP_NEXT - ) - ) - - views.setTextViewText(R.id.widget_song, state.song.name) - views.setTextViewText(R.id.widget_artist, state.song.album.artist.name) - - views.setImageViewResource( - R.id.widget_play_pause, - if (state.isPlaying) { - R.drawable.ic_pause - } else { - R.drawable.ic_play - } - ) - - if (state.albumArt != null) { - views.setImageViewBitmap(R.id.widget_cover, state.albumArt) - views.setCharSequence( - R.id.widget_cover, "setContentDescription", - context.getString(R.string.desc_album_cover, state.song.album.name) - ) - } else { - views.setImageViewResource(R.id.widget_cover, R.drawable.ic_song) - views.setCharSequence( - R.id.widget_cover, - "setContentDescription", - context.getString(R.string.desc_no_cover) - ) - } - - return views - } -} diff --git a/app/src/main/java/org/oxycblt/auxio/widgets/forms/WidgetForm.kt b/app/src/main/java/org/oxycblt/auxio/widgets/forms/WidgetForm.kt deleted file mode 100644 index 0bdeec398..000000000 --- a/app/src/main/java/org/oxycblt/auxio/widgets/forms/WidgetForm.kt +++ /dev/null @@ -1,20 +0,0 @@ -package org.oxycblt.auxio.widgets.forms - -import android.content.Context -import android.widget.RemoteViews -import androidx.annotation.LayoutRes -import org.oxycblt.auxio.ui.newMainIntent -import org.oxycblt.auxio.widgets.WidgetState - -abstract class WidgetForm(@LayoutRes private val layout: Int) { - open fun createViews(context: Context, state: WidgetState): RemoteViews { - val views = RemoteViews(context.packageName, layout) - - views.setOnClickPendingIntent( - android.R.id.background, - context.newMainIntent() - ) - - return views - } -} diff --git a/app/src/main/res/drawable/ui_widget_preview.png b/app/src/main/res/drawable/ui_widget_preview.png index 685e2d133d3c3a8d4ccacb7e03b1becf131ab45f..800ee27412d56cd37660d184703b56a5010ed21d 100755 GIT binary patch literal 17213 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 XMAXR5_P8E+i%4EZS-M!t*zf-W#X&eE diff --git a/app/src/main/res/layout/widget_full.xml b/app/src/main/res/layout/widget_full.xml index 6c17228e5..6f70d7fce 100644 --- a/app/src/main/res/layout/widget_full.xml +++ b/app/src/main/res/layout/widget_full.xml @@ -12,7 +12,7 @@ android:contentDescription="@string/desc_no_cover" android:src="@drawable/ic_song" /> - + - + match_parent 0dp + 1 ?attr/colorSurface centerCrop diff --git a/app/src/main/res/xml-v31/widget_minimal.xml b/app/src/main/res/xml-v31/widget_minimal.xml index 8c6c4f6dc..cd05a9984 100644 --- a/app/src/main/res/xml-v31/widget_minimal.xml +++ b/app/src/main/res/xml-v31/widget_minimal.xml @@ -6,7 +6,7 @@ android:minResizeHeight="110dp" android:previewLayout="@layout/widget_small" android:resizeMode="horizontal|vertical" - android:targetCellWidth="2" + android:targetCellWidth="3" android:targetCellHeight="2" android:updatePeriodMillis="0" android:widgetCategory="home_screen" /> \ No newline at end of file diff --git a/app/src/main/res/xml/widget_minimal.xml b/app/src/main/res/xml/widget_minimal.xml index f3fa64dd3..26d09bb9f 100644 --- a/app/src/main/res/xml/widget_minimal.xml +++ b/app/src/main/res/xml/widget_minimal.xml @@ -1,8 +1,10 @@