diff --git a/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetBig.java b/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetBig.java index 000ae796..c2833fac 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetBig.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetBig.java @@ -18,6 +18,7 @@ import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.Target; import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.appwidgets.base.BaseAppWidget; import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.service.MusicService; @@ -69,7 +70,7 @@ public class AppWidgetBig extends BaseAppWidget { } else { appWidgetView.setViewVisibility(R.id.media_titles, View.VISIBLE); appWidgetView.setTextViewText(R.id.title, song.title); - appWidgetView.setTextViewText(R.id.text, song.artistName + " • " +song.albumName); + appWidgetView.setTextViewText(R.id.text, getSongArtistAndAlbum(song)); } // Set correct drawable for pause state @@ -109,7 +110,6 @@ public class AppWidgetBig extends BaseAppWidget { } private void update(@Nullable Bitmap bitmap) { - appWidgetView.setViewVisibility(R.id.image, View.VISIBLE); if (bitmap == null) { appWidgetView.setImageViewResource(R.id.image, R.drawable.default_album_art); } else { diff --git a/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetCard.java b/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetCard.java index 6996a983..4b1c22b7 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetCard.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetCard.java @@ -19,6 +19,7 @@ import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.Target; import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.appwidgets.base.BaseAppWidget; import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper; import com.kabouzeid.gramophone.model.Song; @@ -49,7 +50,7 @@ public class AppWidgetCard extends BaseAppWidget { final RemoteViews appWidgetView = new RemoteViews(context.getPackageName(), R.layout.app_widget_card); appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE); - appWidgetView.setViewVisibility(R.id.image, View.INVISIBLE); + appWidgetView.setImageViewResource(R.id.image, R.drawable.default_album_art); appWidgetView.setImageViewBitmap(R.id.button_next, createBitmap(Util.getTintedVectorDrawable(context, R.drawable.ic_skip_next_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true)), 1f)); appWidgetView.setImageViewBitmap(R.id.button_prev, createBitmap(Util.getTintedVectorDrawable(context, R.drawable.ic_skip_previous_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true)), 1f)); appWidgetView.setImageViewBitmap(R.id.button_toggle_play_pause, createBitmap(Util.getTintedVectorDrawable(context, R.drawable.ic_play_arrow_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true)), 1f)); @@ -71,16 +72,9 @@ public class AppWidgetCard extends BaseAppWidget { if (TextUtils.isEmpty(song.title) && TextUtils.isEmpty(song.artistName)) { appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE); } else { - if (TextUtils.isEmpty(song.artistName) || TextUtils.isEmpty(song.albumName)) { - appWidgetView.setTextViewText(R.id.text_separator, ""); - } else { - appWidgetView.setTextViewText(R.id.text_separator, "•"); - } - appWidgetView.setViewVisibility(R.id.media_titles, View.VISIBLE); appWidgetView.setTextViewText(R.id.title, song.title); - appWidgetView.setTextViewText(R.id.artist, song.artistName); - appWidgetView.setTextViewText(R.id.album, song.albumName); + appWidgetView.setTextViewText(R.id.text, getSongArtistAndAlbum(song)); } // Set correct drawable for pause state @@ -124,8 +118,6 @@ public class AppWidgetCard extends BaseAppWidget { } private void update(@Nullable Bitmap bitmap, int color) { - appWidgetView.setViewVisibility(R.id.image, View.VISIBLE); - // Set correct drawable for pause state int playPauseRes = isPlaying ? R.drawable.ic_pause_white_24dp : R.drawable.ic_play_arrow_white_24dp; appWidgetView.setImageViewBitmap(R.id.button_toggle_play_pause, createBitmap(Util.getTintedVectorDrawable(service, playPauseRes, color), 1f)); @@ -134,15 +126,9 @@ public class AppWidgetCard extends BaseAppWidget { appWidgetView.setImageViewBitmap(R.id.button_next, createBitmap(Util.getTintedVectorDrawable(service, R.drawable.ic_skip_next_white_24dp, color), 1f)); appWidgetView.setImageViewBitmap(R.id.button_prev, createBitmap(Util.getTintedVectorDrawable(service, R.drawable.ic_skip_previous_white_24dp, color), 1f)); - Drawable image; - - if (bitmap == null) { - image = service.getResources().getDrawable(R.drawable.default_album_art); - } else { - image = new BitmapDrawable(bitmap); - } - - appWidgetView.setImageViewBitmap(R.id.image, createRoundedBitmap(image, imageSize, imageSize, cardRadius, 0, cardRadius, 0)); + final Drawable image = getAlbumArtDrawable(service.getResources(), bitmap); + final Bitmap roundedBitmap = createRoundedBitmap(image, imageSize, imageSize, cardRadius, 0, cardRadius, 0); + appWidgetView.setImageViewBitmap(R.id.image, roundedBitmap); pushUpdate(service, appWidgetIds, appWidgetView); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetClassic.java b/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetClassic.java index 7d2bb6f4..f0a3b1cd 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetClassic.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetClassic.java @@ -19,6 +19,7 @@ import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.Target; import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.appwidgets.base.BaseAppWidget; import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper; import com.kabouzeid.gramophone.model.Song; @@ -73,7 +74,7 @@ public class AppWidgetClassic extends BaseAppWidget { } else { appWidgetView.setViewVisibility(R.id.media_titles, View.VISIBLE); appWidgetView.setTextViewText(R.id.title, song.title); - appWidgetView.setTextViewText(R.id.text, song.artistName + " • " +song.albumName); + appWidgetView.setTextViewText(R.id.text, getSongArtistAndAlbum(song)); } // Link actions buttons to intents @@ -109,9 +110,7 @@ public class AppWidgetClassic extends BaseAppWidget { update(null, MaterialValueHelper.getSecondaryTextColor(appContext, true)); } - private void update(@Nullable Bitmap bitmap,int color) { - appWidgetView.setViewVisibility(R.id.image, View.VISIBLE); - + private void update(@Nullable Bitmap bitmap, int color) { // Set correct drawable for pause state int playPauseRes = isPlaying ? R.drawable.ic_pause_white_24dp : R.drawable.ic_play_arrow_white_24dp; appWidgetView.setImageViewBitmap(R.id.button_toggle_play_pause, createBitmap(Util.getTintedVectorDrawable(service, playPauseRes, color), 1f)); @@ -120,13 +119,9 @@ public class AppWidgetClassic extends BaseAppWidget { appWidgetView.setImageViewBitmap(R.id.button_next, createBitmap(Util.getTintedVectorDrawable(service, R.drawable.ic_skip_next_white_24dp, color), 1f)); appWidgetView.setImageViewBitmap(R.id.button_prev, createBitmap(Util.getTintedVectorDrawable(service, R.drawable.ic_skip_previous_white_24dp, color), 1f)); - Drawable image; - if (bitmap == null) { - image = service.getResources().getDrawable(R.drawable.default_album_art); - } else { - image = new BitmapDrawable(bitmap); - } - appWidgetView.setImageViewBitmap(R.id.image, createRoundedBitmap(image, imageSize, imageSize, cardRadius, 0, cardRadius, 0)); + final Drawable image = getAlbumArtDrawable(service.getResources(), bitmap); + final Bitmap roundedBitmap = createRoundedBitmap(image, imageSize, imageSize, cardRadius, 0, cardRadius, 0); + appWidgetView.setImageViewBitmap(R.id.image, roundedBitmap); pushUpdate(appContext, appWidgetIds, appWidgetView); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetSmall.java b/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetSmall.java index 8c633da3..113209cf 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetSmall.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appwidgets/AppWidgetSmall.java @@ -19,6 +19,7 @@ import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.Target; import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.appwidgets.base.BaseAppWidget; import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper; import com.kabouzeid.gramophone.model.Song; @@ -116,8 +117,6 @@ public class AppWidgetSmall extends BaseAppWidget { } private void update(@Nullable Bitmap bitmap, int color) { - appWidgetView.setViewVisibility(R.id.image, View.VISIBLE); - // Set correct drawable for pause state int playPauseRes = isPlaying ? R.drawable.ic_pause_white_24dp : R.drawable.ic_play_arrow_white_24dp; appWidgetView.setImageViewBitmap(R.id.button_toggle_play_pause, createBitmap(Util.getTintedVectorDrawable(service, playPauseRes, color), 1f)); @@ -126,13 +125,9 @@ public class AppWidgetSmall extends BaseAppWidget { appWidgetView.setImageViewBitmap(R.id.button_next, createBitmap(Util.getTintedVectorDrawable(service, R.drawable.ic_skip_next_white_24dp, color), 1f)); appWidgetView.setImageViewBitmap(R.id.button_prev, createBitmap(Util.getTintedVectorDrawable(service, R.drawable.ic_skip_previous_white_24dp, color), 1f)); - Drawable image; - if (bitmap == null) { - image = service.getResources().getDrawable(R.drawable.default_album_art); - } else { - image = new BitmapDrawable(bitmap); - } - appWidgetView.setImageViewBitmap(R.id.image, createRoundedBitmap(image, imageSize, imageSize, cardRadius, 0, 0, 0)); + final Drawable image = getAlbumArtDrawable(service.getResources(), bitmap); + final Bitmap roundedBitmap = createRoundedBitmap(image, imageSize, imageSize, cardRadius, 0, 0, 0); + appWidgetView.setImageViewBitmap(R.id.image, roundedBitmap); pushUpdate(appContext, appWidgetIds, appWidgetView); } diff --git a/app/src/main/java/com/kabouzeid/gramophone/appwidgets/BootReceiver.java b/app/src/main/java/com/kabouzeid/gramophone/appwidgets/BootReceiver.java index c80a77fe..3dbae0f4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appwidgets/BootReceiver.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appwidgets/BootReceiver.java @@ -8,9 +8,6 @@ import android.content.Intent; import com.kabouzeid.gramophone.service.MusicService; -/** - * @author Eugene Cheung (arkon) - */ public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { diff --git a/app/src/main/java/com/kabouzeid/gramophone/appwidgets/BaseAppWidget.java b/app/src/main/java/com/kabouzeid/gramophone/appwidgets/base/BaseAppWidget.java similarity index 84% rename from app/src/main/java/com/kabouzeid/gramophone/appwidgets/BaseAppWidget.java rename to app/src/main/java/com/kabouzeid/gramophone/appwidgets/base/BaseAppWidget.java index 2e09ef6a..d54dbba4 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/appwidgets/BaseAppWidget.java +++ b/app/src/main/java/com/kabouzeid/gramophone/appwidgets/base/BaseAppWidget.java @@ -1,4 +1,4 @@ -package com.kabouzeid.gramophone.appwidgets; +package com.kabouzeid.gramophone.appwidgets.base; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; @@ -6,20 +6,77 @@ import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.Intent; +import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.text.TextUtils; import android.widget.RemoteViews; +import com.kabouzeid.gramophone.R; +import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.service.MusicService; public abstract class BaseAppWidget extends AppWidgetProvider { public static final String NAME = "app_widget"; + /** + * {@inheritDoc} + */ + @Override + public void onUpdate(final Context context, final AppWidgetManager appWidgetManager, + final int[] appWidgetIds) { + defaultAppWidget(context, appWidgetIds); + final Intent updateIntent = new Intent(MusicService.APP_WIDGET_UPDATE); + updateIntent.putExtra(MusicService.EXTRA_APP_WIDGET_NAME, NAME); + updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); + updateIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); + context.sendBroadcast(updateIntent); + } + + /** + * Handle a change notification coming over from + * {@link MusicService} + */ + public void notifyChange(final MusicService service, final String what) { + if (hasInstances(service)) { + if (MusicService.META_CHANGED.equals(what) || MusicService.PLAY_STATE_CHANGED.equals(what)) { + performUpdate(service, null); + } + } + } + + protected void pushUpdate(final Context context, final int[] appWidgetIds, final RemoteViews views) { + final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); + if (appWidgetIds != null) { + appWidgetManager.updateAppWidget(appWidgetIds, views); + } else { + appWidgetManager.updateAppWidget(new ComponentName(context, getClass()), views); + } + } + + /** + * Check against {@link AppWidgetManager} if there are any instances of this + * widget. + */ + protected boolean hasInstances(final Context context) { + final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); + final int[] mAppWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, + getClass())); + return mAppWidgetIds.length > 0; + } + + protected PendingIntent buildPendingIntent(Context context, final String action, final ComponentName serviceName) { + Intent intent = new Intent(action); + intent.setComponent(serviceName); + return PendingIntent.getService(context, 0, intent, 0); + } + protected static Bitmap createBitmap(Drawable drawable, float sizeMultiplier) { Bitmap bitmap = Bitmap.createBitmap((int) (drawable.getIntrinsicWidth() * sizeMultiplier), (int) (drawable.getIntrinsicHeight() * sizeMultiplier), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bitmap); @@ -72,55 +129,23 @@ public abstract class BaseAppWidget extends AppWidgetProvider { abstract public void performUpdate(final MusicService service, final int[] appWidgetIds); - /** - * {@inheritDoc} - */ - @Override - public void onUpdate(final Context context, final AppWidgetManager appWidgetManager, - final int[] appWidgetIds) { - defaultAppWidget(context, appWidgetIds); - final Intent updateIntent = new Intent(MusicService.APP_WIDGET_UPDATE); - updateIntent.putExtra(MusicService.EXTRA_APP_WIDGET_NAME, NAME); - updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); - updateIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); - context.sendBroadcast(updateIntent); - } - - /** - * Handle a change notification coming over from - * {@link MusicService} - */ - public void notifyChange(final MusicService service, final String what) { - if (hasInstances(service)) { - if (MusicService.META_CHANGED.equals(what) || MusicService.PLAY_STATE_CHANGED.equals(what)) { - performUpdate(service, null); - } - } - } - - protected void pushUpdate(final Context context, final int[] appWidgetIds, final RemoteViews views) { - final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); - if (appWidgetIds != null) { - appWidgetManager.updateAppWidget(appWidgetIds, views); + protected Drawable getAlbumArtDrawable(final Resources resources, final Bitmap bitmap) { + Drawable image; + if (bitmap == null) { + image = resources.getDrawable(R.drawable.default_album_art); } else { - appWidgetManager.updateAppWidget(new ComponentName(context, getClass()), views); + image = new BitmapDrawable(resources, bitmap); } + return image; } - /** - * Check against {@link AppWidgetManager} if there are any instances of this - * widget. - */ - protected boolean hasInstances(final Context context) { - final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); - final int[] mAppWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, - getClass())); - return mAppWidgetIds.length > 0; - } - - protected PendingIntent buildPendingIntent(Context context, final String action, final ComponentName serviceName) { - Intent intent = new Intent(action); - intent.setComponent(serviceName); - return PendingIntent.getService(context, 0, intent, 0); + protected String getSongArtistAndAlbum(final Song song) { + final StringBuilder builder = new StringBuilder(); + builder.append(song.artistName); + if (!TextUtils.isEmpty(song.artistName) && !TextUtils.isEmpty(song.albumName)) { + builder.append(" • "); + } + builder.append(song.albumName); + return builder.toString(); } } diff --git a/app/src/main/res/layout/app_widget_card.xml b/app/src/main/res/layout/app_widget_card.xml index 53777743..adf1ebae 100644 --- a/app/src/main/res/layout/app_widget_card.xml +++ b/app/src/main/res/layout/app_widget_card.xml @@ -1,84 +1,54 @@ + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent"> + android:background="@drawable/card" + android:orientation="horizontal"> + tools:ignore="ContentDescription" + tools:src="@drawable/default_album_art" /> + android:layout_weight="1" + android:gravity="center" + android:orientation="vertical"> + tools:text="Title" /> - - - - - - - - - + android:gravity="center_vertical" + android:singleLine="true" + android:textAppearance="@style/TextAppearance.AppCompat.Caption" + android:textColor="@color/ate_secondary_text_light" + tools:text="Text" /> @@ -101,7 +71,7 @@ android:background="@drawable/widget_selector_light" tools:ignore="ContentDescription" tools:src="@drawable/ic_skip_previous_white_24dp" - tools:tint="@color/ate_secondary_text_light"/> + tools:tint="@color/ate_secondary_text_light" /> + tools:tint="@color/ate_secondary_text_light" /> + tools:tint="@color/ate_secondary_text_light" /> diff --git a/app/src/main/res/layout/app_widget_classic.xml b/app/src/main/res/layout/app_widget_classic.xml index 56943588..ee3501a1 100644 --- a/app/src/main/res/layout/app_widget_classic.xml +++ b/app/src/main/res/layout/app_widget_classic.xml @@ -12,8 +12,8 @@ android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="match_parent" - android:scaleType="centerCrop" android:adjustViewBounds="true" + android:scaleType="centerCrop" tools:ignore="ContentDescription" tools:src="@drawable/default_album_art" /> @@ -25,13 +25,13 @@ android:id="@+id/media_actions" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_gravity="bottom" - android:layoutDirection="ltr" - android:orientation="horizontal" - android:layout_marginBottom="8dp" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" - android:layout_alignParentStart="true"> + android:layout_alignParentStart="true" + android:layout_gravity="bottom" + android:layout_marginBottom="8dp" + android:layoutDirection="ltr" + android:orientation="horizontal"> + android:layout_marginRight="8dp" + android:gravity="center" + android:orientation="vertical">