fix(uidesigner): handle XML generation errors (fixes #1280)

This commit is contained in:
Akash Yadav
2023-09-29 00:24:18 +05:30
parent 2dcf45e906
commit d05ee6287d
3 changed files with 34 additions and 5 deletions
@@ -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")
}
}
}
}
@@ -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
@@ -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<String?> =
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
}