Преглед на файлове

refined recyclers. Opens on current day (yay!)

yattoz преди 4 години
родител
ревизия
a4669716b0

+ 2 - 1
app/src/main/assets/planning_example.json Целия файл

@@ -61,5 +61,6 @@
61 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 Целия файл

@@ -7,6 +7,19 @@ import java.util.*
7 7
 import kotlin.collections.ArrayList
8 8
 
9 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 23
     fun isCurrent(): Boolean {
11 24
         val now = Calendar.getInstance(TimeZone.getTimeZone("GMT+1"))
12 25
         val currentDay =

+ 14 - 4
app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeAdapter.kt Целия файл

@@ -7,13 +7,18 @@ import android.widget.TextView
7 7
 import androidx.constraintlayout.widget.ConstraintLayout
8 8
 import androidx.recyclerview.widget.RecyclerView
9 9
 import fr.forum_thalie.tsumugi.R
10
+import fr.forum_thalie.tsumugi.colorBlue
10 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 19
     context: Context,
15 20
     resource: Int,
16
-    objects: Array<out Song>*/
21
+    objects: ArrayList<Programme>*/
17 22
 ) : RecyclerView.Adapter<ProgrammeAdapter.MyViewHolder>() /*ArrayAdapter<Song>(context, resource, objects)*/ {
18 23
 
19 24
     class MyViewHolder(view: ConstraintLayout) : RecyclerView.ViewHolder(view)
@@ -35,12 +40,17 @@ class ProgrammeAdapter(private val dataSet: ArrayList<Programme>
35 40
         val programmeStart = holder.itemView.findViewById<TextView>(R.id.programme_start)
36 41
         val programmeEnd = holder.itemView.findViewById<TextView>(R.id.programme_end)
37 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 44
         programmeStart.text = dataSet[position].begin()
41 45
         programmeName.text = dataSet[position].title
42 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 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 Целия файл

@@ -10,12 +10,16 @@ import androidx.recyclerview.widget.LinearLayoutManager
10 10
 import androidx.recyclerview.widget.RecyclerView
11 11
 import fr.forum_thalie.tsumugi.R
12 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 19
     private lateinit var recyclerView: RecyclerView
17 20
     private lateinit var viewAdapter: RecyclerView.Adapter<*>
18 21
     private lateinit var viewManager: RecyclerView.LayoutManager
22
+    private val programmeOfTheDay: ArrayList<Programme> = ArrayList()
19 23
 
20 24
     override fun onCreateView(
21 25
         inflater: LayoutInflater, container: ViewGroup?,
@@ -23,9 +27,13 @@ class ProgrammeDayFragment(day: String) : Fragment() {
23 27
     ): View? {
24 28
         // Inflate the layout for this fragment
25 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 34
         viewManager = LinearLayoutManager(context)
27 35
         viewAdapter =
28
-            ProgrammeAdapter(Planning.instance.programmes)
36
+            ProgrammeAdapter(programmeOfTheDay, day)
29 37
         recyclerView = root.findViewById<RecyclerView>(R.id.programme_recycler).apply {
30 38
             // use this setting to improve performance if you know that changes
31 39
             // in content do not change the layout size of the RecyclerView
@@ -33,17 +41,22 @@ class ProgrammeDayFragment(day: String) : Fragment() {
33 41
             layoutManager = viewManager
34 42
             adapter = viewAdapter
35 43
         }
36
-        Planning.instance.isProgrammeUpdated.observeForever(isProgrammeUpdatedObserver)
44
+        Planning.instance.currentProgramme.observeForever(isProgrammeUpdatedObserver)
37 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 54
         viewAdapter.notifyDataSetChanged()
42 55
     }
43 56
 
44 57
     override fun onDestroyView() {
45 58
         super.onDestroyView()
46
-        Planning.instance.isProgrammeUpdated.removeObserver(isProgrammeUpdatedObserver)
59
+        Planning.instance.currentProgramme.removeObserver(isProgrammeUpdatedObserver)
47 60
     }
48 61
 
49 62
     companion object {

+ 4 - 0
app/src/main/java/fr/forum_thalie/tsumugi/ui/programme/ProgrammeFragment.kt Целия файл

@@ -12,6 +12,8 @@ import com.google.android.material.tabs.TabLayout
12 12
 import fr.forum_thalie.tsumugi.R
13 13
 import fr.forum_thalie.tsumugi.ui.APagerAdapter
14 14
 import fr.forum_thalie.tsumugi.weekdays
15
+import fr.forum_thalie.tsumugi.weekdaysSundayFirst
16
+import java.util.*
15 17
 
16 18
 class ProgrammeFragment : Fragment() {
17 19
 
@@ -34,6 +36,8 @@ class ProgrammeFragment : Fragment() {
34 36
         }
35 37
 
36 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 42
         val tabLayout : TabLayout = root.findViewById(R.id.dayTabLayout)
39 43
         tabLayout.setupWithViewPager(viewPager)

+ 4 - 1
app/src/main/res/layout/news_view.xml Целия файл

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

+ 9 - 13
app/src/main/res/layout/programme_view.xml Целия файл

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

+ 3 - 3
app/src/main/res/layout/song_view.xml Целия файл

@@ -4,8 +4,9 @@
4 4
     android:orientation="vertical"
5 5
     android:layout_width="match_parent"
6 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 12
     <TextView
@@ -17,7 +18,6 @@
17 18
         app:layout_constraintBottom_toTopOf="@id/divider"
18 19
         app:layout_constraintStart_toStartOf="parent"
19 20
         app:layout_constraintEnd_toEndOf="parent"
20
-        android:layout_marginTop="8dp"
21 21
         />
22 22
 
23 23
     <View