@@ -2,19 +2,24 @@ package com.knowre.android.kal.myscript
22
33import android.content.Context
44import android.content.res.AssetManager
5+ import android.content.res.ColorStateList
6+ import android.content.res.Resources
7+ import android.graphics.Color
58import android.util.AttributeSet
69import android.util.Log
10+ import android.util.TypedValue
711import android.view.LayoutInflater
812import android.widget.FrameLayout
13+ import android.widget.Toast
14+ import androidx.recyclerview.widget.LinearLayoutManager
15+ import com.google.android.material.shape.MaterialShapeDrawable
16+ import com.google.android.material.shape.ShapeAppearanceModel
917import com.knowre.android.kal.databinding.ViewMyscriptPadBinding
10- import com.knowre.android.myscript.iink.FolderProvider
1118import com.knowre.android.myscript.iink.MyScriptApi
12- import com.knowre.android.myscript.iink.MyScriptAssetResource
1319import com.knowre.android.myscript.iink.MyScriptInitializer
1420import com.knowre.android.myscript.iink.MyScriptInterpretListener
1521import com.knowre.android.myscript.iink.ToolFunction
1622import com.knowre.android.myscript.iink.ToolType
17- import com.knowre.android.myscript.iink.certificate.MyCertificate
1823import com.myscript.iink.Editor
1924import com.myscript.iink.EditorError
2025import kotlinx.coroutines.MainScope
@@ -32,65 +37,84 @@ internal class MyScriptPadView constructor(
3237
3338 private val mainScope = MainScope ()
3439
35- private lateinit var myscript: MyScriptApi
40+ private lateinit var myScript: MyScriptApi
41+
42+ private val candidateAdapter = CandidateAdapter (
43+ onCandidateClicked = { candidate -> },
44+ onExitClicked = {}
45+ )
3646
3747 init {
38- MyScriptInitializer (
39- certificate = MyCertificate .getBytes(),
40- editorView = binding.myScript.editorView,
41- context = context,
42- folders = FolderProvider (context),
43- assetResource = MyScriptAssetResource (context),
44- scope = mainScope
45- )
46- .setGeneralConfiguration()
47- .setMathConfiguration()
48- .initialize {
49- myscript = it.apply {
50- listener = object : MyScriptInterpretListener {
51- override fun onInterpreted (interpreted : String ) {
52- binding.latex.text = interpreted
53- mainScope.launch {
54- binding.redo.isEnabled = myscript.canRedo
55- binding.undo.isEnabled = myscript.canUndo
56- }
57- }
58-
59- override fun onError (editor : Editor , blockId : String , error : EditorError , message : String ) {
60- Log .d(" MY_SCRIPT_ERROR" , " $error with message $message " )
61- }
62- }
63- }
48+ initializeMyScript()
49+ initializeRecyclerView()
50+ initializeToolsListener()
51+ }
52+
53+ override fun onDetachedFromWindow () {
54+ super .onDetachedFromWindow()
55+ mainScope.cancel()
56+ }
57+
58+ private fun initializeMyScript () {
59+ mainScope.launch {
60+ myScript = MyScriptInitializer (
61+ myScriptView = binding.myScriptView,
62+ context = context,
63+ scope = mainScope
64+ )
65+ .initialize()
66+ .apply { addListener(interpretListener) }
67+ .apply { isAutoConvertEnabled = false }
68+ }
69+ }
70+
71+ private fun initializeRecyclerView () {
72+ with (binding.candidate) {
73+ adapter = candidateAdapter
74+ layoutManager = LinearLayoutManager (context, LinearLayoutManager .HORIZONTAL , false )
75+ background = MaterialShapeDrawable (
76+ ShapeAppearanceModel .Builder ()
77+ .setAllCornerSizes(8F .dp)
78+ .build()
79+ ).apply {
80+ tintList = ColorStateList .valueOf(Color .parseColor(" #FFFFFF" ))
81+ strokeWidth = 1F .dp
82+ strokeColor = ColorStateList .valueOf(Color .parseColor(" #CFD8DC" ))
83+ elevation = 4F .dp
6484 }
85+ }
86+ }
6587
88+ private fun initializeToolsListener () {
6689 binding.redo.isEnabled = false
6790 binding.undo.isEnabled = false
6891
69- binding.convert.setOnClickListener { myscript.convert() }
70- binding.deleteAll.setOnClickListener { myscript.eraseAll() }
92+ binding.deleteAll.setOnClickListener { myScript.eraseAll() }
7193 binding.digitOnlyGrammar.setOnClickListener {
72- myscript .loadMathGrammar(" n_digit_exp" , context.assets.toByteArray(" n_digit_exp.res" ))
94+ myScript .loadMathGrammar(" n_digit_exp" , context.assets.toByteArray(" n_digit_exp.res" ))
7395 }
7496
7597 binding.defaultGrammar.setOnClickListener {
7698 // TODO
7799 }
78100
79101 binding.red.setOnClickListener {
80- myscript .penColor = 0xFF0000
102+ myScript .penColor = 0xFF0000
81103 }
82104
83105 binding.blue.setOnClickListener {
84- myscript .penColor = 0x0000FF
106+ myScript .penColor = 0x0000FF
85107 }
86108
87109 binding.black.setOnClickListener {
88- myscript .penColor = 0x000000
110+ myScript .penColor = 0x000000
89111 }
90112
113+ binding.convert.setOnClickListener { myScript.convert() }
114+
91115 binding.penSwitch.setOnCheckedChangeListener { _, isChecked ->
92116 binding.eraserSwitch.isChecked = false
93- myscript .tool = if (isChecked) {
117+ myScript .tool = if (isChecked) {
94118 MyScriptApi .Tool (
95119 toolType = ToolType .PEN ,
96120 toolFunction = ToolFunction .DRAWING
@@ -104,32 +128,60 @@ internal class MyScriptPadView constructor(
104128 }
105129
106130 binding.convertSwitch.setOnCheckedChangeListener { _, isChecked ->
107- myscript .isAutoConvertEnabled = isChecked
131+ myScript .isAutoConvertEnabled = isChecked
108132 }
109133
110134 binding.eraserSwitch.setOnCheckedChangeListener { _, isChecked ->
111135 val toolType = if (binding.penSwitch.isChecked) ToolType .PEN else ToolType .HAND
112136 if (isChecked) {
113- myscript .tool = MyScriptApi .Tool (toolType, ToolFunction .ERASING )
137+ myScript .tool = MyScriptApi .Tool (toolType, ToolFunction .ERASING )
114138 } else {
115- myscript .tool = MyScriptApi .Tool (toolType, ToolFunction .DRAWING )
139+ myScript .tool = MyScriptApi .Tool (toolType, ToolFunction .DRAWING )
116140 }
117141 }
118142
119143 binding.redo.setOnClickListener {
120- myscript .redo()
144+ myScript .redo()
121145 }
122146
123147 binding.undo.setOnClickListener {
124- myscript .undo()
148+ myScript .undo()
125149 }
150+
151+ binding.candidateSwitch.setOnCheckedChangeListener { _, isChecked -> }
126152 }
127153
128- override fun onDetachedFromWindow () {
129- super .onDetachedFromWindow()
130- mainScope.cancel()
154+ private val interpretListener: MyScriptInterpretListener
155+ get() = object : MyScriptInterpretListener {
156+ override fun onInterpreted (interpreted : String ) {
157+ binding.latex.text = interpreted
158+ binding.redo.isEnabled = myScript.canRedo
159+ binding.undo.isEnabled = myScript.canUndo
160+ }
161+
162+ override fun onInterpretError (editor : Editor , blockId : String , error : EditorError , message : String ) {
163+ Log .d(" MY_SCRIPT_ERROR" , " $error with message $message " )
164+ }
165+
166+ override fun onImportError () {
167+ Toast
168+ .makeText(context, " 해당 문자로는 변경이 불가능합니다." , Toast .LENGTH_SHORT )
169+ .show()
170+ }
171+ }
172+
173+ private fun showNoCandidateAvailable () {
174+ Toast
175+ .makeText(context, " No candidates available." , Toast .LENGTH_SHORT )
176+ .show()
131177 }
132178
133179 private fun AssetManager.toByteArray (fileName : String ) = open(fileName).use { it.readBytes() }
134180
181+ private val Number .dp: Float
182+ get() = TypedValue .applyDimension(
183+ TypedValue .COMPLEX_UNIT_DIP ,
184+ toFloat(),
185+ Resources .getSystem().displayMetrics
186+ )
135187}
0 commit comments