From 0218dfab753a5c143429a4ade5791d5175ee7e20 Mon Sep 17 00:00:00 2001 From: yattoz <12408848+yattoz@users.noreply.github.com> Date: Mon, 16 Dec 2019 23:38:50 +0100 Subject: [PATCH] added current programme calculation. Added dummy fragment. --- app/src/main/assets/planning_example.json | 57 ++++++++++++++++--- .../fr/forum_thalie/tsumugi/MainActivity.kt | 4 +- .../fr/forum_thalie/tsumugi/RadioService.kt | 2 + .../{PlanningParser.kt => Planning.kt} | 20 +++++-- .../forum_thalie/tsumugi/planning/Program.kt | 41 ------------- .../tsumugi/planning/Programme.kt | 50 ++++++++++++++++ .../tsumugi/ui/songs/ProgrammeFragment.kt | 57 +++++++++++++++++++ .../tsumugi/ui/songs/SongsFragment.kt | 4 +- .../main/res/layout/fragment_programme.xml | 7 +++ app/src/main/res/values/strings.xml | 3 +- 10 files changed, 189 insertions(+), 56 deletions(-) rename app/src/main/java/fr/forum_thalie/tsumugi/planning/{PlanningParser.kt => Planning.kt} (77%) delete mode 100644 app/src/main/java/fr/forum_thalie/tsumugi/planning/Program.kt create mode 100644 app/src/main/java/fr/forum_thalie/tsumugi/planning/Programme.kt create mode 100644 app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/ProgrammeFragment.kt create mode 100644 app/src/main/res/layout/fragment_programme.xml diff --git a/app/src/main/assets/planning_example.json b/app/src/main/assets/planning_example.json index a4a193a..13c4fa0 100644 --- a/app/src/main/assets/planning_example.json +++ b/app/src/main/assets/planning_example.json @@ -1,10 +1,10 @@ { "planning": [ { - "title": "Anime Matin", - "periodicity": "1111100", - "hour_begin": "9:00", - "hour_end": "10:30" + "title": "Musique Classique", + "periodicity": "1111111", + "hour_begin": "6:00", + "hour_end": "7:00" }, { "title": "Jeux Vidéos Matin", @@ -12,11 +12,54 @@ "hour_begin": "09:00", "hour_end": "10:30" }, + { + "title": "Anime Matin", + "periodicity": "1111100", + "hour_begin": "10:30", + "hour_end": "12:00" + }, + { + "title": "Jeux Vidéos Aprem'", + "periodicity": "1111111", + "hour_begin": "14:00", + "hour_end": "15:30" + }, + { + "title": "Anime Aprem'", + "periodicity": "1111111", + "hour_begin": "15:30", + "hour_end": "17:00" + }, + { + "title": "Jeux Vidéos Soirée", + "periodicity": "1111100", + "hour_begin": "19:00", + "hour_end": "20:00" + }, + { + "title": "Anime Soirée", + "periodicity": "1111100", + "hour_begin": "20:00", + "hour_end": "21:00" + }, + { + "title": "Jeux Vidéos Nuit", + "periodicity": "1111111", + "hour_begin": "00:00", + "hour_end": "01:00" + }, + { + "title": "Anime Nuit", + "periodicity": "1111111", + "hour_begin": "01:00", + "hour_end": "02:00" + }, { "title": "Programmation nocturne", "periodicity": "1111111", - "hour_begin": "23:00", - "hour_end": "5:30" + "hour_begin": "02:00", + "hour_end": "06:00" } - ] + ], + "regular_programme" : "Programmation habituelle" } \ No newline at end of file diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/MainActivity.kt b/app/src/main/java/fr/forum_thalie/tsumugi/MainActivity.kt index 5e7cf5e..9772a01 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/MainActivity.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/MainActivity.kt @@ -16,7 +16,7 @@ import fr.forum_thalie.tsumugi.playerstore.PlayerStore import java.util.Timer import android.view.MenuItem import fr.forum_thalie.tsumugi.alarm.RadioAlarm -import fr.forum_thalie.tsumugi.planning.PlanningParser +import fr.forum_thalie.tsumugi.planning.Planning /* Log to file import @@ -157,7 +157,7 @@ class MainActivity : BaseActivity() { } // fetch program - PlanningParser.instance.parseUrl(/* getString(R.string.planning_url) */ context = this) + Planning.instance.parseUrl(/* getString(R.string.planning_url) */ context = this) // initialize the UI setTheme(R.style.AppTheme) diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/RadioService.kt b/app/src/main/java/fr/forum_thalie/tsumugi/RadioService.kt index 78e6bb8..c94f06d 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/RadioService.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/RadioService.kt @@ -34,6 +34,7 @@ import com.google.android.exoplayer2.* import com.google.android.exoplayer2.metadata.icy.* import fr.forum_thalie.tsumugi.alarm.RadioAlarm import fr.forum_thalie.tsumugi.alarm.RadioSleeper +import fr.forum_thalie.tsumugi.planning.Planning import fr.forum_thalie.tsumugi.playerstore.PlayerStore import java.util.* import kotlin.math.exp @@ -129,6 +130,7 @@ class RadioService : MediaBrowserServiceCompat() { PlayerStore.instance.updateLp() } nowPlayingNotification.update(this) + Log.d(tag, Planning.instance.currentProgramme()) } private val streamerPictureObserver = Observer { diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/planning/PlanningParser.kt b/app/src/main/java/fr/forum_thalie/tsumugi/planning/Planning.kt similarity index 77% rename from app/src/main/java/fr/forum_thalie/tsumugi/planning/PlanningParser.kt rename to app/src/main/java/fr/forum_thalie/tsumugi/planning/Planning.kt index 665793e..5be46d4 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/planning/PlanningParser.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/planning/Planning.kt @@ -6,9 +6,19 @@ import org.json.JSONObject import java.io.IOException import java.net.URL -class PlanningParser { +class Planning { - val programs: ArrayList = ArrayList() + private val programmes: ArrayList = ArrayList() + private var regularProgramme: String? = null + + fun currentProgramme(): String + { + programmes.forEach { + if (it.isCurrent()) + return it.title + } + return regularProgramme ?: "none" + } fun parseUrl(url: String? = null, context: Context? = null) { @@ -46,16 +56,18 @@ class PlanningParser { val hourEndS = item.getString("hour_end").split(":") val hourEnd = hourEndS.first().toInt()* 60 + hourEndS.last().toInt() val title = item.getString("title") - programs.add(Program(title, periodicity, hourBegin, hourEnd)) + programmes.add(Programme(title, periodicity, hourBegin, hourEnd)) } } + if (result.has("regular_programme")) + regularProgramme = result.getString("regular_programme") } Async(scrape, post) } companion object { val instance by lazy { - PlanningParser() + Planning() } } } \ No newline at end of file diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/planning/Program.kt b/app/src/main/java/fr/forum_thalie/tsumugi/planning/Program.kt deleted file mode 100644 index 4e8a13e..0000000 --- a/app/src/main/java/fr/forum_thalie/tsumugi/planning/Program.kt +++ /dev/null @@ -1,41 +0,0 @@ -package fr.forum_thalie.tsumugi.planning - -import android.util.Log -import fr.forum_thalie.tsumugi.tag -import org.json.JSONObject -import java.util.* - -class Program (val title: String, private val periodicity: Int, private val hourBegin: Int, private val hourEnd: Int) { - fun isCurrent(): Boolean - { - val now = Calendar.getInstance() - val currentDay = if (now.get(Calendar.DAY_OF_WEEK) - 1 == 0) 6 else now.get(Calendar.DAY_OF_WEEK) - 2 - // 0 (Monday) to 5 (Saturday) + 6 (Sunday) - - // this translates to "true" when: - // - the currentDay is flagged in the "periodicity" bit array - // OR - // - Yesterday is flagged in the "periodicity" bit array AND the program does span over 2 days (night programs typically). - // We'll check a after this whether the current hour is within the span. - val isNow: Boolean = ((((1000000 shr currentDay) and (periodicity)) == 1)) || (((1000000 shr ((currentDay-1)%7) and (periodicity)) == 1) && hourEnd < hourBegin) - - // shr = shift-right. It's a binary mask. - if (isNow) - { - val hasBegun = (now.get(Calendar.HOUR_OF_DAY)*60 + now.get(Calendar.MINUTE) >= hourBegin ) - val hasNotEnded = (now.get(Calendar.HOUR_OF_DAY)*60 + now.get(Calendar.MINUTE) <= hourEnd ) - if (hasBegun && hasNotEnded) - return true - } - - return false - } - - override fun toString(): String { - return "Title: $title, time info (periodicity, begin, end): $periodicity, $hourBegin, $hourEnd" - } - - init { - Log.d(tag, this.toString()) - } -} \ No newline at end of file diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/planning/Programme.kt b/app/src/main/java/fr/forum_thalie/tsumugi/planning/Programme.kt new file mode 100644 index 0000000..4f5238e --- /dev/null +++ b/app/src/main/java/fr/forum_thalie/tsumugi/planning/Programme.kt @@ -0,0 +1,50 @@ +package fr.forum_thalie.tsumugi.planning + +import android.util.Log +import fr.forum_thalie.tsumugi.tag +import java.util.* + +class Programme (val title: String, private val periodicity: Int, private val hourBegin: Int, private val hourEnd: Int) { + fun isCurrent(): Boolean { + val now = Calendar.getInstance() + val currentDay = + if (now.get(Calendar.DAY_OF_WEEK) - 1 == 0) 6 else now.get(Calendar.DAY_OF_WEEK) - 2 + // 0 (Monday) to 5 (Saturday) + 6 (Sunday) + + // this translates to "true" when: + // - the currentDay is flagged in the "periodicity" bit array + // OR + // - Yesterday is flagged in the "periodicity" bit array AND the program does span over 2 days (night programs). + // We'll check a after this whether the current hour is within the span. + val isToday: Boolean = ((((1000000 shr currentDay) and (periodicity)) != 0)) + val isSpanningOverNight = + (((1000000 shr ((currentDay - 1) % 7) and (periodicity)) != 0) && hourEnd < hourBegin) + + Log.d(tag, "$title is today: $isToday or spanning $isSpanningOverNight") + // shr = shift-right. It's a binary mask. + + // if the program started yesterday, and spanned over night, it means that there could be a chance that it's still active. + // we only need to check if the end time has been reached. + if (isSpanningOverNight) { + return (now.get(Calendar.HOUR_OF_DAY) * 60 + now.get(Calendar.MINUTE) < hourEnd) + } + + // if the program is today, we need to check if we're in the hour span. + if (isToday) { + val hasBegun = + (now.get(Calendar.HOUR_OF_DAY) * 60 + now.get(Calendar.MINUTE) >= hourBegin) + val hasNotEnded = + (now.get(Calendar.HOUR_OF_DAY) * 60 + now.get(Calendar.MINUTE) < hourEnd) || hourEnd < hourBegin + return (hasBegun && hasNotEnded) + } + return false + } + + override fun toString(): String { + return "Title: $title, time info (periodicity, begin, end): $periodicity, $hourBegin, $hourEnd" + } + + init { + Log.d(tag, this.toString()) + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/ProgrammeFragment.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/ProgrammeFragment.kt new file mode 100644 index 0000000..1097be3 --- /dev/null +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/ProgrammeFragment.kt @@ -0,0 +1,57 @@ +package fr.forum_thalie.tsumugi.ui.songs + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import fr.forum_thalie.tsumugi.R +import fr.forum_thalie.tsumugi.playerstore.PlayerStore +import fr.forum_thalie.tsumugi.ui.songs.queuelp.LastPlayedFragment +import fr.forum_thalie.tsumugi.ui.songs.queuelp.SongAdaptater + +class ProgrammeFragment : Fragment() { + + private lateinit var recyclerView: RecyclerView + private lateinit var viewAdapter: RecyclerView.Adapter<*> + private lateinit var viewManager: RecyclerView.LayoutManager + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + val root = inflater.inflate(R.layout.fragment_programme, container, false) + + /* + viewManager = LinearLayoutManager(context) + viewAdapter = SongAdaptater(PlayerStore.instance.lp) + + recyclerView = root.findViewById(R.id.queue_lp_recycler).apply { + // use this setting to improve performance if you know that changes + // in content do not change the layout size of the RecyclerView + setHasFixedSize(true) + + // use a linear layout manager + layoutManager = viewManager + + // specify an viewAdapter (see also next example) + adapter = viewAdapter + } + + */ + + return root + } + + override fun onDestroyView() { + super.onDestroyView() + } + + companion object { + @JvmStatic + fun newInstance() = LastPlayedFragment() + } +} \ No newline at end of file diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/SongsFragment.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/SongsFragment.kt index 008f8c2..ac59197 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/SongsFragment.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/SongsFragment.kt @@ -27,9 +27,11 @@ class SongsFragment : Fragment() { root = inflater.inflate(R.layout.fragment_songs, container, false) viewPager = root.findViewById(R.id.tabPager) adapter = SongsPagerAdapter(childFragmentManager, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) - adapter.addFragment(LastPlayedFragment.newInstance(), "last played") + adapter.addFragment(LastPlayedFragment.newInstance(), getString(R.string.lp)) // You can add more fragments to the adapter, to display more information (for example with R/a/dio, queue, request, faves...) + adapter.addFragment(ProgrammeFragment.newInstance(), getString(R.string.programme)) + viewPager.adapter = adapter diff --git a/app/src/main/res/layout/fragment_programme.xml b/app/src/main/res/layout/fragment_programme.xml new file mode 100644 index 0000000..a77b697 --- /dev/null +++ b/app/src/main/res/layout/fragment_programme.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 948df1d..fb75c76 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -13,7 +13,6 @@ http://stream.radiosolution.fr/rstlss.mp3 Volume: - https://r-a-d.io/api Up next: Now streaming @@ -47,5 +46,7 @@ Select at least one day No alarm set Next alarm: + Last played + Programme