Skip to content

Commit 3534467

Browse files
authored
Merge pull request #98 from ricknout/live-match-notification
Live match notification
2 parents 7ecddf2 + 4b47256 commit 3534467

File tree

24 files changed

+476
-57
lines changed

24 files changed

+476
-57
lines changed

Diff for: app/src/main/java/dev/ricknout/rugbyranker/di/AppModule.kt

+7
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import dagger.hilt.components.SingletonComponent
1414
import dev.ricknout.rugbyranker.core.api.WorldRugbyService
1515
import dev.ricknout.rugbyranker.core.db.RankingDao
1616
import dev.ricknout.rugbyranker.db.RugbyRankerDatabase
17+
import dev.ricknout.rugbyranker.live.work.LiveMatchWorkManager
1718
import dev.ricknout.rugbyranker.match.data.MatchRepository
1819
import dev.ricknout.rugbyranker.news.data.NewsRepository
1920
import dev.ricknout.rugbyranker.prediction.data.PredictionRepository
@@ -143,6 +144,12 @@ class AppModule {
143144
return RankingWorkManager(workManager)
144145
}
145146

147+
@Provides
148+
@Singleton
149+
fun provideLiveMatchWorkManager(workManager: WorkManager): LiveMatchWorkManager {
150+
return LiveMatchWorkManager(workManager)
151+
}
152+
146153
companion object {
147154
private const val DATA_STORE_NAME = "rugby_ranker_data_store"
148155
}

Diff for: app/src/main/res/values/strings.xml

-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<resources>
33

4-
<string name="mens">Men\'s</string>
5-
<string name="womens">Women\'s</string>
64
<string name="info">Info</string>
75

86
</resources>

Diff for: art/icons.sketch

5.71 KB
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package dev.ricknout.rugbyranker.core.util
2+
3+
import java.util.concurrent.atomic.AtomicInteger
4+
5+
object IdUtils {
6+
7+
private val atomicInteger = AtomicInteger(1)
8+
9+
fun getID(): Int {
10+
return atomicInteger.incrementAndGet()
11+
}
12+
}

Diff for: core/src/main/res/drawable/ic_rugby_ranker_24dp.xml

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="24"
5+
android:viewportHeight="24">
6+
<path
7+
android:pathData="M8.726,17.6984L12.1962,22.7468C10.516,23.4783 8.8185,23.9187 7.2476,24L7.2478,17.6984L8.726,17.6984ZM17.2756,0C19.1935,0 20.816,0.5641 21.9896,1.6319L22.1442,1.7762L22.1442,1.7762L22.1808,1.8116C23.959,3.5914 24.4537,6.4246 23.5762,9.7917C22.7822,12.8375 20.9143,15.9983 18.4512,18.4637C17.3804,19.5354 16.185,20.4866 14.9316,21.2856L12.1988,17.3697L12.2223,17.2054C12.7072,17.0332 13.1687,16.7945 13.6067,16.4893C14.0447,16.1841 14.428,15.832 14.7565,15.4328C15.085,15.0337 15.3431,14.5877 15.5308,14.0946C15.7185,13.6016 15.8124,13.0734 15.8124,12.5099C15.8124,11.743 15.6794,11.0348 15.4135,10.3853C15.1476,9.7357 14.7682,9.1762 14.2755,8.7067C13.7827,8.2371 13.1922,7.8693 12.5039,7.6032C11.8729,7.3593 11.1763,7.2272 10.4139,7.2069L10.2043,7.2041L4.08,7.2041L4.0802,23.5954C3.2989,23.3235 2.6084,22.9215 2.027,22.3967L1.8559,22.2376L1.8559,22.2376L1.8168,22.1997L1.8168,22.1997C0.041,20.4222 -0.4536,17.589 0.424,14.222C1.2179,11.176 3.086,8.0152 5.5491,5.5498C8.9172,2.1784 13.5201,0 17.2756,0ZM10.2645,10.0858C10.6541,10.0858 11.0008,10.1521 11.3047,10.2847C11.6085,10.4174 11.8617,10.593 12.0643,10.8115C12.2669,11.03 12.4188,11.2797 12.5201,11.5606C12.6214,11.8415 12.672,12.1303 12.672,12.4268C12.672,13.0979 12.4422,13.6519 11.9825,14.0889C11.5516,14.4986 11.0076,14.7163 10.3507,14.7419L10.2178,14.7444L7.296,14.7444L7.296,10.0858L10.2645,10.0858Z"
8+
android:strokeWidth="1"
9+
android:fillColor="#000000"
10+
android:fillType="nonZero"
11+
android:strokeColor="#00000000"/>
12+
</vector>

Diff for: core/src/main/res/values/strings.xml

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
<string name="app_name">Rugby Ranker</string>
55
<string name="app_name_debug">Rugby Ranker Debug</string>
66

7+
<string name="mens">Men\'s</string>
8+
<string name="womens">Women\'s</string>
9+
710
<string name="today">Today</string>
811
<string name="retry">Retry</string>
912

Diff for: live/src/main/java/dev/ricknout/rugbyranker/live/ui/LiveMatchAdapter.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import dev.ricknout.rugbyranker.match.model.Match
99
import dev.ricknout.rugbyranker.match.ui.MatchViewHolder
1010

1111
class LiveMatchAdapter(
12-
private val onPredictClick: (match: Match) -> Unit
12+
private val onPredictClick: (match: Match) -> Unit,
13+
private val onPinClick: (match: Match) -> Unit
1314
) : ListAdapter<Match, MatchViewHolder>(DIFF_CALLBACK) {
1415

1516
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = MatchViewHolder(
@@ -18,7 +19,7 @@ class LiveMatchAdapter(
1819

1920
override fun onBindViewHolder(holder: MatchViewHolder, position: Int) {
2021
val match = getItem(position) ?: return
21-
holder.bind(match, onPredictClick)
22+
holder.bind(match, onPredictClick, onPinClick)
2223
}
2324

2425
companion object {

Diff for: live/src/main/java/dev/ricknout/rugbyranker/live/ui/LiveMatchFragment.kt

+9-4
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,15 @@ class LiveMatchFragment : Fragment() {
3434
}
3535
}
3636

37-
private val adapter = LiveMatchAdapter { match ->
38-
val prediction = match.toPrediction()
39-
liveMatchViewModel.predict(prediction)
40-
}
37+
private val adapter = LiveMatchAdapter(
38+
{ match ->
39+
val prediction = match.toPrediction()
40+
liveMatchViewModel.predict(prediction)
41+
},
42+
{ match ->
43+
liveMatchViewModel.pin(match.id)
44+
}
45+
)
4146

4247
private val coordinatorLayout: CoordinatorLayout
4348
get() = ActivityCompat.requireViewById(requireActivity(), R.id.coordinatorLayout)

Diff for: live/src/main/java/dev/ricknout/rugbyranker/live/ui/LiveMatchViewModel.kt

+7-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import androidx.lifecycle.viewModelScope
66
import dev.ricknout.rugbyranker.core.lifecycle.ScrollableViewModel
77
import dev.ricknout.rugbyranker.core.model.Sport
88
import dev.ricknout.rugbyranker.core.util.DateUtils
9+
import dev.ricknout.rugbyranker.live.work.LiveMatchWorkManager
910
import dev.ricknout.rugbyranker.match.data.MatchRepository
1011
import dev.ricknout.rugbyranker.match.model.Match
1112
import dev.ricknout.rugbyranker.match.model.Status
@@ -18,7 +19,8 @@ import kotlinx.coroutines.withContext
1819

1920
open class LiveMatchViewModel(
2021
private val sport: Sport,
21-
private val repository: MatchRepository
22+
private val repository: MatchRepository,
23+
private val workManager: LiveMatchWorkManager
2224
) : ScrollableViewModel() {
2325

2426
private val status = Status.LIVE
@@ -75,4 +77,8 @@ open class LiveMatchViewModel(
7577
fun resetPredict() {
7678
_predict.value = null
7779
}
80+
81+
fun pin(matchId: Long) {
82+
workManager.enqueueWork(sport, matchId)
83+
}
7884
}

Diff for: live/src/main/java/dev/ricknout/rugbyranker/live/ui/MensLiveMatchViewModel.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package dev.ricknout.rugbyranker.live.ui
22

33
import androidx.hilt.lifecycle.ViewModelInject
44
import dev.ricknout.rugbyranker.core.model.Sport
5+
import dev.ricknout.rugbyranker.live.work.LiveMatchWorkManager
56
import dev.ricknout.rugbyranker.match.data.MatchRepository
67

78
class MensLiveMatchViewModel @ViewModelInject constructor(
8-
repository: MatchRepository
9-
) : LiveMatchViewModel(Sport.MENS, repository)
9+
repository: MatchRepository,
10+
workManager: LiveMatchWorkManager
11+
) : LiveMatchViewModel(Sport.MENS, repository, workManager)

Diff for: live/src/main/java/dev/ricknout/rugbyranker/live/ui/WomensLiveMatchViewModel.kt

+4-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package dev.ricknout.rugbyranker.live.ui
22

33
import androidx.hilt.lifecycle.ViewModelInject
44
import dev.ricknout.rugbyranker.core.model.Sport
5+
import dev.ricknout.rugbyranker.live.work.LiveMatchWorkManager
56
import dev.ricknout.rugbyranker.match.data.MatchRepository
67

78
class WomensLiveMatchViewModel @ViewModelInject constructor(
8-
repository: MatchRepository
9-
) : LiveMatchViewModel(Sport.WOMENS, repository)
9+
repository: MatchRepository,
10+
workManager: LiveMatchWorkManager
11+
) : LiveMatchViewModel(Sport.WOMENS, repository, workManager)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package dev.ricknout.rugbyranker.live.work
2+
3+
import androidx.work.Data
4+
import androidx.work.ExistingWorkPolicy
5+
import androidx.work.OneTimeWorkRequestBuilder
6+
import androidx.work.WorkManager
7+
import dev.ricknout.rugbyranker.core.model.Sport
8+
9+
class LiveMatchWorkManager(private val workManager: WorkManager) {
10+
11+
fun enqueueWork(sport: Sport, matchId: Long) {
12+
val data = Data.Builder()
13+
.putLong(KEY_MATCH_ID, matchId)
14+
.build()
15+
val builder = when (sport) {
16+
Sport.MENS -> OneTimeWorkRequestBuilder<MensLiveMatchWorker>()
17+
Sport.WOMENS -> OneTimeWorkRequestBuilder<WomensLiveMatchWorker>()
18+
}
19+
val work = builder
20+
.setInputData(data)
21+
.build()
22+
val uniqueWorkName = getUniqueWorkName(sport, matchId)
23+
workManager.enqueueUniqueWork(uniqueWorkName, EXISTING_WORK_POLICY, work)
24+
}
25+
26+
private fun getUniqueWorkName(sport: Sport, matchId: Long) = when (sport) {
27+
Sport.MENS -> MensLiveMatchWorker.getUniqueWorkName(matchId)
28+
Sport.WOMENS -> WomensLiveMatchWorker.getUniqueWorkName(matchId)
29+
}
30+
31+
companion object {
32+
const val KEY_MATCH_ID = "match_id"
33+
private val EXISTING_WORK_POLICY = ExistingWorkPolicy.REPLACE
34+
}
35+
}

0 commit comments

Comments
 (0)