jni: use new jni functions for starting an activity
authorCory Fields <theuni-nospam-@xbmc.org>
Thu, 2 May 2013 22:00:27 +0000 (18:00 -0400)
committerCory Fields <theuni-nospam-@xbmc.org>
Fri, 10 May 2013 23:37:49 +0000 (19:37 -0400)
xbmc/android/activity/XBMCApp.cpp

index 6a50e2b..c363fd5 100644 (file)
@@ -596,122 +596,17 @@ bool CXBMCApp::HasLaunchIntent(const string &package)
 // Note intent, dataType, dataURI all default to ""
 bool CXBMCApp::StartActivity(const string &package, const string &intent, const string &dataType, const string &dataURI)
 {
-  if (!m_activity || !package.size())
-   return false;
-
-  CLog::Log(LOGDEBUG, "CXBMCApp::StartActivity package: '%s' intent: '%s' dataType: '%s' dataURI: '%s'", package.c_str(), intent.c_str(), dataType.c_str(), dataURI.c_str());
-
-  jthrowable exc;
-  JNIEnv* env = xbmc_jnienv();
-
-  jobject oActivity = m_activity->clazz;
-  jclass cActivity = env->GetObjectClass(oActivity);
-
-  jobject oIntent = NULL;
-  jclass cIntent = NULL;
-  if (intent.size())
-  {
-    // Java equivalent for following JNI
-    //    Intent oIntent = new Intent(Intent.ACTION_VIEW);
-    cIntent = env->FindClass("android/content/Intent");
-    jmethodID midIntentCtor = env->GetMethodID(cIntent, "<init>", "(Ljava/lang/String;)V");
-    jstring sIntent = env->NewStringUTF(intent.c_str());
-    oIntent = env->NewObject(cIntent, midIntentCtor, sIntent);
-    env->DeleteLocalRef(sIntent);
-  }
-  else
-  {
-    // oPackageManager = new PackageManager();
-    jmethodID mgetPackageManager = env->GetMethodID(cActivity, "getPackageManager", "()Landroid/content/pm/PackageManager;");
-    jobject oPackageManager = (jobject)env->CallObjectMethod(oActivity, mgetPackageManager);
-
-    // oPackageIntent = oPackageManager.getLaunchIntentForPackage(package);
-    jclass cPackageManager = env->GetObjectClass(oPackageManager);
-    jmethodID mgetLaunchIntentForPackage = env->GetMethodID(cPackageManager, "getLaunchIntentForPackage", "(Ljava/lang/String;)Landroid/content/Intent;");
-    jstring sPackageName = env->NewStringUTF(package.c_str());
-    oIntent = env->CallObjectMethod(oPackageManager, mgetLaunchIntentForPackage, sPackageName);
-    cIntent = env->GetObjectClass(oIntent);
-    env->DeleteLocalRef(cPackageManager);
-    env->DeleteLocalRef(sPackageName);
-    env->DeleteLocalRef(oPackageManager);
-
-    exc = env->ExceptionOccurred();
-    if (exc)
-    {
-      CLog::Log(LOGERROR, "CXBMCApp::StartActivity Failed to load %s. Exception follows:", package.c_str());
-      env->ExceptionDescribe();
-      env->ExceptionClear();
-      env->DeleteLocalRef(cActivity);
-      return false;
-    }
-    if (!oIntent)
-    {
-      CLog::Log(LOGERROR, "CXBMCApp::StartActivity %s has no Launch Intent", package.c_str());
-      env->DeleteLocalRef(cActivity);
-      return false;
-    }
-  }
+  CJNIIntent newIntent = GetPackageManager().getLaunchIntentForPackage(package);
+  if (!newIntent)
+    return false;
 
-  jobject oUri;
-  if (dataURI.size())
-  {
-    // Java equivalent for the following JNI
-    //   Uri oUri = Uri.parse(sPath);
-    jclass cUri = env->FindClass("android/net/Uri");
-    jmethodID midUriParse = env->GetStaticMethodID(cUri, "parse", "(Ljava/lang/String;)Landroid/net/Uri;");
-    jstring sPath = env->NewStringUTF(dataURI.c_str());
-    oUri = env->CallStaticObjectMethod(cUri, midUriParse, sPath);
-    env->DeleteLocalRef(sPath);
-    env->DeleteLocalRef(cUri);
-
-    // Run setData or setDataAndType depending on what was passed into the method
-    //   This allows opening market links or external players using the same method
-    if (dataType.size())
-    {
-      // Java equivalent for the following JNI
-      //   oIntent.setDataAndType(oUri, "video/*");
-      jmethodID midIntentSetDataAndType = env->GetMethodID(cIntent, "setDataAndType", "(Landroid/net/Uri;Ljava/lang/String;)Landroid/content/Intent;");
-      jstring sMimeType = env->NewStringUTF(dataType.c_str());
-      oIntent = env->CallObjectMethod(oIntent, midIntentSetDataAndType, oUri, sMimeType);
-      env->DeleteLocalRef(sMimeType);
-    }
-    else 
-    {
-      // Java equivalent for the following JNI
-      //   oIntent.setData(oUri);
-      jmethodID midIntentSetData = env->GetMethodID(cIntent, "setData", "(Landroid/net/Uri;)Landroid/content/Intent;");
-      oIntent = env->CallObjectMethod(oIntent, midIntentSetData, oUri);
-    }
-  }
-  
-  // Java equivalent for the following JNI
-  //   oIntent.setPackage(sPackage);
-  jstring sPackage = env->NewStringUTF(package.c_str());
-  jmethodID mSetPackage = env->GetMethodID(cIntent, "setPackage", "(Ljava/lang/String;)Landroid/content/Intent;");
-  oIntent = env->CallObjectMethod(oIntent, mSetPackage, sPackage);
+  if (!dataURI.empty())
+    newIntent.setData(dataURI);
 
-  if (oUri != NULL)
-  {
-    env->DeleteLocalRef(oUri);
-  }
-  env->DeleteLocalRef(cIntent);
-  env->DeleteLocalRef(sPackage);
-  // Java equivalent for the following JNI
-  //   startActivity(oIntent);
-  jmethodID mStartActivity = env->GetMethodID(cActivity, "startActivity", "(Landroid/content/Intent;)V");
-  env->CallVoidMethod(oActivity, mStartActivity, oIntent);
-  env->DeleteLocalRef(cActivity);
-  env->DeleteLocalRef(oIntent);
+  if (!intent.empty())
+    newIntent.setAction(intent);
 
-  exc = env->ExceptionOccurred();
-  if (exc)
-  {
-    CLog::Log(LOGERROR, "CXBMCApp::StartActivity Failed to load %s. Exception follows:", package.c_str());
-    env->ExceptionDescribe();
-    env->ExceptionClear();
-    return false;
-  }
+   startActivity(newIntent);
   return true;
 }