package com.gh.common.util; import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.os.Message; import android.support.v4.util.ArrayMap; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.gh.common.constant.Config; import com.gh.common.constant.Constants; import com.gh.common.view.DownloadDialog; import com.gh.download.*; import com.gh.gamecenter.DownloadManagerActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.GameViewHolder; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.manager.PackageManager; import java.util.concurrent.LinkedBlockingQueue; public class DownloadItemUtils { // 更新下载进度条 public static void processDate(Context context, GameEntity gameEntity, DownloadEntity downloadEntity, RecyclerView.Adapter adapter, int index) { if (!gameEntity.getId().equals(downloadEntity.getGameId())) { adapter.notifyItemChanged(index); return; } LinkedBlockingQueue queue = DownloadManager.getInstance(context).getQueue(downloadEntity.getName()); if (queue == null) { queue = new LinkedBlockingQueue<>(); DownloadManager.getInstance(context).putQueue(downloadEntity.getName(), queue); } String platform = downloadEntity.getPlatform(); ArrayMap entryMap = gameEntity.getEntryMap(); DownloadStatus status = downloadEntity.getStatus(); if (status.equals(DownloadStatus.pause) || status.equals(DownloadStatus.cancel) || status.equals(DownloadStatus.done)) { queue.remove(platform); if (entryMap == null) { entryMap = new ArrayMap<>(); gameEntity.setEntryMap(entryMap); } entryMap.put(platform, downloadEntity); if (!"pause".equals(DownloadManager.getInstance(context).getStatus(downloadEntity.getUrl()))) { adapter.notifyItemChanged(index); } } else { if (!queue.contains(platform)) { queue.offer(platform); if (queue.size() == 2) { Message msg = Message.obtain(); msg.obj = downloadEntity.getName(); msg.what = Constants.DOWNLOAD_ROLL; DownloadManager.getInstance(context).sendMessageDelayed(msg, 3000); } } if (platform.equals(queue.peek())) { if (entryMap == null) { entryMap = new ArrayMap<>(); gameEntity.setEntryMap(entryMap); } entryMap.put(platform, downloadEntity); if (!"pause".equals(DownloadManager.getInstance(context).getStatus(downloadEntity.getUrl()))) { adapter.notifyItemChanged(index); } } } } // 更新正常的条目,只有一个apk包 public static void updateNormalItem(Context context, GameViewHolder holder, GameEntity gameEntity, boolean isShowPlatform) { ArrayMap entryMap = gameEntity.getEntryMap(); if (entryMap != null && !entryMap.isEmpty()) { DownloadEntity downloadEntity = entryMap.get(gameEntity.getApk().get(0).getPlatform()); if (downloadEntity != null) { // 更改进度条和提示文本的状态 changeStatus(context, holder, downloadEntity, isShowPlatform, true); return; } } holder.gameDes.setVisibility(View.VISIBLE); holder.gameProgressbar.setVisibility(View.GONE); holder.gameInfo.setVisibility(View.GONE); holder.gameDownloadBtn.setTextColor(Color.WHITE); if (gameEntity.isPluggable()) { holder.gameDownloadBtn.setText("插件化"); DownloadEntity downloadEntity = DownloadManager.getInstance(context).getByPackage( gameEntity.getApk().get(0).getPackageName()); if (downloadEntity == null || downloadEntity.getUrl().equals(gameEntity.getApk().get(0).getUrl())) { holder.gameDownloadBtn.setClickable(true); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_plugin_style); } else { holder.gameDownloadBtn.setClickable(false); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_pause_up); } } else if (PackageManager.isInstalled(gameEntity.getApk().get(0).getPackageName())) { if (PackageManager.isCanUpdate(gameEntity.getId(), gameEntity.getApk().get(0).getPackageName())) { holder.gameDownloadBtn.setText("更新"); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style); } else { if (gameEntity.getTag() != null && gameEntity.getTag().size() != 0 && !TextUtils.isEmpty(gameEntity.getApk().get(0).getGhVersion()) && !PackageUtils.isSignature(context, gameEntity.getApk().get(0).getPackageName())) { holder.gameDownloadBtn.setText("插件化"); DownloadEntity downloadEntity = DownloadManager.getInstance(context).getByPackage( gameEntity.getApk().get(0).getPackageName()); if (downloadEntity == null || downloadEntity.getUrl().equals(gameEntity.getApk().get(0).getUrl())) { holder.gameDownloadBtn.setClickable(true); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_plugin_style); } else { holder.gameDownloadBtn.setClickable(false); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_pause_up); } } else { holder.gameDownloadBtn.setText("启动"); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_launch_style); } } } else { holder.gameDownloadBtn.setText("下载"); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style); } } // 更新插件的条目,有多个apk包 public static void updatePluginItem(Context context, GameViewHolder holder, GameEntity gameEntity, boolean isShowPlatform) { GameUtils.setDownloadBtnStatus(context, gameEntity, holder.gameDownloadBtn); ArrayMap entryMap = gameEntity.getEntryMap(); if (entryMap != null && !entryMap.isEmpty()) { DownloadEntity downloadEntity; LinkedBlockingQueue queue = DownloadManager.getInstance(context).getQueue(gameEntity.getName()); if (queue != null && !queue.isEmpty()) { downloadEntity = entryMap.get(queue.peek()); } else { downloadEntity = entryMap.get(entryMap.keyAt(0)); } if (downloadEntity != null) { // 更改进度条和提示文本的状态 changeStatus(context, holder, downloadEntity, isShowPlatform, false); return; } } holder.gameDes.setVisibility(View.VISIBLE); holder.gameProgressbar.setVisibility(View.GONE); holder.gameInfo.setVisibility(View.GONE); } // 更改进度条和提示文本的状态 public static void changeStatus(Context context, GameViewHolder holder, DownloadEntity downloadEntity, boolean isShowPlatform, boolean isNormal) { holder.gameDes.setVisibility(View.GONE); holder.gameProgressbar.setVisibility(View.VISIBLE); holder.gameInfo.setVisibility(View.VISIBLE); String platform = PlatformUtils.getInstance(context) .getPlatformName(downloadEntity.getPlatform()); DownloadStatus status = downloadEntity.getStatus(); if (status.equals(DownloadStatus.downloading)) { if (!"pause".equals(DownloadManager.getInstance(context).getStatus(downloadEntity.getUrl()))) { holder.gameProgressbar.setProgress((int) (downloadEntity.getPercent() * 10)); if (isShowPlatform && platform != null) { holder.gameDownloadSpeed.setText(String.format("%s - %s(剩%s)", platform, SpeedUtils.getSpeed(downloadEntity.getSpeed()), SpeedUtils.getRemainTime(downloadEntity.getSize(), downloadEntity.getProgress(), downloadEntity.getSpeed() * 1024))); } else { holder.gameDownloadSpeed.setText(String.format("%s(剩%s)", SpeedUtils.getSpeed(downloadEntity.getSpeed()), SpeedUtils.getRemainTime(downloadEntity.getSize(), downloadEntity.getProgress(), downloadEntity.getSpeed() * 1024))); } holder.gameDownloadPercentage.setText(downloadEntity.getPercent() + "%"); } if (isNormal) { holder.gameDownloadBtn.setText("下载中"); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style); holder.gameDownloadBtn.setTextColor(context.getResources().getColorStateList(R.color.text_downloading_style)); } } else if (status.equals(DownloadStatus.waiting)) { holder.gameProgressbar.setProgress((int) (downloadEntity.getPercent() * 10)); if (isShowPlatform && platform != null) { holder.gameDownloadSpeed.setText(String.format("%s - 等待", platform)); } else { holder.gameDownloadSpeed.setText("等待"); } holder.gameDownloadPercentage.setText(downloadEntity.getPercent() + "%"); if (isNormal) { holder.gameDownloadBtn.setText("下载中"); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style); holder.gameDownloadBtn.setTextColor(context.getResources().getColorStateList(R.color.text_downloading_style)); } } else if (status.equals(DownloadStatus.pause) || status.equals(DownloadStatus.timeout) || status.equals(DownloadStatus.neterror)) { holder.gameProgressbar.setProgress((int) (downloadEntity.getPercent() * 10)); if (isShowPlatform && platform != null) { holder.gameDownloadSpeed.setText(String.format("%s - 暂停", platform)); } else { holder.gameDownloadSpeed.setText("暂停"); } holder.gameDownloadPercentage.setText(downloadEntity.getPercent() + "%"); if (isNormal) { holder.gameDownloadBtn.setText("下载中"); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style); holder.gameDownloadBtn.setTextColor(context.getResources().getColorStateList(R.color.text_downloading_style)); } } else if (status.equals(DownloadStatus.done)) { holder.gameProgressbar.setProgress(1000); if (isShowPlatform && platform != null) { holder.gameDownloadSpeed.setText(String.format("%s - 下载完成", platform)); } else { holder.gameDownloadSpeed.setText("下载完成"); } holder.gameDownloadPercentage.setText(R.string.hundred_percent); if (isNormal) { holder.gameDownloadBtn.setText("安装"); holder.gameDownloadBtn.setTextColor(Color.WHITE); if (downloadEntity.isPluggable() && PackageManager.isInstalled(downloadEntity.getPackageName())) { holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_plugin_style); } else { holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style); } } } } public static void updateItem(Context context, GameEntity gameEntity, GameViewHolder holder, boolean isShowPlatform) { // 控制是否显示下载按钮 if (!Config.isShow(context) || "光环助手".equals(gameEntity.getName())) { holder.gameDownloadBtn.setVisibility(View.GONE); } else { holder.gameDownloadBtn.setVisibility(View.VISIBLE); } if (gameEntity.isLibaoExists()) { holder.gameLibaoIcon.setVisibility(View.VISIBLE); } else { holder.gameLibaoIcon.setVisibility(View.GONE); } // LibaoDao libaoDao = new LibaoDao(context); // if (libaoDao.isExist(gameEntity.getId())) { // holder.gameLibaoIcon.setVisibility(View.VISIBLE); // } else { // // } if (gameEntity.getApk() == null || gameEntity.getApk().isEmpty()) { holder.gameDes.setVisibility(View.VISIBLE); holder.gameProgressbar.setVisibility(View.GONE); holder.gameInfo.setVisibility(View.GONE); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_pause_style); holder.gameDownloadBtn.setText("暂无"); holder.gameDownloadBtn.setClickable(false); } else if (gameEntity.getApk().size() == 1) { updateNormalItem(context, holder, gameEntity, isShowPlatform); } else { updatePluginItem(context, holder, gameEntity, isShowPlatform); } } public static void onNormalClick(final Context context, final TextView downloadBtn, final GameEntity gameEntity, final int position, final RecyclerView.Adapter adapter, final String entrance, final String location) { String str = downloadBtn.getText().toString(); if ("下载".equals(str)) { if (NetworkUtils.isWifiConnected(context)) { download(context, gameEntity, downloadBtn, entrance, location); } else { DialogUtils.showDownloadDialog(context, new DialogUtils.ConfirmListener() { @Override public void onConfirm() { download(context, gameEntity, downloadBtn, entrance, location); } }); } } else if ("插件化".equals(str)) { if (NetworkUtils.isWifiConnected(context)) { plugin(context, gameEntity, downloadBtn, entrance, location); } else { DialogUtils.showDownloadDialog(context, new DialogUtils.ConfirmListener() { @Override public void onConfirm() { plugin(context, gameEntity, downloadBtn, entrance, location); } }); } } else if ("安装".equals(str)) { install(context, gameEntity, position, adapter); } else if ("启动".equals(str)) { DataUtils.onGameLaunchEvent(context, gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), location); PackageUtils.launchApplicationByPackageName(context, gameEntity.getApk().get(0).getPackageName()); } else if ("下载中".equals(str)) { Intent intent = new Intent(context, DownloadManagerActivity.class); intent.putExtra("currentItem", 1); intent.putExtra("url", gameEntity.getApk().get(0).getUrl()); intent.putExtra("entrance", entrance + "+(" + location.split(":")[0] + ")"); context.startActivity(intent); } else if ("更新".equals(str)) { if (NetworkUtils.isWifiConnected(context)) { update(context, gameEntity, entrance, location); } else { DialogUtils.showDownloadDialog(context, new DialogUtils.ConfirmListener() { @Override public void onConfirm() { update(context, gameEntity, entrance, location); } }); } } } public static void setOnClickListener(final Context context, final TextView downloadBtn, final GameEntity gameEntity, final int position, final RecyclerView.Adapter adapter, final String entrance, final String location) { if (gameEntity.getApk().size() == 1) { downloadBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onNormalClick(context, downloadBtn, gameEntity, position, adapter, entrance, location); } }); } else { downloadBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DownloadDialog.getInstance(context).showPopupWindow(v, gameEntity, entrance, location); } }); } } //更新 private static void update(Context context, GameEntity gameEntity, String entrance, String location) { DataUtils.onGameUpdateEvent(context, gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), "下载开始"); DownloadManager.createDownload(context, gameEntity, "更新", entrance, location); } //下载 private static void download(Context context, GameEntity gameEntity, TextView downloadBtn, String entrance, String location) { String msg = FileUtils.isCanDownload(context, gameEntity.getApk().get(0).getSize()); if (TextUtils.isEmpty(msg)) { DataUtils.onGameDownloadEvent(context, gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), entrance, "下载开始"); DownloadManager.createDownload(context, gameEntity, "下载", entrance, location); Toast.makeText(context, gameEntity.getName() + "已加入下载队列", Toast.LENGTH_SHORT).show(); downloadBtn.setText("下载中"); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style); downloadBtn.setTextColor(context.getResources().getColorStateList(R.color.text_downloading_style)); DownloadManager.getInstance(context).putStatus(gameEntity.getApk().get(0).getUrl(), "downloading"); } else { Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); } } //插件化 private static void plugin(Context context, GameEntity gameEntity, TextView downloadBtn, String entrance, String location) { String msg = FileUtils.isCanDownload(context, gameEntity.getApk().get(0).getSize()); if (TextUtils.isEmpty(msg)) { DataUtils.onGameDownloadEvent(context, gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), entrance, "下载开始"); DownloadManager.createDownload(context, gameEntity, "插件化", entrance, location); Toast.makeText(context, gameEntity.getName() + "已加入下载队列", Toast.LENGTH_SHORT).show(); downloadBtn.setText("下载中"); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style); downloadBtn.setTextColor(context.getResources().getColorStateList(R.color.text_downloading_style)); DownloadManager.getInstance(context).putStatus(gameEntity.getApk().get(0).getUrl(), "downloading"); } else { Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); } } //安装 private static void install(final Context context, GameEntity gameEntity, int position, RecyclerView.Adapter adapter) { DownloadEntity downloadEntity = DownloadManager.getInstance(context).get(gameEntity.getApk().get(0).getUrl()); if (downloadEntity != null) { final String path = downloadEntity.getPath(); if (FileUtils.isEmptyFile(path)) { Toast.makeText(context, "解析包出错(可能被误删了),请重新下载", Toast.LENGTH_SHORT).show(); DownloadManager.getInstance(context).cancel(downloadEntity.getUrl()); if (gameEntity.getEntryMap() != null) { gameEntity.getEntryMap().remove(gameEntity.getApk().get(0).getPlatform()); } adapter.notifyItemChanged(position); } else { PackageUtils.launchSetup(context, path); } } } }