diff --git a/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetAlbum.java b/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetAlbum.java index 4e9ba39c..0c3cbf47 100644 --- a/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetAlbum.java +++ b/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetAlbum.java @@ -1,10 +1,12 @@ package com.dkanada.gramophone.widgets; import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.Point; import android.graphics.drawable.Drawable; import android.text.TextUtils; @@ -41,11 +43,21 @@ public class AppWidgetAlbum extends BaseAppWidget { return mInstance; } + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + Point p = Util.getScreenSize(context); + + imageSize = Math.min(p.x, p.y); + cardRadius = context.getResources().getDimension(R.dimen.app_widget_card_radius); + + super.onUpdate(context, appWidgetManager, appWidgetIds); + } + protected void defaultAppWidget(final Context context, final int[] appWidgetIds) { final RemoteViews appWidgetView = new RemoteViews(context.getPackageName(), R.layout.app_widget_album); appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE); - appWidgetView.setImageViewResource(R.id.image, R.drawable.default_album_art); + appWidgetView.setImageViewBitmap(R.id.image, createRoundedBitmap(BitmapFactory.decodeResource(context.getResources(), R.drawable.default_album_art), imageSize, imageSize, cardRadius, cardRadius, cardRadius, cardRadius)); appWidgetView.setImageViewBitmap(R.id.button_next, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(context, R.drawable.ic_skip_next_white_24dp, MaterialValueHelper.getPrimaryTextColor(context, false)))); appWidgetView.setImageViewBitmap(R.id.button_prev, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(context, R.drawable.ic_skip_previous_white_24dp, MaterialValueHelper.getPrimaryTextColor(context, false)))); appWidgetView.setImageViewBitmap(R.id.button_toggle_play_pause, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(context, R.drawable.ic_play_arrow_white_24dp, MaterialValueHelper.getPrimaryTextColor(context, false)))); @@ -77,19 +89,20 @@ public class AppWidgetAlbum extends BaseAppWidget { linkButtons(service, appWidgetView); Point p = Util.getScreenSize(service); - final int widgetImageSize = Math.min(p.x, p.y); - final Context appContext = service.getApplicationContext(); + imageSize = Math.min(p.x, p.y); + cardRadius = service.getResources().getDimension(R.dimen.app_widget_card_radius); + service.runOnUiThread(new Runnable() { @Override public void run() { if (target != null) { - Glide.with(appContext).clear(target); + Glide.with(service).clear(target); } target = CustomGlideRequest.Builder - .from(appContext, song.primary, song.blurHash) + .from(service, song.primary, song.blurHash) .bitmap().build() - .into(new CustomTarget(widgetImageSize, widgetImageSize) { + .into(new CustomTarget(imageSize, imageSize) { @Override public void onResourceReady(@NonNull Bitmap resource, Transition glideAnimation) { update(resource); @@ -108,13 +121,11 @@ public class AppWidgetAlbum extends BaseAppWidget { } private void update(@Nullable Bitmap bitmap) { - if (bitmap == null) { - appWidgetView.setImageViewResource(R.id.image, R.drawable.default_album_art); - } else { - appWidgetView.setImageViewBitmap(R.id.image, bitmap); - } + final Drawable image = getAlbumArtDrawable(service.getResources(), bitmap); + final Bitmap roundedBitmap = createRoundedBitmap(image, imageSize, imageSize, cardRadius, cardRadius, cardRadius, cardRadius); - pushUpdate(appContext, appWidgetIds, appWidgetView); + appWidgetView.setImageViewBitmap(R.id.image, roundedBitmap); + pushUpdate(service, appWidgetIds, appWidgetView); } }); } diff --git a/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetCard.java b/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetCard.java index 7f011eb2..d37965fa 100644 --- a/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetCard.java +++ b/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetCard.java @@ -1,10 +1,12 @@ package com.dkanada.gramophone.widgets; import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.view.View; @@ -33,9 +35,6 @@ public class AppWidgetCard extends BaseAppWidget { private static AppWidgetCard mInstance; private Target target; - private static int imageSize = 0; - private static float cardRadius = 0f; - public static synchronized AppWidgetCard getInstance() { if (mInstance == null) { mInstance = new AppWidgetCard(); @@ -44,11 +43,19 @@ public class AppWidgetCard extends BaseAppWidget { return mInstance; } + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + imageSize = context.getResources().getDimensionPixelSize(R.dimen.app_widget_card_image_size); + cardRadius = context.getResources().getDimension(R.dimen.app_widget_card_radius); + + super.onUpdate(context, appWidgetManager, appWidgetIds); + } + protected void defaultAppWidget(final Context context, final int[] appWidgetIds) { final RemoteViews appWidgetView = new RemoteViews(context.getPackageName(), R.layout.app_widget_card); appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE); - appWidgetView.setImageViewResource(R.id.image, R.drawable.default_album_art); + appWidgetView.setImageViewBitmap(R.id.image, createRoundedBitmap(BitmapFactory.decodeResource(context.getResources(), R.drawable.default_album_art), imageSize, imageSize, cardRadius, 0, cardRadius, 0)); appWidgetView.setImageViewBitmap(R.id.button_next, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(context, R.drawable.ic_skip_next_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true)))); appWidgetView.setImageViewBitmap(R.id.button_prev, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(context, R.drawable.ic_skip_previous_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true)))); appWidgetView.setImageViewBitmap(R.id.button_toggle_play_pause, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(context, R.drawable.ic_play_arrow_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true)))); @@ -79,10 +86,8 @@ public class AppWidgetCard extends BaseAppWidget { linkButtons(service, appWidgetView); - if (imageSize == 0) - imageSize = service.getResources().getDimensionPixelSize(R.dimen.app_widget_card_image_size); - if (cardRadius == 0f) - cardRadius = service.getResources().getDimension(R.dimen.app_widget_card_radius); + imageSize = service.getResources().getDimensionPixelSize(R.dimen.app_widget_card_image_size); + cardRadius = service.getResources().getDimension(R.dimen.app_widget_card_radius) / 2; service.runOnUiThread(new Runnable() { @Override diff --git a/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetClassic.java b/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetClassic.java index a539809d..66ee478f 100644 --- a/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetClassic.java +++ b/app/src/main/java/com/dkanada/gramophone/widgets/AppWidgetClassic.java @@ -1,10 +1,12 @@ package com.dkanada.gramophone.widgets; import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.view.View; @@ -33,9 +35,6 @@ public class AppWidgetClassic extends BaseAppWidget { private static AppWidgetClassic mInstance; private Target target; - private static int imageSize = 0; - private static float cardRadius = 0f; - public static synchronized AppWidgetClassic getInstance() { if (mInstance == null) { mInstance = new AppWidgetClassic(); @@ -44,11 +43,19 @@ public class AppWidgetClassic extends BaseAppWidget { return mInstance; } + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + imageSize = context.getResources().getDimensionPixelSize(R.dimen.app_widget_classic_image_size); + cardRadius = context.getResources().getDimension(R.dimen.app_widget_card_radius); + + super.onUpdate(context, appWidgetManager, appWidgetIds); + } + protected void defaultAppWidget(final Context context, final int[] appWidgetIds) { final RemoteViews appWidgetView = new RemoteViews(context.getPackageName(), R.layout.app_widget_classic); appWidgetView.setViewVisibility(R.id.media_titles, View.INVISIBLE); - appWidgetView.setImageViewResource(R.id.image, R.drawable.default_album_art); + appWidgetView.setImageViewBitmap(R.id.image, createRoundedBitmap(BitmapFactory.decodeResource(context.getResources(), R.drawable.default_album_art), imageSize, imageSize, cardRadius, 0, cardRadius, 0)); appWidgetView.setImageViewBitmap(R.id.button_next, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(context, R.drawable.ic_skip_next_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true)))); appWidgetView.setImageViewBitmap(R.id.button_prev, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(context, R.drawable.ic_skip_previous_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true)))); appWidgetView.setImageViewBitmap(R.id.button_toggle_play_pause, ImageUtil.createBitmap(ImageUtil.getTintedVectorDrawable(context, R.drawable.ic_play_arrow_white_24dp, MaterialValueHelper.getSecondaryTextColor(context, true)))); @@ -73,39 +80,36 @@ public class AppWidgetClassic extends BaseAppWidget { linkButtons(service, appWidgetView); - if (imageSize == 0) - imageSize = service.getResources().getDimensionPixelSize(R.dimen.app_widget_classic_image_size); - if (cardRadius == 0f) - cardRadius = service.getResources().getDimension(R.dimen.app_widget_card_radius); + imageSize = service.getResources().getDimensionPixelSize(R.dimen.app_widget_classic_image_size); + cardRadius = service.getResources().getDimension(R.dimen.app_widget_card_radius); - final Context appContext = service.getApplicationContext(); service.runOnUiThread(new Runnable() { @Override public void run() { if (target != null) { - Glide.with(appContext).clear(target); + Glide.with(service).clear(target); } target = CustomGlideRequest.Builder - .from(appContext, song.primary, song.blurHash) + .from(service, song.primary, song.blurHash) .palette().build() .into(new CustomTarget(imageSize, imageSize) { @Override public void onResourceReady(@NonNull BitmapPaletteWrapper resource, Transition glideAnimation) { Palette palette = resource.getPalette(); - update(resource.getBitmap(), palette.getVibrantColor(palette.getMutedColor(MaterialValueHelper.getSecondaryTextColor(appContext, true)))); + update(resource.getBitmap(), palette.getVibrantColor(palette.getMutedColor(MaterialValueHelper.getSecondaryTextColor(service, true)))); } @Override public void onLoadFailed(Drawable drawable) { super.onLoadFailed(drawable); - update(null, MaterialValueHelper.getSecondaryTextColor(appContext, true)); + update(null, MaterialValueHelper.getSecondaryTextColor(service, true)); } @Override public void onLoadCleared(Drawable drawable) { super.onLoadFailed(drawable); - update(null, MaterialValueHelper.getSecondaryTextColor(appContext, true)); + update(null, MaterialValueHelper.getSecondaryTextColor(service, true)); } private void update(@Nullable Bitmap bitmap, int color) { @@ -119,7 +123,7 @@ public class AppWidgetClassic extends BaseAppWidget { final Bitmap roundedBitmap = createRoundedBitmap(image, imageSize, imageSize, cardRadius, 0, cardRadius, 0); appWidgetView.setImageViewBitmap(R.id.image, roundedBitmap); - pushUpdate(appContext, appWidgetIds, appWidgetView); + pushUpdate(service, appWidgetIds, appWidgetView); } }); } diff --git a/app/src/main/java/com/dkanada/gramophone/widgets/BaseAppWidget.java b/app/src/main/java/com/dkanada/gramophone/widgets/BaseAppWidget.java index bff04849..47a07d1f 100644 --- a/app/src/main/java/com/dkanada/gramophone/widgets/BaseAppWidget.java +++ b/app/src/main/java/com/dkanada/gramophone/widgets/BaseAppWidget.java @@ -16,6 +16,7 @@ import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Build; +import android.util.Log; import android.widget.RemoteViews; import androidx.core.content.res.ResourcesCompat; @@ -25,16 +26,25 @@ import com.dkanada.gramophone.model.Song; import com.dkanada.gramophone.service.MusicService; import com.dkanada.gramophone.util.MusicUtil; +import java.util.Arrays; + public abstract class BaseAppWidget extends AppWidgetProvider { public static final String NAME = "app_widget"; + public int imageSize = 0; + public float cardRadius = 0f; + @Override public void onUpdate(final Context context, final AppWidgetManager appWidgetManager, final int[] appWidgetIds) { + Log.d(NAME, String.format("onUpdate: %s", Arrays.toString(appWidgetIds))); defaultAppWidget(context, appWidgetIds); + final Intent updateIntent = new Intent(MusicService.INTENT_EXTRA_WIDGET_UPDATE); + updateIntent.putExtra(MusicService.INTENT_EXTRA_WIDGET_NAME, NAME); updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); updateIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); + context.sendBroadcast(updateIntent); } @@ -73,25 +83,29 @@ public abstract class BaseAppWidget extends AppWidgetProvider { } } - protected static Bitmap createRoundedBitmap(Drawable drawable, int width, int height, float tl, float tr, float bl, float br) { - if (drawable == null) return null; - - Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - Canvas c = new Canvas(bitmap); - drawable.setBounds(0, 0, width, height); - drawable.draw(c); - + protected static Bitmap createRoundedBitmap(Bitmap bitmap, int width, int height, float tl, float tr, float bl, float br) { Bitmap rounded = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); - Canvas canvas = new Canvas(rounded); Paint paint = new Paint(); + paint.setShader(new BitmapShader(bitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP)); paint.setAntiAlias(true); + canvas.drawPath(composeRoundedRectPath(new RectF(0, 0, width, height), tl, tr, bl, br), paint); return rounded; } + protected static Bitmap createRoundedBitmap(Drawable drawable, int width, int height, float tl, float tr, float bl, float br) { + Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + + drawable.setBounds(0, 0, width, height); + drawable.draw(canvas); + + return createRoundedBitmap(bitmap, width, height, tl, tr, bl, br); + } + protected static Path composeRoundedRectPath(RectF rect, float tl, float tr, float bl, float br) { Path path = new Path(); tl = tl < 0 ? 0 : tl; diff --git a/app/src/main/res/drawable/card.xml b/app/src/main/res/drawable/card.xml index 3983f775..d4bf9eb2 100644 --- a/app/src/main/res/drawable/card.xml +++ b/app/src/main/res/drawable/card.xml @@ -1,45 +1,5 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + diff --git a/app/src/main/res/layout/app_widget_album.xml b/app/src/main/res/layout/app_widget_album.xml index 188cbc08..6abd09de 100644 --- a/app/src/main/res/layout/app_widget_album.xml +++ b/app/src/main/res/layout/app_widget_album.xml @@ -13,6 +13,11 @@ tools:ignore="ContentDescription" tools:src="@drawable/default_album_art" /> + + + android:padding="8dp"> + android:paddingHorizontal="16dp" + android:paddingVertical="8dp"> @@ -76,7 +74,7 @@ android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="center_vertical" + android:gravity="center" android:singleLine="true" android:textAppearance="@style/TextAppearance.AppCompat.Subhead" android:textColor="@color/ate_primary_text_light" @@ -86,8 +84,8 @@ android:id="@+id/text" android:layout_width="match_parent" android:layout_height="wrap_content" - android:gravity="center_vertical" - android:singleLine="true" + android:gravity="center" + android:maxLines="2" android:textAppearance="@style/TextAppearance.AppCompat.Caption" android:textColor="@color/ate_secondary_text_light" tools:text="Text" /> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 84d610f0..96270a1d 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -59,7 +59,7 @@ http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout 250dp 40dp 128dp - 2dp + 4dp 8dp