removed specific R/a/dio stuff

remotes/origin/devel
yattoz 2019-12-10 19:56:58 +01:00
parent cd1068e090
commit 6db17ee8ad
15 changed files with 32 additions and 327 deletions

View File

@ -23,5 +23,4 @@ enum class ActionOpenParam {
SLEEP, SLEEP,
ALARM, ALARM,
CUSTOMIZE, CUSTOMIZE,
STREAMER_NOTIFICATION_SERVICE
} }

View File

@ -23,6 +23,7 @@ class Async(val handler: (Any?) -> Any?, val post: (Any?) -> Unit = {},
ActionOnError.RESET -> resetPlayerStateOnNetworkError() ActionOnError.RESET -> resetPlayerStateOnNetworkError()
ActionOnError.NOTIFY -> return ActionOnError.NOTIFY -> return
} }
e.printStackTrace()
} }
private fun resetPlayerStateOnNetworkError() { private fun resetPlayerStateOnNetworkError() {

View File

@ -23,7 +23,7 @@ abstract class BaseNotification(private val notificationChannelId: String,
// Define the notification in android's swipe-down menu // Define the notification in android's swipe-down menu
lateinit var notification: Notification lateinit var notification: Notification
protected lateinit var notificationManager: NotificationManager private lateinit var notificationManager: NotificationManager
protected lateinit var builder: NotificationCompat.Builder protected lateinit var builder: NotificationCompat.Builder
@RequiresApi(api = Build.VERSION_CODES.O) @RequiresApi(api = Build.VERSION_CODES.O)

View File

@ -7,7 +7,6 @@ import android.support.v4.media.session.MediaSessionCompat
import android.support.v4.media.session.PlaybackStateCompat import android.support.v4.media.session.PlaybackStateCompat
import androidx.core.app.NotificationCompat import androidx.core.app.NotificationCompat
import fr.forum_thalie.tsumugi.playerstore.PlayerStore import fr.forum_thalie.tsumugi.playerstore.PlayerStore
import fr.forum_thalie.tsumugi.BootBroadcastReceiver
class NowPlayingNotification( class NowPlayingNotification(
notificationChannelId: String, notificationChannelId: String,
@ -27,7 +26,7 @@ class NowPlayingNotification(
// ###### NOW PLAYING NOTIFICATION ######## // ###### NOW PLAYING NOTIFICATION ########
// ######################################## // ########################################
lateinit var mediaStyle: androidx.media.app.NotificationCompat.DecoratedMediaCustomViewStyle private lateinit var mediaStyle: androidx.media.app.NotificationCompat.DecoratedMediaCustomViewStyle
fun create(c: Context, m: MediaSessionCompat) { fun create(c: Context, m: MediaSessionCompat) {
super.create(c) super.create(c)

View File

@ -1,7 +1,5 @@
package fr.forum_thalie.tsumugi package fr.forum_thalie.tsumugi
import android.support.v4.media.session.PlaybackStateCompat
import fr.forum_thalie.tsumugi.alarm.RadioSleeper
import fr.forum_thalie.tsumugi.playerstore.PlayerStore import fr.forum_thalie.tsumugi.playerstore.PlayerStore
import java.util.* import java.util.*

View File

@ -33,12 +33,12 @@ class NewsFragment : Fragment() {
if (!newsViewModel.isWebViewLoaded) if (!newsViewModel.isWebViewLoaded)
{ {
try { try {
newsViewModel.root = inflater.inflate(R.layout.fragment_chat, container, false) newsViewModel.root = inflater.inflate(R.layout.fragment_news, container, false)
newsViewModel.webView = newsViewModel.root.findViewById(R.id.news_webview) newsViewModel.webView = newsViewModel.root.findViewById(R.id.news_webview)
newsViewModel.webViewNews = WebViewNews(newsViewModel.webView as WebView) newsViewModel.webViewNews = WebViewNews(newsViewModel.webView as WebView)
newsViewModel.webViewNews!!.start() newsViewModel.webViewNews!!.start()
} catch (e: Exception) { } catch (e: Exception) {
newsViewModel.root = inflater.inflate(R.layout.fragment_error_chat, container, false) newsViewModel.root = inflater.inflate(R.layout.fragment_error_webview, container, false)
} }
newsViewModel.isWebViewLoaded = true newsViewModel.isWebViewLoaded = true

View File

@ -46,25 +46,44 @@ class NowPlayingFragment : Fragment() {
val seekBarVolume: SeekBar = root.findViewById(R.id.seek_bar_volume) val seekBarVolume: SeekBar = root.findViewById(R.id.seek_bar_volume)
val volumeText: TextView = root.findViewById(R.id.volume_text) val volumeText: TextView = root.findViewById(R.id.volume_text)
val progressBar: ProgressBar = root.findViewById(R.id.progressBar) val progressBar: ProgressBar = root.findViewById(R.id.progressBar)
val volumeIconImage : ImageView = root.findViewById(R.id.volume_icon)
// Note: these values are not used in the generic app
val streamerPictureImageView: ImageView = root.findViewById(R.id.streamerPicture) val streamerPictureImageView: ImageView = root.findViewById(R.id.streamerPicture)
/*
val streamerNameText : TextView = root.findViewById(R.id.streamerName) val streamerNameText : TextView = root.findViewById(R.id.streamerName)
val songTitleNextText: TextView = root.findViewById(R.id.text_song_title_next) val songTitleNextText: TextView = root.findViewById(R.id.text_song_title_next)
val songArtistNextText: TextView = root.findViewById(R.id.text_song_artist_next) val songArtistNextText: TextView = root.findViewById(R.id.text_song_artist_next)
val volumeIconImage : ImageView = root.findViewById(R.id.volume_icon)
val listenersText : TextView = root.findViewById(R.id.listenersCount) val listenersText : TextView = root.findViewById(R.id.listenersCount)
*/
/*
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration( TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(
streamerNameText,8, 20, 2, TypedValue.COMPLEX_UNIT_SP) streamerNameText,8, 20, 2, TypedValue.COMPLEX_UNIT_SP)
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration( TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(
listenersText,8, 16, 2, TypedValue.COMPLEX_UNIT_SP) listenersText,8, 16, 2, TypedValue.COMPLEX_UNIT_SP)
/*
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(
songTitleText,4, 24, 2, TypedValue.COMPLEX_UNIT_SP)
TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(
songArtistText,4, 24, 2, TypedValue.COMPLEX_UNIT_SP)
*/ */
/*
// trick : I can't observe the queue because it's an ArrayDeque that doesn't trigger any change...
// so I observe a dedicated Mutable that gets set when the queue is updated.
PlayerStore.instance.isQueueUpdated.observe(viewLifecycleOwner, Observer {
val t = if (PlayerStore.instance.queue.size > 0) PlayerStore.instance.queue[0] else Song("No queue - ") // (it.peekFirst != null ? it.peekFirst : Song() )
songTitleNextText.text = t.title.value
songArtistNextText.text = t.artist.value
})
PlayerStore.instance.streamerName.observe(viewLifecycleOwner, Observer {
streamerNameText.text = it
})
PlayerStore.instance.listenersCount.observe(viewLifecycleOwner, Observer {
listenersText.text = "${getString(R.string.listeners)}: $it"
})
*/
PlayerStore.instance.currentSong.title.observe(viewLifecycleOwner, Observer { PlayerStore.instance.currentSong.title.observe(viewLifecycleOwner, Observer {
songTitleText.text = it songTitleText.text = it
}) })
@ -77,13 +96,6 @@ class NowPlayingFragment : Fragment() {
syncPlayPauseButtonImage(root) syncPlayPauseButtonImage(root)
}) })
// trick : I can't observe the queue because it's an ArrayDeque that doesn't trigger any change...
// so I observe a dedicated Mutable that gets set when the queue is updated.
PlayerStore.instance.isQueueUpdated.observe(viewLifecycleOwner, Observer {
val t = if (PlayerStore.instance.queue.size > 0) PlayerStore.instance.queue[0] else Song("No queue - ") // (it.peekFirst != null ? it.peekFirst : Song() )
songTitleNextText.text = t.title.value
songArtistNextText.text = t.artist.value
})
fun volumeIcon(it: Int) fun volumeIcon(it: Int)
{ {
@ -113,14 +125,6 @@ class NowPlayingFragment : Fragment() {
streamerPictureImageView.setImageBitmap(pic) streamerPictureImageView.setImageBitmap(pic)
}) })
PlayerStore.instance.streamerName.observe(viewLifecycleOwner, Observer {
streamerNameText.text = it
})
PlayerStore.instance.listenersCount.observe(viewLifecycleOwner, Observer {
listenersText.text = "${getString(R.string.listeners)}: $it"
})
// fuck it, do it on main thread // fuck it, do it on main thread
PlayerStore.instance.currentTime.observe(viewLifecycleOwner, Observer { PlayerStore.instance.currentTime.observe(viewLifecycleOwner, Observer {
val dd = (PlayerStore.instance.currentTime.value!! - PlayerStore.instance.currentSong.startTime.value!!).toInt() val dd = (PlayerStore.instance.currentTime.value!! - PlayerStore.instance.currentSong.startTime.value!!).toInt()
@ -173,18 +177,6 @@ class NowPlayingFragment : Fragment() {
PlayerStore.instance.isPlaying.value = PlayerStore.instance.playbackState.value == PlaybackStateCompat.STATE_STOPPED PlayerStore.instance.isPlaying.value = PlayerStore.instance.playbackState.value == PlaybackStateCompat.STATE_STOPPED
} }
/*
/* TODO : disabled volumeIconImage click listener, it creates weird behaviors when switching fragments.
in particular, the mute state isn't retained when switching fragments, and it creates visual error
(displaying the mute icon when it's not muted).
So for the moment it's safer to disable it altogether.
*/
volumeIconImage.setOnClickListener{
PlayerStore.instance.isMuted.value = !PlayerStore.instance.isMuted.value!!
}
*/
val setClipboardListener: View.OnLongClickListener = View.OnLongClickListener { val setClipboardListener: View.OnLongClickListener = View.OnLongClickListener {
val text = PlayerStore.instance.currentSong.artist.value + " - " + PlayerStore.instance.currentSong.title.value val text = PlayerStore.instance.currentSong.artist.value + " - " + PlayerStore.instance.currentSong.title.value
val clipboard = context!!.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager val clipboard = context!!.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager

View File

@ -29,7 +29,7 @@ class SongsFragment : Fragment() {
adapter = SongsPagerAdapter(childFragmentManager, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) adapter = SongsPagerAdapter(childFragmentManager, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)
adapter.addFragment(LastPlayedFragment.newInstance(), "last played") adapter.addFragment(LastPlayedFragment.newInstance(), "last played")
//adapter.addFragment(QueueFragment.newInstance(), "queue") // You can add more fragments to the adapter, to display more information (for example with R/a/dio, queue, request, faves...)
viewPager.adapter = adapter viewPager.adapter = adapter

View File

@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/loadMoreButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:text="@string/load_more_results"
android:visibility="gone"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,42 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/text_notifications"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:textAlignment="center"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
-->
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<!--
Yattoz - this is a simple embedded WebView to display KiwiIRC in the app.
KiwiIRC is a decent IRC, but the website is clunky and you must scroll a lot.
This WebView is just the size of the screen, to make it practical.
-->
<WebView
android:id="@+id/news_webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/error_webView"
android:textSize="40sp"
android:gravity="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/searchConstraint"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
android:background="@color/dark"
android:id="@+id/search"
android:padding="4dp">
<SearchView
android:id="@+id/searchBox"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/ra_f_button"
android:iconifiedByDefault="false"
android:queryHint="Search for a song..."
/>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/ra_f_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:text="@string/ra_f"
android:visibility="gone"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/noUserNameText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/no_user_name"
android:gravity="center"
android:textSize="16sp"
android:visibility="gone"
android:layout_margin="16dp"
app:layout_constraintTop_toBottomOf="@id/search"
/>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/recyclerSwipe"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/search"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_margin="8dp"
>
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/request_recycler"
android:scrollbars="vertical"
>
</androidx.recyclerview.widget.RecyclerView>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/itemLayout">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginLeft="0dp"
android:layout_marginRight="0dp"
android:id="@+id/item"
>
<TextView
android:id="@+id/request_song_artist"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toStartOf="@+id/request_button"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toTopOf="@id/request_song_title"
android:textSize="16sp"
android:textColor="@color/whited3"
/>
<TextView
android:id="@+id/request_song_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:textColor="@color/whited"
android:textSize="16sp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/request_button"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/request_song_artist" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/request_button"
android:layout_width="wrap_content"
android:layout_height="56dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:text="@string/request"
android:textSize="12sp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
<View
android:id="@+id/divider"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?android:attr/listDivider"
app:layout_constraintTop_toBottomOf="@id/item"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginTop="8dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -1,21 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string-array name="streamerFetchPeriodString">
<item name="5">"Every 5 minutes"</item>
<item name="10">"Every 10 minutes"</item>
<item name="15">"Every 15 minutes"</item>
<item name="20">"Every 20 minutes"</item>
<item name="25">"Every 25 minutes"</item>
<item name="30">"Every 30 minutes"</item>
</string-array>
<string-array name="streamerFetchPeriod">
<item name="5">5</item>
<item name="10">10</item>
<item name="15">15</item>
<item name="20">20</item>
<item name="25">25</item>
<item name="30">30</item>
</string-array>
<string-array name="weekdays"> <string-array name="weekdays">
<item name="monday">Monday</item> <item name="monday">Monday</item>
@ -37,19 +21,5 @@
<item name="25">25</item> <item name="25">25</item>
<item name="30">30</item> <item name="30">30</item>
</string-array> </string-array>
<string-array name="fetchPeriodString">
<item name="5">Every 5 seconds (faster update)</item>
<item name="10">Every 10 seconds</item>
<item name="15">Every 15 seconds</item>
<item name="20">Every 20 seconds</item>
<item name="30">Every 30 seconds (less battery-intensive)</item>
</string-array>
<string-array name="fetchPeriodValues">
<item name="5">5</item>
<item name="10">10</item>
<item name="15">15</item>
<item name="20">20</item>
<item name="30">30</item>
</string-array>
</resources> </resources>

View File

@ -7,12 +7,6 @@
<string name="now_playing_notification_title_template">Now playing: %1$s</string> <string name="now_playing_notification_title_template">Now playing: %1$s</string>
<string name="action_share">Share</string>
<string name="action_reply">Reply</string>
<string name="new_message_notification_title_template">New message: %1$s</string>
<string name="MEDIA_ROOT_ID">radio_root_id</string> <string name="MEDIA_ROOT_ID">radio_root_id</string>
<string name="STREAM_URL_RADIO">https://relay0.r-a-d.io/main.mp3</string> <string name="STREAM_URL_RADIO">https://relay0.r-a-d.io/main.mp3</string>
<string name="STREAM_URL_TSUMUGI">http://shelter.mahoro-net.org:8000/tsumugi</string> <string name="STREAM_URL_TSUMUGI">http://shelter.mahoro-net.org:8000/tsumugi</string>
@ -24,29 +18,13 @@
<string name="up_next">Up next:</string> <string name="up_next">Up next:</string>
<string name="now_streaming">Now streaming</string> <string name="now_streaming">Now streaming</string>
<string name="error_webView">Error loading WebView. Try downloading Google Chrome on Google Play, or enabling it if you disabled it.</string> <string name="error_webView">Error loading WebView. Try downloading Google Chrome on Google Play, or enabling it if you disabled it.</string>
<string name="load_more_results">Load more results</string>
<string name="request">request</string>
<string name="action_settings">Settings</string> <string name="action_settings">Settings</string>
<string name="action_refresh">Force data refresh</string>
<string name="action_bug_submit">Submit a bug (GitHub)</string> <string name="action_bug_submit">Submit a bug (GitHub)</string>
<string name="github_url_new_issue">https://github.com/yattoz/Tsumugi-app/issues/</string> <string name="github_url_new_issue">https://github.com/yattoz/Tsumugi-app/issues/</string>
<string name="no_user_name">To display your favorite, set you IRC user name in Settings → Customize app behavior.</string>
<string name="ra_f">.ra f</string>
<string name="nowPlayingNotificationChannel">R/a/dio Stream Service</string> <string name="nowPlayingNotificationChannel">R/a/dio Stream Service</string>
<string name="nowPlayingChannelId">fr.forum_thalie.tsumugi.PLAYER_SERVICE</string> <string name="nowPlayingChannelId">fr.forum_thalie.tsumugi.PLAYER_SERVICE</string>
<string name="streamerServiceChannel">Streamer Monitor Service</string>
<string name="streamerServiceChannelId">fr.forum_thalie.tsumugi.STREAMER_NOTIFICATION_SERVICE</string>
<string name="streamerNotificationChannel">New Streamer Notification</string>
<string name="streamerNotificationChannelId">fr.forum_thalie.tsumugi.STREAMER_NOTIFICATION_NEW</string>
<string name="warningStreamerNotif">
This feature is EXPERIMENTAL.
\nIt WILL consume your battery by polling the server regularly.
\nUsing Twitter Push Notifications instead is largely recommended.
\nThis polling should only be considered as the last resort for people not wanting to register on Twitter or phones without Google Play services.\n
\n\nAre you sure you want to enable this?</string>
<string name="snackbarPersistent">Stay visible, can be closed with \"OK\" button</string> <string name="snackbarPersistent">Stay visible, can be closed with \"OK\" button</string>
<string name="snackbarNonPersistent">Disappear after some time</string> <string name="snackbarNonPersistent">Disappear after some time</string>
<string name="every_day">Every day</string> <string name="every_day">Every day</string>
@ -57,16 +35,11 @@
<string name="split_layout">Split Now Playing screen in 2 blocks when device is horizontal</string> <string name="split_layout">Split Now Playing screen in 2 blocks when device is horizontal</string>
<string name="not_split_layout">Keep the same layout when horizontal as in vertical</string> <string name="not_split_layout">Keep the same layout when horizontal as in vertical</string>
<string name="action_sleep">Sleep timer</string> <string name="action_sleep">Sleep timer</string>
<string name="github_url_wiki_irc_for_favorites">https://github.com/yattoz/Radio2/wiki/Help:-using-favorites-with-IRC</string>
<string name="dont_fetch_on_background">Disable</string> <string name="dont_fetch_on_background">Disable</string>
<string name="restart_the_app">You need to restart the app to apply the changes for this setting.</string> <string name="restart_the_app">You need to restart the app to apply the changes for this setting.</string>
<string name="fetch_disabled_restart_the_app">
By disabling this, you won\'t see the song get updated in the app nor in the notification when the playback is stopped, but you may save some battery.
\n\nYou need to restart the app to apply the changes for this setting.
</string>
<string name="action_alarm">Alarm</string> <string name="action_alarm">Alarm</string>
<string name="sleep_fade_out_text">One minute before the end of the timer, the volume will gradually decrease.</string> <string name="sleep_fade_out_text">One minute before the end of the timer, the volume will gradually decrease.</string>
<string name="disable">Disable</string> <string name="disable">Disable</string>
<string name="ed">ed</string>
</resources> </resources>