Merge pull request #4202 from NativeScript/app-displayed-event

App "displayed" event
This commit is contained in:
Panayot Cankov
2017-05-17 09:31:08 +03:00
committed by GitHub
4 changed files with 38 additions and 4 deletions

View File

@ -21,6 +21,7 @@ import { UnhandledErrorEventData, iOSApplication, AndroidApplication, CssChanged
export const launchEvent = "launch";
export const suspendEvent = "suspend";
export const displayedEvent = "displayed";
export const resumeEvent = "resume";
export const exitEvent = "exit";
export const lowMemoryEvent = "lowMemory";
@ -45,6 +46,7 @@ export let ios = undefined;
export const on: typeof events.on = events.on.bind(events);
export const off: typeof events.off = events.off.bind(events);
export const notify: typeof events.notify = events.notify.bind(events);
export const hasListeners: typeof events.hasListeners = events.hasListeners.bind(events);
let app: iOSApplication | AndroidApplication;
export function setApplication(instance: iOSApplication | AndroidApplication): void {

View File

@ -4,7 +4,7 @@
} from ".";
import {
notify, lowMemoryEvent, orientationChangedEvent, suspendEvent, resumeEvent,
notify, hasListeners, lowMemoryEvent, orientationChangedEvent, suspendEvent, resumeEvent, displayedEvent,
setApplication, livesync, Observable
} from "./application-common";
@ -181,7 +181,19 @@ function initLifecycleCallbacks() {
androidApp.startActivity = activity;
}
androidApp.notify(<AndroidActivityBundleEventData>{ eventName: ActivityCreated, object: androidApp, activity: activity, bundle: savedInstanceState });
androidApp.notify(<AndroidActivityBundleEventData>{ eventName: ActivityCreated, object: androidApp, activity, bundle: savedInstanceState });
if (hasListeners(displayedEvent)) {
let rootView = activity.findViewById((<any>android).R.id.content);
let onGlobalLayoutListener = new android.view.ViewTreeObserver.OnGlobalLayoutListener({
onGlobalLayout() {
notify({ eventName: displayedEvent, object: androidApp, activity });
let viewTreeObserver = rootView.getViewTreeObserver();
viewTreeObserver.removeOnGlobalLayoutListener(onGlobalLayoutListener);
}
});
rootView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener);
}
},
onActivityDestroyed: function (activity: android.app.Activity) {

View File

@ -11,6 +11,11 @@ import { NavigationEntry, View, Observable, EventData } from "../ui/frame";
*/
export var launchEvent: string;
/**
* String value used when hooking to displayed event.
*/
export var displayedEvent: string;
/**
* String value used when hooking to uncaughtError event.
*/
@ -189,6 +194,13 @@ export function hasListeners(eventName: string): boolean;
*/
export function on(event: "launch", callback: (args: LaunchEventData) => void, thisArg?: any);
/**
* This event is raised after the application has performed most of its startup actions.
* Its intent is to be suitable for measuring app startup times.
* @experimental
*/
export function on(event: "displayed", callback: (args: EventData) => void, thisArg?: any);
/**
* This event is raised when the Application is suspended.
*/

View File

@ -2,7 +2,7 @@
import {
notify, launchEvent, resumeEvent, suspendEvent, exitEvent, lowMemoryEvent,
orientationChangedEvent, setApplication, livesync
orientationChangedEvent, setApplication, livesync, displayedEvent
} from "./application-common";
// First reexport so that app module is initialized.
@ -16,6 +16,8 @@ class Responder extends UIResponder {
//
}
let displayedOnce = false;
class Window extends UIWindow {
public content;
@ -138,7 +140,13 @@ class IOSApplication implements IOSApplicationDefinition {
}
private didBecomeActive(notification: NSNotification) {
notify(<ApplicationEventData>{ eventName: resumeEvent, object: this, ios: utils.ios.getter(UIApplication, UIApplication.sharedApplication) });
let ios = utils.ios.getter(UIApplication, UIApplication.sharedApplication);
let object = this;
notify(<ApplicationEventData>{ eventName: resumeEvent, object, ios });
if (!displayedOnce) {
notify(<ApplicationEventData>{ eventName: displayedEvent, object, ios });
displayedOnce = true;
}
}
private didEnterBackground(notification: NSNotification) {