package cn.koolcloud.ipos.appstore.utils;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Environment;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import cn.koolcloud.ipos.appstore.cache.FileManager;
import cn.koolcloud.ipos.appstore.constant.Constants;
import cn.koolcloud.ipos.appstore.entity.AppInfo;
public class Env {
private final static String TAG = "ENV";
public static String DATA_FILES = Environment.getDataDirectory().getPath() + "/data/com.able.androidclient.apptop/files";
public static String DATA_DATA_BASES = Environment.getDataDirectory().getPath() + "/data/com.able.androidclient.apptop/databases";
public static String DATA_DATA_CACHE = Environment.getDataDirectory().getPath() + "/data/com.able.androidclient.apptop/cache";
public static String DATA_DATA_SHARED_PREFERENCE = Environment.getDataDirectory().getPath() + "/data/com.able.androidclient.apptop/cache";
public static String SD_CARD_APK_CACHE_DIR = Environment.getExternalStorageDirectory() + "/download/";
public static String SD_CARD_IMAGE_CACHE_DIR = Environment.getExternalStorageDirectory() + "/AppStore/ImageCache/";
// private static final String DATA_FILE = Environment.getDataDirectory().getPath() + "/data/com.able.androidclient.player/files";
// private static final String DATA_FILE = Environment.getDataDirectory().getPath() + "/data/com.able.androidclient.%s/files";
private static final String SD_HOME = "AppStore";
private static final String SD_IMG = "ImageCache";
private static File cacheDir;
public static File getImageCacheDirectory(Context context) {
if(FileManager.exsitSdcard()) {
cacheDir = new File(getExternalStorageDirectory(), SD_IMG);
} else {
cacheDir = null;
}
if(cacheDir != null) {
if(!cacheDir.exists()) {
cacheDir.mkdirs();//create all directory.
}
}
return cacheDir;
}
public static File getDataDirectoryPath(String appName) {
if(appName == null) {
return getAppDataDirectory();
}
File appDir = new File(getAppDataDirectory(), appName);
if(!appDir.exists()) {
appDir.mkdirs();//create all directory.
}
return appDir;
}
public static File getExternalStorageDirectory() {
File file = new File(Environment.getExternalStorageDirectory().getPath(), SD_HOME);
if(!file.exists()) {
file.mkdirs();//create all directory.
}
if(cacheDir != null) {
if(!cacheDir.exists()) {
cacheDir.mkdirs();//create all directory.
}
}
return new File(Environment.getExternalStorageDirectory().getPath(), SD_HOME);
}
public static File getAppDataDirectory() {
//StackTraceElement[] stackTraceElements = new Throwable().getStackTrace();
//String componentName = getCallingComponent(stackTraceElements[stackTraceElements.length-1].getClassName());
// File file = new File(String.format(DATA_FILE,componentName));
File file = new File(String.format(DATA_FILES));
if(!file.exists()) {
Logger.d("manifest mount disk = " + Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS);
Logger.d("manifest write disk = " + Environment.getDataDirectory().canWrite());
boolean b = file.mkdirs();//create all directory.
if (!b) {
Logger.e("CANNOT CREATE DIRECTORY :" + DATA_FILES);
return null;
}
}
return file;
}
/**
* @Title: getInstalledApps
* @Description: TODO get installed apps
* @param @param context
* @param @param getSysPackages if system apps
* @param @return
* @return ArrayList<AppInfo>
* @throws
*/
public static ArrayList<AppInfo> getInstalledAppsToList(Context context, boolean getSysPackages) {
PackageManager pManager = context.getPackageManager();
ArrayList<AppInfo> res = new ArrayList<AppInfo>();
List<PackageInfo> packs = pManager.getInstalledPackages(0);
int length = packs.size();
PackageInfo packageInfo;
String myPackageName = context.getApplicationInfo().packageName;
Pattern pattern = Pattern.compile(Constants.REG_PACKAGE_MATCH);
for (int i = 0; i < length; i++) {
packageInfo = packs.get(i);
Matcher matcher = pattern.matcher(packageInfo.applicationInfo.packageName);
if (packageInfo.applicationInfo.packageName.equals(myPackageName)) {
continue;
}
if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0) {
if (!matcher.matches()) {
continue;
}
}
AppInfo appInfo = new AppInfo();
String dir = packageInfo.applicationInfo.publicSourceDir;
long size = new File(dir).length();
appInfo.setName(packageInfo.applicationInfo.loadLabel(pManager).toString());
appInfo.setSoftSize(size);
appInfo.setIcon(pManager.getApplicationIcon(packageInfo.applicationInfo));
appInfo.setPackageName(packageInfo.packageName);
appInfo.setVersionName(packageInfo.versionName);
appInfo.setVersionCode(packageInfo.versionCode);
res.add(appInfo);
}
return res;
}
/**
* @Title: uninstallApp
* @Description: TODO uninstsall APP
* @param @param context
* @param @param packageName
* @return void
* @throws
*/
public static void uninstallApp(Context context, String packageName) {
Uri packageURI = Uri.parse("package:" + packageName);
Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
uninstallIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(uninstallIntent);
}
/**
* install app
*/
public static void openAPK(File f, Context context) {
context.startActivity(getInstallApp(f, context));
}
public static Intent getInstallApp(File f, Context context) {
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//set the place where the file come from
intent.putExtra("android.intent.extra.INSTALLER_PACKAGE_NAME", context.getPackageName());
intent.setAction(android.content.Intent.ACTION_VIEW);
/* set file for intent */
intent.setDataAndType(Uri.fromFile(f), "application/vnd.android.package-archive");
return intent;
}
public static int getVersionCode(Context context) {
int versionCode = 0;
try {
versionCode = context.getPackageManager().getPackageInfo(
context.getPackageName(), 0).versionCode;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return versionCode;
}
public static String getVersionName(Context context) {
String versionName = "";
try {
versionName = context.getPackageManager().getPackageInfo(
context.getPackageName(), 0).versionName;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return versionName;
}
public static String getPackageName(Context context) {
String packageName = "";
try {
packageName = context.getPackageManager().getPackageInfo(
context.getPackageName(), 0).packageName;
} catch (NameNotFoundException e) {
e.printStackTrace();
}
return packageName;
}
public static Map<String, PackageInfo> scanInstalledAppToMap(Context ctx) {
Map<String, PackageInfo> installedPackage = new HashMap<String, PackageInfo>();
List<PackageInfo> appPackage = ctx.getPackageManager()
.getInstalledPackages(0);// get installed apps info
Pattern pattern = Pattern.compile(Constants.REG_PACKAGE_MATCH);
for (int i = 0; i < appPackage.size(); i++) {
PackageInfo packageInfo = appPackage.get(i);
Matcher matcher = pattern.matcher(packageInfo.applicationInfo.packageName);
/*if ((packageInfo.applicationInfo.flags & android.content.pm.ApplicationInfo.FLAG_SYSTEM) == 0 ||
matcher.matches()) {
installedPackage.put(
packageInfo.applicationInfo.packageName, packageInfo);
Logger.d("appName:" + packageInfo.applicationInfo.loadLabel(
ctx.getPackageManager()).toString());
Logger.d("packageName:" + packageInfo.packageName);
Logger.d("versionName:" + packageInfo.versionName);
Logger.d("versionCode:" + packageInfo.versionCode);
}*/
if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0) {
if (!matcher.matches()) {
continue;
}
}
installedPackage.put(
packageInfo.applicationInfo.packageName, packageInfo);
Logger.d("appName:" + packageInfo.applicationInfo.loadLabel(
ctx.getPackageManager()).toString());
Logger.d("packageName:" + packageInfo.packageName);
Logger.d("versionName:" + packageInfo.versionName);
Logger.d("versionCode:" + packageInfo.versionCode);
}
return installedPackage;
}
/**
* @Title: getAPKPackageName
* @Description: get apk file package name
* @param @param context
* @param @param file
* @param @return
* @return String
* @throws
*/
public static String getAPKPackageName(Context context, File file) {
String packageName = null;
if (null != file && file.isFile() && file.exists()) {
String fileName = file.getName();
String apk_path = null;
if (fileName.toLowerCase().endsWith(".apk")) {
// apk absolute path
apk_path = file.getAbsolutePath();
PackageManager pm = context.getPackageManager();
PackageInfo packageInfo = pm.getPackageArchiveInfo(apk_path, PackageManager.GET_ACTIVITIES);
ApplicationInfo appInfo = packageInfo.applicationInfo;
/* apk icon */
appInfo.sourceDir = apk_path;
appInfo.publicSourceDir = apk_path;
Drawable apk_icon = appInfo.loadIcon(pm);
/* apk package name*/
packageName = packageInfo.packageName;
/* apk version String */
String versionName = packageInfo.versionName;
/* apk version code int */
int versionCode = packageInfo.versionCode;
}
}
return packageName;
}
/**
* @Title: getAPKPackageInfo
* @Description: get apk file package information
* @param @param context
* @param @param file
* @param @return
* @return PackageInfo
* @throws
*/
public static PackageInfo getAPKPackageInfo(Context context, File file) {
PackageInfo packageInfo = null;
String packageName = null;
if (null != file && file.isFile() && file.exists()) {
String fileName = file.getName();
String apk_path = null;
if (fileName.toLowerCase().endsWith(".apk")) {
// apk absolute path
apk_path = file.getAbsolutePath();
PackageManager pm = context.getPackageManager();
packageInfo = pm.getPackageArchiveInfo(apk_path, PackageManager.GET_ACTIVITIES);
if (packageInfo != null) {
ApplicationInfo appInfo = packageInfo.applicationInfo;
/* apk icon */
appInfo.sourceDir = apk_path;
appInfo.publicSourceDir = apk_path;
Drawable apk_icon = appInfo.loadIcon(pm);
/* apk package name*/
packageName = packageInfo.packageName;
/* apk version String */
String versionName = packageInfo.versionName;
/* apk version code int */
int versionCode = packageInfo.versionCode;
}
}
}
return packageInfo;
}
/**
* @Title: isAppInstalled
* @Description: TODO
* @param @param ctx
* @param @param appName
* @param @param versionName
* @param @return
* @return int 0 installed, -1 need update, -2 not installed
* @throws
*/
public static int isAppInstalled(Context ctx, String packageName, int versionCode, Map<String, PackageInfo> installedPackage) {
if (installedPackage != null) {
PackageInfo pi = installedPackage.get(packageName);
if (pi != null) {
int ret = pi.versionCode - versionCode;
if (ret < 0) {
ret = Constants.APP_NEW_VERSION_UPDATE;
} else if (ret >= 0) {
ret = Constants.APP_INSTALLED_OPEN;
}
return ret;
} else {
return Constants.APP_NO_INSTALLED_DOWNLOAD;
}
}
return Constants.APP_NO_INSTALLED_DOWNLOAD;
}
public static void install(Activity ctx, File file, int requestCode) {
Intent intent = new Intent(Intent.ACTION_VIEW);
try {
Runtime run = Runtime.getRuntime();
Process proc = run.exec("chmod 655 " + file.toString());
int result = proc.waitFor();
if (result == 0) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(file),
"application/vnd.android.package-archive");
ctx.startActivityForResult(intent, requestCode);
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static Intent getLaunchIntent(Context ctx, String packageName, Map<String, PackageInfo> installedPackage) {
return ctx.getPackageManager().getLaunchIntentForPackage(
installedPackage.get(packageName).packageName);
}
/**
* @Title: getCallingComponent
* @Description: TODO
* @param @param callingClass
* @param @return
* @return String
* @throws
*/
private static String getCallingComponent(String callingClass) {
Logger.d("calling class " + callingClass);
String[] packageValue = callingClass.split("\\.");
String callingComponent = packageValue[3];
return callingComponent;
}
public static String getDeviceInfo(Context ctx) {
TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE);
StringBuilder sb = new StringBuilder();
sb.append("\nDeviceId(IMEI) = " + tm.getDeviceId());
sb.append("\nDeviceSoftwareVersion = " + tm.getDeviceSoftwareVersion());
sb.append("\nLine1Number = " + tm.getLine1Number());
sb.append("\nNetworkCountryIso = " + tm.getNetworkCountryIso());
sb.append("\nNetworkOperator = " + tm.getNetworkOperator());
sb.append("\nNetworkOperatorName = " + tm.getNetworkOperatorName());
sb.append("\nNetworkType = " + tm.getNetworkType());
sb.append("\nPhoneType = " + tm.getPhoneType());
sb.append("\nSimCountryIso = " + tm.getSimCountryIso());
sb.append("\nSimOperator = " + tm.getSimOperator());
sb.append("\nSimOperatorName = " + tm.getSimOperatorName());
sb.append("\nSimSerialNumber = " + tm.getSimSerialNumber());
sb.append("\nSimState = " + tm.getSimState());
sb.append("\nSubscriberId(IMSI) = " + tm.getSubscriberId());
sb.append("\nVoiceMailNumber = " + tm.getVoiceMailNumber());
sb.append("\nandroid.os.Build.BOARD = " + android.os.Build.BOARD);
sb.append("\nandroid.os.Build.BOOTLOADER = "
+ android.os.Build.BOOTLOADER);
sb.append("\nandroid.os.Build.BRAND = " + android.os.Build.BRAND);
sb.append("\nandroid.os.Build.CPU_ABI = " + android.os.Build.CPU_ABI);
sb.append("\nandroid.os.Build.CPU_ABI2 = " + android.os.Build.CPU_ABI2);
sb.append("\nandroid.os.Build.DEVICE = " + android.os.Build.DEVICE);
sb.append("\nandroid.os.Build.DISPLAY = " + android.os.Build.DISPLAY);
sb.append("\nandroid.os.Build.FINGERPRINT = "
+ android.os.Build.FINGERPRINT);
sb.append("\nandroid.os.Build.HARDWARE = " + android.os.Build.HARDWARE);
sb.append("\nandroid.os.Build.HOST = " + android.os.Build.HOST);
sb.append("\nandroid.os.Build.ID = " + android.os.Build.ID);
sb.append("\nandroid.os.Build.MANUFACTURER = "
+ android.os.Build.MANUFACTURER);
sb.append("\nandroid.os.Build.MODEL = " + android.os.Build.MODEL);
sb.append("\nandroid.os.Build.PRODUCT = " + android.os.Build.PRODUCT);
// sb.append("\nandroid.os.Build.RADIO = " + android.os.Build.RADIO);
sb.append("\nandroid.os.Build.SERIAL = " + android.os.Build.SERIAL);
sb.append("\nandroid.os.Build.TAGS = " + android.os.Build.TAGS);
sb.append("\nandroid.os.Build.TIME = " + android.os.Build.TIME);
sb.append("\nandroid.os.Build.TYPE = " + android.os.Build.TYPE);
sb.append("\nandroid.os.Build.UNKNOWN = " + android.os.Build.UNKNOWN);
sb.append("\nandroid.os.Build.USER = " + android.os.Build.USER);
sb.append("\nandroid.os.Build.VERSION.RELEASE = " + android.os.Build.VERSION.RELEASE);
return sb.toString();
}
}