Skip to content

Commit

Permalink
6_1_0-timob-8430 Android: fix google issue with am/pm
Browse files Browse the repository at this point in the history
  • Loading branch information
fmerzadyan committed May 18, 2017
1 parent 97f389d commit c624957
Show file tree
Hide file tree
Showing 3 changed files with 135 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
import android.widget.TimePicker;

@Kroll.proxy(creatableInModule=UIModule.class, propertyAccessors={
"locale", TiC.PROPERTY_SELECTION_OPENS, "visibleItems", "value", TiC.PROPERTY_CALENDAR_VIEW_SHOWN, TiC.PROPERTY_FONT
TiC.PROPERTY_LOCALE, TiC.PROPERTY_SELECTION_OPENS, TiC.PROPERTY_VISIBLE_ITEMS, TiC.PROPERTY_VALUE, TiC.PROPERTY_CALENDAR_VIEW_SHOWN, TiC.PROPERTY_FONT
})
public class PickerProxy extends TiViewProxy implements PickerColumnListener
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,33 +6,38 @@
*/
package ti.modules.titanium.ui.widget.picker;

import java.util.Calendar;
import java.util.Date;

import android.app.Activity;
import android.os.Build;
import android.os.Handler;
import android.view.View;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;
import org.appcelerator.kroll.KrollDict;
import org.appcelerator.kroll.KrollProxy;
import org.appcelerator.kroll.common.Log;
import org.appcelerator.titanium.TiC;
import org.appcelerator.titanium.proxy.TiViewProxy;
import org.appcelerator.titanium.util.TiConvert;
import org.appcelerator.titanium.util.TiRHelper;
import org.appcelerator.titanium.util.TiUIHelper;
import org.appcelerator.titanium.util.TiRHelper.ResourceNotFoundException;
import org.appcelerator.titanium.util.TiUIHelper;
import org.appcelerator.titanium.view.TiUIView;

import android.app.Activity;
import android.os.Build;
import android.widget.TimePicker;
import android.widget.TimePicker.OnTimeChangedListener;
import java.util.Calendar;
import java.util.Date;

public class TiUITimePicker extends TiUIView
implements OnTimeChangedListener
{
public class TiUITimePicker extends TiUIView implements OnTimeChangedListener {
private static final String TAG = "TiUITimePicker";
private boolean suppressChangeEvent = false;

protected Date minDate, maxDate;
protected int minuteInterval;

private int lastSelectedHour = 0;
private int lastSelectMin = 0;

private Handler timeChangeHandler;
private Runnable timeChangeRunnable;

public TiUITimePicker(TiViewProxy proxy)
{
super(proxy);
Expand Down Expand Up @@ -74,6 +79,25 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto
}
picker.setIs24HourView(false);
picker.setOnTimeChangedListener(this);
picker.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
@Override
public void onViewAttachedToWindow(View v) {
timeChangeHandler = new Handler();
timeChangeRunnable = new Runnable() {
@Override
public void run() {
detectTimeChange();
timeChangeHandler.postDelayed(this, 500);
}
};
timeChangeHandler.postDelayed(timeChangeRunnable, 500);
}

@Override
public void onViewDetachedFromWindow(View v) {
timeChangeHandler.removeCallbacks(timeChangeRunnable);
}
});
setNativeView(picker);
}

Expand All @@ -85,34 +109,34 @@ public void processProperties(KrollDict d) {
Calendar calendar = Calendar.getInstance();

TimePicker picker = (TimePicker) getNativeView();
if (d.containsKey("value")) {
calendar.setTime((Date)d.get("value"));
if (d.containsKey(TiC.PROPERTY_VALUE)) {
calendar.setTime((Date)d.get(TiC.PROPERTY_VALUE));
valueExistsInProxy = true;
}
if (d.containsKey("minDate")) {
this.minDate = (Date) d.get("minDate");
if (d.containsKey(TiC.PROPERTY_MIN_DATE)) {
this.minDate = (Date) d.get(TiC.PROPERTY_MIN_DATE);
}
if (d.containsKey("maxDate")) {
this.maxDate = (Date) d.get("maxDate");
if (d.containsKey(TiC.PROPERTY_MAX_DATE)) {
this.maxDate = (Date) d.get(TiC.PROPERTY_MAX_DATE);
}
if (d.containsKey("minuteInterval")) {
int mi = d.getInt("minuteInterval");
if (d.containsKey(TiC.PROPERTY_MINUTE_INTERVAL)) {
int mi = d.getInt(TiC.PROPERTY_MINUTE_INTERVAL);
if (mi >= 1 && mi <= 30 && mi % 60 == 0) {
this.minuteInterval = mi;
}
}

// Undocumented but maybe useful for Android
boolean is24HourFormat = false;
if (d.containsKey("format24")) {
is24HourFormat = d.getBoolean("format24");
if (d.containsKey(TiC.PROPERTY_FORMAT_24)) {
is24HourFormat = d.getBoolean(TiC.PROPERTY_FORMAT_24);
}
picker.setIs24HourView(is24HourFormat);

setValue(calendar.getTimeInMillis() , true);
setValue(calendar.getTimeInMillis());

if (!valueExistsInProxy) {
proxy.setProperty("value", calendar.getTime());
proxy.setProperty(TiC.PROPERTY_VALUE, calendar.getTime());
}

//iPhone ignores both values if max <= min
Expand All @@ -129,46 +153,96 @@ public void processProperties(KrollDict d) {
public void propertyChanged(String key, Object oldValue, Object newValue,
KrollProxy proxy)
{
if (key.equals("value")) {
Date date = (Date)newValue;
if (key.equals(TiC.PROPERTY_VALUE)) {
Date date = (Date) newValue;
setValue(date.getTime());
} else if (key.equals("format24")) {
((TimePicker)getNativeView()).setIs24HourView(TiConvert.toBoolean(newValue));
} else if (key.equals(TiC.PROPERTY_FORMAT_24)) {
((TimePicker) getNativeView()).setIs24HourView(TiConvert.toBoolean(newValue));
}
super.propertyChanged(key, oldValue, newValue, proxy);
}

public void setValue(long value)
{
setValue(value, false);
}

public void setValue(long value, boolean suppressEvent)
{
TimePicker picker = (TimePicker) getNativeView();

int currentSelectedHour, currentSelectedMin;
if (Build.VERSION.SDK_INT >= 23) {
currentSelectedHour = ApiLevel23.getHourFrom(picker);
currentSelectedMin = ApiLevel23.getMinuteFrom(picker);
} else {
currentSelectedHour = picker.getCurrentHour();
currentSelectedMin = picker.getCurrentMinute();
}
lastSelectedHour = currentSelectedHour;
lastSelectMin = currentSelectedMin;

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(value);

// This causes two events to fire.
suppressChangeEvent = true;
picker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
suppressChangeEvent = suppressEvent;
picker.setCurrentMinute(calendar.get(Calendar.MINUTE));
suppressChangeEvent = false;
if (Build.VERSION.SDK_INT >= 23) {
ApiLevel23.setHourFor(picker, calendar.get(Calendar.HOUR_OF_DAY));
ApiLevel23.setMinuteFor(picker, calendar.get(Calendar.MINUTE));
} else {
picker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));
picker.setCurrentMinute(calendar.get(Calendar.MINUTE));
}
}

@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute)
{
detectTimeChange();
}

private void detectTimeChange() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
calendar.set(Calendar.MINUTE, minute);
if (!suppressChangeEvent) {
TimePicker picker = (TimePicker) getNativeView();
if (picker == null) {
return;
}

int currentSelectedHour, currentSelectedMin;
if (Build.VERSION.SDK_INT >= 23) {
currentSelectedHour = ApiLevel23.getHourFrom(picker);
currentSelectedMin = ApiLevel23.getMinuteFrom(picker);
} else {
currentSelectedHour = picker.getCurrentHour();
currentSelectedMin = picker.getCurrentMinute();
}

boolean hasChanged = lastSelectedHour != currentSelectedHour || lastSelectMin != currentSelectedMin;
if (hasChanged) {
calendar.set(calendar.HOUR_OF_DAY, currentSelectedHour);
calendar.set(Calendar.MINUTE, currentSelectedMin);
lastSelectedHour = currentSelectedHour;
lastSelectMin = currentSelectedMin;
KrollDict data = new KrollDict();
data.put("value", calendar.getTime());
fireEvent("change", data);
data.put(TiC.PROPERTY_VALUE, calendar.getTime());
proxy.setPropertyAndFire(TiC.PROPERTY_VALUE, calendar.getTime());
fireEvent(TiC.EVENT_CHANGE, data);
}
}

private static class ApiLevel23
{
private ApiLevel23() {}

public static int getHourFrom(TimePicker picker)
{
return picker.getHour();
}

public static void setHourFor(TimePicker picker, int hour) {
picker.setHour(hour);
}

public static int getMinuteFrom(TimePicker picker)
{
return picker.getMinute();
}

public static void setMinuteFor(TimePicker picker, int minute) {
picker.setMinute(minute);
}
// Make sure .value is readable by user
proxy.setProperty("value", calendar.getTime());
}
}
13 changes: 13 additions & 0 deletions android/titanium/src/java/org/appcelerator/titanium/TiC.java
Original file line number Diff line number Diff line change
Expand Up @@ -1455,6 +1455,14 @@ public class TiC
*/
public static final String PROPERTY_FOOTER_VIEW = "footerView";

/**
* @module.api
*/
public static final String PROPERTY_FORMAT_24 = "format24";

/**
* @module.api
*/
public static final String PROPERTY_FORWARD = "forward";

/**
Expand Down Expand Up @@ -1783,6 +1791,11 @@ public class TiC
*/
public static final String PROPERTY_LEVEL = "level";

/**
* @module.api
*/
public static final String PROPERTY_LOCALE = "locale";

/**
* @module.api
*/
Expand Down

0 comments on commit c624957

Please sign in to comment.