Skip to content

Commit

Permalink
Merge pull request #42 from Entreco/feature/41-quick-revanche
Browse files Browse the repository at this point in the history
Feature/41 quick revanche
  • Loading branch information
Entreco committed Feb 20, 2018
2 parents 434ba4d + d197855 commit 0c78476
Show file tree
Hide file tree
Showing 46 changed files with 934 additions and 112 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package nl.entreco.dartsscorecard.base

import android.support.v7.app.AlertDialog
import nl.entreco.dartsscorecard.R
import nl.entreco.domain.model.players.Team
import javax.inject.Inject

/**
* Created by entreco on 20/02/2018.
*/
class DialogHelper @Inject constructor(private val builder: AlertDialog.Builder) {

fun revanche(previousIndex: Int, teams: Array<Team>, select: (Int) -> Unit) {

if (onlyOneTeam(teams)) {
select(0)
} else if (moreThanOneTeam(teams)) {
var selectedIndex = previousIndex
builder
.setTitle(R.string.select_starting_team)
.setSingleChoiceItems(teams.map { it.toString() }.toTypedArray(), previousIndex, { _, which ->
selectedIndex = which
})
.setPositiveButton(android.R.string.ok, { dialog, _ ->
select(selectedIndex)
dialog.dismiss()
})
.setNegativeButton(R.string.cancel, { dialog, _ ->
dialog.dismiss()
})
.create()
.show()
}
}

private fun onlyOneTeam(teams: Array<Team>) = teams.size == 1
private fun moreThanOneTeam(teams: Array<Team>) = teams.size > 1
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,12 @@ class BetaModel(val feature: Feature) {
val goal = ObservableField<String>("$count / $total")
val progress = ObservableFloat(((feature.votes.toFloat() / feature.required.toFloat())))
val image = ObservableField<String>(feature.image)
val updates = ObservableField<String>(feature.updates)

private fun format(value: Int): String {
return when{
value < 1000 -> "$value"
else -> "${value / 1000}k"
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
package nl.entreco.dartsscorecard.di.play

import android.content.Context
import android.support.v7.app.AlertDialog
import dagger.Module
import dagger.Provides

/**
* Created by Entreco on 14/11/2017.
*/
@Module
class Play01Module
class Play01Module {

@Provides
@Play01Scope
fun provideAlertDialogBuilder(context: Context): AlertDialog.Builder {
return AlertDialog.Builder(context)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -77,14 +77,7 @@ class Play01Animator(binding: ActivityPlay01Binding) {
inputResume.animate().alpha(1 - slideOffset).translationX(slideOffset * -inputResume.width).setDuration(0).start()
}

override fun onStateChanged(bottomSheet: View, newState: Int) {
when (newState) {
BottomSheetBehavior.STATE_COLLAPSED -> {
inputResume.setOnClickListener { expand() }
}
else -> inputResume.setOnClickListener(null)
}
}
override fun onStateChanged(bottomSheet: View, newState: Int) {}
})

expand()
Expand Down Expand Up @@ -143,4 +136,4 @@ class Play01Animator(binding: ActivityPlay01Binding) {
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,17 @@ package nl.entreco.dartsscorecard.play

import android.databinding.ObservableBoolean
import nl.entreco.dartsscorecard.base.BaseViewModel
import nl.entreco.dartsscorecard.base.DialogHelper
import nl.entreco.dartsscorecard.play.score.GameLoadedNotifier
import nl.entreco.dartsscorecard.play.score.TeamScoreListener
import nl.entreco.dartsscorecard.play.score.UiCallback
import nl.entreco.domain.Logger
import nl.entreco.domain.model.*
import nl.entreco.domain.model.players.Player
import nl.entreco.domain.model.players.Team
import nl.entreco.domain.play.listeners.*
import nl.entreco.domain.play.revanche.RevancheRequest
import nl.entreco.domain.play.revanche.RevancheUsecase
import nl.entreco.domain.play.start.MarkGameAsFinishedRequest
import nl.entreco.domain.play.start.Play01Request
import nl.entreco.domain.play.start.Play01Response
Expand All @@ -22,12 +26,17 @@ import javax.inject.Inject
/**
* Created by Entreco on 11/11/2017.
*/
class Play01ViewModel @Inject constructor(private val playGameUsecase: Play01Usecase, private val gameListeners: Play01Listeners, private val logger: Logger) : BaseViewModel(), UiCallback, InputListener {
class Play01ViewModel @Inject constructor(private val playGameUsecase: Play01Usecase,
private val revancheUsecase: RevancheUsecase,
private val gameListeners: Play01Listeners,
private val dialogHelper: DialogHelper,
private val logger: Logger) : BaseViewModel(), UiCallback, InputListener {

val loading = ObservableBoolean(true)
val finished = ObservableBoolean(false)
private lateinit var game: Game
private lateinit var request: Play01Request
private lateinit var teams: Array<Team>
private lateinit var load: GameLoadedNotifier<ScoreSettings>
private lateinit var loaders: Array<GameLoadedNotifier<Play01Response>>

Expand All @@ -38,14 +47,33 @@ class Play01ViewModel @Inject constructor(private val playGameUsecase: Play01Use
this.playGameUsecase.loadGameAndStart(request,
{ response ->
this.game = response.game
load.onLoaded(response.teams, game.scores, response.settings, this)
loaders.forEach {
this.teams = response.teams
this.load.onLoaded(response.teams, game.scores, response.settings, this)
this.loaders.forEach {
it.onLoaded(response.teams, game.scores, response, null)
}
},
{ err -> logger.e("err: $err") })
}

override fun onRevanche() {
dialogHelper.revanche(request.startIndex, teams) { startIndex ->
val nextTeam = (startIndex) % teams.size
revancheUsecase.recreateGameAndStart(RevancheRequest(request, teams, nextTeam),
{ response ->
this.request = this.request.copy(gameId = response.game.id, startIndex = nextTeam)
this.game = response.game
this.teams = response.teams
this.load.onLoaded(response.teams, game.scores, response.settings, this)
this.loaders.forEach {
val playResponse = Play01Response(response.game, response.settings, response.teams, response.teamIds)
it.onLoaded(response.teams, game.scores, playResponse, null)
}
},
{ err -> logger.e("err: $err") })
}
}

fun registerListeners(scoreListener: ScoreListener, statListener: StatListener, specialEventListener: SpecialEventListener<*>, vararg playerListeners: PlayerListener) {
gameListeners.registerListeners(scoreListener, statListener, specialEventListener, *playerListeners)
}
Expand Down Expand Up @@ -116,4 +144,4 @@ class Play01ViewModel @Inject constructor(private val playGameUsecase: Play01Use
private fun notifyListeners(next: Next, turn: Turn, by: Player, scores: Array<Score>) {
gameListeners.onTurnSubmitted(next, turn, by, scores)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import android.databinding.ObservableInt
import android.widget.TextView
import nl.entreco.dartsscorecard.R
import nl.entreco.dartsscorecard.base.BaseViewModel
import nl.entreco.dartsscorecard.play.Play01Animator
import nl.entreco.domain.Analytics
import nl.entreco.domain.Logger
import nl.entreco.domain.model.*
Expand Down Expand Up @@ -70,6 +71,13 @@ class InputViewModel @Inject constructor(private val analytics: Analytics, priva
return true
}

fun onResume(animator: Play01Animator, listener: InputListener) {
animator.expand()
if (resumeDescription.get() == R.string.game_shot_and_match) {
listener.onRevanche()
}
}

fun entered(score: Int) {
val oldValue = scoredTxt.get()
if (oldValue.length < 3) {
Expand Down Expand Up @@ -204,4 +212,4 @@ class InputViewModel @Inject constructor(private val analytics: Analytics, priva
}

private fun gameIsFinished() = nextUp == null || nextUp?.state == State.MATCH
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package nl.entreco.dartsscorecard.play.score
import android.databinding.BindingAdapter
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.util.Log
import nl.entreco.domain.model.Score
import nl.entreco.domain.model.players.Team
import nl.entreco.domain.play.finish.GetFinishUsecase
Expand All @@ -18,11 +19,17 @@ abstract class ScoreBindings {
@BindingAdapter("adapter", "teams", "scores", "scoreSettings", "finishUsecase", "uiCallback", requireAll = true)
fun addTeams(recyclerView: RecyclerView, adapter: ScoreAdapter, teams: ArrayList<Team>, scores: ArrayList<Score>, scoreSettings: ScoreSettings, finishUsecase: GetFinishUsecase, uiCallback: UiCallback?) {

if (teams.size != scores.size) {
throw IllegalStateException("state mismatch, scores.size != teams.size! -> was this game already started?")
}

recyclerView.layoutManager = LinearLayoutManager(recyclerView.context)
recyclerView.itemAnimator = null
recyclerView.adapter = adapter
adapter.clear()

Log.w("TAG", "teams: $teams scores: $scores tsi:${scoreSettings.teamStartIndex}")

val listeners = mutableListOf<TeamScoreListener>()
teams.forEachIndexed { index, team ->
val vm = TeamScoreViewModel(team, scores[index], finishUsecase, starter = scoreSettings.teamStartIndex == index)
Expand All @@ -39,4 +46,4 @@ abstract class ScoreBindings {
recyclerView.smoothScrollToPosition(currentTeamIndex)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,5 +73,14 @@
android:contentDescription="@null"
android:src="@drawable/ic_entreco_black_bg" />

<TextView
style="@style/Launch.Powered"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingTop="0dp"
android:alpha="0.4"
android:text="@string/version" />

</LinearLayout>
</layout>
</layout>
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@
android:id="@+id/includeInput"
layout="@layout/play_01_input"
app:listener="@{viewModel}"
app:viewModel="@{inputViewModel}" />
app:viewModel="@{inputViewModel}"
app:animator="@{animator}"/>

</android.support.design.widget.CoordinatorLayout>
</layout>
</layout>
7 changes: 4 additions & 3 deletions android/DartsScorecard/app/src/main/res/layout/beta_view.xml
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@
android:id="@+id/progress"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/preview">
android:layout_alignBottom="@id/preview"
android:visibility="@{feature.votable ? View.VISIBLE: View.INVISIBLE}">

<View
android:layout_width="match_parent"
Expand Down Expand Up @@ -107,10 +108,10 @@
android:layout_width="match_parent"
android:layout_height="110dp"
android:background="@null"
android:elevation="6dp"
android:scaleType="fitEnd"
android:src="@drawable/ic_started"
android:elevation="6dp"
android:visibility="@{feature.votable ? View.GONE : View.VISIBLE}" />

</RelativeLayout>
</layout>
</layout>
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
android:background="@color/white">

<ImageView
Expand Down Expand Up @@ -103,8 +104,17 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/description"
android:visibility="@{viewModel.feature.votable ? View.VISIBLE : View.GONE}"
app:total="@{viewModel.feature.total}"
app:viewModel="@{donateViewModel}" />

<TextView
style="@style/Beta.Explain"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/description"
android:text="@{viewModel.feature.updates}"
android:visibility="@{viewModel.feature.votable ? View.GONE : View.VISIBLE}" />
</RelativeLayout>
</android.support.v4.widget.NestedScrollView>

Expand All @@ -127,4 +137,4 @@
android:visibility="@{donateViewModel.loading ? View.VISIBLE : View.GONE}" />

</android.support.design.widget.CoordinatorLayout>
</layout>
</layout>
51 changes: 26 additions & 25 deletions android/DartsScorecard/app/src/main/res/layout/include_resume.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
tools:showIn="@layout/play_01_input">

<data>

<variable
name="message"
type="Integer" />
Expand All @@ -14,33 +15,33 @@
android:layout_height="match_parent"
android:orientation="horizontal">

<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />

<ImageView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:contentDescription="@null"
android:src="@drawable/ic_arrow_start" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:contentDescription="@null"
android:src="@drawable/ic_arrow_start" />

<TextView
style="@style/Input.Resume"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@{safeUnbox(message)}" />
<TextView
style="@style/Input.Resume"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="@{safeUnbox(message)}" />

<ImageView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:rotation="180"
android:contentDescription="@null"
android:src="@drawable/ic_arrow_start" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:contentDescription="@null"
android:rotation="180"
android:src="@drawable/ic_arrow_start" />

<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
</layout>
</layout>
Loading

0 comments on commit 0c78476

Please sign in to comment.