mirror of
https://github.com/BlackyHawky/Clock.git
synced 2025-07-03 15:33:21 +00:00
Allow the creation of timers with spinner
This commit is contained in:
parent
f220776d2c
commit
e995e9a000
11 changed files with 294 additions and 13 deletions
|
@ -484,6 +484,14 @@ public final class SettingsDAO {
|
||||||
return Integer.parseInt(string) * 60;
|
return Integer.parseInt(string) * 60;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the timer creation view style.
|
||||||
|
*/
|
||||||
|
public static String getTimerCreationViewStyle(SharedPreferences prefs) {
|
||||||
|
// Default value must match the one in res/xml/settings_timer.xml
|
||||||
|
return prefs.getString(KEY_TIMER_CREATION_VIEW_STYLE, DEFAULT_TIMER_CREATION_VIEW_STYLE);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return {@code true} if the timer background must be transparent. {@code false} otherwise.
|
* @return {@code true} if the timer background must be transparent. {@code false} otherwise.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -102,6 +102,8 @@ public class PreferencesDefaultValues {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Timer
|
// Timer
|
||||||
|
public static final String DEFAULT_TIMER_CREATION_VIEW_STYLE = "keypad";
|
||||||
|
public static final String TIMER_CREATION_VIEW_SPINNER_STYLE = "spinner";
|
||||||
public static final String DEFAULT_TIMER_AUTO_SILENCE = "30";
|
public static final String DEFAULT_TIMER_AUTO_SILENCE = "30";
|
||||||
public static final String DEFAULT_TIMER_CRESCENDO_DURATION = "0";
|
public static final String DEFAULT_TIMER_CRESCENDO_DURATION = "0";
|
||||||
public static final boolean DEFAULT_TIMER_VIBRATE = false;
|
public static final boolean DEFAULT_TIMER_VIBRATE = false;
|
||||||
|
|
|
@ -106,6 +106,7 @@ public class PreferencesKeys {
|
||||||
public static final String KEY_PREVIEW_ALARM = "key_preview_alarm";
|
public static final String KEY_PREVIEW_ALARM = "key_preview_alarm";
|
||||||
|
|
||||||
// Timer
|
// Timer
|
||||||
|
public static final String KEY_TIMER_CREATION_VIEW_STYLE = "key_timer_creation_view_style";
|
||||||
public static final String KEY_TIMER_RINGTONE = "key_timer_ringtone";
|
public static final String KEY_TIMER_RINGTONE = "key_timer_ringtone";
|
||||||
public static final String KEY_TIMER_AUTO_SILENCE = "key_timer_auto_silence";
|
public static final String KEY_TIMER_AUTO_SILENCE = "key_timer_auto_silence";
|
||||||
public static final String KEY_TIMER_CRESCENDO_DURATION = "key_timer_crescendo_duration";
|
public static final String KEY_TIMER_CRESCENDO_DURATION = "key_timer_crescendo_duration";
|
||||||
|
|
|
@ -7,6 +7,7 @@ import static com.best.deskclock.settings.PreferencesKeys.KEY_DEFAULT_TIME_TO_AD
|
||||||
import static com.best.deskclock.settings.PreferencesKeys.KEY_DISPLAY_WARNING_BEFORE_DELETING_TIMER;
|
import static com.best.deskclock.settings.PreferencesKeys.KEY_DISPLAY_WARNING_BEFORE_DELETING_TIMER;
|
||||||
import static com.best.deskclock.settings.PreferencesKeys.KEY_SORT_TIMER;
|
import static com.best.deskclock.settings.PreferencesKeys.KEY_SORT_TIMER;
|
||||||
import static com.best.deskclock.settings.PreferencesKeys.KEY_TIMER_AUTO_SILENCE;
|
import static com.best.deskclock.settings.PreferencesKeys.KEY_TIMER_AUTO_SILENCE;
|
||||||
|
import static com.best.deskclock.settings.PreferencesKeys.KEY_TIMER_CREATION_VIEW_STYLE;
|
||||||
import static com.best.deskclock.settings.PreferencesKeys.KEY_TIMER_CRESCENDO_DURATION;
|
import static com.best.deskclock.settings.PreferencesKeys.KEY_TIMER_CRESCENDO_DURATION;
|
||||||
import static com.best.deskclock.settings.PreferencesKeys.KEY_TIMER_FLIP_ACTION;
|
import static com.best.deskclock.settings.PreferencesKeys.KEY_TIMER_FLIP_ACTION;
|
||||||
import static com.best.deskclock.settings.PreferencesKeys.KEY_TIMER_POWER_BUTTON_ACTION;
|
import static com.best.deskclock.settings.PreferencesKeys.KEY_TIMER_POWER_BUTTON_ACTION;
|
||||||
|
@ -40,6 +41,7 @@ public class TimerSettingsFragment extends ScreenFragment
|
||||||
ListPreference mTimerCrescendoPref;
|
ListPreference mTimerCrescendoPref;
|
||||||
ListPreference mSortTimerPref;
|
ListPreference mSortTimerPref;
|
||||||
ListPreference mDefaultMinutesToAddToTimerPref;
|
ListPreference mDefaultMinutesToAddToTimerPref;
|
||||||
|
ListPreference mTimerCreationViewStylePref;
|
||||||
Preference mTimerRingtonePref;
|
Preference mTimerRingtonePref;
|
||||||
Preference mTimerVibratePref;
|
Preference mTimerVibratePref;
|
||||||
SwitchPreferenceCompat mTimerVolumeButtonsActionPref;
|
SwitchPreferenceCompat mTimerVolumeButtonsActionPref;
|
||||||
|
@ -74,6 +76,7 @@ public class TimerSettingsFragment extends ScreenFragment
|
||||||
mDefaultMinutesToAddToTimerPref = findPreference(KEY_DEFAULT_TIME_TO_ADD_TO_TIMER);
|
mDefaultMinutesToAddToTimerPref = findPreference(KEY_DEFAULT_TIME_TO_ADD_TO_TIMER);
|
||||||
mTransparentBackgroundPref = findPreference(KEY_TRANSPARENT_BACKGROUND_FOR_EXPIRED_TIMER);
|
mTransparentBackgroundPref = findPreference(KEY_TRANSPARENT_BACKGROUND_FOR_EXPIRED_TIMER);
|
||||||
mDisplayWarningBeforeDeletingTimerPref = findPreference(KEY_DISPLAY_WARNING_BEFORE_DELETING_TIMER);
|
mDisplayWarningBeforeDeletingTimerPref = findPreference(KEY_DISPLAY_WARNING_BEFORE_DELETING_TIMER);
|
||||||
|
mTimerCreationViewStylePref = findPreference(KEY_TIMER_CREATION_VIEW_STYLE);
|
||||||
|
|
||||||
setupPreferences();
|
setupPreferences();
|
||||||
}
|
}
|
||||||
|
@ -90,7 +93,8 @@ public class TimerSettingsFragment extends ScreenFragment
|
||||||
switch (pref.getKey()) {
|
switch (pref.getKey()) {
|
||||||
case KEY_TIMER_RINGTONE -> mTimerRingtonePref.setSummary(DataModel.getDataModel().getTimerRingtoneTitle());
|
case KEY_TIMER_RINGTONE -> mTimerRingtonePref.setSummary(DataModel.getDataModel().getTimerRingtoneTitle());
|
||||||
|
|
||||||
case KEY_TIMER_AUTO_SILENCE, KEY_TIMER_CRESCENDO_DURATION, KEY_DEFAULT_TIME_TO_ADD_TO_TIMER -> {
|
case KEY_TIMER_AUTO_SILENCE, KEY_TIMER_CRESCENDO_DURATION,
|
||||||
|
KEY_DEFAULT_TIME_TO_ADD_TO_TIMER, KEY_TIMER_CREATION_VIEW_STYLE -> {
|
||||||
final ListPreference preference = (ListPreference) pref;
|
final ListPreference preference = (ListPreference) pref;
|
||||||
final int index = preference.findIndexOfValue((String) newValue);
|
final int index = preference.findIndexOfValue((String) newValue);
|
||||||
preference.setSummary(preference.getEntries()[index]);
|
preference.setSummary(preference.getEntries()[index]);
|
||||||
|
@ -148,6 +152,9 @@ public class TimerSettingsFragment extends ScreenFragment
|
||||||
|
|
||||||
mTimerPowerButtonActionPref.setOnPreferenceChangeListener(this);
|
mTimerPowerButtonActionPref.setOnPreferenceChangeListener(this);
|
||||||
|
|
||||||
|
mTimerCreationViewStylePref.setOnPreferenceChangeListener(this);
|
||||||
|
mTimerCreationViewStylePref.setSummary(mTimerCreationViewStylePref.getEntry());
|
||||||
|
|
||||||
SensorManager sensorManager = (SensorManager) requireActivity().getSystemService(Context.SENSOR_SERVICE);
|
SensorManager sensorManager = (SensorManager) requireActivity().getSystemService(Context.SENSOR_SERVICE);
|
||||||
if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) == null) {
|
if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) == null) {
|
||||||
mTimerFlipActionPref.setChecked(false);
|
mTimerFlipActionPref.setChecked(false);
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
|
||||||
|
package com.best.deskclock.timer;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.View;
|
||||||
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.NumberPicker;
|
||||||
|
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.best.deskclock.R;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom component to display a time selection view using spinners used when creating timers.
|
||||||
|
*/
|
||||||
|
public class CustomTimerSpinnerSetupView extends LinearLayout {
|
||||||
|
NumberPicker mHourPicker;
|
||||||
|
NumberPicker mMinutePicker;
|
||||||
|
NumberPicker mSecondPicker;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
OnValueChangeListener mOnValueChangeListener;
|
||||||
|
|
||||||
|
public CustomTimerSpinnerSetupView(Context context, @Nullable AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
|
||||||
|
View rootView = inflate(context, R.layout.timer_spinner_setup_view, this);
|
||||||
|
mHourPicker = rootView.findViewById(R.id.hour);
|
||||||
|
mMinutePicker = rootView.findViewById(R.id.minute);
|
||||||
|
mSecondPicker = rootView.findViewById(R.id.second);
|
||||||
|
|
||||||
|
setupCustomSpinnerDurationPicker();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupCustomSpinnerDurationPicker() {
|
||||||
|
mHourPicker.setMinValue(0);
|
||||||
|
mHourPicker.setMaxValue(24);
|
||||||
|
|
||||||
|
mMinutePicker.setMinValue(0);
|
||||||
|
mMinutePicker.setMaxValue(59);
|
||||||
|
|
||||||
|
mSecondPicker.setMinValue(0);
|
||||||
|
mSecondPicker.setMaxValue(59);
|
||||||
|
|
||||||
|
mHourPicker.setOnValueChangedListener((_picker, _oldVal, _newVal) -> {
|
||||||
|
if (mOnValueChangeListener != null) mOnValueChangeListener.onValueChange(getValue());
|
||||||
|
});
|
||||||
|
|
||||||
|
mMinutePicker.setOnValueChangedListener((_picker, _oldVal, _newVal) -> {
|
||||||
|
if (mOnValueChangeListener != null) mOnValueChangeListener.onValueChange(getValue());
|
||||||
|
});
|
||||||
|
|
||||||
|
mSecondPicker.setOnValueChangedListener((_picker, _oldVal, _newVal) -> {
|
||||||
|
if (mOnValueChangeListener != null) mOnValueChangeListener.onValueChange(getValue());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(long valueMillis) {
|
||||||
|
long hours = TimeUnit.MILLISECONDS.toHours(valueMillis);
|
||||||
|
long minutes = TimeUnit.MILLISECONDS.toMinutes(valueMillis) % 60;
|
||||||
|
long seconds = TimeUnit.MILLISECONDS.toSeconds(valueMillis) % 60;
|
||||||
|
setValue(new DurationObject((int) hours, (int) minutes, (int) seconds));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(DurationObject value) {
|
||||||
|
mHourPicker.setValue(value.hour());
|
||||||
|
mMinutePicker.setValue(value.minute());
|
||||||
|
mSecondPicker.setValue(value.second());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reset() {
|
||||||
|
setValue(new DurationObject(0, 0, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
public DurationObject getValue() {
|
||||||
|
return new DurationObject(mHourPicker.getValue(), mMinutePicker.getValue(), mSecondPicker.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnChangeListener(OnValueChangeListener onValueChangeListener) {
|
||||||
|
this.mOnValueChangeListener = onValueChangeListener;
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface OnValueChangeListener {
|
||||||
|
void onValueChange(DurationObject duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
public record DurationObject(int hour, int minute, int second) {
|
||||||
|
public long toMillis() {
|
||||||
|
return (((hour * 60L) + minute) * 60 + second) * 1000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -13,6 +13,7 @@ import static android.view.View.TRANSLATION_Y;
|
||||||
import static android.view.View.VISIBLE;
|
import static android.view.View.VISIBLE;
|
||||||
|
|
||||||
import static com.best.deskclock.DeskClockApplication.getDefaultSharedPreferences;
|
import static com.best.deskclock.DeskClockApplication.getDefaultSharedPreferences;
|
||||||
|
import static com.best.deskclock.settings.PreferencesDefaultValues.TIMER_CREATION_VIEW_SPINNER_STYLE;
|
||||||
import static com.best.deskclock.uidata.UiDataModel.Tab.TIMERS;
|
import static com.best.deskclock.uidata.UiDataModel.Tab.TIMERS;
|
||||||
|
|
||||||
import android.animation.Animator;
|
import android.animation.Animator;
|
||||||
|
@ -68,6 +69,7 @@ public final class TimerFragment extends DeskClockFragment {
|
||||||
private RecyclerView mRecyclerView;
|
private RecyclerView mRecyclerView;
|
||||||
private Serializable mTimerSetupState;
|
private Serializable mTimerSetupState;
|
||||||
private TimerSetupView mCreateTimerView;
|
private TimerSetupView mCreateTimerView;
|
||||||
|
private CustomTimerSpinnerSetupView mCreateTimerSpinnerView;
|
||||||
private TimerAdapter mAdapter;
|
private TimerAdapter mAdapter;
|
||||||
private View mTimersView;
|
private View mTimersView;
|
||||||
private View mCurrentView;
|
private View mCurrentView;
|
||||||
|
@ -114,6 +116,7 @@ public final class TimerFragment extends DeskClockFragment {
|
||||||
mRecyclerView = view.findViewById(R.id.recycler_view);
|
mRecyclerView = view.findViewById(R.id.recycler_view);
|
||||||
mTimersView = view.findViewById(R.id.timer_view);
|
mTimersView = view.findViewById(R.id.timer_view);
|
||||||
mCreateTimerView = view.findViewById(R.id.timer_setup);
|
mCreateTimerView = view.findViewById(R.id.timer_setup);
|
||||||
|
mCreateTimerSpinnerView = view.findViewById(R.id.timer_spinner_setup);
|
||||||
mIsTablet = ThemeUtils.isTablet();
|
mIsTablet = ThemeUtils.isTablet();
|
||||||
mIsLandscape = ThemeUtils.isLandscape();
|
mIsLandscape = ThemeUtils.isLandscape();
|
||||||
|
|
||||||
|
@ -127,6 +130,8 @@ public final class TimerFragment extends DeskClockFragment {
|
||||||
mRecyclerView.setClipToPadding(false);
|
mRecyclerView.setClipToPadding(false);
|
||||||
|
|
||||||
mCreateTimerView.setFabContainer(this);
|
mCreateTimerView.setFabContainer(this);
|
||||||
|
mCreateTimerSpinnerView.setOnChangeListener((durationObject) ->
|
||||||
|
updateFab(FAB_SHRINK_AND_EXPAND));
|
||||||
|
|
||||||
DataModel.getDataModel().addTimerListener(mAdapter);
|
DataModel.getDataModel().addTimerListener(mAdapter);
|
||||||
DataModel.getDataModel().addTimerListener(mTimerWatcher);
|
DataModel.getDataModel().addTimerListener(mTimerWatcher);
|
||||||
|
@ -187,7 +192,7 @@ public final class TimerFragment extends DeskClockFragment {
|
||||||
getViewLifecycleOwner(), new OnBackPressedCallback(true) {
|
getViewLifecycleOwner(), new OnBackPressedCallback(true) {
|
||||||
@Override
|
@Override
|
||||||
public void handleOnBackPressed() {
|
public void handleOnBackPressed() {
|
||||||
if (isTabSelected() && mCurrentView == mCreateTimerView && hasTimers()) {
|
if (isTabSelected() && mCurrentView != mTimersView && hasTimers()) {
|
||||||
animateToView(mTimersView, false);
|
animateToView(mTimersView, false);
|
||||||
} else {
|
} else {
|
||||||
setEnabled(false);
|
setEnabled(false);
|
||||||
|
@ -218,7 +223,7 @@ public final class TimerFragment extends DeskClockFragment {
|
||||||
super.onSaveInstanceState(outState);
|
super.onSaveInstanceState(outState);
|
||||||
|
|
||||||
// If the timer creation view is visible, store the input for later restoration.
|
// If the timer creation view is visible, store the input for later restoration.
|
||||||
if (mCurrentView == mCreateTimerView) {
|
if (mCurrentView != mTimersView) {
|
||||||
mTimerSetupState = mCreateTimerView.getState();
|
mTimerSetupState = mCreateTimerView.getState();
|
||||||
outState.putSerializable(KEY_TIMER_SETUP_STATE, mTimerSetupState);
|
outState.putSerializable(KEY_TIMER_SETUP_STATE, mTimerSetupState);
|
||||||
}
|
}
|
||||||
|
@ -230,8 +235,8 @@ public final class TimerFragment extends DeskClockFragment {
|
||||||
fab.setImageResource(R.drawable.ic_add);
|
fab.setImageResource(R.drawable.ic_add);
|
||||||
fab.setContentDescription(mContext.getString(R.string.timer_add_timer));
|
fab.setContentDescription(mContext.getString(R.string.timer_add_timer));
|
||||||
fab.setVisibility(VISIBLE);
|
fab.setVisibility(VISIBLE);
|
||||||
} else if (mCurrentView == mCreateTimerView) {
|
} else if (mCurrentView == getTimerCreationView()) {
|
||||||
if (mCreateTimerView.hasValidInput()) {
|
if (hasValidInput()) {
|
||||||
fab.setImageResource(R.drawable.ic_fab_play);
|
fab.setImageResource(R.drawable.ic_fab_play);
|
||||||
fab.setContentDescription(mContext.getString(R.string.timer_start));
|
fab.setContentDescription(mContext.getString(R.string.timer_start));
|
||||||
fab.setVisibility(VISIBLE);
|
fab.setVisibility(VISIBLE);
|
||||||
|
@ -243,6 +248,34 @@ public final class TimerFragment extends DeskClockFragment {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isSpinnerCreationView() {
|
||||||
|
return SettingsDAO.getTimerCreationViewStyle(mPrefs).equals(TIMER_CREATION_VIEW_SPINNER_STYLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean hasValidInput() {
|
||||||
|
if (isSpinnerCreationView()) {
|
||||||
|
return mCreateTimerSpinnerView.getValue().toMillis() != 0;
|
||||||
|
} else {
|
||||||
|
return mCreateTimerView.hasValidInput();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private long getTimeInMillis() {
|
||||||
|
if (isSpinnerCreationView()) {
|
||||||
|
return mCreateTimerSpinnerView.getValue().toMillis();
|
||||||
|
} else {
|
||||||
|
return mCreateTimerView.getTimeInMillis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private View getTimerCreationView() {
|
||||||
|
if (isSpinnerCreationView()) {
|
||||||
|
return mCreateTimerSpinnerView;
|
||||||
|
} else {
|
||||||
|
return mCreateTimerView;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onUpdateFab(@NonNull ImageView fab) {
|
public void onUpdateFab(@NonNull ImageView fab) {
|
||||||
updateFab(fab);
|
updateFab(fab);
|
||||||
|
@ -262,7 +295,7 @@ public final class TimerFragment extends DeskClockFragment {
|
||||||
left.setVisibility(INVISIBLE);
|
left.setVisibility(INVISIBLE);
|
||||||
right.setVisibility(INVISIBLE);
|
right.setVisibility(INVISIBLE);
|
||||||
|
|
||||||
} else if (mCurrentView == mCreateTimerView) {
|
} else if (mCurrentView == getTimerCreationView()) {
|
||||||
right.setVisibility(INVISIBLE);
|
right.setVisibility(INVISIBLE);
|
||||||
|
|
||||||
left.setClickable(true);
|
left.setClickable(true);
|
||||||
|
@ -272,6 +305,7 @@ public final class TimerFragment extends DeskClockFragment {
|
||||||
left.setVisibility(hasTimers() ? VISIBLE : INVISIBLE);
|
left.setVisibility(hasTimers() ? VISIBLE : INVISIBLE);
|
||||||
left.setOnClickListener(v -> {
|
left.setOnClickListener(v -> {
|
||||||
mCreateTimerView.reset();
|
mCreateTimerView.reset();
|
||||||
|
mCreateTimerSpinnerView.reset();
|
||||||
animateToView(mTimersView, false);
|
animateToView(mTimersView, false);
|
||||||
left.announceForAccessibility(mContext.getString(R.string.timer_canceled));
|
left.announceForAccessibility(mContext.getString(R.string.timer_canceled));
|
||||||
Utils.setVibrationTime(mContext, 10);
|
Utils.setVibrationTime(mContext, 10);
|
||||||
|
@ -282,12 +316,12 @@ public final class TimerFragment extends DeskClockFragment {
|
||||||
@Override
|
@Override
|
||||||
public void onFabClick(@NonNull ImageView fab) {
|
public void onFabClick(@NonNull ImageView fab) {
|
||||||
if (mCurrentView == mTimersView) {
|
if (mCurrentView == mTimersView) {
|
||||||
animateToView(mCreateTimerView, true);
|
animateToView(getTimerCreationView(), true);
|
||||||
} else if (mCurrentView == mCreateTimerView) {
|
} else if (mCurrentView == getTimerCreationView()) {
|
||||||
mCreatingTimer = true;
|
mCreatingTimer = true;
|
||||||
try {
|
try {
|
||||||
// Create the new timer.
|
// Create the new timer.
|
||||||
final long timerLength = mCreateTimerView.getTimeInMillis();
|
final long timerLength = getTimeInMillis();
|
||||||
String defaultTimeToAddToTimer = String.valueOf(SettingsDAO.getDefaultTimeToAddToTimer(mPrefs));
|
String defaultTimeToAddToTimer = String.valueOf(SettingsDAO.getDefaultTimeToAddToTimer(mPrefs));
|
||||||
final Timer timer = DataModel.getDataModel().addTimer(timerLength, "",
|
final Timer timer = DataModel.getDataModel().addTimer(timerLength, "",
|
||||||
defaultTimeToAddToTimer, false);
|
defaultTimeToAddToTimer, false);
|
||||||
|
@ -323,10 +357,14 @@ public final class TimerFragment extends DeskClockFragment {
|
||||||
|
|
||||||
// Show the creation view; hide the timer view.
|
// Show the creation view; hide the timer view.
|
||||||
mTimersView.setVisibility(GONE);
|
mTimersView.setVisibility(GONE);
|
||||||
mCreateTimerView.setVisibility(VISIBLE);
|
|
||||||
|
// Reset all possible time picker views to be hidden in order to only show one of them later
|
||||||
|
mCreateTimerView.setVisibility(GONE);
|
||||||
|
mCreateTimerSpinnerView.setVisibility(GONE);
|
||||||
|
|
||||||
// Record the fact that the create view is visible.
|
// Record the fact that the create view is visible.
|
||||||
mCurrentView = mCreateTimerView;
|
mCurrentView = getTimerCreationView();
|
||||||
|
mCurrentView.setVisibility(VISIBLE);
|
||||||
|
|
||||||
// Update the fab and buttons.
|
// Update the fab and buttons.
|
||||||
updateFab(updateTypes);
|
updateFab(updateTypes);
|
||||||
|
@ -342,6 +380,7 @@ public final class TimerFragment extends DeskClockFragment {
|
||||||
// Show the timer view; hide the creation view.
|
// Show the timer view; hide the creation view.
|
||||||
mTimersView.setVisibility(VISIBLE);
|
mTimersView.setVisibility(VISIBLE);
|
||||||
mCreateTimerView.setVisibility(GONE);
|
mCreateTimerView.setVisibility(GONE);
|
||||||
|
mCreateTimerSpinnerView.setVisibility(GONE);
|
||||||
|
|
||||||
// Record the fact that the create view is visible.
|
// Record the fact that the create view is visible.
|
||||||
mCurrentView = mTimersView;
|
mCurrentView = mTimersView;
|
||||||
|
@ -366,7 +405,7 @@ public final class TimerFragment extends DeskClockFragment {
|
||||||
if (toTimers) {
|
if (toTimers) {
|
||||||
mTimersView.setVisibility(VISIBLE);
|
mTimersView.setVisibility(VISIBLE);
|
||||||
} else {
|
} else {
|
||||||
mCreateTimerView.setVisibility(VISIBLE);
|
getTimerCreationView().setVisibility(VISIBLE);
|
||||||
}
|
}
|
||||||
// Avoid double-taps by enabling/disabling the set of buttons active on the new view.
|
// Avoid double-taps by enabling/disabling the set of buttons active on the new view.
|
||||||
updateFab(BUTTONS_DISABLE);
|
updateFab(BUTTONS_DISABLE);
|
||||||
|
@ -415,6 +454,7 @@ public final class TimerFragment extends DeskClockFragment {
|
||||||
|
|
||||||
// Reset the state of the create view.
|
// Reset the state of the create view.
|
||||||
mCreateTimerView.reset();
|
mCreateTimerView.reset();
|
||||||
|
mCreateTimerSpinnerView.reset();
|
||||||
} else {
|
} else {
|
||||||
showCreateTimerView(FAB_AND_BUTTONS_EXPAND);
|
showCreateTimerView(FAB_AND_BUTTONS_EXPAND);
|
||||||
}
|
}
|
||||||
|
@ -437,8 +477,10 @@ public final class TimerFragment extends DeskClockFragment {
|
||||||
super.onAnimationEnd(animation);
|
super.onAnimationEnd(animation);
|
||||||
mTimersView.setTranslationY(0f);
|
mTimersView.setTranslationY(0f);
|
||||||
mCreateTimerView.setTranslationY(0f);
|
mCreateTimerView.setTranslationY(0f);
|
||||||
|
mCreateTimerSpinnerView.setTranslationY(0f);
|
||||||
mTimersView.setAlpha(1f);
|
mTimersView.setAlpha(1f);
|
||||||
mCreateTimerView.setAlpha(1f);
|
mCreateTimerView.setAlpha(1f);
|
||||||
|
mCreateTimerSpinnerView.setAlpha(1f);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -543,7 +585,7 @@ public final class TimerFragment extends DeskClockFragment {
|
||||||
updateFab(FAB_AND_BUTTONS_IMMEDIATE);
|
updateFab(FAB_AND_BUTTONS_IMMEDIATE);
|
||||||
|
|
||||||
if (mCurrentView == mTimersView && mAdapter.getItemCount() == 0) {
|
if (mCurrentView == mTimersView && mAdapter.getItemCount() == 0) {
|
||||||
animateToView(mCreateTimerView, true);
|
animateToView(getTimerCreationView(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Required to adjust the layout for tablets that use either a GridLayoutManager or a LinearLayoutManager.
|
// Required to adjust the layout for tablets that use either a GridLayoutManager or a LinearLayoutManager.
|
||||||
|
|
|
@ -29,4 +29,11 @@
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent" />
|
android:layout_height="match_parent" />
|
||||||
|
|
||||||
|
<com.best.deskclock.timer.CustomTimerSpinnerSetupView
|
||||||
|
android:id="@+id/timer_spinner_setup"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:visibility="gone" />
|
||||||
|
|
||||||
</FrameLayout>
|
</FrameLayout>
|
91
app/src/main/res/layout/timer_spinner_setup_view.xml
Normal file
91
app/src/main/res/layout/timer_spinner_setup_view.xml
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
Copyright (C) 2011 The Android Open Source Project
|
||||||
|
modified
|
||||||
|
SPDX-License-Identifier: Apache-2.0 AND GPL-3.0-only
|
||||||
|
-->
|
||||||
|
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:id="@+id/durationPickerLayout"
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:gravity="center_horizontal"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:paddingHorizontal="8dp"
|
||||||
|
android:paddingTop="20dp">
|
||||||
|
|
||||||
|
<!-- hour -->
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:text="@string/label_hours"
|
||||||
|
android:textColor="?attr/colorPrimary" />
|
||||||
|
|
||||||
|
<NumberPicker
|
||||||
|
android:id="@+id/hour"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginVertical="8dp"
|
||||||
|
android:focusable="true"
|
||||||
|
android:focusableInTouchMode="true"
|
||||||
|
android:theme="@style/NumberPickerStyle" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- minute -->
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginHorizontal="14dp"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:text="@string/label_minutes"
|
||||||
|
android:textColor="?attr/colorPrimary" />
|
||||||
|
|
||||||
|
<NumberPicker
|
||||||
|
android:id="@+id/minute"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginVertical="8dp"
|
||||||
|
android:focusable="true"
|
||||||
|
android:focusableInTouchMode="true"
|
||||||
|
android:theme="@style/NumberPickerStyle" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<!-- second -->
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center"
|
||||||
|
android:text="@string/label_seconds"
|
||||||
|
android:textColor="?attr/colorPrimary" />
|
||||||
|
|
||||||
|
<NumberPicker
|
||||||
|
android:id="@+id/second"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_marginVertical="8dp"
|
||||||
|
android:focusable="true"
|
||||||
|
android:focusableInTouchMode="true"
|
||||||
|
android:theme="@style/NumberPickerStyle" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
|
@ -407,6 +407,18 @@
|
||||||
<item>spinner</item>
|
<item>spinner</item>
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
|
<!-- Entries listed in the ListPreference when invoking the timer creation view style preference. -->
|
||||||
|
<string-array name="timer_creation_view_style_entries">
|
||||||
|
<item>@string/timer_creation_view_style_keypad</item>
|
||||||
|
<item>@string/clock_style_spinner</item>
|
||||||
|
</string-array>
|
||||||
|
<!-- Values that are retrieved from the ListPreference. These must match the
|
||||||
|
timer_creation_view_style_entries above. -->
|
||||||
|
<string-array name="timer_creation_view_style_values" translatable="false">
|
||||||
|
<item>keypad</item>
|
||||||
|
<item>spinner</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
<!-- Entries listed in the ListPreference when invoking the timer sort preference -->
|
<!-- Entries listed in the ListPreference when invoking the timer sort preference -->
|
||||||
<string-array name="sort_timer_entries">
|
<string-array name="sort_timer_entries">
|
||||||
<item>@string/sort_timer_manually</item>
|
<item>@string/sort_timer_manually</item>
|
||||||
|
|
|
@ -1112,6 +1112,10 @@
|
||||||
<string name="timer_settings">Timers</string>
|
<string name="timer_settings">Timers</string>
|
||||||
<!-- Timer preference summary in the settings -->
|
<!-- Timer preference summary in the settings -->
|
||||||
<string name="timer_settings_summary">Set default ringtone, volume and timer sorting</string>
|
<string name="timer_settings_summary">Set default ringtone, volume and timer sorting</string>
|
||||||
|
<!-- Title for setting the timer creation view style -->
|
||||||
|
<string name="timer_creation_view_style_title">Timer creation view style</string>
|
||||||
|
<!-- Keypad style when creating timer -->
|
||||||
|
<string name="timer_creation_view_style_keypad">Keypad</string>
|
||||||
<!-- Description for timer vibration. -->
|
<!-- Description for timer vibration. -->
|
||||||
<string name="timer_vibrate_title">Timer vibrate</string>
|
<string name="timer_vibrate_title">Timer vibrate</string>
|
||||||
<!-- Setting title to reset expired timers with volume buttons. -->
|
<!-- Setting title to reset expired timers with volume buttons. -->
|
||||||
|
|
|
@ -14,6 +14,16 @@
|
||||||
app:iconSpaceReserved="false"
|
app:iconSpaceReserved="false"
|
||||||
tools:layout="@layout/settings_preference_category_layout">
|
tools:layout="@layout/settings_preference_category_layout">
|
||||||
|
|
||||||
|
<ListPreference
|
||||||
|
android:key="key_timer_creation_view_style"
|
||||||
|
android:title="@string/timer_creation_view_style_title"
|
||||||
|
android:entries="@array/timer_creation_view_style_entries"
|
||||||
|
android:entryValues="@array/timer_creation_view_style_values"
|
||||||
|
android:defaultValue="keypad"
|
||||||
|
app:iconSpaceReserved="false"
|
||||||
|
app:singleLineTitle="false"
|
||||||
|
tools:layout="@layout/settings_preference_layout" />
|
||||||
|
|
||||||
<SwitchPreferenceCompat
|
<SwitchPreferenceCompat
|
||||||
android:key="key_transparent_background_for_expired_timer"
|
android:key="key_transparent_background_for_expired_timer"
|
||||||
android:title="@string/transparent_background_for_expired_timer_title"
|
android:title="@string/transparent_background_for_expired_timer_title"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue