package host.exp.exponent.experience import android.content.Context import host.exp.exponent.kernel.ExponentError import android.widget.ArrayAdapter import android.view.ViewGroup import android.view.LayoutInflater import android.view.View import android.widget.TextView import host.exp.expoview.R import host.exp.expoview.databinding.ErrorConsoleListItemBinding import java.text.SimpleDateFormat import java.util.* class ErrorQueueAdapter(context: Context, values: List) : ArrayAdapter(context, -1, values) { override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { val (convertViewRet, holder) = if (convertView == null) { val binding = ErrorConsoleListItemBinding.inflate(LayoutInflater.from(context), parent, false) val convertViewLocal = binding.root val holderLocal = ViewHolder(binding) convertViewLocal.tag = holderLocal Pair(convertViewLocal, holderLocal) } else { Pair(convertView, convertView.tag as ViewHolder) } val item = getItem(position) holder.errorMessageView.text = context.getString(R.string.error_uncaught, item!!.errorMessage.developerErrorMessage()) if (item.stack.isNotEmpty()) { val bundle = item.stack[0] val path = bundle.getString("file") val fileName = if (path != null && path.isNotEmpty()) { val file = path.substring(path.lastIndexOf('/') + 1) "@$file" } else { "" } val lineNumber = when (val lineNumberObject = bundle["lineNumber"]) { is Double -> ":" + lineNumberObject.toInt() is Int -> ":" + lineNumberObject.toInt() else -> "" } val stacktracePreview = bundle.getString("methodName") + fileName + lineNumber holder.stacktraceView.text = stacktracePreview } var timestampViewText = SimpleDateFormat("HH:mm:ss", Locale.US).format(item.timestamp) if (item.isFatal) { timestampViewText += " Fatal Error" } holder.timestampView.text = timestampViewText return convertViewRet } internal class ViewHolder(binding: ErrorConsoleListItemBinding) { var errorMessageView: TextView = binding.errorConsoleItemMessage var stacktraceView: TextView = binding.errorConsoleItemStackPreview var timestampView: TextView = binding.errorConsoleItemTimestamp } }