Skip to content

Commit 28e2e22

Browse files
committed
Merge branch 'feat/rename-party' into 'master'
Feat/rename party Closes #31 See merge request fmasa/pv239-project!67
2 parents a856ac5 + 219a671 commit 28e2e22

File tree

12 files changed

+221
-11
lines changed

12 files changed

+221
-11
lines changed

app/src/main/java/cz/muni/fi/rpg/model/domain/party/Party.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
package cz.muni.fi.rpg.model.domain.party
2+
import android.os.Parcelable
23
import cz.muni.fi.rpg.model.domain.common.Ambitions
34
import cz.muni.fi.rpg.model.generateAccessCode
5+
import kotlinx.android.parcel.Parcelize
46
import java.util.*
57

8+
@Parcelize
69
data class Party(
710
val id: UUID,
8-
val name: String,
11+
private var name: String,
912
val gameMasterId: String?,
1013
val users: Set<String>,
1114
private var ambitions: Ambitions = Ambitions("", "")
12-
) {
15+
) : Parcelable {
1316
companion object {
1417
const val NAME_MAX_LENGTH = 50
1518

@@ -44,6 +47,14 @@ data class Party(
4447
this.ambitions = ambitions
4548
}
4649

50+
fun rename(name: String) {
51+
this.name = name
52+
}
53+
54+
fun getName(): String {
55+
return name;
56+
}
57+
4758
fun getAmbitions() = ambitions
4859

4960
fun getInvitation() = Invitation(id, name, accessCode)

app/src/main/java/cz/muni/fi/rpg/ui/character/CharacterFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class CharacterFragment(
4646
}
4747

4848
viewModel.party.right()
49-
.observe(viewLifecycleOwner) { setSubtitle(it.name) }
49+
.observe(viewLifecycleOwner) { setSubtitle(it.getName()) }
5050

5151
pager.adapter = StaticFragmentsViewPagerAdapter(
5252
this,
@@ -90,7 +90,7 @@ class CharacterFragment(
9090
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
9191
super.onCreateOptionsMenu(menu, inflater)
9292

93-
inflater.inflate(R.menu.character_menu, menu)
93+
inflater.inflate(R.menu.edit_menu, menu)
9494
}
9595

9696
override fun onOptionsItemSelected(item: MenuItem): Boolean {

app/src/main/java/cz/muni/fi/rpg/ui/gameMaster/GameMasterFragment.kt

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package cz.muni.fi.rpg.ui.gameMaster
22

33
import android.os.Bundle
4+
import android.view.Menu
5+
import android.view.MenuInflater
6+
import android.view.MenuItem
47
import android.view.View
8+
import android.widget.Toast
59
import androidx.lifecycle.observe
610
import androidx.navigation.fragment.findNavController
711
import androidx.navigation.fragment.navArgs
@@ -28,6 +32,8 @@ class GameMasterFragment(
2832

2933
private val viewModel: GameMasterViewModel by viewModel { parametersOf(args.partyId) }
3034

35+
private lateinit var partyName: String
36+
3137
private lateinit var invitation: Invitation
3238

3339
private fun setViewVisibility(view: View, visible: Boolean) {
@@ -46,7 +52,7 @@ class GameMasterFragment(
4652

4753

4854
viewModel.party.right().observe(viewLifecycleOwner) { party ->
49-
setTitle(party.name)
55+
setTitle(party.getName())
5056
invitation = party.getInvitation()
5157

5258
inviteButton.isEnabled = true
@@ -59,6 +65,10 @@ class GameMasterFragment(
5965
viewModel.updatePartyAmbitions(it)
6066
}.show(childFragmentManager, "ChangeAmbitionsDialog")
6167
}
68+
69+
70+
partyName = party.getName()
71+
setHasOptionsMenu(true)
6272
}
6373

6474
inviteButton.setOnClickListener { showQrCode() }
@@ -85,6 +95,20 @@ class GameMasterFragment(
8595
}
8696
}
8797

98+
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
99+
super.onCreateOptionsMenu(menu, inflater)
100+
101+
inflater.inflate(R.menu.edit_menu, menu)
102+
}
103+
104+
override fun onOptionsItemSelected(item: MenuItem): Boolean {
105+
if (item.itemId == R.id.actionEdit) {
106+
RenamePartyDialog.newInstance(args.partyId, partyName).show(childFragmentManager, null)
107+
}
108+
109+
return super.onOptionsItemSelected(item)
110+
}
111+
88112
private fun showQrCode() {
89113
InvitationDialog(invitation, jsonMapper)
90114
.show(requireActivity().supportFragmentManager, InvitationDialog::class.simpleName)
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package cz.muni.fi.rpg.ui.gameMaster
2+
3+
import android.app.Dialog
4+
import android.content.DialogInterface
5+
import android.os.Bundle
6+
import android.view.View
7+
import android.widget.Toast
8+
import androidx.appcompat.app.AlertDialog
9+
import androidx.core.os.bundleOf
10+
import androidx.fragment.app.DialogFragment
11+
import cz.muni.fi.rpg.R
12+
import cz.muni.fi.rpg.model.domain.common.CouldNotConnectToBackend
13+
import cz.muni.fi.rpg.model.domain.party.Party
14+
import cz.muni.fi.rpg.ui.common.forms.Form
15+
import cz.muni.fi.rpg.viewModels.GameMasterViewModel
16+
import kotlinx.android.synthetic.main.dialog_party_rename.view.*
17+
import kotlinx.coroutines.*
18+
import org.koin.android.viewmodel.ext.android.viewModel
19+
import org.koin.core.parameter.parametersOf
20+
import timber.log.Timber
21+
import java.util.*
22+
23+
class RenamePartyDialog : DialogFragment(), CoroutineScope by CoroutineScope(Dispatchers.Main) {
24+
companion object {
25+
fun newInstance(partyId: UUID, currentName: String) = RenamePartyDialog().apply {
26+
arguments = bundleOf(
27+
"partyId" to partyId,
28+
"currentName" to currentName
29+
)
30+
}
31+
}
32+
33+
private val viewModel: GameMasterViewModel by viewModel {
34+
parametersOf(requireArguments().getSerializable("partyId"))
35+
}
36+
37+
private val currentName: String by lazy { requireArguments().getString("currentName") ?: "" }
38+
39+
private var pendingJob: Job? = null
40+
41+
private lateinit var form: Form
42+
43+
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
44+
val activity = requireActivity()
45+
46+
val inflater = activity.layoutInflater
47+
48+
val view = inflater.inflate(R.layout.dialog_party_rename, null)
49+
50+
form = Form(requireContext()).apply {
51+
addTextInput(view.partyNameInput).apply {
52+
setMaxLength(Party.NAME_MAX_LENGTH)
53+
setDefaultValue(currentName)
54+
addLiveRule(R.string.error_party_name_blank) { !it.isNullOrBlank() }
55+
}
56+
}
57+
58+
val dialog = AlertDialog.Builder(activity)
59+
.setTitle(R.string.title_party_rename)
60+
.setView(view)
61+
.setPositiveButton(R.string.button_save) { _, _ -> }
62+
.create()
63+
64+
dialog.setOnShowListener {
65+
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
66+
dialogSubmitted(dialog, view)
67+
}
68+
}
69+
70+
return dialog
71+
}
72+
73+
private fun dialogSubmitted(dialog: AlertDialog, view: View) {
74+
if (!form.validate()) {
75+
return
76+
}
77+
78+
val partyName = view.partyNameInput.getValue()
79+
80+
dialog.getButton(AlertDialog.BUTTON_POSITIVE).isEnabled = false
81+
view.progress.visibility = View.VISIBLE
82+
view.partyNameInput.visibility = View.GONE
83+
84+
Timber.d("Dialog submitted, trying to update party name")
85+
86+
pendingJob = launch {
87+
try {
88+
viewModel.renameParty(partyName)
89+
toast(getString(R.string.message_party_updated))
90+
Timber.d(tag, "Party was renamed")
91+
} catch (e: CouldNotConnectToBackend) {
92+
Timber.i(e, "User could not rename party, because (s)he is offline")
93+
toast(getString(R.string.error_party_update_no_connection))
94+
} catch (e: Throwable) {
95+
toast(getString(R.string.error_unkown))
96+
Timber.e(e)
97+
} finally {
98+
withContext(Dispatchers.Main) { dismiss() }
99+
}
100+
}
101+
}
102+
103+
override fun onDismiss(dialog: DialogInterface) {
104+
super.onDismiss(dialog)
105+
106+
pendingJob?.cancel()
107+
}
108+
109+
private suspend fun toast(message: String) = withContext(Dispatchers.Main) {
110+
Toast.makeText(requireContext(), message, Toast.LENGTH_LONG).show()
111+
}
112+
}

app/src/main/java/cz/muni/fi/rpg/ui/partyList/AssemblePartyDialog.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class AssemblePartyDialog(
3737
form = Form(requireContext()).apply {
3838
addTextInput(view.partyNameInput).apply {
3939
setMaxLength(Party.NAME_MAX_LENGTH)
40-
addLiveRule(R.string.assembleParty_party_name_blank) {
40+
addLiveRule(R.string.error_party_name_blank) {
4141
!it.isNullOrBlank()
4242
}
4343
}

app/src/main/java/cz/muni/fi/rpg/ui/partyList/adapter/PartyHolder.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ class PartyHolder(
1111
private val onClickListener: EntityListener<Party>
1212
) : RecyclerView.ViewHolder(view) {
1313
fun bind(item: Party) {
14-
view.party_item_title.text = item.name
14+
view.party_item_title.text = item.getName()
1515

1616
val playersCount = item.getPlayerCounts()
1717

app/src/main/java/cz/muni/fi/rpg/viewModels/GameMasterViewModel.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ class GameMasterViewModel(
5252
}
5353
}
5454

55+
suspend fun renameParty(newName: String) {
56+
val party = parties.get(partyId)
57+
58+
party.rename(newName)
59+
60+
parties.save(party)
61+
}
62+
5563
suspend fun updatePartyAmbitions(ambitions: Ambitions) {
5664
val party = parties.get(partyId)
5765

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
android:layout_width="match_parent"
5+
android:layout_height="match_parent"
6+
android:padding="@dimen/dialogPadding">
7+
8+
<ProgressBar
9+
android:id="@+id/progress"
10+
android:layout_width="match_parent"
11+
android:layout_gravity="center"
12+
android:visibility="gone"
13+
android:layout_height="match_parent" />
14+
15+
<cz.muni.fi.rpg.ui.views.TextInput
16+
android:id="@+id/partyNameInput"
17+
android:layout_width="match_parent"
18+
android:layout_height="wrap_content"
19+
app:inputLabel="@string/label_party_name" />
20+
</FrameLayout>
File renamed without changes.

app/src/main/res/values/strings.xml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,14 @@
99
<!-- end of Common UI elements -->
1010

1111
<string name="assembleParty_title">Assemble New Party</string>
12+
13+
<!-- Party rename Dialog -->
14+
<string name="title_party_rename">Assemble New Party</string>
15+
1216
<string name="label_party_name">Party Name</string>
1317
<string name="assembleParty_button_positive">create</string>
1418
<string name="assemblyParty_submit">create</string>
15-
<string name="assembleParty_party_name_blank">Party name cannot be empty</string>
19+
<string name="error_party_name_blank">Party name cannot be empty</string>
1620
<string name="scanCode_title">Join using QR code</string>
1721
<string name="group_icon_description">Group icon</string>
1822
<string name="skill_icon_description">Icon with characteristic related to this skill</string>
@@ -125,6 +129,7 @@
125129
<string name="error_value_over_100">Cannot be higher than 100</string>
126130
<string name="error_value_over_max">Cannot be higher than maximum value</string>
127131
<string name="error_party_creation_no_connection">You need to be connected to internet to create parties</string>
132+
<string name="error_party_update_no_connection">You need to be connected to internet to update party</string>
128133
<string name="title_character_skills">Skills</string>
129134
<string name="title_character_talents">Talents</string>
130135
<string name="title_character_spells">Spells</string>
@@ -191,4 +196,5 @@
191196
<string name="label_motivation">Motivation</string>
192197
<string name="share_link">Share link</string>
193198
<string name="waiting_for_character">Waiting for player to create character</string>
199+
<string name="message_party_updated">Party was updated</string>
194200
</resources>

0 commit comments

Comments
 (0)