From 26679d42ff41ecd483295c6e824749863cad6cc2 Mon Sep 17 00:00:00 2001 From: Martin Yankov Date: Mon, 25 Mar 2019 14:07:23 +0200 Subject: [PATCH 1/3] refactor(): add better err msg for missing main entry (#7063) --- tns-core-modules/application/application.ios.ts | 7 +++---- tns-core-modules/ui/frame/frame.android.ts | 4 ++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/tns-core-modules/application/application.ios.ts b/tns-core-modules/application/application.ios.ts index df635cf5f..5d49fb857 100644 --- a/tns-core-modules/application/application.ios.ts +++ b/tns-core-modules/application/application.ios.ts @@ -273,16 +273,15 @@ function createRootView(v?: View) { let rootView = v; if (!rootView) { // try to navigate to the mainEntry (if specified) - if (mainEntry) { + if (!mainEntry) { + throw new Error("Main entry is missing. App cannot be started. Verify app bootstrap."); + } else { if (createRootFrame.value) { const frame = rootView = new Frame(); frame.navigate(mainEntry); } else { rootView = createViewFromEntry(mainEntry); } - } else { - // TODO: Throw an exception? - throw new Error("A Frame must be used to navigate to a Page."); } } diff --git a/tns-core-modules/ui/frame/frame.android.ts b/tns-core-modules/ui/frame/frame.android.ts index 387c9b193..f2a9ef38e 100644 --- a/tns-core-modules/ui/frame/frame.android.ts +++ b/tns-core-modules/ui/frame/frame.android.ts @@ -1171,6 +1171,10 @@ class ActivityCallbacksImplementation implements AndroidActivityCallbacks { if (!rootView) { const mainEntry = application.getMainEntry(); + if (!mainEntry) { + throw new Error("Main entry is missing. App cannot be started. Verify app bootstrap."); + } + const intent = activity.getIntent(); if (fireLaunchEvent) { From 761cd47360e9a8feba745fd999fa5a26add50b37 Mon Sep 17 00:00:00 2001 From: Manol Donev Date: Mon, 25 Mar 2019 16:04:48 +0200 Subject: [PATCH 2/3] chore: fix app.start deprecation (#7067) --- tns-core-modules/application/application.android.ts | 10 +++++++--- tns-core-modules/application/application.ios.ts | 11 +++++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/tns-core-modules/application/application.android.ts b/tns-core-modules/application/application.android.ts index 1d2f0c76b..14ff82693 100644 --- a/tns-core-modules/application/application.android.ts +++ b/tns-core-modules/application/application.android.ts @@ -131,9 +131,8 @@ let mainEntry: NavigationEntry; let started = false; // NOTE: for backwards compatibility. Remove for 4.0.0. const createRootFrame = { value: true }; -export function start(entry?: NavigationEntry | string) { - console.log("application.start() is deprecated; use application.run() instead"); +function _start(entry?: NavigationEntry | string) { if (started) { throw new Error("Application is already started."); } @@ -146,13 +145,18 @@ export function start(entry?: NavigationEntry | string) { } } +export function start(entry?: NavigationEntry | string) { + console.log("application.start() is deprecated; use application.run() instead"); + _start(entry); +} + export function shouldCreateRootFrame(): boolean { return createRootFrame.value; } export function run(entry?: NavigationEntry | string) { createRootFrame.value = false; - start(entry); + _start(entry); } const CALLBACKS = "_callbacks"; diff --git a/tns-core-modules/application/application.ios.ts b/tns-core-modules/application/application.ios.ts index 5d49fb857..53941c9ef 100644 --- a/tns-core-modules/application/application.ios.ts +++ b/tns-core-modules/application/application.ios.ts @@ -299,9 +299,7 @@ export function getRootView() { // NOTE: for backwards compatibility. Remove for 4.0.0. const createRootFrame = { value: true }; let started: boolean = false; -export function start(entry?: string | NavigationEntry) { - console.log("application.start() is deprecated; use application.run() instead"); - +function _start(entry?: string | NavigationEntry) { mainEntry = typeof entry === "string" ? { moduleName: entry } : entry; started = true; @@ -333,9 +331,14 @@ export function start(entry?: string | NavigationEntry) { } } +export function start(entry?: string | NavigationEntry) { + console.log("application.start() is deprecated; use application.run() instead"); + _start(entry); +} + export function run(entry?: string | NavigationEntry) { createRootFrame.value = false; - start(entry); + _start(entry); } export function _resetRootView(entry?: NavigationEntry | string) { From 4f0d6d36e361f2ddb9ece914fe18ce4b24fba989 Mon Sep 17 00:00:00 2001 From: Martin Yankov Date: Tue, 26 Mar 2019 12:35:43 +0200 Subject: [PATCH 3/3] refactor: guard ng and vue entry points (#7071) --- tns-core-modules/ui/frame/frame.android.ts | 64 ++++++++++++---------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/tns-core-modules/ui/frame/frame.android.ts b/tns-core-modules/ui/frame/frame.android.ts index f2a9ef38e..f3f2decbe 100644 --- a/tns-core-modules/ui/frame/frame.android.ts +++ b/tns-core-modules/ui/frame/frame.android.ts @@ -1171,46 +1171,50 @@ class ActivityCallbacksImplementation implements AndroidActivityCallbacks { if (!rootView) { const mainEntry = application.getMainEntry(); - if (!mainEntry) { - throw new Error("Main entry is missing. App cannot be started. Verify app bootstrap."); - } - const intent = activity.getIntent(); if (fireLaunchEvent) { + // entry point for Angular and Vue frameworks rootView = notifyLaunch(intent, savedInstanceState); } - if (shouldCreateRootFrame) { - const extras = intent.getExtras(); - let frameId = -1; - - // We have extras when we call - new Frame().navigate(); - // savedInstanceState is used when activity is recreated. - // NOTE: On API 23+ we get extras on first run. - // Check changed - first try to get frameId from Extras if not from saveInstanceState. - if (extras) { - frameId = extras.getInt(INTENT_EXTRA, -1); + if (!rootView) { + // entry point for NS Core + if (!mainEntry) { + // Also handles scenarios with Angular and Vue where the notifyLaunch didn't return a root view. + throw new Error("Main entry is missing. App cannot be started. Verify app bootstrap."); } - if (savedInstanceState && frameId < 0) { - frameId = savedInstanceState.getInt(INTENT_EXTRA, -1); - } - - if (!rootView) { - // If we have frameId from extras - we are starting a new activity from navigation (e.g. new Frame().navigate())) - // Then we check if we have frameId from savedInstanceState - this happens when Activity is destroyed but app was not (e.g. suspend) - rootView = getFrameByNumberId(frameId) || new Frame(); - } - - if (rootView instanceof Frame) { - rootView.navigate(mainEntry); + if (shouldCreateRootFrame) { + const extras = intent.getExtras(); + let frameId = -1; + + // We have extras when we call - new Frame().navigate(); + // savedInstanceState is used when activity is recreated. + // NOTE: On API 23+ we get extras on first run. + // Check changed - first try to get frameId from Extras if not from saveInstanceState. + if (extras) { + frameId = extras.getInt(INTENT_EXTRA, -1); + } + + if (savedInstanceState && frameId < 0) { + frameId = savedInstanceState.getInt(INTENT_EXTRA, -1); + } + + if (!rootView) { + // If we have frameId from extras - we are starting a new activity from navigation (e.g. new Frame().navigate())) + // Then we check if we have frameId from savedInstanceState - this happens when Activity is destroyed but app was not (e.g. suspend) + rootView = getFrameByNumberId(frameId) || new Frame(); + } + + if (rootView instanceof Frame) { + rootView.navigate(mainEntry); + } else { + throw new Error("A Frame must be used to navigate to a Page."); + } } else { - throw new Error("A Frame must be used to navigate to a Page."); + rootView = createViewFromEntry(mainEntry); } - } else { - // Create the root view if the notifyLaunch didn't return it - rootView = rootView || createViewFromEntry(mainEntry); } this._rootView = rootView;