1 package host.exp.exponent.experience
2 
3 import android.content.Context
4 import host.exp.exponent.kernel.ExponentError
5 import android.widget.ArrayAdapter
6 import android.view.ViewGroup
7 import android.view.LayoutInflater
8 import android.view.View
9 import android.widget.TextView
10 import host.exp.expoview.R
11 import host.exp.expoview.databinding.ErrorConsoleListItemBinding
12 import java.text.SimpleDateFormat
13 import java.util.*
14 
15 class ErrorQueueAdapter(context: Context, values: List<ExponentError>) : ArrayAdapter<ExponentError>(context, -1, values) {
getViewnull16   override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
17     val (convertViewRet, holder) = if (convertView == null) {
18       val binding = ErrorConsoleListItemBinding.inflate(LayoutInflater.from(context), parent, false)
19       val convertViewLocal = binding.root
20       val holderLocal = ViewHolder(binding)
21       convertViewLocal.tag = holderLocal
22       Pair(convertViewLocal, holderLocal)
23     } else {
24       Pair(convertView, convertView.tag as ViewHolder)
25     }
26 
27     val item = getItem(position)
28     holder.errorMessageView.text = context.getString(R.string.error_uncaught, item!!.errorMessage.developerErrorMessage())
29 
30     if (item.stack.isNotEmpty()) {
31       val bundle = item.stack[0]
32 
33       val path = bundle.getString("file")
34       val fileName = if (path != null && path.isNotEmpty()) {
35         val file = path.substring(path.lastIndexOf('/') + 1)
36         "@$file"
37       } else {
38         ""
39       }
40 
41       val lineNumber = when (val lineNumberObject = bundle["lineNumber"]) {
42         is Double -> ":" + lineNumberObject.toInt()
43         is Int -> ":" + lineNumberObject.toInt()
44         else -> ""
45       }
46 
47       val stacktracePreview = bundle.getString("methodName") + fileName + lineNumber
48       holder.stacktraceView.text = stacktracePreview
49     }
50 
51     var timestampViewText = SimpleDateFormat("HH:mm:ss", Locale.US).format(item.timestamp)
52     if (item.isFatal) {
53       timestampViewText += " Fatal Error"
54     }
55     holder.timestampView.text = timestampViewText
56 
57     return convertViewRet
58   }
59 
60   internal class ViewHolder(binding: ErrorConsoleListItemBinding) {
61     var errorMessageView: TextView = binding.errorConsoleItemMessage
62     var stacktraceView: TextView = binding.errorConsoleItemStackPreview
63     var timestampView: TextView = binding.errorConsoleItemTimestamp
64   }
65 }
66