Skip to content

Commit b9c6c9a

Browse files
committed
Added ways to remove encounter
1 parent e1bd768 commit b9c6c9a

File tree

6 files changed

+67
-8
lines changed

6 files changed

+67
-8
lines changed

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

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,25 @@ import android.view.Menu
55
import android.view.MenuInflater
66
import android.view.MenuItem
77
import android.view.View
8+
import androidx.appcompat.app.AlertDialog
89
import androidx.lifecycle.observe
10+
import androidx.navigation.fragment.findNavController
911
import androidx.navigation.fragment.navArgs
1012
import cz.muni.fi.rpg.R
1113
import cz.muni.fi.rpg.model.domain.encounter.Encounter
1214
import cz.muni.fi.rpg.model.right
1315
import cz.muni.fi.rpg.ui.common.BaseFragment
1416
import cz.muni.fi.rpg.viewModels.EncounterDetailViewModel
1517
import kotlinx.android.synthetic.main.fragment_encounter_detail.*
18+
import kotlinx.coroutines.CoroutineScope
19+
import kotlinx.coroutines.Dispatchers
20+
import kotlinx.coroutines.launch
21+
import kotlinx.coroutines.withContext
1622
import org.koin.android.viewmodel.ext.android.viewModel
1723
import org.koin.core.parameter.parametersOf
1824

19-
class EncounterDetailFragment : BaseFragment(R.layout.fragment_encounter_detail) {
25+
class EncounterDetailFragment : BaseFragment(R.layout.fragment_encounter_detail),
26+
CoroutineScope by CoroutineScope(Dispatchers.Default) {
2027

2128
private val args: EncounterDetailFragmentArgs by navArgs()
2229

@@ -39,18 +46,33 @@ class EncounterDetailFragment : BaseFragment(R.layout.fragment_encounter_detail)
3946
this.encounter = encounter
4047
}
4148
}
49+
4250
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
4351
super.onCreateOptionsMenu(menu, inflater)
4452

45-
inflater.inflate(R.menu.edit_menu, menu)
53+
inflater.inflate(R.menu.encounter_menu, menu)
4654
}
4755

4856
override fun onOptionsItemSelected(item: MenuItem): Boolean {
49-
if (item.itemId == R.id.actionEdit) {
50-
EncounterDialog.newInstance(
51-
args.encounterId.partyId,
52-
EncounterDialog.Defaults(encounter.id, encounter.name, encounter.description)
53-
).show(childFragmentManager, null)
57+
when (item.itemId) {
58+
R.id.actionEdit -> {
59+
EncounterDialog.newInstance(
60+
args.encounterId.partyId,
61+
EncounterDialog.Defaults(encounter.id, encounter.name, encounter.description)
62+
).show(childFragmentManager, null)
63+
}
64+
R.id.actionRemove -> {
65+
AlertDialog.Builder(requireContext())
66+
.setMessage(R.string.question_remove_encounter)
67+
.setPositiveButton(R.string.remove) { _, _ ->
68+
launch {
69+
viewModel.remove()
70+
withContext(Dispatchers.Main) { findNavController().popBackStack() }
71+
}
72+
}.setNegativeButton(R.string.button_cancel, null)
73+
.create()
74+
.show()
75+
}
5476
}
5577

5678
return super.onOptionsItemSelected(item)

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,8 @@ class EncounterDetailViewModel(
1919

2020
val party: LiveData<Either<PartyNotFound, Party>> = parties.getLive(encounterId.partyId)
2121
val encounter: LiveData<Either<EncounterNotFound, Encounter>> = encounters.getLive(encounterId)
22+
23+
suspend fun remove() {
24+
encounters.remove(encounterId)
25+
}
2226
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<menu xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto">
4+
<item
5+
android:id="@+id/actionEdit"
6+
android:title="@string/button_edit"
7+
android:icon="@drawable/ic_edit"
8+
app:showAsAction="always" />
9+
<item android:id="@+id/actionRemove"
10+
android:title="@string/remove"/>
11+
</menu>

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,4 +220,5 @@
220220
<string name="label_character_note">Additional notes</string>
221221
<string name="label_character_note_input">Additional notes (Optional)</string>
222222
<string name="title_checkbox_hardy">Hardy (Increase maximum wounds by TB)</string>
223+
<string name="question_remove_encounter">Do you really want to remove this encounter?</string>
223224
</resources>

firebase/firestore.rules

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,14 @@ service cloud.firestore {
1616

1717
match /encounters/{encounterId} {
1818
allow read: if hasAccessToParty();
19-
allow write: if isValidEncounter(request.resource.data)
19+
allow create: if isValidEncounter(request.resource.data)
2020
&& hasAccessToParty()
2121
&& isGameMaster();
22+
allow update: if isValidEncounter(request.resource.data)
23+
&& hasAccessToParty()
24+
&& isGameMaster();
25+
allow delete: if hasAccessToParty() && isGameMaster();
26+
2227

2328
function isValidEncounter(encounter) {
2429
return encounter is map

firebase/tests/Encounters.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,22 @@ class Encounters extends Suite {
2929
)
3030
}
3131

32+
@test
33+
async "GM can remove encounters"() {
34+
const party = await this.createValidParty();
35+
const encounter = this.validEncounter();
36+
37+
const document = this.authedApp(this.validPartyGameMasterId)
38+
.collection("parties")
39+
.doc(party.id)
40+
.collection("encounters")
41+
.doc(encounter.id);
42+
43+
await document.set(encounter)
44+
45+
await assertSucceeds(document.delete())
46+
}
47+
3248
@test
3349
async "Player CANNOT create encounters"() {
3450
const userId = "user123"

0 commit comments

Comments
 (0)