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

index 895e2e2..370b3ce 100644 (file)
@@ -377,72 +377,19 @@ int CXBMCApp::GetDPI()
 
 bool CXBMCApp::ListApplications(vector<androidPackage> *applications)
 {
-  if (!m_activity)
-    return false;
-
-  JNIEnv* env = xbmc_jnienv();
-  jobject oActivity = m_activity->clazz;
-  jclass cActivity = env->GetObjectClass(oActivity);
-
-  // oPackageManager = new PackageManager();
-  jmethodID mgetPackageManager = env->GetMethodID(cActivity, "getPackageManager", "()Landroid/content/pm/PackageManager;");
-  jobject oPackageManager = (jobject)env->CallObjectMethod(oActivity, mgetPackageManager);
-  env->DeleteLocalRef(cActivity);
-
-  // adata[] = oPackageManager.getInstalledApplications(0);
-  jclass cPackageManager = env->GetObjectClass(oPackageManager);
-  jmethodID mgetInstalledApplications = env->GetMethodID(cPackageManager, "getInstalledApplications", "(I)Ljava/util/List;");
-  jmethodID mgetApplicationLabel = env->GetMethodID(cPackageManager, "getApplicationLabel", "(Landroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence;");
-  jobject odata = env->CallObjectMethod(oPackageManager, mgetInstalledApplications, 0);
-  jclass cdata = env->GetObjectClass(odata);
-  jmethodID mtoArray = env->GetMethodID(cdata, "toArray", "()[Ljava/lang/Object;");
-  jobjectArray adata = (jobjectArray)env->CallObjectMethod(odata, mtoArray);
-  env->DeleteLocalRef(cdata);
-  env->DeleteLocalRef(odata);
-  env->DeleteLocalRef(cPackageManager);
-
-  int size = env->GetArrayLength(adata);
-  for (int i = 0; i < size; i++)
+  CJNIList<CJNIApplicationInfo> packageList = GetPackageManager().getInstalledApplications(CJNIPackageManager::GET_ACTIVITIES);
+  int numPackages = packageList.size();
+  for (int i = 0; i < numPackages; i++)
   {
-    // oApplicationInfo = adata[i];
-    jobject oApplicationInfo = env->GetObjectArrayElement(adata, i);
-    jclass cApplicationInfo = env->GetObjectClass(oApplicationInfo);
-    jfieldID mclassName = env->GetFieldID(cApplicationInfo, "packageName", "Ljava/lang/String;");
-    jstring sapplication = (jstring)env->GetObjectField(oApplicationInfo, mclassName);
-
-    if (!sapplication)
-    {
-      env->DeleteLocalRef(cApplicationInfo);
-      env->DeleteLocalRef(oApplicationInfo);
-      continue;
-    }
-    // cname = oApplicationInfo.packageName;
-    const char* cname = env->GetStringUTFChars(sapplication, NULL);
-    androidPackage desc;
-    desc.packageName = cname;
-    env->ReleaseStringUTFChars(sapplication, cname);
-    env->DeleteLocalRef(sapplication);
-    env->DeleteLocalRef(cApplicationInfo);
-
-    jstring spackageLabel = (jstring) env->CallObjectMethod(oPackageManager, mgetApplicationLabel, oApplicationInfo);
-    if (!spackageLabel)
-    {
-      env->DeleteLocalRef(oApplicationInfo);
-      continue;
-    }
-    // cname = opackageManager.getApplicationLabel(oApplicationInfo);
-    const char* cpackageLabel = env->GetStringUTFChars(spackageLabel, NULL);
-    desc.packageLabel = cpackageLabel;
-    env->ReleaseStringUTFChars(spackageLabel, cpackageLabel);
-    env->DeleteLocalRef(spackageLabel);
-    env->DeleteLocalRef(oApplicationInfo);
-
-    if (!HasLaunchIntent(desc.packageName))
+    androidPackage newPackage;
+    newPackage.packageName = packageList.get(i).packageName;
+    newPackage.packageLabel = GetPackageManager().getApplicationLabel(packageList.get(i)).toString();
+    CJNIIntent intent = GetPackageManager().getLaunchIntentForPackage(newPackage.packageName);
+    if (!intent || !intent.hasCategory("android.intent.category.LAUNCHER"))
       continue;
 
-    applications->push_back(desc);
+    applications->push_back(newPackage);
   }
-  env->DeleteLocalRef(oPackageManager);
   return true;
 }