package com.gh.common.view; import android.content.Context; import android.content.SharedPreferences; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.PopupWindow; import android.widget.TextView; import com.gh.common.constant.Config; import com.gh.common.util.DisplayUtils; import com.gh.common.util.PackageUtils; import com.gh.common.util.PlatformUtils; import com.gh.common.util.Utils; import com.gh.download.DataWatcher; import com.gh.download.DownloadEntity; import com.gh.download.DownloadManager; import com.gh.download.DownloadStatus; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.PlatformPagerAdapter; import com.gh.gamecenter.entity.ApkEntity; import com.gh.gamecenter.entity.GameCollectionEntity; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.eventbus.EBDownloadStatus; import com.gh.gamecenter.eventbus.EBPackage; import com.gh.gamecenter.eventbus.EBReuse; import com.gh.gamecenter.listener.OnCollectionCallBackListener; import com.gh.gamecenter.manager.PackageManager; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import de.greenrobot.event.EventBus; /** * * @author 温冠超 * @email 294299195@qq.com * @date 2015-8-12 * @update 2015-8-12 * @des 弹出游戏版本下载按钮,点击并添加到下载任务中 */ public class DownloadDialog implements OnCollectionCallBackListener { private static DownloadDialog instance; private Context context; private boolean isShow; private DownloadDialog() { isShow = false; } public static DownloadDialog getInstance(Context context) { if (instance == null) { instance = new DownloadDialog(); } instance.context = context; return instance; } private DataWatcher dataWatcher = new DataWatcher() { @Override public void onDataChanged(DownloadEntity downloadEntity) { if (downloadEntity.getName().equals(gameEntity.getName()) && !"delete".equals(DownloadManager.getInstance(context).getStatus(downloadEntity.getUrl()))) { adapter.putDownloadEntity(downloadEntity); if (collectionAdapter != null) { collectionAdapter.putDownloadEntity(downloadEntity); } } } }; private PopupWindow popupWindow; private List gameApk; private GameEntity gameEntity; private ViewPager viewPager; private PlatformPagerAdapter adapter; private LinearLayout dialog_ll_hint; private LinearLayout dialog_ll_collection; private ViewPager collectionViewPager; private PlatformPagerAdapter collectionAdapter; private LinearLayout dialog_ll_collection_hint; private String entrance; private String location; private int row; private int column; public void showPopupWindow(View view, GameEntity gameEntity, String entrance, String location) { if (isShow && (popupWindow == null || !popupWindow.isShowing())) { isShow = false; } if (isShow) { return; } isShow = true; this.gameEntity = gameEntity; this.entrance = entrance; this.location = location; SharedPreferences sp = context.getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE); row = sp.getInt("download_box_row", 3); column = sp.getInt("download_box_column", 3); gameApk = sortApk(new ArrayList<>(gameEntity.getApk())); if (gameEntity.getCollection() != null) { mergeApkCollection(gameEntity); } // 一个自定义的布局,作为显示的内容 View contentView = View.inflate(context, R.layout.game_download_dialog, null); TextView title = (TextView) contentView.findViewById(R.id.dialog_title); title.setText(gameEntity.getName()); viewPager = (ViewPager) contentView.findViewById(R.id.dialog_viewPager); dialog_ll_hint = (LinearLayout) contentView.findViewById(R.id.dialog_ll_hint); dialog_ll_collection = (LinearLayout) contentView.findViewById(R.id.dialog_ll_collection); dialog_ll_collection_hint = (LinearLayout) contentView.findViewById(R.id.dialog_ll_collection_hint); collectionViewPager = (ViewPager) contentView.findViewById(R.id.dialog_collection_viewPager); isLoadPlatform = false; init(new ArrayList<>(gameApk)); viewPager.addOnPageChangeListener(new MyPageChangeListener(dialog_ll_hint)); popupWindow = new PopupWindow(contentView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, true); contentView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { popupWindow.dismiss(); } }); contentView.setFocusable(true); contentView.setFocusableInTouchMode(true); contentView.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 && popupWindow != null && popupWindow.isShowing()) { popupWindow.dismiss(); } return false; } }); popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { isShow = false; EventBus.getDefault().unregister(DownloadDialog.this); DownloadManager.getInstance(context).removeObserver(dataWatcher); } }); popupWindow.setTouchable(true); popupWindow.setFocusable(true); // 设置popWindow的显示和消失动画 popupWindow.setAnimationStyle(R.style.mypopwindow_anim_style); // 设置好参数之后再show popupWindow.showAtLocation(view, Gravity.BOTTOM, 0, 0); if (!EventBus.getDefault().isRegistered(DownloadDialog.this)) { EventBus.getDefault().register(DownloadDialog.this); } DownloadManager.getInstance(context).addObserver(dataWatcher); } // 合并ApkCollection private void mergeApkCollection(GameEntity gameEntity) { List gameCollectionApk = new ArrayList<>(); ConcurrentHashMap hashMap = new ConcurrentHashMap<>(); boolean isCollection; for (int i = 0, size = gameApk.size(); i < size; i++) { isCollection = false; for (GameCollectionEntity gameCollectionEntity : gameEntity.getCollection()) { for (String packageName : gameCollectionEntity.getPackage()) { if (packageName.equals(gameApk.get(i).getPackageName())){ isCollection = true; if (hashMap.get(gameCollectionEntity.getName()) != null) { gameCollectionApk.get(hashMap.get(gameCollectionEntity.getName())) .getApkCollection().getSaveApkEntity().add(gameApk.get(i)); } else { ApkEntity apkEntity = new ApkEntity(); GameCollectionEntity collectionEntity = new GameCollectionEntity(); List saveApkList = new ArrayList<>(); saveApkList.add(gameApk.get(i)); collectionEntity.setSaveApkEntity(saveApkList); collectionEntity.setName(gameCollectionEntity.getName()); collectionEntity.setIcon(gameCollectionEntity.getIcon()); collectionEntity.setColor(gameCollectionEntity.getColor()); apkEntity.setApkCollection(collectionEntity); gameCollectionApk.add(apkEntity); hashMap.put(gameCollectionEntity.getName(), gameCollectionApk.size() - 1); } } } } if (!isCollection) { gameCollectionApk.add(gameApk.get(i)); } } gameApk = gameCollectionApk; } private boolean isLoadPlatform; private void init(List apkList) { for (int i = 0; i < apkList.size(); i++) { String platformName = PlatformUtils.getInstance(context) .getPlatformName(apkList.get(i).getPlatform()); if (platformName == null) { apkList.remove(i); i--; if (!isLoadPlatform) { PlatformUtils.getInstance(context).getPlatform(); isLoadPlatform = true; } } } dialog_ll_hint.removeAllViews(); int size = (int) Math.ceil(apkList.size() / (double) (row * column)); addHintPoint(dialog_ll_hint, size); int count = apkList.size(); int vpHeight; if (count <= 3) { vpHeight = 80; } else if (count <= 6) { vpHeight = 140; } else { vpHeight = 200; } ViewGroup.LayoutParams layoutParams = viewPager.getLayoutParams(); layoutParams.height = DisplayUtils.dip2px(context, vpHeight); viewPager.setLayoutParams(layoutParams); int currentItem = 0; if (viewPager != null) { currentItem = viewPager.getCurrentItem(); } Utils.log("currentItem = " + currentItem); adapter = new PlatformPagerAdapter(context, this, gameEntity, apkList, entrance, location); viewPager.setAdapter(adapter); viewPager.setCurrentItem(currentItem); } private ArrayList sortApk(List apkList) { List pluginDoneList = new ArrayList<>(); // 安装插件 List pluginDownloadList = new ArrayList<>(); // 插件化下载中 List pluginList = new ArrayList<>(); // 插件化 List updateDoneList = new ArrayList<>(); // 安装更新 List updateDownloadList = new ArrayList<>(); // 更新下载中 List updateList = new ArrayList<>(); // 更新 List doneList = new ArrayList<>(); // 安装 List downloadList = new ArrayList<>(); // 下载中 List installList = new ArrayList<>(); // 启动 List noPicList = new ArrayList<>(); // 默认(无图片) DownloadEntity downloadEntity; String packageName; Object gh_id; for (int i = 0, size = apkList.size(); i < size; i++) { downloadEntity = DownloadManager.getInstance(context).get(apkList.get(i).getUrl()); packageName = apkList.get(i).getPackageName(); gh_id = PackageUtils.getMetaData(context, packageName, "gh_id"); if (downloadEntity == null) { if (PackageManager.isInstalled(packageName) && (gh_id == null || gh_id.equals(gameEntity.getId()))) { if (PackageManager.isCanUpdate(gameEntity.getId(), packageName)) { updateList.add(apkList.remove(i)); size--; i--; } else if (!PackageUtils.isSignature(context, packageName)) { pluginList.add(apkList.remove(i)); size--; i--; } else { installList.add(apkList.remove(i)); size--; i--; } } else { String platform = apkList.get(i).getPlatform(); int id = PlatformUtils.getInstance(context).getPlatformPic(platform); if (id == 0) { String path = PlatformUtils.getInstance(context).getPlatformPicPath(platform); if (path == null) { noPicList.add(apkList.remove(i)); size--; i--; } } } } else { if (downloadEntity.getStatus().equals(DownloadStatus.done)) { if (downloadEntity.isPluggable()) { pluginDoneList.add(apkList.remove(i)); size--; i--; } else if (downloadEntity.isUpdate()) { updateDoneList.add(apkList.remove(i)); size--; i--; } else { doneList.add(apkList.remove(i)); size--; i--; } } else { if (downloadEntity.isPluggable()) { pluginDownloadList.add(apkList.remove(i)); size--; i--; } else if (downloadEntity.isUpdate()) { updateDownloadList.add(apkList.remove(i)); size--; i--; } else { downloadList.add(apkList.remove(i)); size--; i--; } } } } ArrayList list = new ArrayList<>(); list.addAll(pluginDoneList); list.addAll(pluginDownloadList); list.addAll(pluginList); list.addAll(updateDoneList); list.addAll(updateDownloadList); list.addAll(updateList); list.addAll(doneList); list.addAll(downloadList); list.addAll(installList); list.addAll(apkList); list.addAll(noPicList); return list; } // 接收安装成功的消息,更新界面 public void onEvent(EBPackage busFour) { if ("安装".equals(busFour.getType())) { adapter.removeDownloadEntityByPackageName(busFour.getPackageName()); if (collectionAdapter != null) { collectionAdapter.removeDownloadEntityByPackageName(busFour.getPackageName()); } } else if ("卸载".equals(busFour.getType())) { adapter.updateItem(busFour.getPackageName()); if (collectionAdapter != null) { collectionAdapter.updateItem(busFour.getPackageName()); } } } //接收下载被删除消息 public void onEvent(EBDownloadStatus status) { if ("delete".equals(status.getStatus())) { String url = status.getUrl(); adapter.removeDownloadEntityByUrl(url); if (collectionAdapter != null) { collectionAdapter.removeDownloadEntityByUrl(url); } DownloadManager.getInstance(context).putStatus(url, "delete"); } } // 接收platform数据改变消息,更新界面 public void onEvent(EBReuse reuse) { if ("PlatformChanged".equals(reuse.getType())) { DownloadManager.getInstance(context).removeObserver(dataWatcher); init(new ArrayList<>(gameApk)); DownloadManager.getInstance(context).addObserver(dataWatcher); } } private void addHintPoint(LinearLayout linearLayout, int size) { if (size <= 1) { return; } for (int i = 0; i < size; i++) { ImageView imageView = new ImageView(context); LayoutParams lparams = new LayoutParams( DisplayUtils.dip2px(context, 6), DisplayUtils.dip2px(context, 6)); if (i == 0) { lparams.leftMargin = 0; imageView.setImageResource(R.drawable.oval_hint_up); } else { lparams.leftMargin = DisplayUtils.dip2px(context, 9); imageView.setImageResource(R.drawable.oval_hint_gray_bg); } imageView.setLayoutParams(lparams); linearLayout.addView(imageView); } } // 显示合集 @Override public void showCollection(GameCollectionEntity gameCollectionEntity) { dialog_ll_collection.setVisibility(View.VISIBLE); int count = gameCollectionEntity.getSaveApkEntity().size(); int vpHeight; if (count <= 3) { vpHeight = 80; } else if (count <= 6) { vpHeight = 140; } else { vpHeight = 200; } ViewGroup.LayoutParams layoutParams = collectionViewPager.getLayoutParams(); layoutParams.height = DisplayUtils.dip2px(context, vpHeight); collectionViewPager.setLayoutParams(layoutParams); dialog_ll_collection_hint.removeAllViews(); int size = (int) Math.ceil(gameCollectionEntity.getSaveApkEntity().size() / (double) (row * column)); addHintPoint(dialog_ll_collection_hint, size); collectionAdapter = new PlatformPagerAdapter( context, this, gameEntity, gameCollectionEntity.getSaveApkEntity(), entrance, location); collectionViewPager.setAdapter(collectionAdapter); collectionViewPager.addOnPageChangeListener(new MyPageChangeListener(dialog_ll_collection_hint)); } // 隐藏合集 @Override public void hideCollection() { dialog_ll_collection.setVisibility(View.GONE); collectionAdapter = null; } private class MyPageChangeListener implements OnPageChangeListener { private LinearLayout linearLayout; public MyPageChangeListener(LinearLayout linearLayout) { this.linearLayout = linearLayout; } @Override public void onPageScrolled(int i, float v, int i1) { } @Override public void onPageSelected(int position) { for (int i = 0, size = linearLayout.getChildCount(); i < size; i++) { if (i == position % size) { ((ImageView) linearLayout.getChildAt(i)) .setImageResource(R.drawable.oval_hint_up); } else { ((ImageView) linearLayout.getChildAt(i)) .setImageResource(R.drawable.oval_hint_gray_bg); } } } @Override public void onPageScrollStateChanged(int i) { } } }