Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
M
mpd
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Иван Мажукин
mpd
Commits
57687779
Commit
57687779
authored
Jul 26, 2021
by
Sam Bazley
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Android: add option to pause MPD when headphones disconnect
parent
d39b11ba
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
97 additions
and
0 deletions
+97
-0
AndroidManifest.xml
android/AndroidManifest.xml
+3
-0
settings.xml
android/res/layout/settings.xml
+6
-0
strings.xml
android/res/values/strings.xml
+1
-0
Bridge.java
android/src/Bridge.java
+1
-0
IMain.aidl
android/src/IMain.aidl
+1
-0
Main.java
android/src/Main.java
+58
-0
Settings.java
android/src/Settings.java
+18
-0
Main.cxx
src/Main.cxx
+9
-0
No files found.
android/AndroidManifest.xml
View file @
57687779
...
...
@@ -17,6 +17,8 @@
<uses-permission
android:name=
"android.permission.INTERNET"
/>
<uses-permission
android:name=
"android.permission.RECEIVE_BOOT_COMPLETED"
/>
<uses-permission
android:name=
"android.permission.FOREGROUND_SERVICE"
/>
<uses-permission
android:name=
"android.permission.MODIFY_AUDIO_SETTINGS"
/>
<uses-permission
android:name=
"android.permission.BLUETOOTH"
/>
<application
android:allowBackup=
"true"
android:requestLegacyExternalStorage=
"true"
...
...
@@ -41,6 +43,7 @@
<receiver
android:name=
".Receiver"
>
<intent-filter>
<action
android:name=
"android.intent.action.BOOT_COMPLETED"
/>
<action
android:name=
"android.intent.action.HEADSET_PLUG"
/>
</intent-filter>
</receiver>
<service
android:name=
".Main"
android:process=
":main"
/>
...
...
android/res/layout/settings.xml
View file @
57687779
...
...
@@ -23,6 +23,12 @@
android:layout_height=
"wrap_content"
android:text=
"@string/checkbox_wakelock"
/>
<CheckBox
android:id=
"@+id/pause_on_headphones_disconnect"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:text=
"@string/checkbox_pause_on_headphones_disconnect"
/>
<TextView
android:id=
"@+id/status"
android:layout_width=
"wrap_content"
...
...
android/res/values/strings.xml
View file @
57687779
...
...
@@ -8,4 +8,5 @@
<string
name=
"toggle_button_run_off"
>
MPD is not running
</string>
<string
name=
"checkbox_run_on_boot"
>
Run MPD automatically on boot
</string>
<string
name=
"checkbox_wakelock"
>
Prevent suspend when MPD is running (Wakelock)
</string>
<string
name=
"checkbox_pause_on_headphones_disconnect"
>
Pause MPD when headphones disconnect
</string>
</resources>
android/src/Bridge.java
View file @
57687779
...
...
@@ -33,4 +33,5 @@ public class Bridge {
public
static
native
void
run
(
Context
context
,
LogListener
logListener
);
public
static
native
void
shutdown
();
public
static
native
void
pause
();
}
android/src/IMain.aidl
View file @
57687779
...
...
@@ -5,6 +5,7 @@ interface IMain
{
void
start
();
void
stop
();
void
setPauseOnHeadphonesDisconnect
(
boolean
enabled
);
void
setWakelockEnabled
(
boolean
enabled
);
boolean
isRunning
();
void
registerCallback
(
IMainCallback
cb
);
...
...
android/src/Main.java
View file @
57687779
...
...
@@ -24,9 +24,13 @@ import android.app.Notification;
import
android.app.NotificationManager
;
import
android.app.PendingIntent
;
import
android.app.Service
;
import
android.bluetooth.BluetoothDevice
;
import
android.bluetooth.BluetoothClass
;
import
android.content.BroadcastReceiver
;
import
android.content.ComponentName
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.content.IntentFilter
;
import
android.content.ServiceConnection
;
import
android.os.Build
;
import
android.os.IBinder
;
...
...
@@ -55,6 +59,7 @@ public class Main extends Service implements Runnable {
private
String
mError
=
null
;
private
final
RemoteCallbackList
<
IMainCallback
>
mCallbacks
=
new
RemoteCallbackList
<
IMainCallback
>();
private
final
IBinder
mBinder
=
new
MainStub
(
this
);
private
boolean
mPauseOnHeadphonesDisconnect
=
false
;
private
PowerManager
.
WakeLock
mWakelock
=
null
;
static
class
MainStub
extends
IMain
.
Stub
{
...
...
@@ -68,6 +73,9 @@ public class Main extends Service implements Runnable {
public
void
stop
()
{
mService
.
stop
();
}
public
void
setPauseOnHeadphonesDisconnect
(
boolean
enabled
)
{
mService
.
setPauseOnHeadphonesDisconnect
(
enabled
);
}
public
void
setWakelockEnabled
(
boolean
enabled
)
{
mService
.
setWakelockEnabled
(
enabled
);
}
...
...
@@ -191,6 +199,28 @@ public class Main extends Service implements Runnable {
if
(
mThread
!=
null
)
return
;
IntentFilter
filter
=
new
IntentFilter
();
filter
.
addAction
(
Intent
.
ACTION_HEADSET_PLUG
);
filter
.
addAction
(
BluetoothDevice
.
ACTION_ACL_DISCONNECT_REQUESTED
);
filter
.
addAction
(
BluetoothDevice
.
ACTION_ACL_DISCONNECTED
);
registerReceiver
(
new
BroadcastReceiver
()
{
@Override
public
void
onReceive
(
Context
context
,
Intent
intent
)
{
if
(!
mPauseOnHeadphonesDisconnect
)
{
return
;
}
if
(
intent
.
getAction
().
equals
(
Intent
.
ACTION_HEADSET_PLUG
))
{
if
(
intent
.
hasExtra
(
"state"
)
&&
intent
.
getIntExtra
(
"state"
,
0
)
==
0
)
pause
();
}
else
{
BluetoothDevice
device
=
intent
.
getParcelableExtra
(
BluetoothDevice
.
EXTRA_DEVICE
);
if
(
device
.
getBluetoothClass
().
hasService
(
BluetoothClass
.
Service
.
AUDIO
))
pause
();
}
}
},
filter
);
final
Intent
mainIntent
=
new
Intent
(
this
,
Settings
.
class
);
mainIntent
.
setAction
(
"android.intent.action.MAIN"
);
mainIntent
.
addCategory
(
"android.intent.category.LAUNCHER"
);
...
...
@@ -241,6 +271,21 @@ public class Main extends Service implements Runnable {
stopSelf
();
}
private
void
pause
()
{
if
(
mThread
!=
null
)
{
if
(
mThread
.
isAlive
())
{
synchronized
(
this
)
{
if
(
mStatus
==
MAIN_STATUS_STARTED
)
Bridge
.
pause
();
}
}
}
}
private
void
setPauseOnHeadphonesDisconnect
(
boolean
enabled
)
{
mPauseOnHeadphonesDisconnect
=
enabled
;
}
private
void
setWakelockEnabled
(
boolean
enabled
)
{
if
(
enabled
&&
mWakelock
==
null
)
{
PowerManager
pm
=
(
PowerManager
)
getSystemService
(
Context
.
POWER_SERVICE
);
...
...
@@ -368,6 +413,19 @@ public class Main extends Service implements Runnable {
}
}
public
boolean
setPauseOnHeadphonesDisconnect
(
boolean
enabled
)
{
synchronized
(
this
)
{
if
(
mIMain
!=
null
)
{
try
{
mIMain
.
setPauseOnHeadphonesDisconnect
(
enabled
);
return
true
;
}
catch
(
RemoteException
e
)
{
}
}
return
false
;
}
}
public
boolean
setWakelockEnabled
(
boolean
enabled
)
{
synchronized
(
this
)
{
if
(
mIMain
!=
null
)
{
...
...
android/src/Settings.java
View file @
57687779
...
...
@@ -59,6 +59,7 @@ public class Settings extends Activity {
public
static
class
Preferences
{
public
static
final
String
KEY_RUN_ON_BOOT
=
"run_on_boot"
;
public
static
final
String
KEY_WAKELOCK
=
"wakelock"
;
public
static
final
String
KEY_PAUSE_ON_HEADPHONES_DISCONNECT
=
"pause_on_headphones_disconnect"
;
public
static
SharedPreferences
get
(
Context
context
)
{
return
context
.
getSharedPreferences
(
TAG
,
MODE_PRIVATE
);
...
...
@@ -154,6 +155,9 @@ public class Settings extends Activity {
if
(
Preferences
.
getBoolean
(
Settings
.
this
,
Preferences
.
KEY_WAKELOCK
,
false
))
mClient
.
setWakelockEnabled
(
true
);
if
(
Preferences
.
getBoolean
(
Settings
.
this
,
Preferences
.
KEY_PAUSE_ON_HEADPHONES_DISCONNECT
,
false
))
mClient
.
setPauseOnHeadphonesDisconnect
(
true
);
}
else
{
mClient
.
stop
();
}
...
...
@@ -179,6 +183,15 @@ public class Settings extends Activity {
}
};
private
final
OnCheckedChangeListener
mOnPauseOnHeadphonesDisconnectChangeListener
=
new
OnCheckedChangeListener
()
{
@Override
public
void
onCheckedChanged
(
CompoundButton
buttonView
,
boolean
isChecked
)
{
Preferences
.
putBoolean
(
Settings
.
this
,
Preferences
.
KEY_PAUSE_ON_HEADPHONES_DISCONNECT
,
isChecked
);
if
(
mClient
!=
null
&&
mClient
.
isRunning
())
mClient
.
setPauseOnHeadphonesDisconnect
(
isChecked
);
}
};
@Override
protected
void
onCreate
(
Bundle
savedInstanceState
)
{
/* TODO: this sure is the wrong place to request
...
...
@@ -211,6 +224,11 @@ public class Settings extends Activity {
if
(
Preferences
.
getBoolean
(
this
,
Preferences
.
KEY_WAKELOCK
,
false
))
checkbox
.
setChecked
(
true
);
checkbox
=
(
CheckBox
)
findViewById
(
R
.
id
.
pause_on_headphones_disconnect
);
checkbox
.
setOnCheckedChangeListener
(
mOnPauseOnHeadphonesDisconnectChangeListener
);
if
(
Preferences
.
getBoolean
(
this
,
Preferences
.
KEY_PAUSE_ON_HEADPHONES_DISCONNECT
,
false
))
checkbox
.
setChecked
(
true
);
super
.
onCreate
(
savedInstanceState
);
}
...
...
src/Main.cxx
View file @
57687779
...
...
@@ -612,6 +612,15 @@ Java_org_musicpd_Bridge_shutdown(JNIEnv *, jclass)
global_instance
->
Break
();
}
gcc_visibility_default
JNIEXPORT
void
JNICALL
Java_org_musicpd_Bridge_pause
(
JNIEnv
*
,
jclass
)
{
if
(
global_instance
!=
nullptr
)
for
(
auto
&
partition
:
global_instance
->
partitions
)
partition
.
pc
.
LockSetPause
(
true
);
}
#else
static
inline
void
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment