From 2dc7f633b30e4b5f982a7b3bf3899770fc7b14bd Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Thu, 18 Apr 2024 17:56:38 +0900 Subject: [PATCH 1/3] refactor(editor): add live data var to encapsulate editor view model --- .../java/com/csapp/sqli/viewmodel/EditorViewModel.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt b/app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt index a9dde46..c3ee135 100644 --- a/app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt +++ b/app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt @@ -1,6 +1,7 @@ package com.csapp.sqli.viewmodel import android.widget.EditText +import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.csapp.sqli.model.LineNumber @@ -8,8 +9,12 @@ import com.csapp.sqli.repository.DatabaseRepository class EditorViewModel(private val databaseRepository: DatabaseRepository) : ViewModel() { private val lineNumberModel = LineNumber("") - var statementEditView = MutableLiveData() - val lineNumberView = MutableLiveData() + + private val _editTextStatement = MutableLiveData() + val editTextStatement: LiveData = _editTextStatement + + private val _textViewLineNumber = MutableLiveData() + val lineNumberView:LiveData = _textViewLineNumber fun onStatementChanged() { val editText = statementEditView.value From efdd487db38150fd0d8f0b7c46bdee90fb60e973 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Thu, 18 Apr 2024 22:21:32 +0900 Subject: [PATCH 2/3] refactor(editor): separate statement changed fun to except handling and update --- .../java/com/csapp/sqli/model/LineNumber.kt | 3 +- .../com/csapp/sqli/view/EditorActivity.kt | 2 +- .../csapp/sqli/viewmodel/EditorViewModel.kt | 29 ++++++++++++++----- app/src/main/res/layout/activity_editor.xml | 2 +- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/csapp/sqli/model/LineNumber.kt b/app/src/main/java/com/csapp/sqli/model/LineNumber.kt index 198212a..8709a23 100644 --- a/app/src/main/java/com/csapp/sqli/model/LineNumber.kt +++ b/app/src/main/java/com/csapp/sqli/model/LineNumber.kt @@ -1,5 +1,6 @@ package com.csapp.sqli.model data class LineNumber( - var content: String, + var number: Int = 0, + var content: String = "", ) diff --git a/app/src/main/java/com/csapp/sqli/view/EditorActivity.kt b/app/src/main/java/com/csapp/sqli/view/EditorActivity.kt index b68320a..7e47534 100644 --- a/app/src/main/java/com/csapp/sqli/view/EditorActivity.kt +++ b/app/src/main/java/com/csapp/sqli/view/EditorActivity.kt @@ -23,7 +23,7 @@ class EditorActivity : AppCompatActivity() { binding = DataBindingUtil.setContentView(this, R.layout.activity_editor) binding.lifecycleOwner = this binding.editorViewModel = viewModel - viewModel.statementEditView.value = binding.edittextQueryEditor + viewModel.editTextStatement.value = binding.edittextQueryEditor binding.btnQueryEditorRun.setOnClickListener { val result = viewModel.execStatement() EditorUtils.renderResult(binding, result) diff --git a/app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt b/app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt index c3ee135..badd384 100644 --- a/app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt +++ b/app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt @@ -1,5 +1,7 @@ package com.csapp.sqli.viewmodel +import android.text.Layout +import android.util.Log import android.widget.EditText import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData @@ -8,26 +10,35 @@ import com.csapp.sqli.model.LineNumber import com.csapp.sqli.repository.DatabaseRepository class EditorViewModel(private val databaseRepository: DatabaseRepository) : ViewModel() { - private val lineNumberModel = LineNumber("") + private val modelLineNumber = LineNumber() private val _editTextStatement = MutableLiveData() - val editTextStatement: LiveData = _editTextStatement + val editTextStatement: MutableLiveData = _editTextStatement private val _textViewLineNumber = MutableLiveData() - val lineNumberView:LiveData = _textViewLineNumber + val textViewLineNumber: LiveData = _textViewLineNumber + // Data binding with Activity_editor.xml #EditText afterTextChanged() fun onStatementChanged() { - val editText = statementEditView.value + val editText = editTextStatement.value val layout = editText?.layout layout?.let { - lineNumberModel.content = generateLineNumber(it.lineCount) - lineNumberView.value = lineNumberModel.content + updateLineNumbers(it) } } + private fun updateLineNumbers(it: Layout) { + if (it.lineCount != modelLineNumber.number) { + modelLineNumber.content = generateLineNumber(it.lineCount) + modelLineNumber.number = it.lineCount + _textViewLineNumber.value = modelLineNumber.content + } + } + + // Activity_editor.xml과 data binding #버튼 클릭시 실행 fun execStatement(): Any? { - return statementEditView.value?.let { - if (isQueryStatement(statementEditView.value.toString())) { + return editTextStatement.value?.let { + if (isQueryStatement(editTextStatement.value.toString())) { databaseRepository.execQuery(it.text.toString()) } else { databaseRepository.execStatement(it.text.toString()) @@ -35,10 +46,12 @@ class EditorViewModel(private val databaseRepository: DatabaseRepository) : View } } + // SQL문이 쿼리인지 검증. 즉 SELECT로 시작하는지 확인 private fun isQueryStatement(statement: String): Boolean { return statement.startsWith("SELECT") or statement.startsWith("select") } + // Line Count를 입력받으면 Line Number을 생성 private fun generateLineNumber(count: Int): String { val stringBuilder = StringBuilder() for (i in 1..count) { diff --git a/app/src/main/res/layout/activity_editor.xml b/app/src/main/res/layout/activity_editor.xml index 53b1075..4c0e156 100644 --- a/app/src/main/res/layout/activity_editor.xml +++ b/app/src/main/res/layout/activity_editor.xml @@ -44,7 +44,7 @@ android:lineSpacingExtra="@dimen/x_small_padding" android:minWidth="@dimen/large_padding" android:paddingTop="@dimen/small_padding" - android:text="@{editorViewModel.lineNumberView}" + android:text="@{editorViewModel.textViewLineNumber}" android:textColor="@color/annotation" android:textSize="@dimen/medium_font_size" /> From 15b20a6009ef67b5d622db42f8b09a5a032e3cc0 Mon Sep 17 00:00:00 2001 From: Sanghyun Yi Date: Thu, 18 Apr 2024 23:35:51 +0900 Subject: [PATCH 3/3] fix(editor): modify query valid fun to ignore case --- .../csapp/sqli/viewmodel/EditorViewModel.kt | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt b/app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt index badd384..d390445 100644 --- a/app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt +++ b/app/src/main/java/com/csapp/sqli/viewmodel/EditorViewModel.kt @@ -1,7 +1,6 @@ package com.csapp.sqli.viewmodel import android.text.Layout -import android.util.Log import android.widget.EditText import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData @@ -18,15 +17,13 @@ class EditorViewModel(private val databaseRepository: DatabaseRepository) : View private val _textViewLineNumber = MutableLiveData() val textViewLineNumber: LiveData = _textViewLineNumber - // Data binding with Activity_editor.xml #EditText afterTextChanged() + // Data binding with Activity_editor.xml #afterTextChanged() fun onStatementChanged() { val editText = editTextStatement.value - val layout = editText?.layout - layout?.let { - updateLineNumbers(it) - } + editText?.layout?.let { updateLineNumbers(it) } } + // If line number changed, update model and render line number text view private fun updateLineNumbers(it: Layout) { if (it.lineCount != modelLineNumber.number) { modelLineNumber.content = generateLineNumber(it.lineCount) @@ -35,9 +32,9 @@ class EditorViewModel(private val databaseRepository: DatabaseRepository) : View } } - // Activity_editor.xml과 data binding #버튼 클릭시 실행 + // View binding with Activity_editor.xml, Check Editor Activity fun execStatement(): Any? { - return editTextStatement.value?.let { + return _editTextStatement.value?.let { if (isQueryStatement(editTextStatement.value.toString())) { databaseRepository.execQuery(it.text.toString()) } else { @@ -46,12 +43,12 @@ class EditorViewModel(private val databaseRepository: DatabaseRepository) : View } } - // SQL문이 쿼리인지 검증. 즉 SELECT로 시작하는지 확인 + // Check if a statement starts with "SELECT" ignore case private fun isQueryStatement(statement: String): Boolean { - return statement.startsWith("SELECT") or statement.startsWith("select") + return statement.startsWith("SELECT", ignoreCase = true) } - // Line Count를 입력받으면 Line Number을 생성 + // Generate line number like ""1/n2/n3/n ... count" private fun generateLineNumber(count: Int): String { val stringBuilder = StringBuilder() for (i in 1..count) {