Skip to content

Commit 2970ad5

Browse files
authored
Merge pull request NativeScript#3261 from NativeScript/issue-3147
Fix: Setting `setTypeface()` to null object
2 parents 8767522 + ae68368 commit 2970ad5

File tree

8 files changed

+114
-127
lines changed

8 files changed

+114
-127
lines changed

tests/app/fonts/Pacifico.ttf

73.8 KB
Binary file not shown.

tests/app/ui/tab-view/tab-view-tests-native.android.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,17 @@ export function selectNativeTab(tabView: tabViewModule.TabView, index: number):
1313
export function getNativeSelectedIndex(tabView: tabViewModule.TabView): number {
1414
var viewPager: android.support.v4.view.ViewPager = (<any>tabView)._viewPager;
1515
return viewPager.getCurrentItem();
16+
}
17+
18+
export function getNativeFont(tabView: tabViewModule.TabView): any {
19+
var tv: android.widget.TextView = tabView._getAndroidTabView().getTextViewForItemAt(0);
20+
if (tv) {
21+
return {
22+
typeface: tv.getTypeface(),
23+
size: tv.getTextSize()
24+
}
25+
}
26+
else {
27+
return null;
28+
}
1629
}

tests/app/ui/tab-view/tab-view-tests-native.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ import tabViewModule = require("ui/tab-view");
33

44
export declare function getNativeTabCount(tabView: tabViewModule.TabView): number;
55
export declare function selectNativeTab(tabView: tabViewModule.TabView, index: number): void;
6-
export declare function getNativeSelectedIndex(tabView: tabViewModule.TabView): number;
6+
export declare function getNativeSelectedIndex(tabView: tabViewModule.TabView): number;
7+
export declare function getNativeFont(tabView: tabViewModule.TabView): any;

tests/app/ui/tab-view/tab-view-tests-native.ios.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import tabViewModule = require("ui/tab-view");
2+
import * as utils from "utils/utils";
3+
import getter = utils.ios.getter;
24

35
export function getNativeTabCount(tabView: tabViewModule.TabView): number {
46
if (!tabView.ios.viewControllers) {
@@ -15,4 +17,22 @@ export function selectNativeTab(tabView: tabViewModule.TabView, index: number):
1517

1618
export function getNativeSelectedIndex(tabView: tabViewModule.TabView): number {
1719
return tabView.ios.selectedIndex;
20+
}
21+
22+
export function getNativeFont(tabView: tabViewModule.TabView): any {
23+
let tabBar = <UITabBar>tabView.ios.tabBar;
24+
let currentFont;
25+
26+
if (tabBar.items.count > 0) {
27+
let currentAttrs = tabBar.items[0].titleTextAttributesForState(UIControlState.Normal);
28+
if (currentAttrs) {
29+
currentFont = currentAttrs.objectForKey(NSFontAttributeName);
30+
}
31+
}
32+
33+
if (!currentFont) {
34+
currentFont = UIFont.systemFontOfSize(getter(UIFont, UIFont.labelFontSize));
35+
}
36+
37+
return currentFont;
1838
}

tests/app/ui/tab-view/tab-view-tests.ts

Lines changed: 50 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import helper = require("../helper");
44
import labelModule = require("ui/label");
55
import stackLayoutModule = require("ui/layouts/stack-layout");
66
import tabViewTestsNative = require("./tab-view-tests-native");
7+
import style = require("ui/styling/style");
78

89
// Using a TabView requires the "ui/tab-view" module.
910
// >> article-require-tabview-module
@@ -276,102 +277,58 @@ export class TabViewTest extends testModule.UITest<tabViewModule.TabView> {
276277
TKUnit.assertEqual(actualNewIndex, expectedNewIndex, "expectedNewIndex");
277278
}
278279

279-
// public testAndroidOffscreenTabLimit_Default = function () {
280-
// let tabView = this.testView;
281-
// if (!tabView.android){
282-
// return;
283-
// }
280+
public test_FontIsReappliedWhenTabItemsChange = function () {
281+
// let fontToString = (font: any): string => {
282+
// if (this.testView.ios){
283+
// return font.toString();
284+
// }
285+
// else {
286+
// return `${font.typeface} ${font.size}`;
287+
// }
288+
// }
284289

285-
// tabView.androidOffscreenTabLimit = 1;
286-
// tabView.items = this._createItems(20);
287-
// this.waitUntilTestElementIsLoaded();
288-
// for (let index = 0, length = tabView.items.length; index < length; index++){
289-
// tabViewTestsNative.selectNativeTab(tabView, index);
290-
// TKUnit.waitUntilReady(function () {
291-
// return tabView.selectedIndex === index;
292-
// }, helper.ASYNC);
293-
// }
294-
295-
// let viewsWithParent = 0;
296-
// let viewsWithoutParent = 0;
297-
// for (let i = 0, length = tabView.items.length; i < length; i++){
298-
// if (tabView.items[i].view.parent) {
299-
// viewsWithParent++;
300-
// }
301-
// else {
302-
// viewsWithoutParent++;
303-
// }
304-
// }
305-
306-
// TKUnit.assertTrue(viewsWithoutParent > viewsWithParent, `Most of the views should be recycled: viewsWithoutParent = ${viewsWithoutParent}; viewsWithParent = ${viewsWithParent};`);
307-
// }
308-
309-
// public testAndroidOffscreenTabLimit_KeepAllAlive = function () {
310-
// let tabView = this.testView;
311-
// if (!tabView.android){
312-
// return;
313-
// }
290+
let assertFontsAreEqual = (actual: any, expected: any, message?: string) => {
291+
if (this.testView.ios){
292+
TKUnit.assertEqual(actual, expected, message);
293+
}
294+
else {
295+
TKUnit.assertEqual(actual.typeface, expected.typeface, `${message} [typeface]`);
296+
TKUnit.assertEqual(actual.size, expected.size, `${message} [size]`);
297+
}
298+
}
299+
300+
//console.log(`>>>>>>>>>>>>> CREATE 3 ITEMS`);
301+
this.testView.items = this._createItems(1);
302+
this.waitUntilTestElementIsLoaded();
314303

315-
// tabView.androidOffscreenTabLimit = 20;
304+
let originalFont = tabViewTestsNative.getNativeFont(this.testView);
305+
//console.log(`>>>>>>>>>>>>> originalFont: ${fontToString(originalFont)}`);
306+
let nativeFont: any;
307+
308+
//console.log(`>>>>>>>>>>>>> PACIFICO`);
309+
this.testView.style.font = "20 Pacifico";
310+
nativeFont = tabViewTestsNative.getNativeFont(this.testView);
311+
//console.log(`>>>>>>>>>>>>> nativeFont: ${fontToString(nativeFont)}`);
316312

317-
// tabView.items = this._createItems(20);
318-
// this.waitUntilTestElementIsLoaded();
319-
// for (let index = 0, length = tabView.items.length; index < length; index++){
320-
// tabViewTestsNative.selectNativeTab(tabView, index);
321-
// TKUnit.waitUntilReady(function () {
322-
// return tabView.selectedIndex === index;
323-
// }, helper.ASYNC);
324-
// }
325-
326-
// for (let i = 0, length = tabView.items.length; i < length; i++){
327-
// TKUnit.assertNotNull(tabView.items[i].view.parent, `tabView.items[${i}].view should have a parent!`);
328-
// }
329-
// }
330-
331-
/*
332-
public testBindingIsRefreshedWhenTabViewItemIsUnselectedAndThenSelectedAgain() {
333-
334-
var viewModel = new observable.Observable();
335-
viewModel.set("counter", 0);
336-
this.testPage.bindingContext = viewModel;
337-
338-
var tabView = this.testView;
339-
var items = this._createItems(10);
340-
341-
var StackLayout0 = new stackLayoutModule.StackLayout();
342-
var label0 = new labelModule.Label();
343-
label0.text = "Tab 0";
344-
label0.id = "testLabel";
345-
label0.bind({ sourceProperty: "counter", targetProperty: "text", twoWay: true });
346-
StackLayout0.addChild(label0);
347-
var tabEntry0 = new tabViewModule.TabViewItem({
348-
title: "Tab 0",
349-
view: StackLayout0
350-
});
351-
items.push(tabEntry0);
352-
353-
tabView.items = items;
354-
tabView.selectedIndex = 10;
355-
TKUnit.waitUntilReady(function () {
356-
return tabViewTestsNative.getNativeSelectedIndex(tabView) === tabView.selectedIndex;
357-
}, helper.ASYNC);
358-
359-
TKUnit.assertEqual(label0.text, 0, "binding is not working!");
360-
361-
tabView.selectedIndex = 0;
362-
TKUnit.waitUntilReady(function () {
363-
return tabViewTestsNative.getNativeSelectedIndex(tabView) === tabView.selectedIndex;
364-
}, helper.ASYNC);
365-
366-
tabView.selectedIndex = 10;
367-
TKUnit.waitUntilReady(function () {
368-
return tabViewTestsNative.getNativeSelectedIndex(tabView) === tabView.selectedIndex;
369-
}, helper.ASYNC);
370-
371-
var expectedValue = 5;
372-
viewModel.set("counter", expectedValue);
373-
TKUnit.assertEqual(label0.text, expectedValue, "binding is not working!");
374-
}*/
313+
//console.log(`>>>>>>>>>>>>> CREATE 3 ITEMS`);
314+
this.testView.items = this._createItems(2);
315+
assertFontsAreEqual(tabViewTestsNative.getNativeFont(this.testView), nativeFont, "Font must be 20 Pacifico after rebinding items.");
316+
//console.log(`>>>>>>>>>>>>> nativeFont: ${fontToString(nativeFont)}`);
317+
318+
//console.log(`>>>>>>>>>>>>> MONOSPACE;`);
319+
this.testView.style.font = "bold 12 monospace";
320+
nativeFont = tabViewTestsNative.getNativeFont(this.testView);
321+
//console.log(`>>>>>>>>>>>>> nativeFont: ${fontToString(nativeFont)}`);
322+
323+
//console.log(`>>>>>>>>>>>>> CREATE 3 ITEMS`);
324+
this.testView.items = this._createItems(3);
325+
assertFontsAreEqual(tabViewTestsNative.getNativeFont(this.testView), nativeFont, "Font must be bold 12 monospace after rebinding items.");
326+
//console.log(`>>>>>>>>>>>>> nativeFont: ${fontToString(nativeFont)}`);
327+
328+
//console.log(`>>>>>>>>>>>>> RESET`);
329+
this.testView.style._resetValue(style.fontInternalProperty);
330+
assertFontsAreEqual(tabViewTestsNative.getNativeFont(this.testView), originalFont, "Font must be the original one after resetting the style.");
331+
}
375332
}
376333

377334
export function createTestCase(): TabViewTest {

tns-core-modules/ui/tab-view/tab-view.android.ts

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,9 @@ export class TabView extends common.TabView {
277277
}
278278

279279
this._updateSelectedIndexOnItemsPropertyChanged(data.newValue);
280+
281+
// Style properties such as fonts need to re-applied on the newwly created native TextViews
282+
this.style._syncNativeProperties();
280283
}
281284

282285
public _updateTabForItem(item: TabViewItem) {
@@ -348,7 +351,6 @@ export class TabView extends common.TabView {
348351
}
349352
}
350353
}
351-
352354
}
353355

354356
export class TabViewStyler implements style.Styler {
@@ -358,40 +360,34 @@ export class TabViewStyler implements style.Styler {
358360
var tab = <definition.TabView>v;
359361
var fontValue = <font.Font>newValue;
360362
var typeface = fontValue.getAndroidTypeface();
363+
var tabLayout = tab._getAndroidTabView();
364+
let tabCount = tabLayout.getItemCount();
365+
for (var i = 0; i < tabCount; i++) {
366+
let tv = tabLayout.getTextViewForItemAt(i);
367+
if (typeface) {
368+
tv.setTypeface(typeface);
369+
}
370+
else if (nativeValue) {
371+
tv.setTypeface(nativeValue.typeface);
372+
}
361373

362-
if (tab.items && tab.items.length > 0) {
363-
var tabLayout = tab._getAndroidTabView();
364-
365-
for (var i = 0; i < tab.items.length; i++) {
366-
let tv = tabLayout.getTextViewForItemAt(i);
367-
if (typeface) {
368-
tv.setTypeface(typeface);
369-
}
370-
else {
371-
tv.setTypeface(nativeValue.typeface);
372-
}
373-
374-
if (fontValue.fontSize) {
375-
tv.setTextSize(fontValue.fontSize);
376-
}
377-
else {
378-
tv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_PX, nativeValue.size);
379-
}
374+
if (fontValue.fontSize) {
375+
tv.setTextSize(fontValue.fontSize);
376+
}
377+
else if (nativeValue) {
378+
tv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_PX, nativeValue.size);
380379
}
381380
}
382381
}
383382

384383
private static resetFontInternalProperty(v: view.View, nativeValue: any) {
385384
var tab = <definition.TabView>v;
386-
387-
if (tab.items && tab.items.length > 0) {
388-
var tabLayout = tab._getAndroidTabView();
389-
390-
for (var i = 0; i < tab.items.length; i++) {
391-
let tv = tabLayout.getTextViewForItemAt(i);
392-
tv.setTypeface(nativeValue.typeface);
393-
tv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_PX, nativeValue.size);
394-
}
385+
var tabLayout = tab._getAndroidTabView();
386+
let tabCount = tabLayout.getItemCount();
387+
for (var i = 0; i < tabCount; i++) {
388+
let tv = tabLayout.getTextViewForItemAt(i);
389+
tv.setTypeface(nativeValue.typeface);
390+
tv.setTextSize(android.util.TypedValue.COMPLEX_UNIT_PX, nativeValue.size);
395391
}
396392
}
397393

tns-core-modules/ui/tab-view/tab-view.ios.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ export class TabView extends common.TabView {
430430
return;
431431
}
432432

433-
var tabBar = this.ios.tabBar;
433+
var tabBar = <UITabBar>this.ios.tabBar;
434434
var states = getTitleAttributesForStates(this);
435435
for (var i = 0; i < tabBar.items.count; i++) {
436436
var item = <UITabBarItem>tabBar.items[i];
@@ -496,12 +496,11 @@ export class TabViewStyler implements style.Styler {
496496
}
497497

498498
private static getNativeFontValue(v: view.View) {
499-
var tab = <definition.TabView>v;
500-
499+
var tabBar = <UITabBar>v.ios.tabBar;
501500
let currentFont;
502501

503-
if (tab.ios && tab.ios.items && tab.ios.items.length > 0) {
504-
let currentAttrs = tab.ios.items[0].titleTextAttributesForState(UIControlState.Normal);
502+
if (tabBar.items.count > 0) {
503+
let currentAttrs = tabBar.items[0].titleTextAttributesForState(UIControlState.Normal);
505504
if (currentAttrs) {
506505
currentFont = currentAttrs.objectForKey(NSFontAttributeName);
507506
}

tns-platform-declarations/android/org.nativescript.widgets.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,7 @@
360360

361361
getTextViewForItemAt(index: number): android.widget.TextView;
362362
getViewForItemAt(index: number): android.widget.LinearLayout;
363+
getItemCount(): number;
363364
}
364365

365366
export class TabItemSpec {

0 commit comments

Comments
 (0)