├── app
├── .gitignore
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── resources.properties
│ │ │ ├── raw
│ │ │ │ ├── beeps.mp3
│ │ │ │ └── buzzer.mp3
│ │ │ ├── mipmap-hdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── drawable
│ │ │ │ ├── navigation_header_image.png
│ │ │ │ ├── table_row_border.xml
│ │ │ │ ├── baseline_exposure_plus_1_24.xml
│ │ │ │ ├── ic_division.xml
│ │ │ │ ├── ic_baseline_delete_outline_24.xml
│ │ │ │ ├── ic_radio_button_unchecked.xml
│ │ │ │ ├── ic_brightness_low.xml
│ │ │ │ ├── lock_open_outline.xml
│ │ │ │ ├── ic_menu_number_converter.xml
│ │ │ │ ├── ic_outline_text_rotation_angleup.xml
│ │ │ │ ├── ic_brightness_high.xml
│ │ │ │ ├── ic_baseline_sort_by_alpha_24.xml
│ │ │ │ ├── ic_baseline_timer_24.xml
│ │ │ │ ├── ic_alphabetical_variant_24.xml
│ │ │ │ ├── ic_baseline_format_list_bulleted_24.xml
│ │ │ │ ├── snowflake.xml
│ │ │ │ ├── ic_menu_dice.xml
│ │ │ │ ├── wb_incandescent_48px.xml
│ │ │ │ ├── ic_launcher_foreground.xml
│ │ │ │ └── ic_outline_settings_24.xml
│ │ │ ├── values
│ │ │ │ ├── dimens.xml
│ │ │ │ ├── colors.xml
│ │ │ │ ├── themes.xml
│ │ │ │ ├── array.xml
│ │ │ │ └── common_words.xml
│ │ │ ├── menu
│ │ │ │ ├── menu_buzzers.xml
│ │ │ │ ├── menu_timer.xml
│ │ │ │ ├── menu_keep_screen_on.xml
│ │ │ │ ├── menu_random_list.xml
│ │ │ │ └── activity_main_drawer.xml
│ │ │ ├── values-v23
│ │ │ │ └── themes.xml
│ │ │ ├── mipmap-anydpi-v26
│ │ │ │ └── ic_launcher.xml
│ │ │ ├── layout
│ │ │ │ ├── dice.xml
│ │ │ │ ├── app_bar_main.xml
│ │ │ │ ├── alphabet_table_row.xml
│ │ │ │ ├── content_main.xml
│ │ │ │ ├── fragment_counter.xml
│ │ │ │ ├── nav_header_main.xml
│ │ │ │ ├── activity_main.xml
│ │ │ │ ├── fragment_alphabet.xml
│ │ │ │ ├── fragment_prime_fac.xml
│ │ │ │ ├── fragment_random_list.xml
│ │ │ │ ├── dialog_count_down_picker.xml
│ │ │ │ ├── fragment_frosthaven.xml
│ │ │ │ ├── counter.xml
│ │ │ │ ├── fragment_buzzers.xml
│ │ │ │ ├── fragment_rot13.xml
│ │ │ │ ├── fragment_timer.xml
│ │ │ │ ├── fragment_dice.xml
│ │ │ │ └── fragment_number_converter.xml
│ │ │ ├── values-no
│ │ │ │ └── strings.xml
│ │ │ ├── values-af
│ │ │ │ └── strings.xml
│ │ │ ├── values-fa
│ │ │ │ └── strings.xml
│ │ │ ├── values-in
│ │ │ │ └── strings.xml
│ │ │ ├── values-ji
│ │ │ │ └── strings.xml
│ │ │ ├── values-ko
│ │ │ │ └── strings.xml
│ │ │ ├── values-sr
│ │ │ │ └── strings.xml
│ │ │ ├── values-vi
│ │ │ │ └── strings.xml
│ │ │ ├── values-zh
│ │ │ │ └── strings.xml
│ │ │ ├── values-en
│ │ │ │ └── strings.xml
│ │ │ ├── values-hu
│ │ │ │ └── strings.xml
│ │ │ ├── values-ca
│ │ │ │ └── strings.xml
│ │ │ ├── values-iw
│ │ │ │ └── strings.xml
│ │ │ ├── values-eu
│ │ │ │ └── strings.xml
│ │ │ ├── xml
│ │ │ │ └── pref_main.xml
│ │ │ ├── values-tr
│ │ │ │ └── strings.xml
│ │ │ ├── navigation
│ │ │ │ └── mobile_navigation.xml
│ │ │ ├── values-de
│ │ │ │ └── common_words.xml
│ │ │ ├── values-ja
│ │ │ │ └── strings.xml
│ │ │ ├── values-zh-rCN
│ │ │ │ └── strings.xml
│ │ │ └── values-nb
│ │ │ │ └── strings.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── github
│ │ │ │ └── muellerma
│ │ │ │ └── tabletoptools
│ │ │ │ ├── utils
│ │ │ │ ├── TextUtils.kt
│ │ │ │ ├── ShortcutManager.kt
│ │ │ │ ├── ExtensionFunctions.kt
│ │ │ │ └── Prefs.kt
│ │ │ │ ├── TableTopToolsApp.kt
│ │ │ │ └── ui
│ │ │ │ ├── SecondInstance.kt
│ │ │ │ ├── fragments
│ │ │ │ ├── FrosthavenFragment.kt
│ │ │ │ ├── AlphabetFragment.kt
│ │ │ │ ├── CounterFragment.kt
│ │ │ │ ├── PrimeFacFragment.kt
│ │ │ │ ├── NumberConverterFragment.kt
│ │ │ │ ├── PreferenceFragment.kt
│ │ │ │ ├── RandomListFragment.kt
│ │ │ │ ├── Rot13Fragment.kt
│ │ │ │ └── AbstractBaseFragment.kt
│ │ │ │ └── dialog
│ │ │ │ └── TimerPickerDialog.kt
│ │ └── AndroidManifest.xml
│ ├── test
│ │ └── java
│ │ │ └── com
│ │ │ └── github
│ │ │ └── muellerma
│ │ │ └── tabletoptools
│ │ │ ├── PrimeFacUnitTest.kt
│ │ │ ├── CharUtilsUnitTest.kt
│ │ │ ├── RandomListTest.kt
│ │ │ └── Rot13UnitTest.kt
│ └── androidTest
│ │ └── java
│ │ └── com
│ │ └── github
│ │ └── muellerma
│ │ └── tabletoptools
│ │ └── ExampleInstrumentedTest.kt
├── proguard-rules.pro
└── build.gradle
├── .idea
├── .name
├── .gitignore
├── codeStyles
│ ├── codeStyleConfig.xml
│ └── Project.xml
├── compiler.xml
├── migrations.xml
├── vcs.xml
└── jarRepositories.xml
├── fastlane
└── metadata
│ └── android
│ ├── zh-CN
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── ja-JP
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── af-ZA
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── ar-SA
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── ca-ES
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── de-DE
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── el-GR
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── en-US
│ ├── title.txt
│ ├── changelogs
│ │ ├── 1.txt
│ │ ├── 11.txt
│ │ ├── 13.txt
│ │ ├── 14.txt
│ │ ├── 2.txt
│ │ ├── 20.txt
│ │ ├── 21.txt
│ │ ├── 23.txt
│ │ ├── 28.txt
│ │ ├── 29.txt
│ │ ├── 16.txt
│ │ ├── 25.txt
│ │ ├── 26.txt
│ │ ├── 30.txt
│ │ ├── 19.txt
│ │ ├── 3.txt
│ │ ├── 8.txt
│ │ ├── 15.txt
│ │ ├── 22.txt
│ │ ├── 24.txt
│ │ ├── 17.txt
│ │ ├── 10.txt
│ │ ├── 12.txt
│ │ ├── 5.txt
│ │ ├── 4.txt
│ │ ├── 7.txt
│ │ ├── 6.txt
│ │ ├── 9.txt
│ │ ├── 18.txt
│ │ └── 27.txt
│ ├── short_description.txt
│ ├── images
│ │ ├── icon.png
│ │ ├── featureGraphic.png
│ │ └── phoneScreenshots
│ │ │ ├── 1.png
│ │ │ ├── 2.png
│ │ │ ├── 3.png
│ │ │ ├── 4.png
│ │ │ ├── 5.png
│ │ │ └── 6.png
│ └── full_description.txt
│ ├── eu-ES
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── fa-IR
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── fi-FI
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── fr-FR
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── he-IL
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── hu-HU
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── id-ID
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── ko-KR
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── nb-NO
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── no-NO
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── pl-PL
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── sr-SP
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── tr-TR
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── uk-UA
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── vi-VN
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── yi-DE
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── zh-TW
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── it-IT
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── nl-NL
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── pt-BR
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── pt-PT
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── ro-RO
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── da-DK
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── ru-RU
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── sv-SE
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ ├── cs-CZ
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
│ └── es-ES
│ ├── title.txt
│ ├── short_description.txt
│ └── full_description.txt
├── settings.gradle
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── SECURITY.md
├── Contributing.md
├── renovate.json
├── .gitignore
├── crowdin.yml
├── .github
├── workflows
│ ├── build.yml
│ └── deploy-apk.yml
└── ISSUE_TEMPLATE
│ ├── feature_request.md
│ └── bug_report.md
├── gradle.properties
├── README.md
└── gradlew.bat
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/.idea/.name:
--------------------------------------------------------------------------------
1 | Tabletop tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/zh-CN/title.txt:
--------------------------------------------------------------------------------
1 | 桌游工具
--------------------------------------------------------------------------------
/fastlane/metadata/android/ja-JP/title.txt:
--------------------------------------------------------------------------------
1 | タブレットツール
--------------------------------------------------------------------------------
/fastlane/metadata/android/af-ZA/title.txt:
--------------------------------------------------------------------------------
1 | Tabletop Tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/ar-SA/title.txt:
--------------------------------------------------------------------------------
1 | أدوات سطح الجدول
--------------------------------------------------------------------------------
/fastlane/metadata/android/ca-ES/title.txt:
--------------------------------------------------------------------------------
1 | Tabletop Tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/de-DE/title.txt:
--------------------------------------------------------------------------------
1 | Tabletop-Tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/el-GR/title.txt:
--------------------------------------------------------------------------------
1 | Εργαλεία Tabletop
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/title.txt:
--------------------------------------------------------------------------------
1 | Tabletop Tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/eu-ES/title.txt:
--------------------------------------------------------------------------------
1 | Tabletop Tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/fa-IR/title.txt:
--------------------------------------------------------------------------------
1 | Tabletop Tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/fi-FI/title.txt:
--------------------------------------------------------------------------------
1 | Taulukon Työkalut
--------------------------------------------------------------------------------
/fastlane/metadata/android/fr-FR/title.txt:
--------------------------------------------------------------------------------
1 | Outils Tabletop
--------------------------------------------------------------------------------
/fastlane/metadata/android/he-IL/title.txt:
--------------------------------------------------------------------------------
1 | Tabletop Tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/hu-HU/title.txt:
--------------------------------------------------------------------------------
1 | Tabletop Tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/id-ID/title.txt:
--------------------------------------------------------------------------------
1 | Tabletop Tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/ko-KR/title.txt:
--------------------------------------------------------------------------------
1 | Tabletop Tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/nb-NO/title.txt:
--------------------------------------------------------------------------------
1 | Tabellop Verktøy
--------------------------------------------------------------------------------
/fastlane/metadata/android/no-NO/title.txt:
--------------------------------------------------------------------------------
1 | Tabletop Tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/pl-PL/title.txt:
--------------------------------------------------------------------------------
1 | Tabletop Tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/sr-SP/title.txt:
--------------------------------------------------------------------------------
1 | Tabletop Tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/tr-TR/title.txt:
--------------------------------------------------------------------------------
1 | Masaüstü Araçları
--------------------------------------------------------------------------------
/fastlane/metadata/android/uk-UA/title.txt:
--------------------------------------------------------------------------------
1 | Настільні засоби
--------------------------------------------------------------------------------
/fastlane/metadata/android/vi-VN/title.txt:
--------------------------------------------------------------------------------
1 | Tabletop Tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/yi-DE/title.txt:
--------------------------------------------------------------------------------
1 | Tabletop Tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/zh-TW/title.txt:
--------------------------------------------------------------------------------
1 | Tabletop Tools
--------------------------------------------------------------------------------
/fastlane/metadata/android/it-IT/title.txt:
--------------------------------------------------------------------------------
1 | Strumenti Da Tavolo
--------------------------------------------------------------------------------
/fastlane/metadata/android/nl-NL/title.txt:
--------------------------------------------------------------------------------
1 | Tools voor bordspellen
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-BR/title.txt:
--------------------------------------------------------------------------------
1 | Ferramentas Tabletop
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-PT/title.txt:
--------------------------------------------------------------------------------
1 | Ferramentas Tabletop
--------------------------------------------------------------------------------
/fastlane/metadata/android/ro-RO/title.txt:
--------------------------------------------------------------------------------
1 | Unelte pentru tablete
--------------------------------------------------------------------------------
/app/src/main/res/resources.properties:
--------------------------------------------------------------------------------
1 | unqualifiedResLocale=en-US
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/da-DK/title.txt:
--------------------------------------------------------------------------------
1 | Værktøjer Til Bordplade
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/1.txt:
--------------------------------------------------------------------------------
1 | Inital release
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ru-RU/title.txt:
--------------------------------------------------------------------------------
1 | Инструменты для настолок
--------------------------------------------------------------------------------
/fastlane/metadata/android/sv-SE/title.txt:
--------------------------------------------------------------------------------
1 | Verktyg för bordsskivor
--------------------------------------------------------------------------------
/fastlane/metadata/android/cs-CZ/title.txt:
--------------------------------------------------------------------------------
1 | Nástroje pro stolní počítače
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/11.txt:
--------------------------------------------------------------------------------
1 | Update translations
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/13.txt:
--------------------------------------------------------------------------------
1 | Minor bug fixes
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/14.txt:
--------------------------------------------------------------------------------
1 | Support Android 13
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/2.txt:
--------------------------------------------------------------------------------
1 | * Add 5 Minute Timer
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/20.txt:
--------------------------------------------------------------------------------
1 | Update translations
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/21.txt:
--------------------------------------------------------------------------------
1 | Update translations
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/23.txt:
--------------------------------------------------------------------------------
1 | Minor improvements
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/28.txt:
--------------------------------------------------------------------------------
1 | Improve counters
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/29.txt:
--------------------------------------------------------------------------------
1 | Update translations
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es-ES/title.txt:
--------------------------------------------------------------------------------
1 | Herramientas para juegos de mesa
--------------------------------------------------------------------------------
/fastlane/metadata/android/zh-CN/short_description.txt:
--------------------------------------------------------------------------------
1 | 用于桌游的实用工具集合
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 | rootProject.name = "Tabletop tools"
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/16.txt:
--------------------------------------------------------------------------------
1 | Implement dynamic colors
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/25.txt:
--------------------------------------------------------------------------------
1 | Prepare for Android 14
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/26.txt:
--------------------------------------------------------------------------------
1 | Add prime factorization
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/30.txt:
--------------------------------------------------------------------------------
1 | Add Frosthaven utils
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/19.txt:
--------------------------------------------------------------------------------
1 | Add setting to keep screen on
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/3.txt:
--------------------------------------------------------------------------------
1 | Add buzzers for two players
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/8.txt:
--------------------------------------------------------------------------------
1 | Use bundled sound for timer
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ja-JP/short_description.txt:
--------------------------------------------------------------------------------
1 | テーブルトップゲーム用の便利なツールコレクション
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/15.txt:
--------------------------------------------------------------------------------
1 | Add ability to select start page
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/22.txt:
--------------------------------------------------------------------------------
1 | Play sound when pressing buzzer
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/24.txt:
--------------------------------------------------------------------------------
1 | Enable per-app language support
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ar-SA/short_description.txt:
--------------------------------------------------------------------------------
1 | مجموعة أدوات مفيدة لألعاب الكمبيوتر
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/17.txt:
--------------------------------------------------------------------------------
1 | Update translations and minor bug fixes
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fi-FI/short_description.txt:
--------------------------------------------------------------------------------
1 | Kätevä työkalu kokoelma pöytäpelejä
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/af-ZA/short_description.txt:
--------------------------------------------------------------------------------
1 | Handy tool collection for tabletop games
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ca-ES/short_description.txt:
--------------------------------------------------------------------------------
1 | Handy tool collection for tabletop games
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/cs-CZ/short_description.txt:
--------------------------------------------------------------------------------
1 | Šikovná sbírka nástrojů pro stolní hry
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/da-DK/short_description.txt:
--------------------------------------------------------------------------------
1 | Handy værktøj samling til bordplade spil
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/10.txt:
--------------------------------------------------------------------------------
1 | Add lockup table for letter <=> position
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/12.txt:
--------------------------------------------------------------------------------
1 | Implement setting to adapt max. dice count
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/short_description.txt:
--------------------------------------------------------------------------------
1 | Handy tool collection for tabletop games
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fa-IR/short_description.txt:
--------------------------------------------------------------------------------
1 | Handy tool collection for tabletop games
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/he-IL/short_description.txt:
--------------------------------------------------------------------------------
1 | Handy tool collection for tabletop games
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/hu-HU/short_description.txt:
--------------------------------------------------------------------------------
1 | Handy tool collection for tabletop games
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/id-ID/short_description.txt:
--------------------------------------------------------------------------------
1 | Handy tool collection for tabletop games
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ko-KR/short_description.txt:
--------------------------------------------------------------------------------
1 | Handy tool collection for tabletop games
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/nb-NO/short_description.txt:
--------------------------------------------------------------------------------
1 | Hånd-verktøysamling for nettbrettspill
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/nl-NL/short_description.txt:
--------------------------------------------------------------------------------
1 | Handige collectie tools voor bordspellen
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/no-NO/short_description.txt:
--------------------------------------------------------------------------------
1 | Handy tool collection for tabletop games
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/sr-SP/short_description.txt:
--------------------------------------------------------------------------------
1 | Handy tool collection for tabletop games
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/vi-VN/short_description.txt:
--------------------------------------------------------------------------------
1 | Handy tool collection for tabletop games
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/yi-DE/short_description.txt:
--------------------------------------------------------------------------------
1 | Handy tool collection for tabletop games
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/zh-TW/short_description.txt:
--------------------------------------------------------------------------------
1 | Handy tool collection for tabletop games
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/de-DE/short_description.txt:
--------------------------------------------------------------------------------
1 | Sammlung nützlicher Tools für Tabletop-Spiele
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pl-PL/short_description.txt:
--------------------------------------------------------------------------------
1 | Poręczny zestaw narzędzi do gier planszowych
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/sv-SE/short_description.txt:
--------------------------------------------------------------------------------
1 | Praktisk verktygskollektion för bordsspel
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/5.txt:
--------------------------------------------------------------------------------
1 | * Make timer configurable
2 | * Add more translations
3 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/eu-ES/short_description.txt:
--------------------------------------------------------------------------------
1 | Tresna erabilgarrien bilduma mahai-jokoetarako
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/it-IT/short_description.txt:
--------------------------------------------------------------------------------
1 | Handy collezione di strumenti per giochi da tavolo
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ru-RU/short_description.txt:
--------------------------------------------------------------------------------
1 | Коллекция удобных инструментов для настольных игр
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/tr-TR/short_description.txt:
--------------------------------------------------------------------------------
1 | Masaüstü oyunlar için kullanışlı araç koleksiyonu
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/uk-UA/short_description.txt:
--------------------------------------------------------------------------------
1 | Колекція зручних інструментів для настільних ігор
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/el-GR/short_description.txt:
--------------------------------------------------------------------------------
1 | Εύχρηστη συλλογή εργαλείων για επιτραπέζια παιχνίδια
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/4.txt:
--------------------------------------------------------------------------------
1 | * Buzzers: Vibrate on press
2 | * Add French translation
3 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fr-FR/short_description.txt:
--------------------------------------------------------------------------------
1 | Collection d'outils pratiques pour les jeux de société
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-PT/short_description.txt:
--------------------------------------------------------------------------------
1 | Coleção de ferramentas úteis para jogos de tabuleiro
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ro-RO/short_description.txt:
--------------------------------------------------------------------------------
1 | Colecție de unelte utilă pentru jocurile cu tabletă
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/7.txt:
--------------------------------------------------------------------------------
1 | * Add slider to increment dice count
2 | * Add German translation
3 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es-ES/short_description.txt:
--------------------------------------------------------------------------------
1 | Una colección de herramientas útiles para juegos de mesa
2 |
--------------------------------------------------------------------------------
/app/src/main/res/raw/beeps.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/app/src/main/res/raw/beeps.mp3
--------------------------------------------------------------------------------
/app/src/main/res/raw/buzzer.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/app/src/main/res/raw/buzzer.mp3
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/6.txt:
--------------------------------------------------------------------------------
1 | * Add a list that can be randomized
2 | * Add Portuguese translation
3 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/9.txt:
--------------------------------------------------------------------------------
1 | * Use Material Design 3
2 | * Allow installation on external storage
3 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-BR/short_description.txt:
--------------------------------------------------------------------------------
1 | Este aplicativo disponibiliza diversas ferramentas uteis para jogos de tabuleiro
2 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/18.txt:
--------------------------------------------------------------------------------
1 | Enhance dice page: More sliders (need to be enabled in settings) and allow negative values
2 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/changelogs/27.txt:
--------------------------------------------------------------------------------
1 | - Add counter
2 | - Utilize multi-window feature of Android to use multiple tools at the same time
3 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/fastlane/metadata/android/en-US/images/icon.png
--------------------------------------------------------------------------------
/app/src/main/res/drawable/navigation_header_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/app/src/main/res/drawable/navigation_header_image.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/featureGraphic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/fastlane/metadata/android/en-US/images/featureGraphic.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mueller-ma/TabletopTools/HEAD/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 | 16dp
3 | 16dp
4 | 176dp
5 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/zh-CN/full_description.txt:
--------------------------------------------------------------------------------
1 | 这个应用为桌面游戏提供了几个简单的工具:
2 | * 骰子 (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://zh.wikipedia.org/wiki/ROT13)
4 | * 数字转换器:十进制 <=> 二进制 <=> 六进制
5 | * 计时器
6 | * 可用于1至4名玩家的蜂鸣器
7 | * 可随机重排的列表
8 |
--------------------------------------------------------------------------------
/SECURITY.md:
--------------------------------------------------------------------------------
1 | # Security Policy
2 |
3 | ## Supported Versions
4 |
5 | Since this is an Android app, only the latest version is supported.
6 |
7 | ## Reporting a Vulnerability
8 |
9 | Please open an issue on GitHub to report a vulnerability.
10 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_buzzers.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ja-JP/full_description.txt:
--------------------------------------------------------------------------------
1 | このアプリは、タブレットゲームに便利なツールをいくつか提供します。
2 | * サイコロ(D3、D4、D6、D8、D10、D12、D20、D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * 数値コンバーター: 10 進法 <=> バイナリ <=> 六進法
5 | * タイマー
6 | * 1 - 4 人のプレイヤーのためのブザー
7 | * ランダム化が可能なリスト
8 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v23/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
4 | networkTimeout=10000
5 | validateDistributionUrl=true
6 | zipStoreBase=GRADLE_USER_HOME
7 | zipStorePath=wrapper/dists
8 |
--------------------------------------------------------------------------------
/.idea/migrations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 |
10 |
--------------------------------------------------------------------------------
/Contributing.md:
--------------------------------------------------------------------------------
1 | # Add new pages
2 |
3 | * Add icon
4 | * Add entry to activity_main_drawer.xml
5 | * Add package
6 | * Add fragment
7 | * Add layout file
8 | * Add entry to mobile_navigation.xml
9 | * Add to `appBarConfiguration` in MainActivity
10 | * Add to Readme.md and fastlane/metadata/android/en-US/full_description.txt
11 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ar-SA/full_description.txt:
--------------------------------------------------------------------------------
1 | يوفر هذا التطبيق بعض الأدوات المفيدة لألعاب سطح الطاولة:
2 | * الأرز (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * محول الرقم: العشري <=> Binary <=> Hexadecimal
5 | * المؤقت
6 | * ألغاز ل 1 - 4 لاعبين
7 | * قائمة يمكن أن تكون عشوائية
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/sv-SE/full_description.txt:
--------------------------------------------------------------------------------
1 | Denna app ger några praktiska verktyg för bordsspel:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Antal omvandlare: Decimal <=> Binär <=> Hexadecimal
5 | * Timer
6 | * Summer för 1 - 4 spelare
7 | * Lista som kan randomiseras
8 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/table_row_border.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/af-ZA/full_description.txt:
--------------------------------------------------------------------------------
1 | This app provides a few handy tools for tabletop games:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Number converter: Decimal <=> Binary <=> Hexadecimal
5 | * Timer
6 | * Buzzers for 1 - 4 players
7 | * List that can be randomized
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ca-ES/full_description.txt:
--------------------------------------------------------------------------------
1 | This app provides a few handy tools for tabletop games:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Number converter: Decimal <=> Binary <=> Hexadecimal
5 | * Timer
6 | * Buzzers for 1 - 4 players
7 | * List that can be randomized
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/full_description.txt:
--------------------------------------------------------------------------------
1 | This app provides a few handy tools for tabletop games:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Number converter: Decimal <=> Binary <=> Hexadecimal
5 | * Timer
6 | * Buzzers for 1 - 4 players
7 | * List that can be randomized
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/eu-ES/full_description.txt:
--------------------------------------------------------------------------------
1 | This app provides a few handy tools for tabletop games:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Number converter: Decimal <=> Binary <=> Hexadecimal
5 | * Timer
6 | * Buzzers for 1 - 4 players
7 | * List that can be randomized
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fa-IR/full_description.txt:
--------------------------------------------------------------------------------
1 | This app provides a few handy tools for tabletop games:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Number converter: Decimal <=> Binary <=> Hexadecimal
5 | * Timer
6 | * Buzzers for 1 - 4 players
7 | * List that can be randomized
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/he-IL/full_description.txt:
--------------------------------------------------------------------------------
1 | This app provides a few handy tools for tabletop games:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Number converter: Decimal <=> Binary <=> Hexadecimal
5 | * Timer
6 | * Buzzers for 1 - 4 players
7 | * List that can be randomized
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/hu-HU/full_description.txt:
--------------------------------------------------------------------------------
1 | This app provides a few handy tools for tabletop games:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Number converter: Decimal <=> Binary <=> Hexadecimal
5 | * Timer
6 | * Buzzers for 1 - 4 players
7 | * List that can be randomized
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/id-ID/full_description.txt:
--------------------------------------------------------------------------------
1 | This app provides a few handy tools for tabletop games:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Number converter: Decimal <=> Binary <=> Hexadecimal
5 | * Timer
6 | * Buzzers for 1 - 4 players
7 | * List that can be randomized
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ko-KR/full_description.txt:
--------------------------------------------------------------------------------
1 | This app provides a few handy tools for tabletop games:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Number converter: Decimal <=> Binary <=> Hexadecimal
5 | * Timer
6 | * Buzzers for 1 - 4 players
7 | * List that can be randomized
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/sr-SP/full_description.txt:
--------------------------------------------------------------------------------
1 | This app provides a few handy tools for tabletop games:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Number converter: Decimal <=> Binary <=> Hexadecimal
5 | * Timer
6 | * Buzzers for 1 - 4 players
7 | * List that can be randomized
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/vi-VN/full_description.txt:
--------------------------------------------------------------------------------
1 | This app provides a few handy tools for tabletop games:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Number converter: Decimal <=> Binary <=> Hexadecimal
5 | * Timer
6 | * Buzzers for 1 - 4 players
7 | * List that can be randomized
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/yi-DE/full_description.txt:
--------------------------------------------------------------------------------
1 | This app provides a few handy tools for tabletop games:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Number converter: Decimal <=> Binary <=> Hexadecimal
5 | * Timer
6 | * Buzzers for 1 - 4 players
7 | * List that can be randomized
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/zh-TW/full_description.txt:
--------------------------------------------------------------------------------
1 | This app provides a few handy tools for tabletop games:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Number converter: Decimal <=> Binary <=> Hexadecimal
5 | * Timer
6 | * Buzzers for 1 - 4 players
7 | * List that can be randomized
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/da-DK/full_description.txt:
--------------------------------------------------------------------------------
1 | Denne app giver et par handy værktøjer til bordplade spil:
2 | * Terning (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Nummerkonverter: Decimal <=> Binary <=> Hexadecimal
5 | * Timer
6 | * Buzzers for 1 - 4 spillere
7 | * Liste som kan randomiseres
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/nb-NO/full_description.txt:
--------------------------------------------------------------------------------
1 | Denne appen tilbyr noen nyttige verktøy for nettbrettspill:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Nummerkonverterer: Desimal<=> Binær <=> Heksadesimal
5 | * Tidtaker
6 | * Bukser for 1 - 4 spillere
7 | * Liste som kan bli randomisert
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/uk-UA/full_description.txt:
--------------------------------------------------------------------------------
1 | Цей застосунок надає кілька зручних засобів для настільних ігор:
2 | * Корм (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Конвертація чисел: десяткові <=> двійкові <=> шістнадцяткові
5 | * Таймер
6 | * Buzzers на 1 - 4 гравці
7 | * Список випадкових значень
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/cs-CZ/full_description.txt:
--------------------------------------------------------------------------------
1 | Tato aplikace poskytuje několik šikovných nástrojů pro stolní hry:
2 | * Barva (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Převodník čísla: desetinný <=> Binární <=> hexadecimální
5 | * Časovač
6 | * Buzzers pro 1 - 4 hráče
7 | * Seznam který může být náhodný
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fi-FI/full_description.txt:
--------------------------------------------------------------------------------
1 | Tämä sovellus tarjoaa muutamia käteviä työkaluja pöytäpeleihin:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Numeromuunnin: Desimaali <=> Binary <=> Hexadecimal
5 | * Ajastin
6 | * Puskurit 1 - 4 pelaajalle
7 | * Luettelo joka voidaan satunnaisesti
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/it-IT/full_description.txt:
--------------------------------------------------------------------------------
1 | Questa app fornisce alcuni strumenti utili per i giochi da tavolo:
2 | * Dadi (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Convertitore di numeri: Decimale <=> Binario <=> Esadecimale
5 | * Timer
6 | * Buzzer per 1 - 4 giocatori
7 | * Elenco che può essere casuale
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/nl-NL/full_description.txt:
--------------------------------------------------------------------------------
1 | Deze app biedt een paar handige tools voor bordspellen:
2 | * Dobbelsteen (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Getallen omzetten: Decimaal <=> Binair <=> Hexadecimaal
5 | * 5 Minuten Timer
6 | * Buzzers voor twee spelers
7 | * Lijst die kan worden geschud
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/de-DE/full_description.txt:
--------------------------------------------------------------------------------
1 | Diese App bietet eine Sammlung nützlicher Tools für Tabletop-Spiele:
2 | * Würfel (W3, W4, W6, W8, W10, W12, W20, W100)
3 | * [ROT13](https://de.wikipedia.org/wiki/ROT13)
4 | * Zahlenkonverter: Dezimal <=> Binär <=> Hexadezimal
5 | * Timer
6 | * Buzzers für 1 - 4 Spieler
7 | * Liste, die zufällig sortiert werden kann
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ro-RO/full_description.txt:
--------------------------------------------------------------------------------
1 | Această aplicație oferă câteva unelte utile pentru jocurile cu tablete:
2 | * Șoareci (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Convertor de numere: zecimal <=> Binar <=> Hexadecimal
5 | * Cronometru
6 | * Zvonuri pentru 1 - 4 jucători
7 | * Lista care poate fi randomizat
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/tr-TR/full_description.txt:
--------------------------------------------------------------------------------
1 | Bu uygulama masaüstü oyunlar için birkaç kullanışlı araçlar sağlamaktadır:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Sayı dönüştürücü: Ondalık <=> İkili <=> Onaltılık
5 | * Zamanlayıcı
6 | * 1 - 4 oyuncu için sesli uyarı
7 | * Rastgele hale getirilebilen liste
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/el-GR/full_description.txt:
--------------------------------------------------------------------------------
1 | Αυτή η εφαρμογή παρέχει μερικά εύχρηστα εργαλεία για επιτραπέζια παιχνίδια:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Μετατροπέας αριθμών: Δεκαδικός <=> Δυαδικό <=> Hexadecimal
5 | * Χρονόμετρο
6 | * Buzzers για 1 - 4 παίκτες
7 | * Λίστα που μπορεί να τυχαιοποιηθεί
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pl-PL/full_description.txt:
--------------------------------------------------------------------------------
1 | Ta aplikacja zapewnia kilka poręcznych narzędzi do gier planszowych:
2 | * Kości (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Konwertowanie liczb: Dziesiątkowe <=> Binarne <=> Szesnastkowe
5 | * Minutnik
6 | * Brzęczyki (buzzers) dla 1 - 4 graczy
7 | * Lista, którą można wymieszać
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fr-FR/full_description.txt:
--------------------------------------------------------------------------------
1 | Cette application fournit quelques outils pratiques pour les jeux de société :
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://fr.wikipedia.org/wiki/ROT13)
4 | * Convertisseur de nombres: Décimal <=> Binaire <=> Hexadécimal
5 | * Minuteur - 5 min
6 | * Buzzer pour 2 joueurs
7 | * Liste qui peut être randomisée
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/no-NO/full_description.txt:
--------------------------------------------------------------------------------
1 | This app provides a few handy tools for tabletop games:
2 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [Rot13](https://en.wikipedia.org/wiki/ROT13)
4 | * Number converter: Decimal <=> Binary <=> Hexadecimal
5 | * Timer
6 | * Buzzers for 1 - 4 players
7 | * List that can be randomized
8 |
9 | More tools are planned.
10 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-PT/full_description.txt:
--------------------------------------------------------------------------------
1 | Este aplicativo fornece algumas ferramentas úteis para jogos de tabletop:
2 | * Dados (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Conversor de números: Número decimal <=> Binário <=> Hexadecimal
5 | * Temporizador
6 | * Buzzers para 1 a 4 jogadores
7 | * Lista que pode ser randomizada
8 |
--------------------------------------------------------------------------------
/renovate.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3 | "extends": [
4 | "config:recommended",
5 | ":dependencyDashboardApproval"
6 | ],
7 | "configMigration": true,
8 | "minimumReleaseAge": "7 days",
9 | "addLabels": [
10 | "renovate"
11 | ],
12 | "dependencyDashboardLabels": [
13 | "renovate"
14 | ]
15 | }
16 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es-ES/full_description.txt:
--------------------------------------------------------------------------------
1 | Esta app cuenta con varias herramientas útiles para juegos de mesa:
2 | * Dado (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://es.wikipedia.org/wiki/ROT13)
4 | * Conversor de números: Decimal <=> Binario <=> Hexadecimal
5 | * Temporizador de 5 minutos
6 | * Zumbadores para dos jugadores
7 | * Lista que puede ser aleatorizada
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ru-RU/full_description.txt:
--------------------------------------------------------------------------------
1 | Это приложение предоставляет несколько удобных инструментов для настольных игр:
2 | * Кубик (3, 4, 6, 8, 10, 12, 20, 100) граней
3 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
4 | * Конвертер чисел: десятичные <=> двоичные <=> шестнадцатеричные
5 | * Таймер
6 | * Зуммеры для 1 - 4 игроков
7 | * Список, который может быть рандомизирован
8 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-BR/full_description.txt:
--------------------------------------------------------------------------------
1 | Este aplicativo disponibiliza diversas ferramentas uteis para jogos de tabuleiro:
2 | * Dados (D3, D4, D6, D8, D10, D12, D20, D100)
3 | * [ROT13](https://pt.wikipedia.org/wiki/ROT13)
4 | * Conversor numérico: Decimal <=> Binário <=> Hexadecimal
5 | * Timer de 5 minutos
6 | * Campainha para dos jogadores
7 | * Lista que pode ser aleatorizada
8 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FF6200EE
4 | #FF3700B3
5 | #FF03DAC5
6 | #FF018786
7 | #FFFFFFFF
8 | #042570
9 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/assetWizardSettings.xml
5 | /.idea/caches
6 | /.idea/deploymentTargetDropDown.xml
7 | /.idea/gradle.xml
8 | /.idea/libraries
9 | /.idea/misc.xml
10 | /.idea/modules.xml
11 | /.idea/navEditor.xml
12 | /.idea/workspace.xml
13 | /.idea/kotlinc.xml
14 | .DS_Store
15 | /build
16 | /captures
17 | .externalNativeBuild
18 | .cxx
19 | local.properties
20 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_timer.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/baseline_exposure_plus_1_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/codeStyles/Project.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_keep_screen_on.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_division.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/crowdin.yml:
--------------------------------------------------------------------------------
1 | files:
2 | - source: /app/src/main/res/values/strings.xml
3 | translation: /app/src/main/res/values-%two_letters_code%/strings.xml
4 | translate_attributes: 0
5 | content_segmentation: 0
6 | languages_mapping:
7 | two_letters_code:
8 | pt-BR: pt-rBR
9 | zh-CN: zh-rCN
10 | he: iw
11 | id: in
12 | yi: ji
13 | - source: /fastlane/metadata/android/en-US/*.txt
14 | translation: /fastlane/metadata/android/%locale%/%original_file_name%
15 |
--------------------------------------------------------------------------------
/app/src/main/java/com/github/muellerma/tabletoptools/utils/TextUtils.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools.utils
2 |
3 | fun Char.isLatinLetter(): Boolean {
4 | return this in 'A'..'Z' || this in 'a'..'z'
5 | }
6 |
7 | fun Char.positionInAlphabet(): Int {
8 | if (this in 'A'..'Z') {
9 | return code - 64
10 | }
11 | if (this in 'a'..'z') {
12 | return code - 96
13 | }
14 |
15 | return -1
16 | }
17 |
18 | fun Int.toStringWithSign() = if (this >= 0) "+$this" else "$this"
19 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_baseline_delete_outline_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/java/com/github/muellerma/tabletoptools/TableTopToolsApp.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools
2 |
3 | import android.app.Application
4 | import androidx.preference.PreferenceManager
5 | import com.google.android.material.color.DynamicColors
6 |
7 | class TableTopToolsApp: Application() {
8 | override fun onCreate() {
9 | super.onCreate()
10 | DynamicColors.applyToActivitiesIfAvailable(this)
11 | PreferenceManager.setDefaultValues(this, R.xml.pref_main, false)
12 | }
13 | }
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_radio_button_unchecked.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: Build App
2 |
3 | on: [push, pull_request]
4 |
5 | permissions: {}
6 |
7 | jobs:
8 | build:
9 | runs-on: ubuntu-latest
10 |
11 | steps:
12 | - uses: actions/checkout@v4
13 |
14 | - name: Setup Java
15 | uses: actions/setup-java@v4
16 | with:
17 | distribution: 'adopt'
18 | java-version: 17
19 |
20 | - name: Validate Gradle Wrapper
21 | uses: gradle/wrapper-validation-action@v2.0.0
22 |
23 | - name: Build
24 | run: bash gradlew build
25 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_brightness_low.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/lock_open_outline.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_menu_number_converter.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_outline_text_rotation_angleup.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dice.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
13 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_brightness_high.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/test/java/com/github/muellerma/tabletoptools/PrimeFacUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools
2 |
3 | import com.github.muellerma.tabletoptools.ui.fragments.PrimeFacFragment
4 | import org.junit.Assert.assertEquals
5 | import org.junit.Test
6 |
7 | class PrimeFacUnitTest {
8 | @Test
9 | fun testFactor() {
10 | assertEquals(arrayListOf(1), PrimeFacFragment.factor(1))
11 | assertEquals(arrayListOf(2, 2), PrimeFacFragment.factor(4))
12 | assertEquals(arrayListOf(2, 5), PrimeFacFragment.factor(10))
13 | assertEquals(arrayListOf(2, 3, 5), PrimeFacFragment.factor(30))
14 | }
15 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/github/muellerma/tabletoptools/ui/SecondInstance.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools.ui
2 |
3 | import android.content.Intent
4 | import android.os.Bundle
5 | import androidx.appcompat.app.AppCompatActivity
6 | import com.github.muellerma.tabletoptools.R
7 | import com.github.muellerma.tabletoptools.utils.showToast
8 |
9 | class SecondInstance : AppCompatActivity() {
10 | override fun onCreate(savedInstanceState: Bundle?) {
11 | super.onCreate(savedInstanceState)
12 | showToast(R.string.second_instance_hint)
13 | startActivity(Intent(this, MainActivity::class.java))
14 | }
15 | }
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_baseline_sort_by_alpha_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_baseline_timer_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/values-no/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_random_list.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_alphabetical_variant_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: enhancement
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 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_baseline_format_list_bulleted_24.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/values-af/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/values-fa/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/values-in/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/values-ji/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/values-ko/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/values-sr/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/values-vi/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/values-zh/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: bug
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 | **Device (please complete the following information):**
27 | - Device: [e.g. Pixel 3]
28 | - Android version: [e.g. 11]
29 |
30 | **Additional context**
31 | Add any other context about the problem here.
32 |
--------------------------------------------------------------------------------
/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 | -dontobfuscate
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/github/muellerma/tabletoptools/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools
2 |
3 | import androidx.test.platform.app.InstrumentationRegistry
4 | import androidx.test.ext.junit.runners.AndroidJUnit4
5 |
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | import org.junit.Assert.*
10 |
11 | /**
12 | * Instrumented test, which will execute on an Android device.
13 | *
14 | * See [testing documentation](http://d.android.com/tools/testing).
15 | */
16 | @RunWith(AndroidJUnit4::class)
17 | class ExampleInstrumentedTest {
18 | @Test
19 | fun useAppContext() {
20 | // Context of the app under test.
21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext
22 | assertEquals("com.github.muellerma.tabletoptools", appContext.packageName)
23 | }
24 | }
--------------------------------------------------------------------------------
/app/src/main/res/values-en/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/snowflake.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values-hu/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Beállítások
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | Beállítások
20 |
21 | Nem található böngésző
22 |
23 |
--------------------------------------------------------------------------------
/app/src/main/res/values-ca/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Configuració
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | Configuració
20 |
21 | No s\'ha trobat cap navegador
22 |
23 |
--------------------------------------------------------------------------------
/app/src/main/res/values-iw/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | הגדרות
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 | כללי
20 | הגדרות
21 |
22 | לא נמצא דפדפן
23 |
24 |
--------------------------------------------------------------------------------
/app/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
15 |
16 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_menu_dice.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/app_bar_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
12 |
13 |
17 |
18 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/alphabet_table_row.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
15 |
16 |
23 |
24 |
--------------------------------------------------------------------------------
/app/src/test/java/com/github/muellerma/tabletoptools/CharUtilsUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools
2 |
3 | import com.github.muellerma.tabletoptools.utils.isLatinLetter
4 | import com.github.muellerma.tabletoptools.utils.positionInAlphabet
5 | import org.junit.Test
6 |
7 | import org.junit.Assert.*
8 |
9 | class CharUtilsUnitTest {
10 | @Test
11 | fun testLatinLetterCheck() {
12 | assertTrue('a'.isLatinLetter())
13 | assertTrue('z'.isLatinLetter())
14 | assertTrue('A'.isLatinLetter())
15 | assertTrue('Z'.isLatinLetter())
16 | assertFalse('Ä'.isLatinLetter())
17 | assertFalse('é'.isLatinLetter())
18 | }
19 |
20 | @Test
21 | fun testPositionInAlphabet() {
22 | assertEquals('A'.positionInAlphabet(), 1)
23 | assertEquals('B'.positionInAlphabet(), 2)
24 | assertEquals('Z'.positionInAlphabet(), 26)
25 | assertEquals('a'.positionInAlphabet(), 1)
26 | assertEquals('b'.positionInAlphabet(), 2)
27 | assertEquals('z'.positionInAlphabet(), 26)
28 | }
29 | }
--------------------------------------------------------------------------------
/app/src/main/res/layout/content_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
20 |
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
15 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_counter.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/wb_incandescent_48px.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/nav_header_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
14 |
15 |
25 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
16 |
17 |
25 |
--------------------------------------------------------------------------------
/app/src/main/java/com/github/muellerma/tabletoptools/utils/ShortcutManager.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools.utils
2 |
3 | import android.content.Context
4 | import android.content.Intent
5 | import android.os.Build
6 | import androidx.core.content.pm.ShortcutInfoCompat
7 | import androidx.core.content.pm.ShortcutManagerCompat
8 | import androidx.core.graphics.drawable.IconCompat
9 | import com.github.muellerma.tabletoptools.R
10 | import com.github.muellerma.tabletoptools.ui.SecondInstance
11 |
12 | fun Context.createShortcuts() {
13 | val intent = Intent(this, SecondInstance::class.java)
14 | .setAction(Intent.ACTION_VIEW)
15 | .setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
16 | val info = ShortcutInfoCompat.Builder(this, "second_instance")
17 | .setIntent(intent)
18 | .setShortLabel(getString(R.string.second_instance))
19 | .setLongLabel(getString(R.string.second_instance))
20 | .setIcon(IconCompat.createWithResource(this, R.mipmap.ic_launcher))
21 | .setAlwaysBadged()
22 | .build()
23 |
24 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
25 | ShortcutManagerCompat.addDynamicShortcuts(this, listOf(info))
26 | }
27 | }
28 |
29 |
--------------------------------------------------------------------------------
/app/src/test/java/com/github/muellerma/tabletoptools/RandomListTest.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools
2 |
3 | import com.github.muellerma.tabletoptools.ui.fragments.RandomListFragment
4 | import org.junit.Assert.assertEquals
5 | import org.junit.Assert.assertTrue
6 | import org.junit.Test
7 |
8 | class RandomListTest {
9 | @Test
10 | fun testRandomizeList() {
11 | val list = RandomListFragment.randomizeList("foo\nbar\n\n \n foobar \n")
12 | .split("\n")
13 |
14 | assertEquals(3, list.size)
15 | assertTrue("foo" in list)
16 | assertTrue("bar" in list)
17 | assertTrue("foobar" in list)
18 | }
19 |
20 | @Test
21 | fun testRandomizeListOneElement() {
22 | val list = RandomListFragment.randomizeList("foo")
23 | .split("\n")
24 |
25 | assertEquals(1, list.size)
26 | assertTrue("foo" in list)
27 | }
28 |
29 | @Test
30 | fun testSortList() {
31 | val list = RandomListFragment.sortList("foo\nbar\n\n \n foobar \n")
32 | .split("\n")
33 |
34 | assertEquals(3, list.size)
35 | assertTrue(list[0] == "bar")
36 | assertTrue(list[1] == "foo")
37 | assertTrue(list[2] == "foobar")
38 | }
39 | }
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app"s APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | # Automatically convert third-party libraries to use AndroidX
19 | android.enableJetifier=true
20 | # Kotlin code style for this project: "official" or "obsolete":
21 | kotlin.code.style=official
22 | android.defaults.buildfeatures.buildconfig=true
23 | android.nonTransitiveRClass=false
24 | android.nonFinalResIds=false
--------------------------------------------------------------------------------
/.idea/jarRepositories.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/.github/workflows/deploy-apk.yml:
--------------------------------------------------------------------------------
1 | name: Deploy APK on GitHub
2 |
3 | on:
4 | release:
5 | types:
6 | - created
7 |
8 | permissions:
9 | contents: write
10 |
11 | jobs:
12 | build:
13 | runs-on: ubuntu-latest
14 |
15 | steps:
16 | - uses: actions/checkout@v4
17 |
18 | - name: Setup Java
19 | uses: actions/setup-java@v4
20 | with:
21 | distribution: 'adopt'
22 | java-version: 17
23 |
24 | - name: Validate Gradle Wrapper
25 | uses: gradle/wrapper-validation-action@v2.0.0
26 |
27 | - name: Build APK
28 | run: bash gradlew app:assembleRelease
29 |
30 | - uses: r0adkll/sign-android-release@v1.0.4
31 | name: Sign APK
32 | id: sign_app
33 | with:
34 | releaseDirectory: app/build/outputs/apk/release
35 | signingKeyBase64: ${{ secrets.SIGNING_KEY }}
36 | alias: "key0"
37 | keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
38 | keyPassword: ${{ secrets.KEY_PASSWORD }}
39 | env:
40 | BUILD_TOOLS_VERSION: "34.0.0"
41 |
42 | - uses: svenstaro/upload-release-action@v2
43 | name: Upload APK
44 | with:
45 | file: ${{steps.sign_app.outputs.signedReleaseFile}}
46 | asset_name: tabletop_tools.apk
47 | tag: ${{ github.ref }}
48 | repo_token: ${{ secrets.GITHUB_TOKEN }}
49 |
--------------------------------------------------------------------------------
/app/src/main/java/com/github/muellerma/tabletoptools/utils/ExtensionFunctions.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools.utils
2 |
3 | import android.content.ActivityNotFoundException
4 | import android.content.Context
5 | import android.content.Intent
6 | import android.net.Uri
7 | import android.os.Build
8 | import android.os.Bundle
9 | import android.util.Log
10 | import android.widget.Toast
11 | import androidx.annotation.StringRes
12 | import com.github.muellerma.tabletoptools.R
13 |
14 | private const val TAG = "ExtensionFunctions"
15 |
16 | inline fun Bundle.parcelable(key: String): T? = when {
17 | Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> getParcelable(key, T::class.java)
18 | else -> @Suppress("DEPRECATION") getParcelable(key) as? T
19 | }
20 |
21 | fun String.openInBrowser(context: Context) {
22 | val intent = Intent(Intent.ACTION_VIEW, Uri.parse(this))
23 | try {
24 | context.startActivity(intent)
25 | } catch (e: ActivityNotFoundException) {
26 | Log.d(TAG, "Unable to open url in browser: $intent")
27 | context.showToast(R.string.error_no_browser_found)
28 | }
29 | }
30 |
31 | fun Context.showToast(@StringRes msg: Int) {
32 | Toast
33 | .makeText(this, msg, Toast.LENGTH_SHORT)
34 | .show()
35 | }
36 |
37 | fun Context.showToast(msg: String) {
38 | Toast
39 | .makeText(this, msg, Toast.LENGTH_SHORT)
40 | .show()
41 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/github/muellerma/tabletoptools/ui/fragments/FrosthavenFragment.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools.ui.fragments
2 |
3 | import android.os.Bundle
4 | import android.view.LayoutInflater
5 | import android.view.View
6 | import android.view.ViewGroup
7 | import androidx.core.widget.addTextChangedListener
8 | import com.github.muellerma.tabletoptools.R
9 | import com.github.muellerma.tabletoptools.databinding.FragmentFrosthavenBinding
10 | import kotlin.math.ceil
11 |
12 |
13 | class FrosthavenFragment : AbstractBaseFragment() {
14 | private lateinit var binding: FragmentFrosthavenBinding
15 |
16 | override fun onCreateView(
17 | inflater: LayoutInflater,
18 | container: ViewGroup?,
19 | savedInstanceState: Bundle?
20 | ): View {
21 | binding = FragmentFrosthavenBinding.inflate(inflater, container, false)
22 | setupScreenOn(binding.root)
23 |
24 | binding.scenarioLevelInput.addTextChangedListener {
25 | binding.scenarioLevelOutput.text =
26 | getString(R.string.frosthaven_scenario_level_out, calculateScenarioLevel(it.toString()))
27 | }
28 |
29 | return binding.root
30 | }
31 |
32 | companion object {
33 | private fun calculateScenarioLevel(characterLevels: String): Int {
34 | val avg = "\\d+".toRegex().findAll(characterLevels).map { it.value.toInt() }.average()
35 | return ceil(avg / 2).toInt()
36 | }
37 | }
38 | }
--------------------------------------------------------------------------------
/app/src/main/res/values-eu/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Mahai-jokoetarako tresnak
5 | Tresna erabilgarrien bilduma mahai-jokoetarako
6 | Ezarpenak
7 |
8 | ROT13
9 | Ezin izan da automatikoki txandakatu
10 | Automatikoki txandakatu
11 |
12 | -1
13 | +1
14 | -10
15 | +10
16 |
17 |
18 |
19 | Zenbaki osoa zenbaki lehenen faktorizaziorako
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | Ezarpenak
30 |
31 |
32 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
6 |
10 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/java/com/github/muellerma/tabletoptools/ui/fragments/AlphabetFragment.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools.ui.fragments
2 |
3 | import android.annotation.SuppressLint
4 | import android.os.Bundle
5 | import android.view.LayoutInflater
6 | import android.view.View
7 | import android.view.ViewGroup
8 | import com.github.muellerma.tabletoptools.databinding.AlphabetTableRowBinding
9 | import com.github.muellerma.tabletoptools.databinding.FragmentAlphabetBinding
10 | import com.github.muellerma.tabletoptools.utils.positionInAlphabet
11 |
12 | class AlphabetFragment : AbstractBaseFragment() {
13 | private lateinit var binding: FragmentAlphabetBinding
14 |
15 | override fun onCreateView(
16 | inflater: LayoutInflater,
17 | container: ViewGroup?,
18 | savedInstanceState: Bundle?
19 | ): View {
20 | binding = FragmentAlphabetBinding.inflate(inflater, container, false)
21 |
22 | ('A'..'Z').forEach { letter ->
23 | @SuppressLint("InflateParams") // View is set as child below
24 | val row = AlphabetTableRowBinding.inflate(inflater)
25 | val letterLabel = row.alphabetTableRowLetter
26 | val numberLabel = row.alphabetTableRowNumber
27 | letterLabel.text = letter.toString()
28 | numberLabel.text = letter.positionInAlphabet().toString()
29 |
30 | binding.alphabetTable.addView(row.root)
31 | }
32 |
33 | setupScreenOn(binding.root)
34 |
35 | return binding.root
36 | }
37 |
38 | companion object {
39 | private var TAG = AlphabetFragment::class.java.simpleName
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/app/src/main/res/values/array.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | - 10
5 | - 20
6 | - 50
7 | - 100
8 | - 500
9 |
10 |
11 | - @string/menu_dice
12 | - @string/menu_counter
13 | - @string/menu_random_list
14 | - @string/menu_rot13
15 | - @string/menu_alphabet
16 | - @string/menu_number_converter
17 | - @string/menu_prime_fac
18 | - @string/menu_timer
19 | - @string/menu_buzzers
20 |
21 |
22 | - @string/menu_dice_value
23 | - @string/menu_counter_value
24 | - @string/menu_random_list_value
25 | - @string/menu_rot13_value
26 | - @string/menu_alphabet_value
27 | - @string/menu_number_converter_value
28 | - @string/menu_prime_fac_value
29 | - @string/menu_timer_value
30 | - @string/menu_buzzers_value
31 |
32 |
33 |
34 | - @string/buzzer_sound_none
35 | - @string/buzzer_sound_buzzer
36 |
37 |
38 | - none
39 | - buzzer
40 |
41 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_alphabet.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
15 |
18 |
25 |
26 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/app/src/test/java/com/github/muellerma/tabletoptools/Rot13UnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools
2 |
3 | import com.github.muellerma.tabletoptools.ui.fragments.Rot13Fragment
4 | import org.junit.Assert.assertEquals
5 | import org.junit.Test
6 |
7 | class Rot13UnitTest {
8 | @Test
9 | fun testRotateUpper() {
10 | assertEquals('A', Rot13Fragment.rotateChar('A', 0))
11 | assertEquals('B', Rot13Fragment.rotateChar('A', 1))
12 | assertEquals('C', Rot13Fragment.rotateChar('A', 2))
13 | assertEquals('N', Rot13Fragment.rotateChar('A', 13))
14 | assertEquals('Z', Rot13Fragment.rotateChar('A', 25))
15 | assertEquals('A', Rot13Fragment.rotateChar('A', 26))
16 | }
17 |
18 | @Test
19 | fun testRotateLower() {
20 | assertEquals('a', Rot13Fragment.rotateChar('a', 0))
21 | assertEquals('b', Rot13Fragment.rotateChar('a', 1))
22 | assertEquals('c', Rot13Fragment.rotateChar('a', 2))
23 | assertEquals('n', Rot13Fragment.rotateChar('a', 13))
24 | assertEquals('z', Rot13Fragment.rotateChar('a', 25))
25 | assertEquals('a', Rot13Fragment.rotateChar('a', 26))
26 | }
27 |
28 | @Test
29 | fun testRotateNonLetters() {
30 | assertEquals('0', Rot13Fragment.rotateChar('0', 42))
31 | assertEquals('1', Rot13Fragment.rotateChar('1', 42))
32 | assertEquals(' ', Rot13Fragment.rotateChar(' ', 42))
33 | assertEquals('!', Rot13Fragment.rotateChar('!', 42))
34 | assertEquals('.', Rot13Fragment.rotateChar('.', 42))
35 | }
36 |
37 | @Test
38 | fun testRotateNonLatinLetters() {
39 | assertEquals('Ä', Rot13Fragment.rotateChar('Ä', 42))
40 | assertEquals('é', Rot13Fragment.rotateChar('é', 42))
41 | }
42 |
43 | @Test
44 | fun testRotateString() {
45 | assertEquals("Unyyb", Rot13Fragment.rotateString("Hallo", 13))
46 | assertEquals("Unyyb sbb", Rot13Fragment.rotateString("Hallo foo", 13))
47 | }
48 | }
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_outline_settings_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_prime_fac.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
14 |
15 |
31 |
32 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/pref_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
12 |
13 |
14 |
21 |
26 |
31 |
32 |
33 |
40 |
41 |
42 |
45 |
46 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Tabletop Tools
2 |
3 | [](https://github.com/mueller-ma/TabletopTools/actions/workflows/build.yml)
4 | [](https://www.codefactor.io/repository/github/mueller-ma/tabletoptools)
5 | [](https://crowdin.com/project/tabletop-tools)
6 |
7 | This Android app provides a few handy tools for tabletop games:
8 | * Dice (D3, D4, D6, D8, D10, D12, D20, D100)
9 | * [ROT13](https://en.wikipedia.org/wiki/ROT13)
10 | * Number converter: Decimal <=> Binary <=> Hexadecimal
11 | * Timer
12 | * Buzzers for 1 - 4 players
13 | * List that can be randomized
14 |
15 | [
](https://f-droid.org/de/packages/com.github.muellerma.tabletoptools/)[
](https://github.com/mueller-ma/TabletopTools/releases)
16 |
17 |
18 |
19 | ## Translations
20 |
21 | App strings and the app store description can be translated via Crowdin: https://crowdin.com/project/tabletop-tools
22 | For the automatic rotation detection in ROT13 you need to manually copy [this file](https://github.com/mueller-ma/TabletopTools/blob/main/app/src/main/res/values/common_words.xml) and commit it.
23 | Crowdin doesn't handle this string array well.
24 |
25 | To request a new language, please [poke me on Crowdin](https://crowdin.com/profile/mueller-ma) or open an issue here on GitHub.
26 |
27 | ## Credits
28 |
29 | * Feature graphic by https://unsplash.com/@accrualbowtie
30 | * Some icons by Google and https://materialdesignicons.com/
31 | * Sound for the timer by https://soundbible.com/
32 | * Sound for buzzer by https://mixkit.co
33 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_random_list.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
13 |
14 |
32 |
33 |
45 |
46 |
--------------------------------------------------------------------------------
/app/src/main/java/com/github/muellerma/tabletoptools/ui/fragments/CounterFragment.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools.ui.fragments
2 |
3 | import android.os.Bundle
4 | import android.view.LayoutInflater
5 | import android.view.View
6 | import android.view.ViewGroup
7 | import androidx.core.widget.doOnTextChanged
8 | import com.github.muellerma.tabletoptools.databinding.CounterBinding
9 | import com.github.muellerma.tabletoptools.databinding.FragmentCounterBinding
10 |
11 |
12 | class CounterFragment : AbstractBaseFragment() {
13 | private lateinit var binding: FragmentCounterBinding
14 |
15 | override fun onCreateView(
16 | inflater: LayoutInflater,
17 | container: ViewGroup?,
18 | savedInstanceState: Bundle?
19 | ): View {
20 | binding = FragmentCounterBinding.inflate(inflater, container, false)
21 |
22 | setupScreenOn(binding.root)
23 |
24 | return binding.root
25 | }
26 |
27 | override fun onResume() {
28 | super.onResume()
29 |
30 | listOf(
31 | binding.counter1,
32 | binding.counter2,
33 | binding.counter3,
34 | binding.counter4,
35 | binding.counter5,
36 | binding.counter6,
37 | binding.counter7,
38 | binding.counter8
39 | ).forEachIndexed { index, counterBinding ->
40 | setupCounter(index + 1, counterBinding)
41 | }
42 | }
43 |
44 | private fun setupCounter(id: Int, counter: CounterBinding) {
45 | fun getInput() = counter.count.text.toString().toIntOrNull() ?: 0
46 |
47 | counter.less1.setOnClickListener {
48 | counter.count.setText(getInput().dec().toString())
49 | }
50 | counter.less10.setOnClickListener {
51 | counter.count.setText(getInput().minus(10).toString())
52 | }
53 | counter.more1.setOnClickListener {
54 | counter.count.setText(getInput().inc().toString())
55 | }
56 | counter.more10.setOnClickListener {
57 | counter.count.setText(getInput().plus(10).toString())
58 | }
59 |
60 | val prefs = prefs.Counter(id)
61 | counter.label.setText(prefs.label)
62 | counter.label.doOnTextChanged { text, _, _, _ -> prefs.label = text?.toString() }
63 |
64 | counter.count.setText(prefs.count.toString())
65 | counter.count.doOnTextChanged { _, _, _, _ -> prefs.count = getInput() }
66 | }
67 | }
68 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/activity_main_drawer.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/dialog_count_down_picker.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
20 |
21 |
27 |
28 |
32 |
33 |
34 |
40 |
41 |
47 |
48 |
52 |
53 |
54 |
55 |
56 |
61 |
62 |
--------------------------------------------------------------------------------
/app/src/main/java/com/github/muellerma/tabletoptools/ui/fragments/PrimeFacFragment.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools.ui.fragments
2 |
3 | import android.os.Bundle
4 | import android.text.Editable
5 | import android.text.TextWatcher
6 | import android.util.Log
7 | import android.view.LayoutInflater
8 | import android.view.View
9 | import android.view.ViewGroup
10 | import android.widget.EditText
11 | import androidx.annotation.VisibleForTesting
12 | import com.github.muellerma.tabletoptools.databinding.FragmentPrimeFacBinding
13 | import kotlin.math.sqrt
14 |
15 |
16 | class PrimeFacFragment : AbstractBaseFragment(), TextWatcher {
17 | private lateinit var binding: FragmentPrimeFacBinding
18 | private lateinit var input: EditText
19 |
20 | override fun onCreateView(
21 | inflater: LayoutInflater,
22 | container: ViewGroup?,
23 | savedInstanceState: Bundle?
24 | ): View {
25 | Log.d(TAG, "onCreateView()")
26 | binding = FragmentPrimeFacBinding.inflate(inflater, container, false)
27 |
28 | input = binding.input
29 |
30 | input.addTextChangedListener(this)
31 |
32 | val savedInput = savedInstanceState?.getCharSequence("input")?.toString().orEmpty()
33 | input.setText(savedInput)
34 |
35 | setupScreenOn(binding.root)
36 |
37 | return binding.root
38 | }
39 |
40 | override fun onSaveInstanceState(outState: Bundle) {
41 | outState.putCharSequence("input", input.text)
42 | super.onSaveInstanceState(outState)
43 | }
44 |
45 | override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
46 | // no-op
47 | }
48 |
49 | override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
50 | // no-op
51 | }
52 |
53 | override fun afterTextChanged(s: Editable?) {
54 | val input = input.text.toString().toIntOrNull()
55 | val output = if (input == null) {
56 | ""
57 | } else {
58 | factor(input).joinToString(", ")
59 | }
60 | binding.result.text = output
61 | }
62 |
63 | companion object {
64 | private var TAG = PrimeFacFragment::class.java.simpleName
65 |
66 | @VisibleForTesting
67 | fun factor(num: Int): ArrayList {
68 | val array = ArrayList()
69 | var x = num
70 | var i = 2
71 | while (i <= sqrt(x.toDouble())) {
72 | while (x % i == 0) {
73 | array.add(i)
74 | x /= i
75 | }
76 | i++
77 | }
78 | if (x != 1 || num == 1) {
79 | array.add(x)
80 | }
81 | return array
82 | }
83 | }
84 | }
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | ext.androidx_navigation_version = "2.8.1"
3 | ext.androidx_lifecycle_version = "2.8.6"
4 | }
5 |
6 | plugins {
7 | id "com.android.application"
8 | id "kotlin-android"
9 | id "kotlin-parcelize"
10 | id "com.mikepenz.aboutlibraries.plugin"
11 | }
12 |
13 | android {
14 | namespace 'com.github.muellerma.tabletoptools'
15 |
16 | defaultConfig {
17 | applicationId "com.github.muellerma.tabletoptools"
18 | minSdkVersion 21
19 | targetSdkVersion 34
20 | compileSdk 34
21 | versionCode 30
22 | versionName "1.29"
23 |
24 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
25 | }
26 |
27 | buildTypes {
28 | release {
29 | minifyEnabled true
30 | shrinkResources true
31 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
32 | }
33 | debug {
34 | applicationIdSuffix ".debug"
35 | }
36 | }
37 | compileOptions {
38 | sourceCompatibility JavaVersion.VERSION_17
39 | targetCompatibility JavaVersion.VERSION_17
40 | }
41 | kotlinOptions {
42 | jvmTarget = JavaVersion.VERSION_17
43 | allWarningsAsErrors = true
44 | }
45 | lint {
46 | abortOnError false
47 | }
48 | buildFeatures {
49 | viewBinding true
50 | }
51 | androidResources {
52 | generateLocaleConfig true
53 | }
54 | }
55 |
56 | dependencies {
57 | implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
58 | implementation "androidx.core:core-ktx:1.13.1"
59 | implementation "androidx.appcompat:appcompat:1.6.1"
60 | implementation "androidx.fragment:fragment-ktx:1.8.3"
61 | implementation "com.google.android.material:material:1.11.0"
62 | implementation "androidx.preference:preference-ktx:1.2.1"
63 | implementation "androidx.constraintlayout:constraintlayout:2.1.4"
64 | implementation "androidx.navigation:navigation-fragment-ktx:$androidx_navigation_version"
65 | implementation "androidx.navigation:navigation-ui-ktx:$androidx_navigation_version"
66 | implementation "androidx.navigation:navigation-fragment-ktx:$androidx_navigation_version"
67 | implementation "androidx.navigation:navigation-ui-ktx:$androidx_navigation_version"
68 | implementation "androidx.lifecycle:lifecycle-livedata-ktx:$androidx_lifecycle_version"
69 | implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$androidx_lifecycle_version"
70 | implementation "com.mikepenz:aboutlibraries:$about_libraries_version"
71 |
72 | testImplementation "junit:junit:4.13.2"
73 | androidTestImplementation "androidx.test.ext:junit:1.1.5"
74 | androidTestImplementation "androidx.test.espresso:espresso-core:3.6.1"
75 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/github/muellerma/tabletoptools/ui/fragments/NumberConverterFragment.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools.ui.fragments
2 |
3 | import android.os.Bundle
4 | import android.util.Log
5 | import android.view.LayoutInflater
6 | import android.view.View
7 | import android.view.ViewGroup
8 | import androidx.core.widget.addTextChangedListener
9 | import com.github.muellerma.tabletoptools.databinding.FragmentNumberConverterBinding
10 | import java.util.*
11 |
12 | class NumberConverterFragment : AbstractBaseFragment() {
13 | private lateinit var binding: FragmentNumberConverterBinding
14 | private var inputFromUser = true
15 |
16 | override fun onCreateView(
17 | inflater: LayoutInflater,
18 | container: ViewGroup?,
19 | savedInstanceState: Bundle?
20 | ): View {
21 | binding = FragmentNumberConverterBinding.inflate(inflater, container, false)
22 | val binInputText = binding.numberConverterInputBin
23 | val decInputText = binding.numberConverterInputDec
24 | val hexInputText = binding.numberConverterInputHex
25 |
26 | binInputText.addTextChangedListener { text ->
27 | if (!inputFromUser) {
28 | return@addTextChangedListener
29 | }
30 | val input = text?.toString()?.toIntOrNull(2) ?: return@addTextChangedListener
31 | Log.d(TAG, "Bin: $text")
32 |
33 | inputFromUser = false
34 | decInputText.setText(input.toString())
35 | hexInputText.setText(Integer.toHexString(input).uppercase(Locale.US))
36 | inputFromUser = true
37 | }
38 |
39 | decInputText.addTextChangedListener { text ->
40 | if (!inputFromUser) {
41 | return@addTextChangedListener
42 | }
43 | val input = text?.toString()?.toIntOrNull() ?: return@addTextChangedListener
44 | Log.d(TAG, "Dec: $text")
45 |
46 | inputFromUser = false
47 | binInputText.setText(Integer.toBinaryString(input))
48 | hexInputText.setText(Integer.toHexString(input).uppercase(Locale.US))
49 | inputFromUser = true
50 | }
51 |
52 | hexInputText.addTextChangedListener { text ->
53 | if (!inputFromUser) {
54 | return@addTextChangedListener
55 | }
56 | val input = text?.toString()?.toIntOrNull(16) ?: return@addTextChangedListener
57 | Log.d(TAG, "Hex: $text")
58 |
59 | inputFromUser = false
60 | decInputText.setText(input.toString())
61 | binInputText.setText(Integer.toBinaryString(input))
62 | inputFromUser = true
63 | }
64 |
65 | setupScreenOn(binding.root)
66 |
67 | return binding.root
68 | }
69 |
70 | companion object {
71 | private var TAG = NumberConverterFragment::class.java.simpleName
72 | }
73 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/github/muellerma/tabletoptools/utils/Prefs.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools.utils
2 |
3 | import android.content.Context
4 | import android.content.SharedPreferences
5 | import androidx.core.content.edit
6 | import androidx.preference.PreferenceManager
7 | import com.github.muellerma.tabletoptools.R
8 | import com.github.muellerma.tabletoptools.ui.fragments.TimerFragment
9 |
10 | class Prefs(private val context: Context) {
11 | private var sharedPrefs: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context)
12 |
13 | val maxDiceCount: Int
14 | get() = sharedPrefs.getString("dices_max_count", "10")?.toInt() ?: 10
15 |
16 | val startPage: String
17 | get() = sharedPrefs.getString("start_page", context.getString(R.string.menu_dice_value))
18 | ?: context.getString(R.string.menu_dice_value)
19 |
20 | val showDiceOverallIncSlider: Boolean
21 | get() = sharedPrefs.getBoolean("dices_show_inc_slider", false)
22 |
23 | val showDiceRollIncSlider: Boolean
24 | get() = sharedPrefs.getBoolean("dices_show_roll_inc_slider", false)
25 |
26 | var buzzerCount: Int
27 | get() = sharedPrefs.getInt("buzzer_count", 2)
28 | set(value) {
29 | sharedPrefs.edit {
30 | putInt("buzzer_count", value)
31 | }
32 | }
33 |
34 | var lastRandomList: String
35 | get() = sharedPrefs.getString("random_list_last_list", "") ?: ""
36 | set(value) {
37 | sharedPrefs.edit {
38 | putString("random_list_last_list", value)
39 | }
40 | }
41 |
42 | var timerMillis: Long
43 | get() = sharedPrefs.getLong("timer_millis", TimerFragment.DEFAULT_TIME)
44 | set(value) {
45 | sharedPrefs.edit {
46 | putLong("timer_millis", value)
47 | }
48 | }
49 |
50 | var keepScreenOn: Boolean
51 | get() = sharedPrefs.getBoolean("keep_screen_on", true)
52 | set(value) {
53 | sharedPrefs.edit {
54 | putBoolean("keep_screen_on", value)
55 | }
56 | }
57 |
58 | val buzzerSound: Int?
59 | get() {
60 | return when (sharedPrefs.getString("buzzer_sound", null)) {
61 | "buzzer" -> R.raw.buzzer
62 | else -> null
63 | }
64 | }
65 |
66 | inner class Counter(private val id: Int) {
67 | var label: String?
68 | get() = sharedPrefs.getString("counter_${id}_label", null)
69 | set(value) {
70 | sharedPrefs.edit {
71 | putString("counter_${id}_label", value)
72 | }
73 | }
74 |
75 | var count: Int
76 | get() = sharedPrefs.getInt("counter_${id}_count", 0)
77 | set(value) {
78 | sharedPrefs.edit {
79 | putInt("counter_${id}_count", value)
80 | }
81 | }
82 | }
83 | }
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_frosthaven.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
14 |
15 |
27 |
28 |
46 |
47 |
60 |
61 |
62 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @rem
2 | @rem Copyright 2015 the original author or authors.
3 | @rem
4 | @rem Licensed under the Apache License, Version 2.0 (the "License");
5 | @rem you may not use this file except in compliance with the License.
6 | @rem You may obtain a copy of the License at
7 | @rem
8 | @rem https://www.apache.org/licenses/LICENSE-2.0
9 | @rem
10 | @rem Unless required by applicable law or agreed to in writing, software
11 | @rem distributed under the License is distributed on an "AS IS" BASIS,
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | @rem See the License for the specific language governing permissions and
14 | @rem limitations under the License.
15 | @rem
16 |
17 | @if "%DEBUG%"=="" @echo off
18 | @rem ##########################################################################
19 | @rem
20 | @rem Gradle startup script for Windows
21 | @rem
22 | @rem ##########################################################################
23 |
24 | @rem Set local scope for the variables with windows NT shell
25 | if "%OS%"=="Windows_NT" setlocal
26 |
27 | set DIRNAME=%~dp0
28 | if "%DIRNAME%"=="" set DIRNAME=.
29 | @rem This is normally unused
30 | set APP_BASE_NAME=%~n0
31 | set APP_HOME=%DIRNAME%
32 |
33 | @rem Resolve any "." and ".." in APP_HOME to make it shorter.
34 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
35 |
36 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
37 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
38 |
39 | @rem Find java.exe
40 | if defined JAVA_HOME goto findJavaFromJavaHome
41 |
42 | set JAVA_EXE=java.exe
43 | %JAVA_EXE% -version >NUL 2>&1
44 | if %ERRORLEVEL% equ 0 goto execute
45 |
46 | echo.
47 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
48 | echo.
49 | echo Please set the JAVA_HOME variable in your environment to match the
50 | echo location of your Java installation.
51 |
52 | goto fail
53 |
54 | :findJavaFromJavaHome
55 | set JAVA_HOME=%JAVA_HOME:"=%
56 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
57 |
58 | if exist "%JAVA_EXE%" goto execute
59 |
60 | echo.
61 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
62 | echo.
63 | echo Please set the JAVA_HOME variable in your environment to match the
64 | echo location of your Java installation.
65 |
66 | goto fail
67 |
68 | :execute
69 | @rem Setup the command line
70 |
71 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
72 |
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if %ERRORLEVEL% equ 0 goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | set EXIT_CODE=%ERRORLEVEL%
85 | if %EXIT_CODE% equ 0 set EXIT_CODE=1
86 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
87 | exit /b %EXIT_CODE%
88 |
89 | :mainEnd
90 | if "%OS%"=="Windows_NT" endlocal
91 |
92 | :omega
93 |
--------------------------------------------------------------------------------
/app/src/main/res/values-tr/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Masaüstü Araçları
5 | Masaüstü oyunlar için kullanışlı araç koleksiyonu
6 | Ayarlar
7 |
8 | ROT13
9 |
10 | - Tüm latin harfler %d basamak döndürülecektir (aşağıda ayarlanabilir)
11 | - Tüm latin harfleri %d basamak döndürülecektir (aşağıda ayarlanabilir)
12 |
13 |
14 |
15 | Alfabe
16 | Harf
17 | Konum
18 |
19 | Sayı dönüştürücü
20 | Ondalık
21 | İkili
22 | Onaltılık
23 |
24 |
25 |
26 | Zar sayısı: %d
27 |
28 | Z%d
29 |
30 | Zamanlayıcı
31 | Başlat
32 | Durdur
33 | Sıfırla
34 |
35 | Dk
36 |
37 | Sn
38 |
39 | Sesli uyarılar
40 | Oyuncu A
41 | Oyuncu B
42 | Oyuncu C
43 | Oyuncu D
44 | Değerleri birbirinden ayrılmış olarak satırlarla girin
45 | Listeyi rastgele sırala
46 | Listeyi temizle
47 | Listeyi sırala
48 | Listeyi temizlemek istiyor musunuz?
49 |
50 | - %d sesli uyarı
51 | - %d sesli uyarı
52 |
53 |
54 |
55 | Genel
56 | Ayarlar
57 |
58 | Hakkında
59 | Web tarayıcısı bulunamadı
60 |
61 |
--------------------------------------------------------------------------------
/app/src/main/java/com/github/muellerma/tabletoptools/ui/dialog/TimerPickerDialog.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools.ui.dialog
2 |
3 | import android.os.Bundle
4 | import android.view.LayoutInflater
5 | import android.view.View
6 | import android.view.ViewGroup
7 | import android.widget.Button
8 | import android.widget.NumberPicker
9 | import androidx.core.os.bundleOf
10 | import androidx.fragment.app.DialogFragment
11 | import androidx.fragment.app.setFragmentResult
12 | import com.github.muellerma.tabletoptools.R
13 | import com.github.muellerma.tabletoptools.databinding.DialogCountDownPickerBinding
14 |
15 | class TimerPickerDialog : DialogFragment(), NumberPicker.OnValueChangeListener {
16 | private var minutesAndSeconds: Pair = Pair(5, 0)
17 | private lateinit var finishButton: Button
18 | private lateinit var minutesPicker: NumberPicker
19 | private lateinit var secondsPicker: NumberPicker
20 |
21 | override fun onCreateView(
22 | inflater: LayoutInflater,
23 | container: ViewGroup?,
24 | savedInstanceState: Bundle?
25 | ): View {
26 | val binding = DialogCountDownPickerBinding.inflate(inflater, container, false)
27 | arguments?.apply {
28 | minutesAndSeconds = convertMillisToMinutesAndSeconds(getLong(MILLIS_BUNDLE_KEY))
29 | }
30 | minutesPicker = binding.minuteNumberPicker.apply {
31 | minValue = MIN_TIME
32 | maxValue = MAX_TIME
33 | value = minutesAndSeconds.first
34 |
35 | setOnValueChangedListener(this@TimerPickerDialog)
36 | }
37 | secondsPicker = binding.secondNumberPicker.apply {
38 | minValue = MIN_TIME
39 | maxValue = MAX_TIME
40 | value = minutesAndSeconds.second
41 |
42 | setOnValueChangedListener(this@TimerPickerDialog)
43 | }
44 | finishButton = binding.button.apply {
45 | setOnClickListener {
46 | setFragmentResult(
47 | RESULT_KEY,
48 | bundleOf(MINUTE_KEY to minutesPicker.value, SECOND_KEY to secondsPicker.value)
49 | )
50 | dismiss()
51 | }
52 | }
53 |
54 | return binding.root
55 | }
56 |
57 | override fun onValueChange(picker: NumberPicker?, oldVal: Int, newVal: Int) {
58 | finishButton.isEnabled = minutesPicker.value != 0 || secondsPicker.value != 0
59 | }
60 |
61 | private fun convertMillisToMinutesAndSeconds(millis: Long): Pair {
62 | val minutes = millis / 1000 / 60
63 | val seconds = millis / 1000 % 60
64 | return Pair(minutes.toInt(), seconds.toInt())
65 | }
66 |
67 | companion object {
68 | fun createBundle(millis: Long): Bundle {
69 | return bundleOf(
70 | MILLIS_BUNDLE_KEY to millis
71 | )
72 | }
73 |
74 | private const val MILLIS_BUNDLE_KEY = "MILLIS_BUNDLE_KEY"
75 |
76 | const val MIN_TIME = 0
77 | const val MAX_TIME = 59
78 | const val TAG = "CountDownPickerDialog"
79 | const val RESULT_KEY = "TIME_RESULT_KEY"
80 | const val MINUTE_KEY = "MINUTE_KEY"
81 | const val SECOND_KEY = "SECOND_KEY"
82 | }
83 | }
--------------------------------------------------------------------------------
/app/src/main/res/navigation/mobile_navigation.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
13 |
18 |
19 |
24 |
25 |
30 |
31 |
36 |
37 |
42 |
43 |
48 |
49 |
54 |
55 |
60 |
61 |
66 |
67 |
71 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/counter.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
17 |
18 |
27 |
28 |
38 |
39 |
53 |
54 |
64 |
65 |
74 |
75 |
--------------------------------------------------------------------------------
/app/src/main/res/values-de/common_words.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | - der
6 | - die
7 | - und
8 | - in
9 | - den
10 | - von
11 | - zu
12 | - das
13 | - mit
14 | - sich
15 | - des
16 | - auf
17 | - für
18 | - ist
19 | - im
20 | - dem
21 | - nicht
22 | - ein
23 | - Die
24 | - eine
25 | - als
26 | - auch
27 | - es
28 | - an
29 | - werden
30 | - aus
31 | - er
32 | - hat
33 | - daß
34 | - sie
35 | - nach
36 | - wird
37 | - bei
38 | - einer
39 | - Der
40 | - um
41 | - am
42 | - sind
43 | - noch
44 | - wie
45 | - einem
46 | - über
47 | - einen
48 | - Das
49 | - so
50 | - Sie
51 | - zum
52 | - war
53 | - haben
54 | - nur
55 | - oder
56 | - aber
57 | - vor
58 | - zur
59 | - bis
60 | - mehr
61 | - durch
62 | - man
63 | - sein
64 | - wurde
65 | - sei
66 | - In
67 | - Prozent
68 | - hatte
69 | - kann
70 | - gegen
71 | - vom
72 | - können
73 | - schon
74 | - wenn
75 | - habe
76 | - seine
77 | - Mark
78 | - ihre
79 | - dann
80 | - unter
81 | - wir
82 | - soll
83 | - ich
84 | - eines
85 | - Es
86 | - Jahr
87 | - zwei
88 | - Jahren
89 | - diese
90 | - dieser
91 | - wieder
92 | - keine
93 | - Uhr
94 | - seiner
95 | - worden
96 | - Und
97 | - will
98 | - zwischen
99 | - Im
100 | - immer
101 | - Millionen
102 | - Ein
103 | - was
104 | - sagte
105 |
106 |
--------------------------------------------------------------------------------
/app/src/main/java/com/github/muellerma/tabletoptools/ui/fragments/PreferenceFragment.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools.ui.fragments
2 |
3 | import android.os.Bundle
4 | import android.view.View
5 | import androidx.fragment.app.commit
6 | import androidx.preference.Preference
7 | import androidx.preference.PreferenceFragmentCompat
8 | import com.github.muellerma.tabletoptools.R
9 | import com.github.muellerma.tabletoptools.utils.openInBrowser
10 | import com.mikepenz.aboutlibraries.LibsBuilder
11 | import com.mikepenz.aboutlibraries.LibsConfiguration
12 | import com.mikepenz.aboutlibraries.entity.Library
13 | import com.mikepenz.aboutlibraries.util.SpecialButton
14 |
15 | class PreferenceFragment : PreferenceFragmentCompat() {
16 | override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
17 | addPreferencesFromResource(R.xml.pref_main)
18 |
19 | getPreference("about").apply {
20 | setOnPreferenceClickListener {
21 | val fragment = LibsBuilder()
22 | .withActivityTitle(getString(R.string.about))
23 | .withAboutIconShown(true)
24 | .withAboutVersionShownName(true)
25 | .withSortEnabled(true)
26 | .withListener(AboutButtonsListener())
27 | .supportFragment()
28 |
29 | parentFragmentManager.commit {
30 | addToBackStack("about")
31 | setReorderingAllowed(true)
32 | replace(R.id.nav_host_fragment, fragment, "about")
33 | }
34 | true
35 | }
36 | }
37 | }
38 |
39 | companion object {
40 | private var TAG = PreferenceFragment::class.java.simpleName
41 | }
42 | }
43 |
44 | fun PreferenceFragmentCompat.getPreference(key: String) =
45 | preferenceManager.findPreference(key)!!
46 |
47 |
48 | class AboutButtonsListener : LibsConfiguration.LibsListener {
49 | override fun onExtraClicked(v: View, specialButton: SpecialButton): Boolean {
50 | val link = when (specialButton) {
51 | SpecialButton.SPECIAL1 -> "https://github.com/mueller-ma/TabletopTools/"
52 | SpecialButton.SPECIAL2 -> "https://f-droid.org/packages/com.github.muellerma.tabletoptools/"
53 | SpecialButton.SPECIAL3 -> "https://crowdin.com/project/tabletop-tools"
54 | }
55 | link.openInBrowser(v.context)
56 | return true
57 | }
58 |
59 | override fun onIconClicked(v: View) {
60 | // no-op
61 | }
62 |
63 | override fun onIconLongClicked(v: View): Boolean {
64 | return false
65 | }
66 |
67 | override fun onLibraryAuthorClicked(v: View, library: Library): Boolean {
68 | return false
69 | }
70 |
71 | override fun onLibraryAuthorLongClicked(v: View, library: Library): Boolean {
72 | return false
73 | }
74 |
75 | override fun onLibraryBottomClicked(v: View, library: Library): Boolean {
76 | return false
77 | }
78 |
79 | override fun onLibraryBottomLongClicked(v: View, library: Library): Boolean {
80 | return false
81 | }
82 |
83 | override fun onLibraryContentClicked(v: View, library: Library): Boolean {
84 | return false
85 | }
86 |
87 | override fun onLibraryContentLongClicked(v: View, library: Library): Boolean {
88 | return false
89 | }
90 | }
--------------------------------------------------------------------------------
/app/src/main/res/values/common_words.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | - the
6 | - be
7 | - to
8 | - of
9 | - and
10 | - a
11 | - in
12 | - that
13 | - have
14 | - I
15 | - it
16 | - for
17 | - not
18 | - on
19 | - with
20 | - he
21 | - as
22 | - you
23 | - do
24 | - at
25 | - this
26 | - but
27 | - his
28 | - by
29 | - from
30 | - they
31 | - we
32 | - say
33 | - her
34 | - she
35 | - or
36 | - an
37 | - will
38 | - my
39 | - one
40 | - all
41 | - would
42 | - there
43 | - their
44 | - what
45 | - so
46 | - up
47 | - out
48 | - if
49 | - about
50 | - who
51 | - get
52 | - which
53 | - go
54 | - me
55 | - when
56 | - make
57 | - can
58 | - like
59 | - time
60 | - no
61 | - just
62 | - him
63 | - know
64 | - take
65 | - people
66 | - into
67 | - year
68 | - your
69 | - good
70 | - some
71 | - could
72 | - them
73 | - see
74 | - other
75 | - than
76 | - then
77 | - now
78 | - look
79 | - only
80 | - come
81 | - its
82 | - over
83 | - think
84 | - also
85 | - back
86 | - after
87 | - use
88 | - two
89 | - how
90 | - our
91 | - work
92 | - first
93 | - well
94 | - way
95 | - even
96 | - new
97 | - want
98 | - because
99 | - any
100 | - these
101 | - give
102 | - day
103 | - most
104 | - us
105 |
106 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_buzzers.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
27 |
28 |
43 |
44 |
58 |
59 |
71 |
--------------------------------------------------------------------------------
/app/src/main/java/com/github/muellerma/tabletoptools/ui/fragments/RandomListFragment.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools.ui.fragments
2 |
3 | import android.os.Bundle
4 | import android.view.*
5 | import androidx.annotation.VisibleForTesting
6 | import androidx.core.view.MenuProvider
7 | import androidx.core.widget.addTextChangedListener
8 | import androidx.lifecycle.Lifecycle
9 | import com.github.muellerma.tabletoptools.R
10 | import com.github.muellerma.tabletoptools.databinding.FragmentRandomListBinding
11 | import com.google.android.material.dialog.MaterialAlertDialogBuilder
12 |
13 | class RandomListFragment : AbstractBaseFragment() {
14 | private lateinit var binding: FragmentRandomListBinding
15 |
16 | override fun onCreateView(
17 | inflater: LayoutInflater,
18 | container: ViewGroup?,
19 | savedInstanceState: Bundle?
20 | ): View {
21 | binding = FragmentRandomListBinding.inflate(inflater, container, false)
22 | val randomList = binding.randomList
23 |
24 | binding.randomSelect.apply {
25 | setOnClickListener {
26 | randomList.setText(
27 | randomizeList(randomList.text.toString())
28 | )
29 | }
30 | }
31 |
32 | randomList.setText(prefs.lastRandomList)
33 |
34 | randomList.addTextChangedListener {
35 | prefs.lastRandomList = it.toString()
36 | }
37 |
38 | setupScreenOn(binding.root)
39 |
40 | requireActivity().addMenuProvider(object : MenuProvider {
41 | override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
42 | menuInflater.inflate(R.menu.menu_random_list, menu)
43 | }
44 |
45 | override fun onMenuItemSelected(item: MenuItem): Boolean {
46 | return when (item.itemId) {
47 | R.id.clear_list -> {
48 | MaterialAlertDialogBuilder(requireContext())
49 | .setMessage(R.string.random_list_clear_list_confirm)
50 | .setPositiveButton(android.R.string.ok) { _, _ ->
51 | randomList.setText("")
52 | }
53 | .setNegativeButton(android.R.string.cancel, null)
54 | .show()
55 | true
56 | }
57 | R.id.sort_list -> {
58 | randomList.setText(
59 | sortList(randomList.text.toString())
60 | )
61 | true
62 | }
63 | else -> false
64 | }
65 | }
66 | }, viewLifecycleOwner, Lifecycle.State.RESUMED)
67 |
68 | return binding.root
69 | }
70 |
71 | companion object {
72 | @VisibleForTesting
73 | fun randomizeList(list: String): String {
74 | val orig = list
75 | .split("\n")
76 | .map { it.trim() }
77 | .filter { it.isNotEmpty() }
78 |
79 | val shuffled = orig.shuffled()
80 |
81 | if (shuffled == orig && orig.size > 1) {
82 | return randomizeList(list)
83 | }
84 |
85 | return shuffled.joinToString("\n")
86 | }
87 |
88 | @VisibleForTesting
89 | fun sortList(list: String): String {
90 | return list
91 | .split("\n")
92 | .map { it.trim() }
93 | .filter { it.isNotEmpty() }
94 | .sorted()
95 | .joinToString("\n")
96 | }
97 | }
98 | }
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_rot13.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
14 |
15 |
31 |
32 |
46 |
47 |
60 |
61 |
73 |
74 |
75 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_timer.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
13 |
14 |
29 |
30 |
44 |
45 |
59 |
60 |
61 |
75 |
76 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_dice.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
15 |
16 |
25 |
26 |
32 |
33 |
43 |
44 |
50 |
51 |
61 |
62 |
68 |
69 |
79 |
80 |
87 |
88 |
89 |
90 |
--------------------------------------------------------------------------------
/app/src/main/java/com/github/muellerma/tabletoptools/ui/fragments/Rot13Fragment.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools.ui.fragments
2 |
3 | import android.os.Bundle
4 | import android.util.Log
5 | import android.view.LayoutInflater
6 | import android.view.View
7 | import android.view.ViewGroup
8 | import android.widget.EditText
9 | import android.widget.TextView
10 | import androidx.annotation.VisibleForTesting
11 | import androidx.core.widget.addTextChangedListener
12 | import com.github.muellerma.tabletoptools.R
13 | import com.github.muellerma.tabletoptools.databinding.FragmentRot13Binding
14 | import com.github.muellerma.tabletoptools.utils.isLatinLetter
15 | import com.github.muellerma.tabletoptools.utils.showToast
16 | import com.google.android.material.slider.Slider
17 | import java.util.Locale
18 |
19 | class Rot13Fragment : AbstractBaseFragment() {
20 | private lateinit var binding: FragmentRot13Binding
21 | private lateinit var slider: Slider
22 | private lateinit var inputText: EditText
23 | private lateinit var result: TextView
24 |
25 | override fun onCreateView(
26 | inflater: LayoutInflater,
27 | container: ViewGroup?,
28 | savedInstanceState: Bundle?
29 | ): View {
30 | binding = FragmentRot13Binding.inflate(inflater, container, false)
31 | slider = binding.rot13Slider.apply {
32 | addOnChangeListener { _, _, _ -> updateResult() }
33 | }
34 | inputText = binding.rot13InputText.apply {
35 | addTextChangedListener {
36 | updateResult()
37 | }
38 | }
39 | result = binding.rot13ResultText
40 | updateResult()
41 | binding.rot13ResolveButton.setOnClickListener {
42 | tryResolve()
43 | }
44 |
45 | setupScreenOn(binding.root)
46 |
47 | return binding.root
48 | }
49 |
50 | private fun updateResult() {
51 | val rotateBy = slider.value.toInt()
52 | inputText.hint = resources.getQuantityString(R.plurals.rot13_hint, rotateBy, rotateBy)
53 | result.text = rotateString(inputText.text.toString(), rotateBy)
54 | }
55 |
56 | private fun tryResolve() {
57 | val input = inputText.text.toString()
58 | val rotated = (0..25).associateWith { rotateBy ->
59 | rotateString(input, rotateBy)
60 | }
61 | val commonWords = resources.getStringArray(R.array.rot13_common_words)
62 | .map { it.lowercase( Locale.getDefault()) }
63 | .toSet()
64 | var highestIndex = 0
65 | var highestMatch = 0
66 | rotated.forEach {
67 | val splitText = it.value.lowercase(Locale.getDefault()).split(" ").toList()
68 | val matches = splitText.intersect(commonWords).size
69 | if (matches > highestMatch) {
70 | highestMatch = matches
71 | highestIndex = it.key
72 | }
73 | Log.d(TAG, "Rotate by ${it.key} has $matches matches")
74 | }
75 |
76 | if (highestMatch > 0) {
77 | slider.value = highestIndex.toFloat()
78 | updateResult()
79 | } else {
80 | context?.showToast(R.string.rot13_could_not_rotate)
81 | }
82 | }
83 |
84 | companion object {
85 | private val TAG = Rot13Fragment::class.java.simpleName
86 |
87 | @VisibleForTesting
88 | fun rotateChar(c: Char, rotateBy: Int): Char {
89 | if (!c.isLatinLetter()) {
90 | return c
91 | }
92 |
93 | val start = if (c.isUpperCase()) 65 else 97
94 | val newChar = (c.code - start + rotateBy) % 26
95 | return (newChar + start).toChar()
96 | }
97 |
98 | @VisibleForTesting
99 | fun rotateString(s: String, rotateBy: Int): String {
100 | return s.map { rotateChar(it, rotateBy) }.joinToString("")
101 | }
102 | }
103 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/github/muellerma/tabletoptools/ui/fragments/AbstractBaseFragment.kt:
--------------------------------------------------------------------------------
1 | package com.github.muellerma.tabletoptools.ui.fragments
2 |
3 | import android.graphics.drawable.Drawable
4 | import android.os.Bundle
5 | import android.os.Parcelable
6 | import android.util.Log
7 | import android.view.Menu
8 | import android.view.MenuInflater
9 | import android.view.MenuItem
10 | import android.view.View
11 | import androidx.annotation.CallSuper
12 | import androidx.appcompat.content.res.AppCompatResources.getDrawable
13 | import androidx.core.view.MenuProvider
14 | import androidx.fragment.app.Fragment
15 | import androidx.lifecycle.Lifecycle
16 | import com.github.muellerma.tabletoptools.R
17 | import com.github.muellerma.tabletoptools.utils.Prefs
18 | import com.github.muellerma.tabletoptools.utils.showToast
19 | import kotlinx.coroutines.CoroutineScope
20 | import kotlinx.coroutines.Dispatchers
21 | import kotlinx.coroutines.Job
22 | import kotlin.coroutines.CoroutineContext
23 |
24 | abstract class AbstractBaseFragment : Fragment(), CoroutineScope {
25 | protected lateinit var prefs: Prefs
26 | private set
27 | private val job = Job()
28 | override val coroutineContext: CoroutineContext get() = Dispatchers.Main + job
29 | var savedData: SavedData? = null
30 | protected open val forceAlwaysScreenOn = false
31 |
32 | @CallSuper
33 | override fun onCreate(savedInstanceState: Bundle?) {
34 | super.onCreate(savedInstanceState)
35 | prefs = Prefs(this.requireContext())
36 | }
37 |
38 | protected fun setupScreenOn(view: View) {
39 | if (forceAlwaysScreenOn) {
40 | Log.d(TAG, "setupScreenOn(): forceAlwaysScreenOn is true")
41 | view.keepScreenOn = true
42 | return
43 | }
44 |
45 | fun getMenuItemConfig(isTurnedOn: Boolean): Pair {
46 | return if (isTurnedOn) {
47 | Pair(
48 | getDrawable(this.requireContext(), R.drawable.ic_brightness_high),
49 | getString(R.string.keep_screen_on_enabled)
50 | )
51 | } else {
52 | Pair(
53 | getDrawable(this.requireContext(), R.drawable.ic_brightness_low),
54 | getString(R.string.keep_screen_on_disabled)
55 | )
56 | }
57 | }
58 |
59 | fun updateViewAndIconState(keepOn: Boolean, item: MenuItem) {
60 | view.keepScreenOn = keepOn
61 | val menuItemConfig = getMenuItemConfig(keepOn)
62 | item.icon = menuItemConfig.first
63 | item.title = menuItemConfig.second
64 | }
65 |
66 | requireActivity().addMenuProvider(object : MenuProvider {
67 | override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) {
68 | Log.d(TAG, "onCreateMenu()")
69 | menuInflater.inflate(R.menu.menu_keep_screen_on, menu)
70 | updateViewAndIconState(prefs.keepScreenOn, menu.findItem(R.id.keep_screen_on))
71 | }
72 |
73 | override fun onMenuItemSelected(item: MenuItem): Boolean {
74 | Log.d(TAG, "onMenuItemSelected(${item.itemId})")
75 | return when (item.itemId) {
76 | R.id.keep_screen_on -> {
77 | val nowKeepScreenOn = prefs.keepScreenOn.not()
78 | Log.d(TAG, "Keep screen on changed to $nowKeepScreenOn")
79 | prefs.keepScreenOn = nowKeepScreenOn
80 | updateViewAndIconState(nowKeepScreenOn, item)
81 | context?.showToast(item.title.toString())
82 | true
83 | }
84 | else -> false
85 | }
86 | }
87 | }, viewLifecycleOwner, Lifecycle.State.RESUMED)
88 | }
89 |
90 | companion object {
91 | private val TAG = AbstractBaseFragment::class.java.simpleName
92 | }
93 | }
94 |
95 | interface SavedData : Parcelable
--------------------------------------------------------------------------------
/app/src/main/res/values-ja/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | タブレットツール
5 | 2番目のインスタンス
6 | 複数のツールを同時に使用するには、Android のマルチウィンドウ機能を使用してください
7 | テーブルトップゲーム用の便利なツールコレクション
8 | 設定
9 |
10 | ROT13
11 | 自動的に回転できませんでした
12 | 自動的に回転
13 |
14 | - すべてのラテン文字は %d の場所で回転します (下記に設定できます)
15 |
16 |
17 | カウンター名
18 | カウンター
19 | -1
20 | +1
21 | -10
22 | +10
23 |
24 | アルファベット(&A)
25 | 手紙
26 | 位置
27 |
28 | 数字コンバータ
29 | 小数点以下桁数
30 | バイナリ
31 | 16進法
32 |
33 | 素因数
34 | 素因数分解のための整数
35 |
36 |
37 | ダイス
38 | サイコロの数: %d
39 | 全体の結果に追加: %d
40 | 各ロールに追加: %d
41 |
42 | D%d
43 | 最大サイコロ数
44 | 「結果に追加」スライダーを表示
45 | 「各ロールに追加」スライダーを表示
46 |
47 | タイマー
48 | 開始
49 | 一時停止
50 | Reset
51 |
52 | 最小
53 |
54 | 秒
55 | 時刻を設定
56 |
57 | ブザー
58 | プレイヤーA
59 | プレイヤーB
60 | プレイヤーC
61 | プレイヤー D
62 | 新しい行で区切られた値を入力してください
63 | リストをランダム化
64 | リストをクリア
65 | ソートリスト
66 | リストをクリアしますか?
67 |
68 | - %d 件のブザー
69 |
70 |
71 |
72 | スタートページ
73 | 全般
74 | 設定
75 | 画面をオンにする
76 | 画面をオンにしない
77 | サウンド
78 | なし
79 | ブザー
80 |
81 | About
82 | ブラウザが見つかりませんでした
83 |
84 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_number_converter.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
13 |
14 |
26 |
27 |
34 |
35 |
36 |
37 |
49 |
50 |
57 |
58 |
59 |
60 |
71 |
72 |
79 |
80 |
81 |
82 |
83 |
--------------------------------------------------------------------------------
/app/src/main/res/values-zh-rCN/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 桌游工具
5 | 第二实例
6 | 借助 Android 的多窗口功能以同时使用多个工具
7 | 用于桌游的实用工具集合
8 | 设置
9 |
10 | ROT13
11 | 无法自动旋转
12 | 自动旋转
13 |
14 | - 所有拉丁字母将向后旋转 %d 个位置(可在下方设置)
15 |
16 |
17 | 计数器名称
18 | 计数器
19 | -1
20 | +1
21 | -10
22 | +10
23 |
24 | 字母表
25 | 字母
26 | 位置
27 |
28 | 数字转换器
29 | 十进制
30 | 二进制
31 | 十六进制
32 |
33 | 质因数分解
34 | 主因子整数
35 |
36 |
37 | 骰子
38 | 骰子数: %d
39 | 总点数加上: %d
40 | 每个骰子点数加上: %d
41 |
42 | D%d
43 | 最大骰子数
44 | 显示“总点数加上”滑块
45 | 显示“每个骰子点数加上”滑块
46 |
47 | 定时器
48 | 开始
49 | 暂停
50 | 复位
51 |
52 | 分
53 |
54 | 秒
55 | 设置时间
56 |
57 | 蜂鸣器
58 | 玩家 A
59 | 玩家 B
60 | 玩家 C
61 | 玩家 D
62 | 输入以换行符分隔的值
63 | 随机重排列表
64 | 清空列表
65 | 给列表排序
66 | 要清空列表吗?
67 |
68 | - %d 个蜂鸣器
69 |
70 |
71 | 寒霜迷城
72 | 计算场景等级
73 | 输入人物等级,以英文逗号分隔
74 | 场景等级:%d
75 |
76 | 开始页面
77 | 通用
78 | 设置
79 | 保持屏幕开启
80 | 不要保持屏幕开启
81 | 音效
82 | 无
83 | 蜂鸣
84 |
85 | 关于
86 | 未找到可用的浏览器
87 |
88 |
--------------------------------------------------------------------------------
/app/src/main/res/values-nb/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Tabellop Verktøy
5 | Andre instans
6 | Bruk Androids flervindusfunksjonen til å bruke flere verktøy samtidig
7 | Hånd-verktøysamling for nettbrettspill
8 | Innstillinger
9 |
10 | ROT13
11 | Kunne ikke rotere automatisk
12 | Roter automatisk
13 |
14 | - Alle latinske bokstaver vil bli rotert med %d sted (kan angis nedenfor)
15 | - Alle latinske bokstaver vil bli rotert av %d steder (kan angis nedenfor)
16 |
17 |
18 | Teller navn
19 | Teller
20 | -1
21 | +1
22 | -10
23 | +10
24 |
25 | Alfabetet
26 | Brev
27 | Posisjon
28 |
29 | Antall konvertere
30 | Desimal
31 | Binær
32 | Heksadesimal
33 |
34 | Prime factorization
35 | Heltall for statsfaktorisering
36 |
37 |
38 | Terning
39 | Antall ord: %d
40 | Legg til samlet resultat: %d
41 | Legg til i hver roll: %d
42 |
43 | D%d
44 | Maks. terninger
45 | Vis \"Legg til i generell resultat\"-knapp
46 | Vis \"Legg til i hver rolle\"-knapp
47 |
48 | Tidtaker
49 | Begynn
50 | pause
51 | Reset
52 |
53 | Minimum
54 |
55 | Sek
56 | Angi klokkeslett
57 |
58 | Summer
59 | Spiller A
60 | Spiller B
61 | Spiller C
62 | Spiller D
63 | Angi verdier separert av nye linjer
64 | Tilfeldig liste
65 | Tøm liste
66 | Sorter liste
67 | Vil du tømme listen?
68 |
69 | - %d økser
70 | - %d buzzere
71 |
72 |
73 |
74 | Start side
75 | Generelt
76 | Innstillinger
77 | Behold skjermen på
78 | Ikke behold skjermen på
79 | Lyd
80 | Ingen
81 | Summer
82 |
83 | Om
84 | Ingen nettleser funnet
85 |
86 |
--------------------------------------------------------------------------------