package com.gh.gamecenter.download; import android.content.Context; import android.os.Message; import android.support.v4.util.ArrayMap; import android.support.v7.widget.CardView; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.gh.common.constant.Constants; import com.gh.common.util.DataUtils; import com.gh.common.util.DialogUtils; import com.gh.common.util.FileUtils; import com.gh.common.util.ImageUtils; import com.gh.common.util.PackageUtils; import com.gh.common.util.PlatformUtils; import com.gh.common.util.SpeedUtils; import com.gh.download.DownloadEntry; import com.gh.download.DownloadManager; import com.gh.download.DownloadStatus; import com.gh.gamecenter.MainActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.eventbus.EBDownloadChanged; import com.gh.gamecenter.eventbus.EBDownloadDelete; import com.gh.gamecenter.manager.PackageManager; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import de.greenrobot.event.EventBus; /** * Created by LGT on 2016/8/15. */ public class DownloadAdapter extends RecyclerView.Adapter { private Context context; private RecyclerView downloadmanager_rv_show; private LinearLayout downloadmanager_tv_none; private List downloadingList; private List doneList; private ArrayMap locationMap; private ArrayMap statusMap; private ArrayList deleteList; public DownloadAdapter(Context context, RecyclerView recyclerView, LinearLayout textView, ArrayMap lMap, ArrayMap sMap, ArrayList dList) { this.context = context; downloadmanager_rv_show = recyclerView; downloadmanager_tv_none = textView; locationMap = lMap; statusMap = sMap; deleteList = dList; downloadingList = new ArrayList<>(); doneList = new ArrayList<>(); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == 0) { View view = LayoutInflater.from(parent.getContext()).inflate( R.layout.downloadmanager_item_head, parent, false); return new HeadViewHolder(view); } else { View view = LayoutInflater.from(parent.getContext()).inflate( R.layout.fm_downloadmanager_item, parent, false); return new DownloadViewHolder(view); } } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { if (holder instanceof DownloadViewHolder) { final DownloadViewHolder viewHolder = (DownloadViewHolder) holder; final DownloadEntry entry; if (doneList.size() != 0 && position > 0 && position <= doneList.size()) { entry = doneList.get(position - 1); } else if (doneList.isEmpty()) { entry = downloadingList.get(position - 1); } else { entry = downloadingList.get(position - doneList.size() - 2); } String icon = entry.getMeta().get("icon"); if (!TextUtils.isEmpty(icon)) { ImageUtils.getInstance(context).display(icon, viewHolder.dm_item_iv_icon); } else { viewHolder.dm_item_iv_icon.setImageResource(R.drawable.logo); } if (entry.getName().contains("光环助手") || "local_plugin".equals(entry.getMeta().get("platform"))) { viewHolder.dm_item_tv_title.setText(entry.getName()); } else { String platform = entry.getMeta().get("platform"); if ("local_plugin".equals(platform)) { viewHolder.dm_item_tv_title.setText(entry.getName()); } else { platform = PlatformUtils.getInstance(context).getPlatformName(platform); if (platform == null) { viewHolder.dm_item_tv_title.setText(entry.getName()); } else { viewHolder.dm_item_tv_title.setText(entry.getName() + " - " + platform); } } } DownloadStatus status = entry.getStatus(); if (status.equals(DownloadStatus.done)) { LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); viewHolder.dm_item_tv_downloads.setLayoutParams(lparams); viewHolder.dm_item_tv_downloads.setTextColor(0xFF9A9A9A); viewHolder.dm_item_tv_downloads.setText("下载完成"); viewHolder.dm_item_iv_delete.setVisibility(View.VISIBLE); viewHolder.dm_item_tv_startorpause.setBackgroundResource(R.drawable.game_item_btn_download_style); if (entry.getMeta().get("isPlugin") != null && PackageManager.isInstalled(entry.getMeta().get("package_name"))) { viewHolder.dm_item_tv_startorpause.setText("插件化"); viewHolder.dm_item_tv_startorpause.setBackgroundResource(R.drawable.game_item_btn_plugin_style); } else { viewHolder.dm_item_tv_startorpause.setText("安装"); viewHolder.dm_item_tv_startorpause.setBackgroundResource(R.drawable.game_item_btn_download_style); } viewHolder.dm_item_tv_speed.setText("100%"); } else if (status.equals(DownloadStatus.downloading)) { if (!"pause".equals(statusMap.get(entry.getUrl()))) { LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( 0, LinearLayout.LayoutParams.WRAP_CONTENT); lparams.weight = 4; viewHolder.dm_item_tv_downloads.setLayoutParams(lparams); viewHolder.dm_item_tv_downloads.setTextColor(context.getResources().getColor(R.color.theme)); viewHolder.dm_item_tv_downloads.setText(String.format("%s(剩%s)", SpeedUtils.getSpeed(entry.getSpeed()), SpeedUtils.getRemainTime(entry.getSize(), entry.getProgress(), entry.getSpeed() * 1024))); viewHolder.dm_item_iv_delete.setVisibility(View.GONE); viewHolder.dm_item_tv_startorpause.setBackgroundResource(R.drawable.game_item_btn_pause_style); viewHolder.dm_item_tv_startorpause.setText("暂停"); viewHolder.dm_item_tv_speed.setText(entry.getPercent() + "%"); } } else if (status.equals(DownloadStatus.waiting)) { LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); viewHolder.dm_item_tv_downloads.setLayoutParams(lparams); viewHolder.dm_item_tv_downloads.setTextColor(0xFF9A9A9A); viewHolder.dm_item_tv_downloads.setText("等待中"); viewHolder.dm_item_iv_delete.setVisibility(View.VISIBLE); viewHolder.dm_item_tv_startorpause.setBackgroundResource(R.drawable.game_item_btn_pause_style); viewHolder.dm_item_tv_startorpause.setText("等待"); viewHolder.dm_item_tv_speed.setText(entry.getPercent() + "%"); } else if (status.equals(DownloadStatus.pause) || status.equals(DownloadStatus.timeout) || status.equals(DownloadStatus.neterror)) { LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); viewHolder.dm_item_tv_downloads.setLayoutParams(lparams); viewHolder.dm_item_tv_downloads.setTextColor(0xFF9A9A9A); viewHolder.dm_item_tv_downloads.setText("已暂停"); viewHolder.dm_item_iv_delete.setVisibility(View.VISIBLE); viewHolder.dm_item_tv_startorpause.setBackgroundResource(R.drawable.game_item_btn_download_style); viewHolder.dm_item_tv_startorpause.setText("继续"); viewHolder.dm_item_tv_speed.setText(entry.getPercent() + "%"); } viewHolder.dm_item_progressbar.setProgress((int) (entry.getPercent() * 10)); viewHolder.dm_item_tv_startorpause.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String str = ((TextView)v).getText().toString(); String url = entry.getUrl(); DownloadManager.getInstance(context).put(url, System.currentTimeMillis()); if ("继续".equals(str) || "下载".equals(str)) { LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( 0, LinearLayout.LayoutParams.WRAP_CONTENT); lparams.weight = 4; viewHolder.dm_item_tv_downloads.setLayoutParams(lparams); viewHolder.dm_item_tv_downloads.setTextColor(context.getResources().getColor(R.color.theme)); viewHolder.dm_item_tv_downloads.setText(String.format("%s(剩%s)", SpeedUtils.getSpeed(entry.getSpeed()), SpeedUtils.getRemainTime(entry.getSize(), entry.getProgress(), entry.getSpeed() * 1024))); viewHolder.dm_item_iv_delete.setVisibility(View.GONE); viewHolder.dm_item_tv_startorpause.setBackgroundResource(R.drawable.game_item_btn_pause_style); viewHolder.dm_item_tv_startorpause.setText("暂停"); statusMap.put(url, "downloading"); notifyItemChanged(doneList.isEmpty() ? 0 : 1 + doneList.size()); Message msg = Message.obtain(); msg.what = Constants.CONTINUE_DOWNLOAD_TASK; msg.obj = url; DownloadManager.getInstance(context).sendMessageDelayed(msg, 1000); } else if ("安装".equals(str)) { final String path = entry.getPath(); if (entry.getMeta().get("isPlugin") != null) { Map kv6 = new HashMap(); kv6.put("操作", "点击安装完成"); DataUtils.onEvent(context, "插件化", entry.getName(), kv6); } if (FileUtils.isEmptyFile(path)) { Toast.makeText(context, "解析包错误", Toast.LENGTH_SHORT).show(); } else { if (entry.getName().contains("光环助手")) { context.startActivity(PackageUtils.getInstallIntent(path)); } else { PackageManager manager = new PackageManager(context); if (manager.launchSetup(path)) { context.startActivity(PackageUtils.getInstallIntent(path)); } else { DialogUtils.showPluginDialog(context, new DialogUtils.ConfiremListener() { @Override public void onConfirem() { MainActivity.uninstallMap.put(PackageUtils.getPackageNameByPath(context, path), path); context.startActivity(PackageUtils.getUninstallIntent(context, path)); } }, null); } } } } else if ("插件化".equals(str)) { showPluginDialog(entry.getPath()); } else if ("暂停".equals(str)) { viewHolder.dm_item_tv_startorpause.setBackgroundResource(R.drawable.game_item_btn_download_style); viewHolder.dm_item_tv_startorpause.setText("继续"); LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); viewHolder.dm_item_tv_downloads.setLayoutParams(lparams); viewHolder.dm_item_tv_downloads.setTextColor(0xFF9A9A9A); viewHolder.dm_item_tv_downloads.setText("已暂停"); viewHolder.dm_item_iv_delete.setVisibility(View.VISIBLE); statusMap.put(url, "pause"); notifyItemChanged(doneList.isEmpty() ? 0 : 1 + doneList.size()); Message msg = Message.obtain(); msg.what = Constants.PAUSE_DOWNLOAD_TASK; msg.obj = url; DownloadManager.getInstance(context).sendMessageDelayed(msg, 1000); } else if ("等待".equals(str)) { Toast.makeText(context, "最多只能同时启动3个下载任务", Toast.LENGTH_SHORT).show(); } else if ("启动".equals(str)) { Map kv = new HashMap(); kv.put("版本", entry.getMeta().get("platform")); DataUtils.onEvent(context, "游戏启动", entry.getName(), kv); PackageUtils.launchApplicationByPackageName(context, entry.getMeta().get("packageName")); } } }); viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (viewHolder.dm_item_iv_delete.getVisibility() == View.VISIBLE) { showDeleteDialog(entry, position); } } }); viewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { if (viewHolder.dm_item_iv_delete.getVisibility() == View.VISIBLE) { showDeleteDialog(entry, position); return true; } return false; } }); } else if (holder instanceof HeadViewHolder) { final HeadViewHolder viewHolder = (HeadViewHolder) holder; if (position == 0 && doneList.size() != 0) { viewHolder.dm_item_head_tv_task.setText("已完成"); viewHolder.dm_item_head_tv_allstart.setVisibility(View.GONE); } else { viewHolder.dm_item_head_tv_task.setText("下载中"); viewHolder.dm_item_head_tv_allstart.setVisibility(View.VISIBLE); int dlNumber = 0; int wtNumber = 0; for (int i = 0, size = downloadingList.size(); i < size; i++) { if (DownloadStatus.downloading.equals(downloadingList.get(i).getStatus())) { dlNumber++; } else if (DownloadStatus.waiting.equals(downloadingList.get(i).getStatus())) { wtNumber++; } } if ((dlNumber + wtNumber) != downloadingList.size()) { viewHolder.dm_item_head_tv_allstart.setText("全部开始"); viewHolder.dm_item_head_tv_allstart.setTextColor(context.getResources().getColor(R.color.theme)); } else { viewHolder.dm_item_head_tv_allstart.setText("全部暂停"); viewHolder.dm_item_head_tv_allstart.setTextColor(context.getResources().getColor(R.color.btn_gray)); } viewHolder.dm_item_head_tv_allstart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String str = ((TextView)v).getText().toString(); int base = (doneList.isEmpty() ? 0 : 1 + doneList.size()) + 1; if ("全部开始".equals(str)) { for (int i = 0, size = downloadingList.size(); i < size; i++) { View view = downloadmanager_rv_show.getChildAt(base + i); if (view != null && view instanceof CardView) { TextView tv = (TextView) view.findViewById(R.id.dm_item_tv_startorpause); if (tv.getText().toString().equals("继续")) { tv.performClick(); } } else { DownloadManager.getInstance(context).put(downloadingList.get(i).getUrl(), System.currentTimeMillis()); Message msg = Message.obtain(); msg.what = Constants.CONTINUE_DOWNLOAD_TASK; msg.obj = downloadingList.get(i).getUrl(); DownloadManager.getInstance(context).sendMessageDelayed(msg, 1000); statusMap.put(downloadingList.get(i).getUrl(), "downloading"); } } viewHolder.dm_item_head_tv_allstart.setText("全部暂停"); viewHolder.dm_item_head_tv_allstart.setTextColor(context.getResources().getColor(R.color.btn_gray)); } else { for (int i = 0, size = downloadingList.size(); i < size; i++) { View view = downloadmanager_rv_show.getChildAt(base + i); if (view != null && view instanceof CardView) { TextView tv = (TextView) view.findViewById(R.id.dm_item_tv_startorpause); if (tv.getText().toString().equals("暂停")) { tv.performClick(); } else if (tv.getText().toString().equals("等待")) { DownloadManager.getInstance(context).pause(downloadingList.get(i).getUrl()); } } else { DownloadManager.getInstance(context).put(downloadingList.get(i).getUrl(), System.currentTimeMillis()); Message msg = Message.obtain(); msg.what = Constants.PAUSE_DOWNLOAD_TASK; msg.obj = downloadingList.get(i).getUrl(); DownloadManager.getInstance(context).sendMessageDelayed(msg, 1000); } } viewHolder.dm_item_head_tv_allstart.setText("全部开始"); viewHolder.dm_item_head_tv_allstart.setTextColor(context.getResources().getColor(R.color.theme)); } } }); } } } @Override public int getItemCount() { if (doneList.isEmpty() && downloadingList.isEmpty()) { return 0; } if (doneList.isEmpty()) { return 1 + downloadingList.size(); } if (downloadingList.isEmpty()) { return 1 + doneList.size(); } return 1 + doneList.size() + 1 + downloadingList.size(); } @Override public int getItemViewType(int position) { if (position == 0 || (doneList.size() > 0 && position == 1 + doneList.size())) { return 0; } return 1; } // 显示插件化 public void showPluginDialog(final String path) { DialogUtils.showPluginDialog(context, new DialogUtils.ConfiremListener() { @Override public void onConfirem() { for (DownloadEntry downloadEntry : DownloadManager.getInstance(context).getAll()) { if (downloadEntry.getMeta().get("isPlugin") != null && downloadEntry.getPath().equals(path)) { Map kv6 = new HashMap(); kv6.put("操作", "点击插件化安装完成"); DataUtils.onEvent(context, "插件化", downloadEntry.getName(), kv6); break; } } if (FileUtils.isEmptyFile(path)) { Toast.makeText(context, "解析包错误", Toast.LENGTH_SHORT).show(); } else { MainActivity.uninstallMap.put(PackageUtils.getPackageNameByPath(context, path), path); context.startActivity(PackageUtils.getUninstallIntent(context, path)); } } }, null); } // 显示删除提示框 private void showDeleteDialog(final DownloadEntry entry, final int position) { DialogUtils.showWarningDialog(context, "游戏还没下载或安装,确定删除?", new DialogUtils.ConfiremListener() { @Override public void onConfirem() { if (doneList.size() != 0 && position > 0 && position <= doneList.size()) { doneList.remove(position - 1); } else if (doneList.isEmpty()) { downloadingList.remove(position - 1); } else { downloadingList.remove(position - doneList.size() - 2); } if (doneList.isEmpty() && downloadingList.isEmpty()) { EventBus.getDefault().post(new EBDownloadChanged("download", View.GONE, 0)); locationMap.clear(); notifyDataSetChanged(); if (downloadmanager_tv_none.getVisibility() == View.GONE) { downloadmanager_tv_none.setVisibility(View.VISIBLE); } } else if (doneList.isEmpty()) { EventBus.getDefault().post(new EBDownloadChanged("download", View.VISIBLE, doneList.size() + downloadingList.size())); notifyItemRangeRemoved(0, 2); } else if (downloadingList.isEmpty()) { EventBus.getDefault().post(new EBDownloadChanged("download", View.VISIBLE, doneList.size() + downloadingList.size())); notifyItemRangeRemoved(doneList.isEmpty() ? 0 : 1 + doneList.size(), 2); } else { EventBus.getDefault().post(new EBDownloadChanged("download", View.VISIBLE, doneList.size() + downloadingList.size())); notifyItemRemoved(position); } deleteList.add(entry.getUrl()); statusMap.remove(entry.getUrl()); locationMap.remove(entry.getUrl()); notifyItemChanged(doneList.isEmpty() ? 0 : 1 + doneList.size()); // 发送删除消息 EBDownloadDelete delete = new EBDownloadDelete(entry.getName(), entry.getMeta().get("platform"), entry.getUrl()); String PluginPlatform = entry.getMeta().get("PluginPlatform"); if (PluginPlatform != null) { delete.setPluginPlatform(PluginPlatform); } EventBus.getDefault().post(delete); DownloadManager.getInstance(context).cancel(entry.getUrl()); } }); } public List getDownloadingList() { return downloadingList; } public List getDoneList() { return doneList; } }