Skip to content

Commit 03de620

Browse files
committed
Update impl
1 parent dcf19ef commit 03de620

4 files changed

Lines changed: 25 additions & 26 deletions

File tree

android/src/main/java/com/swmansion/rnscreens/ScreenModalFragment.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import android.view.View
1010
import android.view.ViewGroup
1111
import android.view.ViewParent
1212
import android.view.WindowManager
13-
import androidx.appcompat.widget.Toolbar
1413
import androidx.fragment.app.Fragment
1514
import com.facebook.react.bridge.ReactContext
1615
import com.facebook.react.uimanager.UIManagerHelper
@@ -187,7 +186,7 @@ class ScreenModalFragment :
187186

188187
override fun removeToolbar(): Unit = throw IllegalStateException("[RNScreens] Modal screens on Android do not support header right now")
189188

190-
override fun setToolbar(toolbar: Toolbar): Unit =
189+
override fun setToolbar(toolbar: CustomToolbar): Unit =
191190
throw IllegalStateException("[RNScreens] Modal screens on Android do not support header right now")
192191

193192
override fun setToolbarShadowHidden(hidden: Boolean): Unit =

android/src/main/java/com/swmansion/rnscreens/ScreenStackFragment.kt

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import android.view.View
1414
import android.view.ViewGroup
1515
import android.view.animation.Animation
1616
import android.widget.LinearLayout
17-
import androidx.appcompat.app.ActionBar
1817
import androidx.appcompat.app.AppCompatActivity
1918
import androidx.appcompat.widget.Toolbar
2019
import androidx.coordinatorlayout.widget.CoordinatorLayout
@@ -59,7 +58,7 @@ class ScreenStackFragment :
5958
private var isToolbarShadowHidden = false
6059
private var isToolbarTranslucent = false
6160

62-
private var ownedActionBar: ActionBar? = null
61+
private var lastActiveHeaderConfig: ScreenStackHeaderConfig? = null
6362

6463
private lateinit var sheetTransitionCoordinator: BottomSheetTransitionCoordinator
6564

@@ -107,7 +106,8 @@ class ScreenStackFragment :
107106
toolbar = null
108107
}
109108

110-
override fun setToolbar(toolbar: Toolbar) {
109+
override fun setToolbar(toolbar: CustomToolbar) {
110+
lastActiveHeaderConfig = toolbar.config
111111
appBarLayout?.addView(toolbar)
112112
toolbar.layoutParams =
113113
AppBarLayout
@@ -305,10 +305,6 @@ class ScreenStackFragment :
305305
super.onViewCreated(view, savedInstanceState)
306306
}
307307

308-
internal fun onActionBarSet(actionBar: ActionBar) {
309-
ownedActionBar = actionBar
310-
}
311-
312308
override fun onDestroyView() {
313309
// ScreenStackHeaderConfig.onUpdate() calls activity.setSupportActionBar(toolbar) each time
314310
// the top screen updates. AppCompatDelegateImpl stores the resulting ToolbarActionBar in
@@ -323,16 +319,8 @@ class ScreenStackFragment :
323319
// - DebugMenuToolbar.config
324320
// - ScreenStackHeaderConfig.mParent
325321
// - Screen.fragment
326-
if (isRemoving) {
327-
ownedActionBar?.let { owned ->
328-
(activity as? AppCompatActivity)?.let { appCompat ->
329-
if (appCompat.supportActionBar === owned) {
330-
appCompat.setSupportActionBar(null)
331-
}
332-
}
333-
}
334-
ownedActionBar = null
335-
}
322+
lastActiveHeaderConfig?.clearActionBarIfOwned(activity as? AppCompatActivity)
323+
lastActiveHeaderConfig = null
336324
super.onDestroyView()
337325
}
338326

android/src/main/java/com/swmansion/rnscreens/ScreenStackFragmentWrapper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ interface ScreenStackFragmentWrapper : ScreenFragmentWrapper {
66
// Toolbar management
77
fun removeToolbar()
88

9-
fun setToolbar(toolbar: Toolbar)
9+
fun setToolbar(toolbar: CustomToolbar)
1010

1111
fun setToolbarShadowHidden(hidden: Boolean)
1212

android/src/main/java/com/swmansion/rnscreens/ScreenStackHeaderConfig.kt

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import android.view.Gravity
99
import android.view.View.OnClickListener
1010
import android.widget.ImageView
1111
import android.widget.TextView
12+
import androidx.appcompat.app.ActionBar
1213
import androidx.appcompat.app.AppCompatActivity
1314
import androidx.appcompat.widget.Toolbar
1415
import androidx.fragment.app.Fragment
@@ -58,6 +59,7 @@ class ScreenStackHeaderConfig(
5859
private var isBackButtonHidden = false
5960
private var isShadowHidden = false
6061
private var isDestroyed = false
62+
private var actionBar: ActionBar? = null
6163
private var backButtonInCustomView = false
6264
private var tintColor = 0
6365
private var isAttachedToWindow = false
@@ -113,6 +115,17 @@ class ScreenStackHeaderConfig(
113115
isDestroyed = true
114116
}
115117

118+
internal fun clearActionBarIfOwned(activity: AppCompatActivity?) {
119+
actionBar?.let { ownedActionBar ->
120+
activity?.let { appCompat ->
121+
if (appCompat.supportActionBar === ownedActionBar) {
122+
appCompat.setSupportActionBar(null)
123+
}
124+
}
125+
}
126+
actionBar = null
127+
}
128+
116129
/**
117130
* Native toolbar should notify the header config component that it has completed its layout.
118131
*/
@@ -243,17 +256,16 @@ class ScreenStackHeaderConfig(
243256

244257
activity.setSupportActionBar(toolbar)
245258
// non-null toolbar is set in the line above and it is used here
246-
val actionBar = requireNotNull(activity.supportActionBar)
247-
// notify the fragment so it can clear this action bar reference when being removed.
248-
screenFragment?.onActionBarSet(actionBar)
259+
val newActionBar = requireNotNull(activity.supportActionBar)
260+
actionBar = newActionBar
249261

250262
// hide back button
251-
actionBar.setDisplayHomeAsUpEnabled(
263+
newActionBar.setDisplayHomeAsUpEnabled(
252264
screenFragment?.canNavigateBack() == true && !isBackButtonHidden,
253265
)
254266

255267
// title
256-
actionBar.title = title
268+
newActionBar.title = title
257269
if (TextUtils.isEmpty(title)) {
258270
isTitleEmpty = true
259271
}
@@ -327,7 +339,7 @@ class ScreenStackHeaderConfig(
327339
?: throw JSApplicationIllegalArgumentException(
328340
"Back button header config view should have Image as first child",
329341
)
330-
actionBar.setHomeAsUpIndicator(firstChild.drawable)
342+
newActionBar.setHomeAsUpIndicator(firstChild.drawable)
331343
i++
332344
continue
333345
}

0 commit comments

Comments
 (0)