Skip to content

Commit

Permalink
optimize update AppWidget
Browse files Browse the repository at this point in the history
  • Loading branch information
jrfeng committed Feb 19, 2023
1 parent 9e68f12 commit 20055f2
Show file tree
Hide file tree
Showing 10 changed files with 117 additions and 27 deletions.
8 changes: 0 additions & 8 deletions debug/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,13 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="snow.player.debug">

<permission android:name="snow.player.appwidget.permission.UPDATE_APPWIDGET" />

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="snow.player.appwidget.permission.UPDATE_APPWIDGET" />

<application
android:name="androidx.multidex.MultiDexApplication"
Expand Down Expand Up @@ -69,11 +66,6 @@
android:name="android.appwidget.provider"
android:resource="@xml/example_app_widget" />

<intent-filter>
<action android:name="snow.player.appwidget.action.PLAYER_STATE_CHANGED" />
<category android:name="snow.player.debug.MyPlayerService" />
</intent-filter>

</receiver>
</application>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,13 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.widget.RemoteViews;

import snow.player.appwidget.AppWidgetPlayerState;
import snow.player.audio.MusicItem;

public class ExampleAppWidgetProvider extends AppWidgetProvider {
@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);

if (AppWidgetPlayerState.ACTION_PLAYER_STATE_CHANGED.equals(intent.getAction())) {
AppWidgetManager am = AppWidgetManager.getInstance(context);
onUpdate(context, am, am.getAppWidgetIds(new ComponentName(context, ExampleAppWidgetProvider.class)));
}
}

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Expand All @@ -43,7 +35,13 @@ private void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
return;
}

remoteViews.setTextViewText(R.id.tv_song_name, musicItem.getTitle());
String title = musicItem.getTitle();
if (TextUtils.isEmpty(title)) {
title = "未知歌曲名";
}

remoteViews.setTextViewText(R.id.tv_song_name, title);
remoteViews.setTextViewText(R.id.tv_playback_state, state.getPlaybackState().toString());

appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
}
Expand Down
9 changes: 9 additions & 0 deletions debug/src/main/java/snow/player/debug/MyPlayerService.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package snow.player.debug;

import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.net.Uri;

Expand All @@ -12,6 +13,8 @@
import com.google.android.exoplayer2.upstream.DefaultDataSource;
import com.google.android.exoplayer2.util.Util;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
Expand Down Expand Up @@ -82,4 +85,10 @@ protected MusicPlayer onCreateMusicPlayer(@NonNull Context context, @NonNull Mus
protected AudioEffectManager onCreateAudioEffectManager() {
return new AndroidAudioEffectManager();
}

@Nullable
@Override
protected Class<? extends AppWidgetProvider> getAppWidget() {
return ExampleAppWidgetProvider.class;
}
}
16 changes: 14 additions & 2 deletions debug/src/main/res/layout/example_appwidget.xml
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFF"
android:gravity="center"
android:orientation="vertical"
android:paddingLeft="8dp"
android:paddingRight="8dp">

Expand All @@ -12,7 +14,17 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:maxLines="1"
android:singleLine="true"
android:textSize="14sp"
tools:text="未知歌曲" />

</FrameLayout>
<TextView
android:id="@+id/tv_playback_state"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="14sp"
tools:text="PAUSED" />

</LinearLayout>
2 changes: 1 addition & 1 deletion debug/src/main/res/xml/example_app_widget.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="110dp"
android:minWidth="250dp"
android:minHeight="40dp"
android:updatePeriodMillis="86400000"
android:previewImage="@mipmap/ic_launcher"
Expand Down
3 changes: 2 additions & 1 deletion player/src/main/java/snow/player/AbstractPlayer.java
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ abstract class AbstractPlayer implements Player, PlaylistEditor {
public AbstractPlayer(@NonNull Context context,
@NonNull PlayerConfig playerConfig,
@NonNull PlayerState playerState,
@NonNull ServicePlayerStateHelper playerStateHelper,
@NonNull PlaylistManagerImp playlistManager,
@NonNull Class<? extends PlayerService> playerService,
@NonNull OnStateChangeListener listener) {
Expand All @@ -142,7 +143,7 @@ public AbstractPlayer(@NonNull Context context,
mApplicationContext = context.getApplicationContext();
mPlayerConfig = playerConfig;
mPlayerState = playerState;
mPlayerStateHelper = new ServicePlayerStateHelper(mPlayerState, mApplicationContext, playerService);
mPlayerStateHelper = playerStateHelper;
mPlaylistManager = playlistManager;
mOnStateChangeListener = listener;

Expand Down
36 changes: 35 additions & 1 deletion player/src/main/java/snow/player/PlayerService.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetProvider;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
Expand Down Expand Up @@ -50,6 +51,7 @@
import com.bumptech.glide.request.FutureTarget;
import com.google.common.base.Preconditions;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
Expand Down Expand Up @@ -126,6 +128,7 @@ public class PlayerService extends MediaBrowserServiceCompat

private PlayerConfig mPlayerConfig;
private PlayerState mPlayerState;
private ServicePlayerStateHelper mPlayerStateHelper;

private PlaylistManagerImp mPlaylistManager;
private PlayerImp mPlayer;
Expand Down Expand Up @@ -192,6 +195,7 @@ public void onCreate() {
initNotificationManager();
initPlayerConfig();
initPlayerState();
initPlayerStateHelper();
initPlaylistManager();
initNotificationView();
initOnStateChangeListener();
Expand Down Expand Up @@ -324,6 +328,23 @@ private void initPlayerState() {
mPlayerState = new PersistentPlayerState(this, mPersistentId);
}

private void initPlayerStateHelper() {
List<Class<? extends AppWidgetProvider>> appWidgets = getAppWidgets();

if (appWidgets == null && getAppWidget() != null) {
Class<? extends AppWidgetProvider> clazz = getAppWidget();
appWidgets = new ArrayList<>();
appWidgets.add(clazz);
}

mPlayerStateHelper = new ServicePlayerStateHelper(
mPlayerState,
getApplicationContext(),
this.getClass(),
appWidgets
);
}

private void initPlaylistManager() {
mPlaylistManager = new PlaylistManagerImp(this, mPersistentId);
}
Expand Down Expand Up @@ -385,6 +406,7 @@ private void initPlayer() {
mPlayer = new PlayerImp(this,
mPlayerConfig,
mPlayerState,
mPlayerStateHelper,
mPlaylistManager,
this.getClass(),
mOnStateChangeListener);
Expand Down Expand Up @@ -454,6 +476,7 @@ private void initSessionEventEmitter() {
mSleepTimer = new SleepTimerImp(
this,
mPlayerState,
mPlayerStateHelper,
ChannelHelper.newEmitter(OnStateChangeListener2.class, sessionEventEmitter),
ChannelHelper.newEmitter(OnWaitPlayCompleteChangeListener.class, sessionEventEmitter)
);
Expand Down Expand Up @@ -565,6 +588,16 @@ protected HistoryRecorder onCreateHistoryRecorder() {
return null;
}

@Nullable
protected Class<? extends AppWidgetProvider> getAppWidget() {
return null;
}

@Nullable
protected List<Class<? extends AppWidgetProvider>> getAppWidgets() {
return null;
}

@Override
public void setSoundQuality(SoundQuality soundQuality) {
if (soundQuality == mPlayerConfig.getSoundQuality()) {
Expand Down Expand Up @@ -1499,10 +1532,11 @@ private class PlayerImp extends AbstractPlayer {
public PlayerImp(@NonNull Context context,
@NonNull PlayerConfig playerConfig,
@NonNull PlayerState playlistState,
@NonNull ServicePlayerStateHelper playerStateHelper,
@NonNull PlaylistManagerImp playlistManager,
@NonNull Class<? extends PlayerService> playerService,
@NonNull AbstractPlayer.OnStateChangeListener listener) {
super(context, playerConfig, playlistState, playlistManager, playerService, listener);
super(context, playerConfig, playlistState, playerStateHelper, playlistManager, playerService, listener);
}

@Override
Expand Down
21 changes: 18 additions & 3 deletions player/src/main/java/snow/player/ServicePlayerStateHelper.java
Original file line number Diff line number Diff line change
@@ -1,28 +1,38 @@
package snow.player;

import android.appwidget.AppWidgetProvider;
import android.content.Context;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.google.common.base.Preconditions;

import java.util.List;

import snow.player.appwidget.AppWidgetPlayerState;
import snow.player.audio.MusicItem;

class ServicePlayerStateHelper extends PlayerStateHelper {
private final Context mContext;
private final Class<? extends PlayerService> mPlayerService;

public ServicePlayerStateHelper(@NonNull PlayerState playerState,
@NonNull Context context,
@NonNull Class<? extends PlayerService> playerService) {
@Nullable
private final List<Class<? extends AppWidgetProvider>> mAppWidgets;

public ServicePlayerStateHelper(
@NonNull PlayerState playerState,
@NonNull Context context,
@NonNull Class<? extends PlayerService> playerService,
@Nullable List<Class<? extends AppWidgetProvider>> appWidgets
) {
super((playerState));
Preconditions.checkNotNull(context);
Preconditions.checkNotNull(playerService);

mContext = context;
mPlayerService = playerService;
mAppWidgets = appWidgets;
}

private void updateAppWidgetPlayerState() {
Expand All @@ -39,6 +49,11 @@ private void updateAppWidgetPlayerState() {
getPlayerState().getErrorMessage()
);

if (mAppWidgets != null) {
AppWidgetPlayerState.updatePlayerState(mContext, mPlayerService, playerState, mAppWidgets);
return;
}

AppWidgetPlayerState.updatePlayerState(mContext, mPlayerService, playerState);
}

Expand Down
3 changes: 2 additions & 1 deletion player/src/main/java/snow/player/SleepTimerImp.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,15 @@ class SleepTimerImp implements SleepTimer {

SleepTimerImp(PlayerService playerService,
PlayerState playerState,
ServicePlayerStateHelper playerStateHelper,
SleepTimer.OnStateChangeListener2 onStateChangeListener2,
OnWaitPlayCompleteChangeListener onWaitPlayCompleteChangeListener) {
mPlayerService = playerService;
mPlayerState = playerState;
mSleepTimerStateChangedListener = onStateChangeListener2;
mWaitPlayCompleteChangeListener = onWaitPlayCompleteChangeListener;

mPlayerStateHelper = new ServicePlayerStateHelper(playerState, playerService, playerService.getClass());
mPlayerStateHelper = playerStateHelper;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package snow.player.appwidget;

import android.app.ActivityManager;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
Expand All @@ -13,6 +15,8 @@
import com.google.common.base.Preconditions;
import com.tencent.mmkv.MMKV;

import java.util.List;

import snow.player.PlayMode;
import snow.player.PlaybackState;
import snow.player.PlayerService;
Expand Down Expand Up @@ -119,6 +123,30 @@ public static void updatePlayerState(@NonNull Context context,
context.sendBroadcast(intent, PERMISSION_UPDATE_APP_WIDGET);
}

public static void updatePlayerState(@NonNull Context context,
@NonNull Class<? extends PlayerService> playerService,
@NonNull AppWidgetPlayerState playerState,
@NonNull List<Class<? extends AppWidgetProvider>> appWidgets) {
Preconditions.checkNotNull(context);
Preconditions.checkNotNull(playerService);
Preconditions.checkNotNull(playerState);

MMKV mmkv = getMMKV(context, playerService);
mmkv.encode(KEY_PLAYER_STATE, playerState);

AppWidgetManager am = AppWidgetManager.getInstance(context);

for (Class<? extends AppWidgetProvider> appWidgetClazz : appWidgets) {
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);

ComponentName componentName = new ComponentName(context, appWidgetClazz);
intent.setComponent(componentName);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, am.getAppWidgetIds(componentName));

context.sendBroadcast(intent);
}
}

private static MMKV getMMKV(@NonNull Context context, @NonNull Class<? extends PlayerService> playerService) {
if (!sMMKVInitialized) {
sMMKVInitialized = true;
Expand Down

0 comments on commit 20055f2

Please sign in to comment.