From d5687a8e9cfd08bdec36cfbf4660d5cfeec06431 Mon Sep 17 00:00:00 2001 From: vakrilov Date: Tue, 14 Jul 2015 18:20:28 +0300 Subject: [PATCH] API changes - ios and android settings objcets --- .../pages/action-items-text.xml | 6 +- apps/action-bar-demo/pages/data-binding.xml | 4 +- .../pages/navigation-button.ts | 22 +++--- apps/action-bar-demo/pages/page-title-icon.ts | 42 ++++++----- apps/tests/pages/page17.ts | 19 +++-- ui/action-bar/action-bar-common.ts | 69 ++++------------- ui/action-bar/action-bar.android.ts | 74 ++++++++++++++++--- ui/action-bar/action-bar.d.ts | 22 +++++- ui/action-bar/action-bar.ios.ts | 25 +++++-- 9 files changed, 165 insertions(+), 118 deletions(-) diff --git a/apps/action-bar-demo/pages/action-items-text.xml b/apps/action-bar-demo/pages/action-items-text.xml index 00722c1e8..40d8b5705 100644 --- a/apps/action-bar-demo/pages/action-items-text.xml +++ b/apps/action-bar-demo/pages/action-items-text.xml @@ -2,9 +2,9 @@ - - - + + + diff --git a/apps/action-bar-demo/pages/data-binding.xml b/apps/action-bar-demo/pages/data-binding.xml index 558e4e9d6..8e77e2b3d 100644 --- a/apps/action-bar-demo/pages/data-binding.xml +++ b/apps/action-bar-demo/pages/data-binding.xml @@ -3,8 +3,8 @@ - - + + diff --git a/apps/action-bar-demo/pages/navigation-button.ts b/apps/action-bar-demo/pages/navigation-button.ts index f49a680d4..b0a0fadf8 100644 --- a/apps/action-bar-demo/pages/navigation-button.ts +++ b/apps/action-bar-demo/pages/navigation-button.ts @@ -28,17 +28,19 @@ var j = 0; export function visibilityTap(args: observable.EventData) { var page = view.getAncestor(args.object, "Page") - if (j % 3 === 0) { - page.actionBar.androidIconVisibility = "always"; + if (page.actionBar.android) { + if (j % 3 === 0) { + page.actionBar.android.iconVisibility = "always"; + } + else if (j % 3 === 1) { + page.actionBar.android.iconVisibility = "never"; + } + else if (j % 3 === 2) { + page.actionBar.android.iconVisibility = "auto"; + } + j++; + console.log("Visibility changed to: " + page.actionBar.android.iconVisibility); } - else if (j % 3 === 1) { - page.actionBar.androidIconVisibility = "never"; - } - else if (j % 3 === 2) { - page.actionBar.androidIconVisibility = "auto"; - } - j++; - console.log("Visibility changed to: " + page.actionBar.androidIconVisibility); } export function navTap(args: observable.EventData) { diff --git a/apps/action-bar-demo/pages/page-title-icon.ts b/apps/action-bar-demo/pages/page-title-icon.ts index ba77f0153..df808c206 100644 --- a/apps/action-bar-demo/pages/page-title-icon.ts +++ b/apps/action-bar-demo/pages/page-title-icon.ts @@ -5,16 +5,18 @@ import view = require("ui/core/view"); var i = 0; export function buttonTap(args: observable.EventData) { var page = view.getAncestor(args.object, "Page") - page.actionBar.title = "Title changed " + i++; - if (i % 3 === 0) { - page.actionBar.icon = "res://ic_test"; - } - else if (i % 3 === 1) { - page.actionBar.icon = "~/test-icon.png"; - } - else if (i % 3 === 2) { - page.actionBar.icon = undefined; + + if (page.actionBar.android) { + if (i % 3 === 0) { + page.actionBar.android.icon = "res://ic_test"; + } + else if (i % 3 === 1) { + page.actionBar.android.icon = "~/test-icon.png"; + } + else if (i % 3 === 2) { + page.actionBar.android.icon = undefined; + } } } @@ -22,15 +24,17 @@ var j = 0; export function visibilityTap(args: observable.EventData) { var page = view.getAncestor(args.object, "Page") - if (j % 3 === 0) { - page.actionBar.androidIconVisibility = "always"; + if (page.actionBar.android) { + if (j % 3 === 0) { + page.actionBar.android.iconVisibility = "always"; + } + else if (j % 3 === 1) { + page.actionBar.android.iconVisibility = "never"; + } + else if (j % 3 === 2) { + page.actionBar.android.iconVisibility = "auto"; + } + j++; + console.log("Visibility changed to: " + page.actionBar.android.iconVisibility); } - else if (j % 3 === 1) { - page.actionBar.androidIconVisibility = "never"; - } - else if (j % 3 === 2) { - page.actionBar.androidIconVisibility = "auto"; - } - j++; - console.log("Visibility changed to: " + page.actionBar.androidIconVisibility); } diff --git a/apps/tests/pages/page17.ts b/apps/tests/pages/page17.ts index 45aa3756c..52a4bd061 100644 --- a/apps/tests/pages/page17.ts +++ b/apps/tests/pages/page17.ts @@ -23,14 +23,17 @@ export function optionTap(args) { var i = 0; export function buttonTap(args: observable.EventData) { currentPage.actionBar.title = "hi " + i++; - if (i % 3 === 0) { - currentPage.actionBar.icon = "res://ic_test"; - } - else if (i % 3 === 1) { - currentPage.actionBar.icon = "~/test-icon.png"; - } - else if (i % 3 === 2) { - currentPage.actionBar.icon = undefined; + + if (currentPage.actionBar.android) { + if (i % 3 === 0) { + currentPage.actionBar.android.icon = "res://ic_test"; + } + else if (i % 3 === 1) { + currentPage.actionBar.android.icon = "~/test-icon.png"; + } + else if (i % 3 === 2) { + currentPage.actionBar.android.icon = undefined; + } } } diff --git a/ui/action-bar/action-bar-common.ts b/ui/action-bar/action-bar-common.ts index 4011830b4..8433762f5 100644 --- a/ui/action-bar/action-bar-common.ts +++ b/ui/action-bar/action-bar-common.ts @@ -19,16 +19,9 @@ function onTitlePropertyChanged(data: dependencyObservable.PropertyChangeData) { actionBar._onTitlePropertyChanged(); } -function onIconPropertyChanged(data: dependencyObservable.PropertyChangeData) { - var actionBar = data.object; - actionBar._onIconPropertyChanged(); -} - 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)); - public static iconProperty = new dependencyObservable.Property("icon", "ActionBar", new proxy.PropertyMetadata(undefined, dependencyObservable.PropertyMetadataSettings.None, onIconPropertyChanged)); - public static androidIconVisibilityProperty = new dependencyObservable.Property("androidIconVisibility", "ActionBar", new proxy.PropertyMetadata("auto", dependencyObservable.PropertyMetadataSettings.None, onIconPropertyChanged)); - + private _actionItems: ActionItems; private _navigationButton: NavigationButton; private _page: pages.Page; @@ -41,20 +34,6 @@ export class ActionBar extends view.View implements dts.ActionBar { this._setValue(ActionBar.titleProperty, value); } - get icon(): string { - return this._getValue(ActionBar.iconProperty); - } - set icon(value: string) { - this._setValue(ActionBar.iconProperty, value); - } - - get androidIconVisibility(): string { - return this._getValue(ActionBar.androidIconVisibilityProperty); - } - set androidIconVisibility(value: string) { - this._setValue(ActionBar.androidIconVisibilityProperty, value); - } - get navigationButton(): NavigationButton { return this._navigationButton; } @@ -117,6 +96,10 @@ export class ActionBar extends view.View implements dts.ActionBar { }, this._page); } + get android(): dts.AndroidActionBarSettings { + return undefined; + } + get _childrenCount(): number { return this.titleView ? 1 : 0; } @@ -136,10 +119,6 @@ export class ActionBar extends view.View implements dts.ActionBar { // } - public _onIconPropertyChanged() { - // - } - public _updateAndroidActionBar(menu: android.view.IMenu) { // } @@ -181,7 +160,7 @@ export class ActionBar extends view.View implements dts.ActionBar { public shouldShow(): boolean { if (this.title || - this.icon || + (this.android && this.android.icon) || this.navigationButton || this.actionItems.getItems().length > 0) { @@ -193,14 +172,14 @@ export class ActionBar extends view.View implements dts.ActionBar { } export class ActionItems implements dts.ActionItems { - private _items: Array = new Array(); + private _items: Array = new Array(); private _actionBar: ActionBar; constructor(actionBar: ActionBar) { this._actionBar = actionBar; } - public addItem(item: ActionItem): void { + public addItem(item: dts.ActionItem): void { if (!item) { throw new Error("Cannot add empty item"); } @@ -210,7 +189,7 @@ export class ActionItems implements dts.ActionItems { this.invalidate(); } - public removeItem(item: ActionItem): void { + public removeItem(item: dts.ActionItem): void { if (!item) { throw new Error("Cannot remove empty item"); } @@ -225,11 +204,11 @@ export class ActionItems implements dts.ActionItems { this.invalidate(); } - public getItems(): Array { + public getItems(): Array { return this._items.slice(); } - public getItemAt(index: number): ActionItem { + public getItemAt(index: number): dts.ActionItem { if (index < 0 || index >= this._items.length) { return undefined; } @@ -237,7 +216,7 @@ export class ActionItems implements dts.ActionItems { return this._items[index]; } - public setItems(items: Array) { + public setItems(items: Array) { // Remove all existing items while (this._items.length > 0) { this.removeItem(this._items[this._items.length - 1]); @@ -268,7 +247,7 @@ export class ActionItemBase extends bindable.Bindable implements dts.ActionItemB "icon", "ActionItemBase", new dependencyObservable.PropertyMetadata(null, null, ActionItemBase.onItemChanged)); private static onItemChanged(data: dependencyObservable.PropertyChangeData) { - var menuItem = data.object; + var menuItem = data.object; if (menuItem.actionBar) { menuItem.actionBar.updateActionBar(); } @@ -302,27 +281,7 @@ export class ActionItemBase extends bindable.Bindable implements dts.ActionItemB } public _raiseTap() { - this._emit(ActionItem.tapEvent); - } - -} - -export class ActionItem extends ActionItemBase { - private _androidPosition: string = enums.AndroidActionItemPosition.actionBar; - private _iosPosition: string = enums.IOSActionItemPosition.right; - - get androidPosition(): string { - return this._androidPosition; - } - set androidPosition(value: string) { - this._androidPosition = value; - } - - get iosPosition(): string { - return this._iosPosition; - } - set iosPosition(value: string) { - this._iosPosition = value; + this._emit(ActionItemBase.tapEvent); } } diff --git a/ui/action-bar/action-bar.android.ts b/ui/action-bar/action-bar.android.ts index efcd2f8ca..07bfb73f0 100644 --- a/ui/action-bar/action-bar.android.ts +++ b/ui/action-bar/action-bar.android.ts @@ -6,6 +6,7 @@ import utils = require("utils/utils"); import imageSource = require("image-source"); import enums = require("ui/enums"); import application = require("application"); +import dts = require("ui/action-bar"); var ACTION_ITEM_ID_OFFSET = 1000; var API_LVL = android.os.Build.VERSION.SDK_INT; @@ -13,14 +14,71 @@ var API_LVL = android.os.Build.VERSION.SDK_INT; declare var exports; require("utils/module-merge").merge(common, exports); +export class ActionItem extends common.ActionItemBase implements dts.ActionItem { + private _androidPosition: dts.AndroidActionItemSettings = { position: enums.AndroidActionItemPosition.actionBar }; + + public get android(): dts.AndroidActionItemSettings { + return this._androidPosition; + } + 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 { + private _actionBar: ActionBar; + private _icon: string; + private _iconVisibility: string = enums.AndroidActionBarIconVisibility.auto; + + public get icon(): string { + return this._icon; + } + public set icon(value: string) { + if (value !== this._icon) { + this._icon = value; + this._actionBar._onIconPropertyChanged(); + } + } + + public get iconVisibility(): string { + return this._iconVisibility; + } + public set iconVisibility(value: string) { + if (value !== this._iconVisibility) { + this._iconVisibility = value; + this._actionBar._onIconPropertyChanged(); + } + } + + constructor(actionBar: ActionBar) { + this._actionBar = actionBar; + } +} + export class ActionBar extends common.ActionBar { private _appResources: android.content.res.Resources; + private _android: AndroidActionBarSettings; + + get android(): AndroidActionBarSettings { + return this._android; + } + + set android(value: AndroidActionBarSettings) { + throw new Error("ActionBar.android is read-only"); + } + + get _nativeView() { + return undefined; + } constructor() { super(); this._appResources = application.android.context.getResources(); - this.actionItems + this._android = new AndroidActionBarSettings(this); } public updateActionBar() { @@ -39,7 +97,6 @@ export class ActionBar extends common.ActionBar { if (this.navigationButton && itemId === (android).R.id.home) { this.navigationButton._raiseTap(); return true; - } return false; @@ -80,7 +137,7 @@ export class ActionBar extends common.ActionBar { } public _updateIcon(actionBar: android.app.ActionBar) { - var icon = this.icon; + var icon = this.android.icon; if (types.isDefined(icon)) { var drawableOrId = getDrawableOrResourceId(icon, this._appResources); if (drawableOrId) { @@ -92,12 +149,7 @@ export class ActionBar extends common.ActionBar { actionBar.setIcon(defaultIcon); } - var iconVisibility: boolean; - if (this.androidIconVisibility === enums.AndroidActionBarIconVisibility.always) { - iconVisibility = true; - } - - var visibility = getIconVisibility(this.androidIconVisibility); + var visibility = getIconVisibility(this.android.iconVisibility); actionBar.setDisplayShowHomeEnabled(visibility); } @@ -211,8 +263,8 @@ function getDrawableOrResourceId(icon: string, resources: android.content.res.Re return undefined; } -function getShowAsAction(menuItem: common.ActionItem): number { - switch (menuItem.androidPosition) { +function getShowAsAction(menuItem: dts.ActionItem): number { + switch (menuItem.android.position) { case enums.AndroidActionItemPosition.actionBarIfRoom: return android.view.MenuItem.SHOW_AS_ACTION_IF_ROOM; diff --git a/ui/action-bar/action-bar.d.ts b/ui/action-bar/action-bar.d.ts index 0bfc68d40..53d73e676 100644 --- a/ui/action-bar/action-bar.d.ts +++ b/ui/action-bar/action-bar.d.ts @@ -7,13 +7,13 @@ export class ActionBar extends view.View implements view.AddArrayFromBuilder, view.AddChildFromBuilder { title: string; - icon: string; - androidIconVisibility: string; navigationButton: NavigationButton; actionItems: ActionItems; titleView: view.View; + android: AndroidActionBarSettings; + page: pages.Page; shouldShow(): boolean @@ -55,6 +55,7 @@ text: string; icon: string; + actionBar: ActionBar; /** * A basic method signature to hook an event listener (shortcut alias to the addEventListener method). @@ -75,10 +76,23 @@ } export class ActionItem extends ActionItemBase { - androidPosition: string; - iosPosition: string; + ios: IOSActionItemSettings; + android: AndroidActionItemSettings; + } + + export interface AndroidActionItemSettings { + position: string; + } + + export interface IOSActionItemSettings { + position: string; } + export interface AndroidActionBarSettings { + icon: string; + iconVisibility: string; + } + export class NavigationButton extends ActionItemBase { } diff --git a/ui/action-bar/action-bar.ios.ts b/ui/action-bar/action-bar.ios.ts index 44dce1de3..694613d06 100644 --- a/ui/action-bar/action-bar.ios.ts +++ b/ui/action-bar/action-bar.ios.ts @@ -1,5 +1,5 @@ import common = require("ui/action-bar/action-bar-common"); -import definition = require("ui/action-bar"); +import dts = require("ui/action-bar"); import imageSource = require("image-source"); import frameModule = require("ui/frame"); import enums = require("ui/enums"); @@ -9,6 +9,19 @@ import utils = require("utils/utils"); declare var exports; require("utils/module-merge").merge(common, exports); +export class ActionItem extends common.ActionItemBase implements dts.ActionItem { + private _ios: dts.IOSActionItemSettings = { position: enums.IOSActionItemPosition.left }; + public get ios(): dts.IOSActionItemSettings { + return this._ios; + } + public set ios(value: dts.IOSActionItemSettings) { + throw new Error("ActionItem.android is read-only"); + } + + // Not used in IOS + public android: dts.AndroidActionItemSettings; +} + export class ActionBar extends common.ActionBar { public updateActionBar() { // Page should be attached to frame to update the action bar. @@ -75,7 +88,7 @@ export class ActionBar extends common.ActionBar { for (var i = 0; i < items.length; i++) { var barButtonItem = this.createBarButtonItem(items[i]); - if (items[i].iosPosition === enums.IOSActionItemPosition.left) { + if (items[i].ios.position === enums.IOSActionItemPosition.left) { leftBarItems.push(barButtonItem); } else { @@ -96,7 +109,7 @@ export class ActionBar extends common.ActionBar { navigationItem.setRightBarButtonItemsAnimated(rightArray, true); } - private createBarButtonItem(item: common.ActionItemBase): UIBarButtonItem { + private createBarButtonItem(item: dts.ActionItem): UIBarButtonItem { var tapHandler = TapBarItemHandlerImpl.new().initWithOwner(item); // associate handler with menuItem or it will get collected by JSC. (item).handler = tapHandler; @@ -144,7 +157,7 @@ export class ActionBar extends common.ActionBar { protected get navigationBarHeight(): number { var navController = frameModule.topmost().ios.controller; - if(!navController){ + if (!navController) { return 0; } var navigationBar = navController.navigationBar; @@ -157,9 +170,9 @@ class TapBarItemHandlerImpl extends NSObject { return super.new(); } - private _owner: definition.ActionItemBase; + private _owner: dts.ActionItemBase; - public initWithOwner(owner: definition.ActionItemBase): TapBarItemHandlerImpl { + public initWithOwner(owner: dts.ActionItemBase): TapBarItemHandlerImpl { this._owner = owner; return this; }