playback: allow customization of detail playback
Add a new "Detail playback mode" option that allows one to configure what selecting a song will do in an album/artist/genre. This is mostly a clone of the prior setting, just in a new context. Resolves #164.
This commit is contained in:
parent
787a0df595
commit
8465cda637
23 changed files with 145 additions and 75 deletions
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
#### What's New
|
#### What's New
|
||||||
- Added a shuffle shortcut
|
- Added a shuffle shortcut
|
||||||
|
- You can now customize what occurs when a song is played from an album/artist/genre [#164]
|
||||||
|
|
||||||
#### What's Fixed
|
#### What's Fixed
|
||||||
- Fixed broken tablet layouts
|
- Fixed broken tablet layouts
|
||||||
|
|
|
||||||
|
|
@ -38,12 +38,14 @@ import org.oxycblt.auxio.music.Music
|
||||||
import org.oxycblt.auxio.music.MusicParent
|
import org.oxycblt.auxio.music.MusicParent
|
||||||
import org.oxycblt.auxio.music.Song
|
import org.oxycblt.auxio.music.Song
|
||||||
import org.oxycblt.auxio.playback.state.PlaybackMode
|
import org.oxycblt.auxio.playback.state.PlaybackMode
|
||||||
|
import org.oxycblt.auxio.settings.Settings
|
||||||
import org.oxycblt.auxio.ui.Header
|
import org.oxycblt.auxio.ui.Header
|
||||||
import org.oxycblt.auxio.ui.Item
|
import org.oxycblt.auxio.ui.Item
|
||||||
import org.oxycblt.auxio.ui.MenuFragment
|
import org.oxycblt.auxio.ui.MenuFragment
|
||||||
import org.oxycblt.auxio.util.applySpans
|
import org.oxycblt.auxio.util.applySpans
|
||||||
import org.oxycblt.auxio.util.canScroll
|
import org.oxycblt.auxio.util.canScroll
|
||||||
import org.oxycblt.auxio.util.collectWith
|
import org.oxycblt.auxio.util.collectWith
|
||||||
|
import org.oxycblt.auxio.util.context
|
||||||
import org.oxycblt.auxio.util.launch
|
import org.oxycblt.auxio.util.launch
|
||||||
import org.oxycblt.auxio.util.logD
|
import org.oxycblt.auxio.util.logD
|
||||||
import org.oxycblt.auxio.util.logEOrThrow
|
import org.oxycblt.auxio.util.logEOrThrow
|
||||||
|
|
@ -62,6 +64,7 @@ class AlbumDetailFragment :
|
||||||
|
|
||||||
private val args: AlbumDetailFragmentArgs by navArgs()
|
private val args: AlbumDetailFragmentArgs by navArgs()
|
||||||
private val detailAdapter = AlbumDetailAdapter(this)
|
private val detailAdapter = AlbumDetailAdapter(this)
|
||||||
|
private val settings: Settings by lifecycleObject { binding -> Settings(binding.context) }
|
||||||
|
|
||||||
override fun onCreateBinding(inflater: LayoutInflater) = FragmentDetailBinding.inflate(inflater)
|
override fun onCreateBinding(inflater: LayoutInflater) = FragmentDetailBinding.inflate(inflater)
|
||||||
|
|
||||||
|
|
@ -118,7 +121,7 @@ class AlbumDetailFragment :
|
||||||
|
|
||||||
override fun onItemClick(item: Item) {
|
override fun onItemClick(item: Item) {
|
||||||
if (item is Song) {
|
if (item is Song) {
|
||||||
playbackModel.play(item, PlaybackMode.IN_ALBUM)
|
playbackModel.play(item, settings.detailPlaybackMode ?: PlaybackMode.IN_ALBUM)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,11 +36,13 @@ import org.oxycblt.auxio.music.Music
|
||||||
import org.oxycblt.auxio.music.MusicParent
|
import org.oxycblt.auxio.music.MusicParent
|
||||||
import org.oxycblt.auxio.music.Song
|
import org.oxycblt.auxio.music.Song
|
||||||
import org.oxycblt.auxio.playback.state.PlaybackMode
|
import org.oxycblt.auxio.playback.state.PlaybackMode
|
||||||
|
import org.oxycblt.auxio.settings.Settings
|
||||||
import org.oxycblt.auxio.ui.Header
|
import org.oxycblt.auxio.ui.Header
|
||||||
import org.oxycblt.auxio.ui.Item
|
import org.oxycblt.auxio.ui.Item
|
||||||
import org.oxycblt.auxio.ui.MenuFragment
|
import org.oxycblt.auxio.ui.MenuFragment
|
||||||
import org.oxycblt.auxio.util.applySpans
|
import org.oxycblt.auxio.util.applySpans
|
||||||
import org.oxycblt.auxio.util.collectWith
|
import org.oxycblt.auxio.util.collectWith
|
||||||
|
import org.oxycblt.auxio.util.context
|
||||||
import org.oxycblt.auxio.util.launch
|
import org.oxycblt.auxio.util.launch
|
||||||
import org.oxycblt.auxio.util.logD
|
import org.oxycblt.auxio.util.logD
|
||||||
import org.oxycblt.auxio.util.logEOrThrow
|
import org.oxycblt.auxio.util.logEOrThrow
|
||||||
|
|
@ -57,6 +59,7 @@ class ArtistDetailFragment :
|
||||||
|
|
||||||
private val args: ArtistDetailFragmentArgs by navArgs()
|
private val args: ArtistDetailFragmentArgs by navArgs()
|
||||||
private val detailAdapter = ArtistDetailAdapter(this)
|
private val detailAdapter = ArtistDetailAdapter(this)
|
||||||
|
private val settings: Settings by lifecycleObject { binding -> Settings(binding.context) }
|
||||||
|
|
||||||
override fun onCreateBinding(inflater: LayoutInflater) = FragmentDetailBinding.inflate(inflater)
|
override fun onCreateBinding(inflater: LayoutInflater) = FragmentDetailBinding.inflate(inflater)
|
||||||
|
|
||||||
|
|
@ -110,7 +113,8 @@ class ArtistDetailFragment :
|
||||||
|
|
||||||
override fun onItemClick(item: Item) {
|
override fun onItemClick(item: Item) {
|
||||||
when (item) {
|
when (item) {
|
||||||
is Song -> playbackModel.play(item, PlaybackMode.IN_ARTIST)
|
is Song ->
|
||||||
|
playbackModel.play(item, settings.detailPlaybackMode ?: PlaybackMode.IN_ARTIST)
|
||||||
is Album -> navModel.exploreNavigateTo(item)
|
is Album -> navModel.exploreNavigateTo(item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,11 +37,13 @@ import org.oxycblt.auxio.music.Music
|
||||||
import org.oxycblt.auxio.music.MusicParent
|
import org.oxycblt.auxio.music.MusicParent
|
||||||
import org.oxycblt.auxio.music.Song
|
import org.oxycblt.auxio.music.Song
|
||||||
import org.oxycblt.auxio.playback.state.PlaybackMode
|
import org.oxycblt.auxio.playback.state.PlaybackMode
|
||||||
|
import org.oxycblt.auxio.settings.Settings
|
||||||
import org.oxycblt.auxio.ui.Header
|
import org.oxycblt.auxio.ui.Header
|
||||||
import org.oxycblt.auxio.ui.Item
|
import org.oxycblt.auxio.ui.Item
|
||||||
import org.oxycblt.auxio.ui.MenuFragment
|
import org.oxycblt.auxio.ui.MenuFragment
|
||||||
import org.oxycblt.auxio.util.applySpans
|
import org.oxycblt.auxio.util.applySpans
|
||||||
import org.oxycblt.auxio.util.collectWith
|
import org.oxycblt.auxio.util.collectWith
|
||||||
|
import org.oxycblt.auxio.util.context
|
||||||
import org.oxycblt.auxio.util.launch
|
import org.oxycblt.auxio.util.launch
|
||||||
import org.oxycblt.auxio.util.logD
|
import org.oxycblt.auxio.util.logD
|
||||||
import org.oxycblt.auxio.util.logEOrThrow
|
import org.oxycblt.auxio.util.logEOrThrow
|
||||||
|
|
@ -58,6 +60,7 @@ class GenreDetailFragment :
|
||||||
|
|
||||||
private val args: GenreDetailFragmentArgs by navArgs()
|
private val args: GenreDetailFragmentArgs by navArgs()
|
||||||
private val detailAdapter = GenreDetailAdapter(this)
|
private val detailAdapter = GenreDetailAdapter(this)
|
||||||
|
private val settings: Settings by lifecycleObject { binding -> Settings(binding.context) }
|
||||||
|
|
||||||
override fun onCreateBinding(inflater: LayoutInflater) = FragmentDetailBinding.inflate(inflater)
|
override fun onCreateBinding(inflater: LayoutInflater) = FragmentDetailBinding.inflate(inflater)
|
||||||
|
|
||||||
|
|
@ -110,7 +113,8 @@ class GenreDetailFragment :
|
||||||
|
|
||||||
override fun onItemClick(item: Item) {
|
override fun onItemClick(item: Item) {
|
||||||
when (item) {
|
when (item) {
|
||||||
is Song -> playbackModel.play(item, PlaybackMode.IN_GENRE)
|
is Song ->
|
||||||
|
playbackModel.play(item, settings.detailPlaybackMode ?: PlaybackMode.IN_GENRE)
|
||||||
is Album ->
|
is Album ->
|
||||||
findNavController()
|
findNavController()
|
||||||
.navigate(ArtistDetailFragmentDirections.actionShowAlbum(item.id))
|
.navigate(ArtistDetailFragmentDirections.actionShowAlbum(item.id))
|
||||||
|
|
|
||||||
|
|
@ -147,7 +147,7 @@ class HomeViewModel(application: Application) :
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onSettingChanged(key: String) {
|
override fun onSettingChanged(key: String) {
|
||||||
if (key == application.getString(R.string.set_lib_tabs)) {
|
if (key == application.getString(R.string.set_key_lib_tabs)) {
|
||||||
tabs = visibleTabs
|
tabs = visibleTabs
|
||||||
_shouldRecreateTabs.value = true
|
_shouldRecreateTabs.value = true
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ class SongListFragment : HomeListFragment<Song>() {
|
||||||
|
|
||||||
override fun onItemClick(item: Item) {
|
override fun onItemClick(item: Item) {
|
||||||
check(item is Song)
|
check(item is Song)
|
||||||
playbackModel.play(item, settings.songPlaybackMode)
|
playbackModel.play(item, settings.libPlaybackMode)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onOpenMenu(item: Item, anchor: View) {
|
override fun onOpenMenu(item: Item, anchor: View) {
|
||||||
|
|
|
||||||
|
|
@ -29,10 +29,10 @@ import org.oxycblt.auxio.ui.MainNavigationAction
|
||||||
import org.oxycblt.auxio.ui.NavigationViewModel
|
import org.oxycblt.auxio.ui.NavigationViewModel
|
||||||
import org.oxycblt.auxio.ui.ViewBindingFragment
|
import org.oxycblt.auxio.ui.ViewBindingFragment
|
||||||
import org.oxycblt.auxio.util.androidActivityViewModels
|
import org.oxycblt.auxio.util.androidActivityViewModels
|
||||||
|
import org.oxycblt.auxio.util.collectImmediately
|
||||||
import org.oxycblt.auxio.util.getColorStateListSafe
|
import org.oxycblt.auxio.util.getColorStateListSafe
|
||||||
import org.oxycblt.auxio.util.getSystemBarInsetsCompat
|
import org.oxycblt.auxio.util.getSystemBarInsetsCompat
|
||||||
import org.oxycblt.auxio.util.getSystemGestureInsetsCompat
|
import org.oxycblt.auxio.util.getSystemGestureInsetsCompat
|
||||||
import org.oxycblt.auxio.util.launch
|
|
||||||
import org.oxycblt.auxio.util.textSafe
|
import org.oxycblt.auxio.util.textSafe
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -76,15 +76,17 @@ class PlaybackBarFragment : ViewBindingFragment<FragmentPlaybackBarBinding>() {
|
||||||
binding.playbackProgressBar.trackColor =
|
binding.playbackProgressBar.trackColor =
|
||||||
requireContext().getColorStateListSafe(R.color.sel_track).defaultColor
|
requireContext().getColorStateListSafe(R.color.sel_track).defaultColor
|
||||||
|
|
||||||
|
binding.playbackProgressBar.progress = 0
|
||||||
|
|
||||||
binding.playbackPlayPause.setOnClickListener { playbackModel.invertPlaying() }
|
binding.playbackPlayPause.setOnClickListener { playbackModel.invertPlaying() }
|
||||||
|
|
||||||
binding.playbackSkipNext.setOnClickListener { playbackModel.next() }
|
binding.playbackSkipNext.setOnClickListener { playbackModel.next() }
|
||||||
|
|
||||||
// -- VIEWMODEL SETUP ---
|
// -- VIEWMODEL SETUP ---
|
||||||
|
|
||||||
launch { playbackModel.song.collect(::updateSong) }
|
collectImmediately(playbackModel.song, ::updateSong)
|
||||||
launch { playbackModel.isPlaying.collect(::updateIsPlaying) }
|
collectImmediately(playbackModel.isPlaying, ::updateIsPlaying)
|
||||||
launch { playbackModel.positionSecs.collect(::updatePosition) }
|
collectImmediately(playbackModel.positionSecs, ::updatePosition)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateSong(song: Song?) {
|
private fun updateSong(song: Song?) {
|
||||||
|
|
|
||||||
|
|
@ -171,7 +171,7 @@ class PlaybackViewModel(application: Application) :
|
||||||
is DelayedAction.ShuffleAll -> shuffleAll()
|
is DelayedAction.ShuffleAll -> shuffleAll()
|
||||||
is DelayedAction.Open -> {
|
is DelayedAction.Open -> {
|
||||||
library.findSongForUri(application, action.uri)?.let { song ->
|
library.findSongForUri(application, action.uri)?.let { song ->
|
||||||
play(song, settings.songPlaybackMode)
|
play(song, settings.libPlaybackMode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -126,7 +126,7 @@ class SearchFragment :
|
||||||
|
|
||||||
override fun onItemClick(item: Item) {
|
override fun onItemClick(item: Item) {
|
||||||
when (item) {
|
when (item) {
|
||||||
is Song -> playbackModel.play(item, settings.songPlaybackMode)
|
is Song -> playbackModel.play(item, settings.libPlaybackMode)
|
||||||
is MusicParent -> navModel.exploreNavigateTo(item)
|
is MusicParent -> navModel.exploreNavigateTo(item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -152,13 +152,24 @@ class Settings(private val context: Context, private val callback: Callback? = n
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** What queue to create when a song is selected (ex. From All Songs or Search) */
|
/** What queue to create when a song is selected from the library or search */
|
||||||
val songPlaybackMode: PlaybackMode
|
val libPlaybackMode: PlaybackMode
|
||||||
get() =
|
get() =
|
||||||
PlaybackMode.fromInt(
|
PlaybackMode.fromInt(
|
||||||
inner.getInt(context.getString(R.string.set_key_song_play_mode), Int.MIN_VALUE))
|
inner.getInt(
|
||||||
|
context.getString(R.string.set_key_library_song_playback_mode), Int.MIN_VALUE))
|
||||||
?: PlaybackMode.ALL_SONGS
|
?: PlaybackMode.ALL_SONGS
|
||||||
|
|
||||||
|
/**
|
||||||
|
* What queue t create when a song is selected from an album/artist/genre. Null means to default
|
||||||
|
* to the currently shown item.
|
||||||
|
*/
|
||||||
|
val detailPlaybackMode: PlaybackMode?
|
||||||
|
get() =
|
||||||
|
PlaybackMode.fromInt(
|
||||||
|
inner.getInt(
|
||||||
|
context.getString(R.string.set_key_detail_song_playback_mode), Int.MIN_VALUE))
|
||||||
|
|
||||||
/** Whether shuffle should stay on when a new song is selected. */
|
/** Whether shuffle should stay on when a new song is selected. */
|
||||||
val keepShuffle: Boolean
|
val keepShuffle: Boolean
|
||||||
get() = inner.getBoolean(context.getString(R.string.set_key_keep_shuffle), true)
|
get() = inner.getBoolean(context.getString(R.string.set_key_keep_shuffle), true)
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,7 @@ import androidx.recyclerview.widget.RecyclerView
|
||||||
import androidx.viewbinding.ViewBinding
|
import androidx.viewbinding.ViewBinding
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
import kotlinx.coroutines.flow.StateFlow
|
||||||
import kotlinx.coroutines.flow.combine
|
import kotlinx.coroutines.flow.combine
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import org.oxycblt.auxio.R
|
import org.oxycblt.auxio.R
|
||||||
|
|
@ -157,6 +158,21 @@ val RecyclerView.canScroll: Boolean
|
||||||
val @receiver:ColorRes Int.stateList
|
val @receiver:ColorRes Int.stateList
|
||||||
get() = ColorStateList.valueOf(this)
|
get() = ColorStateList.valueOf(this)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collect a [stateFlow] into [block] a UI-safe way.
|
||||||
|
*
|
||||||
|
* This method automatically calls [block] when initially starting to ensure UI state consistency.
|
||||||
|
* This does nominally mean that there are two initializing collections, but this is considered
|
||||||
|
* okay. [block] should be a function pointer in order to ensure lifecycle consistency.
|
||||||
|
*
|
||||||
|
* Only use this if your code absolutely needs to have a good state for ~100ms of draw-time.
|
||||||
|
* Otherwise, it's somewhat in-efficient.
|
||||||
|
*/
|
||||||
|
fun <T> Fragment.collectImmediately(stateFlow: StateFlow<T>, block: (T) -> Unit) {
|
||||||
|
block(stateFlow.value)
|
||||||
|
launch { stateFlow.collect(block) }
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Launches [block] in a lifecycle-aware coroutine once [state] is reached. This is primarily a
|
* Launches [block] in a lifecycle-aware coroutine once [state] is reached. This is primarily a
|
||||||
* shortcut intended to correctly launch a co-routine on a fragment in a way that won't cause
|
* shortcut intended to correctly launch a co-routine on a fragment in a way that won't cause
|
||||||
|
|
|
||||||
|
|
@ -30,10 +30,10 @@
|
||||||
<string name="lbl_playback">يعمل الآن</string>
|
<string name="lbl_playback">يعمل الآن</string>
|
||||||
<string name="lbl_play">تشغيل</string>
|
<string name="lbl_play">تشغيل</string>
|
||||||
<string name="lbl_shuffle">خلط</string>
|
<string name="lbl_shuffle">خلط</string>
|
||||||
<string name="lbl_play_all">تشغيل من جميع الاغاني</string>
|
<string name="set_playback_mode_all">تشغيل من جميع الاغاني</string>
|
||||||
<string name="lbl_play_album">تشغيل من البوم</string>
|
<string name="set_playback_mode_album">تشغيل من البوم</string>
|
||||||
<string name="lbl_play_artist">تشغيل من فنان</string>
|
<string name="set_playback_mode_artist">تشغيل من فنان</string>
|
||||||
<string name="lbl_play_genre">تشغيل من نوع</string>
|
<string name="set_playback_mode_genre">تشغيل من نوع</string>
|
||||||
|
|
||||||
<string name="lbl_queue">طابور</string>
|
<string name="lbl_queue">طابور</string>
|
||||||
<string name="lbl_play_next">شغل تالياً</string>
|
<string name="lbl_play_next">شغل تالياً</string>
|
||||||
|
|
@ -88,7 +88,7 @@
|
||||||
<string name="set_replay_gain_dynamic">ديناميكي</string>
|
<string name="set_replay_gain_dynamic">ديناميكي</string>
|
||||||
|
|
||||||
<string name="set_behavior">سلوك</string>
|
<string name="set_behavior">سلوك</string>
|
||||||
<string name="set_song_mode">عند اختيار اغنية</string>
|
<string name="set_library_song_playback_mode">عند اختيار اغنية</string>
|
||||||
<string name="set_keep_shuffle">تذكر الخلط</string>
|
<string name="set_keep_shuffle">تذكر الخلط</string>
|
||||||
<string name="set_keep_shuffle_desc">إبقاء وضع الخلط عند تشغيل اغنية جديدة</string>
|
<string name="set_keep_shuffle_desc">إبقاء وضع الخلط عند تشغيل اغنية جديدة</string>
|
||||||
<string name="set_rewind_prev">تشجيع قبل التخطي للخلف</string>
|
<string name="set_rewind_prev">تشجيع قبل التخطي للخلف</string>
|
||||||
|
|
|
||||||
|
|
@ -35,10 +35,10 @@
|
||||||
<string name="lbl_playback">Právě hraje</string>
|
<string name="lbl_playback">Právě hraje</string>
|
||||||
<string name="lbl_play">Přehrát</string>
|
<string name="lbl_play">Přehrát</string>
|
||||||
<string name="lbl_shuffle">Náhodně</string>
|
<string name="lbl_shuffle">Náhodně</string>
|
||||||
<string name="lbl_play_all">Přehrát ze všech skladeb</string>
|
<string name="set_playback_mode_all">Přehrát ze všech skladeb</string>
|
||||||
<string name="lbl_play_album">Přehrát z alba</string>
|
<string name="set_playback_mode_album">Přehrát z alba</string>
|
||||||
<string name="lbl_play_artist">Přehrát z umělce</string>
|
<string name="set_playback_mode_artist">Přehrát z umělce</string>
|
||||||
<string name="lbl_play_genre">Přehrát ze žánru</string>
|
<string name="set_playback_mode_genre">Přehrát ze žánru</string>
|
||||||
|
|
||||||
<string name="lbl_queue">Fronta</string>
|
<string name="lbl_queue">Fronta</string>
|
||||||
<string name="lbl_play_next">Přehrát další</string>
|
<string name="lbl_play_next">Přehrát další</string>
|
||||||
|
|
@ -104,7 +104,7 @@
|
||||||
<string name="set_pre_amp_warning">Varování: Změna předzesilovače na vysokou kladnou hodnotu může u některých zvukových stop vést k příliš vysokým hlasitostem.</string>
|
<string name="set_pre_amp_warning">Varování: Změna předzesilovače na vysokou kladnou hodnotu může u některých zvukových stop vést k příliš vysokým hlasitostem.</string>
|
||||||
|
|
||||||
<string name="set_behavior">Chování</string>
|
<string name="set_behavior">Chování</string>
|
||||||
<string name="set_song_mode">Když je vybrána skladba</string>
|
<string name="set_library_song_playback_mode">Když je vybrána skladba</string>
|
||||||
<string name="set_keep_shuffle">Zapamatovat si náhodné přehrávání</string>
|
<string name="set_keep_shuffle">Zapamatovat si náhodné přehrávání</string>
|
||||||
<string name="set_keep_shuffle_desc">Ponechat náhodné přehrávání při přehrávání nové skladby</string>
|
<string name="set_keep_shuffle_desc">Ponechat náhodné přehrávání při přehrávání nové skladby</string>
|
||||||
<string name="set_rewind_prev">Přetočit před přeskočením zpět</string>
|
<string name="set_rewind_prev">Přetočit před přeskočením zpět</string>
|
||||||
|
|
|
||||||
|
|
@ -22,10 +22,10 @@
|
||||||
|
|
||||||
<string name="lbl_play">Abspielen</string>
|
<string name="lbl_play">Abspielen</string>
|
||||||
<string name="lbl_shuffle">Zufällig</string>
|
<string name="lbl_shuffle">Zufällig</string>
|
||||||
<string name="lbl_play_all">Von allen Lieder abspielen</string>
|
<string name="set_playback_mode_all">Von allen Lieder abspielen</string>
|
||||||
<string name="lbl_play_album">Von Album abspielen</string>
|
<string name="set_playback_mode_album">Von Album abspielen</string>
|
||||||
<string name="lbl_play_artist">Von Künstler abspielen</string>
|
<string name="set_playback_mode_artist">Von Künstler abspielen</string>
|
||||||
<string name="lbl_play_genre">Von Genre abspielen</string>
|
<string name="set_playback_mode_genre">Von Genre abspielen</string>
|
||||||
<string name="lbl_playback">Aktuelle Wiedergabe</string>
|
<string name="lbl_playback">Aktuelle Wiedergabe</string>
|
||||||
|
|
||||||
<string name="lbl_queue">Warteschlange</string>
|
<string name="lbl_queue">Warteschlange</string>
|
||||||
|
|
@ -84,7 +84,7 @@
|
||||||
<string name="set_replay_gain_album">Album bevorzugen</string>
|
<string name="set_replay_gain_album">Album bevorzugen</string>
|
||||||
|
|
||||||
<string name="set_behavior">Verhalten</string>
|
<string name="set_behavior">Verhalten</string>
|
||||||
<string name="set_song_mode">Wenn ein Lied ausgewählt wird</string>
|
<string name="set_library_song_playback_mode">Wenn ein Lied ausgewählt wird</string>
|
||||||
<string name="set_keep_shuffle">Zufällig-Einstellung merken</string>
|
<string name="set_keep_shuffle">Zufällig-Einstellung merken</string>
|
||||||
<string name="set_keep_shuffle_desc">Zufällig anlassen, wenn ein neues Lied abgespielt wird</string>
|
<string name="set_keep_shuffle_desc">Zufällig anlassen, wenn ein neues Lied abgespielt wird</string>
|
||||||
<string name="set_rewind_prev" tools:ignore="Typos">Zurückspulen, bevor das Lied zurück geändert wird</string>
|
<string name="set_rewind_prev" tools:ignore="Typos">Zurückspulen, bevor das Lied zurück geändert wird</string>
|
||||||
|
|
|
||||||
|
|
@ -30,10 +30,10 @@
|
||||||
<string name="lbl_playback">En reproducción</string>
|
<string name="lbl_playback">En reproducción</string>
|
||||||
<string name="lbl_play">Reproducir</string>
|
<string name="lbl_play">Reproducir</string>
|
||||||
<string name="lbl_shuffle">Mezcla</string>
|
<string name="lbl_shuffle">Mezcla</string>
|
||||||
<string name="lbl_play_all">Reproducir todo</string>
|
<string name="set_playback_mode_all">Reproducir todo</string>
|
||||||
<string name="lbl_play_album">Reproducir por álbum</string>
|
<string name="set_playback_mode_album">Reproducir por álbum</string>
|
||||||
<string name="lbl_play_artist">Reproducir por artista</string>
|
<string name="set_playback_mode_artist">Reproducir por artista</string>
|
||||||
<string name="lbl_play_genre">Reproducir por género</string>
|
<string name="set_playback_mode_genre">Reproducir por género</string>
|
||||||
|
|
||||||
<string name="lbl_queue">Cola</string>
|
<string name="lbl_queue">Cola</string>
|
||||||
<string name="lbl_play_next">Reproducir siguiente</string>
|
<string name="lbl_play_next">Reproducir siguiente</string>
|
||||||
|
|
@ -88,7 +88,7 @@
|
||||||
<string name="set_replay_gain_dynamic">Dinámico</string>
|
<string name="set_replay_gain_dynamic">Dinámico</string>
|
||||||
|
|
||||||
<string name="set_behavior">Comportamiento</string>
|
<string name="set_behavior">Comportamiento</string>
|
||||||
<string name="set_song_mode">Cuando se selecciona una canción</string>
|
<string name="set_library_song_playback_mode">Cuando se selecciona una canción</string>
|
||||||
<string name="set_keep_shuffle">Recordar mezcla</string>
|
<string name="set_keep_shuffle">Recordar mezcla</string>
|
||||||
<string name="set_keep_shuffle_desc">Mantener mezcla cuando se reproduce una nueva canción</string>
|
<string name="set_keep_shuffle_desc">Mantener mezcla cuando se reproduce una nueva canción</string>
|
||||||
<string name="set_rewind_prev">Rebobinar atrás</string>
|
<string name="set_rewind_prev">Rebobinar atrás</string>
|
||||||
|
|
|
||||||
|
|
@ -29,10 +29,10 @@
|
||||||
<string name="lbl_playback">Ora in riproduzione</string>
|
<string name="lbl_playback">Ora in riproduzione</string>
|
||||||
<string name="lbl_play">Riproduci</string>
|
<string name="lbl_play">Riproduci</string>
|
||||||
<string name="lbl_shuffle">Mescola</string>
|
<string name="lbl_shuffle">Mescola</string>
|
||||||
<string name="lbl_play_all">Riproduci da tutte le canzoni</string>
|
<string name="set_playback_mode_all">Riproduci da tutte le canzoni</string>
|
||||||
<string name="lbl_play_album">Riproduci dal disco</string>
|
<string name="set_playback_mode_album">Riproduci dal disco</string>
|
||||||
<string name="lbl_play_artist">Riproduci dall\'artista</string>
|
<string name="set_playback_mode_artist">Riproduci dall\'artista</string>
|
||||||
<string name="lbl_play_genre">Riproduci dal genere</string>
|
<string name="set_playback_mode_genre">Riproduci dal genere</string>
|
||||||
|
|
||||||
<string name="lbl_queue">Coda</string>
|
<string name="lbl_queue">Coda</string>
|
||||||
<string name="lbl_play_next">Riproduci successivo</string>
|
<string name="lbl_play_next">Riproduci successivo</string>
|
||||||
|
|
@ -89,7 +89,7 @@
|
||||||
<string name="set_replay_gain_dynamic">Dinamico</string>
|
<string name="set_replay_gain_dynamic">Dinamico</string>
|
||||||
|
|
||||||
<string name="set_behavior">Comportamento</string>
|
<string name="set_behavior">Comportamento</string>
|
||||||
<string name="set_song_mode">Quando una canzone è selezionata</string>
|
<string name="set_library_song_playback_mode">Quando una canzone è selezionata</string>
|
||||||
<string name="set_keep_shuffle">Mantieni mescolamento</string>
|
<string name="set_keep_shuffle">Mantieni mescolamento</string>
|
||||||
<string name="set_keep_shuffle_desc">Mantiene il mescolamento anche se una nuova canzone è selezionata</string>
|
<string name="set_keep_shuffle_desc">Mantiene il mescolamento anche se una nuova canzone è selezionata</string>
|
||||||
<string name="set_rewind_prev">Riavvolgi prima di saltare indietro</string>
|
<string name="set_rewind_prev">Riavvolgi prima di saltare indietro</string>
|
||||||
|
|
|
||||||
|
|
@ -33,10 +33,10 @@
|
||||||
<string name="lbl_playback">지금 재생 중</string>
|
<string name="lbl_playback">지금 재생 중</string>
|
||||||
<string name="lbl_play">재생</string>
|
<string name="lbl_play">재생</string>
|
||||||
<string name="lbl_shuffle">무작위</string>
|
<string name="lbl_shuffle">무작위</string>
|
||||||
<string name="lbl_play_all">모든 곡에서 재생</string>
|
<string name="set_playback_mode_all">모든 곡에서 재생</string>
|
||||||
<string name="lbl_play_album">앨범에서 재생</string>
|
<string name="set_playback_mode_album">앨범에서 재생</string>
|
||||||
<string name="lbl_play_artist">아티스트에서 재생</string>
|
<string name="set_playback_mode_artist">아티스트에서 재생</string>
|
||||||
<string name="lbl_play_genre">장르에서 재생</string>
|
<string name="set_playback_mode_genre">장르에서 재생</string>
|
||||||
|
|
||||||
<string name="lbl_queue">대기열</string>
|
<string name="lbl_queue">대기열</string>
|
||||||
<string name="lbl_play_next">다음 곡 재생</string>
|
<string name="lbl_play_next">다음 곡 재생</string>
|
||||||
|
|
@ -102,7 +102,7 @@
|
||||||
<string name="set_pre_amp_warning">주의: 프리앰프를 높게 설정하면 일부 오디오 트랙에서 주파수가 잘릴 수 있습니다.</string>
|
<string name="set_pre_amp_warning">주의: 프리앰프를 높게 설정하면 일부 오디오 트랙에서 주파수가 잘릴 수 있습니다.</string>
|
||||||
|
|
||||||
<string name="set_behavior">동작</string>
|
<string name="set_behavior">동작</string>
|
||||||
<string name="set_song_mode">음악을 선택했을 때</string>
|
<string name="set_library_song_playback_mode">음악을 선택했을 때</string>
|
||||||
<string name="set_keep_shuffle">무작위 모드 기억</string>
|
<string name="set_keep_shuffle">무작위 모드 기억</string>
|
||||||
<string name="set_keep_shuffle_desc">새 음악을 재생할 때 무작위 모드 유지</string>
|
<string name="set_keep_shuffle_desc">새 음악을 재생할 때 무작위 모드 유지</string>
|
||||||
<string name="set_rewind_prev">이전 곡으로 가기 전에 되감기</string>
|
<string name="set_rewind_prev">이전 곡으로 가기 전에 되감기</string>
|
||||||
|
|
|
||||||
|
|
@ -23,10 +23,10 @@
|
||||||
|
|
||||||
<string name="lbl_play">Afspelen</string>
|
<string name="lbl_play">Afspelen</string>
|
||||||
<string name="lbl_shuffle">Shuffle</string>
|
<string name="lbl_shuffle">Shuffle</string>
|
||||||
<string name="lbl_play_all">Speel van alle nummers </string>
|
<string name="set_playback_mode_all">Speel van alle nummers </string>
|
||||||
<string name="lbl_play_album">Speel af van album </string>
|
<string name="set_playback_mode_album">Speel af van album </string>
|
||||||
<string name="lbl_play_artist">Speel van artiest </string>
|
<string name="set_playback_mode_artist">Speel van artiest </string>
|
||||||
<string name="lbl_play_genre">Speel vanuit genre </string>
|
<string name="set_playback_mode_genre">Speel vanuit genre </string>
|
||||||
<string name="lbl_playback">Afspeelscherm</string>
|
<string name="lbl_playback">Afspeelscherm</string>
|
||||||
|
|
||||||
<string name="lbl_queue">Wachtrij</string>
|
<string name="lbl_queue">Wachtrij</string>
|
||||||
|
|
@ -72,7 +72,7 @@
|
||||||
<string name="set_audio">Audio</string>
|
<string name="set_audio">Audio</string>
|
||||||
|
|
||||||
<string name="set_behavior">Gedrag</string>
|
<string name="set_behavior">Gedrag</string>
|
||||||
<string name="set_song_mode">Wanneer een liedje is geselecteerd</string>
|
<string name="set_library_song_playback_mode">Wanneer een liedje is geselecteerd</string>
|
||||||
<string name="set_keep_shuffle">Onthoud shuffle</string>
|
<string name="set_keep_shuffle">Onthoud shuffle</string>
|
||||||
<string name="set_keep_shuffle_desc">Houd shuffle aan bij het afspelen van een nieuw nummer</string>
|
<string name="set_keep_shuffle_desc">Houd shuffle aan bij het afspelen van een nieuw nummer</string>
|
||||||
<string name="set_rewind_prev">Terugspoelen voordat je terugspoelt</string>
|
<string name="set_rewind_prev">Terugspoelen voordat je terugspoelt</string>
|
||||||
|
|
|
||||||
|
|
@ -30,10 +30,10 @@
|
||||||
<string name="lbl_playback">Сейчас играет</string>
|
<string name="lbl_playback">Сейчас играет</string>
|
||||||
<string name="lbl_play">Играть</string>
|
<string name="lbl_play">Играть</string>
|
||||||
<string name="lbl_shuffle">Перемешать</string>
|
<string name="lbl_shuffle">Перемешать</string>
|
||||||
<string name="lbl_play_all">Играть все треки</string>
|
<string name="set_playback_mode_all">Играть все треки</string>
|
||||||
<string name="lbl_play_album">Играть альбом</string>
|
<string name="set_playback_mode_album">Играть альбом</string>
|
||||||
<string name="lbl_play_artist">Играть исполнителя</string>
|
<string name="set_playback_mode_artist">Играть исполнителя</string>
|
||||||
<string name="lbl_play_genre">Играть жанр</string>
|
<string name="set_playback_mode_genre">Играть жанр</string>
|
||||||
|
|
||||||
<string name="lbl_queue">Очередь</string>
|
<string name="lbl_queue">Очередь</string>
|
||||||
<string name="lbl_play_next">Играть далее</string>
|
<string name="lbl_play_next">Играть далее</string>
|
||||||
|
|
@ -90,7 +90,7 @@
|
||||||
<string name="set_replay_gain_dynamic">Динамический</string>
|
<string name="set_replay_gain_dynamic">Динамический</string>
|
||||||
|
|
||||||
<string name="set_behavior">Поведение</string>
|
<string name="set_behavior">Поведение</string>
|
||||||
<string name="set_song_mode">При выборе трека</string>
|
<string name="set_library_song_playback_mode">При выборе трека</string>
|
||||||
<string name="set_keep_shuffle">Запоминать перемешивание</string>
|
<string name="set_keep_shuffle">Запоминать перемешивание</string>
|
||||||
<string name="set_keep_shuffle_desc">Запоминать режим перемешивания для новых треков</string>
|
<string name="set_keep_shuffle_desc">Запоминать режим перемешивания для новых треков</string>
|
||||||
<string name="set_rewind_prev">Сначала перемотать трек</string>
|
<string name="set_rewind_prev">Сначала перемотать трек</string>
|
||||||
|
|
|
||||||
|
|
@ -29,10 +29,10 @@
|
||||||
<string name="lbl_playback">正在播放</string>
|
<string name="lbl_playback">正在播放</string>
|
||||||
<string name="lbl_play">播放</string>
|
<string name="lbl_play">播放</string>
|
||||||
<string name="lbl_shuffle">随机</string>
|
<string name="lbl_shuffle">随机</string>
|
||||||
<string name="lbl_play_all">从全部歌曲开始播放</string>
|
<string name="set_playback_mode_all">从全部歌曲开始播放</string>
|
||||||
<string name="lbl_play_album">从专辑开始播放</string>
|
<string name="set_playback_mode_album">从专辑开始播放</string>
|
||||||
<string name="lbl_play_artist">从艺术家开始播放</string>
|
<string name="set_playback_mode_artist">从艺术家开始播放</string>
|
||||||
<string name="lbl_play_genre">从流派开始播放</string>
|
<string name="set_playback_mode_genre">从流派开始播放</string>
|
||||||
|
|
||||||
<string name="lbl_queue">播放队列</string>
|
<string name="lbl_queue">播放队列</string>
|
||||||
<string name="lbl_play_next">作为下一首播放</string>
|
<string name="lbl_play_next">作为下一首播放</string>
|
||||||
|
|
@ -88,7 +88,7 @@
|
||||||
<string name="set_replay_gain_dynamic">动态</string>
|
<string name="set_replay_gain_dynamic">动态</string>
|
||||||
|
|
||||||
<string name="set_behavior">行为</string>
|
<string name="set_behavior">行为</string>
|
||||||
<string name="set_song_mode">选中歌曲时</string>
|
<string name="set_library_song_playback_mode">选中歌曲时</string>
|
||||||
<string name="set_keep_shuffle">记住随机模式</string>
|
<string name="set_keep_shuffle">记住随机模式</string>
|
||||||
<string name="set_keep_shuffle_desc">播放新曲目时保留随机播放模式</string>
|
<string name="set_keep_shuffle_desc">播放新曲目时保留随机播放模式</string>
|
||||||
<string name="set_rewind_prev">切换上一曲前先倒带</string>
|
<string name="set_rewind_prev">切换上一曲前先倒带</string>
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,8 @@
|
||||||
<string name="set_key_pre_amp_with" translatable="false">auxio_pre_amp_with</string>
|
<string name="set_key_pre_amp_with" translatable="false">auxio_pre_amp_with</string>
|
||||||
<string name="set_key_pre_amp_without" translatable="false">auxio_pre_amp_without</string>
|
<string name="set_key_pre_amp_without" translatable="false">auxio_pre_amp_without</string>
|
||||||
|
|
||||||
<string name="set_key_song_play_mode" translatable="false">KEY_SONG_PLAY_MODE2</string>
|
<string name="set_key_library_song_playback_mode" translatable="false">KEY_SONG_PLAY_MODE2</string>
|
||||||
|
<string name="set_key_detail_song_playback_mode" translatable="false">auxio_detail_song_play_mode</string>
|
||||||
<string name="set_key_keep_shuffle" translatable="false">KEY_KEEP_SHUFFLE</string>
|
<string name="set_key_keep_shuffle" translatable="false">KEY_KEEP_SHUFFLE</string>
|
||||||
<string name="set_key_rewind_prev" translatable="false">KEY_PREV_REWIND</string>
|
<string name="set_key_rewind_prev" translatable="false">KEY_PREV_REWIND</string>
|
||||||
<string name="set_key_repeat_pause" translatable="false">KEY_LOOP_PAUSE</string>
|
<string name="set_key_repeat_pause" translatable="false">KEY_LOOP_PAUSE</string>
|
||||||
|
|
@ -56,14 +57,30 @@
|
||||||
<item>@integer/theme_dark</item>
|
<item>@integer/theme_dark</item>
|
||||||
</integer-array>
|
</integer-array>
|
||||||
|
|
||||||
<array name="entries_song_playback_mode">
|
<array name="entries_library_song_playback_mode">
|
||||||
<item>@string/lbl_play_all</item>
|
<item>@string/set_playback_mode_all</item>
|
||||||
<item>@string/lbl_play_artist</item>
|
<item>@string/set_playback_mode_artist</item>
|
||||||
<item>@string/lbl_play_album</item>
|
<item>@string/set_playback_mode_album</item>
|
||||||
<item>@string/lbl_play_genre</item>
|
<item>@string/set_playback_mode_genre</item>
|
||||||
</array>
|
</array>
|
||||||
|
|
||||||
<string-array name="values_song_playback_mode">
|
<string-array name="values_library_song_playback_mode">
|
||||||
|
<item>@integer/play_mode_songs</item>
|
||||||
|
<item>@integer/play_mode_artist</item>
|
||||||
|
<item>@integer/play_mode_album</item>
|
||||||
|
<item>@integer/play_mode_genre</item>
|
||||||
|
</string-array>
|
||||||
|
|
||||||
|
<array name="entries_detail_song_playback_mode">
|
||||||
|
<item>@string/set_playback_mode_none</item>
|
||||||
|
<item>@string/set_playback_mode_all</item>
|
||||||
|
<item>@string/set_playback_mode_artist</item>
|
||||||
|
<item>@string/set_playback_mode_album</item>
|
||||||
|
<item>@string/set_playback_mode_genre</item>
|
||||||
|
</array>
|
||||||
|
|
||||||
|
<string-array name="values_detail_song_playback_mode">
|
||||||
|
<item>@integer/play_mode_none</item>
|
||||||
<item>@integer/play_mode_songs</item>
|
<item>@integer/play_mode_songs</item>
|
||||||
<item>@integer/play_mode_artist</item>
|
<item>@integer/play_mode_artist</item>
|
||||||
<item>@integer/play_mode_album</item>
|
<item>@integer/play_mode_album</item>
|
||||||
|
|
@ -88,6 +105,7 @@
|
||||||
<integer name="theme_light">1</integer>
|
<integer name="theme_light">1</integer>
|
||||||
<integer name="theme_dark">2</integer>
|
<integer name="theme_dark">2</integer>
|
||||||
|
|
||||||
|
<integer name="play_mode_none">-2147483648</integer>
|
||||||
<integer name="play_mode_genre">0xA103</integer>
|
<integer name="play_mode_genre">0xA103</integer>
|
||||||
<integer name="play_mode_artist">0xA104</integer>
|
<integer name="play_mode_artist">0xA104</integer>
|
||||||
<integer name="play_mode_album">0xA105</integer>
|
<integer name="play_mode_album">0xA105</integer>
|
||||||
|
|
|
||||||
|
|
@ -35,10 +35,6 @@
|
||||||
<string name="lbl_playback">Now Playing</string>
|
<string name="lbl_playback">Now Playing</string>
|
||||||
<string name="lbl_play">Play</string>
|
<string name="lbl_play">Play</string>
|
||||||
<string name="lbl_shuffle">Shuffle</string>
|
<string name="lbl_shuffle">Shuffle</string>
|
||||||
<string name="lbl_play_all">Play from all songs</string>
|
|
||||||
<string name="lbl_play_album">Play from album</string>
|
|
||||||
<string name="lbl_play_artist">Play from artist</string>
|
|
||||||
<string name="lbl_play_genre">Play from genre</string>
|
|
||||||
|
|
||||||
<string name="lbl_queue">Queue</string>
|
<string name="lbl_queue">Queue</string>
|
||||||
<string name="lbl_play_next">Play next</string>
|
<string name="lbl_play_next">Play next</string>
|
||||||
|
|
@ -118,7 +114,13 @@
|
||||||
<string name="set_pre_amp_warning">Warning: Changing the pre-amp to a high positive value may result in peaking on some audio tracks.</string>
|
<string name="set_pre_amp_warning">Warning: Changing the pre-amp to a high positive value may result in peaking on some audio tracks.</string>
|
||||||
|
|
||||||
<string name="set_behavior">Behavior</string>
|
<string name="set_behavior">Behavior</string>
|
||||||
<string name="set_song_mode">When a song is selected</string>
|
<string name="set_library_song_playback_mode">Library playback mode</string>
|
||||||
|
<string name="set_detail_song_playback_mode">Detail playback mode</string>
|
||||||
|
<string name="set_playback_mode_none">Play from shown item</string>
|
||||||
|
<string name="set_playback_mode_all">Play from all songs</string>
|
||||||
|
<string name="set_playback_mode_album">Play from album</string>
|
||||||
|
<string name="set_playback_mode_artist">Play from artist</string>
|
||||||
|
<string name="set_playback_mode_genre">Play from genre</string>
|
||||||
<string name="set_keep_shuffle">Remember shuffle</string>
|
<string name="set_keep_shuffle">Remember shuffle</string>
|
||||||
<string name="set_keep_shuffle_desc">Keep shuffle on when playing a new song</string>
|
<string name="set_keep_shuffle_desc">Keep shuffle on when playing a new song</string>
|
||||||
<string name="set_rewind_prev">Rewind before skipping back</string>
|
<string name="set_rewind_prev">Rewind before skipping back</string>
|
||||||
|
|
|
||||||
|
|
@ -110,11 +110,20 @@
|
||||||
|
|
||||||
<org.oxycblt.auxio.settings.ui.IntListPreference
|
<org.oxycblt.auxio.settings.ui.IntListPreference
|
||||||
app:defaultValue="@integer/play_mode_songs"
|
app:defaultValue="@integer/play_mode_songs"
|
||||||
app:entries="@array/entries_song_playback_mode"
|
app:entries="@array/entries_library_song_playback_mode"
|
||||||
app:entryValues="@array/values_song_playback_mode"
|
app:entryValues="@array/values_library_song_playback_mode"
|
||||||
app:iconSpaceReserved="false"
|
app:iconSpaceReserved="false"
|
||||||
app:key="@string/set_key_song_play_mode"
|
app:key="@string/set_key_library_song_playback_mode"
|
||||||
app:title="@string/set_song_mode"
|
app:title="@string/set_library_song_playback_mode"
|
||||||
|
app:useSimpleSummaryProvider="true" />
|
||||||
|
|
||||||
|
<org.oxycblt.auxio.settings.ui.IntListPreference
|
||||||
|
app:defaultValue="@integer/play_mode_none"
|
||||||
|
app:entries="@array/entries_detail_song_playback_mode"
|
||||||
|
app:entryValues="@array/values_detail_song_playback_mode"
|
||||||
|
app:iconSpaceReserved="false"
|
||||||
|
app:key="@string/set_key_detail_song_playback_mode"
|
||||||
|
app:title="@string/set_detail_song_playback_mode"
|
||||||
app:useSimpleSummaryProvider="true" />
|
app:useSimpleSummaryProvider="true" />
|
||||||
|
|
||||||
<org.oxycblt.auxio.settings.ui.M3SwitchPreference
|
<org.oxycblt.auxio.settings.ui.M3SwitchPreference
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue