I have a problem, I wonder how I can send data from BroadcastReceiver(it is in Service) to widget and update widget after click button. Specifically, I mean how to send this title song to my widget
Below is my BroadcastReciver:
private final BroadcastReceiver mWidgetEventsReceiver = new BroadcastReceiver() {
private Bundle extras;
private MediaService mService;
AppWidgetManager appWidgetManager;
private static final String TAG = "MediaMusicWidgetProvider";
@Override
public void onReceive(Context context, Intent intent) {
extras = intent.getExtras();
Log.d(TAG, extras.getString("EVENT"));
if (extras.getString("EVENT") == "NEXT") {
Log.d(TAG, "onReceive: switch");
if (mPlaybackModel != null) {
MediaItemMetadata mediaItemMetadata = mPlaybackModel.getMetadata();
if (mediaItemMetadata != null) {
MediaPlayerSong song = new MediaPlayerSong();
song.setTitle(mediaItemMetadata.getTitle() + "");
song.setDurationSec((int) (mPlaybackModel.getMaxProgress() / 1000));
song.setArtist(mediaItemMetadata.getSubtitle() + "");
song.setAlbum(mediaItemMetadata.getDescription() + "");
String title = mediaItemMetadata.getTitle()+"";
Log.d(TAG, "onReceive: "+title);
}
}
onNextTrack();
}
and there is my Provider
protected PendingIntent getPendingSelfIntent(Context context, String action) {
Intent intent = new Intent(context, MediaMusicWidgetProvider.class);
intent.setAction(action);
return PendingIntent.getBroadcast(context, 0, intent, 0);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
log("onUpdate");
for (int appWidgetId : appWidgetIds) {
mViews = new RemoteViews(context.getPackageName(), R.layout.media_widget_blue);
appWidgetManager.updateAppWidget(appWidgetId, mViews);
}
}
@Override
public void onReceive(Context context, Intent intent) {
log("onReceive");
super.onReceive(context, intent);
if (intent.getAction() == NEXT_BUTTON) {
Toast.makeText(context, "Button next", Toast.LENGTH_SHORT).show();
Intent eventIntent = new Intent("com.mobica.widget.action.TEST");
eventIntent.putExtra("EVENT", NEXT_BUTTON);
LocalBroadcastManager.getInstance(context).sendBroadcast(eventIntent);;
} else if (intent.getAction() == PREV_BUTTON) {
Toast.makeText(context, "Button prev", Toast.LENGTH_SHORT).show();
Intent eventIntent = new Intent("com.mobica.widget.action.TEST");
eventIntent.putExtra("EVENT", PREV_BUTTON);
LocalBroadcastManager.getInstance(context).sendBroadcast(eventIntent);
} else if (intent.getAction() == PAUSE_BUTTON) {
Toast.makeText(context, "Button pause", Toast.LENGTH_SHORT).show();
Intent eventIntent = new Intent("com.mobica.widget.action.TEST");
eventIntent.putExtra("EVENT", PAUSE_BUTTON);
LocalBroadcastManager.getInstance(context).sendBroadcast(eventIntent);
}
}
@Override
public void onAppWidgetOptionsChanged(Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) {
log("onAppWidgetOptionsChanged");
mViews = new RemoteViews(context.getPackageName(), getProperLayout(context, newOptions));
mViews.setOnClickPendingIntent(mNextBtnId, getPendingSelfIntent(context, NEXT_BUTTON));
mViews.setOnClickPendingIntent(mPrevBtnId, getPendingSelfIntent(context, PREV_BUTTON));
mViews.setOnClickPendingIntent(mPauseBtnId, getPendingSelfIntent(context, PAUSE_BUTTON));
appWidgetManager.updateAppWidget(appWidgetId, mViews);
}
private int getProperLayout(Context context, Bundle newOptions) {
int maxWidth = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH);
int maxHeight = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT);
int minHeight = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT);
int minWidth = newOptions.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH);
log("Min width: " + minWidth + "\nMax width: " + maxWidth + "\nMin height: " + minHeight + "\nMaxHeight: " + maxHeight);
boolean isLongWidget = minWidth > 460;
String currentTheme = Settings.Global.getString(context.getContentResolver(), THEME_KEY);
int properLayoutId = isLongWidget ? R.layout.media_widget_blue_long : R.layout.media_widget_blue;
if (currentTheme == null) {
return properLayoutId;
}
switch (currentTheme) {
case THEME_BLUE:
properLayoutId = isLongWidget ? R.layout.media_widget_blue_long : R.layout.media_widget_blue;
break;
case THEME_GREEN:
properLayoutId = isLongWidget ? R.layout.media_widget_green_long : R.layout.media_widget_green;
break;
case THEME_PURPLE:
properLayoutId = isLongWidget ? R.layout.media_widget_purple_long : R.layout.media_widget_purple;
break;
}
return properLayoutId;
}
}
I try do it like here https://stackoverflow.com/a/4412949/11766578 but I have problem with this line of code:
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_2x1);
like u can see above I switch layout in dependencies which color of theme user select. Please for help! :)