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.R; import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; import com.gh.gamecenter.adapter.viewholder.GameNormalSwipeViewHolder; import com.gh.gamecenter.db.info.ConcernInfo; 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.ConcernManager; import com.gh.gamecenter.manager.GameManager; 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 { private InstallActivity mActivity; private onSmoothLayoutListener smoothListener; private SharedPreferences sp; private ArrayList gameList; private ArrayList sortedList; //下载用到的map private ArrayMap> 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; ConcernManager cManager = new ConcernManager(mContext); List runnableGame = cManager.getInstalledGame(); if (runnableGame.isEmpty()) { mActivity.loadEmpty(); } else { HaloApp.MAIN_EXECUTOR.execute(new Runnable() { @Override public void run() { init(); List ids = new ArrayList<>(); Collections.sort(sortedList, new Comparator() { // 按安装时间排序 @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 list = new ArrayList<>(); ArrayList signatureList = new ArrayList<>(); // 是我们签名的游戏 ArrayList unsignatureList = new ArrayList<>(); // 不是我们签名的游戏 ArrayList noopenList = new ArrayList<>(); // 未打开过的游戏 ArrayList oftenuseList = new ArrayList<>(); // 已经打开过的游戏 TrafficUtils trafficUtils = TrafficUtils.getInstance(mContext); ConcernManager cManager = new ConcernManager(mContext); List runnableGame = cManager.getInstalledGame(); for (ConcernInfo concernEntity : runnableGame) { for (Map.Entry 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> map = new ArrayMap<>(); ArrayList 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 comparator = new Comparator() { @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() { @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() { @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 ids) { final List result = new ArrayList<>(); List> 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() { @Override public void onCompleted() { processingData(result); } @Override public void onNext(GameEntity response) { ApkActiveUtils.filterHideApk(response); result.add(response); } }); } private void processingData(List 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 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.getApk(), entity.getId(), entity.getName()); } } if (this.gameList.size() != 0) { isRemove = true; notifyDataSetChanged(); initLocationMap(); } } private void initLocationMap() { locationMap.clear(); GameEntity gameEntity; ArrayList 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 getGameList() { return gameList; } public ArrayMap> 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.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 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(), "(我的光环:我的游戏)"); } } }); int paddRight = 0; String serverType = gameEntity.getServerType(); if (TextUtils.isEmpty(serverType)) { holder.gameServerType.setVisibility(View.GONE); } else { holder.gameServerType.setVisibility(View.VISIBLE); holder.gameServerType.setText(serverType); if ("删档内测".equals(serverType) || "不删档内测".equals(serverType)) { holder.gameServerType.setBackgroundResource(R.drawable.textview_server_tag); if ("删档内测".equals(serverType)) { paddRight = DisplayUtils.dip2px(mContext, 50); } else { paddRight = DisplayUtils.dip2px(mContext, 60); } } else { holder.gameServerType.setBackgroundResource(R.drawable.textview_orange_up); paddRight = DisplayUtils.dip2px(mContext, 30); } } holder.gameName.setPadding(0, 0, paddRight, 0); 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 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 fileInfos = new ArrayList<>(); fileInfos.add(fileInfo); HaloApp.put(HaloApp.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); } } }