├── .github
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ └── feature_request.md
├── release-drafter.yml
└── workflows
│ ├── android-test.yml
│ └── release-drafter.yml
├── .gitignore
├── LICENSE
├── README.md
├── app
├── .gitignore
├── build.gradle.kts
├── detekt-config.yml
├── google-services.json
├── objectbox-models
│ ├── default.json
│ └── default.json.bak
├── proguard-rules.pro
├── src
│ ├── androidTest
│ │ └── java
│ │ │ └── me
│ │ │ └── kerooker
│ │ │ └── rpgnpcgenerator
│ │ │ └── view
│ │ │ ├── my
│ │ │ └── npc
│ │ │ │ └── individual
│ │ │ │ └── IndividualNpcFragmentTest.kt
│ │ │ └── random
│ │ │ └── npc
│ │ │ └── RandomNpcFragmentTest.kt
│ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── ic_launcher-web.png
│ │ ├── java
│ │ │ └── me
│ │ │ │ └── kerooker
│ │ │ │ └── rpgnpcgenerator
│ │ │ │ ├── RpgNpcGeneratorApplication.kt
│ │ │ │ ├── legacy
│ │ │ │ └── repository
│ │ │ │ │ ├── LegacyNpcImporter.kt
│ │ │ │ │ └── LegacyNpcRepository.kt
│ │ │ │ ├── repository
│ │ │ │ └── model
│ │ │ │ │ ├── persistence
│ │ │ │ │ ├── RepositoryModule.kt
│ │ │ │ │ ├── admob
│ │ │ │ │ │ └── AdmobRepository.kt
│ │ │ │ │ └── npc
│ │ │ │ │ │ ├── NpcEntity.kt
│ │ │ │ │ │ └── NpcRepository.kt
│ │ │ │ │ └── random
│ │ │ │ │ └── npc
│ │ │ │ │ ├── EnumGenerators.kt
│ │ │ │ │ ├── FileGenerators.kt
│ │ │ │ │ ├── GeneratedNpc.kt
│ │ │ │ │ ├── NpcGenerators.kt
│ │ │ │ │ ├── RandomNpcKoinModule.kt
│ │ │ │ │ └── TemporaryRandomNpcRepository.kt
│ │ │ │ ├── view
│ │ │ │ ├── MainActivity.kt
│ │ │ │ ├── my
│ │ │ │ │ └── npc
│ │ │ │ │ │ ├── MyNpcsFragment.kt
│ │ │ │ │ │ └── individual
│ │ │ │ │ │ └── IndividualNpcFragment.kt
│ │ │ │ ├── random
│ │ │ │ │ └── npc
│ │ │ │ │ │ ├── RandomNpcElementListview.kt
│ │ │ │ │ │ ├── RandomNpcElementView.kt
│ │ │ │ │ │ ├── RandomNpcFragment.kt
│ │ │ │ │ │ └── RandomNpcListView.kt
│ │ │ │ ├── settings
│ │ │ │ │ └── SettingsFragment.kt
│ │ │ │ ├── text
│ │ │ │ │ └── ClearFocusEditText.kt
│ │ │ │ └── util
│ │ │ │ │ └── AnimateRotation.kt
│ │ │ │ └── viewmodel
│ │ │ │ ├── ViewModelsModule.kt
│ │ │ │ ├── admob
│ │ │ │ ├── AdmobViewModel.kt
│ │ │ │ └── MyBuildConfig.kt
│ │ │ │ ├── my
│ │ │ │ └── npc
│ │ │ │ │ ├── MyNpcsViewModel.kt
│ │ │ │ │ └── individual
│ │ │ │ │ └── IndividualNpcViewModel.kt
│ │ │ │ ├── random
│ │ │ │ └── npc
│ │ │ │ │ └── RandomNpcViewModel.kt
│ │ │ │ └── settings
│ │ │ │ └── SettingsViewModel.kt
│ │ └── res
│ │ │ ├── anim
│ │ │ └── rotate_animation.xml
│ │ │ ├── color
│ │ │ └── mynpcs_individual_edit_text_color.xml
│ │ │ ├── drawable-v24
│ │ │ └── ic_launcher_foreground.xml
│ │ │ ├── drawable
│ │ │ ├── dice_192_192.png
│ │ │ ├── github_32px.png
│ │ │ ├── ic_add_circle_primary_color_24dp.xml
│ │ │ ├── ic_bug_report_black_24dp.xml
│ │ │ ├── ic_cancel_24dp.xml
│ │ │ ├── ic_edit_24dp.xml
│ │ │ ├── ic_launcher_background.xml
│ │ │ ├── ic_library_book.xml
│ │ │ ├── ic_remove_circle_red_24dp.xml
│ │ │ ├── ic_save_24dp.xml
│ │ │ ├── ic_settings_24dp.xml
│ │ │ ├── ic_star_black_24dp.xml
│ │ │ ├── ic_twenty_sided_dice.xml
│ │ │ ├── portrait_placeholder.xml
│ │ │ └── simple_black_border.xml
│ │ │ ├── layout
│ │ │ ├── activity_main.xml
│ │ │ ├── mynpcs_fragment.xml
│ │ │ ├── mynpcs_individual_fragment.xml
│ │ │ ├── mynpcs_individual_list.xml
│ │ │ ├── mynpcs_individual_list_element.xml
│ │ │ ├── randomnpc_element_list_view.xml
│ │ │ ├── randomnpc_element_list_view_item.xml
│ │ │ ├── randomnpc_element_view.xml
│ │ │ └── randomnpc_fragment.xml
│ │ │ ├── menu
│ │ │ ├── main_bottom_nav.xml
│ │ │ ├── mynpcs_individual_editmode_item_menu.xml
│ │ │ ├── mynpcs_individual_viewmode_item_menu.xml
│ │ │ ├── mynpcs_list_item_menu.xml
│ │ │ └── randomnpc_fragment_menu.xml
│ │ │ ├── mipmap-anydpi-v26
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_foreground.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── navigation
│ │ │ └── nav_graph.xml
│ │ │ ├── raw-pt
│ │ │ ├── npc_child_professions.txt
│ │ │ ├── npc_motivations.txt
│ │ │ ├── npc_nicknames.txt
│ │ │ ├── npc_personality_trait.txt
│ │ │ └── npc_professions.txt
│ │ │ ├── raw
│ │ │ ├── npc_child_professions.txt
│ │ │ ├── npc_motivations.txt
│ │ │ ├── npc_names.txt
│ │ │ ├── npc_nicknames.txt
│ │ │ ├── npc_personality_trait.txt
│ │ │ └── npc_professions.txt
│ │ │ ├── values-pt
│ │ │ ├── individual_npc.xml
│ │ │ ├── mainactivity.xml
│ │ │ ├── mynpcs.xml
│ │ │ ├── npc_enums.xml
│ │ │ ├── random_npc.xml
│ │ │ ├── settings.xml
│ │ │ └── strings.xml
│ │ │ ├── values
│ │ │ ├── colors.xml
│ │ │ ├── ic_launcher_background.xml
│ │ │ ├── individual_npc.xml
│ │ │ ├── mainactivity.xml
│ │ │ ├── mynpcs.xml
│ │ │ ├── npc_enums.xml
│ │ │ ├── random_npc.xml
│ │ │ ├── settings.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ │ └── xml
│ │ │ └── preferences.xml
│ └── test
│ │ └── java
│ │ ├── io
│ │ └── kotest
│ │ │ ├── android
│ │ │ ├── InstantLivedataListener.kt
│ │ │ └── SharedPreferences.kt
│ │ │ └── provided
│ │ │ └── ProjectConfig.kt
│ │ └── me
│ │ └── kerooker
│ │ └── rpgnpcgenerator
│ │ ├── legacy
│ │ └── repository
│ │ │ └── LegacyNpcRepositoryTest.kt
│ │ ├── repository
│ │ └── model
│ │ │ └── random
│ │ │ └── npc
│ │ │ ├── EnumGeneratorsTests.kt
│ │ │ ├── FileGeneratorsTest.kt
│ │ │ └── NpcGeneratorsTests.kt
│ │ └── viewmodel
│ │ ├── admob
│ │ └── AdmobViewmodelTest.kt
│ │ └── my
│ │ └── npc
│ │ └── MyNpcsViewModelTest.kt
└── version.properties
├── build.gradle
├── buildSrc
├── build.gradle.kts
└── src
│ └── main
│ └── java
│ └── Versions.kt
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── renovate.json
└── settings.gradle
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Desktop (please complete the following information):**
27 | - OS: [e.g. iOS]
28 | - Browser [e.g. chrome, safari]
29 | - Version [e.g. 22]
30 |
31 | **Smartphone (please complete the following information):**
32 | - Device: [e.g. iPhone6]
33 | - OS: [e.g. iOS8.1]
34 | - Browser [e.g. stock browser, safari]
35 | - Version [e.g. 22]
36 |
37 | **Additional context**
38 | Add any other context about the problem here.
39 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/.github/release-drafter.yml:
--------------------------------------------------------------------------------
1 | name-template: 'v$NEXT_PATCH_VERSION 🌈'
2 | tag-template: 'v$NEXT_PATCH_VERSION'
3 | categories:
4 | - title: '🚀 Features'
5 | labels:
6 | - 'feature'
7 | - 'enhancement'
8 | - title: '🐛 Bug Fixes'
9 | labels:
10 | - 'fix'
11 | - 'bugfix'
12 | - 'bug'
13 | - title: '🧰 Maintenance'
14 | label: 'chore'
15 | change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
16 | template: |
17 | ## Changes
18 |
19 | $CHANGES
--------------------------------------------------------------------------------
/.github/workflows/android-test.yml:
--------------------------------------------------------------------------------
1 | name: "Android Test"
2 | on:
3 | push:
4 |
5 | jobs:
6 | test:
7 | runs-on: macOS-latest
8 | steps:
9 | - name: checkout
10 | uses: actions/checkout@v2
11 |
12 | - name: run tests
13 | uses: reactivecircus/android-emulator-runner@v2
14 | with:
15 | api-level: 28
16 | emulator-options: ""
17 | script: "./gradlew connectedCheck test detekt"
18 |
19 | - name: upload failure
20 | uses: actions/upload-artifact@v1
21 | if: failure()
22 | with:
23 | name: build-artifact
24 | path: app/build
--------------------------------------------------------------------------------
/.github/workflows/release-drafter.yml:
--------------------------------------------------------------------------------
1 | name: Release Drafter
2 |
3 | on:
4 | push:
5 | # branches to consider in the event; optional, defaults to all
6 | branches:
7 | - master
8 |
9 | jobs:
10 | update_release_draft:
11 | runs-on: ubuntu-latest
12 | steps:
13 | # Drafts your next Release notes as Pull Requests are merged into "master"
14 | - uses: release-drafter/release-drafter@v5
15 | env:
16 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/caches
5 | /.idea/libraries
6 | /.idea/modules.xml
7 | /.idea/workspace.xml
8 | /.idea/navEditor.xml
9 | /.idea/assetWizardSettings.xml
10 | .DS_Store
11 | /captures
12 | .externalNativeBuild
13 | .cxx
14 | local/
15 | .idea/
16 | build/
17 | buildSrc/build/
18 | app/build
19 | local/*
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # RPG NPC Generator
2 | RPG NPC Generator is an Android application to help Dungeon Masters create non-playable-character for their campaigns.
3 |
4 | It aims to be easy yet powerful to help DMs with their creativity and enhance their tabletop experience
5 |
6 |
7 |
8 | ## The software
9 |
10 | The app is written 100% in Kotlin and is tested with KotlinTest. We aim to use Android's best practices, but that's not necessarily true for all the components.
11 |
12 | ## Contributing
13 |
14 | Feel free to create an issue or open a PR for whatever you feel like. We're open to all sorts of discussions and improvements!
15 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 | *.so
--------------------------------------------------------------------------------
/app/google-services.json:
--------------------------------------------------------------------------------
1 | {
2 | "project_info": {
3 | "project_number": "913246948127",
4 | "firebase_url": "https://rpg-npc-generator-53a2d.firebaseio.com",
5 | "project_id": "rpg-npc-generator-53a2d",
6 | "storage_bucket": "rpg-npc-generator-53a2d.appspot.com"
7 | },
8 | "client": [
9 | {
10 | "client_info": {
11 | "mobilesdk_app_id": "1:913246948127:android:6c82fa5d0df401978d3e2a",
12 | "android_client_info": {
13 | "package_name": "me.kerooker.rpgcharactergenerator"
14 | }
15 | },
16 | "oauth_client": [
17 | {
18 | "client_id": "913246948127-rtggc8lj0c6ih28n3c0609pvvvg03i0f.apps.googleusercontent.com",
19 | "client_type": 3
20 | }
21 | ],
22 | "api_key": [
23 | {
24 | "current_key": "AIzaSyBDjoQQqNnzfFodTQe1aNlYm8ucp2jsT5Y"
25 | }
26 | ],
27 | "services": {
28 | "appinvite_service": {
29 | "other_platform_oauth_client": [
30 | {
31 | "client_id": "913246948127-rtggc8lj0c6ih28n3c0609pvvvg03i0f.apps.googleusercontent.com",
32 | "client_type": 3
33 | }
34 | ]
35 | }
36 | },
37 | "admob_app_id": "ca-app-pub-3225017918525788~7747841753"
38 | },
39 | {
40 | "client_info": {
41 | "mobilesdk_app_id": "1:913246948127:android:d54780527c872b278d3e2a",
42 | "android_client_info": {
43 | "package_name": "me.kerooker.rpgcharactergenerator.debug"
44 | }
45 | },
46 | "oauth_client": [
47 | {
48 | "client_id": "913246948127-rtggc8lj0c6ih28n3c0609pvvvg03i0f.apps.googleusercontent.com",
49 | "client_type": 3
50 | }
51 | ],
52 | "api_key": [
53 | {
54 | "current_key": "AIzaSyBDjoQQqNnzfFodTQe1aNlYm8ucp2jsT5Y"
55 | }
56 | ],
57 | "services": {
58 | "appinvite_service": {
59 | "other_platform_oauth_client": [
60 | {
61 | "client_id": "913246948127-rtggc8lj0c6ih28n3c0609pvvvg03i0f.apps.googleusercontent.com",
62 | "client_type": 3
63 | }
64 | ]
65 | }
66 | }
67 | },
68 | {
69 | "client_info": {
70 | "mobilesdk_app_id": "1:913246948127:android:81f8e60bc85ec34d8d3e2a",
71 | "android_client_info": {
72 | "package_name": "me.kerooker.rpgcharactergeneratorpro"
73 | }
74 | },
75 | "oauth_client": [
76 | {
77 | "client_id": "913246948127-rtggc8lj0c6ih28n3c0609pvvvg03i0f.apps.googleusercontent.com",
78 | "client_type": 3
79 | }
80 | ],
81 | "api_key": [
82 | {
83 | "current_key": "AIzaSyBDjoQQqNnzfFodTQe1aNlYm8ucp2jsT5Y"
84 | }
85 | ],
86 | "services": {
87 | "appinvite_service": {
88 | "other_platform_oauth_client": [
89 | {
90 | "client_id": "913246948127-rtggc8lj0c6ih28n3c0609pvvvg03i0f.apps.googleusercontent.com",
91 | "client_type": 3
92 | }
93 | ]
94 | }
95 | }
96 | },
97 | {
98 | "client_info": {
99 | "mobilesdk_app_id": "1:913246948127:android:9d46242e8a8644718d3e2a",
100 | "android_client_info": {
101 | "package_name": "me.kerooker.rpgcharactergeneratorpro.debug"
102 | }
103 | },
104 | "oauth_client": [
105 | {
106 | "client_id": "913246948127-rtggc8lj0c6ih28n3c0609pvvvg03i0f.apps.googleusercontent.com",
107 | "client_type": 3
108 | }
109 | ],
110 | "api_key": [
111 | {
112 | "current_key": "AIzaSyBDjoQQqNnzfFodTQe1aNlYm8ucp2jsT5Y"
113 | }
114 | ],
115 | "services": {
116 | "appinvite_service": {
117 | "other_platform_oauth_client": [
118 | {
119 | "client_id": "913246948127-rtggc8lj0c6ih28n3c0609pvvvg03i0f.apps.googleusercontent.com",
120 | "client_type": 3
121 | }
122 | ]
123 | }
124 | }
125 | }
126 | ],
127 | "configuration_version": "1"
128 | }
--------------------------------------------------------------------------------
/app/objectbox-models/default.json:
--------------------------------------------------------------------------------
1 | {
2 | "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.",
3 | "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.",
4 | "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.",
5 | "entities": [
6 | {
7 | "id": "1:965012069954660192",
8 | "lastPropertyId": "16:5464541095149212888",
9 | "name": "NpcEntity",
10 | "properties": [
11 | {
12 | "id": "1:5505077283636440623",
13 | "name": "id",
14 | "type": 6,
15 | "flags": 1
16 | },
17 | {
18 | "id": "2:8142384949617207154",
19 | "name": "age",
20 | "type": 9
21 | },
22 | {
23 | "id": "5:4753897017570320626",
24 | "name": "nickname",
25 | "type": 9
26 | },
27 | {
28 | "id": "6:777274660507681508",
29 | "name": "gender",
30 | "type": 9
31 | },
32 | {
33 | "id": "7:2894282806420349046",
34 | "name": "sexuality",
35 | "type": 9
36 | },
37 | {
38 | "id": "8:4107047496141214768",
39 | "name": "race",
40 | "type": 9
41 | },
42 | {
43 | "id": "9:6625730653070537440",
44 | "name": "profession",
45 | "type": 9
46 | },
47 | {
48 | "id": "10:636510404345708822",
49 | "name": "motivation",
50 | "type": 9
51 | },
52 | {
53 | "id": "11:8995285898410800121",
54 | "name": "alignment",
55 | "type": 9
56 | },
57 | {
58 | "id": "12:3792645898268560037",
59 | "name": "personalityTraits",
60 | "type": 9
61 | },
62 | {
63 | "id": "13:6023405270920972356",
64 | "name": "languages",
65 | "type": 9
66 | },
67 | {
68 | "id": "14:4260823185367431858",
69 | "name": "fullName",
70 | "type": 9
71 | },
72 | {
73 | "id": "15:3627157795465900228",
74 | "name": "imagePath",
75 | "type": 9
76 | },
77 | {
78 | "id": "16:5464541095149212888",
79 | "name": "notes",
80 | "type": 9
81 | }
82 | ],
83 | "relations": []
84 | }
85 | ],
86 | "lastEntityId": "1:965012069954660192",
87 | "lastIndexId": "0:0",
88 | "lastRelationId": "0:0",
89 | "lastSequenceId": "0:0",
90 | "modelVersion": 5,
91 | "modelVersionParserMinimum": 5,
92 | "retiredEntityUids": [],
93 | "retiredIndexUids": [],
94 | "retiredPropertyUids": [
95 | 5589089258033801881,
96 | 2272150580062402924
97 | ],
98 | "retiredRelationUids": [],
99 | "version": 1
100 | }
--------------------------------------------------------------------------------
/app/objectbox-models/default.json.bak:
--------------------------------------------------------------------------------
1 | {
2 | "_note1": "KEEP THIS FILE! Check it into a version control system (VCS) like git.",
3 | "_note2": "ObjectBox manages crucial IDs for your object model. See docs for details.",
4 | "_note3": "If you have VCS merge conflicts, you must resolve them according to ObjectBox docs.",
5 | "entities": [
6 | {
7 | "id": "1:965012069954660192",
8 | "lastPropertyId": "15:3627157795465900228",
9 | "name": "NpcEntity",
10 | "properties": [
11 | {
12 | "id": "1:5505077283636440623",
13 | "name": "id",
14 | "type": 6,
15 | "flags": 1
16 | },
17 | {
18 | "id": "2:8142384949617207154",
19 | "name": "age",
20 | "type": 9
21 | },
22 | {
23 | "id": "5:4753897017570320626",
24 | "name": "nickname",
25 | "type": 9
26 | },
27 | {
28 | "id": "6:777274660507681508",
29 | "name": "gender",
30 | "type": 9
31 | },
32 | {
33 | "id": "7:2894282806420349046",
34 | "name": "sexuality",
35 | "type": 9
36 | },
37 | {
38 | "id": "8:4107047496141214768",
39 | "name": "race",
40 | "type": 9
41 | },
42 | {
43 | "id": "9:6625730653070537440",
44 | "name": "profession",
45 | "type": 9
46 | },
47 | {
48 | "id": "10:636510404345708822",
49 | "name": "motivation",
50 | "type": 9
51 | },
52 | {
53 | "id": "11:8995285898410800121",
54 | "name": "alignment",
55 | "type": 9
56 | },
57 | {
58 | "id": "12:3792645898268560037",
59 | "name": "personalityTraits",
60 | "type": 9
61 | },
62 | {
63 | "id": "13:6023405270920972356",
64 | "name": "languages",
65 | "type": 9
66 | },
67 | {
68 | "id": "14:4260823185367431858",
69 | "name": "fullName",
70 | "type": 9
71 | },
72 | {
73 | "id": "15:3627157795465900228",
74 | "name": "imagePath",
75 | "type": 9
76 | }
77 | ],
78 | "relations": []
79 | }
80 | ],
81 | "lastEntityId": "1:965012069954660192",
82 | "lastIndexId": "0:0",
83 | "lastRelationId": "0:0",
84 | "lastSequenceId": "0:0",
85 | "modelVersion": 5,
86 | "modelVersionParserMinimum": 5,
87 | "retiredEntityUids": [],
88 | "retiredIndexUids": [],
89 | "retiredPropertyUids": [
90 | 5589089258033801881,
91 | 2272150580062402924
92 | ],
93 | "retiredRelationUids": [],
94 | "version": 1
95 | }
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
23 | -keepattributes *Annotation*, InnerClasses
24 | -dontnote kotlinx.serialization.SerializationKt
25 | -keep,includedescriptorclasses class me.kerooker.rpgnpcgenerator.**$$serializer { *; } # <-- change package name to your app's
26 | -keepclassmembers class me.kerooker.rpgnpcgenerator.** { # <-- change package name to your app's
27 | *** Companion;
28 | }
29 | -keepclasseswithmembers class me.kerooker.rpgnpcgenerator.** { # <-- change package name to your app's
30 | kotlinx.serialization.KSerializer serializer(...);
31 | }
--------------------------------------------------------------------------------
/app/src/androidTest/java/me/kerooker/rpgnpcgenerator/view/my/npc/individual/IndividualNpcFragmentTest.kt:
--------------------------------------------------------------------------------
1 | package me.kerooker.rpgnpcgenerator.view.my.npc.individual
2 |
3 | import android.view.MenuItem
4 | import androidx.fragment.app.testing.launchFragmentInContainer
5 | import androidx.test.espresso.Espresso.onView
6 | import androidx.test.espresso.action.ViewActions.replaceText
7 | import androidx.test.espresso.assertion.ViewAssertions.matches
8 | import androidx.test.espresso.matcher.ViewMatchers.withText
9 | import io.kotlintest.IsolationMode
10 | import io.kotlintest.TestCase
11 | import io.kotlintest.TestResult
12 | import io.kotlintest.specs.ShouldSpec
13 | import io.mockk.every
14 | import io.mockk.mockk
15 | import kotlinx.coroutines.delay
16 | import me.kerooker.rpgnpcgenerator.R
17 | import me.kerooker.rpgnpcgenerator.repository.model.persistence.npc.NpcEntity
18 | import me.kerooker.rpgnpcgenerator.repository.model.persistence.npc.NpcRepository
19 | import org.koin.core.KoinComponent
20 | import org.koin.core.inject
21 |
22 | class IndividualNpcFragmentTest : ShouldSpec(), KoinComponent {
23 |
24 | private val npcRepository by inject()
25 |
26 | private var npcId: Long = -1
27 |
28 | init {
29 | should("Reset NPC fields when Edit Mode is cancelled") {
30 | val fragment =
31 | launchFragmentInContainer(IndividualNpcFragmentArgs(npcId).toBundle(), R.style.MyAppTheme)
32 |
33 | val item = mockk