package com.wm.remusic.widget; 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.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.support.annotation.Nullable; import android.util.Log; import android.widget.RemoteViews; import com.facebook.common.executors.CallerThreadExecutor; import com.facebook.common.references.CloseableReference; import com.facebook.datasource.DataSource; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.imagepipeline.core.ImagePipeline; import com.facebook.imagepipeline.datasource.BaseBitmapDataSubscriber; import com.facebook.imagepipeline.image.CloseableImage; import com.facebook.imagepipeline.request.ImageRequest; import com.facebook.imagepipeline.request.ImageRequestBuilder; import com.wm.remusic.R; import com.wm.remusic.info.MusicInfo; import com.wm.remusic.provider.PlaylistsManager; import com.wm.remusic.service.MediaService; import com.wm.remusic.service.MusicPlayer; import com.wm.remusic.uitl.IConstants; import com.wm.remusic.uitl.ImageUtils; import java.util.HashMap; public class SimpleWidgetProvider extends AppWidgetProvider { private SimpleWidgetProvider mProvider = null; private boolean mStop = true; private static String art,trackname ,albumuri; private static boolean isTrackLocal = true; private static Bitmap noBit; private static boolean isFav ,isPlaying; private static long currentId = -1; private static long position,duration; private static HashMap<String, Bitmap> albumMap = new HashMap<>(); //储存专辑封面的图片 private static boolean isInUse; private String TAG = SimpleWidgetProvider.class.getSimpleName(); private PendingIntent getPendingIntent(Context context, int buttonId) { Intent intent = new Intent(); intent.setClass(context, SimpleWidgetProvider.class); intent.addCategory(Intent.CATEGORY_ALTERNATIVE); intent.setData(Uri.parse("harvic:" + buttonId)); PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); return pi; } // 更新所有的 widget private synchronized void pushUpdate(final Context context,AppWidgetManager appWidgetManager ,boolean updateProgress) { pushAction(context,MediaService.SEND_PROGRESS); RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.simple_control_widget_layout); //将按钮与点击事件绑定 remoteView.setOnClickPendingIntent(R.id.widget_play,getPendingIntent(context, R.id.widget_play)); remoteView.setOnClickPendingIntent(R.id.widget_pre, getPendingIntent(context, R.id.widget_pre)); remoteView.setOnClickPendingIntent(R.id.widget_next, getPendingIntent(context, R.id.widget_next)); remoteView.setOnClickPendingIntent(R.id.widget_love, getPendingIntent(context, R.id.widget_love)); remoteView.setTextViewText(R.id.widget_content,trackname == null && art == null ? "" : trackname + "-" + art); remoteView.setProgressBar(R.id.widget_progress, (int) duration,(int) position,false); isFav = false; long[] favlists = PlaylistsManager.getInstance(context).getPlaylistIds(IConstants.FAV_PLAYLIST); for(long i : favlists){ if(currentId == i){ isFav = true; break; } } if (isFav) { remoteView.setImageViewResource(R.id.widget_love,R.drawable.widget_unstar_selector); } else { remoteView.setImageViewResource(R.id.widget_love,R.drawable.widget_star_selector); } if(isPlaying){ remoteView.setImageViewResource(R.id.widget_play,R.drawable.widget_pause_selector); }else { remoteView.setImageViewResource(R.id.widget_play,R.drawable.widget_play_selector); } if(updateProgress){ if(albumuri == null){ remoteView.setImageViewResource(R.id.widget_image, R.drawable.placeholder_disk_210); }else { if(isTrackLocal){ Bitmap bitmap = ImageUtils.getArtworkQuick(context, Uri.parse(albumuri), 160, 160); if (bitmap != null) { remoteView.setImageViewBitmap(R.id.widget_image, bitmap); }else { remoteView.setImageViewResource(R.id.widget_image, R.drawable.placeholder_disk_210); } }else { Bitmap bitmap = albumMap.get(albumuri); if(bitmap != null) remoteView.setImageViewBitmap(R.id.widget_image,bitmap); } } }else { if(albumuri == null){ remoteView.setImageViewResource(R.id.widget_image, R.drawable.placeholder_disk_210); }else { if(isTrackLocal){ final Bitmap bitmap = ImageUtils.getArtworkQuick(context, Uri.parse(albumuri), 160, 160); if (bitmap != null) { remoteView.setImageViewBitmap(R.id.widget_image, bitmap); }else { remoteView.setImageViewResource(R.id.widget_image, R.drawable.placeholder_disk_210); } albumMap.clear(); }else { if (albumMap.get(albumuri) != null) { remoteView.setImageViewBitmap(R.id.widget_image, albumMap.get(albumuri)); //noBit = null; } else { Uri uri = Uri.parse(albumuri); if(uri == null){ noBit = BitmapFactory.decodeResource(context.getResources(), R.drawable.placeholder_disk_210); albumMap.put(albumuri,noBit); pushUpdate(context,AppWidgetManager.getInstance(context),false); }else { ImageRequest imageRequest = ImageRequestBuilder .newBuilderWithSource(uri) .setProgressiveRenderingEnabled(true) .build(); ImagePipeline imagePipeline = Fresco.getImagePipeline(); DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline.fetchDecodedImage(imageRequest, this); dataSource.subscribe(new BaseBitmapDataSubscriber() { @Override public void onNewResultImpl(@Nullable Bitmap bitmap) { // You can use the bitmap in only limited ways // No need to do any cleanup. if (bitmap != null) { noBit = bitmap.copy(bitmap.getConfig(),true); albumMap.put(albumuri,noBit); } pushUpdate(context,AppWidgetManager.getInstance(context),false); } @Override public void onFailureImpl(DataSource dataSource) { // No cleanup required here. noBit = BitmapFactory.decodeResource(context.getResources(), R.drawable.placeholder_disk_210); albumMap.put(albumuri,noBit); pushUpdate(context,AppWidgetManager.getInstance(context), false); } }, CallerThreadExecutor.getInstance()); } } } } } // 相当于获得所有本程序创建的appwidget ComponentName componentName = new ComponentName(context,SimpleWidgetProvider.class); appWidgetManager.updateAppWidget(componentName, remoteView); } public void onEnabled(Context context) { Log.e(TAG,"onenabled = " + isInUse); super.onEnabled(context); isInUse = true; Log.e(TAG,"onenabled = " + isInUse); } //当最后一个该Widget删除是调用该方法,注意是最后一个 public void onDisabled(Context context) { Log.e(TAG,"ondisable = " + isInUse); super.onDisabled(context); isInUse = false; Log.e(TAG,"ondisable = " + isInUse); } @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { Log.e(TAG,"update = " + isInUse); if(isInUse) pushUpdate(context,appWidgetManager ,false); } @Override public void onDeleted(Context context, int[] appWidgetIds) { super.onDeleted(context, appWidgetIds); albumMap.clear(); } // 接收广播的回调函数 @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (AppWidgetManager.ACTION_APPWIDGET_ENABLED.equals(action)) { this.onEnabled(context); } else if (AppWidgetManager.ACTION_APPWIDGET_DISABLED.equals(action)) { this.onDisabled(context); } Log.e(TAG,"action = " + action); if(!isInUse){ return; } if (intent.hasCategory(Intent.CATEGORY_ALTERNATIVE)) { Uri data = intent.getData(); int buttonId = Integer.parseInt(data.getSchemeSpecificPart()); switch (buttonId) { case R.id.widget_play: pushAction(context, MediaService.TOGGLEPAUSE_ACTION); break; case R.id.widget_pre: pushAction(context, MediaService.PREVIOUS_ACTION); break; case R.id.widget_next: pushAction(context, MediaService.NEXT_ACTION); break; case R.id.widget_love: long[] favlists = PlaylistsManager.getInstance(context).getPlaylistIds(IConstants.FAV_PLAYLIST); for(long i : favlists){ if(currentId == i){ isFav = true; break; } } if (isFav) { PlaylistsManager.getInstance(context).removeItem(context, IConstants.FAV_PLAYLIST, MusicPlayer.getCurrentAudioId()); isFav = false; } else { try { MusicInfo info = MusicPlayer.getPlayinfos().get(MusicPlayer.getCurrentAudioId()); PlaylistsManager.getInstance(context).insertMusic(context,IConstants.FAV_PLAYLIST,info); } catch (Exception e) { e.printStackTrace(); } isFav = true; } pushUpdate(context,AppWidgetManager.getInstance(context) ,true); break; } } else if(action.equals(MediaService.META_CHANGED)){ isPlaying = intent.getBooleanExtra("playing",false); pushUpdate(context,AppWidgetManager.getInstance(context) ,false); } else if(action.equals(MediaService.SEND_PROGRESS)){ Log.e("widget"," " + duration + " " + position); duration = intent.getLongExtra("duration",0); position = intent.getLongExtra("position",0); pushUpdate(context,AppWidgetManager.getInstance(context) ,true); } else if(action.equals(MediaService.MUSIC_CHANGED)){ trackname = intent.getStringExtra("track"); art = intent.getStringExtra("artist"); albumuri = intent.getStringExtra("albumuri"); isTrackLocal = intent.getBooleanExtra("islocal",true); currentId = intent.getLongExtra("id",-1); isPlaying = intent.getBooleanExtra("playing",false); Log.e("harvic","art = " + art + " trackname = " + trackname); pushUpdate(context,AppWidgetManager.getInstance(context) ,false); } super.onReceive(context, intent); } private void pushAction(Context context, String ACTION) { Log.e("widget","action = " + ACTION); Intent startIntent = new Intent(context,MediaService.class); startIntent.setAction(ACTION); context.startService(startIntent); } }