feat(widget): add 4x1 AppWidgetProvider with play/pause and track info

This commit is contained in:
nk
2026-06-01 13:21:37 +03:00
parent 9ce9758361
commit af8fb333d9
7 changed files with 175 additions and 0 deletions

View File

@@ -0,0 +1,79 @@
package com.radiola.widget
import android.app.PendingIntent
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProvider
import android.content.Context
import android.content.Intent
import android.widget.RemoteViews
import com.radiola.MainActivity
import com.radiola.R
import com.radiola.service.PlayerService
class PlayerWidgetProvider : AppWidgetProvider() {
companion object {
const val ACTION_PLAY_PAUSE = "com.radiola.widget.ACTION_PLAY_PAUSE"
fun updateWidget(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetId: Int,
stationName: String,
trackTitle: String,
isPlaying: Boolean
) {
val views = RemoteViews(context.packageName, R.layout.widget_player)
views.setTextViewText(R.id.widget_station_name, stationName)
views.setTextViewText(R.id.widget_track_title, trackTitle)
views.setImageViewResource(
R.id.widget_play_pause,
if (isPlaying) R.drawable.ic_pause else R.drawable.ic_play
)
// Open app on click
val openAppIntent = Intent(context, MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
}
val openAppPendingIntent = PendingIntent.getActivity(
context, 0, openAppIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
views.setOnClickPendingIntent(R.id.widget_root, openAppPendingIntent)
// Play/Pause button
val playPauseIntent = Intent(context, PlayerWidgetProvider::class.java).apply {
action = ACTION_PLAY_PAUSE
}
val playPausePendingIntent = PendingIntent.getBroadcast(
context, 1, playPauseIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
views.setOnClickPendingIntent(R.id.widget_play_pause, playPausePendingIntent)
appWidgetManager.updateAppWidget(appWidgetId, views)
}
}
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray
) {
for (appWidgetId in appWidgetIds) {
updateWidget(context, appWidgetManager, appWidgetId, "radiOLA", "", false)
}
}
override fun onReceive(context: Context, intent: Intent) {
super.onReceive(context, intent)
if (intent.action == ACTION_PLAY_PAUSE) {
// Start service to handle play/pause
val serviceIntent = Intent(context, PlayerService::class.java).apply {
action = ACTION_PLAY_PAUSE
}
context.startService(serviceIntent)
}
}
}