package fq.router2.utils; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Build; import android.provider.Settings; import java.util.HashMap; public class ApkUtils { private static final String SCHEME = "package"; private static final String APP_PKG_NAME_21 = "com.android.settings.ApplicationPkgName"; private static final String APP_PKG_NAME_22 = "pkg"; private static final String APP_DETAILS_PACKAGE_NAME = "com.android.settings"; private static final String APP_DETAILS_CLASS_NAME = "com.android.settings.InstalledAppDetails"; public static void install(Context context, String apkPath) { LogUtils.i("Installing fqrouter..."); if (ShellUtils.checkRooted()) { try { installAutomatically(apkPath); installManually(context, apkPath); // fallback } catch (Exception e) { LogUtils.e("silent install failed", e); installManually(context, apkPath); } } else { installManually(context, apkPath); } } private static void installAutomatically(String apkPath) throws Exception { ShellUtils.sudoNoWait( new HashMap<String, String>(), ShellUtils.findCommand("sleep"), "10", ";", ShellUtils.findCommand("am"), "start", "-n", "fq.router2/.MainActivity"); ShellUtils.sudo(ShellUtils.findCommand("pm"), "install", "-r", apkPath); } private static void installManually(Context context, String apkPath) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse("file://" + apkPath), "application/vnd.android.package-archive"); context.startActivity(intent); } public static void uninstall(Context context, String packageName) { try { if (ShellUtils.checkRooted()) { uninstallAutomatically(packageName); } else { uninstallManually(context, packageName); } } catch (Exception e) { LogUtils.e("uninstall failed", e); } } private static void uninstallManually(Context context, String packageName) { Intent intent = new Intent(Intent.ACTION_DELETE, Uri.fromParts("package", packageName, null)); context.startActivity(intent); } private static void uninstallAutomatically(String packageName) throws Exception { ShellUtils.sudo(ShellUtils.findCommand("pm"), "uninstall", packageName); } public static boolean isInstalled(Context context, String packageName) { try { context.getPackageManager().getPackageInfo(packageName, 0); return true; } catch (PackageManager.NameNotFoundException e) { return false; } } public static void showInstalledAppDetails(Context context, String packageName) { Intent intent = new Intent(); final int apiLevel = Build.VERSION.SDK_INT; if (apiLevel >= 9) { // above 2.3 intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts(SCHEME, packageName, null); intent.setData(uri); } else { // below 2.3 final String appPkgName = (apiLevel == 8 ? APP_PKG_NAME_22 : APP_PKG_NAME_21); intent.setAction(Intent.ACTION_VIEW); intent.setClassName(APP_DETAILS_PACKAGE_NAME, APP_DETAILS_CLASS_NAME); intent.putExtra(appPkgName, packageName); } context.startActivity(intent); } }