package com.wm.remusic.fragment; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v7.app.AlertDialog; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.SimpleItemAnimator; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import com.facebook.drawee.view.SimpleDraweeView; import com.wm.remusic.R; import com.wm.remusic.downmusic.DownService; import com.wm.remusic.downmusic.DownloadDBEntity; import com.wm.remusic.provider.DownFileStore; import com.wm.remusic.uitl.IConstants; import com.wm.remusic.uitl.L; import java.util.ArrayList; /** * Created by wm on 2016/5/17. */ public class DownFragment extends Fragment { private LinearLayout allStart, allStop, clear; private ArrayList<DownloadDBEntity> mList = new ArrayList<>(); private RecyclerView recyclerView; private LinearLayoutManager layoutManager; private DownLoadAdapter adapter; private DownFileStore downFileStore; private DownStatus downStatus; private int downPosition = -1; private String TAG = "DownFragment"; private boolean d = true; public Activity mContext; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_down, container, false); allStart = (LinearLayout) view.findViewById(R.id.down_start_all); allStop = (LinearLayout) view.findViewById(R.id.down_pause_all); clear = (LinearLayout) view.findViewById(R.id.down_clear_all); setListener(); recyclerView = (RecyclerView) view.findViewById(R.id.recyclerview); recyclerView.setHasFixedSize(true); layoutManager = new LinearLayoutManager(mContext); recyclerView.setLayoutManager(layoutManager); adapter = new DownLoadAdapter(null, null); recyclerView.setAdapter(adapter); ((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); reload(); return view; } @Override public void onAttach(Activity activity){ super.onAttach(activity); this.mContext = activity; } @Override public void onStart() { super.onStart(); downStatus = new DownStatus(); IntentFilter f = new IntentFilter(); f.addAction(DownService.TASK_STARTDOWN); f.addAction(DownService.UPDATE_DOWNSTAUS); f.addAction(DownService.TASKS_CHANGED); mContext.registerReceiver(downStatus, new IntentFilter(f)); } @Override public void onStop() { super.onStop(); mContext.unregisterReceiver(downStatus); } private void reload() { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { downFileStore = DownFileStore.getInstance(mContext); mList = downFileStore.getDownLoadedListAllDowning(); L.D(d, TAG, " mlist size = " + mList.size()); return null; } @Override protected void onPostExecute(Void aVoid) { adapter.update(mList, DownService.getPrepareTasks()); } }.execute(); } private void setListener() { allStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(DownService.START_ALL_DOWNTASK); intent.setPackage(IConstants.PACKAGE); mContext.startService(intent); } }); allStop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(DownService.PAUSE_ALLTASK); intent.setPackage(IConstants.PACKAGE); mContext.startService(intent); } }); clear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(DownService.CANCLE_ALL_DOWNTASK); intent.setPackage(IConstants.PACKAGE); mContext.startService(intent); } }); } class DownLoadAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private ArrayList mList; private ArrayList<String> currentTaskList; private long completed = 0; private long totalsize = -1; public DownLoadAdapter(ArrayList list, ArrayList<String> currentTaskList) { mList = list; this.currentTaskList = currentTaskList; } public void update(ArrayList list, ArrayList<String> currentTaskList) { mList = list; this.currentTaskList = currentTaskList; completed = 0; totalsize = -1; notifyDataSetChanged(); } public void notifyItem(long completed, long total) { // L.D(d,TAG," comleted = " + completed + " total = " + total); this.completed = completed; if (total != -1) this.totalsize = total; notifyItemChanged(downPosition); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new ItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_down_item, parent, false)); } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { boolean isCurrent = false; boolean isPreparing = false; final DownloadDBEntity task = (DownloadDBEntity) mList.get(position); ((ItemViewHolder) holder).title.setText(task.getFileName()); if (currentTaskList.size() > 0) { L.D(d, TAG, "currentlist size = " + currentTaskList.size()); isCurrent = currentTaskList.get(0).equals(task.getDownloadId()); if (isCurrent) { downPosition = position; } if (currentTaskList.contains(task.getDownloadId())) { isPreparing = true; } } // L.D(d,TAG,"isCurrent = " + isCurrent + " isPreparing = " + isPreparing); if (isCurrent) { completed = completed > task.getCompletedSize() ? completed : task.getCompletedSize(); totalsize = totalsize > task.getTotalSize() ? totalsize : task.getTotalSize(); if (completed == 0 || totalsize == -1) { ((ItemViewHolder) holder).count.setText("正在计算大小文件大小"); ((ItemViewHolder) holder).progressBar.setVisibility(View.GONE); } else { ((ItemViewHolder) holder).count.setText((float) (Math.round((float) completed / (1024 * 1024) * 10)) / 10 + "M/" + (float) (Math.round((float) totalsize / (1024 * 1024) * 10)) / 10 + "M"); if (((ItemViewHolder) holder).progressBar.getVisibility() != View.VISIBLE) ((ItemViewHolder) holder).progressBar.setVisibility(View.VISIBLE); if (totalsize > 0) ((ItemViewHolder) holder).progressBar.setProgress((int) (100 * completed / totalsize)); } } else if (isPreparing) { ((ItemViewHolder) holder).progressBar.setVisibility(View.GONE); ((ItemViewHolder) holder).count.setText(task.getArtist() + "-" + task.getFileName()); } else { ((ItemViewHolder) holder).progressBar.setVisibility(View.GONE); ((ItemViewHolder) holder).count.setText("已经暂停,点击继续下载"); } final boolean isPreparing1 = isPreparing; ((ItemViewHolder) holder).itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (isPreparing1) { L.D(d, TAG, "isprepaing"); Intent intent = new Intent(DownService.PAUSE_TASK); intent.setPackage(IConstants.PACKAGE); intent.putExtra("downloadid", task.getDownloadId()); mContext.startService(intent); } else { L.D(d, TAG, "not isprepaing"); Intent intent = new Intent(DownService.RESUME_START_DOWNTASK); intent.setPackage(IConstants.PACKAGE); intent.putExtra("downloadid", task.getDownloadId()); mContext.startService(intent); } } }); ((ItemViewHolder) holder).clear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new AlertDialog.Builder(mContext).setTitle("要清除下载吗") .setPositiveButton(mContext.getString(R.string.sure), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent(DownService.CANCLE_DOWNTASK); intent.putExtra("downloadid", task.getDownloadId()); intent.setPackage(IConstants.PACKAGE); mContext.startService(intent); dialog.dismiss(); } }) .setNegativeButton(mContext.getString(R.string.cancel), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }).show(); } }); } @Override public int getItemCount() { return mList == null ? 0 : mList.size(); } class ItemViewHolder extends RecyclerView.ViewHolder { SimpleDraweeView draweeView; ImageView downloaded, clear; TextView title, count, artist; ProgressBar progressBar; public ItemViewHolder(View itemView) { super(itemView); draweeView = (SimpleDraweeView) itemView.findViewById(R.id.down_img); title = (TextView) itemView.findViewById(R.id.down_top_text); count = (TextView) itemView.findViewById(R.id.down_count); clear = (ImageView) itemView.findViewById(R.id.down_single_clear); artist = (TextView) itemView.findViewById(R.id.down_artist); downloaded = (ImageView) itemView.findViewById(R.id.downloaded); progressBar = (ProgressBar) itemView.findViewById(R.id.down_progress); progressBar.setMax(100); clear.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { } }); } } } private class DownStatus extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); switch (action) { case DownService.UPDATE_DOWNSTAUS: adapter.notifyItem(intent.getLongExtra("completesize", 0), intent.getLongExtra("totalsize", -1)); break; case DownService.TASK_STARTDOWN: adapter.notifyItem(intent.getLongExtra("completesize", 0), intent.getLongExtra("totalsize", -1)); break; case DownService.TASKS_CHANGED: reload(); break; } } } }