From c20727fca7bbad026dfdd9a4b79fbbfc387764cd Mon Sep 17 00:00:00 2001 From: yattoz <12408848+yattoz@users.noreply.github.com> Date: Wed, 18 Dec 2019 00:42:03 +0100 Subject: [PATCH] added programme fragment with simple RecyclerView --- .../forum_thalie/tsumugi/planning/Planning.kt | 18 +++++- .../tsumugi/planning/Programme.kt | 28 ++++++++- .../ui/nowplaying/NowPlayingFragment.kt | 2 +- .../tsumugi/ui/songs/SongsFragment.kt | 3 +- .../ui/songs/programme/ProgrammeAdapter.kt | 61 +++++++++++++++++++ .../{ => programme}/ProgrammeFragment.kt | 26 ++++---- .../tsumugi/ui/songs/queuelp/SongAdaptater.kt | 2 + .../main/res/layout/fragment_last_played.xml | 4 +- .../main/res/layout/fragment_programme.xml | 20 ++++-- app/src/main/res/layout/programme_view.xml | 52 ++++++++++++++++ app/src/main/res/values/strings.xml | 2 +- 11 files changed, 189 insertions(+), 29 deletions(-) create mode 100644 app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/programme/ProgrammeAdapter.kt rename app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/{ => programme}/ProgrammeFragment.kt (69%) create mode 100644 app/src/main/res/layout/programme_view.xml diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/planning/Planning.kt b/app/src/main/java/fr/forum_thalie/tsumugi/planning/Planning.kt index 03b69f6..06fc71e 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/planning/Planning.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/planning/Planning.kt @@ -3,15 +3,17 @@ package fr.forum_thalie.tsumugi.planning import android.content.Context import androidx.lifecycle.MutableLiveData import fr.forum_thalie.tsumugi.Async +import fr.forum_thalie.tsumugi.weekdays import org.json.JSONObject import java.io.IOException import java.net.URL class Planning { - private val programmes: ArrayList = ArrayList() + val programmes: ArrayList = ArrayList() private var regularProgramme: String? = null val currentProgramme: MutableLiveData = MutableLiveData() + val isProgrammeUpdated: MutableLiveData = MutableLiveData() private fun findCurrentProgramme(): String { @@ -59,7 +61,18 @@ class Planning { for (i in 0 until programList.length()) { val item = programList[i] as JSONObject - val periodicity = item.getInt("periodicity") + var periodicityDec = item.getInt("periodicity") + var periodicity = 0b0000000 + var po = 1000000 + for (j in 0 until weekdays.size) + { + if (periodicityDec / (po) > 0) + { + periodicityDec -= po + periodicity += 1 shl (weekdays.size-1 - j) + } + po /= 10 + } val hourBeginS = item.getString("hour_begin").split(":") val hourBegin = hourBeginS.first().toInt()*60 + hourBeginS.last().toInt() val hourEndS = item.getString("hour_end").split(":") @@ -70,6 +83,7 @@ class Planning { } if (result.has("regular_programme")) regularProgramme = result.getString("regular_programme") + isProgrammeUpdated.value = true } Async(scrape, post) } 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 index 4f5238e..ffb82da 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/planning/Programme.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/planning/Programme.kt @@ -2,11 +2,13 @@ package fr.forum_thalie.tsumugi.planning import android.util.Log import fr.forum_thalie.tsumugi.tag +import fr.forum_thalie.tsumugi.weekdays import java.util.* +import kotlin.collections.ArrayList 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 now = Calendar.getInstance(TimeZone.getTimeZone("GMT+1")) 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) @@ -16,9 +18,9 @@ class Programme (val title: String, private val periodicity: Int, private val ho // 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 isToday: Boolean = (((0b1000000 shr currentDay) and (periodicity)) != 0) val isSpanningOverNight = - (((1000000 shr ((currentDay - 1) % 7) and (periodicity)) != 0) && hourEnd < hourBegin) + (((0b1000000 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. @@ -44,6 +46,26 @@ class Programme (val title: String, private val periodicity: Int, private val ho return "Title: $title, time info (periodicity, begin, end): $periodicity, $hourBegin, $hourEnd" } + fun begin(): String { + return "%02d:%02d".format(hourBegin/60, hourBegin%60) + } + + fun end(): String { + return "%02d:%02d".format(hourEnd/60, hourEnd%60) + } + + fun days(): String { + val res = ArrayList() + for (i in 0 until weekdays.size) { + if (((0b1000000 shr i) and (periodicity)) != 0) + { + res.add(weekdays[i]) + } + + } + return res.toString().drop(1).dropLast(1) // drop '[' and ']' + } + init { Log.d(tag, this.toString()) } diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/nowplaying/NowPlayingFragment.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/nowplaying/NowPlayingFragment.kt index 14eb0a7..d7a26a6 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/nowplaying/NowPlayingFragment.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/nowplaying/NowPlayingFragment.kt @@ -54,7 +54,7 @@ class NowPlayingFragment : Fragment() { // Note: these values are not used in the generic app, but if you want to, you can use them. 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 streamerNameText : TextView = root.findViewById(R.id.streamerName) 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 ac59197..5933253 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 @@ -10,6 +10,7 @@ import androidx.fragment.app.FragmentPagerAdapter import androidx.viewpager.widget.ViewPager import com.google.android.material.tabs.TabLayout import fr.forum_thalie.tsumugi.R +import fr.forum_thalie.tsumugi.ui.songs.programme.ProgrammeFragment import fr.forum_thalie.tsumugi.ui.songs.queuelp.LastPlayedFragment class SongsFragment : Fragment() { @@ -32,14 +33,12 @@ class SongsFragment : Fragment() { // 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 val tabLayout : TabLayout = root.findViewById(R.id.tabLayout) tabLayout.setupWithViewPager(viewPager) Log.d(tag, "SongFragment view created") - return root } diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/programme/ProgrammeAdapter.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/programme/ProgrammeAdapter.kt new file mode 100644 index 0000000..ee89091 --- /dev/null +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/programme/ProgrammeAdapter.kt @@ -0,0 +1,61 @@ +package fr.forum_thalie.tsumugi.ui.songs.programme + +import android.annotation.SuppressLint +import android.util.Log +import android.view.LayoutInflater +import android.view.ViewGroup +import android.widget.TextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.RecyclerView +import fr.forum_thalie.tsumugi.R +import fr.forum_thalie.tsumugi.colorBlue +import fr.forum_thalie.tsumugi.colorWhited +import fr.forum_thalie.tsumugi.planning.Programme +import fr.forum_thalie.tsumugi.tag +import kotlinx.android.synthetic.main.programme_view.view.* +import kotlinx.android.synthetic.main.song_view.view.* + +class ProgrammeAdapter(private val dataSet: ArrayList + /*, + context: Context, + resource: Int, + objects: Array*/ +) : RecyclerView.Adapter() /*ArrayAdapter(context, resource, objects)*/ { + + class MyViewHolder(view: ConstraintLayout) : RecyclerView.ViewHolder(view) + + // Create new views (invoked by the layout manager) + override fun onCreateViewHolder(parent: ViewGroup, + viewType: Int): MyViewHolder { + // create a new view + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.programme_view, parent, false) as ConstraintLayout + return MyViewHolder(view) + } + + // Replace the contents of a view (invoked by the layout manager) + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: MyViewHolder, position: Int) { + val programmeStart = holder.itemView.findViewById(R.id.programme_start) + val programmeEnd = holder.itemView.findViewById(R.id.programme_end) + val programmeName = holder.itemView.findViewById(R.id.programme_name) + val programmeDays = holder.itemView.findViewById(R.id.programme_days) + + programmeStart.text = dataSet[position].begin() + programmeName.text = dataSet[position].title + programmeEnd.text = dataSet[position].end() + programmeDays.text = dataSet[position].days() + } + + // Return the size of your dataset (invoked by the layout manager) + override fun getItemCount() = dataSet.size + + + /* + override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { + // create a new view + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.song_view, parent, false) as ConstraintLayout + } + */ +} \ 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/programme/ProgrammeFragment.kt similarity index 69% rename from app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/ProgrammeFragment.kt rename to app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/programme/ProgrammeFragment.kt index 1097be3..eb13935 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/ProgrammeFragment.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/programme/ProgrammeFragment.kt @@ -1,13 +1,15 @@ -package fr.forum_thalie.tsumugi.ui.songs +package fr.forum_thalie.tsumugi.ui.songs.programme import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import fr.forum_thalie.tsumugi.R +import fr.forum_thalie.tsumugi.planning.Planning 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 @@ -24,34 +26,30 @@ class ProgrammeFragment : Fragment() { ): 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 { + viewAdapter = ProgrammeAdapter(Planning.instance.programmes) + recyclerView = root.findViewById(R.id.programme_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 } - - */ - + Planning.instance.isProgrammeUpdated.observeForever(isProgrammeUpdatedObserver) return root } + private val isProgrammeUpdatedObserver = Observer { + viewAdapter.notifyDataSetChanged() + } + override fun onDestroyView() { super.onDestroyView() + Planning.instance.isProgrammeUpdated.removeObserver(isProgrammeUpdatedObserver) } companion object { @JvmStatic - fun newInstance() = LastPlayedFragment() + fun newInstance() = ProgrammeFragment() } } \ No newline at end of file diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/queuelp/SongAdaptater.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/queuelp/SongAdaptater.kt index 57a7d82..58d9bc2 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/queuelp/SongAdaptater.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/queuelp/SongAdaptater.kt @@ -2,6 +2,7 @@ package fr.forum_thalie.tsumugi.ui.songs.queuelp import android.annotation.SuppressLint import android.graphics.Color +import android.util.Log import android.view.LayoutInflater import android.view.ViewGroup import androidx.constraintlayout.widget.ConstraintLayout @@ -11,6 +12,7 @@ import fr.forum_thalie.tsumugi.R import fr.forum_thalie.tsumugi.colorBlue import fr.forum_thalie.tsumugi.colorWhited import fr.forum_thalie.tsumugi.playerstore.Song +import fr.forum_thalie.tsumugi.tag import kotlinx.android.synthetic.main.song_view.view.* import kotlin.collections.ArrayList diff --git a/app/src/main/res/layout/fragment_last_played.xml b/app/src/main/res/layout/fragment_last_played.xml index 5335a58..318925c 100644 --- a/app/src/main/res/layout/fragment_last_played.xml +++ b/app/src/main/res/layout/fragment_last_played.xml @@ -1,12 +1,12 @@ - - - + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_margin="8dp" + tools:context=".ui.songs.programme.ProgrammeFragment"> - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/programme_view.xml b/app/src/main/res/layout/programme_view.xml new file mode 100644 index 0000000..f6d601f --- /dev/null +++ b/app/src/main/res/layout/programme_view.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + \ 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 fb75c76..e0b0213 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,7 +14,7 @@ Volume: - Up next: + Émission en cours : Now streaming Error loading WebView. Try downloading Google Chrome on Google Play, or enabling it if you disabled it. Settings