diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 55ad8f890..09bc9ba60 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -57,9 +57,9 @@ android:roundIcon="@mipmap/ic_launcher_round" /> + android:exported="false"> diff --git a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt index a68a3584e..649f0adba 100644 --- a/app/src/main/java/org/oxycblt/auxio/MainActivity.kt +++ b/app/src/main/java/org/oxycblt/auxio/MainActivity.kt @@ -20,7 +20,6 @@ import org.oxycblt.auxio.ui.isNight /** * The single [AppCompatActivity] for Auxio. * TODO: Port widgets to non-12 android - * TODO: Fix intent issues */ class MainActivity : AppCompatActivity() { private val playbackModel: PlaybackViewModel by viewModels() diff --git a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt index f2578cd19..02fa12f23 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/system/PlaybackService.kt @@ -78,7 +78,7 @@ class PlaybackService : Service(), Player.Listener, PlaybackStateManager.Callbac private val settingsManager = SettingsManager.getInstance() // Widgets - private val minimalWidget = MinimalWidgetProvider.new() + private val minimalWidget = MinimalWidgetProvider() // State private var isForeground = false @@ -179,6 +179,10 @@ class PlaybackService : Service(), Player.Listener, PlaybackStateManager.Callbac audioReactor.release() releaseWakelock() + // Technically the widgets don't *have* to be reset, but any commands from them + // won't work if the service is dead, so we do it anyway + minimalWidget.stop(this) + playbackManager.removeCallback(this) settingsManager.removeCallback(this) @@ -246,14 +250,14 @@ class PlaybackService : Service(), Player.Listener, PlaybackStateManager.Callbac this, song, settingsManager.colorizeNotif, ::startForegroundOrNotify ) - minimalWidget?.update(this, playbackManager) + minimalWidget.update(this, playbackManager) return } // Clear if there's nothing to play. player.stop() - minimalWidget?.stop(this) + minimalWidget.stop(this) stopForegroundAndNotification() } diff --git a/app/src/main/java/org/oxycblt/auxio/widgets/BaseWidget.kt b/app/src/main/java/org/oxycblt/auxio/widgets/BaseWidget.kt index 87f4ba240..f75a847c1 100644 --- a/app/src/main/java/org/oxycblt/auxio/widgets/BaseWidget.kt +++ b/app/src/main/java/org/oxycblt/auxio/widgets/BaseWidget.kt @@ -11,6 +11,7 @@ import android.widget.RemoteViews import androidx.annotation.LayoutRes import org.oxycblt.auxio.BuildConfig import org.oxycblt.auxio.MainActivity +import org.oxycblt.auxio.R import org.oxycblt.auxio.logD import org.oxycblt.auxio.playback.state.PlaybackStateManager @@ -112,11 +113,3 @@ abstract class BaseWidget : AppWidgetProvider() { const val KEY_WIDGET_TYPE = BuildConfig.APPLICATION_ID + ".key.WIDGET_TYPE" } } - -// PLAN: -// - Service calls methods on the widgets, think a subset of PlaybackStateManager.Callback -// - Widgets send BACK broadcasts to control playback, as other parts of the code do -// - Since widgets are broadcastrecievers, this is okay, shouldn't cause memory leaks -// - Can't use playbackstatemanager here since that would make the app unkillable -// - Callbacks also need to handle PlaybackService dying and being unable to send any -// more updates, and PlaybackService starting up as well diff --git a/app/src/main/java/org/oxycblt/auxio/widgets/MinimalWidgetProvider.kt b/app/src/main/java/org/oxycblt/auxio/widgets/MinimalWidgetProvider.kt index 30c010eee..2ce69d23a 100644 --- a/app/src/main/java/org/oxycblt/auxio/widgets/MinimalWidgetProvider.kt +++ b/app/src/main/java/org/oxycblt/auxio/widgets/MinimalWidgetProvider.kt @@ -2,7 +2,6 @@ package org.oxycblt.auxio.widgets import android.content.Context import android.os.Build -import android.view.View import android.widget.RemoteViews import org.oxycblt.auxio.R import org.oxycblt.auxio.coil.loadBitmap @@ -17,14 +16,7 @@ class MinimalWidgetProvider : BaseWidget() { override val type: Int get() = TYPE override fun getDefaultViews(context: Context): RemoteViews { - val views = getRemoteViews(context, LAYOUT) - - views.setInt(R.id.widget_cover, "setImageResource", R.drawable.ic_song_clear) - views.setInt(R.id.widget_cover, "setVisibility", View.VISIBLE) - views.setInt(R.id.widget_placeholder_msg, "setVisibility", View.VISIBLE) - views.setInt(R.id.widget_meta, "setVisibility", View.GONE) - - return views + return getRemoteViews(context, R.layout.widget_default) } override fun updateViews( @@ -32,15 +24,12 @@ class MinimalWidgetProvider : BaseWidget() { playbackManager: PlaybackStateManager, onDone: (RemoteViews) -> Unit ) { - val views = getRemoteViews(context, LAYOUT) val song = playbackManager.song if (song != null) { logD("updating view to ${song.name}") - // Show the proper widget views - views.setInt(R.id.widget_placeholder_msg, "setVisibility", View.GONE) - views.setInt(R.id.widget_meta, "setVisibility", View.VISIBLE) + val views = getRemoteViews(context, R.layout.widget_minimal) // Update the metadata views.setTextViewText(R.id.widget_song, song.name) @@ -51,24 +40,18 @@ class MinimalWidgetProvider : BaseWidget() { if (bitmap != null) { views.setBitmap(R.id.widget_cover, "setImageBitmap", bitmap) } else { - views.setInt(R.id.widget_cover, "setImageResource", R.drawable.ic_song_clear) + views.setInt(R.id.widget_cover, "setImageResource", R.drawable.ic_song) } onDone(views) } } else { - views.setInt(R.id.widget_cover, "setImageResource", R.drawable.ic_song_clear) - onDone(views) + onDone(getDefaultViews(context)) } } companion object { const val TYPE = 0xA0D0 - - // Workaround to make studio shut up about perfectly valid layouts somehow - // being invalid for remote views. - const val LAYOUT = R.layout.widget_minimal - fun new(): MinimalWidgetProvider? { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { MinimalWidgetProvider() diff --git a/app/src/main/res/drawable/ui_widget_black.xml b/app/src/main/res/drawable/ui_widget_black.xml deleted file mode 100644 index fb887911b..000000000 --- a/app/src/main/res/drawable/ui_widget_black.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ui_widget_day.xml b/app/src/main/res/drawable/ui_widget_day.xml deleted file mode 100644 index f1d95642f..000000000 --- a/app/src/main/res/drawable/ui_widget_day.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/app/src/main/res/drawable/ui_widget_night.xml b/app/src/main/res/drawable/ui_widget_night.xml deleted file mode 100644 index cea57ae3a..000000000 --- a/app/src/main/res/drawable/ui_widget_night.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/app/src/main/res/layout-v31/widget_minimal.xml b/app/src/main/res/layout-v31/widget_minimal.xml index 212318c4d..a62177ebb 100644 --- a/app/src/main/res/layout-v31/widget_minimal.xml +++ b/app/src/main/res/layout-v31/widget_minimal.xml @@ -15,7 +15,7 @@ android:layout_weight="1" android:scaleType="centerCrop" tools:ignore="contentDescription" - tools:src="@drawable/ic_song_clear" /> + tools:src="@drawable/ic_song" /> - - diff --git a/app/src/main/res/layout/widget_default.xml b/app/src/main/res/layout/widget_default.xml new file mode 100644 index 000000000..104816740 --- /dev/null +++ b/app/src/main/res/layout/widget_default.xml @@ -0,0 +1,32 @@ + + + + + + + + diff --git a/app/src/main/res/layout/widget_minimal.xml b/app/src/main/res/layout/widget_minimal.xml new file mode 100644 index 000000000..a62177ebb --- /dev/null +++ b/app/src/main/res/layout/widget_minimal.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/values-v29/styles_core.xml b/app/src/main/res/values-v29/styles_core.xml new file mode 100644 index 000000000..a40fc64bf --- /dev/null +++ b/app/src/main/res/values-v29/styles_core.xml @@ -0,0 +1,14 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values-v31/bools.xml b/app/src/main/res/values-v31/bools.xml deleted file mode 100644 index 1ea4bc90a..000000000 --- a/app/src/main/res/values-v31/bools.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - true - \ No newline at end of file diff --git a/app/src/main/res/values-v31/styles_core.xml b/app/src/main/res/values-v31/styles_core.xml deleted file mode 100644 index 5be1df180..000000000 --- a/app/src/main/res/values-v31/styles_core.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/values/bools.xml b/app/src/main/res/values/bools.xml deleted file mode 100644 index 9ec485ae0..000000000 --- a/app/src/main/res/values/bools.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - false - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 67416c84c..1c571b781 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4,6 +4,7 @@ A simple, rational music player for android. Music Playback + Minimal Retry diff --git a/app/src/main/res/values/styles_core.xml b/app/src/main/res/values/styles_core.xml index 4a1d191bb..f10e40213 100644 --- a/app/src/main/res/values/styles_core.xml +++ b/app/src/main/res/values/styles_core.xml @@ -42,4 +42,10 @@ @color/surface_black @style/Theme.CustomDialog.Black + + +