diff --git a/android/modules/android/src/java/org/appcelerator/titanium/proxy/TiActivityWindowProxy.java b/android/modules/android/src/java/org/appcelerator/titanium/proxy/TiActivityWindowProxy.java index 696dae5d1ea..da3a9c96119 100644 --- a/android/modules/android/src/java/org/appcelerator/titanium/proxy/TiActivityWindowProxy.java +++ b/android/modules/android/src/java/org/appcelerator/titanium/proxy/TiActivityWindowProxy.java @@ -9,6 +9,7 @@ import org.appcelerator.kroll.KrollDict; import org.appcelerator.kroll.annotations.Kroll; import org.appcelerator.kroll.common.Log; +import org.appcelerator.titanium.TiC; import org.appcelerator.titanium.view.TiUIActivityWindow; import org.appcelerator.titanium.view.TiUIView; @@ -40,7 +41,7 @@ protected void handleClose(@NonNull KrollDict options) { Log.d(TAG, "handleClose", Log.DEBUG_MODE); opened = false; - fireEvent("close", null); + fireEvent(TiC.EVENT_CLOSE, null); if (view != null) { ((TiUIActivityWindow) view).close(); diff --git a/android/modules/ui/src/java/ti/modules/titanium/ui/NavigationWindowProxy.java b/android/modules/ui/src/java/ti/modules/titanium/ui/NavigationWindowProxy.java index 90b1eb49674..d39b7e58e09 100644 --- a/android/modules/ui/src/java/ti/modules/titanium/ui/NavigationWindowProxy.java +++ b/android/modules/ui/src/java/ti/modules/titanium/ui/NavigationWindowProxy.java @@ -6,6 +6,7 @@ */ package ti.modules.titanium.ui; +import org.appcelerator.kroll.KrollDict; import org.appcelerator.kroll.KrollPromise; import org.appcelerator.kroll.annotations.Kroll; import org.appcelerator.titanium.TiC; @@ -14,6 +15,8 @@ import java.util.ArrayList; import java.util.List; +import androidx.annotation.NonNull; + @Kroll.proxy(creatableInModule = UIModule.class) public class NavigationWindowProxy extends WindowProxy { @@ -55,17 +58,19 @@ public void popToRootWindow(@Kroll.argument(optional = true) Object arg) } } - @Override - @Kroll.method - public void close(@Kroll.argument(optional = true) Object arg) + protected void handleClose(@NonNull KrollDict options) { if (opened) { opened = false; - popToRootWindow(arg); - closeWindow(windows.get(0), arg); // close the root window + popToRootWindow(options); + closeWindow(windows.get(0), options); // close the root window fireEvent(TiC.EVENT_CLOSE, null); + if (closePromise != null) { + closePromise.resolve(null); + closePromise = null; + } } - super.close(arg); + super.handleClose(options); } @Kroll.method diff --git a/android/modules/ui/src/java/ti/modules/titanium/ui/WindowProxy.java b/android/modules/ui/src/java/ti/modules/titanium/ui/WindowProxy.java index 95925638856..f4481e24bdf 100644 --- a/android/modules/ui/src/java/ti/modules/titanium/ui/WindowProxy.java +++ b/android/modules/ui/src/java/ti/modules/titanium/ui/WindowProxy.java @@ -131,15 +131,6 @@ public KrollPromise open(@Kroll.argument(optional = true) Object arg) return super.open(arg); } - @Override - public void close(@Kroll.argument(optional = true) Object arg) - { - if (!(opened || opening)) { - return; - } - super.close(arg); - } - @Override protected void handleOpen(KrollDict options) { diff --git a/android/titanium/src/java/org/appcelerator/titanium/proxy/TiWindowProxy.java b/android/titanium/src/java/org/appcelerator/titanium/proxy/TiWindowProxy.java index 1d02fb77693..496031581cc 100644 --- a/android/titanium/src/java/org/appcelerator/titanium/proxy/TiWindowProxy.java +++ b/android/titanium/src/java/org/appcelerator/titanium/proxy/TiWindowProxy.java @@ -73,7 +73,8 @@ public abstract class TiWindowProxy extends TiViewProxy protected boolean windowActivityCreated = false; protected List> sharedElementPairs; public TiWindowProxy navigationWindow; - private KrollPromise openPromise; + protected KrollPromise openPromise; + protected KrollPromise closePromise; public interface PostOpenListener { void onPostOpen(TiWindowProxy window); @@ -107,10 +108,10 @@ public KrollPromise open(@Kroll.argument(optional = true) Object arg) promise.reject(new Throwable("Window is already opened or opening.")); }); } + opening = true; + waitingForOpen = new WeakReference(this); openPromise = KrollPromise.create((promise) -> { - waitingForOpen = new WeakReference(this); - opening = true; KrollDict options = null; TiAnimation animation = null; @@ -149,27 +150,36 @@ public boolean isFocused() @SuppressWarnings("unchecked") @Kroll.method - public void close(@Kroll.argument(optional = true) Object arg) + public KrollPromise close(@Kroll.argument(optional = true) Object arg) { - // TODO: if not opened, ignore? We do this in WindowProxy subclass, but not the other two... - KrollDict options = null; - TiAnimation animation = null; + if (!(opened || opening)) { + return KrollPromise.create((promise) -> { + promise.reject(new Throwable("Window is not open or opening, so cannot be closed.")); + }); + } + + // FIXME: Can we "cancel" the open() promise if it's not finished? + closePromise = KrollPromise.create((promise) -> { + KrollDict options = null; + TiAnimation animation = null; - if (arg != null) { - if (arg instanceof HashMap) { - options = new KrollDict((HashMap) arg); + if (arg != null) { + if (arg instanceof HashMap) { + options = new KrollDict((HashMap) arg); - } else if (arg instanceof TiAnimation) { + } else if (arg instanceof TiAnimation) { + options = new KrollDict(); + options.put("_anim", animation); + } + + } else { options = new KrollDict(); - options.put("_anim", animation); } - } else { - options = new KrollDict(); - } - - handleClose(options); - // FIXME: Maybe fire the close event here and set opened to false as well, rather than leaving to subclasses? + handleClose(options); + // FIXME: Maybe fire the close event here and set opened to false as well, rather than leaving to subclasses? + }); + return closePromise; } public void closeFromActivity(boolean activityIsFinishing) @@ -196,6 +206,10 @@ public void closeFromActivity(boolean activityIsFinishing) // And it will dispose the handler of the window in the JS if the activity // is not forced to destroy. fireSyncEvent(TiC.EVENT_CLOSE, data); + if (closePromise != null) { + closePromise.resolve(null); + closePromise = null; // FIXME: call release() first? + } } public void addProxyWaitingForActivity(KrollProxy waitingProxy)