536 lines
20 KiB
Java
536 lines
20 KiB
Java
package com.gh.gamecenter.adapter;
|
|
|
|
import android.content.SharedPreferences;
|
|
import android.content.pm.ApplicationInfo;
|
|
import android.content.pm.PackageInfo;
|
|
import android.content.pm.PackageManager;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.preference.PreferenceManager;
|
|
import android.support.v4.util.ArrayMap;
|
|
import android.support.v7.widget.RecyclerView.ViewHolder;
|
|
import android.text.TextUtils;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.widget.TextView;
|
|
|
|
import com.gh.common.constant.ItemViewType;
|
|
import com.gh.common.util.ApkActiveUtils;
|
|
import com.gh.common.util.BitmapUtils;
|
|
import com.gh.common.util.DataCollectionUtils;
|
|
import com.gh.common.util.DataUtils;
|
|
import com.gh.common.util.DisplayUtils;
|
|
import com.gh.common.util.DownloadItemUtils;
|
|
import com.gh.common.util.GameViewUtils;
|
|
import com.gh.common.util.ImageUtils;
|
|
import com.gh.common.util.PackageUtils;
|
|
import com.gh.common.util.PlatformUtils;
|
|
import com.gh.common.util.TrafficUtils;
|
|
import com.gh.common.view.SwipeLayout;
|
|
import com.gh.download.DownloadManager;
|
|
import com.gh.gamecenter.GameDetailActivity;
|
|
import com.gh.gamecenter.InstallActivity;
|
|
import com.gh.gamecenter.KcSelectGameActivity;
|
|
import com.gh.gamecenter.R;
|
|
import com.gh.gamecenter.adapter.viewholder.FooterViewHolder;
|
|
import com.gh.gamecenter.adapter.viewholder.GameNormalSwipeViewHolder;
|
|
import com.gh.gamecenter.db.info.InstallInfo;
|
|
import com.gh.gamecenter.entity.ApkEntity;
|
|
import com.gh.gamecenter.entity.GameEntity;
|
|
import com.gh.gamecenter.entity.GameInfoEntity;
|
|
import com.gh.gamecenter.kuaichuan.FileInfo;
|
|
import com.gh.gamecenter.manager.GameManager;
|
|
import com.gh.gamecenter.manager.InstallManager;
|
|
import com.gh.gamecenter.retrofit.Response;
|
|
import com.gh.gamecenter.retrofit.RetrofitManager;
|
|
import com.halo.assistant.HaloApp;
|
|
import com.lightgame.adapter.BaseRecyclerAdapter;
|
|
|
|
import java.io.File;
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.Comparator;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
import rx.Observable;
|
|
import rx.android.schedulers.AndroidSchedulers;
|
|
import rx.schedulers.Schedulers;
|
|
|
|
/**
|
|
* Created by LGT on 2016/8/12.
|
|
* 已安装界面-数据适配器
|
|
*/
|
|
public class InstallFragmentAdapter extends BaseRecyclerAdapter<ViewHolder> {
|
|
|
|
private InstallActivity mActivity;
|
|
|
|
private onSmoothLayoutListener smoothListener;
|
|
|
|
private SharedPreferences sp;
|
|
|
|
private ArrayList<GameEntity> gameList;
|
|
private ArrayList<GameInfoEntity> sortedList;
|
|
|
|
//下载用到的map
|
|
private ArrayMap<String, ArrayList<Integer>> locationMap;
|
|
|
|
private boolean isRemove;
|
|
|
|
private boolean isSwipe;
|
|
|
|
private boolean showKcHint;
|
|
|
|
private int maxWidth;
|
|
|
|
|
|
public InstallFragmentAdapter(InstallActivity activity) {
|
|
super(activity);
|
|
this.mActivity = activity;
|
|
smoothListener = activity;
|
|
|
|
gameList = new ArrayList<>();
|
|
sortedList = new ArrayList<>();
|
|
|
|
locationMap = new ArrayMap<>();
|
|
|
|
isRemove = false;
|
|
isSwipe = false;
|
|
|
|
sp = PreferenceManager.getDefaultSharedPreferences(mContext);
|
|
showKcHint = sp.getBoolean("showKcHint", true);
|
|
|
|
maxWidth = mContext.getResources().getDisplayMetrics().widthPixels;
|
|
|
|
InstallManager cManager = new InstallManager(mContext);
|
|
List<InstallInfo> runnableGame = cManager.getAllInstall();
|
|
if (runnableGame.isEmpty()) {
|
|
mActivity.loadEmpty();
|
|
} else {
|
|
HaloApp.getInstance().getMainExecutor().execute(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
init();
|
|
List<String> ids = new ArrayList<>();
|
|
Collections.sort(sortedList, new Comparator<GameInfoEntity>() { // 按安装时间排序
|
|
@Override
|
|
public int compare(GameInfoEntity lhs, GameInfoEntity rhs) {
|
|
return lhs.getInstallTime() > rhs.getInstallTime()? -1 : 1;
|
|
}
|
|
});
|
|
for (GameInfoEntity info : sortedList) {
|
|
if (!ids.contains(info.getId())) {
|
|
ids.add(info.getId());
|
|
}
|
|
}
|
|
initGameList(ids);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
//初始化
|
|
private void init() {
|
|
|
|
ArrayList<GameInfoEntity> list = new ArrayList<>();
|
|
ArrayList<GameInfoEntity> signatureList = new ArrayList<>(); // 是我们签名的游戏
|
|
ArrayList<GameInfoEntity> unsignatureList = new ArrayList<>(); // 不是我们签名的游戏
|
|
ArrayList<GameInfoEntity> noopenList = new ArrayList<>(); // 未打开过的游戏
|
|
ArrayList<GameInfoEntity> oftenuseList = new ArrayList<>(); // 已经打开过的游戏
|
|
|
|
TrafficUtils trafficUtils = TrafficUtils.getInstance(mContext);
|
|
|
|
InstallManager cManager = new InstallManager(mContext);
|
|
List<InstallInfo> runnableGame = cManager.getAllInstall();
|
|
for (InstallInfo concernEntity : runnableGame) {
|
|
for (Map.Entry<String, Boolean> entry : concernEntity.getPackageNames().entrySet()) {
|
|
if (entry.getValue()) {
|
|
GameInfoEntity info = new GameInfoEntity();
|
|
info.setId(concernEntity.getId());
|
|
info.setPackageName(entry.getKey());
|
|
info.setTraffic(trafficUtils.getTraffice(entry.getKey()));
|
|
info.setSignature(PackageUtils.isSignature(mContext, entry.getKey()));
|
|
info.setInstallTime(PackageUtils.getInstalledTime(mContext, entry.getKey()));
|
|
list.add(info);
|
|
}
|
|
}
|
|
}
|
|
|
|
ArrayMap<String, ArrayList<GameInfoEntity>> map = new ArrayMap<>();
|
|
ArrayList<GameInfoEntity> mList;
|
|
for (int i = 0, size = list.size(); i < size; i++) {
|
|
mList = map.get(list.get(i).getPackageName());
|
|
if (mList == null) {
|
|
mList = new ArrayList<>();
|
|
map.put(list.get(i).getPackageName(), mList);
|
|
}
|
|
mList.add(list.get(i));
|
|
}
|
|
Comparator<GameInfoEntity> comparator = new Comparator<GameInfoEntity>() {
|
|
@Override
|
|
public int compare(GameInfoEntity lhs, GameInfoEntity rhs) {
|
|
return rhs.getId().compareTo(lhs.getId());
|
|
}
|
|
};
|
|
Object gh_id;
|
|
for (String key : map.keySet()) {
|
|
mList = map.get(key);
|
|
if (mList.size() > 1) {
|
|
Collections.sort(mList, comparator);
|
|
}
|
|
if (mList.get(0).isSignature()) {
|
|
gh_id = PackageUtils.getMetaData(mContext, key, "gh_id");
|
|
for (GameInfoEntity info : mList) {
|
|
if (gh_id == null || info.getId().equals(gh_id)) {
|
|
signatureList.add(info);
|
|
break;
|
|
}
|
|
}
|
|
} else {
|
|
unsignatureList.add(mList.get(0));
|
|
}
|
|
}
|
|
|
|
for (GameInfoEntity info : signatureList) {
|
|
if (info.getTraffic() == 0) {
|
|
noopenList.add(info);
|
|
} else {
|
|
oftenuseList.add(info);
|
|
}
|
|
}
|
|
|
|
comparator = new Comparator<GameInfoEntity>() {
|
|
@Override
|
|
public int compare(GameInfoEntity lhs, GameInfoEntity rhs) {
|
|
if (rhs.getInstallTime() > lhs.getInstallTime()) {
|
|
return 1;
|
|
} else if (rhs.getInstallTime() < lhs.getInstallTime()) {
|
|
return -1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
};
|
|
Collections.sort(noopenList, comparator);
|
|
|
|
comparator = new Comparator<GameInfoEntity>() {
|
|
@Override
|
|
public int compare(GameInfoEntity lhs, GameInfoEntity rhs) {
|
|
if (rhs.getTraffic() > lhs.getTraffic()) {
|
|
return 1;
|
|
} else if (rhs.getTraffic() < lhs.getTraffic()) {
|
|
return -1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
};
|
|
Collections.sort(oftenuseList, comparator);
|
|
|
|
Collections.sort(unsignatureList, comparator);
|
|
|
|
sortedList.addAll(noopenList);
|
|
sortedList.addAll(oftenuseList);
|
|
sortedList.addAll(unsignatureList);
|
|
}
|
|
|
|
//获取游戏简介
|
|
private void initGameList(List<String> ids) {
|
|
final List<GameEntity> result = new ArrayList<>();
|
|
|
|
List<Observable<GameEntity>> sequences = new ArrayList<>();
|
|
for (String id : ids) {
|
|
sequences.add(RetrofitManager.getInstance(mContext).getApi().getGameDigest(id));
|
|
}
|
|
Observable.merge(sequences)
|
|
.subscribeOn(Schedulers.io())
|
|
.observeOn(AndroidSchedulers.mainThread())
|
|
.subscribe(new Response<GameEntity>() {
|
|
@Override
|
|
public void onCompleted() {
|
|
processingData(result);
|
|
}
|
|
|
|
@Override
|
|
public void onNext(GameEntity response) {
|
|
ApkActiveUtils.filterHideApk(response);
|
|
result.add(response);
|
|
}
|
|
});
|
|
}
|
|
|
|
private void processingData(List<GameEntity> gameList) {
|
|
if (gameList.size() != 0) {
|
|
for (int i = 0, size = sortedList.size(); i < size; i++) {
|
|
String id = sortedList.get(i).getId();
|
|
for (GameEntity entity : gameList) {
|
|
if (entity.getId().equals(id)) {
|
|
GameEntity newEntity = entity.clone();
|
|
newEntity.setLibaoExists(entity.isLibaoExists());
|
|
if (newEntity.getApk().size() > 1) {
|
|
for (ApkEntity apkEntity : newEntity.getApk()) {
|
|
if (sortedList.get(i).getPackageName().equals(apkEntity.getPackageName())) {
|
|
ArrayList<ApkEntity> list = new ArrayList<>();
|
|
list.add(apkEntity);
|
|
newEntity.setApk(list);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
this.gameList.add(newEntity);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
GameManager manager = new GameManager(mContext);
|
|
for (GameEntity entity : this.gameList) {
|
|
entity.setEntryMap(DownloadManager.getInstance(mContext).getEntryMap(entity.getName()));
|
|
manager.addOrUpdate(entity);
|
|
}
|
|
}
|
|
|
|
if (this.gameList.size() != 0) {
|
|
isRemove = true;
|
|
notifyDataSetChanged();
|
|
|
|
initLocationMap();
|
|
} else {
|
|
mActivity.loadEmpty();
|
|
}
|
|
}
|
|
|
|
private void initLocationMap() {
|
|
locationMap.clear();
|
|
GameEntity gameEntity;
|
|
ArrayList<Integer> list;
|
|
for (int i = 0; i < gameList.size(); i++) {
|
|
gameEntity = gameList.get(i);
|
|
if (gameEntity.getApk() != null && gameEntity.getApk().size() != 0) {
|
|
for (ApkEntity apkEntity : gameEntity.getApk()) {
|
|
list = locationMap.get(apkEntity.getPackageName());
|
|
if (list == null) {
|
|
list = new ArrayList<>();
|
|
locationMap.put(apkEntity.getPackageName(), list);
|
|
}
|
|
list.add(i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public ArrayList<GameEntity> getGameList() {
|
|
return gameList;
|
|
}
|
|
|
|
public ArrayMap<String, ArrayList<Integer>> getLocationMap() {
|
|
return locationMap;
|
|
}
|
|
|
|
@Override
|
|
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
|
switch (viewType) {
|
|
case ItemViewType.GAME_NORMAL:
|
|
return new GameNormalSwipeViewHolder(
|
|
mLayoutInflater.inflate(R.layout.game_normal_item_swipe, parent, false));
|
|
case ItemViewType.LOADING:
|
|
return new FooterViewHolder(
|
|
mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false));
|
|
case ItemViewType.KC_HINT:
|
|
return new KcHintViewHolder(
|
|
mLayoutInflater.inflate(R.layout.installfragment_footerview, parent, false));
|
|
default:
|
|
break;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public void onBindViewHolder(final ViewHolder holder, int position) {
|
|
if (holder instanceof GameNormalSwipeViewHolder) {
|
|
initGameNormal((GameNormalSwipeViewHolder) holder, gameList.get(position), position);
|
|
} else if (holder instanceof KcHintViewHolder) {
|
|
((KcHintViewHolder) holder).mTextView.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
sp.edit().putBoolean("showKcHint", false).apply();
|
|
smoothListener.onSmooth();
|
|
((KcHintViewHolder) holder).mTextView.postDelayed(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
showKcHint = false;
|
|
notifyDataSetChanged();
|
|
}
|
|
}, 500);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int getItemViewType(int position) {
|
|
if (gameList.size() != 0 && position >= 0 && position < gameList.size()) {
|
|
return ItemViewType.GAME_NORMAL;
|
|
}
|
|
|
|
if (isRemove && showKcHint) {
|
|
return ItemViewType.KC_HINT;
|
|
}
|
|
|
|
return ItemViewType.LOADING;
|
|
}
|
|
|
|
@Override
|
|
public int getItemCount() {
|
|
if (gameList.isEmpty() && !isRemove) {
|
|
return 1;
|
|
}
|
|
if (isRemove && showKcHint) {
|
|
return gameList.size() + 1;
|
|
}
|
|
if (isRemove) {
|
|
return gameList.size();
|
|
}
|
|
return gameList.size() + 1;
|
|
}
|
|
|
|
private void initGameNormal(final GameNormalSwipeViewHolder holder, final GameEntity gameEntity, final int i) {
|
|
|
|
holder.initServerType(gameEntity, mContext);
|
|
|
|
holder.swipeText.setPadding(0, 0, DisplayUtils.dip2px(mContext, 15), 0);
|
|
|
|
ImageUtils.Companion.display(holder.gameThumb, gameEntity.getIcon());
|
|
|
|
if (gameEntity.getApk() == null || gameEntity.getApk().isEmpty()
|
|
|| gameEntity.getTag() == null || gameEntity.getTag().isEmpty()) {
|
|
if (gameEntity.getApk() != null && gameEntity.getApk().size() > 0
|
|
&& !TextUtils.isEmpty(gameEntity.getApk().get(0).getVersion())) {
|
|
holder.gameDes.setText(String.format("V%s", gameEntity.getApk().get(0).getVersion()));
|
|
} else {
|
|
holder.gameDes.setText(gameEntity.getBrief());
|
|
}
|
|
holder.gameName.setText(gameEntity.getName());
|
|
} else {
|
|
holder.gameName.setText(String.format("%s - %s", gameEntity.getName(),
|
|
PlatformUtils.getInstance(mContext).getPlatformName(gameEntity.getApk().get(0).getPlatform())));
|
|
holder.gameDes.setText(String.format("V%s", gameEntity.getApk().get(0).getVersion()));
|
|
}
|
|
GameViewUtils.setLabelList(mContext, holder.gameLabelList, gameEntity.getTag(), "");
|
|
|
|
holder.cardView.setOnClickListener(new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View v) {
|
|
if (!isSwipe) {
|
|
Map<String, Object> kv = new HashMap<>();
|
|
kv.put("名字", gameEntity.getName());
|
|
kv.put("位置", String.valueOf(holder.getPosition() + 1));
|
|
DataUtils.onEvent(mContext, "点击", "我的光环-我的游戏", kv);
|
|
|
|
DataCollectionUtils.uploadClick(mContext, "列表", "我的光环-我的游戏", gameEntity.getName());
|
|
|
|
GameDetailActivity.startGameDetailActivity(mContext, gameEntity.getId(), "(我的光环:我的游戏)", true);
|
|
}
|
|
}
|
|
});
|
|
|
|
DownloadItemUtils.setOnClickListener(mContext, holder.gameDownloadBtn, gameEntity, i,
|
|
this, "(我的光环:我的游戏)", "我的光环-我的游戏" + ":" + gameEntity.getName());
|
|
|
|
DownloadItemUtils.updateItem(mContext, gameEntity, holder, false);
|
|
|
|
holder.swipeLayout.close();
|
|
holder.swipeShareText.setPadding((maxWidth / 12), 0, 0, 0);
|
|
holder.swipeLayout.addSwipeListener(new SwipeLayout.SwipeListener() {
|
|
@Override
|
|
public void onStartOpen(SwipeLayout layout) {
|
|
isSwipe = true;
|
|
|
|
}
|
|
|
|
@Override
|
|
public void onOpen(SwipeLayout layout) {
|
|
skipKc(i);
|
|
holder.swipeLayout.close();
|
|
}
|
|
|
|
@Override
|
|
public void onStartClose(SwipeLayout layout) {
|
|
}
|
|
|
|
@Override
|
|
public void onClose(SwipeLayout layout) {
|
|
isSwipe = false;
|
|
holder.swipeText.setText("右划发给好友\n免流量安装");
|
|
}
|
|
|
|
@Override
|
|
public void onUpdate(SwipeLayout layout, int leftOffset, int topOffset) {
|
|
if (leftOffset > maxWidth / 2.7 && leftOffset < maxWidth / 2.5) {
|
|
holder.swipeText.setVisibility(View.GONE);
|
|
holder.swipeShareText.setVisibility(View.VISIBLE);
|
|
} else if (leftOffset > maxWidth / 2.5) {
|
|
holder.swipeText.setVisibility(View.GONE);
|
|
holder.swipeShareText.setVisibility(View.VISIBLE);
|
|
holder.swipeShareText.setText("放手发给好友\n免流量安装");
|
|
} else if (leftOffset < maxWidth / 2.7) {
|
|
holder.swipeText.setVisibility(View.VISIBLE);
|
|
holder.swipeShareText.setVisibility(View.GONE);
|
|
holder.swipeShareText.setText("右划发给好友\n免流量安装");
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onHandRelease(SwipeLayout layout, float xvel, float yvel) {
|
|
}
|
|
});
|
|
}
|
|
|
|
//跳转到快传 - 搜索接收者页面
|
|
public void skipKc(int i) {
|
|
GameEntity gameEntity = gameList.get(i);
|
|
String packageName = gameEntity.getApk().get(0).getPackageName();
|
|
PackageManager pm = mContext.getPackageManager();
|
|
FileInfo fileInfo = new FileInfo();
|
|
List<PackageInfo> installedPackages = pm.getInstalledPackages(0);
|
|
for (PackageInfo installedPackage : installedPackages) {
|
|
if ((installedPackage.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0
|
|
&& installedPackage.packageName.equals(packageName)) {
|
|
fileInfo.setFilePath(installedPackage.applicationInfo.sourceDir);
|
|
File file = new File(installedPackage.applicationInfo.sourceDir);
|
|
fileInfo.setSize(file.length());
|
|
Drawable drawable = installedPackage.applicationInfo.loadIcon(pm);
|
|
fileInfo.setBitmap(BitmapUtils.drawableToBitmap(drawable));
|
|
fileInfo.setFileTag(String.valueOf(System.currentTimeMillis()));
|
|
}
|
|
}
|
|
if (gameEntity.getApk() == null || gameEntity.getApk().isEmpty()
|
|
|| gameEntity.getTag() == null || gameEntity.getTag().isEmpty()) {
|
|
fileInfo.setName(gameEntity.getName());
|
|
} else {
|
|
fileInfo.setName(String.format("%s - %s", gameEntity.getName(),
|
|
PlatformUtils.getInstance(mContext).getPlatformName(gameEntity.getApk().get(0).getPlatform())));
|
|
}
|
|
fileInfo.setPackageName(packageName);
|
|
List<FileInfo> fileInfos = new ArrayList<>();
|
|
fileInfos.add(fileInfo);
|
|
|
|
HaloApp.put(KcSelectGameActivity.KEY_FILE_INFO, fileInfos);
|
|
smoothListener.onOpen();
|
|
}
|
|
|
|
public interface onSmoothLayoutListener {
|
|
void onSmooth();
|
|
void onOpen(); // 启动跳转
|
|
}
|
|
|
|
public class KcHintViewHolder extends ViewHolder {
|
|
TextView mTextView;
|
|
|
|
public KcHintViewHolder(View itemView) {
|
|
super(itemView);
|
|
mTextView = (TextView) itemView.findViewById(R.id.kuaichuan_hint);
|
|
}
|
|
}
|
|
|
|
}
|