First commit
This commit is contained in:
280
src/de/schatenseite/android/datepreference/DatePreference.java
Normal file
280
src/de/schatenseite/android/datepreference/DatePreference.java
Normal file
@ -0,0 +1,280 @@
|
||||
package de.schatenseite.android.datepreference;
|
||||
|
||||
/* based on https://github.com/bostonandroid/DatePreference */
|
||||
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.res.TypedArray;
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.preference.DialogPreference;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.DatePicker;
|
||||
|
||||
public class DatePreference extends DialogPreference implements
|
||||
DatePicker.OnDateChangedListener {
|
||||
private String dateString;
|
||||
private String changedValueCanBeNull;
|
||||
private DatePicker datePicker;
|
||||
|
||||
public DatePreference(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
}
|
||||
|
||||
public DatePreference(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Produces a DatePicker set to the date produced by {@link #getDate()}.
|
||||
* When overriding be sure to call the super.
|
||||
*
|
||||
* @return a DatePicker with the date set
|
||||
*/
|
||||
@Override
|
||||
protected View onCreateDialogView() {
|
||||
this.datePicker = new DatePicker(getContext());
|
||||
Calendar calendar = getDate();
|
||||
datePicker.init(calendar.get(Calendar.YEAR),
|
||||
calendar.get(Calendar.MONTH),
|
||||
calendar.get(Calendar.DAY_OF_MONTH), this);
|
||||
return datePicker;
|
||||
}
|
||||
|
||||
/**
|
||||
* Produces the date used for the date picker. If the user has not selected
|
||||
* a date, produces the default from the XML's android:defaultValue. If the
|
||||
* default is not set in the XML or if the XML's default is invalid it uses
|
||||
* the value produced by {@link #defaultCalendar()}.
|
||||
*
|
||||
* @return the Calendar for the date picker
|
||||
*/
|
||||
public Calendar getDate() {
|
||||
try {
|
||||
Date date = formatter().parse(defaultValue());
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.setTime(date);
|
||||
return cal;
|
||||
} catch (java.text.ParseException e) {
|
||||
return defaultCalendar();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the selected date to the specified string.
|
||||
*
|
||||
* @param dateString
|
||||
* The date, represented as a string, in the format specified by
|
||||
* {@link #formatter()}.
|
||||
*/
|
||||
public void setDate(String dateString) {
|
||||
this.dateString = dateString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Produces the date formatter used for dates in the XML. The default is
|
||||
* yyyy.MM.dd. Override this to change that.
|
||||
*
|
||||
* @return the SimpleDateFormat used for XML dates
|
||||
*/
|
||||
public static SimpleDateFormat formatter() {
|
||||
return new SimpleDateFormat("yyyy.MM.dd");
|
||||
}
|
||||
|
||||
/**
|
||||
* Produces the date formatter used for showing the date in the summary. The
|
||||
* default is MMMM dd, yyyy. Override this to change it.
|
||||
*
|
||||
* @return the SimpleDateFormat used for summary dates
|
||||
*/
|
||||
public static SimpleDateFormat summaryFormatter() {
|
||||
return new SimpleDateFormat("dd. MMMM yyyy");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object onGetDefaultValue(TypedArray a, int index) {
|
||||
return a.getString(index);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the date picker is shown or restored. If it's a restore it
|
||||
* gets the persisted value, otherwise it persists the value.
|
||||
*/
|
||||
@Override
|
||||
protected void onSetInitialValue(boolean restoreValue, Object def) {
|
||||
if (restoreValue) {
|
||||
this.dateString = getPersistedString(defaultValue());
|
||||
setTheDate(this.dateString);
|
||||
} else {
|
||||
boolean wasNull = this.dateString == null;
|
||||
setDate((String) def);
|
||||
if (!wasNull)
|
||||
persistDate(this.dateString);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when Android pauses the activity.
|
||||
*/
|
||||
@Override
|
||||
protected Parcelable onSaveInstanceState() {
|
||||
if (isPersistent())
|
||||
return super.onSaveInstanceState();
|
||||
else
|
||||
return new SavedState(super.onSaveInstanceState());
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when Android restores the activity.
|
||||
*/
|
||||
@Override
|
||||
protected void onRestoreInstanceState(Parcelable state) {
|
||||
if (state == null || !state.getClass().equals(SavedState.class)) {
|
||||
super.onRestoreInstanceState(state);
|
||||
setTheDate(((SavedState) state).dateValue);
|
||||
} else {
|
||||
SavedState s = (SavedState) state;
|
||||
super.onRestoreInstanceState(s.getSuperState());
|
||||
setTheDate(s.dateValue);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the user changes the date.
|
||||
*/
|
||||
public void onDateChanged(DatePicker view, int year, int month, int day) {
|
||||
Calendar selected = new GregorianCalendar(year, month, day);
|
||||
this.changedValueCanBeNull = formatter().format(selected.getTime());
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the dialog is closed. If the close was by pressing "OK" it
|
||||
* saves the value.
|
||||
*/
|
||||
@Override
|
||||
protected void onDialogClosed(boolean shouldSave) {
|
||||
if (shouldSave && this.changedValueCanBeNull != null) {
|
||||
setTheDate(this.changedValueCanBeNull);
|
||||
this.changedValueCanBeNull = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void setTheDate(String s) {
|
||||
setDate(s);
|
||||
persistDate(s);
|
||||
}
|
||||
|
||||
public String getSummaryString() {
|
||||
return summaryFormatter().format(getDate().getTime());
|
||||
}
|
||||
|
||||
private void persistDate(String s) {
|
||||
persistString(s);
|
||||
//setSummary(summaryFormatter().format(getDate().getTime()));
|
||||
}
|
||||
|
||||
/**
|
||||
* The default date to use when the XML does not set it or the XML has an
|
||||
* error.
|
||||
*
|
||||
* @return the Calendar set to the default date
|
||||
*/
|
||||
public static Calendar defaultCalendar() {
|
||||
return new GregorianCalendar();
|
||||
}
|
||||
|
||||
/**
|
||||
* The defaultCalendar() as a string using the {@link #formatter()}.
|
||||
*
|
||||
* @return a String representation of the default date
|
||||
*/
|
||||
public static String defaultCalendarString() {
|
||||
return formatter().format(defaultCalendar().getTime());
|
||||
}
|
||||
|
||||
private String defaultValue() {
|
||||
if (this.dateString == null)
|
||||
setDate(defaultCalendarString());
|
||||
return this.dateString;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called whenever the user clicks on a button. Invokes
|
||||
* {@link #onDateChanged(DatePicker, int, int, int)} and
|
||||
* {@link #onDialogClosed(boolean)}. Be sure to call the super when
|
||||
* overriding.
|
||||
*/
|
||||
@Override
|
||||
public void onClick(DialogInterface dialog, int which) {
|
||||
super.onClick(dialog, which);
|
||||
datePicker.clearFocus();
|
||||
onDateChanged(datePicker, datePicker.getYear(), datePicker.getMonth(),
|
||||
datePicker.getDayOfMonth());
|
||||
onDialogClosed(which == DialogInterface.BUTTON1); // OK?
|
||||
}
|
||||
|
||||
/**
|
||||
* Produces the date the user has selected for the given preference, as a
|
||||
* calendar.
|
||||
*
|
||||
* @param preferences
|
||||
* the SharedPreferences to get the date from
|
||||
* @param field
|
||||
* the name of the preference to get the date from
|
||||
* @return a Calendar that the user has selected
|
||||
*/
|
||||
public static Calendar getDateFor(SharedPreferences preferences,
|
||||
String field) {
|
||||
Date date = stringToDate(preferences.getString(field,
|
||||
defaultCalendarString()));
|
||||
Calendar cal = Calendar.getInstance();
|
||||
cal.setTime(date);
|
||||
return cal;
|
||||
}
|
||||
|
||||
private static Date stringToDate(String dateString) {
|
||||
try {
|
||||
return formatter().parse(dateString);
|
||||
} catch (ParseException e) {
|
||||
return defaultCalendar().getTime();
|
||||
}
|
||||
}
|
||||
|
||||
private static class SavedState extends BaseSavedState {
|
||||
String dateValue;
|
||||
|
||||
public SavedState(Parcel p) {
|
||||
super(p);
|
||||
dateValue = p.readString();
|
||||
}
|
||||
|
||||
public SavedState(Parcelable p) {
|
||||
super(p);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void writeToParcel(Parcel out, int flags) {
|
||||
super.writeToParcel(out, flags);
|
||||
out.writeString(dateValue);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {
|
||||
public SavedState createFromParcel(Parcel in) {
|
||||
return new SavedState(in);
|
||||
}
|
||||
|
||||
public SavedState[] newArray(int size) {
|
||||
return new SavedState[size];
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
103
src/de/schatenseite/android/waldemar/WaldemarPreferences.java
Normal file
103
src/de/schatenseite/android/waldemar/WaldemarPreferences.java
Normal file
@ -0,0 +1,103 @@
|
||||
package de.schatenseite.android.waldemar;
|
||||
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.preference.EditTextPreference;
|
||||
import android.preference.ListPreference;
|
||||
import android.preference.Preference;
|
||||
import android.preference.PreferenceActivity;
|
||||
import android.preference.PreferenceManager;
|
||||
import de.schatenseite.android.datepreference.DatePreference;
|
||||
|
||||
public class WaldemarPreferences extends PreferenceActivity {
|
||||
int widgetId;
|
||||
public void enableDisablePreferences(String val) {
|
||||
EditTextPreference pref_name = (EditTextPreference)findPreference("pref_name");
|
||||
ListPreference pref_mode = (ListPreference)findPreference("pref_mode");
|
||||
EditTextPreference pref_duration = (EditTextPreference)findPreference("pref_duration");
|
||||
DatePreference pref_dateStart = (DatePreference)findPreference("pref_dateStart");
|
||||
DatePreference pref_dateThen = (DatePreference)findPreference("pref_dateThen");
|
||||
|
||||
pref_name.setSummary(pref_name.getText());
|
||||
|
||||
int index = pref_mode.findIndexOfValue(val);
|
||||
if (index == 0) {
|
||||
pref_mode.setSummary(R.string.mode1);
|
||||
pref_duration.setEnabled(false);
|
||||
pref_duration.setSummary(R.string.duration_summary);
|
||||
pref_dateStart.setEnabled(false);
|
||||
pref_dateStart.setSummary(R.string.dateStart_summary);
|
||||
pref_dateThen.setEnabled(true);
|
||||
pref_dateThen.setSummary(pref_dateThen.getSummaryString());
|
||||
} else if (index == 1) {
|
||||
pref_mode.setSummary(R.string.mode2);
|
||||
pref_duration.setEnabled(false);
|
||||
pref_duration.setSummary(R.string.duration_summary);
|
||||
pref_dateStart.setEnabled(true);
|
||||
pref_dateStart.setSummary(pref_dateStart.getSummaryString());
|
||||
pref_dateThen.setEnabled(true);
|
||||
pref_dateThen.setSummary(pref_dateThen.getSummaryString());
|
||||
} else if (index == 2) {
|
||||
pref_mode.setSummary(R.string.mode3);
|
||||
pref_duration.setEnabled(true);
|
||||
pref_duration.setSummary(pref_duration.getText()+" "+getApplicationContext().getString(R.string.days));
|
||||
pref_dateStart.setEnabled(false);
|
||||
pref_dateStart.setSummary(R.string.dateStart_summary);
|
||||
pref_dateThen.setEnabled(true);
|
||||
pref_dateThen.setSummary(pref_dateThen.getSummaryString());
|
||||
} else if (index == 3) {
|
||||
pref_mode.setSummary(R.string.mode4);
|
||||
pref_duration.setEnabled(true);
|
||||
pref_duration.setSummary(pref_duration.getText()+" "+getApplicationContext().getString(R.string.days));
|
||||
pref_dateStart.setEnabled(true);
|
||||
pref_dateStart.setSummary(pref_dateStart.getSummaryString());
|
||||
pref_dateThen.setEnabled(false);
|
||||
pref_dateThen.setSummary(R.string.dateThen_summary);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
|
||||
addPreferencesFromResource(R.xml.preferences);
|
||||
|
||||
Intent intent=getIntent();
|
||||
Bundle extras=intent.getExtras();
|
||||
if (extras != null) {
|
||||
widgetId=extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
|
||||
}
|
||||
|
||||
final EditTextPreference pref_name = (EditTextPreference)findPreference("pref_name");
|
||||
final ListPreference pref_mode = (ListPreference)findPreference("pref_mode");
|
||||
|
||||
String val = pref_mode.getValue();
|
||||
enableDisablePreferences(val);
|
||||
|
||||
pref_name.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
pref_name.setSummary((CharSequence)newValue);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
pref_mode.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
|
||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||
final String val = newValue.toString();
|
||||
enableDisablePreferences(val);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
// this is the intent broadcast/returned to the widget
|
||||
Intent updateIntent = new Intent(this, WaldemarWidget.class);
|
||||
updateIntent.setAction("PreferencesUpdated");
|
||||
updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
|
||||
setResult(RESULT_OK, updateIntent);
|
||||
sendBroadcast(updateIntent);
|
||||
finish();
|
||||
}
|
||||
}
|
111
src/de/schatenseite/android/waldemar/WaldemarWidget.java
Normal file
111
src/de/schatenseite/android/waldemar/WaldemarWidget.java
Normal file
@ -0,0 +1,111 @@
|
||||
package de.schatenseite.android.waldemar;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
import java.util.Locale;
|
||||
|
||||
import android.app.AlarmManager;
|
||||
import android.app.PendingIntent;
|
||||
import android.appwidget.AppWidgetManager;
|
||||
import android.appwidget.AppWidgetProvider;
|
||||
import android.content.ComponentName;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Bundle;
|
||||
import android.preference.PreferenceManager;
|
||||
import android.widget.RemoteViews;
|
||||
import android.widget.Toast;
|
||||
import de.schatenseite.android.datepreference.DatePreference;
|
||||
|
||||
public class WaldemarWidget extends AppWidgetProvider {
|
||||
public static String MIDNIGHTLY_WIDGET_UPDATE = "MIDNIGHTLY_WIDGET_UPDATE";
|
||||
static AlarmManager myAlarmManager;
|
||||
static PendingIntent myPendingIntent;
|
||||
|
||||
@Override
|
||||
public void onEnabled(Context context) {
|
||||
Intent intent = new Intent(
|
||||
WaldemarWidget.MIDNIGHTLY_WIDGET_UPDATE);
|
||||
PendingIntent pendingIntent = PendingIntent.getBroadcast(
|
||||
context, 0, intent, 0);
|
||||
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
|
||||
Calendar calendar = new GregorianCalendar();
|
||||
calendar.set(Calendar.HOUR_OF_DAY, 0);
|
||||
calendar.set(Calendar.MINUTE, 0);
|
||||
calendar.set(Calendar.SECOND, 0);
|
||||
|
||||
alarmManager.setRepeating(AlarmManager.RTC,
|
||||
calendar.getTimeInMillis(), AlarmManager.INTERVAL_FIFTEEN_MINUTES, pendingIntent);
|
||||
|
||||
WaldemarWidget.SaveAlarmManager(alarmManager, pendingIntent);
|
||||
Toast.makeText(context, "onEnabled()", Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisabled(Context context) {
|
||||
myAlarmManager.cancel(myPendingIntent);
|
||||
Toast.makeText(context, "onDisabled()", Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
if (MIDNIGHTLY_WIDGET_UPDATE.equals(intent.getAction()) || "PreferencesUpdated".equals(intent.getAction())) {
|
||||
Bundle extras = intent.getExtras();
|
||||
if (extras != null) {
|
||||
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
|
||||
ComponentName thisAppWidget = new ComponentName(
|
||||
context.getPackageName(),
|
||||
WaldemarWidget.class.getName());
|
||||
int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget);
|
||||
|
||||
onUpdate(context, appWidgetManager, appWidgetIds);
|
||||
}
|
||||
} else {
|
||||
super.onReceive(context, intent);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
|
||||
int[] appWidgetIds) {
|
||||
for (int appWidgetId : appWidgetIds) {
|
||||
updateAppWidget(context, appWidgetManager, appWidgetId);
|
||||
}
|
||||
}
|
||||
|
||||
public static void updateAppWidget(Context context,
|
||||
AppWidgetManager appWidgetManager, int appWidgetId) {
|
||||
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
|
||||
|
||||
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
|
||||
remoteViews.setTextViewText(R.id.name, prefs.getString("pref_name", context.getString(R.string.title)));
|
||||
|
||||
Calendar calNow = new GregorianCalendar();
|
||||
calNow.set(Calendar.HOUR_OF_DAY, 0);
|
||||
calNow.set(Calendar.MINUTE, 0);
|
||||
calNow.set(Calendar.SECOND, 0);
|
||||
long timeNow = calNow.getTimeInMillis();
|
||||
|
||||
Calendar calThen = DatePreference.getDateFor(PreferenceManager.getDefaultSharedPreferences(context), "pref_dateThen");
|
||||
long timeThen = calThen.getTimeInMillis();
|
||||
|
||||
long days = Math.round((double) (timeThen - timeNow) / 86400000.);
|
||||
remoteViews.setTextViewText(R.id.daycount, String.valueOf(days));
|
||||
|
||||
DateFormat format = SimpleDateFormat.getTimeInstance(
|
||||
SimpleDateFormat.MEDIUM, Locale.getDefault());
|
||||
remoteViews.setTextViewText(R.id.debug, format.format(new Date()));
|
||||
|
||||
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
|
||||
}
|
||||
|
||||
static void SaveAlarmManager(AlarmManager tAlarmManager,
|
||||
PendingIntent tPendingIntent) {
|
||||
myAlarmManager = tAlarmManager;
|
||||
myPendingIntent = tPendingIntent;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user