Added rule loop sound option

pull/217/head
M66B 9 months ago
parent 942df1e6b8
commit 850994e349

@ -1428,6 +1428,7 @@ public class EntityRule {
private boolean onActionSound(Context context, EntityMessage message, JSONObject jargs) throws JSONException { private boolean onActionSound(Context context, EntityMessage message, JSONObject jargs) throws JSONException {
Uri uri = (jargs.has("uri") ? Uri.parse(jargs.getString("uri")) : null); Uri uri = (jargs.has("uri") ? Uri.parse(jargs.getString("uri")) : null);
boolean loop = jargs.getBoolean("loop");
boolean alarm = jargs.getBoolean("alarm"); boolean alarm = jargs.getBoolean("alarm");
int duration = jargs.optInt("duration", MediaPlayerHelper.DEFAULT_ALARM_DURATION); int duration = jargs.optInt("duration", MediaPlayerHelper.DEFAULT_ALARM_DURATION);
Log.i("Sound uri=" + uri + " alarm=" + alarm + " duration=" + duration); Log.i("Sound uri=" + uri + " alarm=" + alarm + " duration=" + duration);
@ -1438,7 +1439,7 @@ public class EntityRule {
db.message().setMessageUiSilent(message.id, message.ui_silent); db.message().setMessageUiSilent(message.id, message.ui_silent);
if (uri != null) if (uri != null)
MediaPlayerHelper.queue(context, uri, alarm, duration); MediaPlayerHelper.queue(context, uri, loop, alarm, duration);
return true; return true;
} }

@ -173,6 +173,7 @@ public class FragmentRule extends FragmentBase {
private Button btnTtsData; private Button btnTtsData;
private Button btnSound; private Button btnSound;
private CheckBox cbLoop;
private CheckBox cbAlarm; private CheckBox cbAlarm;
private EditText etAlarmDuration; private EditText etAlarmDuration;
@ -380,6 +381,7 @@ public class FragmentRule extends FragmentBase {
btnTtsData = view.findViewById(R.id.btnTtsData); btnTtsData = view.findViewById(R.id.btnTtsData);
btnSound = view.findViewById(R.id.btnSound); btnSound = view.findViewById(R.id.btnSound);
cbLoop = view.findViewById(R.id.cbLoop);
cbAlarm = view.findViewById(R.id.cbAlarm); cbAlarm = view.findViewById(R.id.cbAlarm);
etAlarmDuration = view.findViewById(R.id.etAlarmDuration); etAlarmDuration = view.findViewById(R.id.etAlarmDuration);
@ -1455,8 +1457,10 @@ public class FragmentRule extends FragmentBase {
case EntityRule.TYPE_SOUND: case EntityRule.TYPE_SOUND:
if (jaction.has("uri")) if (jaction.has("uri"))
FragmentRule.this.sound = Uri.parse(jaction.getString("uri")); FragmentRule.this.sound = Uri.parse(jaction.getString("uri"));
boolean loop = jaction.optBoolean("loop");
boolean alarm = jaction.optBoolean("alarm"); boolean alarm = jaction.optBoolean("alarm");
int duration = jaction.optInt("duration", 0); int duration = jaction.optInt("duration", 0);
cbLoop.setChecked(loop);
cbAlarm.setChecked(alarm); cbAlarm.setChecked(alarm);
etAlarmDuration.setEnabled(alarm); etAlarmDuration.setEnabled(alarm);
etAlarmDuration.setText(duration == 0 ? null : Integer.toString(duration)); etAlarmDuration.setText(duration == 0 ? null : Integer.toString(duration));
@ -1884,9 +1888,11 @@ public class FragmentRule extends FragmentBase {
break; break;
case EntityRule.TYPE_SOUND: case EntityRule.TYPE_SOUND:
boolean loop = cbLoop.isChecked();
boolean alarm = cbAlarm.isChecked(); boolean alarm = cbAlarm.isChecked();
String duration = etAlarmDuration.getText().toString(); String duration = etAlarmDuration.getText().toString();
jaction.put("uri", sound); jaction.put("uri", sound);
jaction.put("loop", loop);
jaction.put("alarm", alarm); jaction.put("alarm", alarm);
if (alarm && !TextUtils.isEmpty(duration)) if (alarm && !TextUtils.isEmpty(duration))
try { try {

@ -63,13 +63,13 @@ public class MediaPlayerHelper {
static void queue(Context context, String uri) { static void queue(Context context, String uri) {
try { try {
queue(context, Uri.parse(uri), false, DEFAULT_SOUND_DURATION); queue(context, Uri.parse(uri), false, false, DEFAULT_SOUND_DURATION);
} catch (Throwable ex) { } catch (Throwable ex) {
Log.e(ex); Log.e(ex);
} }
} }
static void queue(Context context, Uri uri, boolean alarm, int duration) { static void queue(Context context, Uri uri, boolean loop, boolean alarm, int duration) {
Log.i("Queuing sound=" + uri); Log.i("Queuing sound=" + uri);
Helper.getMediaTaskExecutor().submit(new Runnable() { Helper.getMediaTaskExecutor().submit(new Runnable() {
@ -78,7 +78,7 @@ public class MediaPlayerHelper {
try { try {
if (!alarm && (isInCall(context) || isDnd(context))) if (!alarm && (isInCall(context) || isDnd(context)))
return; return;
play(context, uri, alarm, duration); play(context, uri, loop, alarm, duration);
} catch (Throwable ex) { } catch (Throwable ex) {
Log.e(ex); Log.e(ex);
} }
@ -86,12 +86,12 @@ public class MediaPlayerHelper {
}); });
} }
private static void play(Context context, Uri uri, boolean alarm, int duration) throws IOException { private static void play(Context context, Uri uri, boolean loop, boolean alarm, int duration) throws IOException {
synchronized (lock) { synchronized (lock) {
sem = new Semaphore(0); sem = new Semaphore(0);
} }
Log.i("Playing sound=" + uri); Log.i("Playing alarm=" + alarm + " loop=" + loop + " sound=" + uri);
AudioAttributes attrs = new AudioAttributes.Builder() AudioAttributes attrs = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
@ -102,7 +102,7 @@ public class MediaPlayerHelper {
try { try {
mediaPlayer.setAudioAttributes(attrs); mediaPlayer.setAudioAttributes(attrs);
mediaPlayer.setDataSource(context.getApplicationContext(), uri); mediaPlayer.setDataSource(context.getApplicationContext(), uri);
mediaPlayer.setLooping(false); mediaPlayer.setLooping(loop);
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override @Override
public void onPrepared(MediaPlayer mp) { public void onPrepared(MediaPlayer mp) {

@ -1293,6 +1293,15 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btnTtsData" /> app:layout_constraintTop_toBottomOf="@id/btnTtsData" />
<CheckBox
android:id="@+id/cbLoop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/title_rule_loop_sound"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btnSound" />
<CheckBox <CheckBox
android:id="@+id/cbAlarm" android:id="@+id/cbAlarm"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -1300,7 +1309,7 @@
android:layout_marginTop="12dp" android:layout_marginTop="12dp"
android:text="@string/title_rule_use_as_alarm" android:text="@string/title_rule_use_as_alarm"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/btnSound" /> app:layout_constraintTop_toBottomOf="@id/cbLoop" />
<TextView <TextView
android:id="@+id/tvAlarm" android:id="@+id/tvAlarm"

@ -2189,6 +2189,7 @@
<string name="title_rule_select_sound">Select sound</string> <string name="title_rule_select_sound">Select sound</string>
<string name="title_rule_select_sound_ringtone">Ringtone</string> <string name="title_rule_select_sound_ringtone">Ringtone</string>
<string name="title_rule_select_sound_audio">Audio file</string> <string name="title_rule_select_sound_audio">Audio file</string>
<string name="title_rule_loop_sound">Loop sound</string>
<string name="title_rule_use_as_alarm">Use as alarm</string> <string name="title_rule_use_as_alarm">Use as alarm</string>
<string name="title_rule_alarm_hint">This will ignore "do not disturb" rules</string> <string name="title_rule_alarm_hint">This will ignore "do not disturb" rules</string>
<string name="title_rule_alarm_duration">Maximum alarm duration (seconds)</string> <string name="title_rule_alarm_duration">Maximum alarm duration (seconds)</string>

Loading…
Cancel
Save