package com.wm.remusic.downmusic;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Environment;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;
import android.widget.RemoteViews;
import android.widget.Toast;
import com.squareup.okhttp.OkHttpClient;
import com.wm.remusic.R;
import com.wm.remusic.activity.DownActivity;
import com.wm.remusic.net.HttpUtil;
import com.wm.remusic.provider.DownFileStore;
import com.wm.remusic.uitl.CommonUtils;
import com.wm.remusic.uitl.IConstants;
import com.wm.remusic.uitl.L;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created by wm on 2016/12/13.
*/
public class DownService extends Service {
public static final String ADD_DOWNTASK = "com.wm.remusic.downtaskadd";
public static final String ADD_MULTI_DOWNTASK = "com.wm.remusic.multidowntaskadd";
public static final String CANCLE_DOWNTASK = "com.wm.remusic.cacletask";
public static final String CANCLE_ALL_DOWNTASK = "com.wm.remusic.caclealltask";
public static final String START_ALL_DOWNTASK = "com.wm.remusic.startalltask";
public static final String RESUME_START_DOWNTASK = "com.wm.remusic.resumestarttask";
public static final String PAUSE_TASK = "com.wm.remusic.pausetask";
public static final String PAUSE_ALLTASK = "com.wm.remusic.pausealltask";
public static final String UPDATE_DOWNSTAUS = "com.wm.remusic.updatedown";
public static final String TASK_STARTDOWN = "com.wm.remusic.taskstart";
public static final String TASKS_CHANGED = "com.wm.remusic.taskchanges";
private boolean d = true;
private static final String TAG = "DownService";
private static DownFileStore downFileStore;
private ExecutorService executorService;
private static ArrayList<String> prepareTaskList = new ArrayList<>();
private int downTaskCount = 0;
private int downTaskDownloaded = -1;
private DownloadTask currentTask;
private NotificationManager mNotificationManager;
private Context mContext;
private RemoteViews remoteViews;
private int notificationid = 10;
private boolean isForeground;
private DownloadTaskListener listener = new DownloadTaskListener() {
@Override
public void onPrepare(DownloadTask downloadTask) {
L.D(d, TAG, TAG + " task onPrepare");
}
@Override
public void onStart(DownloadTask downloadTask) {
L.D(d, TAG, TAG + " task onStart");
Intent intent = new Intent(TASK_STARTDOWN);
intent.putExtra("completesize", downloadTask.getCompletedSize());
intent.putExtra("totalsize", downloadTask.getTotalSize());
intent.setPackage(IConstants.PACKAGE);
sendBroadcast(intent);
}
@Override
public void onDownloading(DownloadTask downloadTask) {
// L.D(d,TAG, TAG + " task onDownloading");
Intent intent = new Intent(UPDATE_DOWNSTAUS);
intent.putExtra("completesize", downloadTask.getCompletedSize());
intent.putExtra("totalsize", downloadTask.getTotalSize());
intent.setPackage(IConstants.PACKAGE);
sendBroadcast(intent);
}
@Override
public void onPause(DownloadTask downloadTask) {
L.D(d, TAG, TAG + " task onPause");
sendIntent(TASKS_CHANGED);
if (prepareTaskList.size() > 0) {
if(currentTask != null)
prepareTaskList.remove(currentTask.getId());
}
currentTask = null;
upDateNotification();
startTask();
}
@Override
public void onCancel(DownloadTask downloadTask) {
L.D(d, TAG, TAG + " task onCancel");
sendIntent(TASKS_CHANGED);
if (prepareTaskList.size() > 0) {
if(currentTask != null)
prepareTaskList.remove(currentTask.getId());
}
currentTask = null;
upDateNotification();
startTask();
}
@Override
public void onCompleted(DownloadTask downloadTask) {
sendIntent(TASKS_CHANGED);
L.D(d, TAG, TAG + " task Completed");
if (prepareTaskList.size() > 0) {
if(currentTask != null)
prepareTaskList.remove(currentTask.getId());
}
currentTask = null;
downTaskDownloaded++;
L.D(d, TAG, "complete task and start");
startTask();
}
@Override
public void onError(DownloadTask downloadTask, int errorCode) {
L.D(d, TAG, TAG + " task onError");
startTask();
}
};
public static ArrayList<String> getPrepareTasks() {
return prepareTaskList;
}
@Override
public void onCreate() {
super.onCreate();
L.D(d, TAG, TAG + " oncreate");
mContext = this;
mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
executorService = Executors.newSingleThreadExecutor();
downFileStore = DownFileStore.getInstance(this);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
L.D(d, TAG, TAG + " onstartcommand");
if(intent == null){
mNotificationManager.cancel(notificationid);
}
String action = null;
try {
action = intent.getAction();
} catch (NullPointerException e) {
e.printStackTrace();
}
if (action == null) {
return super.onStartCommand(intent, flags, startId);
}
switch (action) {
case ADD_DOWNTASK:
String name = intent.getStringExtra("name");
String artist = intent.getStringExtra("artist");
String url = intent.getStringExtra("url");
addDownloadTask(name, artist, url);
break;
case ADD_MULTI_DOWNTASK:
String[] names = intent.getStringArrayExtra("names");
String[] artists = intent.getStringArrayExtra("artists");
ArrayList<String> urls = intent.getStringArrayListExtra("urls");
addDownloadTask(names, artists, urls);
break;
case RESUME_START_DOWNTASK:
String taskid = intent.getStringExtra("downloadid");
L.D(d, TAG, "resume task = " + taskid);
resume(taskid);
break;
case PAUSE_TASK:
String taskid1 = intent.getStringExtra("downloadid");
L.D(d, TAG, "pause task = " + taskid1);
pause(taskid1);
break;
case CANCLE_DOWNTASK:
String taskid3 = intent.getStringExtra("downloadid");
L.D(d, TAG, "cancle task = " + taskid3);
cancel(taskid3);
break;
case CANCLE_ALL_DOWNTASK:
if (prepareTaskList.size() > 1) {
prepareTaskList.clear();
if(currentTask != null)
prepareTaskList.add(currentTask.getId());
}
if(currentTask != null)
cancel(currentTask.getId());
downFileStore.deleteDowningTasks();
sendIntent(TASKS_CHANGED);
break;
case START_ALL_DOWNTASK:
String[] ids = downFileStore.getDownLoadedListAllDowningIds();
for (int i = 0; i < ids.length; i++) {
if (!prepareTaskList.contains(ids[i])) {
prepareTaskList.add(ids[i]);
}
}
startTask();
break;
case PAUSE_ALLTASK:
if (prepareTaskList.size() > 1) {
prepareTaskList.clear();
if(currentTask != null)
prepareTaskList.add(currentTask.getId());
}
if(currentTask != null)
pause(currentTask.getId());
break;
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
mNotificationManager.cancel(notificationid);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private String getDownSave() {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/remusic/");
if (!file.exists()) {
boolean r = file.mkdirs();
if (!r) {
Toast.makeText(mContext, "储存卡无法创建文件", Toast.LENGTH_SHORT).show();
return null;
}
return file.getAbsolutePath() + "/";
}
return file.getAbsolutePath() + "/";
} else {
Toast.makeText(mContext, "没有储存卡", Toast.LENGTH_SHORT).show();
return null;
}
}
private void addDownloadTask(String[] names, String[] artists, ArrayList<String> urls) {
L.D(d, TAG, "add task name = " + names + " taskid = " + (urls).hashCode() + " task artsit = " + artists);
int len = urls.size();
for (int i = 0; i < len; i++) {
DownloadDBEntity dbEntity = new DownloadDBEntity((urls.get(i)).hashCode() + "", 0l,
0l, urls.get(i), getDownSave(), names[i], artists[i], DownloadStatus.DOWNLOAD_STATUS_INIT);
downFileStore.insert(dbEntity);
prepareTaskList.add(dbEntity.getDownloadId());
downTaskCount++;
}
Toast.makeText(mContext,"已加入到下载", Toast.LENGTH_SHORT).show();
upDateNotification();
if (currentTask != null) {
L.D(d, TAG, "add task wrong, current task is not null");
return;
}
startTask();
}
private void addDownloadTask(String name, String artist, String url) {
L.D(d, TAG, "add task name = " + name + " taskid = " + (url).hashCode() + " task artsit = " + artist);
DownloadDBEntity dbEntity = new DownloadDBEntity((url).hashCode() + "", 0l,
0l, url, getDownSave(), name, artist, DownloadStatus.DOWNLOAD_STATUS_INIT);
downFileStore.insert(dbEntity);
prepareTaskList.add(dbEntity.getDownloadId());
downTaskCount++;
upDateNotification();
Toast.makeText(mContext,"已加入到下载", Toast.LENGTH_SHORT).show();
if (currentTask != null) {
L.D(d, TAG, "add task wrong, current task is not null");
return;
}
startTask();
}
private void upDateNotification() {
if (currentTask == null) {
return;
}
if (!isForeground) {
startForeground(notificationid, getNotification(false));
isForeground = true;
} else {
mNotificationManager.notify(notificationid, getNotification(false));
}
}
private void cancleNotification() {
L.D(d, TAG, " canclenotification");
stopForeground(true);
isForeground = false;
mNotificationManager.notify(notificationid, getNotification(true));
downTaskCount = 0;
downTaskDownloaded = -1;
}
public void startTask() {
L.D(d, TAG, TAG + " start task task size = " + prepareTaskList.size());
if (currentTask != null) {
L.D(d, TAG, "start task wrong, current task is running");
return;
}
if (prepareTaskList.size() > 0) {
DownloadTask downloadTask = null;
L.D(d, TAG, prepareTaskList.get(0));
DownloadDBEntity entity = downFileStore.getDownLoadedList(prepareTaskList.get(0));
if (entity != null) {
L.D(d, TAG, "entity id = " + entity.getDownloadId());
downloadTask = DownloadTask.parse(entity, mContext);
}
if (downloadTask == null) {
L.D(d, TAG, "can't create downloadtask");
return;
}
L.D(d, TAG, "start task ,task name = " + downloadTask.getFileName() + " taskid = " + downloadTask.getId());
if (downloadTask.getDownloadStatus() != DownloadStatus.DOWNLOAD_STATUS_COMPLETED) {
downloadTask.setDownloadStatus(DownloadStatus.DOWNLOAD_STATUS_PREPARE);
downloadTask.setdownFileStore(downFileStore);
downloadTask.setHttpClient(HttpUtil.mOkHttpClient);
downloadTask.addDownloadListener(listener);
executorService.submit(downloadTask);
currentTask = downloadTask;
upDateNotification();
sendIntent(TASKS_CHANGED);
}
} else {
L.D(d, TAG, " no task");
cancleNotification();
}
}
/**
* if return null,the task does not exist
*
* @param taskId
* @return
*/
public void resume(String taskId) {
downTaskCount++;
prepareTaskList.add(taskId);
upDateNotification();
sendIntent(TASKS_CHANGED);
if (currentTask == null) {
startTask();
}
L.D(d, TAG, "resume task = " + taskId);
}
public void cancel(String taskId) {
if (currentTask != null) {
if (taskId.equals(currentTask.getId())) {
currentTask.cancel();
currentTask.setDownloadStatus(DownloadStatus.DOWNLOAD_STATUS_CANCEL);
}
}
if (prepareTaskList.contains(taskId)) {
downTaskCount--;
prepareTaskList.remove(taskId);
}
if (prepareTaskList.size() == 0) {
currentTask = null;
}
downFileStore.deleteTask(taskId);
upDateNotification();
sendIntent(TASKS_CHANGED);
L.D(d, TAG, "cancle task = " + taskId);
}
public void pause(String taskid) {
downTaskCount--;
if (currentTask != null && taskid.equals(currentTask.getId())) {
currentTask.pause();
}
prepareTaskList.remove(taskid);
if (prepareTaskList.size() == 0) {
currentTask = null;
}
upDateNotification();
sendIntent(TASKS_CHANGED);
}
private Notification getNotification(boolean complete) {
if (downTaskCount == 0) {
downTaskCount = prepareTaskList.size();
}
L.D(d, TAG, "notification downtaskcount = " + downTaskCount);
if (downTaskDownloaded == -1) {
downTaskDownloaded = 0;
}
remoteViews = new RemoteViews(this.getPackageName(), R.layout.down_notification);
PendingIntent pendingIntent = PendingIntent.getActivity(this.getApplicationContext(), 0,
new Intent(this.getApplicationContext(), DownActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
final Intent nowPlayingIntent = new Intent();
nowPlayingIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
nowPlayingIntent.setComponent(new ComponentName("com.wm.remusic", "com.wm.remusic.activity.DownActivity"));
PendingIntent clickIntent = PendingIntent.getActivity(this,0,nowPlayingIntent,PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setImageViewResource(R.id.image, R.drawable.placeholder_disk_210);
if(complete){
remoteViews.setTextViewText(R.id.title, "remusic" );
remoteViews.setTextViewText(R.id.text, "下载完成,点击查看" );
remoteViews.setTextViewText(R.id.time, showDate());
}else {
remoteViews.setTextViewText(R.id.title, "下载进度:" + downTaskDownloaded + "/" + downTaskCount);
remoteViews.setTextViewText(R.id.text, "正在下载:" + currentTask.getFileName());
remoteViews.setTextViewText(R.id.time, showDate());
}
NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setContent(remoteViews)
.setSmallIcon(R.drawable.ic_notification)
.setContentIntent(clickIntent);
if (CommonUtils.isJellyBeanMR1()) {
builder.setShowWhen(false);
}
return builder.build();
}
public static String showDate() {
SimpleDateFormat sDateFormat = new SimpleDateFormat("a hh:mm");
String date = sDateFormat.format(new Date());
return date;
}
private void sendIntent(String action){
Intent intent = new Intent();
intent.setAction(action);
intent.setPackage(IConstants.PACKAGE);
sendBroadcast(intent);
}
}