Skip to content

Commit 0002624

Browse files
authored
feat(frame): add new actionBarVisibility property (#6449)
1 parent af651d6 commit 0002624

6 files changed

Lines changed: 132 additions & 22 deletions

File tree

‎tests/app/ui/action-bar/action-bar-tests-common.ts‎

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import * as builder from "tns-core-modules/ui/builder";
44
import { Label } from "tns-core-modules/ui/label";
55
import { Button } from "tns-core-modules/ui/button";
66
import { Page } from "tns-core-modules/ui/page";
7-
import { View } from "tns-core-modules/ui/core/view";
7+
import { View, isIOS } from "tns-core-modules/ui/core/view";
88
import { fromObject } from "tns-core-modules/data/observable";
9+
import { topmost } from "tns-core-modules/ui/frame";
910

1011
// >> actionbar-common-require
1112
import * as actionBarModule from "tns-core-modules/ui/action-bar";
@@ -302,6 +303,87 @@ export function test_LoadedEventsOrder_WithoutPageContent() {
302303
TKUnit.arrayAssert(loadedEvents, new Array<string>("action-bar", "page"));
303304
}
304305

306+
export function test_ActionBarVisibility_Never_ShouldNotShowDeclaredActionBar() {
307+
const frame = topmost();
308+
frame.actionBarVisibility = "never";
309+
310+
const page = <Page>builder.parse(
311+
`<Page>
312+
<ActionBar>
313+
<ActionBar.titleView>
314+
<Button text="test" />
315+
</ActionBar.titleView>
316+
</ActionBar>
317+
</Page>
318+
`);
319+
320+
helper.navigate(() => page);
321+
let actionBarHidden = false;
322+
if (isIOS) {
323+
actionBarHidden = page.actionBar.nativeView.hidden;
324+
} else {
325+
actionBarHidden = !page.actionBar.nativeView.isShown();
326+
}
327+
TKUnit.assertTrue(actionBarHidden, `ActionBar hidden: expected true, actual ${actionBarHidden}`);
328+
329+
// restore default actionBarVisibility
330+
frame.actionBarVisibility = "auto";
331+
}
332+
333+
export function test_ActionBarVisibility_Always_ShouldShownHiddenActionBar() {
334+
const frame = topmost();
335+
frame.actionBarVisibility = "always";
336+
337+
const page = <Page>builder.parse(
338+
`<Page actionBarHidden="true">
339+
<ActionBar>
340+
<ActionBar.titleView>
341+
<Button text="test" />
342+
</ActionBar.titleView>
343+
</ActionBar>
344+
</Page>
345+
`);
346+
347+
helper.navigate(() => page);
348+
let actionBarHidden = false;
349+
if (isIOS) {
350+
actionBarHidden = page.actionBar.nativeView.hidden;
351+
} else {
352+
actionBarHidden = !page.actionBar.nativeView.isShown();
353+
}
354+
TKUnit.assertFalse(actionBarHidden, `ActionBar hidden: expected false, actual ${actionBarHidden}`);
355+
356+
// restore default actionBarVisibility
357+
frame.actionBarVisibility = "auto";
358+
}
359+
360+
export function test_ActionBarVisibility_Auto_ShouldRespectPageActionBarHiddenProperty() {
361+
const frame = topmost();
362+
frame.actionBarVisibility = "auto";
363+
364+
const page = <Page>builder.parse(
365+
`<Page actionBarHidden="true">
366+
<ActionBar>
367+
<ActionBar.titleView>
368+
<Button text="test" />
369+
</ActionBar.titleView>
370+
</ActionBar>
371+
</Page>
372+
`);
373+
374+
helper.navigate(() => page);
375+
let actionBarHidden = false;
376+
if (isIOS) {
377+
actionBarHidden = page.actionBar.nativeView.hidden;
378+
} else {
379+
actionBarHidden = !page.actionBar.nativeView.isShown();
380+
}
381+
TKUnit.assertTrue(actionBarHidden, `ActionBar hidden: expected true, actual ${actionBarHidden}`);
382+
383+
// restore default actionBarVisibility
384+
frame.actionBarVisibility = "auto";
385+
}
386+
305387
export function test_setId() {
306388
const pageFactory = function (): Page {
307389
const page = new Page();

‎tests/app/ui/action-bar/action-bar-tests.ios.ts‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ export function test_NavBar_isVisible_when_MenuItems_areSet() {
1717

1818
var handler = function (data) {
1919
page.off(PageModule.Page.navigatedToEvent, handler);
20-
navBarIsVisible = (<any>page.frame.ios).showNavigationBar;
20+
navBarIsVisible = !page.actionBar.nativeView.hidden;
21+
console.log(navBarIsVisible);
22+
console.log(page.actionBar.nativeView.hidden);
2123
}
2224

2325
var pageFactory = function (): PageModule.Page {

‎tns-core-modules/ui/frame/frame-common.ts‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export class FrameBase extends CustomLayoutView implements FrameDefinition {
4242
private _backStack = new Array<BackstackEntry>();
4343
private _navigationQueue = new Array<NavigationContext>();
4444

45+
public actionBarVisibility: "auto" | "never" | "always";
4546
public _currentEntry: BackstackEntry;
4647
public _executingEntry: BackstackEntry;
4748
public _isInFrameStack = false;
@@ -612,5 +613,7 @@ export const defaultPage = new Property<FrameBase, string>({
612613
frame.navigate({ moduleName: newValue });
613614
}
614615
});
616+
defaultPage.register(FrameBase)
615617

616-
defaultPage.register(FrameBase)
618+
export const actionBarVisibilityProperty = new Property<FrameBase, "auto" | "never" | "always">({ name: "actionBarVisibility", defaultValue: "auto", affectsLayout: isIOS });
619+
actionBarVisibilityProperty.register(FrameBase);

‎tns-core-modules/ui/frame/frame.android.ts‎

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -436,15 +436,24 @@ export class Frame extends FrameBase {
436436
}
437437

438438
public _getNavBarVisible(page: Page): boolean {
439-
if (page.actionBarHidden !== undefined) {
440-
return !page.actionBarHidden;
441-
}
442-
443-
if (this._android && this._android.showActionBar !== undefined) {
444-
return this._android.showActionBar;
439+
switch (this.actionBarVisibility) {
440+
case "never":
441+
return false;
442+
443+
case "always":
444+
return true;
445+
446+
default:
447+
if (page.actionBarHidden !== undefined) {
448+
return !page.actionBarHidden;
449+
}
450+
451+
if (this._android && this._android.showActionBar !== undefined) {
452+
return this._android.showActionBar;
453+
}
454+
455+
return true;
445456
}
446-
447-
return true;
448457
}
449458

450459
public _saveFragmentsState(): void {

‎tns-core-modules/ui/frame/frame.d.ts‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ export class Frame extends View {
5656
*/
5757
navigate(entry: NavigationEntry);
5858

59+
/**
60+
* Used to control the visibility the Navigation Bar in iOS and the Action Bar in Android.
61+
*/
62+
public actionBarVisibility: "auto" | "never" | "always";
63+
5964
/**
6065
* Gets the back stack of this instance.
6166
*/

‎tns-core-modules/ui/frame/frame.ios.ts‎

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -208,25 +208,34 @@ export class Frame extends FrameBase {
208208
}
209209

210210
public _getNavBarVisible(page: Page): boolean {
211-
switch (this._ios.navBarVisibility) {
211+
switch (this.actionBarVisibility) {
212212
case "always":
213213
return true;
214214

215215
case "never":
216216
return false;
217217

218218
case "auto":
219-
let newValue: boolean;
220-
221-
if (page && page.actionBarHidden !== undefined) {
222-
newValue = !page.actionBarHidden;
223-
}
224-
else {
225-
newValue = this.ios.controller.viewControllers.count > 1 || (page && page.actionBar && !page.actionBar._isEmpty());
219+
switch (this._ios.navBarVisibility) {
220+
case "always":
221+
return true;
222+
223+
case "never":
224+
return false;
225+
226+
case "auto":
227+
let newValue: boolean;
228+
229+
if (page && page.actionBarHidden !== undefined) {
230+
newValue = !page.actionBarHidden;
231+
}
232+
else {
233+
newValue = this.ios.controller.viewControllers.count > 1 || (page && page.actionBar && !page.actionBar._isEmpty());
234+
}
235+
236+
newValue = !!newValue; // Make sure it is boolean
237+
return newValue;
226238
}
227-
228-
newValue = !!newValue; // Make sure it is boolean
229-
return newValue;
230239
}
231240
}
232241

0 commit comments

Comments
 (0)