Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions apps/tests/ui/list-picker/list-picker-tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import helper = require("../helper");
import viewModule = require("ui/core/view");
import listPickerTestsNative = require("./list-picker-tests-native");
import pageModule = require("ui/page");
import application = require("application");

// <snippet module="ui/list-picker" title="ListPicker">
// # ListPicker
Expand Down Expand Up @@ -196,4 +197,60 @@ export var testWhenSelectingAnItemNativelySelectedIndexIsUpdatedProperly = funct
finally {
helper.goBack();
}
}

export var test_Android_MaxValueIsOneLessThanItemsCount = function () {
if (!application.android) {
return;
}

helper.buildUIAndRunTest(_createListPicker(), function (views: Array<viewModule.View>) {
var listPicker = <listPickerModule.ListPicker>views[0];
listPicker.items = ["One", "Two", "Three"];
var expectedValue = listPicker.items.length - 1;
var actualValue = (<any>listPicker).android.getMaxValue();
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}

export var test_Android_WhenItemsAreEmptyNativeControlDoesNotShowZero = function () {
if (!application.android) {
return;
}

helper.buildUIAndRunTest(_createListPicker(), function (views: Array<viewModule.View>) {
var listPicker = <listPickerModule.ListPicker>views[0];
var expectedValue = "";
var actualValue = (<any>listPicker)._editText.getText().toString();
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}

export var test_Android_WhenBoundToSingleElementArrayEditTextIsUpdatedProperly = function () {
if (!application.android) {
return;
}

helper.buildUIAndRunTest(_createListPicker(), function (views: Array<viewModule.View>) {
var listPicker = <listPickerModule.ListPicker>views[0];
listPicker.items = ["One"];
var expectedValue = "One";
var actualValue = (<any>listPicker)._editText.getText().toString();
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}

export var test_Android_WhenSelectedIndexChangesEditTextIsUpdatedProperly = function () {
if (!application.android) {
return;
}

helper.buildUIAndRunTest(_createListPicker(), function (views: Array<viewModule.View>) {
var listPicker = <listPickerModule.ListPicker>views[0];
listPicker.items = ["One", "Two"];
listPicker.selectedIndex = 1;
var expectedValue = "Two";
var actualValue = (<any>listPicker)._editText.getText().toString();
TKUnit.assert(actualValue === expectedValue, "Actual: " + actualValue + "; Expected: " + expectedValue);
});
}
2 changes: 1 addition & 1 deletion ui/list-picker/list-picker-common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export class ListPicker extends view.View implements definition.ListPicker {

public _getItemAsString(index: number): any {
if (!this.items || !this.items.length) {
return "";
return " ";
}

if (types.isDefined(this.items)) {
Expand Down
28 changes: 17 additions & 11 deletions ui/list-picker/list-picker.android.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ export class ListPicker extends common.ListPicker {
private _android: android.widget.NumberPicker;
private _valueChangedListener: android.widget.NumberPicker.OnValueChangeListener;
private _formatter: android.widget.NumberPicker.Formatter;
private _editText: android.widget.EditText;

get android(): android.widget.NumberPicker {
return this._android;
Expand All @@ -21,7 +22,6 @@ export class ListPicker extends common.ListPicker {

public _createUI() {
this._android = new android.widget.NumberPicker(this._context);
this._android.setMinValue(0);
this._android.setDescendantFocusability(android.widget.NumberPicker.FOCUS_BLOCK_DESCENDANTS);

var that = new WeakRef(this);
Expand All @@ -36,7 +36,7 @@ export class ListPicker extends common.ListPicker {
return this.owner._getItemAsString(index);
}

return index.toString();
return "";
}
});
this._android.setFormatter(this._formatter);
Expand All @@ -54,7 +54,15 @@ export class ListPicker extends common.ListPicker {
});
this._android.setOnValueChangedListener(this._valueChangedListener);

this._fixDisappearingSelectedItem();
//Fix disappearing selected item.
//HACK: http://stackoverflow.com/questions/17708325/android-numberpicker-with-formatter-does-not-format-on-first-rendering/26797732
var mInputTextField = java.lang.Class.forName("android.widget.NumberPicker").getDeclaredField("mInputText");
mInputTextField.setAccessible(true);
this._editText = <android.widget.EditText>mInputTextField.get(this._android);
this._editText.setFilters([]);

// Since the Android NumberPicker has to always have at least one item, i.e. minValue=maxValue=value=0, we don't want this zero showing up when this.items is empty.
this._editText.setText(" ");
}

public _onSelectedIndexPropertyChanged(data: dependencyObservable.PropertyChangeData) {
Expand All @@ -77,21 +85,19 @@ export class ListPicker extends common.ListPicker {
maxValue = 0;
}
else {
maxValue = data.newValue.length;
maxValue = data.newValue.length - 1;
}

this.android.setMaxValue(maxValue);
this.android.setWrapSelectorWheel(false);
}

this._updateSelectedIndexOnItemsPropertyChanged(data.newValue);
}

private _fixDisappearingSelectedItem() {

//Fix disappearing selected item.
//HACK: http://stackoverflow.com/questions/17708325/android-numberpicker-with-formatter-does-not-format-on-first-rendering/26797732
var mInputTextField = java.lang.Class.forName("android.widget.NumberPicker").getDeclaredField("mInputText");
mInputTextField.setAccessible(true);
var mInputText = <android.widget.EditText>mInputTextField.get(this._android);
mInputText.setFilters([]);
if (this._editText) {
this._editText.setFilters([]);
}
}
}