From d05ee6287dc38be91b4ada2de1880db6c3ee37d6 Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Fri, 29 Sep 2023 00:24:18 +0530 Subject: [PATCH] fix(uidesigner): handle XML generation errors (fixes #1280) --- .../androidide/uidesigner/UIDesignerActivity.kt | 17 ++++++++++++++++- .../uidesigner/actions/ShowXmlAction.kt | 11 ++++++++++- .../androidide/uidesigner/utils/ViewToXml.kt | 11 ++++++++--- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/UIDesignerActivity.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/UIDesignerActivity.kt index ee68cc2a0..78150d2a5 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/UIDesignerActivity.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/UIDesignerActivity.kt @@ -41,6 +41,7 @@ import com.itsaky.androidide.uidesigner.fragments.DesignerWorkspaceFragment import com.itsaky.androidide.uidesigner.utils.ViewToXml import com.itsaky.androidide.uidesigner.viewmodel.WorkspaceViewModel import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.utils.flashError import java.io.File /** @@ -77,7 +78,21 @@ class UIDesignerActivity : BaseIDEActivity() { return } - ViewToXml.generateXml(frag.requireContext(), frag.workspaceView) { onXmlGenerated(it) } + ViewToXml.generateXml( + frag.requireContext(), + frag.workspaceView, + ::onXmlGenerated + ) { result, error -> + if (result != null && error == null) { + return@generateXml + } + + // XML generation failed, notify user and exit activity + runOnUiThread { + flashError(R.string.msg_generate_xml_failed) + onFailedToReturnXml(error?.cause?.message ?: error?.message ?: "Unknown error") + } + } } } diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/actions/ShowXmlAction.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/actions/ShowXmlAction.kt index 696d0cb8a..a1465699c 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/actions/ShowXmlAction.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/actions/ShowXmlAction.kt @@ -28,6 +28,7 @@ import com.itsaky.androidide.uidesigner.R import com.itsaky.androidide.uidesigner.ShowXmlActivity import com.itsaky.androidide.uidesigner.utils.ViewToXml import com.itsaky.androidide.utils.ILogger +import com.itsaky.androidide.utils.flashError /** * Navigates the user to [ShowXmlActivity]. @@ -35,6 +36,7 @@ import com.itsaky.androidide.utils.ILogger * @author Akash Yadav */ class ShowXmlAction(context: Context) : UiDesignerAction() { + override val id: String = "ide.uidesigner.showXml" private val log = ILogger.newInstance("ShowXmlAction") @@ -59,10 +61,17 @@ class ShowXmlAction(context: Context) : UiDesignerAction() { override fun execAction(data: ActionData): Any { data.requireActivity().apply { val workspace = data.requireWorkspace().workspaceView - ViewToXml.generateXml(this, workspace) { result -> + ViewToXml.generateXml(this, workspace, { result -> val intent = Intent(this, ShowXmlActivity::class.java) intent.putExtra(ShowXmlActivity.KEY_XML, result) startActivity(intent) + }) { result, error -> + if (result == null || error != null) { + val message = "${ + getString(R.string.msg_generate_xml_failed) + }: ${error?.cause?.message ?: error?.message ?: "Unknown error"}" + flashError(message) + } } } return true diff --git a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ViewToXml.kt b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ViewToXml.kt index 1fd41df14..399765191 100644 --- a/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ViewToXml.kt +++ b/uidesigner/src/main/java/com/itsaky/androidide/uidesigner/utils/ViewToXml.kt @@ -42,7 +42,12 @@ object ViewToXml { @JvmStatic @JvmOverloads - fun generateXml(context: Context, workspace: ViewGroupImpl, onGenerated: (String) -> Unit = {}) { + fun generateXml( + context: Context, + workspace: ViewGroupImpl, + onGenerated: (String) -> Unit = {}, + onFailure: (result: String?, error: Throwable?) -> Unit + ) { context.apply { val future: CompletableFuture = executeAsyncProvideError({ @@ -59,8 +64,7 @@ object ViewToXml { } return@executeAsyncProvideError generateXml(workspace[0] as ViewImpl) - }) { _, _ -> - } + }) { _, _ -> } val progress = DialogUtils.newProgressDialog( @@ -79,6 +83,7 @@ object ViewToXml { if (result.isNullOrBlank() || error != null) { log.error("Unable to generate XML code", error) + onFailure(result, error) return@runOnUiThread }