快传(接收方图片缩略图尚需改进, 连接断开处理尚需改进),安装包清理, 网页传网页乱码未解决

This commit is contained in:
khy
2017-02-10 10:33:09 +08:00
parent 575ba33e43
commit cb54d87daf
47 changed files with 4454 additions and 23 deletions

View File

@ -0,0 +1,330 @@
package com.gh.gamecenter.adapter;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.os.Handler;
import android.support.v4.util.ArrayMap;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CompoundButton;
import android.widget.TextView;
import com.gh.common.util.BitmapUtils;
import com.gh.common.util.PackageUtils;
import com.gh.common.view.CardLinearLayout;
import com.gh.gamecenter.CleanApkActivity;
import com.gh.gamecenter.R;
import com.gh.gamecenter.adapter.viewholder.KcSelectGameViewHolder;
import com.gh.gamecenter.entity.InstallGameEntity;
import java.io.File;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* Created by khy on 2017/1/24.
*/
public class CleanApkAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context mContext;
private List<InstallGameEntity> mApkList;
private OnScanListener scanListener;
private ArrayMap<Integer, Boolean> mSelectPosition;
private static int INSTALLED = 0; // 表示已经安装
private static int UNINSTALLED = 1; // 表示未安装
private int cardMargin;
private boolean isStopScan;
private TextView mApkDeleteBtn;
private boolean isScanOver;
Handler handler = new Handler();
public CleanApkAdapter(CleanApkActivity activity, TextView apkDeleteBtn) {
this.mContext = activity;
this.mApkDeleteBtn = apkDeleteBtn;
scanListener = activity;
mApkList = new ArrayList<>();
mSelectPosition = new ArrayMap<>();
isStopScan = false;
isScanOver = false;
cardMargin = (int) mContext.getResources().getDimension(R.dimen.cardview_margin);
init();
}
private void init() {
new Thread(new Runnable() {
@Override
public void run() {
FindAllAPKFile(Environment.getExternalStorageDirectory());
handler.post(new Runnable() {
@Override
public void run() {
isScanOver = true;
scanListener.onScanOver();
if (mApkList.size() == 0) {
scanListener.noData();
}
notifyItemRangeChanged(0, getItemCount());
}
});
}
}).start();
}
public void FindAllAPKFile(File file) {
if (isStopScan) {
return;
}
// 手机上的文件,目前只判断SD卡上的APK文件
// file = Environment.getDataDirectory();
// SD卡上的文件目录
if (file.isFile()) {
// Utils.log("===== 是文件" + file.getAbsolutePath().toString());
String name_s = file.getName();
InstallGameEntity apkEntity = new InstallGameEntity();
String apk_path = null;
// MimeTypeMap.getSingleton()
if (name_s.toLowerCase().endsWith(".apk")) {
apk_path = file.getAbsolutePath();// apk文件的绝对路劲
PackageManager pm = mContext.getPackageManager();
PackageInfo packageInfo = pm.getPackageArchiveInfo(apk_path, PackageManager.GET_ACTIVITIES);
if (packageInfo == null) return;
ApplicationInfo appInfo = packageInfo.applicationInfo;
/**获取apk的图标 */
appInfo.sourceDir = apk_path;
appInfo.publicSourceDir = apk_path;
Drawable apk_icon = appInfo.loadIcon(pm);
apkEntity.setGameBm(BitmapUtils.drawableToBitmap(apk_icon));
/** apk的绝对路劲 */
apkEntity.setGamePath(file.getAbsolutePath());
/** apk的版本名称 String */
String versionName = packageInfo.versionName;
apkEntity.setGameVersion(versionName);
String apkName = packageInfo.applicationInfo.loadLabel(pm).toString();
apkEntity.setGameName(apkName);
apkEntity.setGameSize(file.length());
/**安装处理类型*/
/** 得到包名 */
String packageName = packageInfo.packageName;
int type = doType(pm, packageName);
apkEntity.setInstallStatus(type);
mApkList.add(apkEntity);
mSelectPosition.put((mApkList.size() - 1), false);
handler.post(new Runnable() {
@Override
public void run() {
notifyItemInserted((mApkList.size() - 1));
}
});
}
} else {
// Utils.log("===== 是文件夹" + file.getAbsolutePath().toString());
File[] files = file.listFiles();
if (files != null && files.length > 0) {
for (File file_str : files) {
FindAllAPKFile(file_str);
}
}
}
}
private int doType(PackageManager pm, String packageName) {
List<PackageInfo> pakageinfos = pm.getInstalledPackages(0);
for (PackageInfo pi : pakageinfos) {
if ((pi.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
String pi_packageName = pi.packageName;
//如果这个包名在系统已经安装过的应用中存在
if(packageName.endsWith(pi_packageName)){
return INSTALLED;
}
}
}
return UNINSTALLED;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(
R.layout.kc_game_select_item, parent, false);
return new KcSelectGameViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {
final InstallGameEntity gameEntity = mApkList.get(position);
if (viewHolder instanceof KcSelectGameViewHolder) {
KcSelectGameViewHolder holder = (KcSelectGameViewHolder) viewHolder;
// 第一个
if (position == 0) {
((CardLinearLayout) holder.itemView).setmTop(cardMargin);
} else {
((CardLinearLayout) holder.itemView).setmTop(0);
}
// 最后一个
if (position == mApkList.size() - 1) {
((CardLinearLayout) holder.itemView).setBottom(true);
} else {
((CardLinearLayout) holder.itemView).setBottom(false);
}
double size = (((float)gameEntity.getGameSize()/1024)/1024);
DecimalFormat df = new DecimalFormat("#.00");
String sizeName = df.format(size) + "MB";
// Spanned spanned = Html.fromHtml("大小:" + "<font color=\"#00B7FA\">" + sizeName + "</font>");
// holder.gameSize.setText(spanned);
holder.selectCB.setVisibility(View.VISIBLE);
if (mSelectPosition.get(position)) {
holder.selectCB.setChecked(true);
} else {
holder.selectCB.setChecked(false);
}
holder.gameNameAndSize.setText(gameEntity.getGameName());
holder.gameDes.setText("版本V" + gameEntity.getGameVersion() + " | " + sizeName);
holder.gameThumb.setImageBitmap(gameEntity.getGameBm());
if (gameEntity.getInstallStatus() == INSTALLED) {
holder.gameSize.setText("已安装");
holder.gameSize.setTextColor(mContext.getResources().getColor(R.color.theme));
} else {
holder.gameSize.setText("未安装");
holder.gameSize.setTextColor(Color.RED);
}
if (isScanOver) {
holder.selectCB.setEnabled(true);
} else {
holder.selectCB.setEnabled(false);
}
holder.selectCB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
mSelectPosition.put(position, true);
} else {
mSelectPosition.put(position, false);
}
long gameSize = 0;
for (Integer integer : mSelectPosition.keySet()) {
if (mSelectPosition.get(integer)) {
gameSize = gameSize + mApkList.get(integer).getGameSize();
}
}
if (gameSize == 0) {
mApkDeleteBtn.setText("一键删除");
} else {
double size = (((float)gameSize/1024)/1024);
DecimalFormat df = new DecimalFormat("#.00");
String sizeName = df.format(size) + "MB";
mApkDeleteBtn.setText("一键删除("+ sizeName +"");
}
}
});
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isScanOver) {
PackageUtils.launchSetup(mContext, gameEntity.getGamePath());
}
}
});
}
}
@Override
public int getItemCount() {
return mApkList.size();
}
public List<InstallGameEntity> getApkList() {
return mApkList;
}
public ArrayMap<Integer, Boolean> getSelectPosition() {
return mSelectPosition;
}
public void setSelectPosition(ArrayMap<Integer, Boolean> selectPosition) {
this.mSelectPosition = selectPosition;
}
public void isStopScan () {
this.isStopScan = true;
}
public void deleteApk(int position) {
mApkList.remove(position);
Iterator<Map.Entry<Integer, Boolean>> iterator = mSelectPosition.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Integer, Boolean> entry = iterator.next();
Integer key = entry.getKey();
if (key == position) {
iterator.remove();
}
}
ArrayMap<Integer, Boolean> newMap = new ArrayMap<>(mSelectPosition);
for (Integer integer : newMap.keySet()) {
if (integer > position) {
int newPosition = integer - 1;
mSelectPosition.put(newPosition, mSelectPosition.get(integer));
}
}
if (mSelectPosition.size() > mApkList.size()) {
mSelectPosition.removeAt(mSelectPosition.size() - 1);
}
notifyItemRemoved(position);
}
public interface OnScanListener {
void onScanOver();
void noData();
}
}