summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego Perez <diegoperez@google.com>2024-04-29 15:17:16 +0000
committerDiego Perez <diegoperez@google.com>2024-04-29 17:29:32 +0000
commitfc912a1601e482170565ed62584ec3b055d27f38 (patch)
tree5caa224945c84e9fd38d4005110c1078adfccaa8
parent27df796960cfa8a471d9b3cd1e372a7ef00db518 (diff)
downloadidea-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.kt13
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")
}