NativeView recycled for android

This commit is contained in:
Hristo Hristov
2017-03-28 12:48:19 +03:00
parent 5e555bcfd4
commit f2898f84d5
114 changed files with 1480 additions and 1391 deletions

View File

@ -20,15 +20,14 @@ export function getValidTime(picker: TimePickerDefinition, hour: number, minute:
}
let time = { hour: hour, minute: minute };
if (!isLessThanMaxTime(picker, hour, minute)) {
time = { hour: picker.maxHour, minute: picker.maxMinute };
}
if (!isGreaterThanMinTime(picker, hour, minute)) {
time = { hour: picker.minHour, minute: picker.minMinute };
}
if (!isLessThanMaxTime(picker, hour, minute)) {
time = { hour: picker.maxHour, minute: picker.maxMinute };
}
return time;
}
@ -96,101 +95,41 @@ export abstract class TimePickerBase extends View implements TimePickerDefinitio
public maxMinute: number;
}
export var hourProperty = new Property<TimePickerBase, number>({
name: "hour", defaultValue: 0, valueChanged: (picker, oldValue, newValue) => {
if (!isHourValid(newValue)) {
throw new Error(getErrorMessage(picker, "Hour", newValue));
}
if (isValidTime(picker)) {
// picker._setNativeTime();
if (picker.time) {
picker.time.setHours(picker.hour);
} else {
picker.time = new Date(0, 0, 0, picker.hour, picker.minute);
}
} else {
throw new Error(getErrorMessage(picker, "Hour", newValue));
}
}, valueConverter: (v) => parseInt(v)
});
hourProperty.register(TimePickerBase);
TimePickerBase.prototype.recycleNativeView = true;
export var minHourProperty = new Property<TimePickerBase, number>({
name: "minHour", defaultValue: 0, valueChanged: (picker, oldValue, newValue) => {
if (!isHourValid(newValue)) {
if (!isHourValid(newValue) || !isValidTime(picker)) {
throw new Error(getErrorMessage(picker, "minHour", newValue));
}
if (isValidTime(picker)) {
// picker._setNativeMinTime();
} else {
throw new Error(getErrorMessage(picker, "Hour", newValue));
}
}, valueConverter: (v) => parseInt(v)
});
minHourProperty.register(TimePickerBase);
export var maxHourProperty = new Property<TimePickerBase, number>({
name: "maxHour", defaultValue: 23, valueChanged: (picker, oldValue, newValue) => {
if (!isHourValid(newValue)) {
if (!isHourValid(newValue) || !isValidTime(picker)) {
throw new Error(getErrorMessage(picker, "maxHour", newValue));
}
if (isValidTime(picker)) {
// picker._setNativeMaxTime();
} else {
throw new Error(getErrorMessage(picker, "Hour", newValue));
}
}, valueConverter: (v) => parseInt(v)
});
maxHourProperty.register(TimePickerBase);
export var minuteProperty = new Property<TimePickerBase, number>({
name: "minute", defaultValue: 0, valueChanged: (picker, oldValue, newValue) => {
if (!isMinuteValid(newValue)) {
throw new Error(getErrorMessage(picker, "minute", newValue));
}
if (isValidTime(picker)) {
// picker._setNativeTime();
if (picker.time) {
picker.time.setMinutes(picker.minute);
} else {
picker.time = new Date(0, 0, 0, picker.hour, picker.minute);
}
} else {
throw new Error(getErrorMessage(picker, "Minute", newValue));
}
}, valueConverter: (v) => parseInt(v)
});
minuteProperty.register(TimePickerBase);
export var minMinuteProperty = new Property<TimePickerBase, number>({
name: "minMinute", defaultValue: 0, valueChanged: (picker, oldValue, newValue) => {
if (!isMinuteValid(newValue)) {
if (!isMinuteValid(newValue) || !isValidTime(picker)) {
throw new Error(getErrorMessage(picker, "minMinute", newValue));
}
if (isValidTime(picker)) {
// picker._setNativeMinTime();
} else {
throw new Error(getErrorMessage(picker, "Minute", newValue));
}
}, valueConverter: (v) => parseInt(v)
});
minMinuteProperty.register(TimePickerBase);
export var maxMinuteProperty = new Property<TimePickerBase, number>({
name: "maxMinute", defaultValue: 59, valueChanged: (picker, oldValue, newValue) => {
if (!isMinuteValid(newValue)) {
if (!isMinuteValid(newValue) || !isValidTime(picker)) {
throw new Error(getErrorMessage(picker, "maxMinute", newValue));
}
if (isValidTime(picker)) {
// picker._setNativeMaxTime();
} else {
throw new Error(getErrorMessage(picker, "Minute", newValue));
}
}, valueConverter: (v) => parseInt(v)
});
maxMinuteProperty.register(TimePickerBase);
@ -208,6 +147,29 @@ function dateComparer(x: Date, y: Date): boolean {
return (x <= y && x >= y) ? true : false;
}
export var minuteProperty = new Property<TimePickerBase, number>({
name: "minute", defaultValue: 0, valueChanged: (picker, oldValue, newValue) => {
if (!isMinuteValid(newValue) || !isValidTime(picker)) {
throw new Error(getErrorMessage(picker, "minute", newValue));
}
picker.time = new Date(0, 0, 0, picker.hour, picker.minute);
}, valueConverter: (v) => parseInt(v)
});
minuteProperty.register(TimePickerBase);
export var hourProperty = new Property<TimePickerBase, number>({
name: "hour", defaultValue: 0, valueChanged: (picker, oldValue, newValue) => {
if (!isHourValid(newValue) || !isValidTime(picker)) {
throw new Error(getErrorMessage(picker, "Hour", newValue));
}
picker.time = new Date(0, 0, 0, picker.hour, picker.minute);
}, valueConverter: (v) => parseInt(v)
});
hourProperty.register(TimePickerBase);
export var timeProperty = new Property<TimePickerBase, Date>({
name: "time", equalityComparer: dateComparer, valueChanged: (picker, oldValue, newValue) => {
if (!isValidTime(picker)) {
@ -216,7 +178,6 @@ export var timeProperty = new Property<TimePickerBase, Date>({
picker.hour = newValue.getHours();
picker.minute = newValue.getMinutes();
// picker._set
}
});
timeProperty.register(TimePickerBase);
timeProperty.register(TimePickerBase);

View File

@ -13,6 +13,8 @@ function initializeTimeChangedListener(): void {
return;
}
apiLevel = android.os.Build.VERSION.SDK_INT;
@Interfaces([android.widget.TimePicker.OnTimeChangedListener])
class TimeChangedListenerImpl extends java.lang.Object implements android.widget.TimePicker.OnTimeChangedListener {
constructor(public owner: TimePicker) {
@ -22,8 +24,13 @@ function initializeTimeChangedListener(): void {
onTimeChanged(picker: android.widget.TimePicker, hour: number, minute: number): void {
const timePicker = this.owner;
let validTime = getValidTime(timePicker, hour, minute);
timePicker._setNativeValueSilently(validTime.hour, validTime.minute);
if (timePicker.updatingNativeValue) {
return;
}
const validTime = getValidTime(timePicker, hour, minute);
hourProperty.nativeValueChange(timePicker, validTime.hour);
minuteProperty.nativeValueChange(timePicker, validTime.minute);
timeProperty.nativeValueChange(timePicker, new Date(0, 0, 0, validTime.hour, validTime.minute));
}
}
@ -31,71 +38,59 @@ function initializeTimeChangedListener(): void {
TimeChangedListener = TimeChangedListenerImpl;
}
let apiLevel: number;
export class TimePicker extends TimePickerBase {
private _android: android.widget.TimePicker;
private _listener: android.widget.TimePicker.OnTimeChangedListener;
nativeView: android.widget.TimePicker;
updatingNativeValue: boolean;
public _createNativeView() {
initializeTimeChangedListener();
this._android = new android.widget.TimePicker(this._context);
this._listener = this._listener || new TimeChangedListener(this);
this._android.setOnTimeChangedListener(this._listener);
let c = java.util.Calendar.getInstance();
if (this.hour === 0) {
this.hour = c.get(java.util.Calendar.HOUR_OF_DAY);
}
if (this.minute === 0) {
this.minute = c.get(java.util.Calendar.MINUTE);
}
let validTime = getValidTime(this, this.hour, this.minute);
this._setNativeValueSilently(validTime.hour, validTime.minute);
return this._android;
const nativeView = new android.widget.TimePicker(this._context);
const listener = new TimeChangedListener(this);
nativeView.setOnTimeChangedListener(listener);
(<any>nativeView).listener = listener;
(<any>nativeView).calendar = java.util.Calendar.getInstance();
return nativeView;
}
get android(): android.widget.TimePicker {
return this._android;
}
public _initNativeView(): void {
const nativeView: any = this.nativeView;
nativeView.listener.owner = this;
public _setNativeValueSilently(hour: number, minute: number) {
if (this._android) {
this._android.setOnTimeChangedListener(null);
const calendar = (<any>nativeView).calendar;
const hour = hourProperty.isSet(this) ? this.hour : calendar.get(java.util.Calendar.HOUR_OF_DAY);
const minute = minuteProperty.isSet(this) ? this.minute : calendar.get(java.util.Calendar.MINUTE);
this._android.setCurrentHour(new java.lang.Integer(hour));
this._android.setCurrentMinute(new java.lang.Integer(minute));
this.minute = minute;
this.hour = hour;
this._android.setOnTimeChangedListener(this._listener);
const validTime = getValidTime(this, hour, minute);
if (!timeProperty.isSet(this)) {
this.time = new Date(0, 0, 0, validTime.hour, validTime.minute);
}
}
public _setNativeTime() {
this._setNativeValueSilently(this.hour, this.minute);
}
[timeProperty.getDefault](): Date {
let nativeView = this._android;
return new Date(0, 0, 0, nativeView.getCurrentHour().intValue(), nativeView.getCurrentMinute().intValue());
}
[timeProperty.setNative](value: Date) {
this._setNativeValueSilently(this.hour, this.minute);
}
[minuteProperty.getDefault](): number {
return this._android.getCurrentMinute().intValue();
}
[minuteProperty.setNative](value: number) {
this._setNativeValueSilently(this.hour, value);
this.updatingNativeValue = true;
try {
if (apiLevel >= 23) {
(<any>this.nativeView).setMinute(value);
} else {
this.nativeView.setCurrentMinute(new java.lang.Integer(value));
}
} finally {
this.updatingNativeValue = false;
}
}
[hourProperty.getDefault](): number {
return this._android.getCurrentHour().intValue()
}
[hourProperty.setNative](value: number) {
this._setNativeValueSilently(value, this.minute);
this.updatingNativeValue = true;
try {
if (apiLevel >= 23) {
(<any>this.nativeView).setHour(value);
} else {
this.nativeView.setCurrentHour(new java.lang.Integer(value));
}
} finally {
this.updatingNativeValue = false;
}
}
}