Files
assistant-android/app/src/main/java/com/gh/common/view/DownloadDialog.java

498 lines
15 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<ApkEntity> 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<ApkEntity> gameCollectionApk = new ArrayList<>();
ConcurrentHashMap<String, Integer> 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<ApkEntity> 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<ApkEntity> 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<ApkEntity> sortApk(List<ApkEntity> apkList) {
List<ApkEntity> pluginDoneList = new ArrayList<>(); // 安装插件
List<ApkEntity> pluginDownloadList = new ArrayList<>(); // 插件化下载中
List<ApkEntity> pluginList = new ArrayList<>(); // 插件化
List<ApkEntity> updateDoneList = new ArrayList<>(); // 安装更新
List<ApkEntity> updateDownloadList = new ArrayList<>(); // 更新下载中
List<ApkEntity> updateList = new ArrayList<>(); // 更新
List<ApkEntity> doneList = new ArrayList<>(); // 安装
List<ApkEntity> downloadList = new ArrayList<>(); // 下载中
List<ApkEntity> installList = new ArrayList<>(); // 启动
List<ApkEntity> 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<ApkEntity> 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) {
}
}
}