package com.gh.common.util; import android.content.Context; import android.graphics.Color; import android.os.Message; import android.support.v4.content.ContextCompat; 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 com.gh.common.constant.Config; import com.gh.common.view.DownloadDialog; import com.gh.download.DownloadManager; import com.gh.gamecenter.DownloadManagerActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.GameViewHolder; import com.gh.gamecenter.entity.ApkEntity; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.manager.PackageManager; import com.lightgame.download.DownloadConfig; import com.lightgame.download.DownloadEntity; import com.lightgame.download.DownloadStatus; import com.lightgame.download.FileUtils; import com.lightgame.utils.Utils; 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); adapter.notifyItemChanged(index); // if (!DownloadStatus.pause.equals(DownloadManager.getInstance(context).getStatus(downloadEntity.getUrl()))) { // adapter.notifyItemChanged(index); // } } else { if (!queue.contains(platform)) { queue.offer(platform); if (AppDebugConfig.IS_DEBUG) { AppDebugConfig.logMethodWithParams(DownloadItemUtils.class, queue.size(), gameEntity.getBrief(), downloadEntity.getPlatform(), index); } // 有两个平台同时下载的时候启用 if (queue.size() == 2) { //TODO fuck this Message msg = Message.obtain(); msg.obj = downloadEntity.getName(); msg.what = DownloadConfig.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 (!DownloadStatus.pause.equals(DownloadManager.getInstance(context).getStatus(downloadEntity.getUrl()))) { adapter.notifyItemChanged(index); } } } } public static void updateItem(Context context, GameEntity gameEntity, GameViewHolder holder, boolean isShowPlatform) { // 控制是否显示下载按钮 if (!Config.isShowDownload(gameEntity.getId()) || context.getString(R.string.app_name).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); } 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.news_detail_comment); holder.gameDownloadBtn.setText("暂无"); holder.gameDownloadBtn.setTextColor(ContextCompat.getColor(context, R.color.button_gray)); holder.gameDownloadBtn.setClickable(false); } else if (gameEntity.getApk().size() == 1) { updateNormalItem(context, holder, gameEntity, isShowPlatform); } else { // updateNormalItem(context, holder, gameEntity, isShowPlatform); updatePluginItem(context, holder, gameEntity, isShowPlatform); } } // 更新正常的条目,只有一个apk包 static void updateNormalItem(Context context, GameViewHolder holder, GameEntity gameEntity, boolean isShowPlatform) { final ArrayMap entryMap = gameEntity.getEntryMap(); final ApkEntity apkEntity = gameEntity.getApk().get(0); if (entryMap != null && !entryMap.isEmpty()) { DownloadEntity downloadEntity = entryMap.get(apkEntity.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); final String packageName = apkEntity.getPackageName(); if (gameEntity.isPluggable()) { holder.gameDownloadBtn.setText(R.string.pluggable); setwhat(context, holder, apkEntity, packageName); } else if (PackageManager.INSTANCE.isInstalled(packageName)) { if (PackageManager.INSTANCE.isCanUpdate(gameEntity.getId(), packageName)) { holder.gameDownloadBtn.setText(R.string.update); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style); } else { Object gh_id = PackageUtils.getMetaData(context, packageName, "gh_id"); if (gameEntity.getTag() != null && gameEntity.getTag().size() != 0 && !TextUtils.isEmpty(apkEntity.getGhVersion()) && !PackageUtils.isSignature(context, packageName)) { holder.gameDownloadBtn.setText(R.string.pluggable); setwhat(context, holder, apkEntity, packageName); } else if (gh_id == null || gh_id.equals(gameEntity.getId())) { holder.gameDownloadBtn.setText(R.string.launch); holder.gameDownloadBtn.setTextColor(ContextCompat.getColor(context, R.color.theme)); holder.gameDownloadBtn.setBackgroundResource(R.drawable.detail_download_open_style); } else { holder.gameDownloadBtn.setText(R.string.download); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style); } } } else { holder.gameDownloadBtn.setText(R.string.download); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style); } } /** * 这个干什么鬼? * * @param context * @param holder * @param apkEntity * @param packageName */ public static void setwhat(Context context, GameViewHolder holder, ApkEntity apkEntity, String packageName) { DownloadEntity downloadEntity = DownloadManager.getInstance(context).getDownloadEntityByPackageName(packageName); if (downloadEntity == null || downloadEntity.getUrl().equals(apkEntity.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); } } // 更新插件的条目,有多个apk包 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 (!DownloadStatus.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(R.string.downloading); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style); holder.gameDownloadBtn.setTextColor(ContextCompat.getColorStateList(context, 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(R.string.downloading); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style); holder.gameDownloadBtn.setTextColor(ContextCompat.getColorStateList(context, 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(R.string.downloading); holder.gameDownloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style); holder.gameDownloadBtn.setTextColor(ContextCompat.getColorStateList(context, 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.INSTANCE.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 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); } }); } } 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(); switch (str) { case "下载": 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); } }); } break; case "插件化": 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); } }); } break; case "安装": install(context, gameEntity, position, adapter); break; case "启动": DataUtils.onGameLaunchEvent(context, gameEntity.getName(), gameEntity.getApk().get(0).getPlatform(), location); PackageUtils.launchApplicationByPackageName(context, gameEntity.getApk().get(0).getPackageName()); break; case "下载中": context.startActivity( DownloadManagerActivity.getDownloadMangerIntent(context, gameEntity.getApk().get(0).getUrl(), entrance + "+(" + location.split(":")[0] + ")")); break; case "更新": 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); } }); } break; } } //下载 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, context.getString(R.string.download), entrance, location); Utils.toast(context, gameEntity.getName() + "已加入下载队列"); downloadBtn.setText(R.string.downloading); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style); downloadBtn.setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style)); // DownloadManager.getInstance(context).putStatus(gameEntity.getApk().get(0).getUrl(), "downloading"); } else { Utils.toast(context, msg); } } //插件化 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); Utils.toast(context, gameEntity.getName() + "已加入下载队列"); downloadBtn.setText(R.string.downloading); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style); downloadBtn.setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style)); // DownloadManager.getInstance(context).putStatus(gameEntity.getApk().get(0).getUrl(), "downloading"); } else { Utils.toast(context, msg); } } //安装 private static void install(final Context context, GameEntity gameEntity, int position, RecyclerView.Adapter adapter) { ApkEntity apkEntity = gameEntity.getApk().get(0); DownloadEntity downloadEntity = DownloadManager.getInstance(context).getDownloadEntityByUrl(apkEntity.getUrl()); if (downloadEntity != null) { final String path = downloadEntity.getPath(); if (FileUtils.isEmptyFile(path)) { Utils.toast(context, R.string.install_failure_hint); DownloadManager.getInstance(context).cancel(downloadEntity.getUrl()); if (gameEntity.getEntryMap() != null) { gameEntity.getEntryMap().remove(apkEntity.getPlatform()); } adapter.notifyItemChanged(position); } else { PackageUtils.launchSetup(context, path); } } } //更新 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); } }