Quellcode durchsuchen

refined recyclers. Opens on current day (yay!)

yattoz vor 4 Jahren
Ursprung
Commit
a4669716b0

+ 2 - 1
app/src/main/assets/planning_example.json Datei anzeigen

61
       "hour_end": "06:00"
61
       "hour_end": "06:00"
62
     }
62
     }
63
   ],
63
   ],
64
-  "regular_programme" : "Programmation habituelle"
64
+  "regular_programme" : "Programmation habituelle",
65
+  "timezone": "GMT+1"
65
 }
66
 }

+ 13 - 0
app/src/main/java/fr/forum_thalie/tsumugi/planning/Programme.kt Datei anzeigen

7
 import kotlin.collections.ArrayList
7
 import kotlin.collections.ArrayList
8
 
8
 
9
 class Programme (val title: String, private val periodicity: Int, private val hourBegin: Int, private val hourEnd: Int) {
9
 class Programme (val title: String, private val periodicity: Int, private val hourBegin: Int, private val hourEnd: Int) {
10
+
11
+    fun isThisDay(day: Int): Boolean {
12
+
13
+        // 0 (Monday) to 5 (Saturday) + 6 (Sunday)
14
+
15
+        // this translates to "true" when:
16
+        // - the currentDay is flagged in the "periodicity" bit array
17
+        // OR
18
+        // - Yesterday is flagged in the "periodicity" bit array AND the program does span over 2 days (night programs).
19
+        // We'll check a after this whether the current hour is within the span.
20
+        return (((0b1000000 shr day) and (periodicity)) != 0)
21
+    }
22
+
10
     fun isCurrent(): Boolean {
23
     fun isCurrent(): Boolean {
11
         val now = Calendar.getInstance(TimeZone.getTimeZone("GMT+1"))
24
         val now = Calendar.getInstance(TimeZone.getTimeZone("GMT+1"))
12
         val currentDay =
25
         val currentDay =

+ 14 - 4
app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeAdapter.kt Datei anzeigen

7
 import androidx.constraintlayout.widget.ConstraintLayout
7
 import androidx.constraintlayout.widget.ConstraintLayout
8
 import androidx.recyclerview.widget.RecyclerView
8
 import androidx.recyclerview.widget.RecyclerView
9
 import fr.forum_thalie.tsumugi.R
9
 import fr.forum_thalie.tsumugi.R
10
+import fr.forum_thalie.tsumugi.colorBlue
10
 import fr.forum_thalie.tsumugi.planning.Programme
11
 import fr.forum_thalie.tsumugi.planning.Programme
12
+import fr.forum_thalie.tsumugi.weekdays
13
+import fr.forum_thalie.tsumugi.weekdaysSundayFirst
14
+import java.util.*
15
+import kotlin.collections.ArrayList
11
 
16
 
12
-class ProgrammeAdapter(private val dataSet: ArrayList<Programme>
17
+class ProgrammeAdapter(private val dataSet: ArrayList<Programme>, private val day: String
13
     /*,
18
     /*,
14
     context: Context,
19
     context: Context,
15
     resource: Int,
20
     resource: Int,
16
-    objects: Array<out Song>*/
21
+    objects: ArrayList<Programme>*/
17
 ) : RecyclerView.Adapter<ProgrammeAdapter.MyViewHolder>() /*ArrayAdapter<Song>(context, resource, objects)*/ {
22
 ) : RecyclerView.Adapter<ProgrammeAdapter.MyViewHolder>() /*ArrayAdapter<Song>(context, resource, objects)*/ {
18
 
23
 
19
     class MyViewHolder(view: ConstraintLayout) : RecyclerView.ViewHolder(view)
24
     class MyViewHolder(view: ConstraintLayout) : RecyclerView.ViewHolder(view)
35
         val programmeStart = holder.itemView.findViewById<TextView>(R.id.programme_start)
40
         val programmeStart = holder.itemView.findViewById<TextView>(R.id.programme_start)
36
         val programmeEnd = holder.itemView.findViewById<TextView>(R.id.programme_end)
41
         val programmeEnd = holder.itemView.findViewById<TextView>(R.id.programme_end)
37
         val programmeName = holder.itemView.findViewById<TextView>(R.id.programme_name)
42
         val programmeName = holder.itemView.findViewById<TextView>(R.id.programme_name)
38
-        val programmeDays = holder.itemView.findViewById<TextView>(R.id.programme_days)
39
 
43
 
40
         programmeStart.text = dataSet[position].begin()
44
         programmeStart.text = dataSet[position].begin()
41
         programmeName.text = dataSet[position].title
45
         programmeName.text = dataSet[position].title
42
         programmeEnd.text = dataSet[position].end()
46
         programmeEnd.text = dataSet[position].end()
43
-        programmeDays.text = dataSet[position].days()
47
+
48
+        if (dataSet[position].isCurrent() && (Calendar.getInstance(TimeZone.getTimeZone("GMT+1")).get(Calendar.DAY_OF_WEEK) - 1 == weekdaysSundayFirst.indexOf(day)))
49
+        {
50
+            programmeStart.setTextColor(colorBlue)
51
+            programmeEnd.setTextColor(colorBlue)
52
+            programmeName.setTextColor(colorBlue)
53
+        }
44
     }
54
     }
45
 
55
 
46
     // Return the size of your dataset (invoked by the layout manager)
56
     // Return the size of your dataset (invoked by the layout manager)

+ 18 - 5
app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeDayFragment.kt Datei anzeigen

10
 import androidx.recyclerview.widget.RecyclerView
10
 import androidx.recyclerview.widget.RecyclerView
11
 import fr.forum_thalie.tsumugi.R
11
 import fr.forum_thalie.tsumugi.R
12
 import fr.forum_thalie.tsumugi.planning.Planning
12
 import fr.forum_thalie.tsumugi.planning.Planning
13
+import fr.forum_thalie.tsumugi.planning.Programme
14
+import fr.forum_thalie.tsumugi.weekdays
15
+import kotlinx.android.synthetic.main.fragment_programme.*
13
 
16
 
14
-class ProgrammeDayFragment(day: String) : Fragment() {
17
+class ProgrammeDayFragment(private val day: String) : Fragment() {
15
 
18
 
16
     private lateinit var recyclerView: RecyclerView
19
     private lateinit var recyclerView: RecyclerView
17
     private lateinit var viewAdapter: RecyclerView.Adapter<*>
20
     private lateinit var viewAdapter: RecyclerView.Adapter<*>
18
     private lateinit var viewManager: RecyclerView.LayoutManager
21
     private lateinit var viewManager: RecyclerView.LayoutManager
22
+    private val programmeOfTheDay: ArrayList<Programme> = ArrayList()
19
 
23
 
20
     override fun onCreateView(
24
     override fun onCreateView(
21
         inflater: LayoutInflater, container: ViewGroup?,
25
         inflater: LayoutInflater, container: ViewGroup?,
23
     ): View? {
27
     ): View? {
24
         // Inflate the layout for this fragment
28
         // Inflate the layout for this fragment
25
         val root = inflater.inflate(R.layout.fragment_programme_day, container, false)
29
         val root = inflater.inflate(R.layout.fragment_programme_day, container, false)
30
+        Planning.instance.programmes.forEach {
31
+            if (it.isThisDay(day = weekdays.indexOf(day)))
32
+                programmeOfTheDay.add(it)
33
+        }
26
         viewManager = LinearLayoutManager(context)
34
         viewManager = LinearLayoutManager(context)
27
         viewAdapter =
35
         viewAdapter =
28
-            ProgrammeAdapter(Planning.instance.programmes)
36
+            ProgrammeAdapter(programmeOfTheDay, day)
29
         recyclerView = root.findViewById<RecyclerView>(R.id.programme_recycler).apply {
37
         recyclerView = root.findViewById<RecyclerView>(R.id.programme_recycler).apply {
30
             // use this setting to improve performance if you know that changes
38
             // use this setting to improve performance if you know that changes
31
             // in content do not change the layout size of the RecyclerView
39
             // in content do not change the layout size of the RecyclerView
33
             layoutManager = viewManager
41
             layoutManager = viewManager
34
             adapter = viewAdapter
42
             adapter = viewAdapter
35
         }
43
         }
36
-        Planning.instance.isProgrammeUpdated.observeForever(isProgrammeUpdatedObserver)
44
+        Planning.instance.currentProgramme.observeForever(isProgrammeUpdatedObserver)
37
         return root
45
         return root
38
     }
46
     }
39
 
47
 
40
-    private val isProgrammeUpdatedObserver = Observer<Boolean> {
48
+    private val isProgrammeUpdatedObserver = Observer<String> {
49
+        programmeOfTheDay.clear()
50
+        Planning.instance.programmes.forEach {
51
+            if (it.isThisDay(day = weekdays.indexOf(day)))
52
+                programmeOfTheDay.add(it)
53
+        }
41
         viewAdapter.notifyDataSetChanged()
54
         viewAdapter.notifyDataSetChanged()
42
     }
55
     }
43
 
56
 
44
     override fun onDestroyView() {
57
     override fun onDestroyView() {
45
         super.onDestroyView()
58
         super.onDestroyView()
46
-        Planning.instance.isProgrammeUpdated.removeObserver(isProgrammeUpdatedObserver)
59
+        Planning.instance.currentProgramme.removeObserver(isProgrammeUpdatedObserver)
47
     }
60
     }
48
 
61
 
49
     companion object {
62
     companion object {

+ 4 - 0
app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeFragment.kt Datei anzeigen

12
 import fr.forum_thalie.tsumugi.R
12
 import fr.forum_thalie.tsumugi.R
13
 import fr.forum_thalie.tsumugi.ui.APagerAdapter
13
 import fr.forum_thalie.tsumugi.ui.APagerAdapter
14
 import fr.forum_thalie.tsumugi.weekdays
14
 import fr.forum_thalie.tsumugi.weekdays
15
+import fr.forum_thalie.tsumugi.weekdaysSundayFirst
16
+import java.util.*
15
 
17
 
16
 class ProgrammeFragment : Fragment() {
18
 class ProgrammeFragment : Fragment() {
17
 
19
 
34
         }
36
         }
35
 
37
 
36
         viewPager.adapter = adapter
38
         viewPager.adapter = adapter
39
+        val todaySundayFirst = Calendar.getInstance(TimeZone.getTimeZone("GMT+1")).get(Calendar.DAY_OF_WEEK) - 1
40
+        viewPager.currentItem = (todaySundayFirst - 1)%7
37
 
41
 
38
         val tabLayout : TabLayout = root.findViewById(R.id.dayTabLayout)
42
         val tabLayout : TabLayout = root.findViewById(R.id.dayTabLayout)
39
         tabLayout.setupWithViewPager(viewPager)
43
         tabLayout.setupWithViewPager(viewPager)

+ 4 - 1
app/src/main/res/layout/news_view.xml Datei anzeigen

4
     xmlns:app="http://schemas.android.com/apk/res-auto"
4
     xmlns:app="http://schemas.android.com/apk/res-auto"
5
     android:orientation="vertical" android:layout_width="match_parent"
5
     android:orientation="vertical" android:layout_width="match_parent"
6
     android:layout_height="wrap_content"
6
     android:layout_height="wrap_content"
7
-    android:layout_margin="16dp">
7
+    android:layout_marginTop="16dp"
8
+    android:layout_marginStart="16dp"
9
+    android:layout_marginEnd="16dp">
8
 
10
 
9
     <TextView
11
     <TextView
10
         android:id="@+id/news_title"
12
         android:id="@+id/news_title"
76
         android:id="@+id/divider"
78
         android:id="@+id/divider"
77
         android:layout_width="match_parent"
79
         android:layout_width="match_parent"
78
         android:layout_height="1dp"
80
         android:layout_height="1dp"
81
+        android:layout_marginTop="16dp"
79
         android:background="?android:attr/listDivider"
82
         android:background="?android:attr/listDivider"
80
         app:layout_constraintTop_toBottomOf="@id/news_text"
83
         app:layout_constraintTop_toBottomOf="@id/news_text"
81
         app:layout_constraintStart_toStartOf="parent"
84
         app:layout_constraintStart_toStartOf="parent"

+ 9 - 13
app/src/main/res/layout/programme_view.xml Datei anzeigen

4
     xmlns:app="http://schemas.android.com/apk/res-auto"
4
     xmlns:app="http://schemas.android.com/apk/res-auto"
5
     android:orientation="vertical" android:layout_width="match_parent"
5
     android:orientation="vertical" android:layout_width="match_parent"
6
     android:layout_height="wrap_content"
6
     android:layout_height="wrap_content"
7
-    android:layout_margin="8dp">
8
-
9
-    <TextView
10
-        android:id="@+id/programme_days"
11
-        android:layout_width="match_parent"
12
-        android:layout_height="wrap_content"
13
-        app:layout_constraintTop_toTopOf="parent"
14
-        app:layout_constraintStart_toStartOf="parent"
15
-        />
7
+    android:layout_marginTop="8dp"
8
+    android:layout_marginStart="16dp"
9
+    android:layout_marginEnd="16dp">
16
 
10
 
17
     <TextView
11
     <TextView
18
         android:id="@+id/programme_start"
12
         android:id="@+id/programme_start"
19
         android:layout_width="wrap_content"
13
         android:layout_width="wrap_content"
20
         android:layout_height="wrap_content"
14
         android:layout_height="wrap_content"
21
-        app:layout_constraintTop_toBottomOf="@id/programme_days"
15
+        app:layout_constraintTop_toTopOf="parent"
22
         app:layout_constraintStart_toStartOf="parent"
16
         app:layout_constraintStart_toStartOf="parent"
23
         android:gravity="start"
17
         android:gravity="start"
24
         />
18
         />
26
     <TextView
20
     <TextView
27
         android:id="@+id/programme_name"
21
         android:id="@+id/programme_name"
28
         android:layout_width="0dp"
22
         android:layout_width="0dp"
29
-        android:layout_height="wrap_content"
23
+        android:layout_height="0dp"
30
         app:layout_constraintTop_toTopOf="@id/programme_start"
24
         app:layout_constraintTop_toTopOf="@id/programme_start"
25
+        app:layout_constraintBottom_toBottomOf="@id/programme_end"
31
         app:layout_constraintStart_toEndOf="@id/programme_start"
26
         app:layout_constraintStart_toEndOf="@id/programme_start"
32
         app:layout_constraintEnd_toEndOf="parent"
27
         app:layout_constraintEnd_toEndOf="parent"
33
-        android:gravity="end"
34
-        android:textAlignment="textEnd"
28
+        android:gravity="center"
29
+        android:textAlignment="center"
35
         />
30
         />
36
 
31
 
37
     <TextView
32
     <TextView
48
         android:id="@+id/divider"
43
         android:id="@+id/divider"
49
         android:layout_width="match_parent"
44
         android:layout_width="match_parent"
50
         android:layout_height="1dp"
45
         android:layout_height="1dp"
46
+        android:layout_marginTop="8dp"
51
         android:background="?android:attr/listDivider"
47
         android:background="?android:attr/listDivider"
52
         app:layout_constraintTop_toBottomOf="@id/programme_end"
48
         app:layout_constraintTop_toBottomOf="@id/programme_end"
53
         app:layout_constraintStart_toStartOf="parent"
49
         app:layout_constraintStart_toStartOf="parent"

+ 3 - 3
app/src/main/res/layout/song_view.xml Datei anzeigen

4
     android:orientation="vertical"
4
     android:orientation="vertical"
5
     android:layout_width="match_parent"
5
     android:layout_width="match_parent"
6
     android:layout_height="wrap_content"
6
     android:layout_height="wrap_content"
7
-    android:layout_marginStart="8dp"
8
-    android:layout_marginEnd="8dp"
7
+    android:layout_marginTop="8dp"
8
+    android:layout_marginStart="16dp"
9
+    android:layout_marginEnd="16dp"
9
     >
10
     >
10
 
11
 
11
     <TextView
12
     <TextView
17
         app:layout_constraintBottom_toTopOf="@id/divider"
18
         app:layout_constraintBottom_toTopOf="@id/divider"
18
         app:layout_constraintStart_toStartOf="parent"
19
         app:layout_constraintStart_toStartOf="parent"
19
         app:layout_constraintEnd_toEndOf="parent"
20
         app:layout_constraintEnd_toEndOf="parent"
20
-        android:layout_marginTop="8dp"
21
         />
21
         />
22
 
22
 
23
     <View
23
     <View