diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 000000000..0c0c33838 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml index fdf8d994a..f8467b458 100644 --- a/.idea/kotlinc.xml +++ b/.idea/kotlinc.xml @@ -1,6 +1,6 @@ - \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 000000000..f8051a6f9 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/itsaky/androidide/actions/filetree/NewFileAction.kt b/app/src/main/java/com/itsaky/androidide/actions/filetree/NewFileAction.kt index 2865a19ff..13cab150b 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/filetree/NewFileAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/filetree/NewFileAction.kt @@ -31,6 +31,7 @@ import com.itsaky.androidide.projects.IProjectManager import com.itsaky.androidide.resources.R import com.itsaky.androidide.utils.DialogUtils import com.itsaky.androidide.utils.Environment +import com.itsaky.androidide.utils.ILogger import com.itsaky.androidide.utils.ProjectWriter import com.itsaky.androidide.utils.SingleTextWatcher import com.itsaky.androidide.utils.flashError @@ -62,13 +63,20 @@ class NewFileAction(context: Context, override val order: Int) : const val MENU_RES_PATH_REGEX = "/.*/src/.*/res/menu" const val DRAWABLE_RES_PATH_REGEX = "/.*/src/.*/res/drawable" const val JAVA_PATH_REGEX = "/.*/src/.*/java" + + private val log = ILogger.newInstance("NewFileAction") } override fun execAction(data: ActionData) { val context = data.requireActivity() val file = data.requireFile() val node = data.getTreeNode() - createNewFile(context, node, file, false) + try { + createNewFile(context, node, file, false) + } catch (e: Exception) { + log.error(e) + flashError(e.cause?.message ?: e.message) + } } private fun createNewFile( @@ -152,64 +160,11 @@ class NewFileAction(context: Context, override val order: Int) : builder.setTitle(R.string.new_java_class) builder.setPositiveButton(R.string.text_create) { dialogInterface, _ -> dialogInterface.dismiss() - if (binding.name.isErrorEnabled) { - flashError(R.string.msg_invalid_name) - return@setPositiveButton - } - - val name: String = binding.name.editText!!.text.toString().trim() - val autoLayout = - binding.typeGroup.checkedButtonId == binding.typeActivity.id && - binding.createLayout.isChecked - val pkgName = ProjectWriter.getPackageName(file) - if (pkgName == null || pkgName.trim { it <= ' ' }.isEmpty()) { - flashError(R.string.msg_get_package_failed) - return@setPositiveButton - } - - val id: Int = binding.typeGroup.checkedButtonId - val javaName = if (name.endsWith(".java")) name else "$name.java" - val className = if (!name.contains(".")) name else name.substring(0, name.lastIndexOf(".")) - val created = - when (id) { - binding.typeClass.id -> - createFile( - context, - node, - file, - javaName, - ProjectWriter.createJavaClass(pkgName, className) - ) - binding.typeInterface.id -> - createFile( - context, - node, - file, - javaName, - ProjectWriter.createJavaInterface(pkgName, className) - ) - binding.typeEnum.id -> - createFile( - context, - node, - file, - javaName, - ProjectWriter.createJavaEnum(pkgName, className) - ) - binding.typeActivity.id -> - createFile( - context, - node, - file, - javaName, - ProjectWriter.createActivity(pkgName, className) - ) - else -> createFile(context, node, file, name, "") - } - - if (created && autoLayout) { - val packagePath = pkgName.toString().replace(".", "/") - createAutoLayout(context, file, name, packagePath) + try { + doCreateJavaFile(binding, file, context, node) + } catch (e: Exception) { + log.error(e) + flashError(e.cause?.message ?: e.message) } } builder.setNegativeButton(android.R.string.cancel, null) @@ -217,6 +172,82 @@ class NewFileAction(context: Context, override val order: Int) : builder.create().show() } + private fun doCreateJavaFile( + binding: LayoutCreateFileJavaBinding, + file: File, + context: Context, + node: TreeNode? + ) { + if (binding.name.isErrorEnabled) { + flashError(R.string.msg_invalid_name) + return + } + + val name: String = binding.name.editText!!.text.toString().trim() + if (name.isBlank()) { + flashError(R.string.msg_invalid_name) + return + } + + val autoLayout = + binding.typeGroup.checkedButtonId == binding.typeActivity.id && + binding.createLayout.isChecked + val pkgName = ProjectWriter.getPackageName(file) + if (pkgName == null || pkgName.trim { it <= ' ' }.isEmpty()) { + flashError(R.string.msg_get_package_failed) + return + } + + val id: Int = binding.typeGroup.checkedButtonId + val javaName = if (name.endsWith(".java")) name else "$name.java" + val className = if (!name.contains(".")) name else name.substring(0, name.lastIndexOf(".")) + val created = + when (id) { + binding.typeClass.id -> + createFile( + context, + node, + file, + javaName, + ProjectWriter.createJavaClass(pkgName, className) + ) + + binding.typeInterface.id -> + createFile( + context, + node, + file, + javaName, + ProjectWriter.createJavaInterface(pkgName, className) + ) + + binding.typeEnum.id -> + createFile( + context, + node, + file, + javaName, + ProjectWriter.createJavaEnum(pkgName, className) + ) + + binding.typeActivity.id -> + createFile( + context, + node, + file, + javaName, + ProjectWriter.createActivity(pkgName, className) + ) + + else -> createFile(context, node, file, name, "") + } + + if (created && autoLayout) { + val packagePath = pkgName.toString().replace(".", "/") + createAutoLayout(context, file, name, packagePath) + } + } + private fun isValidJavaName(s: CharSequence?) = s == null || !SourceVersion.isName(s) || SourceVersion.isKeyword(s) @@ -327,10 +358,21 @@ class NewFileAction(context: Context, override val order: Int) : builder.setPositiveButton(R.string.text_create) { dialogInterface, _ -> dialogInterface.dismiss() var name = binding.name.editText!!.text.toString().trim() + if (name.isBlank()) { + flashError(R.string.msg_invalid_name) + return@setPositiveButton + } + if (extension != null && extension.trim { it <= ' ' }.isNotEmpty()) { name = if (name.endsWith(extension)) name else name + extension } - createFile(context, node, folder, name, content) + + try { + createFile(context, node, folder, name, content) + } catch (e: Exception) { + log.error(e) + flashError(e.cause?.message ?: e.message) + } } builder.setNegativeButton(android.R.string.cancel, null) builder.create().show()