From 5920c8cd2122d170fa32d98af3378534809e150b Mon Sep 17 00:00:00 2001 From: yattoz <12408848+yattoz@users.noreply.github.com> Date: Sun, 15 Dec 2019 21:13:04 +0100 Subject: [PATCH 01/14] added planning parser from simple JSON format (with local example) --- app/src/main/assets/planning_example.json | 22 +++++++ .../fr/forum_thalie/tsumugi/MainActivity.kt | 4 ++ .../tsumugi/planning/PlanningParser.kt | 61 +++++++++++++++++++ .../forum_thalie/tsumugi/planning/Program.kt | 41 +++++++++++++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 129 insertions(+) create mode 100644 app/src/main/assets/planning_example.json create mode 100644 app/src/main/java/fr/forum_thalie/tsumugi/planning/PlanningParser.kt create mode 100644 app/src/main/java/fr/forum_thalie/tsumugi/planning/Program.kt diff --git a/app/src/main/assets/planning_example.json b/app/src/main/assets/planning_example.json new file mode 100644 index 0000000..a4a193a --- /dev/null +++ b/app/src/main/assets/planning_example.json @@ -0,0 +1,22 @@ +{ + "planning": [ + { + "title": "Anime Matin", + "periodicity": "1111100", + "hour_begin": "9:00", + "hour_end": "10:30" + }, + { + "title": "Jeux Vidéos Matin", + "periodicity": "1111100", + "hour_begin": "09:00", + "hour_end": "10:30" + }, + { + "title": "Programmation nocturne", + "periodicity": "1111111", + "hour_begin": "23:00", + "hour_end": "5:30" + } + ] +} \ 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 d66911a..5e7cf5e 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/MainActivity.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/MainActivity.kt @@ -16,6 +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 /* Log to file import @@ -155,6 +156,9 @@ class MainActivity : BaseActivity() { isTimerStarted = true } + // fetch program + PlanningParser.instance.parseUrl(/* getString(R.string.planning_url) */ context = this) + // initialize the UI setTheme(R.style.AppTheme) setContentView(R.layout.activity_main) diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/planning/PlanningParser.kt b/app/src/main/java/fr/forum_thalie/tsumugi/planning/PlanningParser.kt new file mode 100644 index 0000000..665793e --- /dev/null +++ b/app/src/main/java/fr/forum_thalie/tsumugi/planning/PlanningParser.kt @@ -0,0 +1,61 @@ +package fr.forum_thalie.tsumugi.planning + +import android.content.Context +import fr.forum_thalie.tsumugi.Async +import org.json.JSONObject +import java.io.IOException +import java.net.URL + +class PlanningParser { + + val programs: ArrayList = ArrayList() + + fun parseUrl(url: String? = null, context: Context? = null) + { + val scrape : (Any?) -> String = { + if (url.isNullOrEmpty() && context != null) + { + val json: String + try { + val inputStream = context.assets.open("planning_example.json") + val size = inputStream.available() + val buffer = ByteArray(size) + inputStream.use { it.read(buffer) } + json = String(buffer) + json + } catch (ioException: IOException) { + ioException.printStackTrace() + "" + } + } + else + URL(url).readText() + + } + val post : (parameter: Any?) -> Unit = { + val result = JSONObject(it as String) + if (result.has("planning")) + { + val programList = result.getJSONArray("planning") + for (i in 0 until programList.length()) + { + val item = programList[i] as JSONObject + val periodicity = item.getInt("periodicity") + val hourBeginS = item.getString("hour_begin").split(":") + val hourBegin = hourBeginS.first().toInt()*60 + hourBeginS.last().toInt() + 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)) + } + } + } + Async(scrape, post) + } + + companion object { + val instance by lazy { + PlanningParser() + } + } +} \ 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 new file mode 100644 index 0000000..4e8a13e --- /dev/null +++ b/app/src/main/java/fr/forum_thalie/tsumugi/planning/Program.kt @@ -0,0 +1,41 @@ +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/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8326a5f..d141255 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -43,5 +43,6 @@ Disable https://tsumugi.forum-thalie.fr/ https://tsumugi.forum-thalie.fr/?feed=rss2 + ADD SOME URL HERE... From ef83c693d05f5f8aa9a62ea508b8c76871aab25c Mon Sep 17 00:00:00 2001 From: yattoz <12408848+yattoz@users.noreply.github.com> Date: Mon, 16 Dec 2019 22:39:07 +0100 Subject: [PATCH 02/14] refactored weekday list to keep in a single place all days names. --- .../tsumugi/BootBroadcastReceiver.kt | 2 +- .../java/fr/forum_thalie/tsumugi/Values.kt | 15 ++++++++++- .../forum_thalie/tsumugi/alarm/RadioAlarm.kt | 7 ++--- .../tsumugi/preferences/AlarmFragment.kt | 26 +++++++++---------- app/src/main/res/values/arrays.xml | 9 ------- app/src/main/res/values/strings.xml | 3 +++ app/src/main/res/xml/alarm_preferences.xml | 4 +-- 7 files changed, 36 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/BootBroadcastReceiver.kt b/app/src/main/java/fr/forum_thalie/tsumugi/BootBroadcastReceiver.kt index e8c0c79..904283f 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/BootBroadcastReceiver.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/BootBroadcastReceiver.kt @@ -20,7 +20,7 @@ class BootBroadcastReceiver : BroadcastReceiver(){ RadioAlarm.instance.setNextAlarm(context) // schedule next alarm } - if (arg1.getStringExtra("action") == "fr.forum_thalie.tsumugi.${Actions.PLAY_OR_FALLBACK.name}" ) + if (arg1.getStringExtra("action") == "$tag.${Actions.PLAY_OR_FALLBACK.name}" ) { RadioAlarm.instance.setNextAlarm(context) // schedule next alarm if (PlayerStore.instance.streamerName.value.isNullOrBlank()) diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/Values.kt b/app/src/main/java/fr/forum_thalie/tsumugi/Values.kt index a2d5db1..912869d 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/Values.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/Values.kt @@ -2,10 +2,23 @@ package fr.forum_thalie.tsumugi import android.content.SharedPreferences import android.content.res.ColorStateList +import kotlin.collections.ArrayList const val tag = "fr.forum_thalie.tsumugi" -const val noConnectionValue = "No connection" +const val noConnectionValue = "Arrêté." const val streamDownValue = "Tsumugi est HS !" +val weekdaysArray : Array = arrayOf( "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche") + +val weekdays = ArrayList().apply { weekdaysArray.forEach { add(it) } } +val weekdaysSundayFirst = ArrayList().apply { + weekdays.forEach { + add(it) + } + val lastDay = last() + removeAt(size - 1) + add(0, lastDay) +} + var colorBlue: Int = 0 var colorWhited: Int = 0 var colorGreenList: ColorStateList? = ColorStateList.valueOf(0) diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/alarm/RadioAlarm.kt b/app/src/main/java/fr/forum_thalie/tsumugi/alarm/RadioAlarm.kt index 25ccaad..1aac409 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/alarm/RadioAlarm.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/alarm/RadioAlarm.kt @@ -10,6 +10,7 @@ import fr.forum_thalie.tsumugi.BootBroadcastReceiver import androidx.preference.PreferenceManager import fr.forum_thalie.tsumugi.* import java.util.* +import kotlin.collections.ArrayList class RadioAlarm { @@ -38,7 +39,7 @@ class RadioAlarm { val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager alarmIntent = Intent(c, BootBroadcastReceiver::class.java).let { intent -> - intent.putExtra("action", "fr.forum_thalie.tsumugi.${Actions.PLAY_OR_FALLBACK.name}") + intent.putExtra("action", "$tag.${Actions.PLAY_OR_FALLBACK.name}") PendingIntent.getBroadcast(c, 0, intent, 0) } val showIntent = Intent(c, ParametersActivity::class.java).let { intent -> @@ -60,7 +61,7 @@ class RadioAlarm { val hourOfDay = time / 60 //time is in minutes val minute = time % 60 - val fullWeekOrdered = arrayListOf("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday") + val fullWeekOrdered = weekdaysSundayFirst //Sunday --> Saturday val selectedDays = arrayListOf() for (item in fullWeekOrdered) { @@ -100,7 +101,7 @@ class RadioAlarm { { val alarmManager = c.getSystemService(Context.ALARM_SERVICE) as AlarmManager alarmIntent = Intent(c, BootBroadcastReceiver::class.java).let { intent -> - intent.putExtra("action", "fr.forum_thalie.tsumugi.${Actions.PLAY_OR_FALLBACK.name}") + intent.putExtra("action", "$tag.${Actions.PLAY_OR_FALLBACK.name}") PendingIntent.getBroadcast(c, 0, intent, 0) } val showIntent = Intent(c, ParametersActivity::class.java).let { intent -> diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/preferences/AlarmFragment.kt b/app/src/main/java/fr/forum_thalie/tsumugi/preferences/AlarmFragment.kt index 46359ea..d876246 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/preferences/AlarmFragment.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/preferences/AlarmFragment.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.util.Log import androidx.core.content.edit import androidx.preference.* +import fr.forum_thalie.tsumugi.* import fr.forum_thalie.tsumugi.R import fr.forum_thalie.tsumugi.alarm.RadioAlarm import java.util.* @@ -18,6 +19,9 @@ class AlarmFragment : PreferenceFragmentCompat() { val alarmDays = findPreference("alarmDays") val snoozeDuration = findPreference("snoozeDuration") + alarmDays?.entries = weekdaysArray + alarmDays?.entryValues = weekdaysArray + alarmDays?.setDefaultValue(weekdaysArray) fun updateIsWakingUpSummary(preference: SwitchPreferenceCompat?, newValue: Boolean? = true, forceTime: Int? = null, forceDays: Set? = null) { @@ -26,15 +30,13 @@ class AlarmFragment : PreferenceFragmentCompat() { calendar.timeInMillis = dateLong if (newValue == true && calendar.timeInMillis > 0) { - val fullWeekOrdered = arrayListOf("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday") - preference?.summary = "Next alarm on ${fullWeekOrdered[calendar.get(Calendar.DAY_OF_WEEK) - 1]} " + - "at ${if (calendar.get(Calendar.HOUR_OF_DAY) < 10) "0" else ""}${calendar.get(Calendar.HOUR_OF_DAY)}" + - ":${if (calendar.get(Calendar.MINUTE) < 10) "0" else ""}${calendar.get(Calendar.MINUTE)}" + val fullWeekOrdered = weekdaysSundayFirst + preference?.summary = getString(R.string.next_alarm) + " ${fullWeekOrdered[calendar.get(Calendar.DAY_OF_WEEK) - 1]} ${if (calendar.get(Calendar.HOUR_OF_DAY) < 10) "0" else ""}${calendar.get(Calendar.HOUR_OF_DAY)}:${if (calendar.get(Calendar.MINUTE) < 10) "0" else ""}${calendar.get(Calendar.MINUTE)}" } else if (newValue == true) - preference?.summary = "Select at least one day" + preference?.summary = getString(R.string.select_one_day) else { - preference?.summary = "No alarm set" + preference?.summary = getString(R.string.no_alarm_set) } } @@ -76,17 +78,15 @@ class AlarmFragment : PreferenceFragmentCompat() { fun updateDays(preference : MultiSelectListPreference?, newValue : Set?) { - Log.d(tag, newValue.toString()) - val listOfDays : String - val fullWeek = context!!.resources.getStringArray(R.array.weekdays).toSet() - val workingWeek = context!!.resources.getStringArray(R.array.weekdays).toSet().minusElement("Saturday").minusElement("Sunday") - listOfDays = when (newValue) { + val fullWeek = weekdays.toSet() + val workingWeek = weekdays.toSet().minusElement(weekdays.last()).minusElement(weekdays.elementAt(weekdays.size - 2)) + val listOfDays = when (newValue) { fullWeek -> context!!.getString(R.string.every_day) workingWeek -> context!!.getString(R.string.working_days) else -> { // build ORDERED LIST of days... I don't know why the original one is in shambles!! - val fullWeekOrdered = arrayListOf("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday") - val selectedDays = arrayListOf() + val fullWeekOrdered = weekdays + val selectedDays = ArrayList() for (item in fullWeekOrdered) { if (newValue!!.contains(item)) selectedDays.add(item) diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 969d1fd..22874e6 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -1,15 +1,6 @@ - - Monday - Tuesday - Wednesday - Thursday - Friday - Saturday - Sunday - @string/disable 1 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d141255..948df1d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -44,5 +44,8 @@ https://tsumugi.forum-thalie.fr/ https://tsumugi.forum-thalie.fr/?feed=rss2 ADD SOME URL HERE... + Select at least one day + No alarm set + Next alarm: diff --git a/app/src/main/res/xml/alarm_preferences.xml b/app/src/main/res/xml/alarm_preferences.xml index f397f61..40b231e 100644 --- a/app/src/main/res/xml/alarm_preferences.xml +++ b/app/src/main/res/xml/alarm_preferences.xml @@ -23,9 +23,7 @@ app:iconSpaceReserved="false" app:title="Select days of the week" app:singleLineTitle="false" - android:entries="@array/weekdays" - android:entryValues="@array/weekdays" - android:defaultValue="@array/weekdays" + /> Date: Mon, 16 Dec 2019 23:38:50 +0100 Subject: [PATCH 03/14] 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 From 8b5ecc72885b6b6dc6d2a5169ff36383dd6b4b3e Mon Sep 17 00:00:00 2001 From: yattoz <12408848+yattoz@users.noreply.github.com> Date: Mon, 16 Dec 2019 23:58:58 +0100 Subject: [PATCH 04/14] Tied programme name to songTitleNextText. --- .../java/fr/forum_thalie/tsumugi/RadioService.kt | 2 +- .../fr/forum_thalie/tsumugi/planning/Planning.kt | 11 ++++++++++- .../tsumugi/ui/nowplaying/NowPlayingFragment.kt | 15 +++++++++++---- app/src/main/res/layout/fragment_nowplaying.xml | 7 ++++--- 4 files changed, 26 insertions(+), 9 deletions(-) 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 c94f06d..cb5ba8c 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/RadioService.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/RadioService.kt @@ -130,7 +130,7 @@ class RadioService : MediaBrowserServiceCompat() { PlayerStore.instance.updateLp() } nowPlayingNotification.update(this) - Log.d(tag, Planning.instance.currentProgramme()) + Planning.instance.checkProgramme() } private val streamerPictureObserver = Observer { 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 5be46d4..03b69f6 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 @@ -1,6 +1,7 @@ package fr.forum_thalie.tsumugi.planning import android.content.Context +import androidx.lifecycle.MutableLiveData import fr.forum_thalie.tsumugi.Async import org.json.JSONObject import java.io.IOException @@ -10,8 +11,9 @@ class Planning { private val programmes: ArrayList = ArrayList() private var regularProgramme: String? = null + val currentProgramme: MutableLiveData = MutableLiveData() - fun currentProgramme(): String + private fun findCurrentProgramme(): String { programmes.forEach { if (it.isCurrent()) @@ -20,6 +22,13 @@ class Planning { return regularProgramme ?: "none" } + fun checkProgramme() + { + val newProgramme = findCurrentProgramme() + if (currentProgramme.value != newProgramme) + currentProgramme.value = newProgramme + } + fun parseUrl(url: String? = null, context: Context? = null) { val scrape : (Any?) -> String = { 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 f2fb0db..14eb0a7 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 @@ -21,8 +21,10 @@ import com.google.android.material.snackbar.BaseTransientBottomBar import com.google.android.material.snackbar.Snackbar import fr.forum_thalie.tsumugi.* import fr.forum_thalie.tsumugi.alarm.RadioSleeper +import fr.forum_thalie.tsumugi.planning.Planning import fr.forum_thalie.tsumugi.playerstore.PlayerStore import fr.forum_thalie.tsumugi.playerstore.Song +import kotlinx.android.synthetic.main.fragment_nowplaying.* class NowPlayingFragment : Fragment() { @@ -51,10 +53,11 @@ class NowPlayingFragment : Fragment() { val streamerPictureImageView: ImageView = root.findViewById(R.id.streamerPicture) // Note: these values are not used in the generic app, but if you want to, you can use them. - /* - val streamerNameText : TextView = root.findViewById(R.id.streamerName) val songTitleNextText: TextView = root.findViewById(R.id.text_song_title_next) val songArtistNextText: TextView = root.findViewById(R.id.text_song_artist_next) + + /* + val streamerNameText : TextView = root.findViewById(R.id.streamerName) val listenersText : TextView = root.findViewById(R.id.listenersCount) */ @@ -86,11 +89,15 @@ class NowPlayingFragment : Fragment() { PlayerStore.instance.currentSong.title.observe(viewLifecycleOwner, Observer { - songTitleText.text = it + songTitleText.text = it + }) + + Planning.instance.currentProgramme.observe(viewLifecycleOwner, Observer { + songTitleNextText.text = it }) PlayerStore.instance.currentSong.artist.observe(viewLifecycleOwner, Observer { - songArtistText.text = it + songArtistText.text = it }) PlayerStore.instance.playbackState.observe(viewLifecycleOwner, Observer { diff --git a/app/src/main/res/layout/fragment_nowplaying.xml b/app/src/main/res/layout/fragment_nowplaying.xml index 5903044..2336dc4 100644 --- a/app/src/main/res/layout/fragment_nowplaying.xml +++ b/app/src/main/res/layout/fragment_nowplaying.xml @@ -173,7 +173,7 @@ android:orientation="vertical" android:layout_marginEnd="8dp" android:layout_marginRight="8dp" - android:visibility="gone" + android:visibility="visible" > + app:layout_constraintTop_toBottomOf="@id/upNext" + android:visibility="gone"/> Date: Tue, 17 Dec 2019 00:03:33 +0100 Subject: [PATCH 05/14] changed program to match Tsumugi's --- app/src/main/assets/planning_example.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/assets/planning_example.json b/app/src/main/assets/planning_example.json index 13c4fa0..b2fdba0 100644 --- a/app/src/main/assets/planning_example.json +++ b/app/src/main/assets/planning_example.json @@ -43,13 +43,13 @@ "hour_end": "21:00" }, { - "title": "Jeux Vidéos Nuit", + "title": "Anime Nuit", "periodicity": "1111111", "hour_begin": "00:00", "hour_end": "01:00" }, { - "title": "Anime Nuit", + "title": "Jeux Vidéos Nuit", "periodicity": "1111111", "hour_begin": "01:00", "hour_end": "02:00" 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 06/14] 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 From 3e51df6a87648bd6828dc00e05b745f963487b30 Mon Sep 17 00:00:00 2001 From: yattoz <12408848+yattoz@users.noreply.github.com> Date: Wed, 18 Dec 2019 20:14:52 +0100 Subject: [PATCH 07/14] created dedicated tabPager for programme --- .../fr/forum_thalie/tsumugi/MainActivity.kt | 7 ++- .../tsumugi/planning/Programme.kt | 1 - .../SongsPagerAdapter.kt => APagerAdapter.kt} | 4 +- .../{songs => }/programme/ProgrammeAdapter.kt | 12 ++--- .../ProgrammeDayFragment.kt} | 15 +++--- .../tsumugi/ui/programme/ProgrammeFragment.kt | 45 ++++++++++++++++ .../tsumugi/ui/songs/SongsFragment.kt | 12 +++-- .../main/res/drawable-anydpi/ic_programme.xml | 11 ++++ .../main/res/drawable-hdpi/ic_programme.png | Bin 0 -> 229 bytes .../main/res/drawable-mdpi/ic_programme.png | Bin 0 -> 144 bytes .../main/res/drawable-xhdpi/ic_programme.png | Bin 0 -> 215 bytes .../main/res/drawable-xxhdpi/ic_programme.png | Bin 0 -> 313 bytes .../main/res/layout/fragment_programme.xml | 48 ++++++++++++++---- .../res/layout/fragment_programme_day.xml | 19 +++++++ app/src/main/res/layout/programme_view.xml | 21 +++++--- app/src/main/res/menu/bottom_nav_menu.xml | 5 ++ .../res/navigation/navigation_programme.xml | 14 +++++ app/src/main/res/values/strings.xml | 1 + 18 files changed, 170 insertions(+), 45 deletions(-) rename app/src/main/java/fr/forum_thalie/tsumugi/ui/{songs/SongsPagerAdapter.kt => APagerAdapter.kt} (84%) rename app/src/main/java/fr/forum_thalie/tsumugi/ui/{songs => }/programme/ProgrammeAdapter.kt (86%) rename app/src/main/java/fr/forum_thalie/tsumugi/ui/{songs/programme/ProgrammeFragment.kt => programme/ProgrammeDayFragment.kt} (77%) create mode 100644 app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeFragment.kt create mode 100644 app/src/main/res/drawable-anydpi/ic_programme.xml create mode 100644 app/src/main/res/drawable-hdpi/ic_programme.png create mode 100644 app/src/main/res/drawable-mdpi/ic_programme.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_programme.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_programme.png create mode 100644 app/src/main/res/layout/fragment_programme_day.xml create mode 100644 app/src/main/res/navigation/navigation_programme.xml 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 9772a01..e1b2369 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/MainActivity.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/MainActivity.kt @@ -38,8 +38,11 @@ class MainActivity : BaseActivity() { val bottomNavigationView : BottomNavigationView = findViewById(R.id.bottom_nav) //val navGraphIds = listOf(R.navigation.home, R.navigation.list, R.navigation.form) - val navGraphIds = listOf(R.navigation.navigation_nowplaying, R.navigation.navigation_songs, - R.navigation.navigation_news) + val navGraphIds = listOf( + R.navigation.navigation_nowplaying, + R.navigation.navigation_songs, + R.navigation.navigation_news, + R.navigation.navigation_programme) // Setup the bottom navigation view with a list of navigation graphs val controller = bottomNavigationView.setupWithNavController( 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 ffb82da..a7c37c1 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 @@ -61,7 +61,6 @@ class Programme (val title: String, private val periodicity: Int, private val ho { res.add(weekdays[i]) } - } return res.toString().drop(1).dropLast(1) // drop '[' and ']' } diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/SongsPagerAdapter.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/APagerAdapter.kt similarity index 84% rename from app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/SongsPagerAdapter.kt rename to app/src/main/java/fr/forum_thalie/tsumugi/ui/APagerAdapter.kt index e69882b..e5d7be6 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/SongsPagerAdapter.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/APagerAdapter.kt @@ -1,11 +1,11 @@ -package fr.forum_thalie.tsumugi.ui.songs +package fr.forum_thalie.tsumugi.ui import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentPagerAdapter import androidx.fragment.app.FragmentManager -class SongsPagerAdapter(f: FragmentManager, t: Int) : FragmentPagerAdapter(f, t){ +class APagerAdapter(f: FragmentManager, t: Int) : FragmentPagerAdapter(f, t){ private val fragmentList = ArrayList() private val fragmentTitleList = ArrayList() 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/programme/ProgrammeAdapter.kt similarity index 86% rename from app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/programme/ProgrammeAdapter.kt rename to app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeAdapter.kt index ee89091..368743a 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/programme/ProgrammeAdapter.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeAdapter.kt @@ -1,19 +1,13 @@ -package fr.forum_thalie.tsumugi.ui.songs.programme +package fr.forum_thalie.tsumugi.ui.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 /*, @@ -30,7 +24,9 @@ class ProgrammeAdapter(private val dataSet: ArrayList // create a new view val view = LayoutInflater.from(parent.context) .inflate(R.layout.programme_view, parent, false) as ConstraintLayout - return MyViewHolder(view) + return MyViewHolder( + view + ) } // Replace the contents of a view (invoked by the layout manager) diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/programme/ProgrammeFragment.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt similarity index 77% rename from app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/programme/ProgrammeFragment.kt rename to app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt index eb13935..2fc0cdd 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/songs/programme/ProgrammeFragment.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt @@ -1,4 +1,4 @@ -package fr.forum_thalie.tsumugi.ui.songs.programme +package fr.forum_thalie.tsumugi.ui.programme import android.os.Bundle import android.view.LayoutInflater @@ -10,11 +10,8 @@ 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 -class ProgrammeFragment : Fragment() { +class ProgrammeDayFragment(day: String) : Fragment() { private lateinit var recyclerView: RecyclerView private lateinit var viewAdapter: RecyclerView.Adapter<*> @@ -25,9 +22,10 @@ class ProgrammeFragment : Fragment() { savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment - val root = inflater.inflate(R.layout.fragment_programme, container, false) + val root = inflater.inflate(R.layout.fragment_programme_day, container, false) viewManager = LinearLayoutManager(context) - viewAdapter = ProgrammeAdapter(Planning.instance.programmes) + 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 @@ -50,6 +48,7 @@ class ProgrammeFragment : Fragment() { companion object { @JvmStatic - fun newInstance() = ProgrammeFragment() + fun newInstance(day: String) = + ProgrammeDayFragment(day) } } \ No newline at end of file diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeFragment.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeFragment.kt new file mode 100644 index 0000000..4ced158 --- /dev/null +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeFragment.kt @@ -0,0 +1,45 @@ +package fr.forum_thalie.tsumugi.ui.programme + +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +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.APagerAdapter +import fr.forum_thalie.tsumugi.weekdays + +class ProgrammeFragment : Fragment() { + + private lateinit var adapter : APagerAdapter + private lateinit var root: View + private lateinit var viewPager: ViewPager + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + root = inflater.inflate(R.layout.fragment_programme, container, false) + viewPager = root.findViewById(R.id.dayTabPager) + adapter = APagerAdapter(childFragmentManager, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) + // You can add more fragments to the adapter, to display more information (for example with R/a/dio, queue, request, faves...) + weekdays.forEach { + adapter.addFragment(ProgrammeDayFragment.newInstance(it), it) + } + + viewPager.adapter = adapter + + val tabLayout : TabLayout = root.findViewById(R.id.dayTabLayout) + tabLayout.setupWithViewPager(viewPager) + Log.d(tag, "SongFragment view created") + + return root + } + +} \ 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 5933253..9e99ef7 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,12 +10,13 @@ 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.APagerAdapter +import fr.forum_thalie.tsumugi.ui.programme.ProgrammeDayFragment import fr.forum_thalie.tsumugi.ui.songs.queuelp.LastPlayedFragment class SongsFragment : Fragment() { - private lateinit var adapter : SongsPagerAdapter + private lateinit var adapter : APagerAdapter private lateinit var root: View private lateinit var viewPager: ViewPager @@ -27,11 +28,12 @@ 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 = APagerAdapter( + childFragmentManager, + FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT + ) 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/drawable-anydpi/ic_programme.xml b/app/src/main/res/drawable-anydpi/ic_programme.xml new file mode 100644 index 0000000..7dd7db1 --- /dev/null +++ b/app/src/main/res/drawable-anydpi/ic_programme.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable-hdpi/ic_programme.png b/app/src/main/res/drawable-hdpi/ic_programme.png new file mode 100644 index 0000000000000000000000000000000000000000..3431e26af78bc825d3466aa77f7c7b08c2a7210b GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB)_A%&hE&{odp(e=L4k+u!Mfmz z$p^BQZ_qB0<f}@3qBl^EEPOCnq)2RLAsgC@$u!;6J$a@AHN~PA#p`oqb69Mwfsgj-y7w4lTtRzEBDSUtSI)Xm;9r7 d_Gs%0VfD?C+Zn~hzX9FN;OXk;vd$@?2>`g*SQP*O literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_programme.png b/app/src/main/res/drawable-mdpi/ic_programme.png new file mode 100644 index 0000000000000000000000000000000000000000..a16a2923f98930591d6f236a205ebac8a3fb017d GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj;hrvzAr-fh6C^Y~{Qv*|sDh7f z>6eWRD+2gC)DN0WY;>&p`XTayf8#>~8^QUk-769fJ`zk|JUhwkuCBt#-;2d~e7Q3w sc8T>zIh<(f+@iNGGx}i6IwH*Idp$Xsgt)xP3%(Y{uNTP7}%Nj(o^GXFC(Jb0MsyUO?L^;WJc@3Uv$ zd3gKE!b1@Dfe{s Kb6Mw<&;$Ta1W>U6 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_programme.png b/app/src/main/res/drawable-xxhdpi/ic_programme.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad4b90c259c67fa4672816cb8c5521611343a05 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@Zgyv2U}W%gaSW-r_4alwSCfMT>xBhk z0lJzSd|5^R<}4InXfK|ne8qc-fBb^SI}76Hel$>6aX&>#$=M_J`qlN%cIhcNG%zqq zNd-hzOp99bF6i{OvtKuyjobcy@A-eN#{Rav981@pwbfZvxNK!RPl26n+q@+u8$;bJ z=8H{qn9b8zHql`^Pva?%1=(#5qF|$#SXMCZVq_BGf6~mP;1I}thmn!#iu8gwn<_>| zDUl1z0w7gi#b0o8fLV-8CYQcD0-eCb0uo4OT?J%*@n2wc*#3-@yWqFB$X$(Gj|1*H zoYi=C(;?RUl9BL|9}~~4pS;EFinbCEEI!ZuCT01(TjFsgz#w7pboFyt=akR{0ER+x AHUIzs literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/fragment_programme.xml b/app/src/main/res/layout/fragment_programme.xml index 08fe44e..0df63dd 100644 --- a/app/src/main/res/layout/fragment_programme.xml +++ b/app/src/main/res/layout/fragment_programme.xml @@ -1,19 +1,45 @@ - + android:layout_height="match_parent" > - + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" > - + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_programme_day.xml b/app/src/main/res/layout/fragment_programme_day.xml new file mode 100644 index 0000000..6564d62 --- /dev/null +++ b/app/src/main/res/layout/fragment_programme_day.xml @@ -0,0 +1,19 @@ + + + + + + + + \ 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 index f6d601f..a6ea7a2 100644 --- a/app/src/main/res/layout/programme_view.xml +++ b/app/src/main/res/layout/programme_view.xml @@ -16,27 +16,32 @@ + + diff --git a/app/src/main/res/navigation/navigation_programme.xml b/app/src/main/res/navigation/navigation_programme.xml new file mode 100644 index 0000000..5f7b592 --- /dev/null +++ b/app/src/main/res/navigation/navigation_programme.xml @@ -0,0 +1,14 @@ + + + + + + \ 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 e0b0213..e41b508 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4,6 +4,7 @@ Songs Chat News + Programme Now playing: %1$s From a4669716b076479c410a4ce7aed740c27e35f57f Mon Sep 17 00:00:00 2001 From: yattoz <12408848+yattoz@users.noreply.github.com> Date: Wed, 18 Dec 2019 21:12:59 +0100 Subject: [PATCH 08/14] refined recyclers. Opens on current day (yay!) --- app/src/main/assets/planning_example.json | 3 ++- .../tsumugi/planning/Programme.kt | 13 +++++++++++ .../tsumugi/ui/programme/ProgrammeAdapter.kt | 18 +++++++++++---- .../ui/programme/ProgrammeDayFragment.kt | 23 +++++++++++++++---- .../tsumugi/ui/programme/ProgrammeFragment.kt | 4 ++++ app/src/main/res/layout/news_view.xml | 5 +++- app/src/main/res/layout/programme_view.xml | 22 ++++++++---------- app/src/main/res/layout/song_view.xml | 6 ++--- 8 files changed, 67 insertions(+), 27 deletions(-) diff --git a/app/src/main/assets/planning_example.json b/app/src/main/assets/planning_example.json index b2fdba0..94c582a 100644 --- a/app/src/main/assets/planning_example.json +++ b/app/src/main/assets/planning_example.json @@ -61,5 +61,6 @@ "hour_end": "06:00" } ], - "regular_programme" : "Programmation habituelle" + "regular_programme" : "Programmation habituelle", + "timezone": "GMT+1" } \ 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 index a7c37c1..3d848ca 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 @@ -7,6 +7,19 @@ 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 isThisDay(day: Int): Boolean { + + // 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. + return (((0b1000000 shr day) and (periodicity)) != 0) + } + fun isCurrent(): Boolean { val now = Calendar.getInstance(TimeZone.getTimeZone("GMT+1")) val currentDay = diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeAdapter.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeAdapter.kt index 368743a..be9045b 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeAdapter.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeAdapter.kt @@ -7,13 +7,18 @@ 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.planning.Programme +import fr.forum_thalie.tsumugi.weekdays +import fr.forum_thalie.tsumugi.weekdaysSundayFirst +import java.util.* +import kotlin.collections.ArrayList -class ProgrammeAdapter(private val dataSet: ArrayList +class ProgrammeAdapter(private val dataSet: ArrayList, private val day: String /*, context: Context, resource: Int, - objects: Array*/ + objects: ArrayList*/ ) : RecyclerView.Adapter() /*ArrayAdapter(context, resource, objects)*/ { class MyViewHolder(view: ConstraintLayout) : RecyclerView.ViewHolder(view) @@ -35,12 +40,17 @@ class ProgrammeAdapter(private val dataSet: ArrayList 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() + + if (dataSet[position].isCurrent() && (Calendar.getInstance(TimeZone.getTimeZone("GMT+1")).get(Calendar.DAY_OF_WEEK) - 1 == weekdaysSundayFirst.indexOf(day))) + { + programmeStart.setTextColor(colorBlue) + programmeEnd.setTextColor(colorBlue) + programmeName.setTextColor(colorBlue) + } } // Return the size of your dataset (invoked by the layout manager) diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt index 2fc0cdd..9f06b85 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt @@ -10,12 +10,16 @@ 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.planning.Programme +import fr.forum_thalie.tsumugi.weekdays +import kotlinx.android.synthetic.main.fragment_programme.* -class ProgrammeDayFragment(day: String) : Fragment() { +class ProgrammeDayFragment(private val day: String) : Fragment() { private lateinit var recyclerView: RecyclerView private lateinit var viewAdapter: RecyclerView.Adapter<*> private lateinit var viewManager: RecyclerView.LayoutManager + private val programmeOfTheDay: ArrayList = ArrayList() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -23,9 +27,13 @@ class ProgrammeDayFragment(day: String) : Fragment() { ): View? { // Inflate the layout for this fragment val root = inflater.inflate(R.layout.fragment_programme_day, container, false) + Planning.instance.programmes.forEach { + if (it.isThisDay(day = weekdays.indexOf(day))) + programmeOfTheDay.add(it) + } viewManager = LinearLayoutManager(context) viewAdapter = - ProgrammeAdapter(Planning.instance.programmes) + ProgrammeAdapter(programmeOfTheDay, day) 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 @@ -33,17 +41,22 @@ class ProgrammeDayFragment(day: String) : Fragment() { layoutManager = viewManager adapter = viewAdapter } - Planning.instance.isProgrammeUpdated.observeForever(isProgrammeUpdatedObserver) + Planning.instance.currentProgramme.observeForever(isProgrammeUpdatedObserver) return root } - private val isProgrammeUpdatedObserver = Observer { + private val isProgrammeUpdatedObserver = Observer { + programmeOfTheDay.clear() + Planning.instance.programmes.forEach { + if (it.isThisDay(day = weekdays.indexOf(day))) + programmeOfTheDay.add(it) + } viewAdapter.notifyDataSetChanged() } override fun onDestroyView() { super.onDestroyView() - Planning.instance.isProgrammeUpdated.removeObserver(isProgrammeUpdatedObserver) + Planning.instance.currentProgramme.removeObserver(isProgrammeUpdatedObserver) } companion object { diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeFragment.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeFragment.kt index 4ced158..2be6c49 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeFragment.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeFragment.kt @@ -12,6 +12,8 @@ import com.google.android.material.tabs.TabLayout import fr.forum_thalie.tsumugi.R import fr.forum_thalie.tsumugi.ui.APagerAdapter import fr.forum_thalie.tsumugi.weekdays +import fr.forum_thalie.tsumugi.weekdaysSundayFirst +import java.util.* class ProgrammeFragment : Fragment() { @@ -34,6 +36,8 @@ class ProgrammeFragment : Fragment() { } viewPager.adapter = adapter + val todaySundayFirst = Calendar.getInstance(TimeZone.getTimeZone("GMT+1")).get(Calendar.DAY_OF_WEEK) - 1 + viewPager.currentItem = (todaySundayFirst - 1)%7 val tabLayout : TabLayout = root.findViewById(R.id.dayTabLayout) tabLayout.setupWithViewPager(viewPager) diff --git a/app/src/main/res/layout/news_view.xml b/app/src/main/res/layout/news_view.xml index 112a5b4..82ab95a 100644 --- a/app/src/main/res/layout/news_view.xml +++ b/app/src/main/res/layout/news_view.xml @@ -4,7 +4,9 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="16dp"> + android:layout_marginTop="16dp" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp"> - - + android:layout_marginTop="8dp" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp"> @@ -26,12 +20,13 @@ Date: Wed, 18 Dec 2019 21:51:16 +0100 Subject: [PATCH 09/14] set timezone in JSON. Computes/displays with JSON Timezone (not local) --- .../forum_thalie/tsumugi/planning/Planning.kt | 23 ++++++++++++---- .../tsumugi/planning/Programme.kt | 14 +++++++--- .../tsumugi/ui/programme/ProgrammeAdapter.kt | 3 ++- .../ui/programme/ProgrammeDayFragment.kt | 27 +++++++++---------- .../tsumugi/ui/programme/ProgrammeFragment.kt | 4 +-- app/src/main/res/values/strings.xml | 3 ++- 6 files changed, 47 insertions(+), 27 deletions(-) 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 06fc71e..1d5d148 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,17 +3,22 @@ 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.R import fr.forum_thalie.tsumugi.weekdays import org.json.JSONObject import java.io.IOException import java.net.URL +import java.util.* +import kotlin.collections.ArrayList class Planning { val programmes: ArrayList = ArrayList() private var regularProgramme: String? = null val currentProgramme: MutableLiveData = MutableLiveData() - val isProgrammeUpdated: MutableLiveData = MutableLiveData() + val isDataFetched: MutableLiveData = MutableLiveData() + + var timeZone: TimeZone = Calendar.getInstance().timeZone private fun findCurrentProgramme(): String { @@ -21,7 +26,7 @@ class Planning { if (it.isCurrent()) return it.title } - return regularProgramme ?: "none" + return regularProgramme ?: "-" } fun checkProgramme() @@ -81,9 +86,17 @@ class Planning { programmes.add(Programme(title, periodicity, hourBegin, hourEnd)) } } - if (result.has("regular_programme")) - regularProgramme = result.getString("regular_programme") - isProgrammeUpdated.value = true + regularProgramme = if (result.has("regular_programme")) + result.getString("regular_programme") + else + context?.getString(R.string.regular_programme) + + timeZone = if (result.has("timezone")) + TimeZone.getTimeZone(result.getString("timezone")) + else + Calendar.getInstance().timeZone + + isDataFetched.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 3d848ca..93b5ab1 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 @@ -21,7 +21,7 @@ class Programme (val title: String, private val periodicity: Int, private val ho } fun isCurrent(): Boolean { - val now = Calendar.getInstance(TimeZone.getTimeZone("GMT+1")) + val now = Calendar.getInstance(Planning.instance.timeZone) 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) @@ -59,14 +59,20 @@ class Programme (val title: String, private val periodicity: Int, private val ho return "Title: $title, time info (periodicity, begin, end): $periodicity, $hourBegin, $hourEnd" } + private val offset1 = (Planning.instance.timeZone.getOffset(System.currentTimeMillis())) / (60*1000) + private val offset2 = (Calendar.getInstance().timeZone.getOffset(System.currentTimeMillis())) / (60*1000) + fun begin(): String { - return "%02d:%02d".format(hourBegin/60, hourBegin%60) + val hourBeginTZCorrect = hourBegin // + offset1 - offset2 + return "%02d:%02d".format(hourBeginTZCorrect/60, hourBeginTZCorrect%60) } fun end(): String { - return "%02d:%02d".format(hourEnd/60, hourEnd%60) + val hourEndTZCorrect = hourEnd // + offset1 - offset2 + return "%02d:%02d".format(hourEndTZCorrect/60, hourEndTZCorrect%60) } + /* fun days(): String { val res = ArrayList() for (i in 0 until weekdays.size) { @@ -78,6 +84,8 @@ class Programme (val title: String, private val periodicity: Int, private val ho 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/programme/ProgrammeAdapter.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeAdapter.kt index be9045b..8fddfdd 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeAdapter.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeAdapter.kt @@ -8,6 +8,7 @@ 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.planning.Planning import fr.forum_thalie.tsumugi.planning.Programme import fr.forum_thalie.tsumugi.weekdays import fr.forum_thalie.tsumugi.weekdaysSundayFirst @@ -45,7 +46,7 @@ class ProgrammeAdapter(private val dataSet: ArrayList, private val da programmeName.text = dataSet[position].title programmeEnd.text = dataSet[position].end() - if (dataSet[position].isCurrent() && (Calendar.getInstance(TimeZone.getTimeZone("GMT+1")).get(Calendar.DAY_OF_WEEK) - 1 == weekdaysSundayFirst.indexOf(day))) + if (dataSet[position].isCurrent() && (Calendar.getInstance(Planning.instance.timeZone).get(Calendar.DAY_OF_WEEK) - 1 == weekdaysSundayFirst.indexOf(day))) { programmeStart.setTextColor(colorBlue) programmeEnd.setTextColor(colorBlue) diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt index 9f06b85..2ae694d 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt @@ -41,24 +41,21 @@ class ProgrammeDayFragment(private val day: String) : Fragment() { layoutManager = viewManager adapter = viewAdapter } - Planning.instance.currentProgramme.observeForever(isProgrammeUpdatedObserver) + Planning.instance.currentProgramme.observe(viewLifecycleOwner, Observer { + programmeOfTheDay.clear() + Planning.instance.programmes.forEach { + if (it.isThisDay(day = weekdays.indexOf(day))) + programmeOfTheDay.add(it) + } + viewAdapter.notifyDataSetChanged() + }) + + Planning.instance.isDataFetched.observe(viewLifecycleOwner, Observer { + viewAdapter.notifyDataSetChanged() + }) return root } - private val isProgrammeUpdatedObserver = Observer { - programmeOfTheDay.clear() - Planning.instance.programmes.forEach { - if (it.isThisDay(day = weekdays.indexOf(day))) - programmeOfTheDay.add(it) - } - viewAdapter.notifyDataSetChanged() - } - - override fun onDestroyView() { - super.onDestroyView() - Planning.instance.currentProgramme.removeObserver(isProgrammeUpdatedObserver) - } - companion object { @JvmStatic fun newInstance(day: String) = diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeFragment.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeFragment.kt index 2be6c49..d6c158b 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeFragment.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeFragment.kt @@ -10,9 +10,9 @@ 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.planning.Planning import fr.forum_thalie.tsumugi.ui.APagerAdapter import fr.forum_thalie.tsumugi.weekdays -import fr.forum_thalie.tsumugi.weekdaysSundayFirst import java.util.* class ProgrammeFragment : Fragment() { @@ -36,7 +36,7 @@ class ProgrammeFragment : Fragment() { } viewPager.adapter = adapter - val todaySundayFirst = Calendar.getInstance(TimeZone.getTimeZone("GMT+1")).get(Calendar.DAY_OF_WEEK) - 1 + val todaySundayFirst = Calendar.getInstance(Planning.instance.timeZone).get(Calendar.DAY_OF_WEEK) - 1 viewPager.currentItem = (todaySundayFirst - 1)%7 val tabLayout : TabLayout = root.findViewById(R.id.dayTabLayout) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e41b508..63d4fe8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -43,11 +43,12 @@ Disable https://tsumugi.forum-thalie.fr/ https://tsumugi.forum-thalie.fr/?feed=rss2 - ADD SOME URL HERE... + ADD SOME URL HERE Select at least one day No alarm set Next alarm: Last played Programme + Programme régulier From ca26ff08e551e83b06335af6ceb0dce694e338d8 Mon Sep 17 00:00:00 2001 From: yattoz <12408848+yattoz@users.noreply.github.com> Date: Fri, 20 Dec 2019 09:25:50 +0100 Subject: [PATCH 10/14] refactored constructor to use factory pattern (should fix a crash) --- .../tsumugi/ui/programme/ProgrammeDayFragment.kt | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt index 2ae694d..2bab5ff 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt @@ -12,14 +12,15 @@ import fr.forum_thalie.tsumugi.R import fr.forum_thalie.tsumugi.planning.Planning import fr.forum_thalie.tsumugi.planning.Programme import fr.forum_thalie.tsumugi.weekdays -import kotlinx.android.synthetic.main.fragment_programme.* -class ProgrammeDayFragment(private val day: String) : Fragment() { + +class ProgrammeDayFragment : Fragment() { private lateinit var recyclerView: RecyclerView private lateinit var viewAdapter: RecyclerView.Adapter<*> private lateinit var viewManager: RecyclerView.LayoutManager private val programmeOfTheDay: ArrayList = ArrayList() + private val day = arguments?.getString("day") ?: weekdays.first() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -56,9 +57,15 @@ class ProgrammeDayFragment(private val day: String) : Fragment() { return root } + companion object { @JvmStatic - fun newInstance(day: String) = - ProgrammeDayFragment(day) + fun newInstance(day: String): ProgrammeDayFragment { + val args = Bundle() + args.putString("day", day) + val f = ProgrammeDayFragment() + f.arguments = args + return f + } } } \ No newline at end of file From b063d969776cd96185881f0a92843ba4c3d664c8 Mon Sep 17 00:00:00 2001 From: yattoz <12408848+yattoz@users.noreply.github.com> Date: Fri, 20 Dec 2019 09:26:13 +0100 Subject: [PATCH 11/14] changed some layout info (size/orga) --- app/src/main/res/layout/fragment_nowplaying.xml | 7 ++++--- app/src/main/res/layout/programme_view.xml | 5 +++-- app/src/main/res/layout/song_view.xml | 4 ++-- app/src/main/res/values/strings.xml | 4 ++-- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/layout/fragment_nowplaying.xml b/app/src/main/res/layout/fragment_nowplaying.xml index 2336dc4..8e0c92a 100644 --- a/app/src/main/res/layout/fragment_nowplaying.xml +++ b/app/src/main/res/layout/fragment_nowplaying.xml @@ -30,18 +30,19 @@ + + app:layout_constraintGuide_percent="0.95" /> + android:layout_marginStart="12dp" + android:layout_marginEnd="12dp"> Songs Chat News - Programme + Planning Now playing: %1$s @@ -48,7 +48,7 @@ No alarm set Next alarm: Last played - Programme + Planning Programme régulier From 81f53966f0f0409b8f75a5beebb66dd8835fed31 Mon Sep 17 00:00:00 2001 From: yattoz <12408848+yattoz@users.noreply.github.com> Date: Fri, 20 Dec 2019 17:48:54 +0100 Subject: [PATCH 12/14] put day for ProgrammeDayFragment in a ViewModel - should fix crash --- .../tsumugi/ui/programme/ProgrammeDayFragment.kt | 12 ++++++++---- .../tsumugi/ui/programme/ProgrammeDayViewModel.kt | 8 ++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayViewModel.kt diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt index 2bab5ff..98d12dd 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt @@ -6,6 +6,7 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import fr.forum_thalie.tsumugi.R @@ -20,21 +21,24 @@ class ProgrammeDayFragment : Fragment() { private lateinit var viewAdapter: RecyclerView.Adapter<*> private lateinit var viewManager: RecyclerView.LayoutManager private val programmeOfTheDay: ArrayList = ArrayList() - private val day = arguments?.getString("day") ?: weekdays.first() + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment + val viewModel: ProgrammeDayViewModel = ViewModelProviders.of(this).get(ProgrammeDayViewModel::class.java) + viewModel.day = arguments?.getString("day") ?: "" + val root = inflater.inflate(R.layout.fragment_programme_day, container, false) Planning.instance.programmes.forEach { - if (it.isThisDay(day = weekdays.indexOf(day))) + if (it.isThisDay(day = weekdays.indexOf(viewModel.day))) programmeOfTheDay.add(it) } viewManager = LinearLayoutManager(context) viewAdapter = - ProgrammeAdapter(programmeOfTheDay, day) + ProgrammeAdapter(programmeOfTheDay, viewModel.day) 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 @@ -45,7 +49,7 @@ class ProgrammeDayFragment : Fragment() { Planning.instance.currentProgramme.observe(viewLifecycleOwner, Observer { programmeOfTheDay.clear() Planning.instance.programmes.forEach { - if (it.isThisDay(day = weekdays.indexOf(day))) + if (it.isThisDay(day = weekdays.indexOf(viewModel.day))) programmeOfTheDay.add(it) } viewAdapter.notifyDataSetChanged() diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayViewModel.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayViewModel.kt new file mode 100644 index 0000000..d691b01 --- /dev/null +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayViewModel.kt @@ -0,0 +1,8 @@ +package fr.forum_thalie.tsumugi.ui.programme + +import androidx.lifecycle.ViewModel + +class ProgrammeDayViewModel: ViewModel() { + var day: String = "" + +} \ No newline at end of file From 691edeee17f4e0daee88fbaab48ecae1bf2eff7c Mon Sep 17 00:00:00 2001 From: yattoz <12408848+yattoz@users.noreply.github.com> Date: Fri, 20 Dec 2019 19:06:58 +0100 Subject: [PATCH 13/14] adjustments for layout. Use accent color to color current programme. --- .../fr/forum_thalie/tsumugi/MainActivity.kt | 3 +- .../java/fr/forum_thalie/tsumugi/Values.kt | 2 +- .../tsumugi/ui/programme/ProgrammeAdapter.kt | 24 +++--- app/src/main/res/layout/programme_view.xml | 80 ++++++++++++------- app/src/main/res/layout/song_view.xml | 4 +- app/src/main/res/values/colors.xml | 10 +-- 6 files changed, 77 insertions(+), 46 deletions(-) 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 e1b2369..511364c 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/MainActivity.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/MainActivity.kt @@ -122,11 +122,12 @@ class MainActivity : BaseActivity() { RadioAlarm.instance.setNextAlarm(c = this) // this checks the preferenceStore before actually setting an alarm, don't worry. // initialize programmatically accessible colors - colorBlue = ResourcesCompat.getColor(resources, R.color.bluereq, null) + colorBlue = ResourcesCompat.getColor(resources, R.color.rblue, null) colorWhited = ResourcesCompat.getColor(resources, R.color.whited, null) colorGreenList = (ResourcesCompat.getColorStateList(resources, R.color.button_green, null)) colorRedList = (ResourcesCompat.getColorStateList(resources, R.color.button_red, null)) colorGreenListCompat = (ResourcesCompat.getColorStateList(resources, R.color.button_green_compat, null)) + colorAccent = (ResourcesCompat.getColor(resources, R.color.colorAccent, null)) // Post-UI Launch if (PlayerStore.instance.isInitialized) diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/Values.kt b/app/src/main/java/fr/forum_thalie/tsumugi/Values.kt index 912869d..85e49de 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/Values.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/Values.kt @@ -21,8 +21,8 @@ val weekdaysSundayFirst = ArrayList().apply { var colorBlue: Int = 0 var colorWhited: Int = 0 +var colorAccent : Int = 0 var colorGreenList: ColorStateList? = ColorStateList.valueOf(0) var colorRedList: ColorStateList? = ColorStateList.valueOf(0) var colorGreenListCompat : ColorStateList? = ColorStateList.valueOf(0) - lateinit var preferenceStore : SharedPreferences \ No newline at end of file diff --git a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeAdapter.kt b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeAdapter.kt index 8fddfdd..6742d87 100644 --- a/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeAdapter.kt +++ b/app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeAdapter.kt @@ -1,17 +1,16 @@ package fr.forum_thalie.tsumugi.ui.programme import android.annotation.SuppressLint +import android.util.TypedValue import android.view.LayoutInflater import android.view.ViewGroup import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.widget.TextViewCompat import androidx.recyclerview.widget.RecyclerView -import fr.forum_thalie.tsumugi.R -import fr.forum_thalie.tsumugi.colorBlue +import fr.forum_thalie.tsumugi.* import fr.forum_thalie.tsumugi.planning.Planning import fr.forum_thalie.tsumugi.planning.Programme -import fr.forum_thalie.tsumugi.weekdays -import fr.forum_thalie.tsumugi.weekdaysSundayFirst import java.util.* import kotlin.collections.ArrayList @@ -46,12 +45,17 @@ class ProgrammeAdapter(private val dataSet: ArrayList, private val da programmeName.text = dataSet[position].title programmeEnd.text = dataSet[position].end() - if (dataSet[position].isCurrent() && (Calendar.getInstance(Planning.instance.timeZone).get(Calendar.DAY_OF_WEEK) - 1 == weekdaysSundayFirst.indexOf(day))) - { - programmeStart.setTextColor(colorBlue) - programmeEnd.setTextColor(colorBlue) - programmeName.setTextColor(colorBlue) - } + val color = if (dataSet[position].isCurrent() && (Calendar.getInstance(Planning.instance.timeZone).get(Calendar.DAY_OF_WEEK) - 1 == weekdaysSundayFirst.indexOf(day))) + colorAccent + else + colorWhited + + programmeStart.setTextColor(color) + programmeEnd.setTextColor(color) + programmeName.setTextColor(color) + + //TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration( + // programmeName,8, 16, 2, TypedValue.COMPLEX_UNIT_SP) } // Return the size of your dataset (invoked by the layout manager) diff --git a/app/src/main/res/layout/programme_view.xml b/app/src/main/res/layout/programme_view.xml index 5719834..34dab2b 100644 --- a/app/src/main/res/layout/programme_view.xml +++ b/app/src/main/res/layout/programme_view.xml @@ -4,49 +4,75 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:layout_marginStart="12dp" - android:layout_marginEnd="12dp"> + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" + app:layout_constraintVertical_chainStyle="packed" + > - + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + app:layout_constraintVertical_chainStyle="packed" + > + + + + + + - - + + diff --git a/app/src/main/res/layout/song_view.xml b/app/src/main/res/layout/song_view.xml index 71d41e1..4d29656 100644 --- a/app/src/main/res/layout/song_view.xml +++ b/app/src/main/res/layout/song_view.xml @@ -5,8 +5,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="8dp" - android:layout_marginStart="12dp" - android:layout_marginEnd="12dp" + android:layout_marginStart="8dp" + android:layout_marginEnd="8dp" > #999999 #999999 #7F7F7F - #3A7AAF + #4FC3F7 #527a8e #527a8e #5cb85c @@ -19,12 +19,12 @@ #a15755 #585858 - #DF4C3A - #3A7AAF + #f58b01 + #4FC3F7 #585858 - #3A7AAF - #DF4C3A + #4FC3F7 + #f58b01 #FFFFFF #000000 From 133d4849cf08d653435d79a29bc2682ccaa76305 Mon Sep 17 00:00:00 2001 From: yattoz <12408848+yattoz@users.noreply.github.com> Date: Fri, 20 Dec 2019 19:19:56 +0100 Subject: [PATCH 14/14] changed character for no program --- app/src/main/java/fr/forum_thalie/tsumugi/planning/Planning.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1d5d148..e9300c3 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 @@ -26,7 +26,7 @@ class Planning { if (it.isCurrent()) return it.title } - return regularProgramme ?: "-" + return regularProgramme ?: "—" } fun checkProgramme()