content: package de.danoeh.antennapod.ui.screen.playback;
  
  import android.app.Activity;
  import android.app.Dialog;
  import android.content.Context;
  import android.os.Bundle;
  import android.text.format.DateFormat;
  import android.view.View;
  import android.view.inputmethod.InputMethodManager;
  import android.widget.Button;
  import android.widget.CheckBox;
  import android.widget.EditText;
  import android.widget.ImageView;
  import android.widget.LinearLayout;
  import android.widget.TextView;
  
  import androidx.annotation.NonNull;
  import androidx.fragment.app.DialogFragment;
  
  import com.google.android.material.dialog.MaterialAlertDialogBuilder;
  import com.google.android.material.snackbar.Snackbar;
  
  import de.danoeh.antennapod.playback.base.PlayerStatus;
  import de.danoeh.antennapod.playback.service.PlaybackController;
  import de.danoeh.antennapod.playback.service.PlaybackService;
  import org.greenrobot.eventbus.EventBus;
  import org.greenrobot.eventbus.Subscribe;
  import org.greenrobot.eventbus.ThreadMode;
  
  import java.util.Locale;
  
  import de.danoeh.antennapod.R;
  import de.danoeh.antennapod.storage.preferences.SleepTimerPreferences;
  import de.danoeh.antennapod.ui.common.Converter;
  import de.danoeh.antennapod.event.playback.SleepTimerUpdatedEvent;
  
  public class SleepTimerDialog extends DialogFragment {
      private PlaybackController controller;
      private EditText etxtTime;
      private LinearLayout timeSetup;
      private LinearLayout timeDisplay;
      private TextView time;
      private CheckBox chAutoEnable;
  
      public SleepTimerDialog() {
  
      }
  
      @Override
      public void onStart() {
          super.onStart();
          controller = new PlaybackController(getActivity()) {
              @Override
              public void loadMediaInfo() {
              }
          };
          controller.init();
          EventBus.getDefault().register(this);
      }
  
      @Override
      public void onStop() {
          super.onStop();
          if (controller != null) {
              controller.release();
          }
          EventBus.getDefault().unregister(this);
      }
  
      @NonNull
      @Override
      public Dialog onCreateDialog(Bundle savedInstanceState) {
          View content = View.inflate(getContext(), R.layout.time_dialog, null);
          MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getContext());
          builder.setTitle(R.string.sleep_timer_label);
          builder.setView(content);
          builder.setPositiveButton(R.string.close_label, null);
  
          etxtTime = content.findViewById(R.id.etxtTime);
          timeSetup = content.findViewById(R.id.timeSetup);
          timeDisplay = content.findViewById(R.id.timeDisplay);
          timeDisplay.setVisibility(View.GONE);
          time = content.findViewById(R.id.time);
          Button extendSleepFiveMinutesButton = content.findViewById(R.id.extendSleepFiveMinutesButton);
          extendSleepFiveMinutesButton.setText(getString(R.string.extend_sleep_timer_label, 5));
          Button extendSleepTenMinutesButton = content.findViewById(R.id.extendSleepTenMinutesButton);
          extendSleepTenMinutesButton.setText(getString(R.string.extend_sleep_timer_label, 10));
          Button extendSleepTwentyMinutesButton = content.findViewById(R.id.extendSleepTwentyMinutesButton);
          extendSleepTwentyMinutesButton.setText(getString(R.string.extend_sleep_timer_label, 20));
          extendSleepFiveMinutesButton.setOnClickListener(v -> {
              if (controller != null) {
                  controller.extendSleepTimer(5 * 1000 * 60);
              }
          });
          extendSleepTenMinutesButton.setOnClickListener(v -> {
              if (controller != null) {
                  controller.extendSleepTimer(10 * 1000 * 60);
              }
          });
          extendSleepTwentyMinutesButton.setOnClickListener(v -> {
              if (controller != null) {
                  controller.extendSleepTimer(20 * 1000 * 60);
              }
          });
  
          etxtTime.setText(SleepTimerPreferences.lastTimerValue());
          etxtTime.postDelayed(() -> {
              InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
              imm.showSoftInput(etxtTime, InputMethodManager.SHOW_IMPLICIT);
          }, 100);
  
          final CheckBox cbShakeToReset = content.findViewById(R.id.cbShakeToReset);
          final CheckBox cbVibrate = content.findViewById(R.id.cbVibrate);
          chAutoEnable = content.findViewById(R.id.chAutoEnable);
          final ImageView changeTimesButton = content.findViewById(R.id.changeTimesButton);
  
          cbShakeToReset.setChecked(SleepTimerPreferences.shakeToReset());
          cbVibrate.setChecked(SleepTimerPreferences.vibrate());
          chAutoEnable.setChecked(SleepTimerPreferences.autoEnable());
          changeTimesButton.setEnabled(chAutoEnable.isChecked());
          changeTimesButton.setAlpha(chAutoEnable.isChecked() ? 1.0f : 0.5f);
  
          cbShakeToReset.setOnCheckedChangeListener((buttonView, isChecked)
                  -> SleepTimerPreferences.setShakeToReset(isChecked));
          cbVibrate.setOnCheckedChangeListener((buttonView, isChecked)
                  -> SleepTimerPreferences.setVibrate(isChecked));
          chAutoEnable.setOnCheckedChangeListener((compoundButton, isChecked)
                  -> {
              SleepTimerPreferences.setAutoEnable(isChecked);
              changeTimesButton.setEnabled(isChecked);
              changeTimesButton.setAlpha(isChecked ? 1.0f : 0.5f);
          });
          updateAutoEnableText();
  
          changeTimesButton.setOnClickListener(changeTimesBtn -> {
              int from = SleepTimerPreferences.autoEnableFrom();
              int to = SleepTimerPreferences.autoEnableTo();
              showTimeRangeDialog(getContext(), from, to);
          });
  
          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
                      || (controller != null && controller.getStatus() != PlayerStatus.PLAYING)) {
                  Snackbar.make(content, R.string.no_media_playing_label, Snackbar.LENGTH_LONG).show();
                  return;
              }
              try {
                  long time = Long.parseLong(etxtTime.getText().toString());
                  if (time == 0) {
                      throw new NumberFormatException("Timer must not be zero");
                  }
                  SleepTimerPreferences.setLastTimer(etxtTime.getText().toString());
                  if (controller != null) {
                      controller.setSleepTimer(SleepTimerPreferences.timerMillis());
                  }
                  closeKeyboard(content);
              } catch (NumberFormatException e) {
                  e.printStackTrace();
                  Snackbar.make(content, R.string.time_dialog_invalid_input, Snackbar.LENGTH_LONG).show();
              }
          });
          return builder.create();
      }
  
      private void showTimeRangeDialog(Context context, int from, int to) {
          TimeRangeDialog dialog = new TimeRangeDialog(context, from, to);
          dialog.setOnDismissListener(v -> {
              SleepTimerPreferences.setAutoEnableFrom(dialog.getFrom());
              SleepTimerPreferences.setAutoEnableTo(dialog.getTo());
              updateAutoEnableText();
          });
          dialog.show();
      }
  
      private void updateAutoEnableText() {
          String text;
          int from = SleepTimerPreferences.autoEnableFrom();
          int to = SleepTimerPreferences.autoEnableTo();
  
          if (from == to) {
              text = getString(R.string.auto_enable_label);
          } else if (DateFormat.is24HourFormat(getContext())) {
              String formattedFrom = String.format(Locale.getDefault(), "%02d:00", from);
              String formattedTo = String.format(Locale.getDefault(), "%02d:00", to);
              text = getString(R.string.auto_enable_label_with_times, formattedFrom, formattedTo);
          } else {
              String formattedFrom = String.format(Locale.getDefault(), "%02d:00 %s",
                      from % 12, from >= 12 ? "PM" : "AM");
              String formattedTo = String.format(Locale.getDefault(), "%02d:00 %s",
                      to % 12, to >= 12 ? "PM" : "AM");
              text = getString(R.string.auto_enable_label_with_times, formattedFrom, formattedTo);
  
          }
          chAutoEnable.setText(text);
      }
  
      @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
      @SuppressWarnings("unused")
      public void timerUpdated(SleepTimerUpdatedEvent event) {
          timeDisplay.setVisibility(event.isOver() || event.isCancelled() ? View.GONE : View.VISIBLE);
          timeSetup.setVisibility(event.isOver() || event.isCancelled() ? View.VISIBLE : View.GONE);
          time.setText(Converter.getDurationStringLong((int) event.getTimeLeft()));
      }
  
      private void closeKeyboard(View content) {
          InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Activity.INPUT_METHOD_SERVICE);
          imm.hideSoftInputFromWindow(content.getWindowToken(), 0);
      }
  }
  