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.LinearLayout; import android.widget.ProgressBar; 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.DownloadEntity; import com.gh.download.DownloadManager; import com.gh.download.DownloadStatus; import com.gh.gamecenter.DownloadManagerActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.entity.ApkEntity; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.manager.DataCollectionManager; import com.gh.gamecenter.manager.PackageManager; import java.util.HashMap; import java.util.Map; 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, TextView textView, ProgressBar game_progressbar, LinearLayout game_ll_info, TextView download_speed, TextView download_percentage, TextView downloadBtn, 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, textView, game_progressbar, game_ll_info, download_speed, download_percentage, downloadBtn, downloadEntity, isShowPlatform, true); return; } } textView.setVisibility(View.VISIBLE); game_progressbar.setVisibility(View.GONE); game_ll_info.setVisibility(View.GONE); downloadBtn.setTextColor(Color.WHITE); if (gameEntity.isPluggable()) { downloadBtn.setText("插件化"); DownloadEntity downloadEntity = DownloadManager.getInstance(context).getByPackage( gameEntity.getApk().get(0).getPackageName()); if (downloadEntity == null) { downloadBtn.setClickable(true); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_plugin_style); } else { downloadBtn.setClickable(false); downloadBtn.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())) { downloadBtn.setText("更新"); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style); } else { if (gameEntity.getTag() != null && gameEntity.getTag().size() != 0 && !PackageUtils.isSignature(context, gameEntity.getApk().get(0).getPackageName())) { downloadBtn.setText("插件化"); DownloadEntity downloadEntity = DownloadManager.getInstance(context).getByPackage( gameEntity.getApk().get(0).getPackageName()); if (downloadEntity == null) { downloadBtn.setClickable(true); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_plugin_style); } else { downloadBtn.setClickable(false); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_pause_up); } } else { downloadBtn.setText("启动"); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_launch_style); } } } else { downloadBtn.setText("下载"); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style); } } // 更新插件的条目,有多个apk包 public static void updatePluginItem(Context context, TextView textView, ProgressBar game_progressbar, LinearLayout game_ll_info, TextView download_speed, TextView download_percentage, TextView downloadBtn, GameEntity entity, boolean isShowPlatform) { ArrayMap entryMap = entity.getEntryMap(); // 更新下载按钮状态 int doneCount = 0; // 下载完成数量 int updateCount = 0; // 可更新数量 int installCount = 0; // 已安装数量 int pluginCount = 0; // 可插件化数量 if (entryMap != null && !entryMap.isEmpty()) { for (String key : entryMap.keySet()) { if (entryMap.get(key).getStatus().equals(DownloadStatus.done)) { doneCount++; } } } for (ApkEntity apkEntity : entity.getApk()) { if (PackageManager.isCanUpdate(entity.getId(), apkEntity.getPackageName())) { updateCount++; } } for (ApkEntity apkEntity : entity.getApk()) { if (PackageManager.isInstalled(apkEntity.getPackageName())) { if (!PackageUtils.isSignature(context, apkEntity.getPackageName())) { pluginCount++; } else { installCount++; } } } downloadBtn.setTextColor(Color.WHITE); if (doneCount != 0) { downloadBtn.setText("安装"); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style); } else if (updateCount != 0) { downloadBtn.setText("更新"); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style); } else if (installCount != 0) { downloadBtn.setText("打开"); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_launch_style); } else if (pluginCount != 0) { downloadBtn.setText("插件化"); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_plugin_style); } else { downloadBtn.setText("下载"); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style); } if (entryMap != null && !entryMap.isEmpty()) { DownloadEntity downloadEntity; LinkedBlockingQueue queue = DownloadManager.getInstance(context).getQueue(entity.getName()); if (queue != null && !queue.isEmpty()) { downloadEntity = entryMap.get(queue.peek()); } else { downloadEntity = entryMap.get(entryMap.keyAt(0)); } if (downloadEntity != null) { // 更改进度条和提示文本的状态 changeStatus(context, textView, game_progressbar, game_ll_info, download_speed, download_percentage, downloadBtn, downloadEntity, isShowPlatform, false); return; } } textView.setVisibility(View.VISIBLE); game_progressbar.setVisibility(View.GONE); game_ll_info.setVisibility(View.GONE); } // 更改进度条和提示文本的状态 public static void changeStatus(Context context, TextView textView, ProgressBar game_progressbar, LinearLayout game_ll_info, TextView download_speed, TextView download_percentage, TextView downloadBtn, DownloadEntity downloadEntity, boolean isShowPlatform, boolean isNormal) { textView.setVisibility(View.GONE); game_progressbar.setVisibility(View.VISIBLE); game_ll_info.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()))) { game_progressbar.setProgress((int) (downloadEntity.getPercent() * 10)); if (isShowPlatform && platform != null) { download_speed.setText(String.format("%s - %s(剩%s)", platform, SpeedUtils.getSpeed(downloadEntity.getSpeed()), SpeedUtils.getRemainTime(downloadEntity.getSize(), downloadEntity.getProgress(), downloadEntity.getSpeed() * 1024))); } else { download_speed.setText(String.format("%s(剩%s)", SpeedUtils.getSpeed(downloadEntity.getSpeed()), SpeedUtils.getRemainTime(downloadEntity.getSize(), downloadEntity.getProgress(), downloadEntity.getSpeed() * 1024))); } download_percentage.setText(downloadEntity.getPercent() + "%"); } if (isNormal) { downloadBtn.setText("下载中"); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style); downloadBtn.setTextColor(context.getResources().getColorStateList(R.color.text_downloading_style)); } } else if (status.equals(DownloadStatus.waiting)) { game_progressbar.setProgress((int) (downloadEntity.getPercent() * 10)); if (isShowPlatform && platform != null) { download_speed.setText(String.format("%s - 等待", platform)); } else { download_speed.setText("等待"); } download_percentage.setText(downloadEntity.getPercent() + "%"); if (isNormal) { downloadBtn.setText("下载中"); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style); downloadBtn.setTextColor(context.getResources().getColorStateList(R.color.text_downloading_style)); } } else if (status.equals(DownloadStatus.pause) || status.equals(DownloadStatus.timeout) || status.equals(DownloadStatus.neterror)) { game_progressbar.setProgress((int) (downloadEntity.getPercent() * 10)); if (isShowPlatform && platform != null) { download_speed.setText(String.format("%s - 暂停", platform)); } else { download_speed.setText("暂停"); } download_percentage.setText(downloadEntity.getPercent() + "%"); if (isNormal) { downloadBtn.setText("下载中"); downloadBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style); downloadBtn.setTextColor(context.getResources().getColorStateList(R.color.text_downloading_style)); } } else if (status.equals(DownloadStatus.done)) { game_progressbar.setProgress(1000); if (isShowPlatform && platform != null) { download_speed.setText(String.format("%s - 下载完成", platform)); } else { download_speed.setText("下载完成"); } download_percentage.setText(R.string.hundred_percent); if (isNormal) { downloadBtn.setText("安装"); downloadBtn.setTextColor(Color.WHITE); if (downloadEntity.isPluggable() && PackageManager.isInstalled(downloadEntity.getPackageName())) { downloadBtn.setBackgroundResource(R.drawable.game_item_btn_plugin_style); } else { downloadBtn.setBackgroundResource(R.drawable.game_item_btn_download_style); } } } } public static void updateItem(Context context, TextView textView, ProgressBar game_progressbar, LinearLayout game_ll_info, TextView download_speed, TextView download_percentage, TextView downloadBtn, GameEntity entity, boolean isShowPlatform) { // 控制是否显示下载按钮 if (Config.isShow(context)) { downloadBtn.setVisibility(View.VISIBLE); } else { downloadBtn.setVisibility(View.GONE); } if (entity.getApk() == null || entity.getApk().isEmpty()) { textView.setVisibility(View.VISIBLE); game_progressbar.setVisibility(View.GONE); game_ll_info.setVisibility(View.GONE); downloadBtn.setVisibility(View.GONE); } else if (entity.getApk().size() == 1) { updateNormalItem(context, textView, game_progressbar, game_ll_info, download_speed, download_percentage, downloadBtn, entity, isShowPlatform); } else { updatePluginItem(context, textView, game_progressbar, game_ll_info, download_speed, download_percentage, downloadBtn, entity, isShowPlatform); } } public static void updateItem(Context context, TextView textView, ProgressBar game_progressbar, LinearLayout game_ll_info, TextView download_speed, TextView download_percentage, TextView downloadBtn, GameEntity entity) { updateItem(context, textView, game_progressbar, game_ll_info, download_speed, download_percentage, downloadBtn, entity, true); } public static void setNormalOnClickListener(final Context context, final TextView downloadBtn, final GameEntity gameEntity, final int position, final RecyclerView.Adapter adapter, final String entrance, final String location) { downloadBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String str = downloadBtn.getText().toString(); if ("下载".equals(str)) { if (NetworkUtils.isWifiConnected(context)) { download(context, gameEntity, downloadBtn, entrance, location); } else { DialogUtils.showDownloadDialog(context, new DialogUtils.ConfiremListener() { @Override public void onConfirem() { 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.ConfiremListener() { @Override public void onConfirem() { plugin(context, gameEntity, downloadBtn, entrance, location); } }); } } else if ("安装".equals(str)) { install(context, gameEntity, position, adapter); } else if ("启动".equals(str)) { Map kv = new HashMap<>(); kv.put("版本", gameEntity.getApk().get(0).getPlatform()); DataUtils.onEvent(context, "游戏启动", gameEntity.getName(), kv); PackageUtils.launchApplicationByPackageName(context, gameEntity.getApk().get(0).getPackageName()); } else if ("下载中".equals(str)) { Intent intent = new Intent(context, DownloadManagerActivity.class); intent.putExtra("url", gameEntity.getApk().get(0).getUrl()); context.startActivity(intent); } else if ("更新".equals(str)) { if (NetworkUtils.isWifiConnected(context)) { update(context, gameEntity, entrance, location); } else { DialogUtils.showDownloadDialog(context, new DialogUtils.ConfiremListener() { @Override public void onConfirem() { update(context, gameEntity, entrance, location); } }); } } } }); } public static void setPluginOnClickListener(final Context context, final TextView downloadBtn, final GameEntity entity, final String entrance, final String location) { downloadBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { DownloadDialog.getInstance(context).showPopupWindow(v, entity, entrance, location); } }); } public static void setOnClickListener(Context context, TextView downloadBtn, GameEntity gameEntity, int position, RecyclerView.Adapter adapter, String entrance, String location) { if (gameEntity.getApk().size() == 1) { setNormalOnClickListener(context, downloadBtn, gameEntity, position, adapter, entrance, location); } else { setPluginOnClickListener(context, downloadBtn, gameEntity, entrance, location); } } //更新 private static void update(Context context, GameEntity gameEntity, String entrance, String location) { ApkEntity apkEntity = gameEntity.getApk().get(0); //下载可更新游戏 Map kv = new HashMap<>(); kv.put("版本", apkEntity.getPlatform()); kv.put("状态", "下载开始"); DataUtils.onEvent(context, "游戏更新", gameEntity.getName(), kv); Map map = new HashMap<>(); map.put("game", gameEntity.getName()); map.put("game_id", gameEntity.getId()); map.put("method", "更新"); map.put("platform", PlatformUtils.getInstance(context) .getPlatformName(gameEntity.getApk().get(0).getPlatform())); map.put("status", "开始"); map.put("location", location); map.put("entrance", entrance); map.put("btn_status", "更新"); map.put("network", NetworkUtils.getConnectedType(context)); DataCollectionManager.onEvent(context, "download", map); DownloadManager.createDownload(context, gameEntity, "更新", entrance, location); } //下载 private static void download(Context context, GameEntity gameEntity, TextView downloadBtn, String entrance, String location) { String msg = FileUtils.isCanDownload(gameEntity.getApk().get(0).getSize()); if (TextUtils.isEmpty(msg)) { Map kv = new HashMap<>(); kv.put("版本", gameEntity.getApk().get(0).getPlatform()); kv.put("状态", "下载开始"); DataUtils.onEvent(context, "游戏下载", gameEntity.getName(), kv); Map kv2 = new HashMap<>(); kv2.put("版本", gameEntity.getApk().get(0).getPlatform()); kv2.put("状态", "下载开始"); kv2.put("位置", entrance + "-开始"); DataUtils.onEvent(context, "游戏下载位置", gameEntity.getName(), kv2); Map kv3 = new HashMap<>(); kv3.put(entrance, "下载数"); kv3.put(entrance, "下载开始"); DataUtils.onEvent(context, "应用数据", gameEntity.getName(), kv3); Map map = new HashMap<>(); map.put("game", gameEntity.getName()); map.put("game_id", gameEntity.getId()); map.put("method", "正常"); map.put("platform", PlatformUtils.getInstance(context) .getPlatformName(gameEntity.getApk().get(0).getPlatform())); map.put("status", "开始"); map.put("location", location); map.put("entrance", entrance); map.put("btn_status", "下载"); map.put("network", NetworkUtils.getConnectedType(context)); DataCollectionManager.onEvent(context, "download", map); 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(gameEntity.getApk().get(0).getSize()); if (TextUtils.isEmpty(msg)) { Map kv = new HashMap<>(); kv.put("版本", gameEntity.getApk().get(0).getPlatform()); kv.put("状态", "下载开始"); DataUtils.onEvent(context, "游戏下载", gameEntity.getName(), kv); Map kv2 = new HashMap<>(); kv2.put("版本", gameEntity.getApk().get(0).getPlatform()); kv2.put("状态", "下载开始"); kv2.put("位置", entrance + "-开始"); DataUtils.onEvent(context, "游戏下载位置", gameEntity.getName(), kv2); Map kv3 = new HashMap<>(); kv3.put(entrance, "下载数"); kv3.put(entrance, "下载开始"); DataUtils.onEvent(context, "应用数据", gameEntity.getName(), kv3); Map map = new HashMap<>(); map.put("game", gameEntity.getName()); map.put("game_id", gameEntity.getId()); map.put("method", "插件化"); map.put("platform", PlatformUtils.getInstance(context) .getPlatformName(gameEntity.getApk().get(0).getPlatform())); map.put("status", "开始"); map.put("location", location); map.put("entrance", entrance); map.put("btn_status", "插件化"); map.put("network", NetworkUtils.getConnectedType(context)); DataCollectionManager.onEvent(context, "download", map); 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().isEmpty()) { gameEntity.getEntryMap().remove(gameEntity.getEntryMap().keyAt(0)); } adapter.notifyItemChanged(position); } else { PackageUtils.launchSetup(context, path); } } } }