PlayerAndroid/app/src/main/java/code/name/monkey/retromusic/appwidgets/base/BaseAppWidget.java

163 lines
5.8 KiB
Java

package code.name.monkey.retromusic.appwidgets.base;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
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.os.Build;
import android.text.TextUtils;
import android.widget.RemoteViews;
import code.name.monkey.retromusic.Constants;
import code.name.monkey.retromusic.R;
import code.name.monkey.retromusic.model.Song;
import code.name.monkey.retromusic.service.MusicService;
public abstract class BaseAppWidget extends AppWidgetProvider {
public static final String NAME = "app_widget";
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);
drawable.setBounds(0, 0, c.getWidth(), c.getHeight());
drawable.draw(c);
return bitmap;
}
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);
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 Path composeRoundedRectPath(RectF rect, float tl, float tr, float bl, float br) {
Path path = new Path();
tl = tl < 0 ? 0 : tl;
tr = tr < 0 ? 0 : tr;
bl = bl < 0 ? 0 : bl;
br = br < 0 ? 0 : br;
path.moveTo(rect.left + tl, rect.top);
path.lineTo(rect.right - tr, rect.top);
path.quadTo(rect.right, rect.top, rect.right, rect.top + tr);
path.lineTo(rect.right, rect.bottom - br);
path.quadTo(rect.right, rect.bottom, rect.right - br, rect.bottom);
path.lineTo(rect.left + bl, rect.bottom);
path.quadTo(rect.left, rect.bottom, rect.left, rect.bottom - bl);
path.lineTo(rect.left, rect.top + tl);
path.quadTo(rect.left, rect.top, rect.left + tl, rect.top);
path.close();
return path;
}
/**
* {@inheritDoc}
*/
@Override
public void onUpdate(final Context context, final AppWidgetManager appWidgetManager,
final int[] appWidgetIds) {
defaultAppWidget(context, appWidgetIds);
final Intent updateIntent = new Intent(Constants.APP_WIDGET_UPDATE);
updateIntent.putExtra(Constants.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 (Constants.META_CHANGED.equals(what) || Constants.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);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
return PendingIntent.getForegroundService(context, 0, intent, 0);
} else {
return PendingIntent.getService(context, 0, intent, 0);
}
}
abstract protected void defaultAppWidget(final Context context, final int[] appWidgetIds);
abstract public void performUpdate(final MusicService service, final int[] appWidgetIds);
protected Drawable getAlbumArtDrawable(final Resources resources, final Bitmap bitmap) {
Drawable image;
if (bitmap == null) {
image = resources.getDrawable(R.drawable.default_album_art);
} else {
image = new BitmapDrawable(resources, bitmap);
}
return image;
}
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();
}
}