package de.danoeh.antennapod.dialog; import android.content.Context; import android.content.SharedPreferences; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.EditText; import android.widget.Spinner; import android.widget.Toast; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; import java.util.concurrent.TimeUnit; import de.danoeh.antennapod.R; public abstract class SleepTimerDialog { private static final String TAG = SleepTimerDialog.class.getSimpleName(); private static final int DEFAULT_SPINNER_POSITION = 1; private Context context; private String PREF_NAME = "SleepTimerDialog"; private String PREF_VALUE = "LastValue"; private String PREF_TIME_UNIT = "LastTimeUnit"; private String PREF_VIBRATE = "Vibrate"; private String PREF_SHAKE_TO_RESET = "ShakeToReset"; private SharedPreferences prefs; private MaterialDialog dialog; private EditText etxtTime; private Spinner spTimeUnit; private CheckBox cbShakeToReset; private CheckBox cbVibrate; private TimeUnit[] units = { TimeUnit.SECONDS, TimeUnit.MINUTES, TimeUnit.HOURS }; public SleepTimerDialog(Context context) { this.context = context; prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); } public MaterialDialog createNewDialog() { MaterialDialog.Builder builder = new MaterialDialog.Builder(context); builder.title(R.string.set_sleeptimer_label); builder.customView(R.layout.time_dialog, false); builder.positiveText(R.string.set_sleeptimer_label); builder.negativeText(R.string.cancel_label); builder.onNegative((dialog, which) -> dialog.dismiss()); builder.onPositive((dialog, which) -> { try { savePreferences(); long input = readTimeMillis(); 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(); } }); dialog = builder.build(); View view = dialog.getView(); etxtTime = (EditText) view.findViewById(R.id.etxtTime); spTimeUnit = (Spinner) view.findViewById(R.id.spTimeUnit); cbShakeToReset = (CheckBox) view.findViewById(R.id.cbShakeToReset); cbVibrate = (CheckBox) view.findViewById(R.id.cbVibrate); etxtTime.setText(prefs.getString(PREF_VALUE, "15")); etxtTime.addTextChangedListener(new TextWatcher() { @Override public void afterTextChanged(Editable s) { checkInputLength(s.length()); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } }); etxtTime.postDelayed(() -> { InputMethodManager imm = (InputMethodManager) context.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<String> spinnerAdapter = new ArrayAdapter<>(context, android.R.layout.simple_spinner_item, spinnerContent); spinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spTimeUnit.setAdapter(spinnerAdapter); int selection = prefs.getInt(PREF_TIME_UNIT, DEFAULT_SPINNER_POSITION); spTimeUnit.setSelection(selection); cbShakeToReset.setChecked(prefs.getBoolean(PREF_SHAKE_TO_RESET, true)); cbVibrate.setChecked(prefs.getBoolean(PREF_VIBRATE, true)); return dialog; } private void checkInputLength(int length) { if (length > 0) { Log.d(TAG, "Length is larger than 0, enabling confirm button"); dialog.getActionButton(DialogAction.POSITIVE).setEnabled(true); } else { Log.d(TAG, "Length is smaller than 0, disabling confirm button"); dialog.getActionButton(DialogAction.POSITIVE).setEnabled(false); } } public abstract void onTimerSet(long millis, boolean shakeToReset, boolean vibrate); private long readTimeMillis() { TimeUnit selectedUnit = units[spTimeUnit.getSelectedItemPosition()]; long value = Long.parseLong(etxtTime.getText().toString()); return selectedUnit.toMillis(value); } private void savePreferences() { prefs.edit() .putString(PREF_VALUE, etxtTime.getText().toString()) .putInt(PREF_TIME_UNIT, spTimeUnit.getSelectedItemPosition()) .putBoolean(PREF_SHAKE_TO_RESET, cbShakeToReset.isChecked()) .putBoolean(PREF_VIBRATE, cbVibrate.isChecked()) .apply(); } }