ui: remove textSafe

Remove the textSafe method, as it is functionally useless.

textSafe relied on a dumb 1.0.0 thing where I used wrap_content on
text views. Now it just causes relayouts for no good reason.
This commit is contained in:
OxygenCobalt 2022-08-04 17:27:50 -06:00
parent c888035cbd
commit 96be8cb6b7
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
14 changed files with 52 additions and 77 deletions

View file

@ -36,7 +36,6 @@ import org.oxycblt.auxio.util.context
import org.oxycblt.auxio.util.formatDuration import org.oxycblt.auxio.util.formatDuration
import org.oxycblt.auxio.util.getPluralSafe import org.oxycblt.auxio.util.getPluralSafe
import org.oxycblt.auxio.util.inflater import org.oxycblt.auxio.util.inflater
import org.oxycblt.auxio.util.textSafe
/** /**
* An adapter for displaying [Album] information and it's children. * An adapter for displaying [Album] information and it's children.
@ -116,10 +115,10 @@ private class AlbumDetailViewHolder private constructor(private val binding: Ite
override fun bind(item: Album, listener: AlbumDetailAdapter.Listener) { override fun bind(item: Album, listener: AlbumDetailAdapter.Listener) {
binding.detailCover.bind(item) binding.detailCover.bind(item)
binding.detailName.textSafe = item.resolveName(binding.context) binding.detailName.text = item.resolveName(binding.context)
binding.detailSubhead.apply { binding.detailSubhead.apply {
textSafe = item.artist.resolveName(context) text = item.artist.resolveName(context)
setOnClickListener { listener.onNavigateToArtist() } setOnClickListener { listener.onNavigateToArtist() }
} }
@ -176,7 +175,7 @@ class DiscHeaderViewHolder(private val binding: ItemDiscHeaderBinding) :
BindingViewHolder<DiscHeader, Unit>(binding.root) { BindingViewHolder<DiscHeader, Unit>(binding.root) {
override fun bind(item: DiscHeader, listener: Unit) { override fun bind(item: DiscHeader, listener: Unit) {
binding.discNo.textSafe = binding.context.getString(R.string.fmt_disc_no, item.disc) binding.discNo.text = binding.context.getString(R.string.fmt_disc_no, item.disc)
} }
companion object { companion object {
@ -203,20 +202,20 @@ private class AlbumSongViewHolder private constructor(private val binding: ItemA
// Hide the track number view if the song does not have a track. // Hide the track number view if the song does not have a track.
if (item.track != null) { if (item.track != null) {
binding.songTrack.apply { binding.songTrack.apply {
textSafe = context.getString(R.string.fmt_number, item.track) text = context.getString(R.string.fmt_number, item.track)
isInvisible = false isInvisible = false
contentDescription = context.getString(R.string.desc_track_number, item.track) contentDescription = context.getString(R.string.desc_track_number, item.track)
} }
} else { } else {
binding.songTrack.apply { binding.songTrack.apply {
textSafe = "" text = ""
isInvisible = true isInvisible = true
contentDescription = context.getString(R.string.def_track) contentDescription = context.getString(R.string.def_track)
} }
} }
binding.songName.textSafe = item.resolveName(binding.context) binding.songName.text = item.resolveName(binding.context)
binding.songDuration.textSafe = item.durationSecs.formatDuration(false) binding.songDuration.text = item.durationSecs.formatDuration(false)
binding.root.apply { binding.root.apply {
setOnClickListener { listener.onItemClick(item) } setOnClickListener { listener.onItemClick(item) }

View file

@ -36,7 +36,6 @@ import org.oxycblt.auxio.ui.recycler.SimpleItemCallback
import org.oxycblt.auxio.util.context import org.oxycblt.auxio.util.context
import org.oxycblt.auxio.util.getPluralSafe import org.oxycblt.auxio.util.getPluralSafe
import org.oxycblt.auxio.util.inflater import org.oxycblt.auxio.util.inflater
import org.oxycblt.auxio.util.textSafe
/** /**
* An adapter for displaying [Artist] information and it's children. Unlike the other adapters, this * An adapter for displaying [Artist] information and it's children. Unlike the other adapters, this
@ -124,11 +123,11 @@ private class ArtistDetailViewHolder private constructor(private val binding: It
override fun bind(item: Artist, listener: DetailAdapter.Listener) { override fun bind(item: Artist, listener: DetailAdapter.Listener) {
binding.detailCover.bind(item) binding.detailCover.bind(item)
binding.detailName.textSafe = item.resolveName(binding.context) binding.detailName.text = item.resolveName(binding.context)
// Get the genre that corresponds to the most songs in this artist, which would be // Get the genre that corresponds to the most songs in this artist, which would be
// the most "Prominent" genre. // the most "Prominent" genre.
binding.detailSubhead.textSafe = binding.detailSubhead.text =
item.songs item.songs
.groupBy { it.genre.resolveName(binding.context) } .groupBy { it.genre.resolveName(binding.context) }
.entries .entries
@ -136,7 +135,7 @@ private class ArtistDetailViewHolder private constructor(private val binding: It
?.key ?.key
?: binding.context.getString(R.string.def_genre) ?: binding.context.getString(R.string.def_genre)
binding.detailInfo.textSafe = binding.detailInfo.text =
binding.context.getString( binding.context.getString(
R.string.fmt_two, R.string.fmt_two,
binding.context.getPluralSafe(R.plurals.fmt_album_count, item.albums.size), binding.context.getPluralSafe(R.plurals.fmt_album_count, item.albums.size),
@ -166,8 +165,8 @@ private constructor(
) : BindingViewHolder<Album, MenuItemListener>(binding.root) { ) : BindingViewHolder<Album, MenuItemListener>(binding.root) {
override fun bind(item: Album, listener: MenuItemListener) { override fun bind(item: Album, listener: MenuItemListener) {
binding.parentImage.bind(item) binding.parentImage.bind(item)
binding.parentName.textSafe = item.resolveName(binding.context) binding.parentName.text = item.resolveName(binding.context)
binding.parentInfo.textSafe = item.date.resolveYear(binding.context) binding.parentInfo.text = item.date.resolveYear(binding.context)
binding.root.apply { binding.root.apply {
setOnClickListener { listener.onItemClick(item) } setOnClickListener { listener.onItemClick(item) }
@ -202,8 +201,8 @@ private constructor(
) : BindingViewHolder<Song, MenuItemListener>(binding.root) { ) : BindingViewHolder<Song, MenuItemListener>(binding.root) {
override fun bind(item: Song, listener: MenuItemListener) { override fun bind(item: Song, listener: MenuItemListener) {
binding.songAlbumCover.bind(item) binding.songAlbumCover.bind(item)
binding.songName.textSafe = item.resolveName(binding.context) binding.songName.text = item.resolveName(binding.context)
binding.songInfo.textSafe = item.album.resolveName(binding.context) binding.songInfo.text = item.album.resolveName(binding.context)
binding.root.apply { binding.root.apply {
setOnClickListener { listener.onItemClick(item) } setOnClickListener { listener.onItemClick(item) }

View file

@ -36,7 +36,6 @@ import org.oxycblt.auxio.ui.recycler.SimpleItemCallback
import org.oxycblt.auxio.util.context import org.oxycblt.auxio.util.context
import org.oxycblt.auxio.util.inflater import org.oxycblt.auxio.util.inflater
import org.oxycblt.auxio.util.logW import org.oxycblt.auxio.util.logW
import org.oxycblt.auxio.util.textSafe
abstract class DetailAdapter<L : DetailAdapter.Listener>( abstract class DetailAdapter<L : DetailAdapter.Listener>(
listener: L, listener: L,
@ -130,7 +129,7 @@ abstract class DetailAdapter<L : DetailAdapter.Listener>(
class SortHeaderViewHolder(private val binding: ItemSortHeaderBinding) : class SortHeaderViewHolder(private val binding: ItemSortHeaderBinding) :
BindingViewHolder<SortHeader, DetailAdapter.Listener>(binding.root) { BindingViewHolder<SortHeader, DetailAdapter.Listener>(binding.root) {
override fun bind(item: SortHeader, listener: DetailAdapter.Listener) { override fun bind(item: SortHeader, listener: DetailAdapter.Listener) {
binding.headerTitle.textSafe = binding.context.getString(item.string) binding.headerTitle.text = binding.context.getString(item.string)
binding.headerButton.apply { binding.headerButton.apply {
TooltipCompat.setTooltipText(this, contentDescription) TooltipCompat.setTooltipText(this, contentDescription)
setOnClickListener(listener::onShowSortMenu) setOnClickListener(listener::onShowSortMenu)

View file

@ -34,7 +34,6 @@ import org.oxycblt.auxio.util.context
import org.oxycblt.auxio.util.formatDuration import org.oxycblt.auxio.util.formatDuration
import org.oxycblt.auxio.util.getPluralSafe import org.oxycblt.auxio.util.getPluralSafe
import org.oxycblt.auxio.util.inflater import org.oxycblt.auxio.util.inflater
import org.oxycblt.auxio.util.textSafe
/** /**
* An adapter for displaying genre information and it's children. * An adapter for displaying genre information and it's children.
@ -105,10 +104,10 @@ private class GenreDetailViewHolder private constructor(private val binding: Ite
BindingViewHolder<Genre, DetailAdapter.Listener>(binding.root) { BindingViewHolder<Genre, DetailAdapter.Listener>(binding.root) {
override fun bind(item: Genre, listener: DetailAdapter.Listener) { override fun bind(item: Genre, listener: DetailAdapter.Listener) {
binding.detailCover.bind(item) binding.detailCover.bind(item)
binding.detailName.textSafe = item.resolveName(binding.context) binding.detailName.text = item.resolveName(binding.context)
binding.detailSubhead.textSafe = binding.detailSubhead.text =
binding.context.getPluralSafe(R.plurals.fmt_song_count, item.songs.size) binding.context.getPluralSafe(R.plurals.fmt_song_count, item.songs.size)
binding.detailInfo.textSafe = item.durationSecs.formatDuration(false) binding.detailInfo.text = item.durationSecs.formatDuration(false)
binding.detailPlayButton.setOnClickListener { listener.onPlayParent() } binding.detailPlayButton.setOnClickListener { listener.onPlayParent() }
binding.detailShuffleButton.setOnClickListener { listener.onShuffleParent() } binding.detailShuffleButton.setOnClickListener { listener.onShuffleParent() }
} }
@ -137,8 +136,8 @@ class GenreSongViewHolder private constructor(private val binding: ItemSongBindi
BindingViewHolder<Song, MenuItemListener>(binding.root) { BindingViewHolder<Song, MenuItemListener>(binding.root) {
override fun bind(item: Song, listener: MenuItemListener) { override fun bind(item: Song, listener: MenuItemListener) {
binding.songAlbumCover.bind(item) binding.songAlbumCover.bind(item)
binding.songName.textSafe = item.resolveName(binding.context) binding.songName.text = item.resolveName(binding.context)
binding.songInfo.textSafe = item.resolveIndividualArtistName(binding.context) binding.songInfo.text = item.resolveIndividualArtistName(binding.context)
binding.root.apply { binding.root.apply {
setOnClickListener { listener.onItemClick(item) } setOnClickListener { listener.onItemClick(item) }
setOnLongClickListener { view -> setOnLongClickListener { view ->

View file

@ -286,7 +286,7 @@ class HomeFragment : ViewBindingFragment<FragmentHomeBinding>(), Toolbar.OnMenuI
when (response) { when (response) {
is Indexer.Response.Err -> { is Indexer.Response.Err -> {
binding.homeIndexingProgress.visibility = View.INVISIBLE binding.homeIndexingProgress.visibility = View.INVISIBLE
binding.homeIndexingStatus.textSafe = getString(R.string.err_index_failed) binding.homeIndexingStatus.text = getString(R.string.err_index_failed)
binding.homeIndexingAction.apply { binding.homeIndexingAction.apply {
visibility = View.VISIBLE visibility = View.VISIBLE
text = getString(R.string.lbl_retry) text = getString(R.string.lbl_retry)
@ -295,7 +295,7 @@ class HomeFragment : ViewBindingFragment<FragmentHomeBinding>(), Toolbar.OnMenuI
} }
is Indexer.Response.NoMusic -> { is Indexer.Response.NoMusic -> {
binding.homeIndexingProgress.visibility = View.INVISIBLE binding.homeIndexingProgress.visibility = View.INVISIBLE
binding.homeIndexingStatus.textSafe = getString(R.string.err_no_music) binding.homeIndexingStatus.text = getString(R.string.err_no_music)
binding.homeIndexingAction.apply { binding.homeIndexingAction.apply {
visibility = View.VISIBLE visibility = View.VISIBLE
text = getString(R.string.lbl_retry) text = getString(R.string.lbl_retry)
@ -304,7 +304,7 @@ class HomeFragment : ViewBindingFragment<FragmentHomeBinding>(), Toolbar.OnMenuI
} }
is Indexer.Response.NoPerms -> { is Indexer.Response.NoPerms -> {
binding.homeIndexingProgress.visibility = View.INVISIBLE binding.homeIndexingProgress.visibility = View.INVISIBLE
binding.homeIndexingStatus.textSafe = getString(R.string.err_no_perms) binding.homeIndexingStatus.text = getString(R.string.err_no_perms)
binding.homeIndexingAction.apply { binding.homeIndexingAction.apply {
visibility = View.VISIBLE visibility = View.VISIBLE
text = getString(R.string.lbl_grant) text = getString(R.string.lbl_grant)
@ -326,11 +326,11 @@ class HomeFragment : ViewBindingFragment<FragmentHomeBinding>(), Toolbar.OnMenuI
when (indexing) { when (indexing) {
is Indexer.Indexing.Indeterminate -> { is Indexer.Indexing.Indeterminate -> {
binding.homeIndexingStatus.textSafe = getString(R.string.lng_indexing_desc) binding.homeIndexingStatus.text = getString(R.string.lng_indexing_desc)
binding.homeIndexingProgress.isIndeterminate = true binding.homeIndexingProgress.isIndeterminate = true
} }
is Indexer.Indexing.Songs -> { is Indexer.Indexing.Songs -> {
binding.homeIndexingStatus.textSafe = binding.homeIndexingStatus.text =
getString(R.string.fmt_indexing, indexing.current, indexing.total) getString(R.string.fmt_indexing, indexing.current, indexing.total)
binding.homeIndexingProgress.apply { binding.homeIndexingProgress.apply {
isIndeterminate = false isIndeterminate = false

View file

@ -25,7 +25,6 @@ import org.oxycblt.auxio.ui.recycler.BindingViewHolder
import org.oxycblt.auxio.ui.recycler.MonoAdapter import org.oxycblt.auxio.ui.recycler.MonoAdapter
import org.oxycblt.auxio.util.context import org.oxycblt.auxio.util.context
import org.oxycblt.auxio.util.inflater import org.oxycblt.auxio.util.inflater
import org.oxycblt.auxio.util.textSafe
/** /**
* Adapter that shows the excluded directories and their "Clear" button. * Adapter that shows the excluded directories and their "Clear" button.
@ -74,7 +73,7 @@ class MusicDirAdapter(listener: Listener) :
class MusicDirViewHolder private constructor(private val binding: ItemMusicDirBinding) : class MusicDirViewHolder private constructor(private val binding: ItemMusicDirBinding) :
BindingViewHolder<Directory, MusicDirAdapter.Listener>(binding.root) { BindingViewHolder<Directory, MusicDirAdapter.Listener>(binding.root) {
override fun bind(item: Directory, listener: MusicDirAdapter.Listener) { override fun bind(item: Directory, listener: MusicDirAdapter.Listener) {
binding.dirPath.textSafe = item.resolveName(binding.context) binding.dirPath.text = item.resolveName(binding.context)
binding.dirDelete.setOnClickListener { listener.onRemoveDirectory(item) } binding.dirDelete.setOnClickListener { listener.onRemoveDirectory(item) }
} }

View file

@ -29,7 +29,6 @@ import org.oxycblt.auxio.ui.fragment.ViewBindingFragment
import org.oxycblt.auxio.util.androidActivityViewModels import org.oxycblt.auxio.util.androidActivityViewModels
import org.oxycblt.auxio.util.collectImmediately import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.getColorStateListSafe import org.oxycblt.auxio.util.getColorStateListSafe
import org.oxycblt.auxio.util.textSafe
/** /**
* A fragment showing the current playback state in a compact manner. Used as the bar for the * A fragment showing the current playback state in a compact manner. Used as the bar for the
@ -77,8 +76,8 @@ class PlaybackBarFragment : ViewBindingFragment<FragmentPlaybackBarBinding>() {
val context = requireContext() val context = requireContext()
val binding = requireBinding() val binding = requireBinding()
binding.playbackCover.bind(song) binding.playbackCover.bind(song)
binding.playbackSong.textSafe = song.resolveName(context) binding.playbackSong.text = song.resolveName(context)
binding.playbackInfo.textSafe = song.resolveIndividualArtistName(context) binding.playbackInfo.text = song.resolveIndividualArtistName(context)
binding.playbackProgressBar.max = song.durationSecs.toInt() binding.playbackProgressBar.max = song.durationSecs.toInt()
} }
} }

View file

@ -37,7 +37,6 @@ import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.getDrawableSafe import org.oxycblt.auxio.util.getDrawableSafe
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.systemBarInsetsCompat import org.oxycblt.auxio.util.systemBarInsetsCompat
import org.oxycblt.auxio.util.textSafe
/** /**
* A [Fragment] that displays more information about the song, along with more media controls. * A [Fragment] that displays more information about the song, along with more media controls.
@ -142,9 +141,9 @@ class PlaybackPanelFragment :
val binding = requireBinding() val binding = requireBinding()
val context = requireContext() val context = requireContext()
binding.playbackCover.bind(song) binding.playbackCover.bind(song)
binding.playbackSong.textSafe = song.resolveName(context) binding.playbackSong.text = song.resolveName(context)
binding.playbackArtist.textSafe = song.resolveIndividualArtistName(context) binding.playbackArtist.text = song.resolveIndividualArtistName(context)
binding.playbackAlbum.textSafe = song.album.resolveName(context) binding.playbackAlbum.text = song.album.resolveName(context)
binding.playbackSeekBar.durationSecs = song.durationSecs binding.playbackSeekBar.durationSecs = song.durationSecs
} }

View file

@ -25,7 +25,6 @@ import org.oxycblt.auxio.databinding.ViewSeekBarBinding
import org.oxycblt.auxio.util.formatDuration import org.oxycblt.auxio.util.formatDuration
import org.oxycblt.auxio.util.inflater import org.oxycblt.auxio.util.inflater
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.textSafe
/** /**
* A wrapper around [Slider] that shows not only position and duration values, but also basically * A wrapper around [Slider] that shows not only position and duration values, but also basically
@ -78,7 +77,7 @@ constructor(
// We would want to keep this in the callback, but the callback only fires when // We would want to keep this in the callback, but the callback only fires when
// a value changes completely, and sometimes that does not happen with this view. // a value changes completely, and sometimes that does not happen with this view.
binding.seekBarPosition.textSafe = value.formatDuration(true) binding.seekBarPosition.text = value.formatDuration(true)
} }
} }
@ -102,7 +101,7 @@ constructor(
} }
binding.seekBarSlider.valueTo = to.toFloat() binding.seekBarSlider.valueTo = to.toFloat()
binding.seekBarDuration.textSafe = value.formatDuration(false) binding.seekBarDuration.text = value.formatDuration(false)
} }
override fun onStartTrackingTouch(slider: Slider) { override fun onStartTrackingTouch(slider: Slider) {
@ -120,7 +119,7 @@ constructor(
} }
override fun onValueChange(slider: Slider, value: Float, fromUser: Boolean) { override fun onValueChange(slider: Slider, value: Float, fromUser: Boolean) {
binding.seekBarPosition.textSafe = value.toLong().formatDuration(true) binding.seekBarPosition.text = value.toLong().formatDuration(true)
} }
interface Callback { interface Callback {

View file

@ -123,8 +123,8 @@ private constructor(
@SuppressLint("ClickableViewAccessibility") @SuppressLint("ClickableViewAccessibility")
override fun bind(item: Song, listener: QueueItemListener) { override fun bind(item: Song, listener: QueueItemListener) {
binding.songAlbumCover.bind(item) binding.songAlbumCover.bind(item)
binding.songName.textSafe = item.resolveName(binding.context) binding.songName.text = item.resolveName(binding.context)
binding.songInfo.textSafe = item.resolveIndividualArtistName(binding.context) binding.songInfo.text = item.resolveIndividualArtistName(binding.context)
binding.background.isInvisible = true binding.background.isInvisible = true

View file

@ -28,7 +28,6 @@ import org.oxycblt.auxio.databinding.DialogPreAmpBinding
import org.oxycblt.auxio.settings.Settings import org.oxycblt.auxio.settings.Settings
import org.oxycblt.auxio.ui.fragment.ViewBindingDialogFragment import org.oxycblt.auxio.ui.fragment.ViewBindingDialogFragment
import org.oxycblt.auxio.util.context import org.oxycblt.auxio.util.context
import org.oxycblt.auxio.util.textSafe
/** /**
* The dialog for customizing the ReplayGain pre-amp values. * The dialog for customizing the ReplayGain pre-amp values.
@ -77,7 +76,7 @@ class PreAmpCustomizeDialog : ViewBindingDialogFragment<DialogPreAmpBinding>() {
// It is more clear to prepend a +/- before the pre-amp value to make it easier to // It is more clear to prepend a +/- before the pre-amp value to make it easier to
// gauge how much it may be increasing the volume, however android does not add + // gauge how much it may be increasing the volume, however android does not add +
// to positive float values when formatting them in a string. Instead, add it ourselves. // to positive float values when formatting them in a string. Instead, add it ourselves.
ticker.textSafe = ticker.text =
if (valueDb >= 0) { if (valueDb >= 0) {
getString(R.string.fmt_db_pos, valueDb) getString(R.string.fmt_db_pos, valueDb)
} else { } else {

View file

@ -43,7 +43,6 @@ import org.oxycblt.auxio.util.formatDuration
import org.oxycblt.auxio.util.logD import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.showToast import org.oxycblt.auxio.util.showToast
import org.oxycblt.auxio.util.systemBarInsetsCompat import org.oxycblt.auxio.util.systemBarInsetsCompat
import org.oxycblt.auxio.util.textSafe
/** /**
* A [BottomSheetDialogFragment] that shows Auxio's about screen. * A [BottomSheetDialogFragment] that shows Auxio's about screen.
@ -68,7 +67,7 @@ class AboutFragment : ViewBindingFragment<FragmentAboutBinding>() {
binding.aboutToolbar.setNavigationOnClickListener { findNavController().navigateUp() } binding.aboutToolbar.setNavigationOnClickListener { findNavController().navigateUp() }
binding.aboutVersion.textSafe = BuildConfig.VERSION_NAME binding.aboutVersion.text = BuildConfig.VERSION_NAME
binding.aboutCode.setOnClickListener { openLinkInBrowser(LINK_CODEBASE) } binding.aboutCode.setOnClickListener { openLinkInBrowser(LINK_CODEBASE) }
binding.aboutFaq.setOnClickListener { openLinkInBrowser(LINK_FAQ) } binding.aboutFaq.setOnClickListener { openLinkInBrowser(LINK_FAQ) }
binding.aboutLicenses.setOnClickListener { openLinkInBrowser(LINK_LICENSES) } binding.aboutLicenses.setOnClickListener { openLinkInBrowser(LINK_LICENSES) }
@ -81,26 +80,24 @@ class AboutFragment : ViewBindingFragment<FragmentAboutBinding>() {
private fun updateSongCount(songs: List<Song>) { private fun updateSongCount(songs: List<Song>) {
val binding = requireBinding() val binding = requireBinding()
binding.aboutSongCount.textSafe = getString(R.string.fmt_lib_song_count, songs.size) binding.aboutSongCount.text = getString(R.string.fmt_lib_song_count, songs.size)
binding.aboutTotalDuration.textSafe = binding.aboutTotalDuration.text =
getString( getString(
R.string.fmt_lib_total_duration, R.string.fmt_lib_total_duration,
songs.sumOf { it.durationSecs }.formatDuration(false)) songs.sumOf { it.durationSecs }.formatDuration(false))
} }
private fun updateAlbumCount(albums: List<Album>) { private fun updateAlbumCount(albums: List<Album>) {
requireBinding().aboutAlbumCount.textSafe = requireBinding().aboutAlbumCount.text = getString(R.string.fmt_lib_album_count, albums.size)
getString(R.string.fmt_lib_album_count, albums.size)
} }
private fun updateArtistCount(artists: List<Artist>) { private fun updateArtistCount(artists: List<Artist>) {
requireBinding().aboutArtistCount.textSafe = requireBinding().aboutArtistCount.text =
getString(R.string.fmt_lib_artist_count, artists.size) getString(R.string.fmt_lib_artist_count, artists.size)
} }
private fun updateGenreCount(genres: List<Genre>) { private fun updateGenreCount(genres: List<Genre>) {
requireBinding().aboutGenreCount.textSafe = requireBinding().aboutGenreCount.text = getString(R.string.fmt_lib_genre_count, genres.size)
getString(R.string.fmt_lib_genre_count, genres.size)
} }
/** Go through the process of opening a [link] in a browser. */ /** Go through the process of opening a [link] in a browser. */

View file

@ -30,7 +30,6 @@ import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.util.context import org.oxycblt.auxio.util.context
import org.oxycblt.auxio.util.getPluralSafe import org.oxycblt.auxio.util.getPluralSafe
import org.oxycblt.auxio.util.inflater import org.oxycblt.auxio.util.inflater
import org.oxycblt.auxio.util.textSafe
/** /**
* The shared ViewHolder for a [Song]. * The shared ViewHolder for a [Song].
@ -40,8 +39,8 @@ class SongViewHolder private constructor(private val binding: ItemSongBinding) :
BindingViewHolder<Song, MenuItemListener>(binding.root) { BindingViewHolder<Song, MenuItemListener>(binding.root) {
override fun bind(item: Song, listener: MenuItemListener) { override fun bind(item: Song, listener: MenuItemListener) {
binding.songAlbumCover.bind(item) binding.songAlbumCover.bind(item)
binding.songName.textSafe = item.resolveName(binding.context) binding.songName.text = item.resolveName(binding.context)
binding.songInfo.textSafe = item.resolveIndividualArtistName(binding.context) binding.songInfo.text = item.resolveIndividualArtistName(binding.context)
binding.root.apply { binding.root.apply {
setOnClickListener { listener.onItemClick(item) } setOnClickListener { listener.onItemClick(item) }
setOnLongClickListener { view -> setOnLongClickListener { view ->
@ -81,8 +80,8 @@ private constructor(
override fun bind(item: Album, listener: MenuItemListener) { override fun bind(item: Album, listener: MenuItemListener) {
binding.parentImage.bind(item) binding.parentImage.bind(item)
binding.parentName.textSafe = item.resolveName(binding.context) binding.parentName.text = item.resolveName(binding.context)
binding.parentInfo.textSafe = item.artist.resolveName(binding.context) binding.parentInfo.text = item.artist.resolveName(binding.context)
binding.root.apply { binding.root.apply {
setOnClickListener { listener.onItemClick(item) } setOnClickListener { listener.onItemClick(item) }
setOnLongClickListener { view -> setOnLongClickListener { view ->
@ -121,8 +120,8 @@ class ArtistViewHolder private constructor(private val binding: ItemParentBindin
override fun bind(item: Artist, listener: MenuItemListener) { override fun bind(item: Artist, listener: MenuItemListener) {
binding.parentImage.bind(item) binding.parentImage.bind(item)
binding.parentName.textSafe = item.resolveName(binding.context) binding.parentName.text = item.resolveName(binding.context)
binding.parentInfo.textSafe = binding.parentInfo.text =
binding.context.getString( binding.context.getString(
R.string.fmt_two, R.string.fmt_two,
binding.context.getPluralSafe(R.plurals.fmt_album_count, item.albums.size), binding.context.getPluralSafe(R.plurals.fmt_album_count, item.albums.size),
@ -167,8 +166,8 @@ private constructor(
override fun bind(item: Genre, listener: MenuItemListener) { override fun bind(item: Genre, listener: MenuItemListener) {
binding.parentImage.bind(item) binding.parentImage.bind(item)
binding.parentName.textSafe = item.resolveName(binding.context) binding.parentName.text = item.resolveName(binding.context)
binding.parentInfo.textSafe = binding.parentInfo.text =
binding.context.getPluralSafe(R.plurals.fmt_song_count, item.songs.size) binding.context.getPluralSafe(R.plurals.fmt_song_count, item.songs.size)
binding.root.apply { binding.root.apply {
setOnClickListener { listener.onItemClick(item) } setOnClickListener { listener.onItemClick(item) }
@ -205,7 +204,7 @@ class HeaderViewHolder private constructor(private val binding: ItemHeaderBindin
BindingViewHolder<Header, Unit>(binding.root) { BindingViewHolder<Header, Unit>(binding.root) {
override fun bind(item: Header, listener: Unit) { override fun bind(item: Header, listener: Unit) {
binding.title.textSafe = binding.context.getString(item.string) binding.title.text = binding.context.getString(item.string)
} }
companion object { companion object {

View file

@ -26,7 +26,6 @@ import android.graphics.drawable.Drawable
import android.os.Build import android.os.Build
import android.view.View import android.view.View
import android.view.WindowInsets import android.view.WindowInsets
import android.widget.TextView
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.annotation.ColorRes import androidx.annotation.ColorRes
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
@ -114,17 +113,6 @@ val Drawable.isRtl: Boolean
val ViewBinding.context: Context val ViewBinding.context: Context
get() = root.context get() = root.context
/**
* A variation of [TextView.setText] that automatically relayouts the view when updated. Helps with
* getting ellipsize functionality to work.
*/
var TextView.textSafe: CharSequence
get() = text
set(value) {
text = value
requestLayout()
}
/** /**
* Apply the recommended spans for a [RecyclerView]. * Apply the recommended spans for a [RecyclerView].
* *