#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"
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)
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()
{
android_printf("%s: ", __PRETTY_FUNCTION__);
+
+ // Restore volume
+ SetSystemVolume(m_initialVolume);
+
unregisterReceiver(*this);
}
int status = 0;
SetupEnv();
+ XBMC::Context context;
+
+ m_initialVolume = GetSystemVolume();
CJNIIntent startIntent = getIntent();
android_printf("XBMC Started with action: %s\n",startIntent.getAction().c_str());
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)
// 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 (!intent.empty())
- newIntent.setAction(intent);
+ if (!jniURI)
+ return false;
+
+ newIntent.setDataAndType(jniURI, dataType);
+ }
+
+ 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;
}
{
maxVolume = GetMaxSystemVolume(env);
}
- android_printf("CXBMCApp::GetMaxSystemVolume: %i",maxVolume);
+ //android_printf("CXBMCApp::GetMaxSystemVolume: %i",maxVolume);
return maxVolume;
}
CJNIAudioManager audioManager(getSystemService("audio"));
if (audioManager)
return audioManager.getStreamMaxVolume();
- android_printf("CXBMCApp::SetSystemVolume: Could not get Audio Manager");
+ android_printf("CXBMCApp::SetSystemVolume: Could not get Audio Manager");
return 0;
}
+int CXBMCApp::GetSystemVolume()
+{
+ CJNIAudioManager audioManager(getSystemService("audio"));
+ if (audioManager)
+ return audioManager.getStreamVolume();
+ else
+ {
+ android_printf("CXBMCApp::GetSystemVolume: Could not get Audio Manager");
+ return 0;
+ }
+}
+
+void CXBMCApp::SetSystemVolume(int val)
+{
+ CJNIAudioManager audioManager(getSystemService("audio"));
+ if (audioManager)
+ audioManager.setStreamVolume(val);
+ else
+ android_printf("CXBMCApp::SetSystemVolume: Could not get Audio Manager");
+}
+
void CXBMCApp::SetSystemVolume(JNIEnv *env, float percent)
{
CJNIAudioManager audioManager(getSystemService("audio"));