From 44f6a806e88498e6c8bc8ea49a0523f3f0c8672c Mon Sep 17 00:00:00 2001 From: vakrilov Date: Tue, 1 Dec 2015 14:33:58 +0200 Subject: [PATCH] Support for android.systemIcon in NavigationBar --- .../ui/action-bar/action-bar-tests-common.ts | 29 +++++++++-------- ui/action-bar/action-bar-common.ts | 32 +++++++++---------- ui/action-bar/action-bar.android.ts | 31 +++++++++++++----- ui/action-bar/action-bar.d.ts | 18 +++++------ ui/action-bar/action-bar.ios.ts | 11 ++++--- 5 files changed, 69 insertions(+), 52 deletions(-) diff --git a/apps/tests/ui/action-bar/action-bar-tests-common.ts b/apps/tests/ui/action-bar/action-bar-tests-common.ts index c7d956ee8..75e9cc558 100644 --- a/apps/tests/ui/action-bar/action-bar-tests-common.ts +++ b/apps/tests/ui/action-bar/action-bar-tests-common.ts @@ -65,17 +65,6 @@ import actionBarModule = require("ui/action-bar"); // * **Android** - `actionBar`, `actionBarIfRoom` and `popup`. The default is `actionBar`. // * **iOS** - `left` and `right`. The default is `left`. // -// ## Setting Navigation Button -//```XML -// -// -// -// -// -// ... -// -//``` -// // ## Displaying Platform-Specific System Icons on Action Items //```XML // @@ -94,7 +83,8 @@ import actionBarModule = require("ui/action-bar"); // //### iOS //Set `ios.systemIcon` to a number representing the iOS system item to be displayed. -//Use this property instead of `ActionItemBase.icon` if you want to diplsay a built-in iOS system icon. +//Use this property instead of `ActionItem.icon` if you want to diplsay a built-in iOS system icon. +//Note: systemIcon is not supported on NavigationButton in iOS //The value should be a number from the `UIBarButtonSystemItem` enumeration //(https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIBarButtonItem_Class/#//apple_ref/c/tdef/UIBarButtonSystemItem) //0: Done @@ -124,10 +114,23 @@ import actionBarModule = require("ui/action-bar"); // //### Android //Set `android.systemIcon` the name of the system drawable resource to be displayed. -//Use this property instead of `ActionItemBase.icon` if you want to diplsay a built-in Android system icon. +//Use this property instead of `ActionItem.icon` if you want to diplsay a built-in Android system icon. //The value should be a string such as 'ic_menu_search' if you want to display the built-in Android Menu Search icon for example. //For a full list of Android drawable names, please visit http://androiddrawables.com // +// ## Setting Navigation Button +//```XML +// +// +// +// +// +// ... +// +//``` +//Setting `text` for the navigation button is not supproted in Android. You can use `icon` or `android.systemIcon` to set the image in Android. +//Setting `ios.systemIcon` for the navigation button is not supported in iOS. +// // export function test_actionItem_inherit_bindingContext() { diff --git a/ui/action-bar/action-bar-common.ts b/ui/action-bar/action-bar-common.ts index e901b857f..9c742e035 100644 --- a/ui/action-bar/action-bar-common.ts +++ b/ui/action-bar/action-bar-common.ts @@ -23,7 +23,7 @@ export class ActionBar extends view.View implements dts.ActionBar { public static titleProperty = new dependencyObservable.Property("title", "ActionBar", new proxy.PropertyMetadata(undefined, dependencyObservable.PropertyMetadataSettings.None, onTitlePropertyChanged)); private _actionItems: ActionItems; - private _navigationButton: NavigationButton; + private _navigationButton: dts.NavigationButton; private _page: pages.Page; private _titleView: view.View; @@ -34,10 +34,10 @@ export class ActionBar extends view.View implements dts.ActionBar { this._setValue(ActionBar.titleProperty, value); } - get navigationButton(): NavigationButton { + get navigationButton(): dts.NavigationButton { return this._navigationButton; } - set navigationButton(value: NavigationButton) { + set navigationButton(value: dts.NavigationButton) { if (this._navigationButton !== value) { if (this._navigationButton) { this._navigationButton.actionBar = undefined; @@ -126,7 +126,7 @@ export class ActionBar extends view.View implements dts.ActionBar { } public _addChildFromBuilder(name: string, value: any) { - if (value instanceof NavigationButton) { + if (value instanceof dts.NavigationButton) { this.navigationButton = value; } @@ -229,34 +229,34 @@ export class ActionItems implements dts.ActionItems { } } -export class ActionItemBase extends bindable.Bindable implements dts.ActionItemBase { +export class ActionItem extends bindable.Bindable implements dts.ActionItem { public static tapEvent = "tap"; public static textProperty = new dependencyObservable.Property( - "text", "ActionItemBase", new dependencyObservable.PropertyMetadata("", null, ActionItemBase.onItemChanged)); + "text", "ActionItem", new dependencyObservable.PropertyMetadata("", null, ActionItem.onItemChanged)); public static iconProperty = new dependencyObservable.Property( - "icon", "ActionItemBase", new dependencyObservable.PropertyMetadata(null, null, ActionItemBase.onItemChanged)); + "icon", "ActionItem", new dependencyObservable.PropertyMetadata(null, null, ActionItem.onItemChanged)); private static onItemChanged(data: dependencyObservable.PropertyChangeData) { - var menuItem = data.object; + var menuItem = data.object; if (menuItem.actionBar) { menuItem.actionBar.update(); } } get text(): string { - return this._getValue(ActionItemBase.textProperty); + return this._getValue(ActionItem.textProperty); } set text(value: string) { - this._setValue(ActionItemBase.textProperty, value); + this._setValue(ActionItem.textProperty, value); } get icon(): string { - return this._getValue(ActionItemBase.iconProperty); + return this._getValue(ActionItem.iconProperty); } set icon(value: string) { - this._setValue(ActionItemBase.iconProperty, value); + this._setValue(ActionItem.iconProperty, value); } private _actionBar: ActionBar; @@ -273,10 +273,10 @@ export class ActionItemBase extends bindable.Bindable implements dts.ActionItemB } public _raiseTap() { - this._emit(ActionItemBase.tapEvent); + this._emit(ActionItem.tapEvent); } -} -export class NavigationButton extends ActionItemBase { + public ios: dts.IOSActionItemSettings; -} + public android: dts.AndroidActionItemSettings; +} \ No newline at end of file diff --git a/ui/action-bar/action-bar.android.ts b/ui/action-bar/action-bar.android.ts index ac03be14a..f777f2248 100644 --- a/ui/action-bar/action-bar.android.ts +++ b/ui/action-bar/action-bar.android.ts @@ -15,7 +15,7 @@ var ACTION_ITEM_ID_OFFSET = 1000; global.moduleMerge(common, exports); -export class ActionItem extends common.ActionItemBase implements dts.ActionItem { +export class ActionItem extends common.ActionItem { private _androidPosition: dts.AndroidActionItemSettings = { position: enums.AndroidActionItemPosition.actionBar, systemIcon: undefined @@ -27,9 +27,6 @@ export class ActionItem extends common.ActionItemBase implements dts.ActionItem public set android(value: dts.AndroidActionItemSettings) { throw new Error("ActionItem.android is read-only"); } - - // Not used in Android - public ios: dts.IOSActionItemSettings; } export class AndroidActionBarSettings implements dts.AndroidActionBarSettings { @@ -62,6 +59,10 @@ export class AndroidActionBarSettings implements dts.AndroidActionBarSettings { } } +export class NavigationButton extends ActionItem { + +} + export class ActionBar extends common.ActionBar { private _appResources: android.content.res.Resources; private _android: AndroidActionBarSettings; @@ -102,7 +103,7 @@ export class ActionBar extends common.ActionBar { if (!this._toolbar) { return; } - + if (!this.page.frame || !this.page.frame._getNavBarVisible(this.page)) { this._toolbar.setVisibility(android.view.View.GONE); @@ -142,8 +143,18 @@ export class ActionBar extends common.ActionBar { public _updateNavigationButton() { var navButton = this.navigationButton; if (navButton) { - var drawableOrId = getDrawableOrResourceId(navButton.icon, this._appResources); - this._toolbar.setNavigationIcon(drawableOrId); + + if (navButton.android.systemIcon) { + // Try to look in the system resources. + let systemResourceId = getSystemResourceId(navButton.android.systemIcon); + if (systemResourceId) { + this._toolbar.setNavigationIcon(systemResourceId); + } + } + else if (navButton.icon) { + let drawableOrId = getDrawableOrResourceId(navButton.icon, this._appResources); + this._toolbar.setNavigationIcon(drawableOrId); + } this._toolbar.setNavigationOnClickListener(new android.view.View.OnClickListener({ onClick: function (v) { @@ -206,7 +217,7 @@ export class ActionBar extends common.ActionBar { if (item.android.systemIcon) { // Try to look in the system resources. - let systemResourceId = android.content.res.Resources.getSystem().getIdentifier(item.android.systemIcon, "drawable", "android"); + let systemResourceId = getSystemResourceId(item.android.systemIcon); if (systemResourceId) { menuItem.setIcon(systemResourceId); } @@ -320,4 +331,8 @@ function getIconVisibility(iconVisibility: string): boolean { default: return false; } +} + +function getSystemResourceId(systemIcon: string): number { + return android.content.res.Resources.getSystem().getIdentifier(systemIcon, "drawable", "android"); } \ No newline at end of file diff --git a/ui/action-bar/action-bar.d.ts b/ui/action-bar/action-bar.d.ts index be578f9b4..71b1068f4 100644 --- a/ui/action-bar/action-bar.d.ts +++ b/ui/action-bar/action-bar.d.ts @@ -85,9 +85,9 @@ declare module "ui/action-bar" { } /** - * Base class for action items. + * Represents an action item in the action bar. */ - export class ActionItemBase extends bindable.Bindable { + export class ActionItem extends bindable.Bindable { /** * String value used when hooking to tap event. */ @@ -134,12 +134,7 @@ declare module "ui/action-bar" { //@private _raiseTap(): void; //@endprivate - } - /** - * Represents an action item in the action bar. - */ - export class ActionItem extends ActionItemBase { /** * Gets the iOS specific options of the action item. */ @@ -160,12 +155,13 @@ declare module "ui/action-bar" { * 1. actionBar - item is shown in the action bar. * 2. actionBarIfRoom - item is shown in the action bar if there is room for it. Otherwise it is put in the popup menu. * 3. popup - item is shown in the popup menu. + * Note: Property not applicable to NavigationButton */ position: string; /** * Gets or sets the name of the system drawable resource to be displayed. - * Use this property instead of ActionItemBase.icon if you want to diplsay a built-in Android system icon. + * Use this property instead of ActionItem.icon if you want to diplsay a built-in Android system icon. * The value should be a string such as 'ic_menu_search' if you want to display the built-in Android Menu Search icon for example. * For a full list of Android drawable names, please visit http://androiddrawables.com */ @@ -180,12 +176,14 @@ declare module "ui/action-bar" { * Gets or sets the position of the action item in the action bar. * 1. left - items is shown at the left part of the navigation bar. This is the default value. * 2. right - items is shown at the right part of the navigation bar. + * Note: Property not applicable to NavigationButton */ position: string; /** * Gets or sets a number representing the iOS system item to be displayed. - * Use this property instead of ActionItemBase.icon if you want to diplsay a built-in iOS system icon. + * Use this property instead of ActionItem.icon if you want to diplsay a built-in iOS system icon. + * Note: Property not applicable to NavigationButton * The value should be a number from the UIBarButtonSystemItem enumeration * (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIBarButtonItem_Class/#//apple_ref/c/tdef/UIBarButtonSystemItem) * 0: Done @@ -240,7 +238,7 @@ declare module "ui/action-bar" { /** * Represents the navigation (a.k.a. "back") button. */ - export class NavigationButton extends ActionItemBase { + export class NavigationButton extends ActionItem { } diff --git a/ui/action-bar/action-bar.ios.ts b/ui/action-bar/action-bar.ios.ts index 8538dfe74..8e93ae335 100644 --- a/ui/action-bar/action-bar.ios.ts +++ b/ui/action-bar/action-bar.ios.ts @@ -9,7 +9,7 @@ import types = require("utils/types"); global.moduleMerge(common, exports); -export class ActionItem extends common.ActionItemBase implements dts.ActionItem { +export class ActionItem extends common.ActionItem { private _ios: dts.IOSActionItemSettings = { position: enums.IOSActionItemPosition.left, systemIcon: undefined @@ -20,9 +20,10 @@ export class ActionItem extends common.ActionItemBase implements dts.ActionItem public set ios(value: dts.IOSActionItemSettings) { throw new Error("ActionItem.android is read-only"); } +} + +export class NavigationButton extends ActionItem { - // Not used in IOS - public android: dts.AndroidActionItemSettings; } export class ActionBar extends common.ActionBar { @@ -214,9 +215,9 @@ export class ActionBar extends common.ActionBar { } class TapBarItemHandlerImpl extends NSObject { - private _owner: WeakRef; + private _owner: WeakRef; - public static initWithOwner(owner: WeakRef): TapBarItemHandlerImpl { + public static initWithOwner(owner: WeakRef): TapBarItemHandlerImpl { let handler = TapBarItemHandlerImpl.new(); handler._owner = owner; return handler;