package com.yzy.supercleanmaster.fragment; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageStatsObserver; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageStats; import android.graphics.drawable.Drawable; import android.os.AsyncTask; import android.os.Bundle; import android.os.RemoteException; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AnimationUtils; import android.widget.ListView; import android.widget.TextView; import com.yzy.supercleanmaster.R; import com.yzy.supercleanmaster.adapter.SoftwareAdapter; import com.yzy.supercleanmaster.base.BaseFragment; import com.yzy.supercleanmaster.model.AppInfo; import com.yzy.supercleanmaster.utils.StorageUtil; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import butterknife.ButterKnife; import butterknife.InjectView; public class SoftwareManageFragment extends BaseFragment { Context mContext; public static final int REFRESH_BT = 111; private static final String ARG_POSITION = "position"; private int position; // 0:应用软件,2 系统软件 SoftwareAdapter mAutoStartAdapter; @InjectView(R.id.listview) ListView listview; @InjectView(R.id.topText) TextView topText; List<AppInfo> userAppInfos = null; List<AppInfo> systemAppInfos = null; @InjectView(R.id.progressBar) View mProgressBar; @InjectView(R.id.progressBarText) TextView mProgressBarText; private Method mGetPackageSizeInfoMethod; AsyncTask<Void, Integer, List<AppInfo>> task; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); position = getArguments().getInt(ARG_POSITION); } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { // TODO Auto-generated method stub View view = inflater.inflate(R.layout.fragment_software, container, false); ButterKnife.inject(this, view); mContext = getActivity(); try { mGetPackageSizeInfoMethod = mContext.getPackageManager().getClass().getMethod( "getPackageSizeInfo", String.class, IPackageStatsObserver.class); } catch (NoSuchMethodException e) { e.printStackTrace(); } return view; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } @Override public void onResume() { super.onResume(); fillData(); } @Override public void onPause() { super.onPause(); task.cancel(true); } private void fillData() { if (position == 0) { topText.setText(""); } else { topText.setText("卸载下列软件,会影响正常使用"); } task = new AsyncTask<Void, Integer, List<AppInfo>>() { private int mAppCount = 0; @Override protected List<AppInfo> doInBackground(Void... params) { PackageManager pm = mContext.getPackageManager(); List<PackageInfo> packInfos = pm.getInstalledPackages(0); publishProgress(0, packInfos.size()); List<AppInfo> appinfos = new ArrayList<AppInfo>(); for (PackageInfo packInfo : packInfos) { publishProgress(++mAppCount, packInfos.size()); final AppInfo appInfo = new AppInfo(); Drawable appIcon = packInfo.applicationInfo.loadIcon(pm); appInfo.setAppIcon(appIcon); int flags = packInfo.applicationInfo.flags; int uid = packInfo.applicationInfo.uid; appInfo.setUid(uid); if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0) { appInfo.setUserApp(false);//系统应用 } else { appInfo.setUserApp(true);//用户应用 } if ((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) { appInfo.setInRom(false); } else { appInfo.setInRom(true); } String appName = packInfo.applicationInfo.loadLabel(pm).toString(); appInfo.setAppName(appName); String packname = packInfo.packageName; appInfo.setPackname(packname); String version = packInfo.versionName; appInfo.setVersion(version); try { mGetPackageSizeInfoMethod.invoke(mContext.getPackageManager(), new Object[]{ packname, new IPackageStatsObserver.Stub() { @Override public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException { synchronized (appInfo) { appInfo.setPkgSize(pStats.cacheSize + pStats.codeSize + pStats.dataSize); } } } }); } catch (Exception e) { } appinfos.add(appInfo); } return appinfos; } @Override protected void onProgressUpdate(Integer... values) { try { mProgressBarText.setText(getString(R.string.scanning_m_of_n, values[0], values[1])); } catch (Exception e) { } } @Override protected void onPreExecute() { try { showProgressBar(true); mProgressBarText.setText(R.string.scanning); } catch (Exception e) { } // loading.setVisibility(View.VISIBLE); super.onPreExecute(); } @Override protected void onPostExecute(List<AppInfo> result) { super.onPostExecute(result); try { showProgressBar(false); userAppInfos = new ArrayList<>(); systemAppInfos = new ArrayList<>(); long allSize = 0; for (AppInfo a : result) { if (a.isUserApp()) { allSize += a.getPkgSize(); userAppInfos.add(a); } else { systemAppInfos.add(a); } } if (position == 0) { topText.setText(getString(R.string.software_top_text, userAppInfos.size(), StorageUtil.convertStorage(allSize))); mAutoStartAdapter = new SoftwareAdapter(mContext, userAppInfos); listview.setAdapter(mAutoStartAdapter); } else { mAutoStartAdapter = new SoftwareAdapter(mContext, systemAppInfos); listview.setAdapter(mAutoStartAdapter); } } catch (Exception e) { } } }; task.execute(); } private boolean isProgressBarVisible() { return mProgressBar.getVisibility() == View.VISIBLE; } private void showProgressBar(boolean show) { if (show) { mProgressBar.setVisibility(View.VISIBLE); } else { mProgressBar.startAnimation(AnimationUtils.loadAnimation( mContext, android.R.anim.fade_out)); mProgressBar.setVisibility(View.GONE); } } @Override public void onDestroyView() { super.onDestroyView(); ButterKnife.reset(this); } }