X-Git-Url: http://code.vuplus.com/gitweb/?a=blobdiff_plain;f=xbmc%2Fandroid%2Factivity%2FXBMCApp.cpp;h=a9c66a93af0aa861f4a8132dc17a3a4d0bdd3183;hb=2d2eff9c723670fd76f711e94bad69fbd587438c;hp=036601a0cc2cc98321cb4f7b87b5b283d5dd7898;hpb=8627b5573a4be60b2f121c4c070b653d84de6ac4;p=vuplus_xbmc diff --git a/xbmc/android/activity/XBMCApp.cpp b/xbmc/android/activity/XBMCApp.cpp index 036601a..a9c66a9 100644 --- a/xbmc/android/activity/XBMCApp.cpp +++ b/xbmc/android/activity/XBMCApp.cpp @@ -46,6 +46,7 @@ #include "ApplicationMessenger.h" #include "utils/StringUtils.h" #include "AppParamParser.h" +#include "XbmcContext.h" #include #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 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 *applications) +std::vector CXBMCApp::GetApplications() { - CJNIList 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 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) @@ -401,17 +417,32 @@ 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) { - CJNIIntent newIntent = GetPackageManager().getLaunchIntentForPackage(package); + CJNIIntent newIntent = intent.empty() ? + GetPackageManager().getLaunchIntentForPackage(package) : + CJNIIntent(intent); + if (!newIntent) return false; if (!dataURI.empty()) - newIntent.setData(dataURI); + { + CJNIURI jniURI = CJNIURI::parse(dataURI); + + if (!jniURI) + return false; + + newIntent.setDataAndType(jniURI, dataType); + } - if (!intent.empty()) - newIntent.setAction(intent); + newIntent.setPackage(package); + startActivity(newIntent); + if (xbmc_jnienv()->ExceptionOccurred()) + { + CLog::Log(LOGERROR, "CXBMCApp::StartActivity - ExceptionOccurred launching %s", package.c_str()); + xbmc_jnienv()->ExceptionClear(); + return false; + } - startActivity(newIntent); return true; }