Merge pull request #5095 from koying/fixdroidappcrash
[vuplus_xbmc] / xbmc / android / activity / XBMCApp.cpp
index 1b95381..a9c66a9 100644 (file)
@@ -46,6 +46,7 @@
 #include "ApplicationMessenger.h"
 #include "utils/StringUtils.h"
 #include "AppParamParser.h"
+#include "XbmcContext.h"
 #include <android/bitmap.h>
 #include "android/jni/JNIThreading.h"
 #include "android/jni/BroadcastReceiver.h"
@@ -86,6 +87,9 @@ ANativeActivity *CXBMCApp::m_activity = NULL;
 ANativeWindow* CXBMCApp::m_window = NULL;
 int CXBMCApp::m_batteryLevel = 0;
 int CXBMCApp::m_initialVolume = 0;
+CCriticalSection CXBMCApp::m_applicationsMutex;
+std::vector<androidPackage> CXBMCApp::m_applications;
+
 
 CXBMCApp::CXBMCApp(ANativeActivity* nativeActivity)
   : CJNIContext(nativeActivity)
@@ -128,6 +132,12 @@ void CXBMCApp::onResume()
   CJNIIntentFilter batteryFilter;
   batteryFilter.addAction("android.intent.action.BATTERY_CHANGED");
   registerReceiver(*this, batteryFilter);
+
+  // Clear the applications cache. We could have installed/deinstalled apps
+  {
+    CSingleLock lock(m_applicationsMutex);
+    m_applications.clear();
+  }
 }
 
 void CXBMCApp::onPause()
@@ -251,7 +261,8 @@ void CXBMCApp::run()
   int status = 0;
 
   SetupEnv();
-  
+  XBMC::Context context;
+
   m_initialVolume = GetSystemVolume();
 
   CJNIIntent startIntent = getIntent();
@@ -347,22 +358,27 @@ int CXBMCApp::GetDPI()
   return dpi;
 }
 
-bool CXBMCApp::ListApplications(vector<androidPackage> *applications)
+std::vector<androidPackage> CXBMCApp::GetApplications()
 {
-  CJNIList<CJNIApplicationInfo> packageList = GetPackageManager().getInstalledApplications(CJNIPackageManager::GET_ACTIVITIES);
-  int numPackages = packageList.size();
-  for (int i = 0; i < numPackages; i++)
+  CSingleLock lock(m_applicationsMutex);
+  if (m_applications.empty())
   {
-    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(newPackage);
+    CJNIList<CJNIApplicationInfo> packageList = GetPackageManager().getInstalledApplications(CJNIPackageManager::GET_ACTIVITIES);
+    int numPackages = packageList.size();
+    for (int i = 0; i < numPackages; i++)
+    {
+      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;
+
+      m_applications.push_back(newPackage);
+    }
   }
-  return true;
+
+  return m_applications;
 }
 
 bool CXBMCApp::GetIconSize(const string &packageName, int *width, int *height)