/* * Copyright (C) 2014 The AppCan Open Source Project. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package org.zywx.wbpalmstar.engine; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.res.AssetManager; import android.database.Cursor; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Parcelable; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.webkit.MimeTypeMap; import org.zywx.wbpalmstar.base.BUtility; import org.zywx.wbpalmstar.base.ResoureFinder; import org.zywx.wbpalmstar.base.vo.ShareInputVO; import org.zywx.wbpalmstar.platform.encryption.PEncryption; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.InetSocketAddress; import java.net.Proxy; import java.util.ArrayList; import dalvik.system.DexClassLoader; public class EUtil { public static boolean debug = false; public static void logi(String msg) { if (!debug) { return; } Log.i("ldx", "" + msg); } public static void logd(String msg) { if (!debug) { return; } Log.d("ldx", "" + msg); } public static void loge(String msg) { if (!debug) { return; } Log.e("ldx", "" + msg); } public static void logw(String msg) { if (!debug) { return; } Log.w("ldx", "" + msg); } public static void printeBackup(Bundle data, String lev) { if (!debug) { return; } Log.d("backup", "---- " + lev + " begin ----"); if (null != data) { for (String key : data.keySet()) { Object value = data.get(key); Log.d("backup", "key = " + key + " , value = " + value); } } } public static void viewBaseSetting(View target) { target.setFadingEdgeLength(0); // target.setWillNotDraw(true); target.setWillNotCacheDrawing(true); target.setBackgroundColor(0x00000000); } public static DexClassLoader loadDex(Context ctx, String dexAssertPath) { int index = dexAssertPath.lastIndexOf('/'); if (index < 0) { return null; } String dexName = dexAssertPath.substring(index); String dexPath = ctx.getDir("dex", Context.MODE_PRIVATE).getAbsolutePath() + dexName; File f = new File(dexPath); if (!f.exists()) { boolean ok = copyDex(ctx, dexAssertPath, dexPath); if (!ok) { return null; } } String dexOutputDir = ctx.getDir("outdex", Context.MODE_PRIVATE).getAbsolutePath(); DexClassLoader cl = new DexClassLoader(dexPath, dexOutputDir, null, ctx.getClassLoader()); return cl; } private static boolean copyDex(Context ctx, String dexAssertPath, String dexPath) { AssetManager assets = ctx.getAssets(); InputStream inStream = null; OutputStream dexWriter = null; boolean suc = true; try { inStream = assets.open(dexAssertPath); FileOutputStream outStream = new FileOutputStream(dexPath); dexWriter = new BufferedOutputStream(outStream); byte[] buf = new byte[1024 * 8]; int len; while ((len = inStream.read(buf)) > 0) { dexWriter.write(buf, 0, len); } dexWriter.close(); inStream.close(); } catch (Exception e) { e.printStackTrace(); suc = false; } finally { try { if (null != inStream) { inStream.close(); } if (null != dexWriter) { dexWriter.close(); } } catch (Exception e) { e.printStackTrace(); } } return suc; } public static String execRootCmd(String cmd) { String result = "result : "; try { Process p = Runtime.getRuntime().exec("su "); OutputStream outStream = p.getOutputStream(); DataOutputStream dOutStream = new DataOutputStream(outStream); InputStream inStream = p.getInputStream(); DataInputStream dInStream = new DataInputStream(inStream); String str1 = String.valueOf(cmd); String str2 = str1 + "\n"; dOutStream.writeBytes(str2); dOutStream.flush(); String str3 = null; String line = ""; while ((line = dInStream.readLine()) != null) { Log.d("result", str3); str3 += line; } dOutStream.writeBytes("exit\n"); dOutStream.flush(); p.waitFor(); return result; } catch (Exception e) { e.printStackTrace(); return result; } } public static int execRootCmdSilent(String cmd) { try { Process p = Runtime.getRuntime().exec("su "); Object obj = p.getOutputStream(); DataOutputStream dOutStream = new DataOutputStream((OutputStream) obj); String str = String.valueOf(cmd); obj = str + "\n"; dOutStream.writeBytes((String) obj); dOutStream.flush(); dOutStream.writeBytes("exit\n"); dOutStream.flush(); p.waitFor(); int result = p.exitValue(); return (Integer) result; } catch (Exception e) { e.printStackTrace(); return -1; } } static boolean isSilent = true; public static boolean deviceBeRoot() { if (isSilent) { return isRootSystem(); } int i = execRootCmdSilent("echo test"); if (i != -1) { return true; } return false; } public static boolean isRootSystem() { String paths[] = {"/system/bin/", "/system/xbin/", "/system/sbin/", "/sbin/", "/vendor/bin/"}; try { File file = null; String su = "su"; for (String dir : paths) { file = new File(dir + su); if (file != null && file.exists()) { return true; } } } catch (Exception e) { e.printStackTrace(); } return false; } // public static String htmlDecode(byte[] bit, String name){ // String result = ""; // // if(bit == null || 0 == bit.length){ // return result; // } // String zywx = "3G2WIN Safe Guard"; // int actualLen = bit.length; // int zyLen = zywx.length(); // // if(actualLen <= zyLen){ // return new String(bit); // } // // int start = actualLen - zyLen; // String endStr = new String(bit, start, zyLen); // if(!zywx.equals(endStr)){ // return new String(bit); // } // // int skip = zyLen + 256; // if(actualLen <= skip){ // // return new String(bit); // } // int realLen = actualLen - skip; // result = nativeHtmlDecode(bit, name, Integer.toString(realLen)); // return result; // } // // static{ // System.loadLibrary("appcan"); // } // public static String getCertificatePsw(Context context, String appId) { String psw = ResoureFinder.getInstance().getString( context, "certificate_psw"); byte[] pswToByte = hexStringToBinary(psw); return new String(PEncryption.os_decrypt( pswToByte, pswToByte.length, appId)); } /** * @param hexString * @return 将十六进制转换为字节数组 */ private static byte[] hexStringToBinary(String hexString) { String hexStr = "0123456789ABCDEF"; // hexString的长度对2取整,作为bytes的长度 int len = hexString.length() / 2; byte[] bytes = new byte[len]; byte high = 0;// 字节高四位 byte low = 0;// 字节低四位 for (int i = 0; i < len; i++) { // 右移四位得到高位 high = (byte) ((hexStr.indexOf(hexString.charAt(2 * i))) << 4); low = (byte) hexStr.indexOf(hexString.charAt(2 * i + 1)); bytes[i] = (byte) (high | low);// 高地位做或运算 } return bytes; } public static java.net.Proxy checkJavaProxy(Context context) { java.net.Proxy proxy = null; if (!wifiEnable(context)) {// 获取当前正在使用的APN接入点 Uri uri = Uri.parse("content://telephony/carriers/preferapn"); Cursor mCursor = context.getContentResolver().query(uri, null, null, null, null); if (mCursor != null && mCursor.moveToFirst()) { String proxyStr = mCursor.getString(mCursor.getColumnIndex("proxy")); int proxyPort = mCursor.getInt(mCursor.getColumnIndex("port")); if (proxyStr != null && proxyStr.trim().length() > 0) { if (0 == proxyPort) { proxyPort = 80; } proxy = new java.net.Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyStr, proxyPort)); } mCursor.close(); } } return proxy; } public static boolean wifiEnable(Context context) { return NETWORK_CLASS_WIFI == getConnectedType(context); } /** * Unknown network class */ public static final int NETWORK_CLASS_UNKNOWN = 0; /** * Class of broadly defined "2G" networks */ public static final int NETWORK_CLASS_2_G = 1; /** * Class of broadly defined "3G" networks */ public static final int NETWORK_CLASS_3_G = 2; /** * Class of broadly defined "4G" networks */ public static final int NETWORK_CLASS_4_G = 3; /** * Class of broadly defined "WiFi" networks */ public static final int NETWORK_CLASS_WIFI = 4; public static int getConnectedType(Context context) { ConnectivityManager cManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo nInfo = cManager.getActiveNetworkInfo(); if (nInfo != null && nInfo.isAvailable()) { int type = nInfo.getType(); int subType = nInfo.getSubtype(); switch (type) { case ConnectivityManager.TYPE_MOBILE: switch (subType) { case 1://TelephonyManager.NETWORK_TYPE_GPRS: case 2://TelephonyManager.NETWORK_TYPE_EDGE: case 4://TelephonyManager.NETWORK_TYPE_CDMA: case 7://TelephonyManager.NETWORK_TYPE_1xRTT: case 11://TelephonyManager.NETWORK_TYPE_IDEN: return NETWORK_CLASS_2_G; case 3://TelephonyManager.NETWORK_TYPE_UMTS: case 5://TelephonyManager.NETWORK_TYPE_EVDO_0: case 6://TelephonyManager.NETWORK_TYPE_EVDO_A: case 8://TelephonyManager.NETWORK_TYPE_HSDPA: case 9://TelephonyManager.NETWORK_TYPE_HSUPA: case 10://TelephonyManager.NETWORK_TYPE_HSPA: case 12://TelephonyManager.NETWORK_TYPE_EVDO_B: case 14://TelephonyManager.NETWORK_TYPE_EHRPD: case 15://TelephonyManager.NETWORK_TYPE_HSPAP: return NETWORK_CLASS_3_G; case 13://TelephonyManager.NETWORK_TYPE_LTE: return NETWORK_CLASS_4_G; default: return NETWORK_CLASS_UNKNOWN; } case ConnectivityManager.TYPE_WIFI: return NETWORK_CLASS_WIFI; } } return NETWORK_CLASS_UNKNOWN; } // private native static String nativeHtmlDecode(byte[] bit, String name, String lenStr); public static void installApp(Context context, String inAppPath) { if (null == inAppPath || 0 == inAppPath.trim().length()) { return; } String reallyPath = ""; File file = new File(inAppPath); if (file.exists()) { reallyPath = inAppPath; } else { reallyPath = copyFileToStorage(context, inAppPath); if (null == reallyPath) { return; } } // install apk. Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); MimeTypeMap type = MimeTypeMap.getSingleton(); String mime = type.getMimeTypeFromExtension("apk"); reallyPath = reallyPath.contains("file://") ? reallyPath : ("file://" + reallyPath); intent.setDataAndType(Uri.parse(reallyPath), mime); context.startActivity(intent); } public static String copyFileToStorage(Context context, String inFilePath) { if (!BUtility.sdCardIsWork()) { return null; } String ext = Environment.getExternalStorageDirectory() + File.separator + "download"; String fileName = subFileName(inFilePath); String newFilePath = ext + File.separator + fileName; File file = new File(newFilePath); if (file.exists()) { return newFilePath; } try { AssetManager assrt = context.getAssets(); InputStream input = assrt.open(inFilePath); file.createNewFile(); FileOutputStream output = new FileOutputStream(file); byte[] temp = new byte[8 * 1024]; int i = 0; while ((i = input.read(temp)) > 0) { output.write(temp, 0, i); } output.close(); input.close(); } catch (Exception e) { return null; } return newFilePath; } public static String subFileName(String inCertPath) { if (null == inCertPath) { return null; } int index = inCertPath.lastIndexOf(File.separator); if (index < 0) { return inCertPath; } return inCertPath.substring(index + 1); } public static void uninstallApp(Context context, String packageName) { // Create new intent to launch Uninstaller activity Uri packageURI = Uri.parse("package:" + packageName); Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI); context.startActivity(uninstallIntent); } public final void createSystemSwitcherShortCut(Context context, String shortCutName) { Intent addIntent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); Parcelable icon = Intent.ShortcutIconResource.fromContext(context, EResources.icon); addIntent.putExtra("duplicate", false); Intent targetIntent = new Intent(context, EBrowserActivity.class); targetIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); addIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, shortCutName); addIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon); addIntent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, targetIntent); context.sendBroadcast(addIntent); } public static void share(Context context, ShareInputVO inputVO){ Intent intent=new Intent(); if (inputVO.getImgPaths()!=null&&inputVO.getImgPaths().size()>0){ //分享多张图片 intent.setAction(Intent.ACTION_SEND_MULTIPLE); ArrayList<Uri> imagePathList = new ArrayList<Uri>(); for(String picPath: inputVO.getImgPaths()){ File file=new File(picPath); imagePathList.add(Uri.fromFile(file)); } intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM,imagePathList); }else{ intent.setAction(Intent.ACTION_SEND); } if (!TextUtils.isEmpty(inputVO.getPackageName())&& !TextUtils.isEmpty(inputVO.getClassName())) { intent.setComponent(new ComponentName(inputVO.getPackageName(), inputVO.getClassName())); } if (!TextUtils.isEmpty(inputVO.getTitle())){ intent.putExtra(Intent.EXTRA_TITLE,inputVO.getTitle()); } if (!TextUtils.isEmpty(inputVO.getText())){ intent.putExtra(Intent.EXTRA_TEXT,inputVO.getText()); } if (!TextUtils.isEmpty(inputVO.getSubject())){ intent.putExtra(Intent.EXTRA_SUBJECT,inputVO.getSubject()); } if (!TextUtils.isEmpty(inputVO.getImgPath())||inputVO.getImgPaths()!=null) { intent.setType("image/*"); }else{ intent.setType("text/plain"); } if (inputVO.getType()==0){ //微信朋友圈 intent.putExtra("Kdescription", inputVO.getText()); intent.setComponent(new ComponentName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareToTimeLineUI")); } if (intent.getComponent()!=null){ context.startActivity(intent); }else{ context.startActivity(Intent.createChooser(intent,"请选择")); } } }