package link.roadio.riff.userstate.android import android.icu.lang.UCharacter import android.icu.text.BreakIterator import android.icu.text.Normalizer2 import link.roadio.riff.userstate.model.ProfileStateModel import java.util.Locale /** Android's existing Unicode naming semantics are shared by ingress and accepted-snapshot reads. */ object AndroidUserStateValidation { fun canonicalName(name: String): String { require(name.isNotBlank() && name == name.trim()) val iterator = BreakIterator.getCharacterInstance(Locale.ROOT).apply { setText(name) } var count = 0 while (iterator.next() != BreakIterator.DONE) require(++count <= 120) { "Queue name exceeds 120 grapheme clusters" } return UCharacter.foldCase(Normalizer2.getNFKCInstance().normalize(name), true) } fun profile(profile: ProfileStateModel) { val names = profile.savedQueues.filter { it.kind == 0 }.map { canonicalName(checkNotNull(it.name)) } require(names.toSet().size == names.size) { "Duplicate Music playlist name" } profile.savedQueues.filter { it.kind == 1 }.forEach { canonicalName(checkNotNull(it.name)) } } }