package com.jdroid.android.utils; import android.app.Activity; import android.content.Context; import android.content.Intent; 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.provider.Settings; import com.jdroid.android.application.AbstractApplication; import com.jdroid.android.google.GooglePlayUtils; import com.jdroid.android.intent.IntentUtils; import java.io.File; public class ExternalAppsUtils { public static final String TWITTER_PACKAGE_NAME = "com.twitter.android"; public static final String FACEBOOK_PACKAGE_NAME = "com.facebook.katana"; public static final String WHATSAPP_PACKAGE_NAME = "com.whatsapp"; public static final String TELEGRAM_PACKAGE_NAME = "org.telegram.messenger"; public static final String HANGOUTS_PACKAGE_NAME = "com.google.android.talk"; public static final String GOOGLE_PLUS_PACKAGE_NAME = "com.google.android.apps.plus"; public static final String GOOGLE_MAPS_PACKAGE_NAME = "com.google.android.apps.maps"; public static boolean isAppInstalled(Context context, String packageName) { return isAppInstalled(context, packageName, null); } public static boolean isAppInstalled(Context context, String packageName, Integer minimumVersionCode) { boolean installed = false; Integer installedAppVersionCode = getInstalledAppVersionCode(context, packageName); if (installedAppVersionCode != null) { if ((minimumVersionCode == null) || (installedAppVersionCode >= minimumVersionCode)) { installed = true; } } return installed; } public static Integer getInstalledAppVersionCode(Context context, String packageName) { PackageManager pm = context.getPackageManager(); try { PackageInfo packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES); return packageInfo.versionCode; } catch (PackageManager.NameNotFoundException e) { return null; } catch (RuntimeException e) { if (e.getMessage().equals("Package manager has died") || e.getMessage().equals("Transaction has failed to Package manger")) { AbstractApplication.get().getExceptionHandler().logWarningException( "Runtime error while loading package info", e); return null; } else { throw e; } } } /** * Launch packageName app or open Google Play to download. * * @param context * @param packageName * @return true if app is installed, false otherwise. */ public static boolean launchOrDownloadApp(Context context, String packageName) { boolean isAppInstalled = isAppInstalled(context, packageName); if (isAppInstalled) { launchExternalApp(context, packageName); } else { GooglePlayUtils.launchAppDetails(context, packageName); } return isAppInstalled; } public static void launchExternalApp(Context context, String packageName) { Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(packageName); context.startActivity(launchIntent); } public static void startSkypeCall(String username) { Intent skypeIntent = new Intent(Intent.ACTION_VIEW); skypeIntent.setData(Uri.parse("skype:" + username + "?call")); skypeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); AbstractApplication.get().startActivity(skypeIntent); } public static void openCustomMapOnBrowser(Activity activity, String mapId) { IntentUtils.startUrl(activity, getCustomMapUrl(mapId)); } public static void openCustomMap(Activity activity, String mapId) { boolean isAppInstalled = isAppInstalled(activity, GOOGLE_MAPS_PACKAGE_NAME); if (isAppInstalled) { String mapUrl = getCustomMapUrl(mapId); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setPackage(GOOGLE_MAPS_PACKAGE_NAME); intent.setData(Uri.parse(mapUrl)); if (IntentUtils.isIntentAvailable(intent)) { activity.startActivity(intent); } else { openUrl(mapUrl); } } else { GooglePlayUtils.launchAppDetails(activity, GOOGLE_MAPS_PACKAGE_NAME); } } private static String getCustomMapUrl(String mapId) { return "https://www.google.com/maps/d/viewer?mid=" + mapId; } public static void openUrl(String url) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(url)); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); AbstractApplication.get().startActivity(intent); } public static Drawable getAppIcon(String packageName) { try { return AbstractApplication.get().getPackageManager().getApplicationIcon(packageName); } catch (NameNotFoundException e) { return null; } } public static void openAppInfo(Activity activity) { Uri packageURI = Uri.parse("package:" + AppUtils.getApplicationId()); Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI); activity.startActivity(intent); } public static void openOnBrowser(Activity activity, File file) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setData(Uri.fromFile(file)); intent.setClassName("com.android.chrome", "com.google.android.apps.chrome.Main"); if (IntentUtils.isIntentAvailable(intent)) { activity.startActivity(intent); } else { intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setData(Uri.fromFile(file)); intent.setClassName("com.android.browser", "com.android.browser.BrowserActivity"); activity.startActivity(intent); } } }