diff options
author | Diego Perez <diegoperez@google.com> | 2024-04-29 15:17:16 +0000 |
---|---|---|
committer | Diego Perez <diegoperez@google.com> | 2024-04-29 17:29:32 +0000 |
commit | fc912a1601e482170565ed62584ec3b055d27f38 (patch) | |
tree | 5caa224945c84e9fd38d4005110c1078adfccaa8 | |
parent | 27df796960cfa8a471d9b3cd1e372a7ef00db518 (diff) | |
download | idea-fc912a1601e482170565ed62584ec3b055d27f38.tar.gz |
Protect StudioLayoutlibContext from Project dispose
If Project is disposed, project.earlyDisposer will throw. This ensures
that StudioLayoutlibContext.register handles that case, warns in the
logs and disposes Layoutlib correctly.
Test: N/A
Bug: N/A
Change-Id: I7c05cedc18d5567f45368e33eb3a066d1a0a84be
-rw-r--r-- | android/src/com/android/tools/idea/rendering/StudioLayoutlibContext.kt | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/android/src/com/android/tools/idea/rendering/StudioLayoutlibContext.kt b/android/src/com/android/tools/idea/rendering/StudioLayoutlibContext.kt index fb92330d3a9..74ff2197058 100644 --- a/android/src/com/android/tools/idea/rendering/StudioLayoutlibContext.kt +++ b/android/src/com/android/tools/idea/rendering/StudioLayoutlibContext.kt @@ -15,10 +15,9 @@ */ package com.android.tools.idea.rendering -import com.intellij.openapi.diagnostic.Logger import com.android.tools.idea.layoutlib.LayoutLibrary import com.android.tools.layoutlib.LayoutlibContext -import com.intellij.openapi.Disposable +import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.project.Project import com.intellij.openapi.project.ex.ProjectEx import com.intellij.openapi.util.Disposer @@ -28,13 +27,15 @@ import java.util.concurrent.atomic.AtomicBoolean class StudioLayoutlibContext(private val project: Project) : LayoutlibContext { private val hasRegistered = AtomicBoolean(false) - private val parentDisposable: Disposable - get() = (project as ProjectEx).earlyDisposable - override fun hasLayoutlibCrash(): Boolean = hasStudioLayoutlibCrash() override fun register(layoutlib: LayoutLibrary) { if (!hasRegistered.getAndSet(true)) { - Disposer.register(parentDisposable) { layoutlib.dispose() } + if (!project.isDisposed) + Disposer.register((project as ProjectEx).earlyDisposable) { layoutlib.dispose() } + else { + Logger.getInstance(StudioLayoutlibContext::class.java).error("$project had already been disposed") + layoutlib.dispose() + } } else { Logger.getInstance(StudioLayoutlibContext::class.java).error("A duplicate Layoutlib is created for project $project") } |