Skip to content

Commit bdb411f

Browse files
manoldonevSvetoslavTsenov
authored andcommitted
fix(action-bar-ios): navigation button support for font icons (#7918)
1 parent a06a5f9 commit bdb411f

File tree

4 files changed

+66
-72
lines changed

4 files changed

+66
-72
lines changed

e2e/ui-tests-app/e2e/suites/tab-navigation/tab-view/tab-view-css-properties.e2e-spec.ts

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,11 @@ describe(`${suite}-${spec}-suite`, async function () {
5959
if (driver.isIOS && imageName.includes("android")) {
6060
this.skip();
6161
}
62-
if (driver.platformName === Platform.ANDROID
63-
&& (sample.sample.toLowerCase() === "all" || sample.sample.toLowerCase() === "reset")) {
64-
await driver.scroll(Direction.down, 400, 200, 300, 200);
65-
await driver.scroll(Direction.down, 400, 200, 300, 200);
66-
await driver.scroll(Direction.down, 400, 200, 300, 200);
67-
62+
let scenarioBtn = await driver.waitForElement(sample.sample);
63+
if (!scenarioBtn) {
64+
await driver.scroll(Direction.up, 400, 200, 300, 200);
65+
scenarioBtn = await driver.waitForElement(sample.sample);
6866
}
69-
const scenarioBtn = await driver.waitForElement(sample.sample);
7067
await scenarioBtn.click();
7168
imageName = setImageName(suite, spec, imageName);
7269
await driver.imageHelper.compareScreen({ imageName: imageName, timeOutSeconds: 5, tolerance: 0, toleranceType: ImageOptions.pixel });

tns-core-modules/ui/action-bar/action-bar-common.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import {
2020
CSSType,
2121
traceWrite,
2222
traceCategories,
23-
traceMessageType, Color
23+
traceMessageType
2424
} from "../core/view";
2525
import { ShorthandProperty, CssProperty, Style } from "../core/properties/properties";
2626
import { Length } from "../core/view";

tns-core-modules/ui/action-bar/action-bar.android.ts

Lines changed: 37 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { AndroidActionBarSettings as AndroidActionBarSettingsDefinition, AndroidActionItemSettings } from ".";
1+
import { AndroidActionItemSettings, AndroidActionBarSettings as AndroidActionBarSettingsDefinition, ActionItem as ActionItemDefinition } from ".";
22
import {
33
ActionItemBase, ActionBarBase, isVisible,
44
View, layout, colorProperty, flatProperty, Color,
5-
traceMissingIcon, androidContentInsetLeftProperty, androidContentInsetRightProperty, Length
5+
traceMissingIcon, androidContentInsetLeftProperty, androidContentInsetRightProperty
66
} from "./action-bar-common";
77
import { RESOURCE_PREFIX, isFontIconURI } from "../../utils/utils";
88
import { fromFileOrResource, fromFontIconCode } from "../../image-source";
@@ -22,6 +22,31 @@ function generateItemId(): number {
2222
return actionItemIdGenerator;
2323
}
2424

25+
function loadActionIconDrawableOrResourceId(item: ActionItemDefinition): any {
26+
const itemIcon = item.icon;
27+
const itemStyle = item.style;
28+
let drawableOrId = null;
29+
30+
if (isFontIconURI(itemIcon)) {
31+
const fontIconCode = itemIcon.split("//")[1];
32+
const font = itemStyle.fontInternal;
33+
const color = itemStyle.color;
34+
const is = fromFontIconCode(fontIconCode, font, color);
35+
36+
if (is && is.android) {
37+
drawableOrId = new android.graphics.drawable.BitmapDrawable(appResources, is.android);
38+
}
39+
} else {
40+
drawableOrId = getDrawableOrResourceId(itemIcon, appResources);
41+
}
42+
43+
if (!drawableOrId) {
44+
traceMissingIcon(itemIcon);
45+
}
46+
47+
return drawableOrId;
48+
}
49+
2550
interface MenuItemClickListener {
2651
new(owner: ActionBar): androidx.appcompat.widget.Toolbar.OnMenuItemClickListener;
2752
}
@@ -231,21 +256,9 @@ export class ActionBar extends ActionBarBase {
231256
}
232257
}
233258
else if (navButton.icon) {
234-
if (isFontIconURI(navButton.icon)) {
235-
const fontIconCode = navButton.icon.split("//")[1];
236-
const font = navButton.style.fontInternal;
237-
const color = navButton.style.color;
238-
const is = fromFontIconCode(fontIconCode, font, color);
239-
240-
if (is && is.android) {
241-
const drawable = new android.graphics.drawable.BitmapDrawable(appResources, is.android);
242-
this.nativeViewProtected.setNavigationIcon(drawable);
243-
}
244-
} else {
245-
let drawableOrId = getDrawableOrResourceId(navButton.icon, appResources);
246-
if (drawableOrId) {
247-
this.nativeViewProtected.setNavigationIcon(drawableOrId);
248-
}
259+
const drawableOrId = loadActionIconDrawableOrResourceId(navButton);
260+
if (drawableOrId) {
261+
this.nativeViewProtected.setNavigationIcon(drawableOrId);
249262
}
250263
}
251264

@@ -275,6 +288,8 @@ export class ActionBar extends ActionBarBase {
275288
let drawableOrId = getDrawableOrResourceId(icon, appResources);
276289
if (drawableOrId) {
277290
this.nativeViewProtected.setLogo(drawableOrId);
291+
} else {
292+
traceMissingIcon(icon);
278293
}
279294
}
280295
else {
@@ -327,21 +342,9 @@ export class ActionBar extends ActionBarBase {
327342
}
328343
}
329344
else if (item.icon) {
330-
if (isFontIconURI(item.icon)) {
331-
const fontIconCode = item.icon.split("//")[1];
332-
const font = item.style.fontInternal;
333-
const color = item.style.color;
334-
const is = fromFontIconCode(fontIconCode, font, color);
335-
336-
if (is && is.android) {
337-
const drawable = new android.graphics.drawable.BitmapDrawable(appResources, is.android);
338-
menuItem.setIcon(drawable);
339-
}
340-
} else {
341-
let drawableOrId = getDrawableOrResourceId(item.icon, appResources);
342-
if (drawableOrId) {
343-
menuItem.setIcon(drawableOrId);
344-
}
345+
const drawableOrId = loadActionIconDrawableOrResourceId(item);
346+
if (drawableOrId) {
347+
menuItem.setIcon(drawableOrId);
345348
}
346349
}
347350

@@ -468,10 +471,10 @@ let defaultTitleTextColor: number;
468471

469472
function getDrawableOrResourceId(icon: string, resources: android.content.res.Resources): any {
470473
if (typeof icon !== "string") {
471-
return undefined;
474+
return null;
472475
}
473476

474-
let result = undefined;
477+
let result = null;
475478
if (icon.indexOf(RESOURCE_PREFIX) === 0) {
476479
let resourceId: number = resources.getIdentifier(icon.substr(RESOURCE_PREFIX.length), "drawable", application.android.packageName);
477480
if (resourceId > 0) {
@@ -480,7 +483,6 @@ function getDrawableOrResourceId(icon: string, resources: android.content.res.Re
480483
}
481484
else {
482485
let drawable: android.graphics.drawable.BitmapDrawable;
483-
484486
let is = fromFileOrResource(icon);
485487
if (is) {
486488
drawable = new android.graphics.drawable.BitmapDrawable(appResources, is.android);
@@ -489,10 +491,6 @@ function getDrawableOrResourceId(icon: string, resources: android.content.res.Re
489491
result = drawable;
490492
}
491493

492-
if (!result) {
493-
traceMissingIcon(icon);
494-
}
495-
496494
return result;
497495
}
498496

tns-core-modules/ui/action-bar/action-bar.ios.ts

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,28 @@ export * from "./action-bar-common";
1313
const majorVersion = iosUtils.MajorVersion;
1414
const UNSPECIFIED = layout.makeMeasureSpec(0, layout.UNSPECIFIED);
1515

16-
function loadActionIconFromFileOrResource(icon: string): UIImage {
17-
const img = fromFileOrResource(icon);
18-
if (img && img.ios) {
19-
return img.ios;
16+
function loadActionIcon(item: ActionItemDefinition): any /* UIImage */ {
17+
let is = null;
18+
let img = null;
19+
20+
const itemIcon = item.icon;
21+
const itemStyle = item.style;
22+
if (isFontIconURI(itemIcon)) {
23+
const fontIconCode = itemIcon.split("//")[1];
24+
const font = itemStyle.fontInternal;
25+
const color = itemStyle.color;
26+
is = fromFontIconCode(fontIconCode, font, color);
2027
} else {
21-
traceMissingIcon(icon);
28+
is = fromFileOrResource(itemIcon);
29+
}
2230

23-
return null;
31+
if (is && is.ios) {
32+
img = is.ios;
33+
} else {
34+
traceMissingIcon(itemIcon);
2435
}
36+
37+
return img;
2538
}
2639

2740
class TapBarItemHandlerImpl extends NSObject {
@@ -183,7 +196,7 @@ export class ActionBar extends ActionBarBase {
183196
// Set back button image
184197
let img: UIImage;
185198
if (this.navigationButton && isVisible(this.navigationButton) && this.navigationButton.icon) {
186-
img = loadActionIconFromFileOrResource(this.navigationButton.icon);
199+
img = loadActionIcon(this.navigationButton);
187200
}
188201

189202
// TODO: This could cause issue when canceling BackEdge gesture - we will change the backIndicator to
@@ -256,25 +269,11 @@ export class ActionBar extends ActionBarBase {
256269

257270
barButtonItem = UIBarButtonItem.alloc().initWithBarButtonSystemItemTargetAction(id, tapHandler, "tap");
258271
} else if (item.icon) {
259-
let img = null;
260-
261-
if (isFontIconURI(item.icon)) {
262-
const fontIconCode = item.icon.split("//")[1];
263-
const font = item.style.fontInternal;
264-
const color = item.style.color;
265-
const is = fromFontIconCode(fontIconCode, font, color);
266-
267-
if (is && is.ios) {
268-
img = is.ios;
269-
} else {
270-
traceMissingIcon(item.icon);
271-
}
272-
} else {
273-
img = loadActionIconFromFileOrResource(item.icon);
272+
const img = loadActionIcon(item);
273+
if (img) {
274+
const image = img.imageWithRenderingMode(this._getIconRenderingMode());
275+
barButtonItem = UIBarButtonItem.alloc().initWithImageStyleTargetAction(image, UIBarButtonItemStyle.Plain, tapHandler, "tap");
274276
}
275-
276-
const image = img.imageWithRenderingMode(this._getIconRenderingMode());
277-
barButtonItem = UIBarButtonItem.alloc().initWithImageStyleTargetAction(image, UIBarButtonItemStyle.Plain, tapHandler, "tap");
278277
} else {
279278
barButtonItem = UIBarButtonItem.alloc().initWithTitleStyleTargetAction(item.text + "", UIBarButtonItemStyle.Plain, tapHandler, "tap");
280279
}

0 commit comments

Comments
 (0)