From 6b41268a08fff0b82bf044f7a8a6c6f95fcd60f6 Mon Sep 17 00:00:00 2001 From: Eduardo Speroni Date: Thu, 17 Feb 2022 23:36:54 -0300 Subject: [PATCH] fix(android): edge cases and compatibility with fragments 1.2.x (#9782) --- packages/core/ui/frame/fragment.transitions.android.ts | 4 ++++ packages/core/ui/frame/index.android.ts | 10 +++++++--- packages/core/ui/tab-view/index.android.ts | 7 ++++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/core/ui/frame/fragment.transitions.android.ts b/packages/core/ui/frame/fragment.transitions.android.ts index 638c3297e..4679cecf5 100644 --- a/packages/core/ui/frame/fragment.transitions.android.ts +++ b/packages/core/ui/frame/fragment.transitions.android.ts @@ -342,6 +342,7 @@ function getTransitionListener(entry: ExpandedEntry, transition: androidx.transi public onTransitionStart(transition: androidx.transition.Transition): void { const entry = this.entry; + entry.isAnimationRunning = true; addToWaitingQueue(entry); if (Trace.isEnabled()) { Trace.write(`START ${toShortString(transition)} transition for ${entry.fragmentTag}`, Trace.categories.Transition); @@ -353,6 +354,7 @@ function getTransitionListener(entry: ExpandedEntry, transition: androidx.transi if (Trace.isEnabled()) { Trace.write(`END ${toShortString(transition)} transition for ${entry.fragmentTag}`, Trace.categories.Transition); } + entry.isAnimationRunning = false; transitionOrAnimationCompleted(entry, this.backEntry); } @@ -370,6 +372,8 @@ function getTransitionListener(entry: ExpandedEntry, transition: androidx.transi } onTransitionCancel(transition: androidx.transition.Transition): void { + const entry = this.entry; + entry.isAnimationRunning = false; if (Trace.isEnabled()) { Trace.write(`CANCEL ${toShortString(transition)} transition for ${this.entry.fragmentTag}`, Trace.categories.Transition); } diff --git a/packages/core/ui/frame/index.android.ts b/packages/core/ui/frame/index.android.ts index 94528c1fe..02f43c42c 100644 --- a/packages/core/ui/frame/index.android.ts +++ b/packages/core/ui/frame/index.android.ts @@ -1024,9 +1024,13 @@ class FragmentCallbacksImplementation implements AndroidFragmentCallbacks { // we depend on the animation (even None animation) to set the entry as the current entry // animation should start between start and resume, so if we have an executing navigation here it probably means the animation was skipped // so we manually set the entry - if (frame._executingContext && !(this.entry).isAnimationRunning) { - frame.setCurrent(this.entry, frame._executingContext.navigationType); - } + // also, to be compatible with fragments 1.2.x we need this setTimeout as animations haven't run on onResume yet + setTimeout(() => { + if (frame._executingContext && !(this.entry).isAnimationRunning) { + frame.setCurrent(this.entry, frame._executingContext.navigationType); + } + }, 0); + superFunc.call(fragment); } diff --git a/packages/core/ui/tab-view/index.android.ts b/packages/core/ui/tab-view/index.android.ts index 40d6b7fad..9c012d760 100644 --- a/packages/core/ui/tab-view/index.android.ts +++ b/packages/core/ui/tab-view/index.android.ts @@ -136,6 +136,9 @@ function initializeNativeClasses() { public items: Array; private mCurTransaction: androidx.fragment.app.FragmentTransaction; private mCurrentPrimaryItem: androidx.fragment.app.Fragment; + // in fragments 1.3+, committing a transaction may call the adapter's methods and trigger another commit + // we prevent that here. + private transactionRunning = false; constructor(public owner: TabView) { super(); @@ -270,8 +273,10 @@ function initializeNativeClasses() { } private _commitCurrentTransaction() { - if (this.mCurTransaction != null) { + if (this.mCurTransaction != null && !this.transactionRunning) { + this.transactionRunning = true; this.mCurTransaction.commitNowAllowingStateLoss(); + this.transactionRunning = false; this.mCurTransaction = null; } }