From 17444d9a3c275c4f2f865c8e6ec8b886f1e37e7f Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Fri, 31 Jan 2020 17:33:49 +0100 Subject: Updated sleep timer UI --- .../antennapod/activity/MediaplayerActivity.java | 31 +---- .../danoeh/antennapod/dialog/SleepTimerDialog.java | 139 +++++++++++++++------ 2 files changed, 103 insertions(+), 67 deletions(-) (limited to 'app/src/main/java') diff --git a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java index 538ed1231..021ff774d 100644 --- a/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java +++ b/app/src/main/java/de/danoeh/antennapod/activity/MediaplayerActivity.java @@ -358,10 +358,8 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements menu.findItem(R.id.remove_from_favorites_item).setVisible(isFavorite); } - boolean sleepTimerSet = controller.sleepTimerActive(); - boolean sleepTimerNotSet = controller.sleepTimerNotActive(); - menu.findItem(R.id.set_sleeptimer_item).setVisible(sleepTimerNotSet); - menu.findItem(R.id.disable_sleeptimer_item).setVisible(sleepTimerSet); + menu.findItem(R.id.set_sleeptimer_item).setVisible(!controller.sleepTimerActive()); + menu.findItem(R.id.disable_sleeptimer_item).setVisible(controller.sleepTimerActive()); if (this instanceof AudioplayerActivity) { int[] attrs = {R.attr.action_bar_icon_color}; @@ -422,30 +420,9 @@ public abstract class MediaplayerActivity extends CastEnabledActivity implements .show(); } break; - case R.id.disable_sleeptimer_item: - if (controller.serviceAvailable()) { - - new AlertDialog.Builder(this) - .setTitle(R.string.sleep_timer_label) - .setMessage(getString(R.string.time_left_label) - + Converter.getDurationStringLong((int) controller - .getSleepTimerTimeLeft())) - .setPositiveButton(R.string.disable_sleeptimer_label, (dialog, which) - -> controller.disableSleepTimer()) - .setNegativeButton(R.string.cancel_label, null) - .show(); - } - break; + case R.id.disable_sleeptimer_item: // Fall-through case R.id.set_sleeptimer_item: - if (controller.serviceAvailable()) { - SleepTimerDialog td = new SleepTimerDialog(this) { - @Override - public void onTimerSet(long millis, boolean shakeToReset, boolean vibrate) { - controller.setSleepTimer(millis, shakeToReset, vibrate); - } - }; - td.createNewDialog().show(); - } + new SleepTimerDialog().show(getSupportFragmentManager(), "SleepTimerDialog"); break; case R.id.audio_controls: boolean isPlayingVideo = controller.getMedia().getMediaType() == MediaType.VIDEO; diff --git a/app/src/main/java/de/danoeh/antennapod/dialog/SleepTimerDialog.java b/app/src/main/java/de/danoeh/antennapod/dialog/SleepTimerDialog.java index 8d176c708..d36f97c7a 100644 --- a/app/src/main/java/de/danoeh/antennapod/dialog/SleepTimerDialog.java +++ b/app/src/main/java/de/danoeh/antennapod/dialog/SleepTimerDialog.java @@ -1,67 +1,101 @@ package de.danoeh.antennapod.dialog; +import android.app.Dialog; import android.content.Context; +import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.ArrayAdapter; +import android.widget.Button; import android.widget.CheckBox; import android.widget.EditText; +import android.widget.LinearLayout; import android.widget.Spinner; +import android.widget.TextView; import android.widget.Toast; - +import androidx.annotation.NonNull; import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.DialogFragment; import de.danoeh.antennapod.R; -import de.danoeh.antennapod.core.event.MessageEvent; import de.danoeh.antennapod.core.preferences.SleepTimerPreferences; -import org.greenrobot.eventbus.EventBus; +import de.danoeh.antennapod.core.service.playback.PlaybackService; +import de.danoeh.antennapod.core.util.Converter; +import de.danoeh.antennapod.core.util.playback.PlaybackController; +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.disposables.Disposable; -public abstract class SleepTimerDialog { - - private static final String TAG = SleepTimerDialog.class.getSimpleName(); +import java.util.concurrent.TimeUnit; - private final Context context; +public class SleepTimerDialog extends DialogFragment { + private PlaybackController controller; + private Disposable timeUpdater; - private AlertDialog dialog; private EditText etxtTime; private Spinner spTimeUnit; private CheckBox cbShakeToReset; private CheckBox cbVibrate; private CheckBox chAutoEnable; + private LinearLayout timeSetup; + private LinearLayout timeDisplay; + private TextView time; + public SleepTimerDialog() { - protected SleepTimerDialog(Context context) { - this.context = context; } - public AlertDialog createNewDialog() { - View content = View.inflate(context, R.layout.time_dialog, null); - AlertDialog.Builder builder = new AlertDialog.Builder(context); - builder.setTitle(R.string.set_sleeptimer_label); - builder.setView(content); - builder.setNegativeButton(R.string.cancel_label, (dialog, which) -> dialog.dismiss()); - builder.setPositiveButton(R.string.set_sleeptimer_label, (dialog, which) -> { - try { - savePreferences(); - long input = SleepTimerPreferences.timerMillis(); - onTimerSet(input, cbShakeToReset.isChecked(), cbVibrate.isChecked()); - dialog.dismiss(); - } catch (NumberFormatException e) { - e.printStackTrace(); - Toast toast = Toast.makeText(context, R.string.time_dialog_invalid_input, - Toast.LENGTH_LONG); - toast.show(); + @Override + public void onStart() { + super.onStart(); + controller = new PlaybackController(getActivity(), false) { + @Override + public void setupGUI() { + updateTime(); } - }); - dialog = builder.create(); + + @Override + public void onSleepTimerUpdate() { + updateTime(); + } + }; + controller.init(); + timeUpdater = Observable.interval(1, TimeUnit.SECONDS) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(tick -> updateTime()); + } + + @Override + public void onStop() { + super.onStop(); + if (controller != null) { + controller.release(); + } + if (timeUpdater != null) { + timeUpdater.dispose(); + } + } + + @NonNull + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + View content = View.inflate(getContext(), R.layout.time_dialog, null); + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); + builder.setTitle(R.string.sleep_timer_label); + builder.setView(content); + builder.setPositiveButton(android.R.string.ok, null); etxtTime = content.findViewById(R.id.etxtTime); spTimeUnit = content.findViewById(R.id.spTimeUnit); cbShakeToReset = content.findViewById(R.id.cbShakeToReset); cbVibrate = content.findViewById(R.id.cbVibrate); chAutoEnable = content.findViewById(R.id.chAutoEnable); + timeSetup = content.findViewById(R.id.timeSetup); + timeDisplay = content.findViewById(R.id.timeDisplay); + time = content.findViewById(R.id.time); + AlertDialog dialog = builder.create(); etxtTime.setText(SleepTimerPreferences.lastTimerValue()); etxtTime.addTextChangedListener(new TextWatcher() { @Override @@ -78,15 +112,15 @@ public abstract class SleepTimerDialog { } }); etxtTime.postDelayed(() -> { - InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(etxtTime, InputMethodManager.SHOW_IMPLICIT); }, 100); String[] spinnerContent = new String[] { - context.getString(R.string.time_seconds), - context.getString(R.string.time_minutes), - context.getString(R.string.time_hours) }; - ArrayAdapter spinnerAdapter = new ArrayAdapter<>(context, + getString(R.string.time_seconds), + getString(R.string.time_minutes), + getString(R.string.time_hours) }; + ArrayAdapter spinnerAdapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, spinnerContent); spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spTimeUnit.setAdapter(spinnerAdapter); @@ -96,16 +130,33 @@ public abstract class SleepTimerDialog { cbVibrate.setChecked(SleepTimerPreferences.vibrate()); chAutoEnable.setChecked(SleepTimerPreferences.autoEnable()); - chAutoEnable.setOnCheckedChangeListener((compoundButton, isChecked) -> { - SleepTimerPreferences.setAutoEnable(isChecked); - int messageString = isChecked ? R.string.sleep_timer_enabled_label : R.string.sleep_timer_disabled_label; - EventBus.getDefault().post(new MessageEvent(context.getString(messageString))); + chAutoEnable.setOnCheckedChangeListener((compoundButton, isChecked) + -> SleepTimerPreferences.setAutoEnable(isChecked)); + Button disableButton = content.findViewById(R.id.disableSleeptimerButton); + disableButton.setOnClickListener(v -> { + if (controller != null) { + controller.disableSleepTimer(); + } + }); + Button setButton = content.findViewById(R.id.setSleeptimerButton); + setButton.setOnClickListener(v -> { + if (!PlaybackService.isRunning) { + Toast.makeText(getContext(), R.string.no_media_playing_label, Toast.LENGTH_LONG).show(); + } + try { + savePreferences(); + long time = SleepTimerPreferences.timerMillis(); + if (controller != null) { + controller.setSleepTimer(time, cbShakeToReset.isChecked(), cbVibrate.isChecked()); + } + } catch (NumberFormatException e) { + e.printStackTrace(); + Toast.makeText(getContext(), R.string.time_dialog_invalid_input, Toast.LENGTH_LONG).show(); + } }); return dialog; } - public abstract void onTimerSet(long millis, boolean shakeToReset, boolean vibrate); - private void savePreferences() { SleepTimerPreferences.setLastTimer(etxtTime.getText().toString(), spTimeUnit.getSelectedItemPosition()); @@ -114,4 +165,12 @@ public abstract class SleepTimerDialog { SleepTimerPreferences.setAutoEnable(chAutoEnable.isChecked()); } + private void updateTime() { + if (controller == null) { + return; + } + timeSetup.setVisibility(controller.sleepTimerActive() ? View.GONE : View.VISIBLE); + timeDisplay.setVisibility(controller.sleepTimerActive() ? View.VISIBLE : View.GONE); + time.setText(Converter.getDurationStringLong((int) controller.getSleepTimerTimeLeft())); + } } -- cgit v1.2.3