Files
assistant-android/app/src/main/java/com/gh/gamecenter/adapter/InstallFragmentAdapter.java
chenjuntao df78db5686 UI微调
2018-04-19 16:42:08 +08:00

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);
}
}
}