diff --git a/android/app/src/main/java/com/audiobookshelf/app/MediaPlayerWidget.kt b/android/app/src/main/java/com/audiobookshelf/app/MediaPlayerWidget.kt index 6a458907..dbd98c75 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/MediaPlayerWidget.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/MediaPlayerWidget.kt @@ -15,9 +15,7 @@ import android.widget.RemoteViews import androidx.media.session.MediaButtonReceiver import com.audiobookshelf.app.data.PlaybackSession import com.audiobookshelf.app.device.DeviceManager -import com.audiobookshelf.app.device.WidgetEventEmitter import com.audiobookshelf.app.managers.DbManager -import com.audiobookshelf.app.player.PlayerNotificationService import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.target.AppWidgetTarget @@ -28,12 +26,9 @@ import com.bumptech.glide.request.transition.Transition */ class MediaPlayerWidget : AppWidgetProvider() { val tag = "MediaPlayerWidget" - override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { - // There may be multiple widgets active, so update all of them - for (appWidgetId in appWidgetIds) { - updateAppWidget(context, appWidgetManager, appWidgetId, null, false, PlayerNotificationService.isClosed) - } - } + override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) { + Log.d(tag, "onUpdate $appWidgetIds") + } override fun onEnabled(context: Context) { Log.i(tag, "onEnabled check context ${context.packageName}") @@ -51,32 +46,14 @@ class MediaPlayerWidget : AppWidgetProvider() { } // Enter relevant functionality for when the first widget is created - DeviceManager.widgetUpdater = (object : WidgetEventEmitter { - override fun onPlayerChanged(pns: PlayerNotificationService) { - val isPlaying = pns.currentPlayer.isPlaying - - val appWidgetManager = AppWidgetManager.getInstance(context) - val componentName = ComponentName(context, MediaPlayerWidget::class.java) - val ids = appWidgetManager.getAppWidgetIds(componentName) - - val playbackSession = pns.getCurrentPlaybackSessionCopy() - - for (widgetId in ids) { - updateAppWidget(context, appWidgetManager, widgetId, playbackSession, isPlaying, PlayerNotificationService.isClosed) - } - } - }) + DeviceManager.initializeWidgetUpdater(context) } - - override fun onDisabled(context: Context) { - // Enter relevant functionality for when the last widget is disabled - } } internal fun updateAppWidget(context: Context, appWidgetManager: AppWidgetManager, appWidgetId: Int, playbackSession: PlaybackSession?, isPlaying:Boolean, isAppClosed:Boolean) { val tag = "MediaPlayerWidget" val views = RemoteViews(context.packageName, R.layout.media_player_widget) -Log.d(tag, "updateAppWidget ${playbackSession?.displayTitle ?: "No Title"} isPlaying=$isPlaying isAppClosed=$isAppClosed") + Log.i(tag, "updateAppWidget ${playbackSession?.displayTitle ?: "No Title"} isPlaying=$isPlaying isAppClosed=$isAppClosed") val wholeWidgetClickI = Intent(context, MainActivity::class.java) wholeWidgetClickI.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK val wholeWidgetClickPI = PendingIntent.getActivity( diff --git a/android/app/src/main/java/com/audiobookshelf/app/device/DeviceManager.kt b/android/app/src/main/java/com/audiobookshelf/app/device/DeviceManager.kt index 77391ae2..b4769528 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/device/DeviceManager.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/device/DeviceManager.kt @@ -1,15 +1,20 @@ package com.audiobookshelf.app.device +import android.appwidget.AppWidgetManager +import android.content.ComponentName import android.content.Context import android.net.ConnectivityManager import android.net.NetworkCapabilities import android.util.Log +import com.audiobookshelf.app.MediaPlayerWidget import com.audiobookshelf.app.data.* import com.audiobookshelf.app.managers.DbManager import com.audiobookshelf.app.player.PlayerNotificationService +import com.audiobookshelf.app.updateAppWidget interface WidgetEventEmitter { fun onPlayerChanged(pns:PlayerNotificationService) + fun onPlayerClosed() } object DeviceManager { @@ -76,4 +81,31 @@ object DeviceManager { deviceData.lastPlaybackSession = playbackSession dbManager.saveDeviceData(deviceData) } + + fun initializeWidgetUpdater(context:Context) { + Log.d(tag, "Initializing widget updater") + widgetUpdater = (object : WidgetEventEmitter { + override fun onPlayerChanged(pns: PlayerNotificationService) { + + val isPlaying = pns.currentPlayer.isPlaying + + val appWidgetManager = AppWidgetManager.getInstance(context) + val componentName = ComponentName(context, MediaPlayerWidget::class.java) + val ids = appWidgetManager.getAppWidgetIds(componentName) + val playbackSession = pns.getCurrentPlaybackSessionCopy() + + for (widgetId in ids) { + updateAppWidget(context, appWidgetManager, widgetId, playbackSession, isPlaying, PlayerNotificationService.isClosed) + } + } + override fun onPlayerClosed() { + val appWidgetManager = AppWidgetManager.getInstance(context) + val componentName = ComponentName(context, MediaPlayerWidget::class.java) + val ids = appWidgetManager.getAppWidgetIds(componentName) + for (widgetId in ids) { + updateAppWidget(context, appWidgetManager, widgetId, deviceData.lastPlaybackSession, false, PlayerNotificationService.isClosed) + } + } + }) + } } diff --git a/android/app/src/main/java/com/audiobookshelf/app/player/PlayerListener.kt b/android/app/src/main/java/com/audiobookshelf/app/player/PlayerListener.kt index 669637eb..8d28b637 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/player/PlayerListener.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/player/PlayerListener.kt @@ -56,6 +56,9 @@ class PlayerListener(var playerNotificationService:PlayerNotificationService) : lazyIsPlaying = isPlaying + // Update widget + DeviceManager.widgetUpdater?.onPlayerChanged(playerNotificationService) + if (isPlaying) { Log.d(tag, "SeekBackTime: Player is playing") if (lastPauseTime > 0 && DeviceManager.deviceData.deviceSettings?.disableAutoRewind != true) { @@ -109,8 +112,6 @@ class PlayerListener(var playerNotificationService:PlayerNotificationService) : } playerNotificationService.clientEventEmitter?.onPlayingUpdate(isPlaying) - - DeviceManager.widgetUpdater?.onPlayerChanged(playerNotificationService) } override fun onEvents(player: Player, events: Player.Events) { diff --git a/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt b/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt index b62be5bb..e1ceb428 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/player/PlayerNotificationService.kt @@ -2,8 +2,6 @@ package com.audiobookshelf.app.player import android.annotation.SuppressLint import android.app.* -import android.appwidget.AppWidgetManager -import android.content.ComponentName import android.content.Context import android.content.Intent import android.graphics.Bitmap @@ -25,8 +23,6 @@ import android.support.v4.media.session.MediaControllerCompat import android.support.v4.media.session.MediaSessionCompat import android.support.v4.media.session.PlaybackStateCompat import android.util.Log -import android.view.View -import android.widget.RemoteViews import androidx.annotation.RequiresApi import androidx.core.app.NotificationCompat import androidx.core.content.ContextCompat @@ -203,6 +199,9 @@ class PlayerNotificationService : MediaBrowserServiceCompat() { super.onCreate() ctx = this + // Initialize widget + DeviceManager.initializeWidgetUpdater(ctx) + // To listen for network change from metered to unmetered val networkRequest = NetworkRequest.Builder() .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) @@ -362,7 +361,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() { .build() mPlayer.setHandleAudioBecomingNoisy(true) mPlayer.addListener(PlayerListener(this)) - val audioAttributes:AudioAttributes = AudioAttributes.Builder().setUsage(C.USAGE_MEDIA).setContentType(C.CONTENT_TYPE_SPEECH).build() + val audioAttributes:AudioAttributes = AudioAttributes.Builder().setUsage(C.USAGE_MEDIA).setContentType(C.AUDIO_CONTENT_TYPE_SPEECH).build() mPlayer.setAudioAttributes(audioAttributes, true) //attach player to playerNotificationManager @@ -896,8 +895,10 @@ class PlayerNotificationService : MediaBrowserServiceCompat() { currentPlaybackSession = null mediaProgressSyncer.reset() clientEventEmitter?.onPlaybackClosed() + PlayerListener.lastPauseTime = 0 isClosed = true + DeviceManager.widgetUpdater?.onPlayerClosed() stopForeground(Service.STOP_FOREGROUND_REMOVE) stopSelf() }