platform/android/Rhodes/src/com/rhomobile/rhodes/datetime/DateTimePickerScreen.java in rhodes-2.2.6 vs platform/android/Rhodes/src/com/rhomobile/rhodes/datetime/DateTimePickerScreen.java in rhodes-2.3.0.beta.1
- old
+ new
@@ -18,34 +18,39 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
============================================================================
*/
package com.rhomobile.rhodes.datetime;
+import java.io.IOException;
+import java.io.Serializable;
import java.util.Calendar;
-import java.util.Date;
import java.util.GregorianCalendar;
import com.rhomobile.rhodes.AndroidR;
import com.rhomobile.rhodes.Logger;
-import com.rhomobile.rhodes.RhoActivity;
+import com.rhomobile.rhodes.BaseActivity;
import com.rhomobile.rhodes.RhodesService;
+import android.content.res.Configuration;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TimePicker;
-public class DateTimePickerScreen extends RhoActivity {
+public class DateTimePickerScreen extends BaseActivity {
private static final String TAG = "DateTimePicker";
private static final String INTENT_EXTRA_PREFIX = DateTimePicker.INTENT_EXTRA_PREFIX;
-
+
+ private String _title;
+ private long _initial_time;
+ private long _saved_time;
private String _callback;
- private Date _init;
+ private Calendar _init;
private int _fmt;
private byte[] _opaque;
private DatePicker _datePicker;
private TimePicker _timePicker;
@@ -54,100 +59,328 @@
private static final int FORMAT_DATE_TIME = 0;
private static final int FORMAT_DATE = 1;
private static final int FORMAT_TIME = 2;
+ private long _min_time;
+ private long _max_time;
+ private Calendar _min_Date = null;
+ private Calendar _max_Date = null;
+
+
+ public static String mStateID = "DateTimePickerScreenViewState";
+
+ @SuppressWarnings("serial")
+ public class DateTimePickerScreenViewState extends Object implements Serializable {
+
+ private String title;
+ private long initial_time;
+ private long saved_time;
+ private String callback;
+ private int fmt;
+ private byte[] opaque;
+ private long min_time;
+ private long max_time;
+
+
+
+ private void writeObject(java.io.ObjectOutputStream out) throws IOException {
+ out.writeUTF(callback);
+ out.writeLong(initial_time);
+ out.writeLong(saved_time);
+ out.writeInt(fmt);
+ out.writeUTF(title);
+ out.writeLong(min_time);
+ out.writeLong(max_time);
+ if (opaque != null) {
+ out.writeInt(opaque.length);
+ out.write(opaque);
+ }
+ else {
+ out.writeInt(-1);
+ }
+ }
+
+ private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
+ callback = in.readUTF();
+ initial_time = in.readLong();
+ saved_time = in.readLong();
+ fmt = in.readInt();
+ title = in.readUTF();
+ min_time = in.readLong();
+ max_time = in.readLong();
+ int size = in.readInt();
+ if (size != -1) {
+ opaque = new byte[size];
+ in.read(opaque, 0, size);
+ }
+ else {
+ opaque = null;
+ }
+ }
+
+ public void save(DateTimePickerScreen p) {
+ title = p._title;
+ initial_time = p._initial_time;
+ saved_time = p._saved_time;
+ callback = p._callback;
+ fmt = p._fmt;
+ opaque = p._opaque;
+ min_time = p._min_time;
+ max_time = p._max_time;
+
+ }
+ public void restore(DateTimePickerScreen p) {
+ p._title = title;
+ p._initial_time = initial_time;
+ p._saved_time = saved_time;
+ p._callback = callback;
+ p._fmt = fmt;
+ p._opaque = opaque;
+ p._min_time = min_time;
+ p._max_time = max_time;
+ }
+ }
+
+
+
+
+
+
+
+
+
private OnClickListener mOkListener = new OnClickListener() {
public void onClick(View arg0) {
- _init.setYear(_datePicker.getYear() - 1900);
- _init.setMonth(_datePicker.getMonth());
- _init.setDate(_datePicker.getDayOfMonth());
- _init.setHours(_timePicker.getCurrentHour());
- _init.setMinutes(_timePicker.getCurrentMinute());
+ _init.set(Calendar.YEAR, _datePicker.getYear());
+ _init.set(Calendar.MONTH, _datePicker.getMonth());
+ _init.set(Calendar.DAY_OF_MONTH, _datePicker.getDayOfMonth());
+
+ _init.set(Calendar.HOUR_OF_DAY, _timePicker.getCurrentHour());
+ _init.set(Calendar.MINUTE, _timePicker.getCurrentMinute());
+ _init.set(Calendar.SECOND, 0);
+ _init.set(Calendar.MILLISECOND, 0);
sendResult(_callback, _init, _opaque);
}
};
private OnClickListener mCancelListener = new OnClickListener() {
public void onClick(View v) {
sendResult(_callback, null, _opaque);
}
};
-
- @Override
- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- Logger.D(TAG, "onCreate");
-
- getWindow().setFlags(RhodesService.WINDOW_FLAGS, RhodesService.WINDOW_MASK);
- setContentView(AndroidR.layout.datetime);
-
- Bundle extras = this.getIntent().getExtras();
-
- _callback = extras.getString(INTENT_EXTRA_PREFIX + "callback");
-
- long milliseconds = extras.getLong(INTENT_EXTRA_PREFIX + "init")*((long)1000);
-
- _init = new Date(milliseconds);
+/*
+ private static void convertMillisecondsToDate(long millis, Date date, boolean only_date) {
Calendar c = new GregorianCalendar();
- c.setTimeInMillis(milliseconds);
+ c.setTimeInMillis(millis);
+ //date.setTime(0);
+
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
int hours = c.get(Calendar.HOUR_OF_DAY);
int minutes = c.get(Calendar.MINUTE);
int seconds = c.get(Calendar.SECOND);
- _init.setYear(year);
- _init.setMonth(month);
- _init.setDate(day);
- _init.setHours(hours);
- _init.setMinutes(minutes);
+ date.setYear(year);
+ date.setMonth(month);
+ date.setDate(day);
+ if (only_date) {
+ date.setHours(0);
+ date.setMinutes(0);
+ date.setSeconds(0);
+ }
+ else {
+ date.setHours(hours);
+ date.setMinutes(minutes);
+ date.setSeconds(seconds);
+ }
+ }
+*/
+
+
+
+ private void initialization() {
+ _init = new GregorianCalendar();
+
+ _init.setTimeInMillis(_saved_time);
+ if (_min_time != 0) {
+ _min_Date = new GregorianCalendar();
+ _min_Date.setTimeInMillis(_min_time);
+ _min_Date.set(Calendar.HOUR_OF_DAY, 0);
+ _min_Date.set(Calendar.MINUTE, 0);
+ _min_Date.set(Calendar.SECOND, 0);
+ _min_Date.set(Calendar.MILLISECOND, 0);
+ }
+
+ if (_max_time != 0) {
+ _max_Date = new GregorianCalendar();
+ _max_Date.setTimeInMillis(_max_time);
+ _max_Date.set(Calendar.HOUR_OF_DAY, 0);
+ _max_Date.set(Calendar.MINUTE, 0);
+ _max_Date.set(Calendar.SECOND, 0);
+ _max_Date.set(Calendar.MILLISECOND, 0);
+ }
+ this.setTitle(_title);
- _fmt = extras.getInt(INTENT_EXTRA_PREFIX + "fmt");
- _opaque = extras.getByteArray(INTENT_EXTRA_PREFIX + "opaque");
-
- this.setTitle(extras.getString(INTENT_EXTRA_PREFIX + "title"));
-
_datePicker = (DatePicker)findViewById(AndroidR.id.datePicker);
_timePicker = (TimePicker)findViewById(AndroidR.id.timePicker);
_okButton = (Button)findViewById(AndroidR.id.okButton);
_cancelButton = (Button)findViewById(AndroidR.id.cancelButton);
_okButton.setOnClickListener(mOkListener);
_cancelButton.setOnClickListener(mCancelListener);
- _datePicker.init(year, month, day, null);
- _timePicker.setCurrentHour(hours);
- _timePicker.setCurrentMinute(minutes);
+ _datePicker.init(_init.get(Calendar.YEAR), _init.get(Calendar.MONTH), _init.get(Calendar.DAY_OF_MONTH), new DatePicker.OnDateChangedListener() {
+
+ public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
+ //Logger.D(TAG, "onDateChanged( year="+String.valueOf(year)+", month="+String.valueOf(monthOfYear)+", day="+dayOfMonth);
+ Calendar new_date = new GregorianCalendar();
+ Calendar set_to = null;
+
+ new_date.set(Calendar.YEAR, year);
+ new_date.set(Calendar.MONTH, monthOfYear);
+ new_date.set(Calendar.DAY_OF_MONTH, dayOfMonth);
+ new_date.set(Calendar.HOUR_OF_DAY, 0);
+ new_date.set(Calendar.MINUTE, 0);
+ new_date.set(Calendar.SECOND, 0);
+ new_date.set(Calendar.MILLISECOND, 0);
+
+ //Logger.D(TAG, " new_date: year="+String.valueOf(new_date.getYear())+", month="+String.valueOf(new_date.getMonth())+", day="+new_date.getDay());
+
+ if (_min_time != 0) {
+ //Logger.D(TAG, " min_date: year="+String.valueOf(_min_Date.getYear())+", month="+String.valueOf(_min_Date.getMonth())+", day="+_min_Date.getDay());
+ if (new_date.before(_min_Date)) {
+ set_to = _min_Date;
+ }
+ }
+ if (_max_time != 0) {
+ //Logger.D(TAG, " max_date: year="+String.valueOf(_max_Date.getYear())+", month="+String.valueOf(_max_Date.getMonth())+", day="+_max_Date.getDay());
+ if (new_date.after(_max_Date)) {
+ set_to = _max_Date;
+ }
+ }
+ if (set_to != null) {
+ view.updateDate(set_to.get(Calendar.YEAR), set_to.get(Calendar.MONTH), set_to.get(Calendar.DAY_OF_MONTH));
+ }
+ {
+ Calendar s_date = new GregorianCalendar();
+ s_date.setTimeInMillis(_saved_time);
+ if (set_to != null) {
+ s_date.set(Calendar.YEAR, set_to.get(Calendar.YEAR));
+ s_date.set(Calendar.MONTH, set_to.get(Calendar.MONTH));
+ s_date.set(Calendar.DAY_OF_MONTH, set_to.get(Calendar.DAY_OF_MONTH));
+ }
+ else {
+ s_date.set(Calendar.YEAR, year);
+ s_date.set(Calendar.MONTH, monthOfYear);
+ s_date.set(Calendar.DAY_OF_MONTH, dayOfMonth);
+ }
+ _saved_time = s_date.getTimeInMillis();
+ }
+ }
+ }
+ );
+ _timePicker.setCurrentHour(_init.get(Calendar.HOUR_OF_DAY));
+ _timePicker.setCurrentMinute(_init.get(Calendar.MINUTE));
+ _timePicker.setOnTimeChangedListener( new TimePicker.OnTimeChangedListener() {
+ public void onTimeChanged (TimePicker view, int hourOfDay, int minute) {
+ {
+ Calendar s_date = new GregorianCalendar();
+ s_date.setTimeInMillis(_saved_time);
+ s_date.set(Calendar.HOUR_OF_DAY, hourOfDay);
+ s_date.set(Calendar.MINUTE, minute);
+ s_date.set(Calendar.SECOND, 0);
+ s_date.set(Calendar.MILLISECOND, 0);
+ _saved_time = s_date.getTimeInMillis();
+ }
+ }
+ }
+ );
+
switch (_fmt) {
case FORMAT_DATE:
_timePicker.setVisibility(View.INVISIBLE);
break;
case FORMAT_TIME:
_datePicker.setVisibility(View.INVISIBLE);
break;
case FORMAT_DATE_TIME:
break;
}
+
}
+ @Override
+ public void onCreate(Bundle icicle) {
+ super.onCreate(icicle);
+ Logger.D(TAG, "onCreate");
+
+ getWindow().setFlags(RhodesService.WINDOW_FLAGS, RhodesService.WINDOW_MASK);
+ setContentView(AndroidR.layout.datetime);
+
+ Bundle extras = this.getIntent().getExtras();
+
+ if (extras.containsKey(INTENT_EXTRA_PREFIX + "callback"))
+ _callback = extras.getString(INTENT_EXTRA_PREFIX + "callback");
+
+ if (extras.containsKey(INTENT_EXTRA_PREFIX + "init")) {
+ _initial_time = extras.getLong(INTENT_EXTRA_PREFIX + "init")*((long)1000);
+ _saved_time = _initial_time;
+ }
+
+ if (extras.containsKey(INTENT_EXTRA_PREFIX + "fmt"))
+ _fmt = extras.getInt(INTENT_EXTRA_PREFIX + "fmt");
+ if (extras.containsKey(INTENT_EXTRA_PREFIX + "opaque"))
+ _opaque = extras.getByteArray(INTENT_EXTRA_PREFIX + "opaque");
+
+ if (extras.containsKey(INTENT_EXTRA_PREFIX + "min_time"))
+ _min_time = extras.getLong(INTENT_EXTRA_PREFIX + "min_time")*((long)1000);
+ if (extras.containsKey(INTENT_EXTRA_PREFIX + "max_time"))
+ _max_time = extras.getLong(INTENT_EXTRA_PREFIX + "max_time")*((long)1000);
+
+
+ if (extras.containsKey(INTENT_EXTRA_PREFIX + "title"))
+ _title = extras.getString(INTENT_EXTRA_PREFIX + "title");
+
+ initialization();
+ }
+
private void setFieldsEnabled(boolean v) {
_datePicker.setEnabled(v);
_timePicker.setEnabled(v);
_okButton.setEnabled(v);
_cancelButton.setEnabled(v);
}
- private void sendResult(String callback, Date result, byte[] opaque) {
+ private void sendResult(String callback, Calendar result, byte[] opaque) {
this.setFieldsEnabled(false);
- long res = result == null ? 0 : result.getTime()/((long)1000);
+ long res = result == null ? 0 : result.getTimeInMillis()/((long)1000);
Logger.D(TAG, "Return result: " + res);
DateTimePicker.callback(callback, res, opaque, result == null);
finish();
}
+
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ }
+
+ public void onRestoreInstanceState(Bundle savedInstanceState) {
+ DateTimePickerScreenViewState s = (DateTimePickerScreenViewState)savedInstanceState.getSerializable(mStateID);
+ s.restore(this);
+ initialization();
+ }
+
+ public void onSaveInstanceState(Bundle outState) {
+ DateTimePickerScreenViewState s = new DateTimePickerScreenViewState();
+ s.save(this);
+ outState.putSerializable(mStateID, s);
+ }
+
+
}