package me.wcy.music.application;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.support.v4.app.NotificationCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RemoteViews;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import me.wcy.music.R;
import me.wcy.music.activity.SplashActivity;
import me.wcy.music.constants.Extras;
import me.wcy.music.model.Music;
import me.wcy.music.receiver.StatusBarReceiver;
import me.wcy.music.service.PlayService;
import me.wcy.music.utils.CoverLoader;
import me.wcy.music.utils.FileUtils;
/**
* Created by wcy on 2017/4/18.
*/
public class Notifier {
private static final int NOTIFICATION_ID = 0x111;
private static PlayService playService;
private static NotificationManager notificationManager;
public static void init(PlayService playService) {
Notifier.playService = playService;
notificationManager = (NotificationManager) playService.getSystemService(Context.NOTIFICATION_SERVICE);
}
public static void showPlay(Music music) {
playService.startForeground(NOTIFICATION_ID, buildNotification(playService, music, true));
}
public static void showPause(Music music) {
playService.stopForeground(false);
notificationManager.notify(NOTIFICATION_ID, buildNotification(playService, music, false));
}
public static void cancelAll() {
notificationManager.cancelAll();
}
private static Notification buildNotification(Context context, Music music, boolean isPlaying) {
Intent intent = new Intent(context, SplashActivity.class);
intent.putExtra(Extras.EXTRA_NOTIFICATION, true);
intent.setAction(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
.setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.ic_notification)
.setCustomContentView(getRemoteViews(context, music, isPlaying));
return builder.build();
}
private static RemoteViews getRemoteViews(Context context, Music music, boolean isPlaying) {
String title = music.getTitle();
String subtitle = FileUtils.getArtistAndAlbum(music.getArtist(), music.getAlbum());
Bitmap cover = CoverLoader.getInstance().loadThumbnail(music);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.notification);
if (cover != null) {
remoteViews.setImageViewBitmap(R.id.iv_icon, cover);
} else {
remoteViews.setImageViewResource(R.id.iv_icon, R.drawable.ic_launcher);
}
remoteViews.setTextViewText(R.id.tv_title, title);
remoteViews.setTextViewText(R.id.tv_subtitle, subtitle);
boolean isLightNotificationTheme = isLightNotificationTheme(playService);
Intent playIntent = new Intent(StatusBarReceiver.ACTION_STATUS_BAR);
playIntent.putExtra(StatusBarReceiver.EXTRA, StatusBarReceiver.EXTRA_PLAY_PAUSE);
PendingIntent playPendingIntent = PendingIntent.getBroadcast(context, 0, playIntent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setImageViewResource(R.id.iv_play_pause, getPlayIconRes(isLightNotificationTheme, isPlaying));
remoteViews.setOnClickPendingIntent(R.id.iv_play_pause, playPendingIntent);
Intent nextIntent = new Intent(StatusBarReceiver.ACTION_STATUS_BAR);
nextIntent.putExtra(StatusBarReceiver.EXTRA, StatusBarReceiver.EXTRA_NEXT);
PendingIntent nextPendingIntent = PendingIntent.getBroadcast(context, 1, nextIntent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setImageViewResource(R.id.iv_next, getNextIconRes(isLightNotificationTheme));
remoteViews.setOnClickPendingIntent(R.id.iv_next, nextPendingIntent);
return remoteViews;
}
private static int getPlayIconRes(boolean isLightNotificationTheme, boolean isPlaying) {
if (isPlaying) {
return isLightNotificationTheme
? R.drawable.ic_status_bar_pause_dark_selector
: R.drawable.ic_status_bar_pause_light_selector;
} else {
return isLightNotificationTheme
? R.drawable.ic_status_bar_play_dark_selector
: R.drawable.ic_status_bar_play_light_selector;
}
}
private static int getNextIconRes(boolean isLightNotificationTheme) {
return isLightNotificationTheme
? R.drawable.ic_status_bar_next_dark_selector
: R.drawable.ic_status_bar_next_light_selector;
}
private static boolean isLightNotificationTheme(Context context) {
int notificationTextColor = getNotificationTextColor(context);
return isSimilarColor(Color.BLACK, notificationTextColor);
}
private static int getNotificationTextColor(Context context) {
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
Notification notification = builder.build();
RemoteViews remoteViews = notification.contentView;
if (remoteViews == null) {
return Color.BLACK;
}
int layoutId = remoteViews.getLayoutId();
ViewGroup notificationLayout = (ViewGroup) LayoutInflater.from(context).inflate(layoutId, null);
TextView title = (TextView) notificationLayout.findViewById(android.R.id.title);
if (title != null) {
return title.getCurrentTextColor();
} else {
return findTextColor(notificationLayout);
}
}
/**
* 如果通过 android.R.id.title 无法获得 title ,
* 则通过遍历 notification 布局找到 textSize 最大的 TextView ,应该就是 title 了。
*/
private static int findTextColor(ViewGroup notificationLayout) {
List<TextView> textViewList = new ArrayList<>();
findTextView(notificationLayout, textViewList);
float maxTextSize = -1;
TextView maxTextView = null;
for (TextView textView : textViewList) {
if (textView.getTextSize() > maxTextSize) {
maxTextView = textView;
}
}
if (maxTextView != null) {
return maxTextView.getCurrentTextColor();
}
return Color.BLACK;
}
private static void findTextView(View view, List<TextView> textViewList) {
if (view instanceof ViewGroup) {
ViewGroup viewGroup = (ViewGroup) view;
for (int i = 0; i < viewGroup.getChildCount(); i++) {
findTextView(viewGroup.getChildAt(i), textViewList);
}
} else if (view instanceof TextView) {
textViewList.add((TextView) view);
}
}
private static boolean isSimilarColor(int baseColor, int color) {
int simpleBaseColor = baseColor | 0xff000000;
int simpleColor = color | 0xff000000;
int baseRed = Color.red(simpleBaseColor) - Color.red(simpleColor);
int baseGreen = Color.green(simpleBaseColor) - Color.green(simpleColor);
int baseBlue = Color.blue(simpleBaseColor) - Color.blue(simpleColor);
double value = Math.sqrt(baseRed * baseRed + baseGreen * baseGreen + baseBlue * baseBlue);
return value < 180.0;
}
}