diff --git a/apps/tests/ui/time-picker/time-picker-tests.ts b/apps/tests/ui/time-picker/time-picker-tests.ts index 5670e24bc..6114c65ea 100644 --- a/apps/tests/ui/time-picker/time-picker-tests.ts +++ b/apps/tests/ui/time-picker/time-picker-tests.ts @@ -1,6 +1,5 @@ import TKUnit = require("../../TKUnit"); -import helper = require("../helper"); -import viewModule = require("ui/core/view"); +import testModule = require("../../ui-test"); import timePickerTestsNative = require("./time-picker-tests-native"); import color = require("color"); import platform = require("platform"); @@ -13,315 +12,268 @@ import timePickerModule = require("ui/time-picker"); // ``` // -function _createTimePicker(hour?: number, minute?: number): timePickerModule.TimePicker { - // - // ## Creating a TimePicker - // ``` JavaScript - var timePicker = new timePickerModule.TimePicker(); - // ``` - // - timePicker.id = "timePicker"; - - if (hour) { - timePicker.hour = hour; - } - - if (minute) { - timePicker.minute = minute; - } - - return timePicker; -} - -export function test_DummyForCodeSnippet() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - // - // ## Configuring a TimePicker - // ``` JavaScript - timePicker.hour = 9; - timePicker.minute = 25; - // ``` - // - }); -} - -// Supported in iOS only. -if (platform.device.os === platform.platformNames.ios) { - exports.test_set_color = function () { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - timePicker.color = new color.Color("red"); - TKUnit.assertEqual(timePicker.color.ios.CGColor, timePicker.ios.valueForKey("textColor").CGColor, "timePicker.color"); - }); - - } -} - -export function test_WhenCreated_MinuteIntervalIs1() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - var actualValue = timePicker.minuteInterval; - var expectedValue = 1; - TKUnit.assertEqual(actualValue, expectedValue); - }); -} - -export function test_WhenCreated_HourIsCurrentHour() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - var actualValue = timePicker.hour; - var expectedValue = timePickerTestsNative.getNativeHour(timePicker); - TKUnit.assertEqual(actualValue, expectedValue); - }); -} - -export function test_WhenCreated_MinHourIs0() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - var actualValue = timePicker.minHour; - var expectedValue = 0; - TKUnit.assertEqual(actualValue, expectedValue); - }); -} - -export function test_WhenCreated_MaxHourIs23() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - var actualValue = timePicker.maxHour; - var expectedValue = 23; - TKUnit.assertEqual(actualValue, expectedValue); - }); -} - -export function test_WhenCreated_MinuteIsCurrentMinute() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - var actualValue = timePicker.minute; - var expectedValue = timePickerTestsNative.getNativeMinute(timePicker); - TKUnit.assertEqual(actualValue, expectedValue); - }); -} - -export function test_WhenCreated_MinMinuteIs0() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - var actualValue = timePicker.minMinute; - var expectedValue = 0; - TKUnit.assertEqual(actualValue, expectedValue); - }); -} - -export function test_WhenCreated_MaxMinuteIs59() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - var actualValue = timePicker.maxMinute; - var expectedValue = 59; - TKUnit.assertEqual(actualValue, expectedValue); - }); -} - -export function testMinuteIntervalThrowExceptionWhenLessThan1() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - TKUnit.assertThrows(function () { - timePicker.minuteInterval = 0; - }, "Setting minuteInterval property to a value less than 1 should throw."); - }); -} - -export function testMinuteIntervalThrowExceptionWhenGreaterThan30() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - TKUnit.assertThrows(function () { - timePicker.minuteInterval = 31; - }, "Setting minuteInterval property to a value greater than 30 should throw."); - }); -} - -export function testMinuteIntervalThrowExceptionWhenNotFold60() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - TKUnit.assertThrows(function () { - timePicker.minuteInterval = 7; - }, "Setting minuteInterval property to a value not fold 60 should throw."); - }); -} - -export function testHourThrowExceptionWhenLessThanMinHour() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - timePicker.hour = 14; - timePicker.minHour = timePicker.hour - 1; - TKUnit.assertThrows(function () { - timePicker.hour = timePicker.minHour - 1; - }, "Setting hour property to a value less than minHour property value should throw."); - }); -} - -export function testMinHourThrowExceptionWhenHourLessThanMinHour() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - timePicker.hour = 14; - TKUnit.assertThrows(function () { - timePicker.minHour = timePicker.hour + 1; - }, "Setting minHour property to a greater than hour property value should throw."); - }); -} - -export function testHourThrowExceptionWhenGreaterThanMaxHour() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - timePicker.hour = 14; - timePicker.maxHour = timePicker.hour + 1; - TKUnit.assertThrows(function () { - timePicker.hour = timePicker.maxHour + 1;; - }, "Setting hour property to a value greater than maxHour property value should throw."); - }); -} - -export function testMaxHourThrowExceptionWhenHourGreaterThanMaxHour() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - timePicker.hour = 14; - TKUnit.assertThrows(function () { - timePicker.maxHour = timePicker.hour - 1; - }, "Setting maxHour property to a value less than hour property value should throw."); - }); -} - -export function testMinuteThrowExceptionWhenLessThanMinMinute() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - timePicker.hour = 14; - timePicker.minute = 13; - - timePicker.minHour = timePicker.hour; - timePicker.minMinute = timePicker.minute; - TKUnit.assertThrows(function () { - timePicker.minute = timePicker.minMinute - 1; - }, "Setting minute property to a value less than minMinute property value should throw."); - }); -} - -export function testMinMinuteThrowExceptionWhenMinuteLessThanMinMinute() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - timePicker.hour = 14; - timePicker.minute = 13; - - timePicker.minHour = timePicker.hour; - TKUnit.assertThrows(function () { - timePicker.minMinute = timePicker.minute + 1; - }, "Setting minMinute property to a value greater than minute property value should throw."); - }); -} - -export function testMinuteThrowExceptionWhenGreaterThanMaxMinute() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - timePicker.hour = 14; - timePicker.minute = 13; - - timePicker.maxHour = timePicker.hour; - timePicker.maxMinute = timePicker.minute; - TKUnit.assertThrows(function () { - timePicker.minute = timePicker.maxMinute + 1; - }, "Setting minute property to a value greater than maxMinute property value should throw."); - }); -} - -export function testMaxMinuteThrowExceptionWhenMinuteGreaterThanMaxMinute() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - timePicker.hour = 14; - timePicker.minute = 13; - - timePicker.maxHour = timePicker.hour; - TKUnit.assertThrows(function () { - timePicker.maxMinute = timePicker.minute - 1; - }, "Setting maxMinute property to a value less than minute property value should throw."); - }); -} - -export function testHourFromLocalToNative() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - var expectedValue = 13; - timePicker.hour = expectedValue; - var actualValue = timePickerTestsNative.getNativeHour(timePicker); - TKUnit.assertEqual(actualValue, expectedValue); - }); -} - -export function testMinuteFromLocalToNative() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - var expectedValue = 59; - timePicker.minute = expectedValue; - var actualValue = timePickerTestsNative.getNativeMinute(timePicker); - TKUnit.assertEqual(actualValue, expectedValue); - }); -} - -export function testHourFromNativeToLocal() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - var expectedValue = 14; - timePickerTestsNative.setNativeHour(timePicker, expectedValue); - var actualValue = timePicker.hour; - TKUnit.assertEqual(actualValue, expectedValue); - }); -} - -export function testMinuteFromNativeToLocal() { - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - var expectedValue = 33; - timePickerTestsNative.setNativeMinute(timePicker, expectedValue); - var actualValue = timePicker.minute; - TKUnit.assertEqual(actualValue, expectedValue); - }); -} - -export function testHourAndMinuteFromNativeToLocal() { - var expectedHour = 12; - var expectedMinute = 34; - - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - timePickerTestsNative.setNativeTime(timePicker, expectedHour, expectedMinute); - assertTime(timePicker, expectedHour, expectedMinute); - }); -} - -export function testSetHourMinute_BeforeLoaded() { - var expectedHour = 12; - var expectedMinute = 34; - - helper.buildUIAndRunTest(_createTimePicker(expectedHour, expectedMinute), function (views: Array) { - var timePicker = views[0]; - assertTime(timePicker, expectedHour, expectedMinute); - }); -} - -export function testSetHourMinute_AfterLoaded() { - var expectedHour = 12; - var expectedMinute = 34; - - helper.buildUIAndRunTest(_createTimePicker(), function (views: Array) { - var timePicker = views[0]; - timePicker.hour = expectedHour; - timePicker.minute = expectedMinute; - - assertTime(timePicker, expectedHour, expectedMinute); - }); -} - function assertTime(timePicker: timePickerModule.TimePicker, expectedHour: number, expectedMinute) { TKUnit.assertEqual(timePicker.hour, expectedHour, "timePicker.hour"); TKUnit.assertEqual(timePicker.minute, expectedMinute, "timePicker.minute"); TKUnit.assertEqual(timePickerTestsNative.getNativeHour(timePicker), expectedHour, "Native timePicker.hour"); TKUnit.assertEqual(timePickerTestsNative.getNativeMinute(timePicker), expectedMinute, "Native timePicker.minute"); +} + +export class TimePickerTest extends testModule.UITest { + public create() { + let timePicker = new timePickerModule.TimePicker(); + timePicker.id = "TimePicker"; + return timePicker; + } + + public test_DummyForCodeSnippet() { + // + // ## Configuring a TimePicker + // ``` JavaScript + var timePicker = new timePickerModule.TimePicker(); + timePicker.hour = 9; + timePicker.minute = 25; + // ``` + // + } + + private setUpTimePicker(hour?: number, minute?: number) { + if (hour) { + this.testView.hour = hour; + } + + if (minute) { + this.testView.minute = minute; + } + } + + // Supported in iOS only. + public test_set_color() { + if (platform.device.os === platform.platformNames.ios) { + this.testView.color = new color.Color("red"); + TKUnit.assertEqual(this.testView.color.ios.CGColor, this.testView.ios.valueForKey("textColor").CGColor, "timePicker.color"); + } + } + + public test_WhenCreated_MinuteIntervalIs1() { + let actualValue = this.testView.minuteInterval; + let expectedValue = 1; + TKUnit.assertEqual(actualValue, expectedValue); + } + + public test_WhenCreated_HourIsCurrentHour() { + let actualValue = this.testView.hour; + let expectedValue = timePickerTestsNative.getNativeHour(this.testView); + TKUnit.assertEqual(actualValue, expectedValue); + } + + public test_WhenCreated_MinHourIs0() { + let actualValue = this.testView.minHour; + let expectedValue = 0; + TKUnit.assertEqual(actualValue, expectedValue); + } + + public test_WhenCreated_MaxHourIs23() { + let actualValue = this.testView.maxHour; + let expectedValue = 23; + TKUnit.assertEqual(actualValue, expectedValue); + } + + public test_WhenCreated_MinuteIsCurrentMinute() { + let actualValue = this.testView.minute; + let expectedValue = timePickerTestsNative.getNativeMinute(this.testView); + TKUnit.assertEqual(actualValue, expectedValue); + } + + public test_WhenCreated_MinMinuteIs0() { + let actualValue = this.testView.minMinute; + let expectedValue = 0; + TKUnit.assertEqual(actualValue, expectedValue); + } + + public test_WhenCreated_MaxMinuteIs59() { + let actualValue = this.testView.maxMinute; + let expectedValue = 59; + TKUnit.assertEqual(actualValue, expectedValue); + } + + public testMinuteIntervalThrowExceptionWhenLessThan1() { + TKUnit.assertThrows(function() { + this.testView.minuteInterval = 0; + }, "Setting minuteInterval property to a value less than 1 should throw."); + } + + public testMinuteIntervalThrowExceptionWhenGreaterThan30() { + TKUnit.assertThrows(function() { + this.testView.minuteInterval = 31; + }, "Setting minuteInterval property to a value greater than 30 should throw."); + } + + public testMinuteIntervalThrowExceptionWhenNotFold60() { + TKUnit.assertThrows(function() { + this.testView.minuteInterval = 7; + }, "Setting minuteInterval property to a value not fold 60 should throw."); + } + + public testHourThrowExceptionWhenLessThanMinHour() { + this.testView.hour = 14; + this.testView.minHour = this.testView.hour - 1; + TKUnit.assertThrows(function() { + this.testView.hour = this.testView.minHour - 1; + }, "Setting hour property to a value less than minHour property value should throw."); + } + + public testMinHourThrowExceptionWhenHourLessThanMinHour() { + this.testView.hour = 14; + TKUnit.assertThrows(function() { + this.testView.minHour = this.testView.hour + 1; + }, "Setting minHour property to a greater than hour property value should throw."); + } + + public testHourThrowExceptionWhenGreaterThanMaxHour() { + this.testView.hour = 14; + this.testView.maxHour = this.testView.hour + 1; + TKUnit.assertThrows(function() { + this.testView.hour = this.testView.maxHour + 1;; + }, "Setting hour property to a value greater than maxHour property value should throw."); + } + + public testMaxHourThrowExceptionWhenHourGreaterThanMaxHour() { + this.testView.hour = 14; + TKUnit.assertThrows(function() { + this.testView.maxHour = this.testView.hour - 1; + }, "Setting maxHour property to a value less than hour property value should throw."); + } + + public testMinuteThrowExceptionWhenLessThanMinMinute() { + this.testView.hour = 14; + this.testView.minute = 13; + + this.testView.minHour = this.testView.hour; + this.testView.minMinute = this.testView.minute; + TKUnit.assertThrows(function() { + this.testView.minute = this.testView.minMinute - 1; + }, "Setting minute property to a value less than minMinute property value should throw."); + } + + public testMinMinuteThrowExceptionWhenMinuteLessThanMinMinute() { + this.testView.hour = 14; + this.testView.minute = 13; + + this.testView.minHour = this.testView.hour; + TKUnit.assertThrows(function() { + this.testView.minMinute = this.testView.minute + 1; + }, "Setting minMinute property to a value greater than minute property value should throw."); + } + + public testMinuteThrowExceptionWhenGreaterThanMaxMinute() { + this.testView.hour = 14; + this.testView.minute = 13; + + this.testView.maxHour = this.testView.hour; + this.testView.maxMinute = this.testView.minute; + TKUnit.assertThrows(function() { + this.testView.minute = this.testView.maxMinute + 1; + }, "Setting minute property to a value greater than maxMinute property value should throw."); + } + + public testMaxMinuteThrowExceptionWhenMinuteGreaterThanMaxMinute() { + this.testView.hour = 14; + this.testView.minute = 13; + + this.testView.maxHour = this.testView.hour; + TKUnit.assertThrows(function() { + this.testView.maxMinute = this.testView.minute - 1; + }, "Setting maxMinute property to a value less than minute property value should throw."); + } + + public testHourFromLocalToNative() { + let expectedValue = 13; + this.testView.hour = expectedValue; + let actualValue = timePickerTestsNative.getNativeHour(this.testView); + TKUnit.assertEqual(actualValue, expectedValue); + } + + public testMinuteFromLocalToNative() { + let expectedValue = 59; + this.testView.minute = expectedValue; + let actualValue = timePickerTestsNative.getNativeMinute(this.testView); + TKUnit.assertEqual(actualValue, expectedValue); + } + + public testHourFromNativeToLocal() { + let expectedValue = 14; + timePickerTestsNative.setNativeHour(this.testView, expectedValue); + let actualValue = this.testView.hour; + TKUnit.assertEqual(actualValue, expectedValue); + } + + public testMinuteFromNativeToLocal() { + let expectedValue = 33; + timePickerTestsNative.setNativeMinute(this.testView, expectedValue); + let actualValue = this.testView.minute; + TKUnit.assertEqual(actualValue, expectedValue); + } + + public testHourAndMinuteFromNativeToLocal() { + let expectedHour = 12; + let expectedMinute = 34; + + timePickerTestsNative.setNativeTime(this.testView, expectedHour, expectedMinute); + assertTime(this.testView, expectedHour, expectedMinute); + } + + public testSetHourMinute_BeforeLoaded() { + let expectedHour = 12; + let expectedMinute = 34; + + this.setUpTimePicker(expectedHour, expectedMinute); + + assertTime(this.testView, expectedHour, expectedMinute); + } + + public testTimeSetHourMinute_BeforeLoaded() { + let expectedHour = 12; + let expectedMinute = 34; + + this.setUpTimePicker(expectedHour, expectedMinute); + + TKUnit.assertEqual(this.testView.time.getHours(), expectedHour); + TKUnit.assertEqual(this.testView.time.getMinutes(), expectedMinute); + } + + public testSetHourMinute_AfterLoaded() { + let expectedHour = 12; + let expectedMinute = 34; + + this.testView.hour = expectedHour; + this.testView.minute = expectedMinute; + + TKUnit.assertEqual(this.testView.time.getHours(), expectedHour); + TKUnit.assertEqual(this.testView.time.getMinutes(), expectedMinute); + } + + public testTimeSetHourMinute_AfterLoaded() { + let expectedHour = 12; + let expectedMinute = 34; + + this.testView.hour = expectedHour; + this.testView.minute = expectedMinute; + + TKUnit.assertEqual(this.testView.time.getHours(), expectedHour); + TKUnit.assertEqual(this.testView.time.getMinutes(), expectedMinute); + } + + public testSetTimeChangesHourAndMinute() { + let expectedHour = 12; + let expectedMinute = 34; + + this.testView.time = new Date(0, 0, 0, expectedHour, expectedMinute); + assertTime(this.testView, expectedHour, expectedMinute); + } +} + +export function createTestCase(): TimePickerTest { + return new TimePickerTest(); } \ No newline at end of file diff --git a/ui/time-picker/time-picker-common.ts b/ui/time-picker/time-picker-common.ts index 850edae52..9f3f4927c 100644 --- a/ui/time-picker/time-picker-common.ts +++ b/ui/time-picker/time-picker-common.ts @@ -26,10 +26,16 @@ function getMinutes(hour: number): number { } export function isGreaterThanMinTime(picker: definition.TimePicker, hour?: number, minute?: number): boolean { + if (!types.isDefined(picker.minHour) || !types.isDefined(picker.minMinute)) { + return true; + } return getMinutes(types.isDefined(hour) ? hour : picker.hour) + (types.isDefined(minute) ? minute : picker.minute) >= getMinutes(picker.minHour) + picker.minMinute; } export function isLessThanMaxTime(picker: definition.TimePicker, hour?: number, minute?: number): boolean { + if (!types.isDefined(picker.maxHour) || !types.isDefined(picker.maxMinute)) { + return true; + } return getMinutes(types.isDefined(hour) ? hour : picker.hour) + (types.isDefined(minute) ? minute : picker.minute) <= getMinutes(picker.maxHour) + picker.maxMinute; } @@ -78,6 +84,7 @@ function onHourPropertyChanged(data: dependencyObservable.PropertyChangeData) { if (isValidTime(picker)) { picker._setNativeTime(); + picker.time = new Date(0, 0, 0, picker.hour, picker.minute); } else { throw new Error(getErrorMessage(picker, "Hour", data.newValue)); } @@ -88,11 +95,26 @@ function onMinutePropertyChanged(data: dependencyObservable.PropertyChangeData) if (isValidTime(picker)) { picker._setNativeTime(); + picker.time = new Date(0, 0, 0, picker.hour, picker.minute); } else { throw new Error(getErrorMessage(picker, "Minute", data.newValue)); } } +function onTimePropertyChanged(data: dependencyObservable.PropertyChangeData) { + var picker = data.object; + + let newTime = data.newValue; + picker.hour = newTime.getHours(); + picker.minute = newTime.getMinutes(); + + if (isValidTime(picker)) { + picker._setNativeTime(); + } else { + throw new Error(getErrorMessage(picker, "Time", data.newValue)); + } +} + function onMinMinutePropertyChanged(data: dependencyObservable.PropertyChangeData) { var picker = data.object; @@ -160,6 +182,9 @@ export class TimePicker extends view.View implements definition.TimePicker { public static minuteIntervalProperty = new dependencyObservable.Property("minuteInterval", "TimePicker", new proxy.PropertyMetadata(1, dependencyObservable.PropertyMetadataSettings.None, onMinuteIntervalPropertyChanged, isMinuteIntervalValid)); + + public static timeProperty = new dependencyObservable.Property("time", "TimePicker", + new proxy.PropertyMetadata(undefined, dependencyObservable.PropertyMetadataSettings.None, onTimePropertyChanged, isValidTime)); constructor() { super(); @@ -178,6 +203,13 @@ export class TimePicker extends view.View implements definition.TimePicker { set minute(value: number) { this._setValue(TimePicker.minuteProperty, value); } + + get time(): Date { + return this._getValue(TimePicker.timeProperty); + } + set time(value: Date) { + this._setValue(TimePicker.timeProperty, value); + } get minuteInterval(): number { return this._getValue(TimePicker.minuteIntervalProperty); diff --git a/ui/time-picker/time-picker.android.ts b/ui/time-picker/time-picker.android.ts index 671066341..a7ba59ebc 100644 --- a/ui/time-picker/time-picker.android.ts +++ b/ui/time-picker/time-picker.android.ts @@ -54,7 +54,7 @@ export class TimePicker extends common.TimePicker { this.minute = minute; this.hour = hour; - + this.android.setOnTimeChangedListener(this._listener); } } diff --git a/ui/time-picker/time-picker.d.ts b/ui/time-picker/time-picker.d.ts index 2fb93205c..52283b27f 100644 --- a/ui/time-picker/time-picker.d.ts +++ b/ui/time-picker/time-picker.d.ts @@ -11,6 +11,7 @@ declare module "ui/time-picker" { export class TimePicker extends view.View { public static hourProperty: dependencyObservable.Property; public static minuteProperty: dependencyObservable.Property; + public static timeProperty: dependencyObservable.Property; constructor(); @@ -33,6 +34,11 @@ declare module "ui/time-picker" { * Gets or sets the time minute. */ minute: number; + + /** + * Gets or sets the time. + */ + time: Date; /** * Gets or sets the max time hour. diff --git a/ui/time-picker/time-picker.ios.ts b/ui/time-picker/time-picker.ios.ts index 7c39bddb9..353c03f66 100644 --- a/ui/time-picker/time-picker.ios.ts +++ b/ui/time-picker/time-picker.ios.ts @@ -79,13 +79,20 @@ class UITimePickerChangeHandlerImpl extends NSObject { } var comps = getComponents(sender.date); - + + let timeChanged = false; if (comps.hour !== owner.hour) { owner._onPropertyChangedFromNative(common.TimePicker.hourProperty, comps.hour); + timeChanged = true; } if (comps.minute !== owner.minute) { owner._onPropertyChangedFromNative(common.TimePicker.minuteProperty, comps.minute); + timeChanged = true; + } + + if (timeChanged) { + owner._onPropertyChangedFromNative(common.TimePicker.timeProperty, new Date(0, 0, 0, comps.hour, comps.minute)); } }