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 a9dde46..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,28 +1,41 @@ package com.csapp.sqli.viewmodel +import android.text.Layout import android.widget.EditText +import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import com.csapp.sqli.model.LineNumber 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 modelLineNumber = LineNumber() + private val _editTextStatement = MutableLiveData() + val editTextStatement: MutableLiveData = _editTextStatement + + private val _textViewLineNumber = MutableLiveData() + val textViewLineNumber: LiveData = _textViewLineNumber + + // Data binding with Activity_editor.xml #afterTextChanged() fun onStatementChanged() { - val editText = statementEditView.value - val layout = editText?.layout - layout?.let { - lineNumberModel.content = generateLineNumber(it.lineCount) - lineNumberView.value = lineNumberModel.content + val editText = editTextStatement.value + 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) + modelLineNumber.number = it.lineCount + _textViewLineNumber.value = modelLineNumber.content } } + // View binding with Activity_editor.xml, Check Editor Activity 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()) @@ -30,10 +43,12 @@ class EditorViewModel(private val databaseRepository: DatabaseRepository) : View } } + // 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) } + // Generate line number like ""1/n2/n3/n ... count" 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" />