feat(frame): handle back navigation when common layout is used as a root element (#5608)

* test(e2e): update modal navigation app

Add layout as root.
Add show modal layout.

* chore(frame): move frame stack modifiers in a separate frame-stack module

* feat(frame): handle back navigation when using common layout as root element
This commit is contained in:
Alexander Djenkov
2018-04-02 22:27:44 +03:00
committed by Svetoslav
parent 8a1958e82e
commit 70f01123df
12 changed files with 161 additions and 48 deletions

View File

@ -263,7 +263,7 @@ export abstract class ViewCommon extends ViewBase implements ViewDefinition {
that._closeModalCallback = null;
that._dialogClosed();
parent._modal = null;
if (typeof closeCallback === "function") {
closeCallback.apply(undefined, arguments);
}
@ -976,6 +976,18 @@ export abstract class ViewCommon extends ViewBase implements ViewDefinition {
_onDetachedFromWindow(): void {
//
}
_hasAncestorView(ancestorView: ViewDefinition): boolean {
let matcher = (view: ViewDefinition) => view === ancestorView;
for (let parent = this.parent; parent != null; parent = parent.parent) {
if (matcher(<ViewDefinition>parent)) {
return true;
}
}
return false;
}
}
export const automationTextProperty = new Property<ViewCommon, string>({ name: "automationText" });

View File

@ -22,6 +22,7 @@ import {
import { Background, ad as androidBackground } from "../../styling/background";
import { profile } from "../../../profiling";
import { topmost } from "../../frame/frame-stack";
export * from "./view-common";
@ -287,6 +288,18 @@ export class View extends ViewCommon {
super.onUnloaded();
}
public onBackPressed(): boolean {
let topmostFrame = topmost();
// Delegate back navigation handling to the topmost Frame
// when it's a child of the current View.
if (topmostFrame && topmostFrame._hasAncestorView(this)) {
return topmostFrame.onBackPressed();
}
return false;
}
private hasGestureObservers() {
return this._gestureObservers && Object.keys(this._gestureObservers).length > 0
}

View File

@ -110,7 +110,7 @@ export abstract class View extends ViewBase {
* String value used when hooking to shownModally event.
*/
public static shownModallyEvent: string;
/**
* Gets the android-specific native instance that lies behind this proxy. Will be available if running on an Android platform.
*/
@ -705,6 +705,11 @@ export abstract class View extends ViewBase {
* Called in android when native view is dettached from window.
*/
_onDetachedFromWindow(): void;
/**
* Checks whether the current view has specific view for an ancestor.
*/
_hasAncestorView(ancestorView: View): boolean;
//@endprivate
/**
@ -797,7 +802,7 @@ export const isEnabledProperty: Property<View, boolean>;
export const isUserInteractionEnabledProperty: Property<View, boolean>;
export namespace ios {
export function isContentScrollable(controller: any /* UIViewController */, owner: View): boolean
export function isContentScrollable(controller: any /* UIViewController */, owner: View): boolean
export function updateAutoAdjustScrollInsets(controller: any /* UIViewController */, owner: View): void
export function updateConstraints(controller: any /* UIViewController */, owner: View): void;
export function layoutView(controller: any /* UIViewController */, owner: View): void;