Skip to content

Commit ce74b84

Browse files
committed
Fixed all time-picker issues and covered it with tests.
1 parent 18c368d commit ce74b84

12 files changed

+198
-28
lines changed

CrossPlatformModules.csproj

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,14 @@
120120
<TypeScriptCompile Include="apps\tests\platform-tests.ts" />
121121
<TypeScriptCompile Include="apps\tests\fps-meter-tests.ts" />
122122
<TypeScriptCompile Include="apps\tests\trace-tests.ts" />
123+
<TypeScriptCompile Include="apps\tests\ui\time-picker\time-picker-tests-native.android.ts">
124+
<DependentUpon>time-picker-tests-native.d.ts</DependentUpon>
125+
</TypeScriptCompile>
126+
<TypeScriptCompile Include="apps\tests\ui\time-picker\time-picker-tests-native.d.ts" />
127+
<TypeScriptCompile Include="apps\tests\ui\time-picker\time-picker-tests-native.ios.ts">
128+
<DependentUpon>time-picker-tests-native.d.ts</DependentUpon>
129+
</TypeScriptCompile>
130+
<TypeScriptCompile Include="apps\tests\ui\time-picker\time-picker-tests.ts" />
123131
<TypeScriptCompile Include="apps\tests\ui\dialogs\dialog-tests.ts" />
124132
<TypeScriptCompile Include="apps\tests\ui\image-cache\image-cache-tests.ts" />
125133
<TypeScriptCompile Include="apps\tests\ui\border\border-tests.ts" />
@@ -1491,7 +1499,7 @@
14911499
<SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>
14921500
</WebProjectProperties>
14931501
</FlavorProperties>
1494-
<UserProperties ui_2layouts_2wrap-layout_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2layouts_2grid-layout_2package_1json__JSONSchema="" ui_2layouts_2dock-layout_2package_1json__JSONSchema="" ui_2layouts_2absolute-layout_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2layouts_2linear-layout_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2web-view_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2content-view_2package_1json__JSONSchema="http://json.schemastore.org/package" apps_2gallery-app_2package_1json__JSONSchema="http://json.schemastore.org/package" apps_2absolute-layout-demo_2package_1json__JSONSchema="http://json.schemastore.org/package" apps_2editable-text-demo_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2scroll-view_2package_1json__JSONSchema="http://json.schemastore.org/package" />
1502+
<UserProperties ui_2scroll-view_2package_1json__JSONSchema="http://json.schemastore.org/package" apps_2editable-text-demo_2package_1json__JSONSchema="http://json.schemastore.org/package" apps_2absolute-layout-demo_2package_1json__JSONSchema="http://json.schemastore.org/package" apps_2gallery-app_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2content-view_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2web-view_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2layouts_2linear-layout_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2layouts_2absolute-layout_2package_1json__JSONSchema="http://json.schemastore.org/package" ui_2layouts_2dock-layout_2package_1json__JSONSchema="" ui_2layouts_2grid-layout_2package_1json__JSONSchema="" ui_2layouts_2wrap-layout_2package_1json__JSONSchema="http://json.schemastore.org/package" />
14951503
</VisualStudio>
14961504
</ProjectExtensions>
14971505
</Project>

apps/pickers-demo/main-page.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,12 @@ export function onPageLoaded(args: observableModule.EventData) {
2626
viewModel.items = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
2727
viewModel.selectedIndex = 5;
2828

29-
//viewModel.day = 9;
30-
//viewModel.month = 2;
31-
//viewModel.year = 1980;
29+
viewModel.day = 9;
30+
viewModel.month = 2;
31+
viewModel.year = 1980;
32+
33+
viewModel.hour = 17;
34+
viewModel.minute = 50;
3235
}
3336

3437
export function onTap(args: observableModule.EventData) {
@@ -40,4 +43,7 @@ export function onTap(args: observableModule.EventData) {
4043
viewModel.day = viewModel.day + 1;
4144
viewModel.month = viewModel.month + 1;
4245
viewModel.year = viewModel.year + 1;
46+
47+
viewModel.hour = viewModel.hour + 1;
48+
viewModel.minute = viewModel.minute + 1;
4349
}

apps/pickers-demo/main-page.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44
<Label id="label" text="{{ selectedIndex }}" height="50" width="100" />
55
<ListPicker id="listPicker" selectedIndex="{{ selectedIndex }}" items="{{ items }}"/>
66
<DatePicker id="datePicker" day="{{ day }}" month="{{ month }}" year="{{ year }}"/>
7-
<TimePicker id="timePicker"/>
7+
<TimePicker id="timePicker" hour="{{ hour }}" minute="{{ minute }}"/>
88
</StackLayout>
99
</Page>

apps/pickers-demo/model.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,24 @@ export class WebViewModel extends observable.Observable {
5454
this._year = value;
5555
this.notify({ object: this, eventName: observable.knownEvents.propertyChange, propertyName: "year", value: value });
5656
}
57+
58+
private _hour: number;
59+
get hour(): number {
60+
return this._hour;
61+
}
62+
set hour(value: number) {
63+
console.log("hour:" + value);
64+
this._hour = value;
65+
this.notify({ object: this, eventName: observable.knownEvents.propertyChange, propertyName: "hour", value: value });
66+
}
67+
68+
private _minute: number;
69+
get minute(): number {
70+
return this._minute;
71+
}
72+
set minute(value: number) {
73+
console.log("minute:" + value);
74+
this._minute = value;
75+
this.notify({ object: this, eventName: observable.knownEvents.propertyChange, propertyName: "minute", value: value });
76+
}
5777
}

apps/tests/testRunner.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ allTests["FILE-SYSTEM-ACCESS"] = require("./file-system-access-tests/file-system
4949
allTests["XML-DECLARATION"] = require("./xml-declaration/xml-declaration-tests");
5050
allTests["LIST-PICKER"] = require("./ui/list-picker/list-picker-tests");
5151
allTests["DATE-PICKER"] = require("./ui/date-picker/date-picker-tests");
52+
allTests["TIME-PICKER"] = require("./ui/time-picker/time-picker-tests");
5253

5354
var testsWithLongDelay = {
5455
testLocation: 10000,
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import timePickerModule = require("ui/time-picker");
2+
3+
export function getNativeHour(timePicker: timePickerModule.TimePicker): number {
4+
return timePicker.android.getCurrentHour().intValue();
5+
}
6+
7+
export function getNativeMinute(timePicker: timePickerModule.TimePicker): number {
8+
return timePicker.android.getCurrentMinute().intValue();
9+
}
10+
11+
export function setNativeHour(timePicker: timePickerModule.TimePicker, value: number): void {
12+
timePicker.android.setCurrentHour(new java.lang.Integer(value));
13+
}
14+
15+
export function setNativeMinute(timePicker: timePickerModule.TimePicker, value: number): void {
16+
timePicker.android.setCurrentMinute(new java.lang.Integer(value));
17+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
//@private
2+
import timePickerModule = require("ui/time-picker");
3+
4+
export declare function getNativeHour(timePicker: timePickerModule.TimePicker): number;
5+
export declare function getNativeMinute(timePicker: timePickerModule.TimePicker): number;
6+
7+
export declare function setNativeHour(timePicker: timePickerModule.TimePicker, value: number): void;
8+
export declare function setNativeMinute(timePicker: timePickerModule.TimePicker, value: number): void;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import timePickerModule = require("ui/time-picker");
2+
3+
export function getNativeHour(timePicker: timePickerModule.TimePicker): number {
4+
return NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitHour | NSCalendarUnit.NSCalendarUnitMinute, timePicker.ios.date).hour;
5+
}
6+
7+
export function getNativeMinute(timePicker: timePickerModule.TimePicker): number {
8+
return NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitHour | NSCalendarUnit.NSCalendarUnitMinute, timePicker.ios.date).minute;
9+
}
10+
11+
export function setNativeHour(timePicker: timePickerModule.TimePicker, value: number): void {
12+
var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitHour | NSCalendarUnit.NSCalendarUnitMinute, timePicker.ios.date);
13+
comps.hour = value;
14+
timePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false);
15+
(<any>timePicker)._changeHandler.valueChanged(timePicker.ios);
16+
}
17+
18+
export function setNativeMinute(timePicker: timePickerModule.TimePicker, value: number): void {
19+
var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitHour | NSCalendarUnit.NSCalendarUnitMinute, timePicker.ios.date);
20+
comps.minute = value;
21+
timePicker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false);
22+
(<any>timePicker)._changeHandler.valueChanged(timePicker.ios);
23+
}
24+
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
import TKUnit = require("../../TKUnit");
2+
import helper = require("../helper");
3+
import viewModule = require("ui/core/view");
4+
import timePickerTestsNative = require("./time-picker-tests-native");
5+
6+
// <snippet module="ui/time-picker" title="timePicker">
7+
// # timePicker
8+
9+
// Using a timePicker requires the "ui/time-picker" module.
10+
// ``` JavaScript
11+
import timePickerModule = require("ui/time-picker");
12+
13+
function _createtimePicker(): timePickerModule.TimePicker {
14+
// <snippet module="ui/time-picker" title="timePicker">
15+
// ## Creating a timePicker
16+
// ``` JavaScript
17+
var timePicker = new timePickerModule.TimePicker();
18+
// ```
19+
// </snippet>
20+
timePicker.id = "timePicker";
21+
return timePicker;
22+
}
23+
24+
export var test_WhenCreated_HourIsUndefined = function () {
25+
helper.buildUIAndRunTest(_createtimePicker(), function (views: Array<viewModule.View>) {
26+
var timePicker = <timePickerModule.TimePicker>views[0];
27+
var actualValue = timePicker.hour;
28+
var expectedValue = undefined;
29+
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
30+
});
31+
}
32+
33+
export var test_WhenCreated_MinuteIsUndefined = function () {
34+
helper.buildUIAndRunTest(_createtimePicker(), function (views: Array<viewModule.View>) {
35+
var timePicker = <timePickerModule.TimePicker>views[0];
36+
var actualValue = timePicker.minute;
37+
var expectedValue = undefined;
38+
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
39+
});
40+
}
41+
42+
export var testHourFromLocalToNative = function () {
43+
helper.buildUIAndRunTest(_createtimePicker(), function (views: Array<viewModule.View>) {
44+
var timePicker = <timePickerModule.TimePicker>views[0];
45+
var expectedValue = 13;
46+
timePicker.hour = expectedValue;
47+
var actualValue = timePickerTestsNative.getNativeHour(timePicker);
48+
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
49+
});
50+
}
51+
52+
export var testMinuteFromLocalToNative = function () {
53+
helper.buildUIAndRunTest(_createtimePicker(), function (views: Array<viewModule.View>) {
54+
var timePicker = <timePickerModule.TimePicker>views[0];
55+
var expectedValue = 59;
56+
timePicker.minute = expectedValue;
57+
var actualValue = timePickerTestsNative.getNativeMinute(timePicker);
58+
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
59+
});
60+
}
61+
62+
export var testHourFromNativeToLocal = function () {
63+
helper.buildUIAndRunTest(_createtimePicker(), function (views: Array<viewModule.View>) {
64+
var timePicker = <timePickerModule.TimePicker>views[0];
65+
var expectedValue = 14;
66+
timePickerTestsNative.setNativeHour(timePicker, expectedValue);
67+
var actualValue = timePicker.hour;
68+
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
69+
});
70+
}
71+
72+
export var testMinuteFromNativeToLocal = function () {
73+
helper.buildUIAndRunTest(_createtimePicker(), function (views: Array<viewModule.View>) {
74+
var timePicker = <timePickerModule.TimePicker>views[0];
75+
var expectedValue = 33;
76+
timePickerTestsNative.setNativeMinute(timePicker, expectedValue);
77+
var actualValue = timePicker.minute;
78+
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
79+
});
80+
}

ui/time-picker/time-picker-common.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import proxy = require("ui/core/proxy");
44
import view = require("ui/core/view");
55

66
export class TimePicker extends view.View implements definition.TimePicker {
7-
public static hourProperty = new dependencyObservable.Property("hour", "TimePicker", new proxy.PropertyMetadata(0));
8-
public static minuteProperty = new dependencyObservable.Property("minute", "TimePicker", new proxy.PropertyMetadata(0));
7+
public static hourProperty = new dependencyObservable.Property("hour", "TimePicker", new proxy.PropertyMetadata(undefined));
8+
public static minuteProperty = new dependencyObservable.Property("minute", "TimePicker", new proxy.PropertyMetadata(undefined));
99

1010
constructor() {
1111
super();

ui/time-picker/time-picker.android.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ require("utils/module-merge").merge(common, exports);
2828

2929
export class TimePicker extends common.TimePicker {
3030
private _android: android.widget.TimePicker;
31+
private _listener: android.widget.TimePicker.OnTimeChangedListener;
3132

3233
get android(): android.widget.TimePicker {
3334
return this._android;
@@ -38,17 +39,24 @@ export class TimePicker extends common.TimePicker {
3839

3940
var that = new WeakRef(this);
4041

41-
this._android.setOnTimeChangedListener(new android.widget.TimePicker.OnTimeChangedListener({
42+
this._listener = new android.widget.TimePicker.OnTimeChangedListener({
4243
get owner() {
4344
return that.get();
4445
},
4546

46-
onTimeChanged: function (picker: android.widget.TimePicker, hourOfDay: number, minute: number) {
47+
onTimeChanged: function (picker: android.widget.TimePicker, hour: number, minute: number) {
4748
if (this.owner) {
48-
this.owner._onPropertyChangedFromNative(common.TimePicker.hourProperty, hourOfDay);
49-
this.owner._onPropertyChangedFromNative(common.TimePicker.minuteProperty, minute);
49+
50+
if (hour !== this.owner.hour) {
51+
this.owner._onPropertyChangedFromNative(common.TimePicker.hourProperty, hour);
52+
}
53+
54+
if (minute !== this.owner.minute) {
55+
this.owner._onPropertyChangedFromNative(common.TimePicker.minuteProperty, minute);
56+
}
5057
}
5158
}
52-
}));
59+
});
60+
this._android.setOnTimeChangedListener(this._listener);
5361
}
5462
}

ui/time-picker/time-picker.ios.ts

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ function onHourPropertyChanged(data: dependencyObservable.PropertyChangeData) {
66
var picker = <TimePicker>data.object;
77

88
if (picker.ios) {
9-
setHourAndMinute(picker.ios, data.newValue, picker.minute);
9+
var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitHour | NSCalendarUnit.NSCalendarUnitMinute, picker.ios.date);
10+
comps.hour = data.newValue;
11+
picker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false);
1012
}
1113
}
1214

@@ -16,7 +18,9 @@ function onMinutePropertyChanged(data: dependencyObservable.PropertyChangeData)
1618
var picker = <TimePicker>data.object;
1719

1820
if (picker.ios) {
19-
setHourAndMinute(picker.ios, picker.hour, data.newValue);
21+
var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitHour | NSCalendarUnit.NSCalendarUnitMinute, picker.ios.date);
22+
comps.minute = data.newValue;
23+
picker.ios.setDateAnimated(NSCalendar.currentCalendar().dateFromComponents(comps), false);
2024
}
2125
}
2226

@@ -58,24 +62,18 @@ class UITimePickerChangeHandlerImpl extends NSObject {
5862
}
5963

6064
public valueChanged(sender: UIDatePicker) {
61-
var calendar = NSCalendar.currentCalendar();
62-
var comp = calendar.componentsFromDate(NSCalendarUnit.NSHourCalendarUnit | NSCalendarUnit.NSMinuteCalendarUnit, sender.date);
65+
var comps = NSCalendar.currentCalendar().componentsFromDate(NSCalendarUnit.NSCalendarUnitHour | NSCalendarUnit.NSCalendarUnitMinute, sender.date);
6366

64-
this._owner._onPropertyChangedFromNative(common.TimePicker.hourProperty, comp.hour);
65-
this._owner._onPropertyChangedFromNative(common.TimePicker.minuteProperty, comp.minute);
67+
if (comps.hour !== this._owner.hour) {
68+
this._owner._onPropertyChangedFromNative(common.TimePicker.hourProperty, comps.hour);
69+
}
70+
71+
if (comps.minute !== this._owner.minute) {
72+
this._owner._onPropertyChangedFromNative(common.TimePicker.minuteProperty, comps.minute);
73+
}
6674
}
6775

6876
public static ObjCExposedMethods = {
6977
'valueChanged': { returns: interop.types.void, params: [UIDatePicker] }
7078
};
71-
}
72-
73-
function setHourAndMinute(picker: UIDatePicker, hour: number, minute: number) {
74-
var calendar = NSCalendar.currentCalendar();
75-
var comps = new NSDateComponents();
76-
77-
comps.hour = hour;
78-
comps.minute = minute;
79-
80-
picker.setDateAnimated(calendar.dateFromComponents(comps), false);
8179
}

0 commit comments

Comments
 (0)