Skip to content

Commit

Permalink
Removed RxJava from Tsumego
Browse files Browse the repository at this point in the history
  • Loading branch information
acristescu committed Oct 17, 2023
1 parent 2b7d826 commit eba718e
Show file tree
Hide file tree
Showing 11 changed files with 433 additions and 497 deletions.
9 changes: 0 additions & 9 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,6 @@ android {
freeCompilerArgs += "-opt-in=androidx.compose.foundation.ExperimentalFoundationApi"
freeCompilerArgs += "-opt-in=androidx.compose.ui.ExperimentalComposeUiApi"
freeCompilerArgs += '-Xjvm-default=all'
freeCompilerArgs += [
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=" +
project.buildDir.absolutePath + "/compose_metrics",
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination="+
project.buildDir.absolutePath + "/compose_metrics",
]
}
}
kotlinOptions {
Expand Down Expand Up @@ -147,7 +139,6 @@ dependencies {
implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0'
implementation 'com.jakewharton.rxrelay2:rxrelay:2.1.1'
implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-rx2:1.7.3'

implementation "androidx.work:work-runtime-ktx:$work_manager_version"
implementation "androidx.work:work-rxjava2:$work_manager_version"
Expand Down
53 changes: 39 additions & 14 deletions app/src/main/java/io/zenandroid/onlinego/data/ogs/OGSRestAPI.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,35 @@ package io.zenandroid.onlinego.data.ogs

import io.reactivex.Completable
import io.reactivex.Single
import io.zenandroid.onlinego.data.model.ogs.*
import io.zenandroid.onlinego.data.model.ogs.Chat
import io.zenandroid.onlinego.data.model.ogs.CreateAccountRequest
import io.zenandroid.onlinego.data.model.ogs.Glicko2History
import io.zenandroid.onlinego.data.model.ogs.JosekiPosition
import io.zenandroid.onlinego.data.model.ogs.OGSChallenge
import io.zenandroid.onlinego.data.model.ogs.OGSChallengeRequest
import io.zenandroid.onlinego.data.model.ogs.OGSGame
import io.zenandroid.onlinego.data.model.ogs.OGSPlayer
import io.zenandroid.onlinego.data.model.ogs.OGSPlayerProfile
import io.zenandroid.onlinego.data.model.ogs.OGSPuzzle
import io.zenandroid.onlinego.data.model.ogs.OGSPuzzleCollection
import io.zenandroid.onlinego.data.model.ogs.OmniSearchResponse
import io.zenandroid.onlinego.data.model.ogs.Overview
import io.zenandroid.onlinego.data.model.ogs.PagedResult
import io.zenandroid.onlinego.data.model.ogs.PasswordBody
import io.zenandroid.onlinego.data.model.ogs.PuzzleRating
import io.zenandroid.onlinego.data.model.ogs.PuzzleSolution
import io.zenandroid.onlinego.data.model.ogs.UIConfig
import okhttp3.ResponseBody
import retrofit2.Response
import retrofit2.http.*
import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.GET
import retrofit2.http.HTTP
import retrofit2.http.Headers
import retrofit2.http.POST
import retrofit2.http.PUT
import retrofit2.http.Path
import retrofit2.http.Query

/**
* Created by alex on 02/11/2017.
Expand Down Expand Up @@ -100,40 +125,40 @@ interface OGSRestAPI {
fun getMessages(@Path("last_message_id") lastMessageId: String): Single<List<Chat>>

@GET("api/v1/puzzles/collections?ordering=-rating,-rating_count")
fun getPuzzleCollections(
suspend fun getPuzzleCollections(
@Query("page_size") pageSize: Int = 1000,
@Query("puzzle_count__gt") minimumCount: Int,
@Query("name__istartswith") namePrefix: String,
@Query("page") page: Int = 1): Single<PagedResult<OGSPuzzleCollection>>
@Query("page") page: Int = 1): PagedResult<OGSPuzzleCollection>

@GET("api/v1/puzzles/collections/{collection_id}")
fun getPuzzleCollection(@Path("collection_id") collectionId: Long): Single<OGSPuzzleCollection>
suspend fun getPuzzleCollection(@Path("collection_id") collectionId: Long): OGSPuzzleCollection

@GET("api/v1/puzzles/collections/{collection_id}/puzzles")
fun getPuzzleCollectionContents(@Path("collection_id") collectionId: Long): Single<List<OGSPuzzle>>
suspend fun getPuzzleCollectionContents(@Path("collection_id") collectionId: Long): List<OGSPuzzle>

@GET("api/v1/puzzles/{puzzle_id}")
fun getPuzzle(@Path("puzzle_id") puzzleId: Long): Single<OGSPuzzle>
suspend fun getPuzzle(@Path("puzzle_id") puzzleId: Long): OGSPuzzle

@GET("api/v1/puzzles/{puzzle_id}/solutions")
fun getPuzzleSolutions(
suspend fun getPuzzleSolutions(
@Path("puzzle_id") puzzleId: Long,
@Query("player_id") playerId: Long,
@Query("page_size") pageSize: Int = 1000,
@Query("page") page: Int = 1): Single<PagedResult<PuzzleSolution>>
@Query("page") page: Int = 1): PagedResult<PuzzleSolution>

@GET("api/v1/puzzles/{puzzle_id}/rate")
fun getPuzzleRating(@Path("puzzle_id") puzzleId: Long): Single<PuzzleRating>
suspend fun getPuzzleRating(@Path("puzzle_id") puzzleId: Long): PuzzleRating

@POST("api/v1/puzzles/{puzzle_id}/solutions")
fun markPuzzleSolved(
suspend fun markPuzzleSolved(
@Path("puzzle_id") puzzleId: Long,
@Body request: PuzzleSolution): Completable
@Body request: PuzzleSolution)

@PUT("api/v1/puzzles/{puzzle_id}/rate")
fun ratePuzzle(
suspend fun ratePuzzle(
@Path("puzzle_id") puzzleId: Long,
@Body request: PuzzleRating): Completable
@Body request: PuzzleRating)

@HTTP(method = "DELETE", path="api/v1/players/{player_id}", hasBody = true)
suspend fun deleteAccount(@Path("player_id") playerId: Long, @Body body: PasswordBody)
Expand Down
105 changes: 43 additions & 62 deletions app/src/main/java/io/zenandroid/onlinego/data/ogs/OGSRestService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,34 @@ package io.zenandroid.onlinego.data.ogs

import android.preference.PreferenceManager
import com.squareup.moshi.Moshi
import io.reactivex.BackpressureStrategy
import io.reactivex.Completable
import io.reactivex.Flowable
import io.reactivex.Observable
import io.reactivex.Single
import io.zenandroid.onlinego.OnlineGoApplication
import io.zenandroid.onlinego.data.model.local.Puzzle
import io.zenandroid.onlinego.data.model.local.PuzzleCollection
import io.zenandroid.onlinego.data.model.ogs.ChallengeParams
import io.zenandroid.onlinego.data.model.ogs.CreateAccountRequest
import io.zenandroid.onlinego.data.model.ogs.Glicko2History
import io.zenandroid.onlinego.data.model.ogs.JosekiPosition
import io.zenandroid.onlinego.data.model.ogs.OGSChallenge
import io.zenandroid.onlinego.data.model.ogs.OGSChallengeRequest
import io.zenandroid.onlinego.data.model.ogs.OGSGame
import io.zenandroid.onlinego.data.model.ogs.OGSPlayer
import io.zenandroid.onlinego.data.model.ogs.PagedResult
import io.zenandroid.onlinego.data.model.ogs.PasswordBody
import io.zenandroid.onlinego.data.model.ogs.OGSPuzzle
import io.zenandroid.onlinego.data.model.ogs.OGSPuzzleCollection
import io.zenandroid.onlinego.data.model.ogs.PuzzleRating
import io.zenandroid.onlinego.data.model.ogs.PuzzleSolution
import io.zenandroid.onlinego.data.model.ogs.VersusStats
import io.zenandroid.onlinego.data.repositories.UserSessionRepository
import io.zenandroid.onlinego.data.model.ogs.ChallengeParams
import io.zenandroid.onlinego.utils.CountingIdlingResource
import io.zenandroid.onlinego.utils.microsToISODateTime
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map
import okhttp3.ResponseBody.Companion.toResponseBody
import retrofit2.HttpException
import retrofit2.Response
import java.util.Date
import java.util.concurrent.TimeUnit

private const val TAG = "OGSRestService"
private const val OGS_EBI = "OGS_EBI"
Expand Down Expand Up @@ -256,75 +253,59 @@ class OGSRestService(
return restApi.getPlayerFullProfileAsync(id).vs
}

fun getPuzzleCollections(minCount: Int? = null, namePrefix: String? = null): Flowable<List<PuzzleCollection>> {
fun getPuzzleCollections(minCount: Int? = null, namePrefix: String? = null): Flow<List<PuzzleCollection>> {
var page = 0

fun fetchPage(): Single<PagedResult<OGSPuzzleCollection>> = restApi.getPuzzleCollections(
minimumCount = minCount ?: 0,
namePrefix = namePrefix ?: "",
page = ++page
)

fun unfold(result: Single<PagedResult<OGSPuzzleCollection>>): Observable<List<OGSPuzzleCollection>> {
return result.toObservable().flatMap { pre ->
Observable.just(pre.results).let {
if (pre.next == null) {
it
} else {
val wait = Observable.timer(5, TimeUnit.SECONDS).take(1)
it.concatWith(wait.map { emptyList<OGSPuzzleCollection>() }.ignoreElements())
.concatWith(unfold(fetchPage()))
}
}
}
}

return unfold(fetchPage()).toFlowable(BackpressureStrategy.BUFFER)
.map { it.map(PuzzleCollection::fromOGSPuzzleCollection) }
return flow {
do {
val result = restApi.getPuzzleCollections(
minimumCount = minCount ?: 0,
namePrefix = namePrefix ?: "",
page = ++page
)
emit(result.results)
delay(5000)
} while (result.next != null)
}.map { it.map (PuzzleCollection::fromOGSPuzzleCollection) }
}

fun getPuzzleCollection(id: Long): Single<PuzzleCollection> =
suspend fun getPuzzleCollection(id: Long): PuzzleCollection =
restApi.getPuzzleCollection(collectionId = id)
.map { PuzzleCollection.fromOGSPuzzleCollection(it) }
.let { PuzzleCollection.fromOGSPuzzleCollection(it) }

fun getPuzzleCollectionContents(id: Long): Single<List<Puzzle>> =
restApi.getPuzzleCollectionContents(collectionId = id)
.map { it.map(Puzzle::fromOGSPuzzle) }
suspend fun getPuzzleCollectionContents(id: Long): List<Puzzle> =
restApi.getPuzzleCollectionContents(collectionId = id)
.map(Puzzle::fromOGSPuzzle)

fun getPuzzle(id: Long): Single<Puzzle> =
suspend fun getPuzzle(id: Long): Puzzle =
restApi.getPuzzle(puzzleId = id)
.map { Puzzle.fromOGSPuzzle(it) }

fun getPuzzleSolutions(id: Long): Single<List<PuzzleSolution>> {
var page = 0

fun fetchPage(): Single<PagedResult<PuzzleSolution>> = restApi.getPuzzleSolutions(
puzzleId = id,
playerId = userSessionRepository.userId!!,
page = ++page
.let { Puzzle.fromOGSPuzzle(it) }

// TODO: This causes HTTP 429s, so we need to throttle it somehow
suspend fun getPuzzleSolutions(id: Long): List<PuzzleSolution> {
var page = 0

val list = mutableListOf<PuzzleSolution>()
do {
val result = restApi.getPuzzleSolutions(
puzzleId = id,
playerId = userSessionRepository.userId!!,
page = ++page
)

fun unfold(result: Single<PagedResult<PuzzleSolution>>): Single<List<PuzzleSolution>> {
return result.flatMap { pre ->
if (pre.next == null) {
Single.just(pre.results)
} else {
unfold(fetchPage()).map { pre.results.plus(it) }
}
}
}

return unfold(fetchPage())
list.addAll(result.results)
delay(1000)
} while (result.next != null)
return list
}

fun getPuzzleRating(id: Long): Single<PuzzleRating> =
suspend fun getPuzzleRating(id: Long): PuzzleRating =
restApi.getPuzzleRating(puzzleId = id)

fun markPuzzleSolved(id: Long, solution: PuzzleSolution): Completable =
suspend fun markPuzzleSolved(id: Long, solution: PuzzleSolution) =
restApi.markPuzzleSolved(puzzleId = id, request = solution)

fun ratePuzzle(id: Long, rating: Int): Completable =
restApi.ratePuzzle(puzzleId = id, request = PuzzleRating(rating = rating))
suspend fun ratePuzzle(id: Long, rating: PuzzleRating) =
restApi.ratePuzzle(puzzleId = id, request = rating)

suspend fun deleteMyAccount(password: String) {
return restApi.deleteAccount(
Expand Down
Loading

0 comments on commit eba718e

Please sign in to comment.