// 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;
}