@@ -233,7 +233,7 @@ class DialogLogFragment : DialogFragment() {
233233 private var pendingOverwrite = false
234234
235235 init {
236- logView?.text = Editable . Factory .getInstance().newEditable( " " )
236+ logView?.setText(logBuffer, TextView . BufferType . EDITABLE )
237237 }
238238
239239 private fun getColor (resId : Int ): Int {
@@ -244,13 +244,13 @@ class DialogLogFragment : DialogFragment() {
244244 return (dp * context.resources.displayMetrics.density).toInt()
245245 }
246246
247- fun release () {
248- logViewRef.clear ()
249- progressRef.clear()
250- inputRowRef.clear()
251- shellInputRef.clear()
252- unbindStdin ()
253- actionEventHandler = null
247+ private fun resetLogState () {
248+ AnsiColorParser .reset ()
249+ lineCount = 0
250+ lineStart = 0
251+ pendingOverwrite = false
252+ logBuffer.clear ()
253+ logViewRef.get()?.text = logBuffer
254254 }
255255
256256 override fun onInputRequest (prompt : String ) {
@@ -382,64 +382,57 @@ class DialogLogFragment : DialogFragment() {
382382 val logView = logViewRef.get() ? : return
383383
384384 logView.post {
385- val editable = logView.editableText ? : return @post
386-
387- var start = 0
388385 var i = 0
389386 val len = formattedText.length
390387
391388 while (i < len) {
392- when (formattedText[i]) {
393- ' \r ' , ' \n ' -> {
394-
395- if (i > start) {
396- if (pendingOverwrite) {
397- if (lineStart <= editable.length) {
398- editable.delete(lineStart, editable.length)
399- }
400- pendingOverwrite = false
401- }
389+ var j = i
390+ while (j < len) {
391+ val c = formattedText[j]
392+ if (c == ' \r ' || c == ' \n ' ) break
393+ j++
394+ }
402395
403- editable.append(formattedText, start, i)
396+ if (j > i) {
397+ if (pendingOverwrite) {
398+ val end = logBuffer.length
399+ if (lineStart <= end) {
400+ logBuffer.delete(lineStart, end)
404401 }
402+ pendingOverwrite = false
403+ }
405404
406- if (formattedText[i] == ' \r ' ) {
407- val isCRLF =
408- (i + 1 < len && formattedText[i + 1 ] == ' \n ' )
405+ logBuffer.append(formattedText, i, j)
406+ }
409407
410- if (! isCRLF) {
408+ if (j < len) {
409+ when (formattedText[j]) {
410+ ' \r ' -> {
411+ if (j + 1 >= len || formattedText[j + 1 ] != ' \n ' ) {
411412 pendingOverwrite = true
412413 }
413- } else {
414+ }
415+
416+ ' \n ' -> {
414417 if (pendingOverwrite) {
415- if (lineStart <= editable.length) {
416- editable.delete(lineStart, editable.length)
418+ val end = logBuffer.length
419+ if (lineStart <= end) {
420+ logBuffer.delete(lineStart, end)
417421 }
418422 pendingOverwrite = false
419423 }
420424
421- editable .append(' \n ' )
425+ logBuffer .append(' \n ' )
422426 lineCount++
423- lineStart = editable .length
427+ lineStart = logBuffer .length
424428 }
425-
426- start = i + 1
427429 }
428430 }
429431
430- i++
432+ i = j + 1
431433 }
432434
433- if (start < len) {
434- if (pendingOverwrite) {
435- if (lineStart <= editable.length) {
436- editable.delete(lineStart, editable.length)
437- }
438- pendingOverwrite = false
439- }
440-
441- editable.append(formattedText, start, len)
442- }
435+ logView.text = logBuffer
443436
444437 val scrollView = logView.parent as ? ScrollView
445438 if (scrollView != null ) {
@@ -449,8 +442,8 @@ class DialogLogFragment : DialogFragment() {
449442 val inputRow = inputRowRef.get()
450443 val input = shellInputRef.get()
451444
452- if (inputRow?.visibility == View .VISIBLE && input != null ) {
453- input.requestFocus()
445+ if (inputRow?.visibility == View .VISIBLE ) {
446+ input? .requestFocus()
454447 }
455448 }
456449 }
0 commit comments