@@ -14,6 +14,8 @@ import android.view.View
1414import android.view.ViewGroup
1515import android.view.animation.Animation
1616import android.widget.LinearLayout
17+ import androidx.appcompat.app.ActionBar
18+ import androidx.appcompat.app.AppCompatActivity
1719import androidx.appcompat.widget.Toolbar
1820import androidx.coordinatorlayout.widget.CoordinatorLayout
1921import androidx.core.view.ViewCompat
@@ -57,6 +59,8 @@ class ScreenStackFragment :
5759 private var isToolbarShadowHidden = false
5860 private var isToolbarTranslucent = false
5961
62+ private var ownedActionBar: ActionBar ? = null
63+
6064 private lateinit var sheetTransitionCoordinator: BottomSheetTransitionCoordinator
6165
6266 private var lastFocusedChild: View ? = null
@@ -301,6 +305,37 @@ class ScreenStackFragment :
301305 super .onViewCreated(view, savedInstanceState)
302306 }
303307
308+ internal fun onActionBarSet (actionBar : ActionBar ) {
309+ ownedActionBar = actionBar
310+ }
311+
312+ override fun onDestroyView () {
313+ // ScreenStackHeaderConfig.onUpdate() calls activity.setSupportActionBar(toolbar) each time
314+ // the top screen updates. AppCompatDelegateImpl stores the resulting ToolbarActionBar in
315+ // its mActionBar field for the lifetime of the activity. When a screen is popped and the new
316+ // top screen does not install a replacement action bar (e.g. headerShown: false),
317+ // the stale ToolbarActionBar — and the entire object graph hanging off the toolbar is never released.
318+ // When this fragment is being removed, we're clearing the activity's support action bar if it
319+ // still belongs to us. This will break the retention chain:
320+ // - AppCompatDelegateImpl.mActionBar
321+ // - ToolbarActionBar.mDecorToolbar
322+ // - ToolbarWidgetWrapper.mToolbar
323+ // - DebugMenuToolbar.config
324+ // - ScreenStackHeaderConfig.mParent
325+ // - 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+ }
336+ super .onDestroyView()
337+ }
338+
304339 override fun onCreateAnimation (
305340 transit : Int ,
306341 enter : Boolean ,
0 commit comments