/** * This file is part of Privacy Friendly Interval Timer. * Privacy Friendly Interval Timer is free software: * you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation, * either version 3 of the License, or any later version. * Privacy Friendly Interval Timer is distributed in the hope * that it will be useful, but WITHOUT ANY WARRANTY; without even * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with Privacy Friendly Interval Timer. If not, see <http://www.gnu.org/licenses/>. */ package org.secuso.privacyfriendlyintervaltimer.preferences; import android.content.Context; import android.content.res.TypedArray; import android.os.Build; import android.preference.DialogPreference; import android.text.format.DateFormat; import android.util.AttributeSet; import android.view.View; import android.widget.TimePicker; import org.secuso.privacyfriendlyintervaltimer.R; import org.secuso.privacyfriendlyintervaltimer.helpers.NotificationHelper; import java.util.Calendar; /** * TimePreferences can be used as preference dialog to allow user to pick a time in hour:minute * format. The value is stored as timestamp in milliseconds in preferences and can be easily converted * in a @{see Calender} object. * * @author Tobias Neidig * @version 20160722 */ public class TimePreference extends DialogPreference { private Calendar calendar; private TimePicker picker = null; public TimePreference(Context ctxt) { this(ctxt, null); } public TimePreference(Context context, AttributeSet attrs) { this(context, attrs, android.R.attr.dialogPreferenceStyle); } public TimePreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setPositiveButtonText(R.string.set); setNegativeButtonText(android.R.string.cancel); calendar = Calendar.getInstance(context.getResources().getConfiguration().locale); } @Override protected View onCreateDialogView() { picker = new TimePicker(getContext()); return picker; } @Override protected void onBindDialogView(View v) { super.onBindDialogView(v); setHour(picker, calendar.get(Calendar.HOUR_OF_DAY)); setMinute(picker, calendar.get(Calendar.MINUTE)); picker.setIs24HourView(DateFormat.is24HourFormat(getContext())); } @Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); if (positiveResult) { calendar.set(Calendar.HOUR_OF_DAY, getHour(picker)); calendar.set(Calendar.MINUTE, getMinute(picker)); setSummary(getSummary()); if (callChangeListener(calendar.getTimeInMillis())) { persistLong(calendar.getTimeInMillis()); notifyChanged(); } if(NotificationHelper.isMotivationAlertEnabled(getContext())){ NotificationHelper.setMotivationAlert(getContext()); } } } @Override protected Object onGetDefaultValue(TypedArray a, int index) { return a.getString(index); } @Override protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { if (defaultValue == null) { calendar.setTimeInMillis(getPersistedLong(System.currentTimeMillis())); } else if (restoreValue) { calendar.setTimeInMillis(Long.parseLong(getPersistedString((String) defaultValue))); } else { calendar.setTimeInMillis(Long.parseLong((String) defaultValue)); } setSummary(getSummary()); } @Override public CharSequence getSummary() { if (calendar == null) { return null; } return DateFormat.getTimeFormat(getContext()).format(calendar.getTime()); } protected void setHour(TimePicker timePicker, int hour) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { timePicker.setHour(hour); } else { timePicker.setCurrentHour(hour); } } protected void setMinute(TimePicker timePicker, int minute) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { timePicker.setMinute(minute); } else { timePicker.setCurrentMinute(minute); } } protected int getHour(TimePicker timePicker) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return timePicker.getHour(); } else { return timePicker.getCurrentHour(); } } protected int getMinute(TimePicker timePicker) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return timePicker.getMinute(); } else { return timePicker.getCurrentMinute(); } } }