diff --git a/app/src/main/java/eu/faircode/email/EntityRule.java b/app/src/main/java/eu/faircode/email/EntityRule.java index f947d9df38..7367d70b82 100644 --- a/app/src/main/java/eu/faircode/email/EntityRule.java +++ b/app/src/main/java/eu/faircode/email/EntityRule.java @@ -954,6 +954,7 @@ public class EntityRule { Uri uri = Uri.parse(jargs.getString("uri")); boolean alarm = jargs.getBoolean("alarm"); + int duration = jargs.optInt("duration", MediaPlayerHelper.DEFAULT_ALARM_DURATION); DB db = DB.getInstance(context); @@ -964,7 +965,7 @@ public class EntityRule { @Override public void run() { try { - MediaPlayerHelper.play(context, uri, alarm); + MediaPlayerHelper.play(context, uri, alarm, duration); } catch (Throwable ex) { Log.e(ex); } diff --git a/app/src/main/java/eu/faircode/email/FragmentRule.java b/app/src/main/java/eu/faircode/email/FragmentRule.java index 2c7322eaf8..d3bdd4fa9d 100644 --- a/app/src/main/java/eu/faircode/email/FragmentRule.java +++ b/app/src/main/java/eu/faircode/email/FragmentRule.java @@ -149,6 +149,7 @@ public class FragmentRule extends FragmentBase { private Button btnSound; private CheckBox cbAlarm; + private EditText etAlarmDuration; private TextView tvAutomation; @@ -297,6 +298,7 @@ public class FragmentRule extends FragmentBase { btnSound = view.findViewById(R.id.btnSound); cbAlarm = view.findViewById(R.id.cbAlarm); + etAlarmDuration = view.findViewById(R.id.etAlarmDuration); tvAutomation = view.findViewById(R.id.tvAutomation); @@ -517,6 +519,16 @@ public class FragmentRule extends FragmentBase { } }); + cbAlarm.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + etAlarmDuration.setEnabled(isChecked); + } + }); + + etAlarmDuration.setHint(Integer.toString(MediaPlayerHelper.DEFAULT_ALARM_DURATION)); + etAlarmDuration.setEnabled(false); + npDuration.setMinValue(0); npDuration.setMaxValue(999); @@ -1043,7 +1055,11 @@ public class FragmentRule extends FragmentBase { case EntityRule.TYPE_SOUND: if (jaction.has("uri")) FragmentRule.this.sound = Uri.parse(jaction.getString("uri")); - cbAlarm.setChecked(jaction.optBoolean("alarm")); + boolean alarm = jaction.optBoolean("alarm"); + int duration = jaction.optInt("duration", 0); + cbAlarm.setChecked(alarm); + etAlarmDuration.setEnabled(alarm); + etAlarmDuration.setText(duration == 0 ? null : Integer.toString(duration)); break; } @@ -1375,8 +1391,16 @@ public class FragmentRule extends FragmentBase { break; case EntityRule.TYPE_SOUND: + boolean alarm = cbAlarm.isChecked(); + String duration = etAlarmDuration.getText().toString(); jaction.put("uri", sound); - jaction.put("alarm", cbAlarm.isChecked()); + jaction.put("alarm", alarm); + if (alarm && !TextUtils.isEmpty(duration)) + try { + jaction.put("duration", Integer.parseInt(duration)); + } catch (NumberFormatException ex) { + Log.e(ex); + } break; } } diff --git a/app/src/main/java/eu/faircode/email/MediaPlayerHelper.java b/app/src/main/java/eu/faircode/email/MediaPlayerHelper.java index 3f8663b2ed..629a4ac8fe 100644 --- a/app/src/main/java/eu/faircode/email/MediaPlayerHelper.java +++ b/app/src/main/java/eu/faircode/email/MediaPlayerHelper.java @@ -10,9 +10,9 @@ import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; public class MediaPlayerHelper { - private static final int MAX_DURATION = 30; // seconds + static final int DEFAULT_ALARM_DURATION = 30; // seconds - static void play(Context context, Uri uri, boolean alarm) throws IOException { + static void play(Context context, Uri uri, boolean alarm, int duration) throws IOException { Semaphore sem = new Semaphore(0); AudioAttributes attrs = new AudioAttributes.Builder() @@ -41,7 +41,7 @@ public class MediaPlayerHelper { mediaPlayer.prepareAsync(); try { - if (!sem.tryAcquire(MAX_DURATION, TimeUnit.SECONDS)) { + if (!sem.tryAcquire(duration, TimeUnit.SECONDS)) { mediaPlayer.stop(); mediaPlayer.release(); } diff --git a/app/src/main/res/layout/fragment_rule.xml b/app/src/main/res/layout/fragment_rule.xml index 134ff399d8..dd025ccf25 100644 --- a/app/src/main/res/layout/fragment_rule.xml +++ b/app/src/main/res/layout/fragment_rule.xml @@ -947,6 +947,30 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/cbAlarm" /> + + + + + app:layout_constraintTop_toBottomOf="@+id/etAlarmDuration" /> + app:constraint_referenced_ids="btnSound,cbAlarm,tvAlarm,tvAlarmDuration,etAlarmDuration" /> Select sound Use as alarm This will ignore "do not disturb" rules + Maximum alarm duration (seconds) Synchronize Folders