/** com.lampa.startapp https://github.com/lampaa/com.lampa.startapp Phonegap plugin for check or launch other application in android device (iOS support). bug tracker: https://github.com/lampaa/com.lampa.startapp/issues */ package com.lampa.startapp; import org.apache.cordova.CallbackContext; import org.apache.cordova.CordovaPlugin; import org.json.JSONArray; import org.json.JSONObject; import org.json.JSONException; import android.content.Context; import android.content.Intent; import android.content.ComponentName; import android.content.pm.PackageManager; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import java.util.Iterator; import android.net.Uri; import java.lang.reflect.Field; import android.content.ActivityNotFoundException; import android.util.Log; import android.os.Bundle; public class startApp extends CordovaPlugin { public static final String TAG = "startApp"; public startApp() { } /** * Executes the request and returns PluginResult. * * @param action The action to execute. * @param args JSONArray of arguments for the plugin. * @param callbackContext The callback context used when calling back into JavaScript. * @return True when the action was valid, false otherwise. */ public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { if (action.equals("start")) { this.start(args, callbackContext); } else if(action.equals("check")) { this.check(args, callbackContext); } else if(action.equals("getExtras")) { this.getExtras(callbackContext); } else if(action.equals("getExtra")) { this.getExtra(args, callbackContext); } return true; } //-------------------------------------------------------------------------- // LOCAL METHODS //-------------------------------------------------------------------------- /** * startApp */ public void start(JSONArray args, CallbackContext callback) { Intent LaunchIntent; JSONObject params; JSONArray flags; JSONArray component; JSONObject extra; JSONObject key_value; String key; String value; int i; try { if (args.get(0) instanceof JSONObject) { params = args.getJSONObject(0); /** * set package * http://developer.android.com/reference/android/content/Intent.html#setPackage(java.lang.String) */ if(params.has("package")) { LaunchIntent = cordova.getActivity().getPackageManager().getLaunchIntentForPackage(params.getString("package")); } else { LaunchIntent = new Intent(); } /** * set action * http://developer.android.com/intl/ru/reference/android/content/Intent.html#setAction%28java.lang.String%29 */ if(params.has("action")) { LaunchIntent.setAction(getIntentValueString(params.getString("action"))); } /** * set category * http://developer.android.com/intl/ru/reference/android/content/Intent.html#addCategory%28java.lang.String%29 */ if(params.has("category")) { LaunchIntent.addCategory(getIntentValueString(params.getString("category"))); } /** * set type * http://developer.android.com/intl/ru/reference/android/content/Intent.html#setType%28java.lang.String%29 */ if(params.has("type")) { LaunchIntent.setType(params.getString("type")); } /** * set data (uri) * http://developer.android.com/intl/ru/reference/android/content/Intent.html#setData%28android.net.Uri%29 */ if(params.has("uri")) { LaunchIntent.setData(Uri.parse(params.getString("uri"))); } /** * set flags * http://developer.android.com/intl/ru/reference/android/content/Intent.html#addFlags%28int%29 */ if(params.has("flags")) { flags = params.getJSONArray("flags"); for(i=0; i < flags.length(); i++) { LaunchIntent.addFlags(getIntentValue(flags.getString(i))); } } /** * set component * http://developer.android.com/intl/ru/reference/android/content/Intent.html#setComponent%28android.content.ComponentName%29 */ if(params.has("component")) { component = params.getJSONArray("component"); if(component.length() == 2) { LaunchIntent.setComponent(new ComponentName(component.getString(0), component.getString(1))); } } /** * set extra fields */ if(!args.isNull(1)) { extra = args.getJSONObject(1); Iterator iter = extra.keys(); while (iter.hasNext()) { key = iter.next(); value = extra.getString(key); LaunchIntent.putExtra(parseExtraName(key), value); } } /** * launch intent */ if(params.has("intentstart") && "startActivityForResult".equals(params.getString("intentstart"))) { cordova.getActivity().startActivityForResult(LaunchIntent, 1); } if(params.has("intentstart") && "sendBroadcast".equals(params.getString("intentstart"))) { cordova.getActivity().sendBroadcast(LaunchIntent); } else { cordova.getActivity().startActivity(LaunchIntent); } callback.success(); } else { callback.error("Incorrect params, array is not array object!"); } } catch (JSONException e) { callback.error("JSONException: " + e.getMessage()); e.printStackTrace(); } catch (IllegalAccessException e) { callback.error("IllegalAccessException: " + e.getMessage()); e.printStackTrace(); } catch (NoSuchFieldException e) { callback.error("NoSuchFieldException: " + e.getMessage()); e.printStackTrace(); } catch (ActivityNotFoundException e) { callback.error("ActivityNotFoundException: " + e.getMessage()); e.printStackTrace(); } } /** * checkApp */ public void check(JSONArray args, CallbackContext callback) { JSONObject params; try { if (args.get(0) instanceof JSONObject) { params = args.getJSONObject(0); if(params.has("package")) { PackageManager pm = cordova.getActivity().getApplicationContext().getPackageManager(); /** * get package info */ PackageInfo PackInfo = pm.getPackageInfo(params.getString("package"), PackageManager.GET_ACTIVITIES); /** * create json object */ JSONObject info = new JSONObject(); info.put("versionName", PackInfo.versionName); info.put("packageName", PackInfo.packageName); info.put("versionCode", PackInfo.versionCode); info.put("applicationInfo", PackInfo.applicationInfo); callback.success(info); } else { callback.error("Value \"package\" in null!"); } } else { callback.error("Incorrect params, array is not array object!"); } } catch (JSONException e) { callback.error("json: " + e.toString()); e.printStackTrace(); } catch (NameNotFoundException e) { callback.error("NameNotFoundException: " + e.toString()); e.printStackTrace(); } } /** * getExtras */ public void getExtras(CallbackContext callback) { try { Bundle extras = cordova.getActivity().getIntent().getExtras(); JSONObject info = new JSONObject(); if (extras != null) { for (String key : extras.keySet()) { info.put(key, extras.get(key).toString()); } } callback.success(info); } catch(JSONException e) { callback.error(e.getMessage()); e.printStackTrace(); } } /** * getExtra */ public void getExtra(JSONArray args, CallbackContext callback) { try { String extraName = parseExtraName(args.getString(0)); Intent extraIntent = cordova.getActivity().getIntent(); if(extraIntent.hasExtra(extraName)) { String extraValue = extraIntent.getStringExtra(extraName); if (extraValue == null) { extraValue = ((Uri) extraIntent.getParcelableExtra(extraName)).toString(); } callback.success(extraValue); } else { callback.error("extra field not found"); } } catch(JSONException e) { callback.error(e.getMessage()); e.printStackTrace(); } } /** * static functions */ static String parseExtraName(String extraName) { String parseIntentExtra = extraName; try { parseIntentExtra = getIntentValueString(extraName); Log.i(TAG, parseIntentExtra); } catch(NoSuchFieldException e) { parseIntentExtra = extraName; } catch(IllegalAccessException e) { e.printStackTrace(); return extraName; } Log.e(TAG, parseIntentExtra); return parseIntentExtra; } static String getIntentValueString(String flag) throws NoSuchFieldException, IllegalAccessException { Field field = Intent.class.getDeclaredField(flag); field.setAccessible(true); return (String) field.get(null); } static int getIntentValue(String flag) throws NoSuchFieldException, IllegalAccessException { Field field = Intent.class.getDeclaredField(flag); field.setAccessible(true); return field.getInt(null); } }