Skip to content

Commit 09ab3b6

Browse files
committed
StMovieService - provide a dummy foreground Android service to keep audio playback on in background
1 parent 7b16fac commit 09ab3b6

File tree

14 files changed

+342
-17
lines changed

14 files changed

+342
-17
lines changed

Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ HAVE_MONGOOSE := -DST_HAVE_MONGOOSE
2020
# this, however, might lead to incomplete build on .java change without make clean.
2121
.SUFFIXES: .class .java
2222
.java.class:
23-
$(JAVA_HOME)/bin/javac -source 1.7 -target 1.7 -d $(BUILD_ROOT)/java/classes -classpath $(ANDROID_PLATFORM) -sourcepath $(SRCDIR)/sview/src $<
23+
$(JAVA_HOME)/bin/javac -source 1.7 -target 1.7 -d $(BUILD_ROOT)/java/classes -classpath $(ANDROID_PLATFORM) -sourcepath $(SRCDIR)/sview/src:$(BUILD_ROOT)/java/gen $<
2424
cp -f $(BUILD_ROOT)/java/classes/com/sview/$(@F) $@
2525

2626
TARGET_OS = linux
@@ -307,6 +307,7 @@ install_android:
307307
cp -f -r $(BUILD_ROOT)/shaders/* $(aDestAndroid)/assets/shaders/
308308
cp -f -r $(BUILD_ROOT)/textures/* $(aDestAndroid)/assets/textures/
309309
cp -f license-gpl-3.0.txt $(aDestAndroid)/assets/info/license.txt
310+
$(ANDROID_BUILD_TOOLS)/aapt package -v -f -m -S $(SRCDIR)/sview/res -J $(BUILD_ROOT)/java/gen -M $(SRCDIR)/sview/AndroidManifest.xml -I $(ANDROID_PLATFORM)
310311

311312
install_android_libs: $(aStShared) $(aStGLWidgets) $(aStCore) $(aStOutAnaglyph) $(aStOutInterlace) $(aStOutDistorted) $(aStImageViewer) $(aStMoviePlayer) $(sViewAndroid)
312313
cp -f $(BUILD_ROOT)/$(aStShared) $(aDestAndroid)/lib/$(ANDROID_EABI)/

StCore/StAndroidGlue.cpp

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -823,16 +823,34 @@ void StAndroidGlue::setWindowFlags(const int theFlags) {
823823
ANativeActivity_setWindowFlags(myActivity, aFlagsToAdd, aFlagsToRemove);
824824
}
825825

826-
void StAndroidGlue::setWakeLock(bool theToLock) {
827-
if(myIsWakeLockSet == theToLock
826+
void StAndroidGlue::setWakeLock(const StString& theTitle, bool theToLock) {
827+
if((myIsWakeLockSet == theToLock
828+
&& myWakeLockTitle == theTitle)
828829
|| myThJniEnv == NULL) {
829830
return;
830831
}
831832

832833
jclass aJClassActivity = myThJniEnv->GetObjectClass(myActivity->clazz);
833-
jmethodID aJMet = myThJniEnv->GetMethodID(aJClassActivity, "setPartialWakeLockOn", "(Z)V");
834-
myThJniEnv->CallVoidMethod(myActivity->clazz, aJMet, (jboolean )(theToLock ? JNI_TRUE : JNI_FALSE));
834+
jmethodID aJMet = myThJniEnv->GetMethodID(aJClassActivity, "setPartialWakeLockOn", "(Ljava/lang/String;Z)V");
835+
jstring aJStrTitle = myThJniEnv->NewStringUTF(theTitle.toCString());
836+
myThJniEnv->CallVoidMethod(myActivity->clazz, aJMet, aJStrTitle, (jboolean )(theToLock ? JNI_TRUE : JNI_FALSE));
835837
myIsWakeLockSet = theToLock;
838+
myThJniEnv->DeleteLocalRef(aJStrTitle);
839+
myWakeLockTitle = theTitle;
840+
}
841+
842+
void StAndroidGlue::setWindowTitle(const StString& theTitle) {
843+
if(myWindowTitle == theTitle
844+
|| myThJniEnv == NULL) {
845+
return;
846+
}
847+
848+
jclass aJClassActivity = myThJniEnv->GetObjectClass(myActivity->clazz);
849+
jmethodID aJMet = myThJniEnv->GetMethodID(aJClassActivity, "setWindowTitle", "(Ljava/lang/String;)V");
850+
jstring aJStrTitle = myThJniEnv->NewStringUTF(theTitle.toCString());
851+
myThJniEnv->CallVoidMethod(myActivity->clazz, aJMet, aJStrTitle);
852+
myThJniEnv->DeleteLocalRef(aJStrTitle);
853+
myWindowTitle = theTitle;
836854
}
837855

838856
void StAndroidGlue::setHardwareStereoOn(const bool theToEnable) {

StCore/StWindowImpl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,7 @@ void StWindowImpl::updateBlockSleep() {
622622
}
623623
if(myParentWin != NULL) {
624624
myParentWin->setWindowFlags(aFlags);
625-
myParentWin->setWakeLock(toWakeLock);
625+
myParentWin->setWakeLock(myWindowTitle, toWakeLock);
626626
}
627627
#elif defined(__linux__)
628628
if(attribs.ToBlockSleepDisplay) { // || attribs.ToBlockSleepSystem

StCore/StWindowImplAnd.cpp

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -493,18 +493,34 @@ void StWindowImpl::processEvents() {
493493

494494
// check onNewIntent event
495495
StString aDndFile;
496+
myParentWin->setWindowTitle(myWindowTitle);
496497
myParentWin->setHardwareStereoOn(myToEnableStereoHW);
497498
myParentWin->setTrackOrientation(myToTrackOrient);
498499
myParentWin->setHideSystemBars(myToHideStatusBar, myToHideNavBar);
499500
myParentWin->fetchState(aDndFile, myQuaternion, myToSwapEyesHW, myKeysState);
500501
if(!aDndFile.isEmpty()) {
501-
std::vector<const char*> aDndList;
502-
aDndList.push_back(aDndFile.toCString());
503-
myStEvent.Type = stEvent_FileDrop;
504-
myStEvent.DNDrop.Time = getEventTime();
505-
myStEvent.DNDrop.NbFiles = aDndList.size();
506-
myStEvent.DNDrop.Files = &aDndList[0];
507-
myEventsBuffer.append(myStEvent);
502+
// notice - unpress event will NOT be generated!
503+
myStEvent.Type = stEvent_KeyDown;
504+
myStEvent.Key.Time = getEventTime();
505+
myStEvent.Key.Flags = ST_VF_NONE;
506+
if(aDndFile == "ACTION_PLAY_PREV") {
507+
myStEvent.Key.VKey = ST_VK_MEDIA_PREV_TRACK;
508+
myEventsBuffer.append(myStEvent);
509+
} else if(aDndFile == "ACTION_PLAY_NEXT") {
510+
myStEvent.Key.VKey = ST_VK_MEDIA_NEXT_TRACK;
511+
myEventsBuffer.append(myStEvent);
512+
} else if(aDndFile == "ACTION_PLAY_PAUSE") {
513+
myStEvent.Key.VKey = ST_VK_MEDIA_PLAY_PAUSE;
514+
myEventsBuffer.append(myStEvent);
515+
} else {
516+
std::vector<const char*> aDndList;
517+
aDndList.push_back(aDndFile.toCString());
518+
myStEvent.Type = stEvent_FileDrop;
519+
myStEvent.DNDrop.Time = getEventTime();
520+
myStEvent.DNDrop.NbFiles = aDndList.size();
521+
myStEvent.DNDrop.Files = &aDndList[0];
522+
myEventsBuffer.append(myStEvent);
523+
}
508524
}
509525

510526
updateActiveState();

include/StCore/StAndroidGlue.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,15 @@ class StAndroidGlue {
159159
*/
160160
ST_CPPEXPORT void setWindowFlags(const int theFlags);
161161

162+
/**
163+
* Setup window title.
164+
*/
165+
ST_CPPEXPORT void setWindowTitle(const StString& theTitle);
166+
162167
/**
163168
* Set/release WAKE_LOCK.
164169
*/
165-
ST_CPPEXPORT void setWakeLock(bool theToLock);
170+
ST_CPPEXPORT void setWakeLock(const StString& theTitle, bool theToLock);
166171

167172
/**
168173
* Turn stereo output on using device-specific API.
@@ -424,6 +429,8 @@ class StAndroidGlue {
424429
AInputQueue* myInputQueuePending;
425430
ANativeWindow* myWindow; //!< native window to draw into
426431
ANativeWindow* myWindowPending;
432+
StString myWindowTitle; //!< window title
433+
StString myWakeLockTitle; //!< wake lock title
427434
bool myIsChangingSurface; //!< flag indicating surface changing state
428435
bool myIsWakeLockSet; //!< flag indicating WAKE_LOCK enabled state
429436
int myWindowFlags; //!< active window flags

sview/AndroidManifest.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88
android:hasCode="true"
99
android:icon="@drawable/ic_launcher">
1010
<uses-library android:name="com.s3dv.s3dvsurface" android:required="false" />
11+
12+
<!-- Movie Player foreground service for background audio playback -->
13+
<service android:name="com.sview.StMovieService"
14+
android:exported="false"
15+
android:description="@string/app_movie_service_desc" />
16+
1117
<!-- Movie Player -->
1218
<activity android:name="com.sview.StMovieActivity"
1319
android:label="@string/app_movie_name"
755 Bytes
Loading
499 Bytes
Loading
977 Bytes
Loading
1.46 KB
Loading

0 commit comments

Comments
 (0)