I'd move the GetBounds and offset calculation just before the canvas.drawText
this ensures the centering.
example: if your first contact character is a dot - which !isLetter - the position of the shown character isn't proper.
same with contacts with only numbers (first char is a plus) - shown character is the question mark with the bounds/offset of the plus
works creat for me - and should also work for non latin letters