package com.mcxiaoke.apptoolkit.util;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ComponentInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Environment;
import com.mcxiaoke.apptoolkit.AppConfig;
import com.mcxiaoke.apptoolkit.model.AppInfo;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.nio.channels.FileChannel;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
* Project: filemanager
* Package: com.com.mcxiaoke.appmanager.util
* User: com.mcxiaoke
* Date: 13-6-10
* Time: 下午5:29
*/
public final class Utils {
public static Bitmap getAppIcon(Context context, String appPath) {
File file = new File(appPath);
if (file.getPath().endsWith(".apk")) {
String filePath = file.getPath();
PackageInfo packageInfo = context.getPackageManager().getPackageArchiveInfo(filePath, PackageManager.GET_ACTIVITIES);
if (packageInfo != null) {
ApplicationInfo appInfo = packageInfo.applicationInfo;
if (Build.VERSION.SDK_INT >= 8) {
appInfo.sourceDir = filePath;
appInfo.publicSourceDir = filePath;
}
Drawable icon = appInfo.loadIcon(context.getPackageManager());
return ((BitmapDrawable) icon).getBitmap();
}
}
return null;
}
public static Drawable getAppIcon(PackageManager pm, PackageInfo info) {
if (info != null) {
ApplicationInfo appInfo = info.applicationInfo;
return pm.getApplicationIcon(appInfo);
// Drawable icon = appInfo.loadIcon(context.getPackageManager());
}
return null;
}
public static AppInfo convert(PackageManager pm, String packageName) {
try {
PackageInfo info = pm.getPackageInfo(packageName, 0);
return convert(pm, packageName);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return null;
}
}
public static AppInfo convert(PackageManager pm, PackageInfo info) {
AppInfo app = new AppInfo();
ApplicationInfo ainfo = info.applicationInfo;
Intent intent = pm.getLaunchIntentForPackage(info.packageName);
if (intent != null) {
ComponentName cn = intent.getComponent();
try {
ActivityInfo ai = pm.getActivityInfo(cn, 0);
if (ai != null) {
app.mainName = ai.loadLabel(pm).toString();
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
if ((ainfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
}
app.appName = pm.getApplicationLabel(ainfo).toString();
app.processName = ainfo.processName;
app.sourceDir = ainfo.sourceDir;
app.publicSourceDir = ainfo.publicSourceDir;
app.dataDir = ainfo.dataDir;
app.uid = ainfo.uid;
app.packageName = info.packageName;
app.versionCode = info.versionCode;
app.versionName = info.versionName;
app.createdAt = info.firstInstallTime;
app.updatedAt = info.lastUpdateTime;
app.domain = getAppDomain(app.packageName);
app.system = isSystemApp(ainfo);
app.type = 0;
app.size = new File(app.sourceDir).length();
app.apkBackup = isBackupAppExists(app);
return app;
}
public static StringBuilder dumpPackageInfo(PackageManager pm, final PackageInfo info) {
StringBuilder builder = new StringBuilder();
ApplicationInfo app = info.applicationInfo;
Intent intent = pm.getLaunchIntentForPackage(info.packageName);
if (intent != null) {
ComponentName cn = intent.getComponent();
try {
ActivityInfo ai = pm.getActivityInfo(cn, 0);
builder.append("mainName: ").append(ai.loadLabel(pm)).append("\n");
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}
builder.append("appName: ").append(pm.getApplicationLabel(app)).append("\n");
builder.append("processName: ").append(app.processName).append("\n");
builder.append("sourceDir: ").append(app.sourceDir).append("\n");
builder.append("dataDir: ").append(app.dataDir).append("\n");
builder.append("uid: ").append(app.uid).append("\n");
builder.append("packageName: ").append(info.packageName).append("\n");
builder.append("versionCode: ").append(info.versionCode).append("\n");
builder.append("versionName: ").append(info.versionName).append("\n");
// builder.append("sharedUserId: ").append(info.sharedUserId).append("\n");
// builder.append("firstInstallTime: ").append(new Date(info.firstInstallTime)).append("\n");
// builder.append("lastUpdateTime: ").append(new Date(info.lastUpdateTime)).append("\n");
// builder.append("requestedPermissions: ").append(dumpPermissions(info)).append("\n");
// builder.append("permissions: ").append(info.permissions).append("\n");
// builder.append("gids: ").append(info.gids).append("\n");
// builder.append("activities: ").append(dumpActivityInfos(info)).append("\n");
// builder.append("receivers: ").append(dumpReceiverInfos(info)).append("\n");
// builder.append("services: ").append(dumpServiceInfos(info)).append("\n");
// builder.append("providers: ").append(dumpProviderInfos(info)).append("\n");
// builder.append("signatures: ").append(dumpSignatures(info)).append("\n");
// builder.append("configPreferences: ").append(info.configPreferences).append("\n");
// builder.append("reqFeatures: ").append(info.reqFeatures).append("\n");
return builder;
}
public static String dumpPermissions(PackageInfo info) {
String[] permissions = info.requestedPermissions;
StringBuilder builder = new StringBuilder();
if (permissions != null && permissions.length > 0) {
for (String permission : permissions) {
builder.append("Permission: ").append(permission).append("\n");
}
}
return builder.toString();
}
public static String dumpActivityInfos(PackageInfo info) {
ComponentInfo[] activities = info.activities;
StringBuilder builder = new StringBuilder();
if (activities != null && activities.length > 0) {
for (ComponentInfo a : activities) {
builder.append("Activity: ").append(a.packageName).append(".").append(a.name).append("\n");
}
}
return builder.toString();
}
public static String dumpReceiverInfos(PackageInfo info) {
ComponentInfo[] receivers = info.receivers;
StringBuilder builder = new StringBuilder();
if (receivers != null && receivers.length > 0) {
for (ComponentInfo a : receivers) {
builder.append("Receiver: ").append(a.packageName).append(".").append(a.name).append("\n");
}
}
return builder.toString();
}
public static String dumpServiceInfos(PackageInfo info) {
ComponentInfo[] services = info.services;
StringBuilder builder = new StringBuilder();
if (services != null && services.length > 0) {
for (ComponentInfo a : services) {
builder.append("Service: ").append(a.packageName).append(".").append(a.name).append("\n");
}
}
return builder.toString();
}
public static String dumpProviderInfos(PackageInfo info) {
ComponentInfo[] services = info.providers;
StringBuilder builder = new StringBuilder();
if (services != null && services.length > 0) {
for (ComponentInfo a : services) {
builder.append("Provider: ").append(a.packageName).append(".").append(a.name).append("\n");
}
}
return builder.toString();
}
public static String dumpSignatures(PackageInfo info) {
Signature[] signatures = info.signatures;
StringBuilder builder = new StringBuilder();
if (signatures != null && signatures.length > 0) {
for (Signature a : signatures) {
builder.append("Signature: ").append(getSignatureString(a)).append("\n");
}
}
return builder.toString();
}
public static String getSignatureString(Signature signature) {
Certificate certificate = getCertificate(signature);
StringBuilder builder = new StringBuilder();
if (certificate != null) {
PublicKey key = certificate.getPublicKey();
builder.append("Type: ").append(certificate.getType()).append(" Algorithm: ").append(key.getAlgorithm()).append(" Format: ").append(key.getFormat());
}
return builder.toString();
}
public static Certificate getCertificate(Signature signature) {
try {
byte[] bytes = signature.toByteArray();
final CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
final ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
final Certificate cert = certFactory.generateCertificate(bais);
return cert;
} catch (CertificateException e) {
return null;
}
}
public static PublicKey getPublicKey(Signature signature) {
Certificate certificate = getCertificate(signature);
if (certificate != null) {
return certificate.getPublicKey();
}
return null;
}
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd");
public static String formatDate(long time) {
Date date = new Date(time);
return DATE_FORMAT.format(date);
}
public static String getHumanReadableByteCount(long bytes) {
int unit = 1024;
if (bytes < unit) return bytes + " B";
int exp = (int) (Math.log(bytes) / Math.log(unit));
String pre = "KMGTPE".charAt(exp - 1) + "";
return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
}
public static boolean copyFile(File src, File dest) {
try {
FileChannel srcChannel = new FileInputStream(src).getChannel();
FileChannel destChannel = new FileOutputStream(dest).getChannel();
srcChannel.transferTo(0, srcChannel.size(), destChannel);
srcChannel.close();
destChannel.close();
return true;
} catch (Exception ex) {
ex.printStackTrace();
} finally {
}
return false;
}
public static String buildApkName(AppInfo app) {
return new StringBuilder().append(app.appName).append(".").append(app.versionName).append(".apk").toString();
}
public static boolean isPackageAlreadyInstalled(Activity context, String pkgName) {
List<PackageInfo> installedList = context.getPackageManager().getInstalledPackages(
PackageManager.GET_UNINSTALLED_PACKAGES);
int installedListSize = installedList.size();
for (int i = 0; i < installedListSize; i++) {
PackageInfo tmp = installedList.get(i);
if (pkgName.equalsIgnoreCase(tmp.packageName)) {
return true;
}
}
return false;
}
public static boolean isIceCreamSanwich() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH;
}
public static String buildProgressText(AppInfo app, boolean data) {
if (data) {
return app.dataDir;
}
return new StringBuilder().append(app.appName).append(" v").append(app.versionName).append("\n").append(app.sourceDir).toString();
}
public static boolean isSystemApp(PackageInfo info) {
return isSystemApp(info.applicationInfo);
}
public static boolean isSystemApp(ApplicationInfo info) {
return (info.flags & ApplicationInfo.FLAG_SYSTEM) == 1;
}
public static int getAppDomain(String packageName) {
if (packageName == null || packageName.trim().length() == 0) {
return AppConfig.DOMAIN_NORMAL;
}
if (packageName.startsWith(AppConfig.ANDROID_APP_PACKAGE_PREFIX)) {
return AppConfig.DOMAIN_ANDROID;
} else if (packageName.startsWith(AppConfig.GOOGLE_APP_PACKAGE_PREFIX)) {
return AppConfig.DOMAIN_GOOGLE;
} else {
return AppConfig.DOMAIN_NORMAL;
}
}
public static boolean isSdcardMounted() {
return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
}
public static File getBackupAppsDir() {
return checkDir(AppConfig.BACKUP_APPS_DIR);
}
public static boolean isBackupAppExists(AppInfo app) {
File file = new File(getBackupAppsDir(), buildApkName(app));
return app.size == file.length();
}
public static File getBackupDataDir() {
return checkDir(AppConfig.BACKUP_DATA_DIR);
}
public static boolean isBackupDataExists(AppInfo app) {
File file = new File(getBackupDataDir(), app.packageName);
return file.exists() && file.isDirectory();
}
public static File checkDir(String dir) {
File sdcard = Environment.getExternalStorageDirectory();
File appDir = new File(sdcard, AppConfig.APP_TOOL_DIR);
File backupDir = new File(appDir, dir);
if (!backupDir.exists()) {
backupDir.mkdirs();
}
return backupDir;
}
public static List<String> getBackupApkFiles() {
File backupApkDir = getBackupAppsDir();
String[] allFiles = backupApkDir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String filename) {
return filename.lastIndexOf(".apk") != -1;
}
});
return allFiles == null ? new ArrayList<String>() : Arrays.asList(allFiles);
}
public static boolean isBackupDataExists(String packageName) {
File file = new File(getBackupDataDir(), packageName);
return file.exists() && file.isDirectory();
}
}