├── .editorconfig
├── .github
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ ├── feature_request.md
│ └── question.md
├── changelog
│ ├── 10a.png
│ ├── 10b.png
│ ├── 11a.png
│ ├── 11b.png
│ ├── 12a.png
│ ├── 12b.png
│ ├── 14a.png
│ ├── 14b.png
│ ├── 15a.png
│ ├── 15b.png
│ ├── 17a.png
│ ├── 17b.png
│ ├── 1a.png
│ ├── 1b.png
│ ├── 3a.png
│ ├── 3b.png
│ ├── 4a.png
│ ├── 4b.png
│ ├── 5a.png
│ ├── 5b.png
│ ├── 6a.png
│ ├── 6b.png
│ ├── 8a.png
│ ├── 8b.png
│ ├── 9a.png
│ └── 9b.png
├── fdroid.png
├── google_play.png
└── workflows
│ └── android.yml
├── .gitignore
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── PRIVACY_POLICY.md
├── README.md
├── about
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── dev
│ │ └── lucasnlm
│ │ └── antimine
│ │ ├── about
│ │ ├── AboutActivity.kt
│ │ ├── viewmodel
│ │ │ ├── AboutEvent.kt
│ │ │ └── AboutViewModel.kt
│ │ └── views
│ │ │ └── AboutInfoFragment.kt
│ │ └── licenses
│ │ ├── LicenseActivity.kt
│ │ ├── viewmodel
│ │ ├── LicenseState.kt
│ │ └── LicenseViewModel.kt
│ │ └── views
│ │ ├── LicensesAdapter.kt
│ │ └── LicensesFragment.kt
│ └── res
│ ├── drawable
│ ├── open_in_new.xml
│ └── title.xml
│ └── layout
│ ├── activity_container.xml
│ ├── fragment_about_info.xml
│ ├── fragment_licenses.xml
│ └── view_third_party.xml
├── app
├── .gitignore
├── build.gradle.kts
├── foss
│ └── release
│ │ └── output-metadata.json
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── proguard-rules.pro
└── src
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── dev
│ │ │ └── lucasnlm
│ │ │ └── antimine
│ │ │ ├── GameActivity.kt
│ │ │ ├── MainApplication.kt
│ │ │ ├── cloud
│ │ │ └── CloudSaveManagerImpl.kt
│ │ │ ├── custom
│ │ │ ├── CustomLevelDialogFragment.kt
│ │ │ └── viewmodel
│ │ │ │ ├── CreateGameViewModel.kt
│ │ │ │ ├── CustomEvent.kt
│ │ │ │ └── CustomState.kt
│ │ │ ├── di
│ │ │ ├── AppModule.kt
│ │ │ └── ViewModelModule.kt
│ │ │ ├── gameover
│ │ │ ├── CommonGameDialogFragment.kt
│ │ │ ├── GameOverDialogFragment.kt
│ │ │ ├── WinGameDialogFragment.kt
│ │ │ ├── model
│ │ │ │ ├── CommonDialogState.kt
│ │ │ │ └── GameResult.kt
│ │ │ └── viewmodel
│ │ │ │ ├── EndGameDialogEvent.kt
│ │ │ │ ├── EndGameDialogState.kt
│ │ │ │ └── EndGameDialogViewModel.kt
│ │ │ ├── history
│ │ │ ├── HistoryActivity.kt
│ │ │ ├── viewmodel
│ │ │ │ ├── HistoryEvent.kt
│ │ │ │ ├── HistoryState.kt
│ │ │ │ └── HistoryViewModel.kt
│ │ │ └── views
│ │ │ │ ├── HistoryAdapter.kt
│ │ │ │ └── HistoryFragment.kt
│ │ │ ├── l10n
│ │ │ ├── GameLocaleManager.kt
│ │ │ ├── GameLocaleManagerImpl.kt
│ │ │ ├── LocalizationActivity.kt
│ │ │ ├── models
│ │ │ │ └── GameLanguage.kt
│ │ │ ├── viewmodel
│ │ │ │ ├── LocalizationEvent.kt
│ │ │ │ ├── LocalizationState.kt
│ │ │ │ └── LocalizationViewModel.kt
│ │ │ └── views
│ │ │ │ └── LocalizationItemAdapter.kt
│ │ │ ├── main
│ │ │ ├── MainActivity.kt
│ │ │ └── viewmodel
│ │ │ │ ├── MainEvent.kt
│ │ │ │ └── MainViewModel.kt
│ │ │ ├── playgames
│ │ │ ├── PlayGamesDialogFragment.kt
│ │ │ ├── model
│ │ │ │ └── PlayGamesItem.kt
│ │ │ ├── view
│ │ │ │ ├── PlayGamesAdapter.kt
│ │ │ │ └── PlayGamesButtonView.kt
│ │ │ └── viewmodel
│ │ │ │ ├── PlayGamesEvent.kt
│ │ │ │ └── PlayGamesViewModel.kt
│ │ │ ├── preferences
│ │ │ ├── PreferencesActivity.kt
│ │ │ └── SettingsBackupManager.kt
│ │ │ ├── stats
│ │ │ ├── StatsActivity.kt
│ │ │ ├── model
│ │ │ │ ├── StatsModel.kt
│ │ │ │ └── StatsState.kt
│ │ │ ├── view
│ │ │ │ └── StatsAdapter.kt
│ │ │ └── viewmodel
│ │ │ │ ├── StatsEvent.kt
│ │ │ │ └── StatsViewModel.kt
│ │ │ └── support
│ │ │ ├── AppVersionManagerImpl.kt
│ │ │ └── IapHandler.kt
│ └── res
│ │ ├── anim
│ │ └── fast_shake.xml
│ │ ├── drawable
│ │ ├── arrow_left.xml
│ │ ├── close.xml
│ │ ├── controls.xml
│ │ ├── custom.xml
│ │ ├── delete.xml
│ │ ├── emoji_anguished_face.xml
│ │ ├── emoji_astonished_face.xml
│ │ ├── emoji_beaming_face_with_smiling_eyes.xml
│ │ ├── emoji_bomb.xml
│ │ ├── emoji_clapping_hands.xml
│ │ ├── emoji_collision.xml
│ │ ├── emoji_confounded_face.xml
│ │ ├── emoji_cowboy_hat_face.xml
│ │ ├── emoji_crying_face.xml
│ │ ├── emoji_disappointed_face.xml
│ │ ├── emoji_disguised_face.xml
│ │ ├── emoji_dizzy_face.xml
│ │ ├── emoji_downcast_face_with_sweat.xml
│ │ ├── emoji_exploding_head.xml
│ │ ├── emoji_face_with_head_bandage.xml
│ │ ├── emoji_face_with_tongue.xml
│ │ ├── emoji_grimacing_face.xml
│ │ ├── emoji_grinning_face.xml
│ │ ├── emoji_grinning_squinting_face.xml
│ │ ├── emoji_hugging_face.xml
│ │ ├── emoji_partying_face.xml
│ │ ├── emoji_sad_but_relieved_face.xml
│ │ ├── emoji_smiling_face_with_sunglasses.xml
│ │ ├── emoji_squinting_face_with_tongue.xml
│ │ ├── emoji_triangular_flag.xml
│ │ ├── export_file.xml
│ │ ├── fixed_size.xml
│ │ ├── games_achievements.xml
│ │ ├── games_controller.xml
│ │ ├── games_leaderboards.xml
│ │ ├── heart.xml
│ │ ├── hex_banner.webp
│ │ ├── hint.xml
│ │ ├── import_file.xml
│ │ ├── info.xml
│ │ ├── money.xml
│ │ ├── more.xml
│ │ ├── movie.xml
│ │ ├── music.xml
│ │ ├── new_icon.xml
│ │ ├── old_games.xml
│ │ ├── play.xml
│ │ ├── progressive.xml
│ │ ├── remove_ads.xml
│ │ ├── replay.xml
│ │ ├── retry.xml
│ │ ├── round_background.xml
│ │ ├── settings.xml
│ │ ├── stats.xml
│ │ ├── themes.xml
│ │ ├── translate.xml
│ │ ├── tutorial.xml
│ │ ├── view.xml
│ │ └── watch_ads_icon.xml
│ │ ├── layout-land
│ │ └── activity_game.xml
│ │ ├── layout
│ │ ├── activity_game.xml
│ │ ├── activity_history.xml
│ │ ├── activity_localization.xml
│ │ ├── activity_main.xml
│ │ ├── activity_preferences.xml
│ │ ├── activity_stats.xml
│ │ ├── dialog_custom_game.xml
│ │ ├── donation_request.xml
│ │ ├── fragment_history.xml
│ │ ├── game_over_dialog.xml
│ │ ├── hex_banner.xml
│ │ ├── music_link.xml
│ │ ├── view_history_item.xml
│ │ ├── view_localization_item.xml
│ │ ├── view_play_games_button.xml
│ │ ├── view_stats_item.xml
│ │ └── win_dialog.xml
│ │ ├── values
│ │ └── strings.xml
│ │ └── xml
│ │ ├── automotive_app_desc.xml
│ │ ├── backup.xml
│ │ ├── data_extraction_rules.xml
│ │ └── file_paths.xml
│ └── test
│ └── java
│ └── dev
│ └── lucasnlm
│ └── antimine
│ ├── IntentViewModelTest.kt
│ ├── TestApplication.kt
│ ├── custom
│ └── CreateGameViewModelTest.kt
│ ├── di
│ ├── TestAppModule.kt
│ ├── TestCommonModule.kt
│ └── TestLevelModule.kt
│ ├── history
│ └── HistoryViewModelTest.kt
│ ├── mocks
│ ├── DisabledHapticFeedbackManager.kt
│ ├── FixedDimensionRepository.kt
│ ├── FixedMinefieldRepository.kt
│ ├── MemorySavesRepository.kt
│ ├── MemoryStatsRepository.kt
│ └── MockPreferencesRepository.kt
│ └── stats
│ └── viewmodel
│ └── StatsViewModelTest.kt
├── audio-low
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── assets
│ ├── bomb_explosion.ogg
│ ├── menu_click.ogg
│ ├── menu_click_alt.ogg
│ ├── menu_click_alt_2.ogg
│ ├── music.ogg
│ ├── open_area_0.ogg
│ ├── open_area_1.ogg
│ ├── open_area_2.ogg
│ ├── open_area_3.ogg
│ ├── open_multiple_0.ogg
│ ├── open_multiple_1.ogg
│ ├── open_multiple_2.ogg
│ ├── put_flag_0.ogg
│ ├── put_flag_1.ogg
│ ├── put_flag_2.ogg
│ ├── reveal_mine_0.ogg
│ ├── reveal_mine_1.ogg
│ ├── reveal_mine_2.ogg
│ ├── reveal_mine_reload.ogg
│ └── win.ogg
├── audio
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── assets
│ ├── bomb_explosion.ogg
│ ├── menu_click.ogg
│ ├── menu_click_alt.ogg
│ ├── menu_click_alt_2.ogg
│ ├── music.ogg
│ ├── open_area_0.ogg
│ ├── open_area_1.ogg
│ ├── open_area_2.ogg
│ ├── open_area_3.ogg
│ ├── open_multiple_0.ogg
│ ├── open_multiple_1.ogg
│ ├── open_multiple_2.ogg
│ ├── put_flag_0.ogg
│ ├── put_flag_1.ogg
│ ├── put_flag_2.ogg
│ ├── reveal_mine_0.ogg
│ ├── reveal_mine_1.ogg
│ ├── reveal_mine_2.ogg
│ ├── reveal_mine_reload.ogg
│ └── win.ogg
├── auto
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ └── main
│ └── AndroidManifest.xml
├── build.gradle.kts
├── common
├── .gitignore
├── build.gradle.kts
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── proguard-rules.pro
└── src
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── dev
│ │ │ └── lucasnlm
│ │ │ └── antimine
│ │ │ ├── common
│ │ │ ├── auto
│ │ │ │ └── AutoExt.kt
│ │ │ ├── io
│ │ │ │ ├── SaveFileManager.kt
│ │ │ │ ├── SaveFileManagerImpl.kt
│ │ │ │ ├── SaveListManager.kt
│ │ │ │ ├── SaveListManagerImpl.kt
│ │ │ │ ├── StatsFileManager.kt
│ │ │ │ ├── StatsFileManagerImpl.kt
│ │ │ │ ├── di
│ │ │ │ │ └── CommonSaveModule.kt
│ │ │ │ ├── models
│ │ │ │ │ ├── FirstOpen.kt
│ │ │ │ │ ├── Save.kt
│ │ │ │ │ ├── SaveStatus.kt
│ │ │ │ │ └── Stats.kt
│ │ │ │ └── serializer
│ │ │ │ │ ├── ByteArrayExt.kt
│ │ │ │ │ ├── SaveFileSerializer.kt
│ │ │ │ │ └── StatsSerializer.kt
│ │ │ └── level
│ │ │ │ ├── di
│ │ │ │ └── LevelModule.kt
│ │ │ │ ├── logic
│ │ │ │ ├── FlagAssistant.kt
│ │ │ │ ├── GameController.kt
│ │ │ │ ├── MinefieldCreator.kt
│ │ │ │ ├── MinefieldCreatorImpl.kt
│ │ │ │ ├── MinefieldCreatorNativeImpl.kt
│ │ │ │ ├── MinefieldExt.kt
│ │ │ │ ├── MinefieldHandler.kt
│ │ │ │ ├── NumberDimmer.kt
│ │ │ │ └── VisibleMineStream.kt
│ │ │ │ ├── models
│ │ │ │ └── ActionCompleted.kt
│ │ │ │ ├── repository
│ │ │ │ ├── MinefieldRepository.kt
│ │ │ │ ├── MinefieldRepositoryImpl.kt
│ │ │ │ ├── SavesRepository.kt
│ │ │ │ ├── SavesRepositoryImpl.kt
│ │ │ │ ├── StatsRepository.kt
│ │ │ │ ├── StatsRepositoryImpl.kt
│ │ │ │ ├── TipRepository.kt
│ │ │ │ └── TipRepositoryImpl.kt
│ │ │ │ ├── solver
│ │ │ │ ├── CheckNeighborsSolver.kt
│ │ │ │ ├── GameSolver.kt
│ │ │ │ └── LimitedCheckNeighborsSolver.kt
│ │ │ │ ├── utils
│ │ │ │ └── ClockManager.kt
│ │ │ │ ├── view
│ │ │ │ └── GameRenderFragment.kt
│ │ │ │ └── viewmodel
│ │ │ │ ├── GameEvent.kt
│ │ │ │ ├── GameState.kt
│ │ │ │ └── GameViewModel.kt
│ │ │ └── core
│ │ │ ├── analytics
│ │ │ ├── DebugAnalyticsManager.kt
│ │ │ └── ProdAnalyticsManager.kt
│ │ │ └── di
│ │ │ └── CommonModule.kt
│ └── res
│ │ ├── drawable
│ │ ├── close.xml
│ │ ├── ic_launcher_foreground.xml
│ │ ├── timer.xml
│ │ └── touch.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ ├── ic_launcher_round.xml
│ │ ├── shortcut_four.xml
│ │ ├── shortcut_one.xml
│ │ ├── shortcut_three.xml
│ │ └── shortcut_two.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.png
│ │ ├── ic_launcher_background.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.png
│ │ ├── ic_launcher_background.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.png
│ │ ├── ic_launcher_background.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.png
│ │ ├── ic_launcher_background.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.png
│ │ ├── ic_launcher_background.png
│ │ └── ic_launcher_round.png
│ │ ├── raw
│ │ └── mine_explosion_sound.ogg
│ │ ├── values
│ │ └── shortcut_colors.xml
│ │ └── xml
│ │ └── language_preferences.xml
│ └── test
│ └── java
│ └── dev
│ └── lucasnlm
│ └── antimine
│ └── common
│ ├── io
│ ├── ByteArrayExtTest.kt
│ ├── SaveSerializerTest.kt
│ └── StatsSerializerTest.kt
│ └── level
│ ├── di
│ ├── DisabledHapticFeedbackManager.kt
│ └── FixedMinefieldRepository.kt
│ ├── logic
│ ├── FlagAssistantTest.kt
│ ├── GameControllerTest.kt
│ ├── MinefieldCreatorTest.kt
│ ├── MinefieldFactoryTest.kt
│ └── MinefieldHandlerTest.kt
│ ├── mocks
│ └── FixedDimensionRepository.kt
│ ├── repository
│ └── MinefieldRepositoryTest.kt
│ ├── solver
│ ├── CheckNeighborsSolverTest.kt
│ └── LimitedCheckNeighborsSolverTest.kt
│ └── utils
│ └── ClockManagerTest.kt
├── control
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── dev
│ │ │ └── lucasnlm
│ │ │ └── antimine
│ │ │ └── control
│ │ │ ├── ControlActivity.kt
│ │ │ ├── SwitchButtonView.kt
│ │ │ ├── models
│ │ │ └── ControlDetails.kt
│ │ │ ├── view
│ │ │ ├── ControlAdapter.kt
│ │ │ └── ControlViewHolder.kt
│ │ │ └── viewmodel
│ │ │ ├── ControlEvent.kt
│ │ │ ├── ControlState.kt
│ │ │ └── ControlViewModel.kt
│ └── res
│ │ ├── drawable
│ │ ├── delete.xml
│ │ ├── touch.xml
│ │ └── undo.xml
│ │ └── layout
│ │ ├── activity_control.xml
│ │ ├── switch_button.xml
│ │ ├── view_control_item.xml
│ │ └── view_control_item_simple.xml
│ └── test
│ └── java
│ └── dev
│ └── lucasnlm
│ └── antimine
│ └── control
│ └── viewmodel
│ └── ControlViewModelTest.kt
├── core
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── dev
│ │ └── lucasnlm
│ │ └── antimine
│ │ └── core
│ │ ├── AppVersionManager.kt
│ │ ├── AreaExt.kt
│ │ ├── audio
│ │ ├── ComposerData.kt
│ │ ├── GameAudioManager.kt
│ │ └── GameAudioManagerImpl.kt
│ │ ├── cloud
│ │ └── CloudSaveManager.kt
│ │ ├── haptic
│ │ ├── HapticFeedbackManager.kt
│ │ └── HapticFeedbackManagerImpl.kt
│ │ ├── models
│ │ ├── Analytics.kt
│ │ ├── Area.kt
│ │ ├── Difficulty.kt
│ │ ├── Mark.kt
│ │ ├── MinefieldSize.kt
│ │ └── Score.kt
│ │ ├── repository
│ │ ├── DimensionRepository.kt
│ │ ├── DimensionRepositoryImpl.kt
│ │ └── WearDimensionRepositoryImpl.kt
│ │ └── viewmodel
│ │ ├── IntentViewModel.kt
│ │ └── StatelessViewModel.kt
│ └── res
│ ├── values-land
│ └── dimens.xml
│ └── values
│ └── dimens.xml
├── donation
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── dev
│ │ └── lucasnlm
│ │ └── antimine
│ │ └── donation
│ │ └── DonationActivity.kt
│ └── res
│ ├── drawable
│ ├── github.xml
│ ├── paypal.xml
│ └── pix.xml
│ └── layout
│ └── activity_donation.xml
├── external
├── .gitignore
├── build.gradle.kts
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── java
│ └── dev
│ └── lucasnlm
│ └── external
│ ├── Ads.kt
│ ├── AdsManager.kt
│ ├── AnalyticsManager.kt
│ ├── BillingManager.kt
│ ├── CloudStorageManager.kt
│ ├── CrashReporter.kt
│ ├── ExternalAnalyticsWrapper.kt
│ ├── FeatureFlagManager.kt
│ ├── InAppUpdateManager.kt
│ ├── InstantAppManager.kt
│ ├── PlayGamesManager.kt
│ ├── ReviewWrapper.kt
│ └── model
│ ├── CloudSave.kt
│ ├── Price.kt
│ └── PurchaseInfo.kt
├── fastlane
└── metadata
│ └── android
│ ├── PL-szl
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── af-ZA
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── ar-SA
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── be-BY
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── bg-BG
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── ca-ES
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── cs-CZ
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── da-DK
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── de-DE
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── el-GR
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── en-US
│ ├── full_description.txt
│ ├── images
│ │ └── phoneScreenshots
│ │ │ ├── 1.png
│ │ │ ├── 2.png
│ │ │ ├── 3.png
│ │ │ ├── 4.png
│ │ │ ├── 5.png
│ │ │ ├── 6.png
│ │ │ ├── 7.png
│ │ │ └── 8.png
│ ├── short_description.txt
│ └── title.txt
│ ├── eo-UY
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── es-ES
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── es-US
│ ├── full_description.txt
│ ├── short_description.txt
│ ├── title.txt
│ └── video.txt
│ ├── eu-ES
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── fa-IR
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── fi-FI
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── fil-PH
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── fr-FR
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── he-IL
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── hi-IN
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── hu-HU
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── id-ID
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── it-IT
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── ja-JP
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── ko-KR
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── ku-TR
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── lt-LT
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── lv-LV
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── nl-NL
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── no-NO
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── pl-PL
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── pt-BR
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── pt-PT
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── ro-RO
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── ru-RU
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── si-LK
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── sk-SK
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── sl-SI
│ ├── full_description.txt
│ ├── short_description.txt
│ ├── title.txt
│ └── video.txt
│ ├── sv-SE
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── ta-IN
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── th-TH
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── tr-TR
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── uk-UA
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── vec-IT
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── vi-VN
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ ├── zh-CN
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
│ └── zh-TW
│ ├── full_description.txt
│ ├── short_description.txt
│ └── title.txt
├── foss
├── .gitignore
├── build.gradle.kts
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── java
│ └── dev
│ └── lucasnlm
│ └── external
│ ├── BillingManagerImpl.kt
│ ├── CloudStorageManagerImpl.kt
│ ├── CrashReporterImpl.kt
│ ├── ExternalAnalyticsWrapperImpl.kt
│ ├── FeatureFlagManagerImpl.kt
│ ├── InAppUpdateManagerImpl.kt
│ ├── InstantAppManagerImpl.kt
│ ├── NoAdsManager.kt
│ ├── PlayGamesManagerImpl.kt
│ ├── ProprietaryAppWrapper.kt
│ ├── ReviewWrapperImpl.kt
│ └── di
│ └── ExternalModule.kt
├── gdx
├── .gitignore
├── build.gradle.kts
├── check_import.sh
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── assets
│ ├── classic.png
│ ├── glass.png
│ ├── oldschool.png
│ ├── oldschool2.png
│ ├── square-2.png
│ ├── square-3.png
│ ├── square.png
│ ├── standard.png
│ ├── stone-2.png
│ └── stone.png
│ └── java
│ └── dev
│ └── lucasnlm
│ └── antimine
│ └── gdx
│ ├── AtlasNames.kt
│ ├── GameApplicationListener.kt
│ ├── GameContext.kt
│ ├── GameTextureAtlas.kt
│ ├── GdxExt.kt
│ ├── actors
│ ├── AreaActor.kt
│ └── AreaForm.kt
│ ├── controller
│ ├── CameraController.kt
│ └── GameInputController.kt
│ ├── events
│ └── GdxEvent.kt
│ ├── models
│ ├── ActionSettings.kt
│ ├── GameRenderingContext.kt
│ ├── GameTextures.kt
│ └── InternalPadding.kt
│ └── stages
│ ├── GameInputListener.kt
│ └── MinefieldStage.kt
├── gradle.properties
├── gradle
├── libs.versions.toml
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── i18n
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── res
│ ├── values-af-rZA
│ └── strings.xml
│ ├── values-ar-rSA
│ └── strings.xml
│ ├── values-be-rBY
│ └── strings.xml
│ ├── values-bg-rBG
│ └── strings.xml
│ ├── values-ca-rES
│ └── strings.xml
│ ├── values-cs-rCZ
│ └── strings.xml
│ ├── values-da-rDK
│ └── strings.xml
│ ├── values-de-rDE
│ └── strings.xml
│ ├── values-el-rGR
│ └── strings.xml
│ ├── values-en-rUS
│ └── strings.xml
│ ├── values-eo-rUY
│ └── strings.xml
│ ├── values-es-rES
│ └── strings.xml
│ ├── values-eu-rES
│ └── strings.xml
│ ├── values-fa-rIR
│ └── strings.xml
│ ├── values-fi-rFI
│ └── strings.xml
│ ├── values-fil-rPH
│ └── strings.xml
│ ├── values-fr-rFR
│ └── strings.xml
│ ├── values-hi-rIN
│ └── strings.xml
│ ├── values-hu-rHU
│ └── strings.xml
│ ├── values-in-rID
│ └── strings.xml
│ ├── values-it-rIT
│ └── strings.xml
│ ├── values-iw-rIL
│ └── strings.xml
│ ├── values-ja-rJP
│ └── strings.xml
│ ├── values-ko-rKR
│ └── strings.xml
│ ├── values-ku-rTR
│ └── strings.xml
│ ├── values-lt-rLT
│ └── strings.xml
│ ├── values-lv-rLV
│ └── strings.xml
│ ├── values-nl-rNL
│ └── strings.xml
│ ├── values-no-rNO
│ └── strings.xml
│ ├── values-pl-rPL
│ └── strings.xml
│ ├── values-pt-rBR
│ └── strings.xml
│ ├── values-pt-rPT
│ └── strings.xml
│ ├── values-ro-rRO
│ └── strings.xml
│ ├── values-ru-rRU
│ └── strings.xml
│ ├── values-si-rLK
│ └── strings.xml
│ ├── values-sk-rSK
│ └── strings.xml
│ ├── values-sl-rSI
│ └── strings.xml
│ ├── values-sv-rSE
│ └── strings.xml
│ ├── values-szl
│ └── strings.xml
│ ├── values-ta-rIN
│ └── strings.xml
│ ├── values-th-rTH
│ └── strings.xml
│ ├── values-tr-rTR
│ └── strings.xml
│ ├── values-uk-rUA
│ └── strings.xml
│ ├── values-vec-rIT
│ └── strings.xml
│ ├── values-vi-rVN
│ └── strings.xml
│ ├── values-zh-rCN
│ └── strings.xml
│ ├── values-zh-rTW
│ └── strings.xml
│ ├── values
│ └── strings.xml
│ └── xml
│ └── locales_config.xml
├── instant
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ └── main
│ └── AndroidManifest.xml
├── lint.xml
├── preferences
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ ├── main
│ ├── AndroidManifest.xml
│ └── java
│ │ └── dev
│ │ └── lucasnlm
│ │ └── antimine
│ │ └── preferences
│ │ ├── PreferenceKeys.kt
│ │ ├── PreferencesManager.kt
│ │ ├── PreferencesManagerImpl.kt
│ │ ├── PreferencesRepository.kt
│ │ ├── PreferencesRepositoryImpl.kt
│ │ └── models
│ │ ├── GameControl.kt
│ │ └── Minefield.kt
│ └── test
│ └── java
│ └── dev
│ └── lucasnlm
│ └── antimine
│ └── preferences
│ └── PreferencesRepositoryTest.kt
├── proprietary
├── .gitignore
├── build.gradle.kts
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── dev
│ │ └── lucasnlm
│ │ └── external
│ │ ├── AdMobAdsManager.kt
│ │ ├── BillingManagerImpl.kt
│ │ ├── CloudStorageManagerImpl.kt
│ │ ├── CrashReporterImpl.kt
│ │ ├── ExternalAnalyticsWrapperImpl.kt
│ │ ├── FeatureFlagManagerImpl.kt
│ │ ├── InAppUpdateManagerImpl.kt
│ │ ├── InstantAppManagerImpl.kt
│ │ ├── PlayGamesManagerImpl.kt
│ │ ├── ReviewWrapperImpl.kt
│ │ └── di
│ │ └── ExternalModule.kt
│ └── res
│ └── values
│ └── values.xml
├── settings.gradle.kts
├── sgtatham
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── cpp
│ ├── CMakeLists.txt
│ ├── common.h
│ ├── malloc.h
│ ├── minefield_creator.cpp
│ ├── minefield_creator.h
│ ├── minefield_solver.h
│ ├── random_generator.cpp
│ ├── random_generator.h
│ ├── sgtatham.cpp
│ ├── tree234.cpp
│ └── tree234.h
│ └── java
│ └── dev
│ └── lucasnlm
│ └── antimine
│ └── sgtatham
│ └── SgTathamMines.kt
├── textures
├── 1.svg
├── 2.svg
├── 3.svg
├── 4.svg
├── 5.svg
├── 6.svg
├── 7.svg
├── 8.svg
├── flag.svg
├── mine.svg
├── packer.tpproj
└── question.svg
├── themes
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── dev
│ │ │ └── lucasnlm
│ │ │ └── antimine
│ │ │ └── themes
│ │ │ ├── ThemeActivity.kt
│ │ │ ├── view
│ │ │ ├── SkinAdapter.kt
│ │ │ └── ThemeAdapter.kt
│ │ │ └── viewmodel
│ │ │ ├── ThemeEvent.kt
│ │ │ ├── ThemeState.kt
│ │ │ └── ThemeViewModel.kt
│ └── res
│ │ ├── drawable
│ │ ├── delete.xml
│ │ ├── lock.xml
│ │ ├── movie.xml
│ │ └── undo.xml
│ │ ├── layout-land
│ │ └── activity_theme.xml
│ │ ├── layout
│ │ ├── activity_theme.xml
│ │ ├── view_skin.xml
│ │ └── view_theme.xml
│ │ └── values
│ │ └── dimens.xml
│ └── test
│ └── java
│ └── dev
│ └── lucasnlm
│ └── antimine
│ └── themes
│ └── ThemeViewModelTest.kt
├── tutorial
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── dev
│ │ └── lucasnlm
│ │ └── antimine
│ │ └── tutorial
│ │ └── TutorialActivity.kt
│ └── res
│ ├── drawable
│ ├── tutorial_example_1.webp
│ ├── tutorial_example_2.webp
│ ├── tutorial_example_3.webp
│ └── tutorial_example_4.webp
│ └── layout
│ └── tutorial_activity.xml
├── ui
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── dev
│ │ │ └── lucasnlm
│ │ │ └── antimine
│ │ │ └── ui
│ │ │ ├── ext
│ │ │ ├── ColorExt.kt
│ │ │ ├── SnackbarExt.kt
│ │ │ └── ThemedActivity.kt
│ │ │ ├── model
│ │ │ ├── AppSkin.kt
│ │ │ ├── AppTheme.kt
│ │ │ ├── AreaPalette.kt
│ │ │ └── TopBarAction.kt
│ │ │ ├── repository
│ │ │ ├── Skins.kt
│ │ │ ├── ThemeRepository.kt
│ │ │ ├── ThemeRepositoryImpl.kt
│ │ │ └── Themes.kt
│ │ │ └── view
│ │ │ ├── CardButtonView.kt
│ │ │ ├── OfferCardButtonView.kt
│ │ │ └── SpaceItemDecoration.kt
│ └── res
│ │ ├── drawable
│ │ ├── back_arrow.xml
│ │ ├── close.xml
│ │ ├── flag.xml
│ │ ├── flag_black.xml
│ │ ├── mine.xml
│ │ ├── offer.xml
│ │ ├── oldschool.png
│ │ ├── oldschool2.png
│ │ ├── question.xml
│ │ ├── skin_classic.webp
│ │ ├── skin_glass_2.webp
│ │ ├── skin_square.webp
│ │ ├── skin_square_2.webp
│ │ ├── skin_square_3.webp
│ │ ├── skin_standard.webp
│ │ ├── skin_standard_no_connection.webp
│ │ ├── skin_stone.webp
│ │ └── skin_stone_2.webp
│ │ ├── layout
│ │ ├── view_card_button.xml
│ │ └── view_offer_card_button.xml
│ │ ├── values-car
│ │ └── specifiq.xml
│ │ ├── values-night
│ │ └── colors.xml
│ │ └── values
│ │ ├── colors.xml
│ │ ├── colors_amoled.xml
│ │ ├── colors_banana_light.xml
│ │ ├── colors_dark.xml
│ │ ├── colors_dark_banana.xml
│ │ ├── colors_dark_blue.xml
│ │ ├── colors_dark_lime.xml
│ │ ├── colors_dark_orange.xml
│ │ ├── colors_dark_pink.xml
│ │ ├── colors_dark_purple.xml
│ │ ├── colors_dark_red.xml
│ │ ├── colors_light.xml
│ │ ├── colors_light_blue.xml
│ │ ├── colors_light_garden.xml
│ │ ├── colors_light_pink.xml
│ │ ├── colors_light_purple.xml
│ │ ├── specifiq.xml
│ │ └── themes.xml
│ └── test
│ └── java
│ └── dev
│ └── lucasnlm
│ └── antimine
│ └── ui
│ └── repository
│ └── ThemeRepositoryTest.kt
├── utils
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── java
│ └── dev
│ └── lucasnlm
│ └── antimine
│ └── utils
│ ├── ActivityExt.kt
│ ├── BuildExt.kt
│ ├── BundleExt.kt
│ └── ContextExt.kt
└── wear
├── .gitignore
├── build.gradle.kts
├── proguard-rules.pro
└── src
└── main
├── AndroidManifest.xml
├── java
└── dev
│ └── lucasnlm
│ └── antimine
│ └── wear
│ ├── WearMainApplication.kt
│ ├── core
│ └── AppVersionManagerImpl.kt
│ ├── di
│ ├── AppModule.kt
│ └── ViewModelModule.kt
│ ├── game
│ ├── WearGameActivity.kt
│ └── view
│ │ └── CustomDismissibleFrameLayout.kt
│ ├── main
│ ├── ControlTypeActivity.kt
│ ├── DifficultyActivity.kt
│ ├── MainActivity.kt
│ ├── StartActivity.kt
│ ├── WearThemeActivity.kt
│ ├── models
│ │ ├── ControlTypeItem.kt
│ │ └── MenuItem.kt
│ └── view
│ │ ├── ControlTypeListAdapter.kt
│ │ ├── MainMenuAdapter.kt
│ │ └── ThemeListAdapter.kt
│ ├── message
│ ├── EmojiMessageActivity.kt
│ ├── GameOverActivity.kt
│ ├── MessageActivity.kt
│ └── VictoryActivity.kt
│ └── tutorial
│ └── WearTutorialActivity.kt
└── res
├── drawable
├── about.xml
├── add.xml
├── check.xml
├── close.xml
├── control.xml
├── emoji_bomb.xml
├── emoji_smiling_face_with_sunglasses.xml
├── flag.xml
├── play.xml
├── radio_button_checked.xml
├── radio_button_unchecked.xml
├── refresh.xml
├── round_arrow.xml
├── round_background.xml
├── shovel.xml
├── splash_screen.xml
├── themes.xml
├── touch.xml
├── tutorial.xml
├── tutorial_example_1.png
├── tutorial_example_2.png
├── tutorial_example_3.png
└── tutorial_example_4.png
├── layout
├── activity_control_types.xml
├── activity_difficulty.xml
├── activity_game.xml
├── activity_game_over.xml
├── activity_main.xml
├── activity_message.xml
├── activity_themes.xml
├── activity_tutorial.xml
├── view_control_type_item.xml
├── view_menu_item.xml
└── view_theme.xml
└── values
└── themes.xml
/.editorconfig:
--------------------------------------------------------------------------------
1 | [*.{kt,kts}]
2 | indent_size=4
3 | insert_final_newline=true
4 | max_line_length=120
5 | ij_kotlin_allow_trailing_comma_on_call_site=true
6 | ij_kotlin_allow_trailing_comma=true
7 | ktlint_standard_no-wildcard-imports=disabled
8 | ktlint_standard_no-empty-first-line-in-class-body=disabled
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: [lucasnlm]
4 | patreon: # Replace with a single Patreon username
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
13 | custom: ["paypal.com/donate/?hosted_button_id=KW7WWYKDP6G2U"]
14 |
--------------------------------------------------------------------------------
/.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 |
15 | **What control style do you use?**
16 | You can check which control is selected on "Controls" screen.
17 |
18 | **Expected behavior**
19 |
20 | **Screenshots**
21 | If applicable, add screenshots to help explain your problem.
22 |
23 | **Android Version:**
24 |
25 | **App Version**
26 |
--------------------------------------------------------------------------------
/.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 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/question.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Question
3 | about: A general question about the game or its implementation
4 | title: ''
5 | labels: question
6 | assignees: ''
7 |
8 | ---
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.github/changelog/10a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/10a.png
--------------------------------------------------------------------------------
/.github/changelog/10b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/10b.png
--------------------------------------------------------------------------------
/.github/changelog/11a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/11a.png
--------------------------------------------------------------------------------
/.github/changelog/11b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/11b.png
--------------------------------------------------------------------------------
/.github/changelog/12a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/12a.png
--------------------------------------------------------------------------------
/.github/changelog/12b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/12b.png
--------------------------------------------------------------------------------
/.github/changelog/14a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/14a.png
--------------------------------------------------------------------------------
/.github/changelog/14b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/14b.png
--------------------------------------------------------------------------------
/.github/changelog/15a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/15a.png
--------------------------------------------------------------------------------
/.github/changelog/15b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/15b.png
--------------------------------------------------------------------------------
/.github/changelog/17a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/17a.png
--------------------------------------------------------------------------------
/.github/changelog/17b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/17b.png
--------------------------------------------------------------------------------
/.github/changelog/1a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/1a.png
--------------------------------------------------------------------------------
/.github/changelog/1b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/1b.png
--------------------------------------------------------------------------------
/.github/changelog/3a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/3a.png
--------------------------------------------------------------------------------
/.github/changelog/3b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/3b.png
--------------------------------------------------------------------------------
/.github/changelog/4a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/4a.png
--------------------------------------------------------------------------------
/.github/changelog/4b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/4b.png
--------------------------------------------------------------------------------
/.github/changelog/5a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/5a.png
--------------------------------------------------------------------------------
/.github/changelog/5b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/5b.png
--------------------------------------------------------------------------------
/.github/changelog/6a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/6a.png
--------------------------------------------------------------------------------
/.github/changelog/6b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/6b.png
--------------------------------------------------------------------------------
/.github/changelog/8a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/8a.png
--------------------------------------------------------------------------------
/.github/changelog/8b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/8b.png
--------------------------------------------------------------------------------
/.github/changelog/9a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/9a.png
--------------------------------------------------------------------------------
/.github/changelog/9b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/changelog/9b.png
--------------------------------------------------------------------------------
/.github/fdroid.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/fdroid.png
--------------------------------------------------------------------------------
/.github/google_play.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/.github/google_play.png
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 | .idea/
10 | app/local.properties
11 | *.apk
12 | app/release/
13 | app/standalone/
14 | app/google/
15 | app/google-services.json
16 | proprietary/google-services.json
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | Pull requests are welcome. :tada:
4 |
5 | ## Localization
6 |
7 | You can help with localization via [crowdin](https://crowdin.com/project/antimine-android).
8 |
9 | ## New Features
10 |
11 | When contributing to this repository, please first discuss the change you wish to make via issue,
12 | email, or any other method with the owners of this repository before making a change.
13 |
14 | ## Small Changes
15 |
16 | If you want to make a small change there's no need to open an issue. You can open a Pull Request directly.
17 |
--------------------------------------------------------------------------------
/about/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/about/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/about/consumer-rules.pro
--------------------------------------------------------------------------------
/about/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
2 | -dontwarn com.google.android.material.R$attr
3 | -dontwarn dev.lucasnlm.antimine.i18n.R$string
4 |
--------------------------------------------------------------------------------
/about/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
9 |
10 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/about/src/main/java/dev/lucasnlm/antimine/about/AboutActivity.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.about
2 |
3 | import android.os.Bundle
4 | import androidx.fragment.app.commit
5 | import dev.lucasnlm.antimine.about.databinding.ActivityContainerBinding
6 | import dev.lucasnlm.antimine.about.views.AboutInfoFragment
7 | import dev.lucasnlm.antimine.ui.ext.ThemedActivity
8 |
9 | class AboutActivity : ThemedActivity() {
10 | override fun onCreate(savedInstanceState: Bundle?) {
11 | super.onCreate(savedInstanceState)
12 | val binding = ActivityContainerBinding.inflate(layoutInflater)
13 | setContentView(binding.root)
14 |
15 | bindToolbar(binding.toolbar)
16 |
17 | supportFragmentManager.commit(allowStateLoss = true) {
18 | replace(binding.content.id, AboutInfoFragment())
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/about/src/main/java/dev/lucasnlm/antimine/about/viewmodel/AboutEvent.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.about.viewmodel
2 |
3 | enum class AboutEvent {
4 | ThirdPartyLicenses,
5 | SourceCode,
6 | Translators,
7 | }
8 |
--------------------------------------------------------------------------------
/about/src/main/java/dev/lucasnlm/antimine/licenses/viewmodel/LicenseState.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.licenses.viewmodel
2 |
3 | data class License(
4 | val name: String,
5 | val url: String,
6 | )
7 |
8 | data class LicenseState(
9 | val licenses: List,
10 | )
11 |
--------------------------------------------------------------------------------
/about/src/main/res/drawable/open_in_new.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/foss/release/output-metadata.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 3,
3 | "artifactType": {
4 | "type": "APK",
5 | "kind": "Directory"
6 | },
7 | "applicationId": "dev.lucanlm.antimine",
8 | "variantName": "fossRelease",
9 | "elements": [
10 | {
11 | "type": "SINGLE",
12 | "filters": [],
13 | "attributes": [],
14 | "versionCode": 1702001,
15 | "versionName": "17.2.0 F",
16 | "outputFile": "app-foss-release.apk"
17 | }
18 | ],
19 | "elementType": "File"
20 | }
--------------------------------------------------------------------------------
/app/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/app/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/app/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | zipStoreBase=GRADLE_USER_HOME
4 | zipStorePath=wrapper/dists
5 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
6 | distributionSha256Sum=3239b5ed86c3838a37d983ac100573f64c1f3fd8e1eb6c89fa5f9529b5ec091d
7 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/custom/viewmodel/CustomEvent.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.custom.viewmodel
2 |
3 | import dev.lucasnlm.antimine.preferences.models.Minefield
4 |
5 | sealed class CustomEvent {
6 | data class UpdateCustomGameEvent(
7 | val minefield: Minefield,
8 | ) : CustomEvent()
9 | }
10 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/custom/viewmodel/CustomState.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.custom.viewmodel
2 |
3 | data class CustomState(
4 | val width: Int,
5 | val height: Int,
6 | val mines: Int,
7 | )
8 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/gameover/model/GameResult.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.gameover.model
2 |
3 | enum class GameResult {
4 | Victory,
5 | GameOver,
6 | Completed,
7 | }
8 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/gameover/viewmodel/EndGameDialogEvent.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.gameover.viewmodel
2 |
3 | import androidx.annotation.DrawableRes
4 | import dev.lucasnlm.antimine.gameover.model.GameResult
5 |
6 | sealed class EndGameDialogEvent {
7 | data class BuildCustomEndGame(
8 | val gameResult: GameResult,
9 | val showContinueButton: Boolean,
10 | val time: Long,
11 | val rightMines: Int,
12 | val totalMines: Int,
13 | val received: Int,
14 | val turn: Int,
15 | ) : EndGameDialogEvent()
16 |
17 | data class ChangeEmoji(
18 | val gameResult: GameResult,
19 | @DrawableRes val titleEmoji: Int,
20 | ) : EndGameDialogEvent()
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/gameover/viewmodel/EndGameDialogState.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.gameover.viewmodel
2 |
3 | import androidx.annotation.DrawableRes
4 | import dev.lucasnlm.antimine.gameover.model.GameResult
5 |
6 | data class EndGameDialogState(
7 | @DrawableRes val titleEmoji: Int,
8 | val title: String,
9 | val message: String,
10 | val gameResult: GameResult,
11 | val showContinueButton: Boolean,
12 | val received: Int,
13 | val showTutorial: Boolean,
14 | val showMusicDialog: Boolean,
15 | )
16 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/history/HistoryActivity.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.history
2 |
3 | import android.os.Bundle
4 | import androidx.fragment.app.commit
5 | import androidx.fragment.app.replace
6 | import dev.lucasnlm.antimine.databinding.ActivityHistoryBinding
7 | import dev.lucasnlm.antimine.history.views.HistoryFragment
8 | import dev.lucasnlm.antimine.ui.ext.ThemedActivity
9 |
10 | class HistoryActivity : ThemedActivity() {
11 | override fun onCreate(savedInstanceState: Bundle?) {
12 | super.onCreate(savedInstanceState)
13 | val binding = ActivityHistoryBinding.inflate(layoutInflater)
14 | setContentView(binding.root)
15 |
16 | bindToolbar(binding.toolbar)
17 |
18 | supportFragmentManager.commit(allowStateLoss = true) {
19 | replace(binding.content.id)
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/history/viewmodel/HistoryEvent.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.history.viewmodel
2 |
3 | sealed class HistoryEvent {
4 | data object LoadAllSaves : HistoryEvent()
5 |
6 | data class ReplaySave(val id: String) : HistoryEvent()
7 |
8 | data class LoadSave(val id: String) : HistoryEvent()
9 | }
10 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/history/viewmodel/HistoryState.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.history.viewmodel
2 |
3 | import dev.lucasnlm.antimine.common.io.models.Save
4 |
5 | data class HistoryState(
6 | val loading: Boolean,
7 | val saveList: List,
8 | )
9 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/l10n/GameLocaleManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.l10n
2 |
3 | import java.util.*
4 |
5 | interface GameLocaleManager {
6 | fun getAllGameLocaleTags(): List
7 |
8 | fun setGameLocale(tag: String)
9 |
10 | fun getGameLocale(): Locale?
11 |
12 | fun applyPreferredLocaleIfNeeded()
13 | }
14 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/l10n/models/GameLanguage.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.l10n.models
2 |
3 | import java.util.*
4 |
5 | data class GameLanguage(
6 | val id: Int,
7 | val locale: Locale,
8 | val name: String,
9 | )
10 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/l10n/viewmodel/LocalizationEvent.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.l10n.viewmodel
2 |
3 | import java.util.Locale
4 |
5 | sealed class LocalizationEvent {
6 | data object LoadAllLanguages : LocalizationEvent()
7 |
8 | data object FinishActivity : LocalizationEvent()
9 |
10 | data class SetLanguage(val locale: Locale) : LocalizationEvent()
11 | }
12 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/l10n/viewmodel/LocalizationState.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.l10n.viewmodel
2 |
3 | import dev.lucasnlm.antimine.l10n.models.GameLanguage
4 |
5 | data class LocalizationState(
6 | val loading: Boolean,
7 | val languages: List,
8 | )
9 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/main/viewmodel/MainEvent.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.main.viewmodel
2 |
3 | import android.content.Intent
4 | import dev.lucasnlm.antimine.core.models.Difficulty
5 |
6 | sealed class MainEvent {
7 | data object ContinueGameEvent : MainEvent()
8 |
9 | data class StartNewGameEvent(
10 | val difficulty: Difficulty,
11 | ) : MainEvent()
12 |
13 | data object ShowCustomDifficultyDialogEvent : MainEvent()
14 |
15 | data object StartTutorialEvent : MainEvent()
16 |
17 | data object StartLanguageEvent : MainEvent()
18 |
19 | data class OpenActivity(
20 | val intent: Intent,
21 | ) : MainEvent()
22 |
23 | data object ShowControlsEvent : MainEvent()
24 |
25 | data object Recreate : MainEvent()
26 |
27 | data object ShowGooglePlayGamesEvent : MainEvent()
28 |
29 | data class FetchCloudSave(
30 | val playGamesId: String,
31 | ) : MainEvent()
32 | }
33 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/playgames/model/PlayGamesItem.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.playgames.model
2 |
3 | import androidx.annotation.DrawableRes
4 | import androidx.annotation.StringRes
5 | import dev.lucasnlm.antimine.playgames.viewmodel.PlayGamesEvent
6 |
7 | data class PlayGamesItem(
8 | val id: Int,
9 | @DrawableRes val iconRes: Int,
10 | @StringRes val stringRes: Int,
11 | val triggerEvent: PlayGamesEvent,
12 | )
13 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/playgames/view/PlayGamesButtonView.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.playgames.view
2 |
3 | import android.content.Context
4 | import android.util.AttributeSet
5 | import android.view.LayoutInflater
6 | import android.widget.FrameLayout
7 | import dev.lucasnlm.antimine.databinding.ViewPlayGamesButtonBinding
8 |
9 | class PlayGamesButtonView : FrameLayout {
10 | constructor(context: Context) : super(context)
11 | constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
12 | constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
13 |
14 | val binding: ViewPlayGamesButtonBinding
15 |
16 | init {
17 | val layoutInflater = LayoutInflater.from(context)
18 | binding = ViewPlayGamesButtonBinding.inflate(layoutInflater, this, true)
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/playgames/viewmodel/PlayGamesEvent.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.playgames.viewmodel
2 |
3 | sealed class PlayGamesEvent {
4 | data object OpenAchievements : PlayGamesEvent()
5 |
6 | data object OpenLeaderboards : PlayGamesEvent()
7 | }
8 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/stats/model/StatsModel.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.stats.model
2 |
3 | import androidx.annotation.StringRes
4 |
5 | data class StatsModel(
6 | @StringRes val title: Int,
7 | val totalGames: Int,
8 | val totalTime: Long,
9 | val victoryTime: Long,
10 | val averageTime: Long,
11 | val shortestTime: Long,
12 | val mines: Int,
13 | val victory: Int,
14 | val openArea: Int,
15 | )
16 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/stats/model/StatsState.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.stats.model
2 |
3 | data class StatsState(
4 | val stats: List,
5 | )
6 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/stats/viewmodel/StatsEvent.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.stats.viewmodel
2 |
3 | sealed class StatsEvent {
4 | data object LoadStats : StatsEvent()
5 |
6 | data object DeleteStats : StatsEvent()
7 | }
8 |
--------------------------------------------------------------------------------
/app/src/main/java/dev/lucasnlm/antimine/support/AppVersionManagerImpl.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.support
2 |
3 | import android.app.Application
4 | import dev.lucasnlm.antimine.core.AppVersionManager
5 |
6 | class AppVersionManagerImpl(
7 | private val debug: Boolean,
8 | private val application: Application,
9 | ) : AppVersionManager {
10 | private val valid by lazy {
11 | val id = application.packageName
12 | debug || id == "com.logical.minato" || id == "dev.lucasnlm.antimine" || id == "dev.lucanlm.antimine"
13 | }
14 |
15 | override fun isValid(): Boolean {
16 | // If you want to distribution a fork of this game,
17 | // please check its LICENSE and conditions before do it.
18 | // Any fork / changed version must also be open sourced.
19 | return valid
20 | }
21 |
22 | override fun isWatch(): Boolean {
23 | return false
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/app/src/main/res/anim/fast_shake.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/arrow_left.xml:
--------------------------------------------------------------------------------
1 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/close.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/custom.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/delete.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/export_file.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/fixed_size.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/heart.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/hex_banner.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/app/src/main/res/drawable/hex_banner.webp
--------------------------------------------------------------------------------
/app/src/main/res/drawable/import_file.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/info.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/money.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/more.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/movie.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/music.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/old_games.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/play.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/progressive.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/replay.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/retry.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/round_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/stats.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/themes.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/tutorial.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/view.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/watch_ads_icon.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 00:00
4 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/automotive_app_desc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/backup.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
11 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/data_extraction_rules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/file_paths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
--------------------------------------------------------------------------------
/app/src/test/java/dev/lucasnlm/antimine/IntentViewModelTest.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine
2 |
3 | import androidx.annotation.CallSuper
4 | import kotlinx.coroutines.Dispatchers
5 | import kotlinx.coroutines.test.UnconfinedTestDispatcher
6 | import kotlinx.coroutines.test.resetMain
7 | import kotlinx.coroutines.test.setMain
8 | import org.junit.After
9 | import org.junit.Before
10 |
11 | abstract class IntentViewModelTest {
12 | private val dispatcher = UnconfinedTestDispatcher()
13 |
14 | @CallSuper
15 | @Before
16 | open fun setup() {
17 | Dispatchers.setMain(dispatcher)
18 | }
19 |
20 | @CallSuper
21 | @After
22 | open fun tearDown() {
23 | Dispatchers.resetMain()
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/app/src/test/java/dev/lucasnlm/antimine/TestApplication.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine
2 |
3 | import android.app.Application
4 |
5 | class TestApplication : Application()
6 |
--------------------------------------------------------------------------------
/app/src/test/java/dev/lucasnlm/antimine/mocks/DisabledHapticFeedbackManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.mocks
2 |
3 | import dev.lucasnlm.antimine.core.haptic.HapticFeedbackManager
4 |
5 | class DisabledHapticFeedbackManager : HapticFeedbackManager {
6 | override fun longPressFeedback() {
7 | // Empty
8 | }
9 |
10 | override fun explosionFeedback() {
11 | // Empty
12 | }
13 |
14 | override fun tutorialErrorFeedback() {
15 | // Empty
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/test/java/dev/lucasnlm/antimine/mocks/MemoryStatsRepository.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.mocks
2 |
3 | import dev.lucasnlm.antimine.common.io.models.Stats
4 | import dev.lucasnlm.antimine.common.level.repository.StatsRepository
5 |
6 | class MemoryStatsRepository(
7 | private val memoryStats: MutableList = mutableListOf(),
8 | ) : StatsRepository {
9 | override suspend fun getAllStats(): List {
10 | return memoryStats
11 | }
12 |
13 | override suspend fun addAllStats(stats: List) {
14 | memoryStats.addAll(stats)
15 | }
16 |
17 | override suspend fun addStats(stats: Stats) {
18 | memoryStats.add(stats)
19 | }
20 |
21 | override suspend fun deleteLastStats() {
22 | memoryStats.clear()
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/audio-low/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/audio-low/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("com.android.library")
3 | id("kotlin-android")
4 | }
5 |
6 | android {
7 | namespace = "dev.lucasnlm.antimine.audio"
8 |
9 | defaultConfig {
10 | minSdk = libs.versions.minSdk.get().toInt()
11 | compileSdk = libs.versions.compileSdk.get().toInt()
12 | }
13 |
14 | buildTypes {
15 | release {
16 | isMinifyEnabled = false
17 | setProguardFiles(listOf(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"))
18 | }
19 | }
20 |
21 | compileOptions {
22 | sourceCompatibility = JavaVersion.VERSION_11
23 | targetCompatibility = JavaVersion.VERSION_11
24 | }
25 |
26 | kotlinOptions {
27 | jvmTarget = JavaVersion.VERSION_11.toString()
28 | }
29 |
30 | buildFeatures {
31 | buildConfig = true
32 | viewBinding = true
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/audio-low/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/consumer-rules.pro
--------------------------------------------------------------------------------
/audio-low/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
2 | -dontwarn com.google.android.material.R$attr
3 | -dontwarn dev.lucasnlm.antimine.i18n.R$string
4 |
--------------------------------------------------------------------------------
/audio-low/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/audio-low/src/main/assets/bomb_explosion.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/bomb_explosion.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/menu_click.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/menu_click.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/menu_click_alt.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/menu_click_alt.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/menu_click_alt_2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/menu_click_alt_2.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/music.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/music.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/open_area_0.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/open_area_0.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/open_area_1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/open_area_1.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/open_area_2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/open_area_2.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/open_area_3.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/open_area_3.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/open_multiple_0.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/open_multiple_0.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/open_multiple_1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/open_multiple_1.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/open_multiple_2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/open_multiple_2.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/put_flag_0.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/put_flag_0.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/put_flag_1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/put_flag_1.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/put_flag_2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/put_flag_2.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/reveal_mine_0.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/reveal_mine_0.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/reveal_mine_1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/reveal_mine_1.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/reveal_mine_2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/reveal_mine_2.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/reveal_mine_reload.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/reveal_mine_reload.ogg
--------------------------------------------------------------------------------
/audio-low/src/main/assets/win.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio-low/src/main/assets/win.ogg
--------------------------------------------------------------------------------
/audio/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/audio/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("com.android.library")
3 | id("kotlin-android")
4 | }
5 |
6 | android {
7 | namespace = "dev.lucasnlm.antimine.audio"
8 |
9 | defaultConfig {
10 | minSdk = libs.versions.minSdk.get().toInt()
11 | compileSdk = libs.versions.compileSdk.get().toInt()
12 | }
13 |
14 | buildTypes {
15 | release {
16 | isMinifyEnabled = false
17 | setProguardFiles(listOf(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"))
18 | }
19 | }
20 |
21 | compileOptions {
22 | sourceCompatibility = JavaVersion.VERSION_11
23 | targetCompatibility = JavaVersion.VERSION_11
24 | }
25 |
26 | kotlinOptions {
27 | jvmTarget = JavaVersion.VERSION_11.toString()
28 | }
29 |
30 | buildFeatures {
31 | buildConfig = true
32 | viewBinding = true
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/audio/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/consumer-rules.pro
--------------------------------------------------------------------------------
/audio/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
2 | -dontwarn com.google.android.material.R$attr
3 | -dontwarn dev.lucasnlm.antimine.i18n.R$string
4 |
--------------------------------------------------------------------------------
/audio/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/audio/src/main/assets/bomb_explosion.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/bomb_explosion.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/menu_click.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/menu_click.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/menu_click_alt.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/menu_click_alt.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/menu_click_alt_2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/menu_click_alt_2.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/music.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/music.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/open_area_0.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/open_area_0.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/open_area_1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/open_area_1.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/open_area_2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/open_area_2.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/open_area_3.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/open_area_3.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/open_multiple_0.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/open_multiple_0.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/open_multiple_1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/open_multiple_1.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/open_multiple_2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/open_multiple_2.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/put_flag_0.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/put_flag_0.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/put_flag_1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/put_flag_1.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/put_flag_2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/put_flag_2.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/reveal_mine_0.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/reveal_mine_0.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/reveal_mine_1.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/reveal_mine_1.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/reveal_mine_2.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/reveal_mine_2.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/reveal_mine_reload.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/reveal_mine_reload.ogg
--------------------------------------------------------------------------------
/audio/src/main/assets/win.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/audio/src/main/assets/win.ogg
--------------------------------------------------------------------------------
/auto/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/auto/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("com.android.library")
3 | id("kotlin-android")
4 | }
5 |
6 | android {
7 | namespace = "dev.lucasnlm.antimine.auto"
8 |
9 | defaultConfig {
10 | minSdk = libs.versions.minSdk.get().toInt()
11 | compileSdk = libs.versions.compileSdk.get().toInt()
12 | }
13 |
14 | buildTypes {
15 | release {
16 | isMinifyEnabled = false
17 | setProguardFiles(listOf(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"))
18 | }
19 | }
20 |
21 | compileOptions {
22 | sourceCompatibility = JavaVersion.VERSION_11
23 | targetCompatibility = JavaVersion.VERSION_11
24 | }
25 |
26 | kotlinOptions {
27 | jvmTarget = JavaVersion.VERSION_11.toString()
28 | }
29 |
30 | buildFeatures {
31 | buildConfig = true
32 | viewBinding = true
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/auto/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/auto/consumer-rules.pro
--------------------------------------------------------------------------------
/auto/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
--------------------------------------------------------------------------------
/auto/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
9 |
12 |
15 |
18 |
--------------------------------------------------------------------------------
/build.gradle.kts:
--------------------------------------------------------------------------------
1 | buildscript {
2 | dependencies {
3 | if (System.getenv("IS_GOOGLE_BUILD") == "1") {
4 | classpath("com.bugsnag:bugsnag-android-gradle-plugin:8.1.0")
5 | }
6 | }
7 | }
8 |
9 | plugins {
10 | alias(libs.plugins.android) apply false
11 | alias(libs.plugins.android.library) apply false
12 | alias(libs.plugins.kotlin.android) apply false
13 |
14 | if (System.getenv("IS_GOOGLE_BUILD")?.isNotBlank() == true) {
15 | alias(libs.plugins.google.services) apply false
16 | }
17 | }
18 |
19 | allprojects {
20 | repositories {
21 | mavenCentral()
22 | google()
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/common/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/common/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/common/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-bin.zip
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionSha256Sum=3239b5ed86c3838a37d983ac100573f64c1f3fd8e1eb6c89fa5f9529b5ec091d
7 |
--------------------------------------------------------------------------------
/common/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
2 | -dontwarn com.google.android.material.R$attr
3 | -dontwarn dev.lucasnlm.antimine.i18n.R$string
4 |
--------------------------------------------------------------------------------
/common/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/common/src/main/java/dev/lucasnlm/antimine/common/auto/AutoExt.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.common.auto
2 |
3 | import android.content.Context
4 | import android.content.pm.PackageManager
5 | import android.os.Build
6 | import androidx.annotation.RequiresApi
7 | import dev.lucasnlm.antimine.utils.BuildExt.androidMarshmallow
8 |
9 | object AutoExt {
10 | fun Context.isAndroidAuto(): Boolean {
11 | return androidMarshmallow() && featureAutomotive()
12 | }
13 |
14 | @RequiresApi(api = Build.VERSION_CODES.M)
15 | private fun Context.featureAutomotive(): Boolean {
16 | return packageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/common/src/main/java/dev/lucasnlm/antimine/common/io/SaveFileManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.common.io
2 |
3 | import dev.lucasnlm.antimine.common.io.models.Save
4 |
5 | interface SaveFileManager {
6 | /**
7 | * Loads a save file from a given path.
8 | * @param filePath The path of the save file.
9 | * @return The save file or null if it could not be loaded.
10 | */
11 | suspend fun loadSave(filePath: String): Save?
12 |
13 | /**
14 | * Writes a save file.
15 | * @param save The save file to be written.
16 | */
17 | suspend fun writeSave(save: Save): String
18 | }
19 |
--------------------------------------------------------------------------------
/common/src/main/java/dev/lucasnlm/antimine/common/io/SaveListManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.common.io
2 |
3 | /**
4 | * Save list manager.
5 | */
6 | interface SaveListManager {
7 | /**
8 | * Inserts a new save file into the list.
9 | * @param filePath The path of the save file.
10 | * @return True if the save file was inserted, false otherwise.
11 | */
12 | suspend fun insertNewSave(filePath: String): Boolean
13 |
14 | /**
15 | * Returns the first save file in the list.
16 | * Or null if there is no save file.
17 | */
18 | suspend fun currentSaveId(): String?
19 |
20 | /**
21 | * Returns the list of save files.
22 | */
23 | suspend fun readSaveList(): List
24 | }
25 |
--------------------------------------------------------------------------------
/common/src/main/java/dev/lucasnlm/antimine/common/io/StatsFileManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.common.io
2 |
3 | import dev.lucasnlm.antimine.common.io.models.Stats
4 |
5 | /**
6 | * Handles the file that stores the stats
7 | */
8 | interface StatsFileManager {
9 | /**
10 | * Inserts a new stats
11 | * @param stats The stats to be inserted
12 | */
13 | suspend fun insert(stats: Stats)
14 |
15 | /**
16 | * Deletes the last stats
17 | */
18 | suspend fun readStats(): List
19 |
20 | /**
21 | * Deletes the last stats
22 | */
23 | suspend fun deleteStats()
24 | }
25 |
--------------------------------------------------------------------------------
/common/src/main/java/dev/lucasnlm/antimine/common/io/models/FirstOpen.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.common.io.models
2 |
3 | /**
4 | * Used to define the position of the first open square.
5 | */
6 | sealed class FirstOpen {
7 | /**
8 | * Used before the first step or before this value be recorded.
9 | */
10 | object Unknown : FirstOpen()
11 |
12 | /**
13 | * Describes the [value] of the first step.
14 | */
15 | data class Position(
16 | val value: Int,
17 | ) : FirstOpen()
18 |
19 | override fun toString(): String =
20 | when (this) {
21 | is Position -> value.toString()
22 | else -> "Unknown"
23 | }
24 |
25 | fun toInt(): Int =
26 | when (this) {
27 | is Position -> value
28 | else -> -1
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/common/src/main/java/dev/lucasnlm/antimine/common/io/models/SaveStatus.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.common.io.models
2 |
3 | enum class SaveStatus(
4 | val code: Int,
5 | ) {
6 | // Not finished game.
7 | ON_GOING(0),
8 |
9 | // Finished game with victory.
10 | VICTORY(1),
11 |
12 | // Finished game with game over.
13 | DEFEAT(2),
14 | }
15 |
--------------------------------------------------------------------------------
/common/src/main/java/dev/lucasnlm/antimine/common/level/logic/MinefieldCreator.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.common.level.logic
2 |
3 | import dev.lucasnlm.antimine.core.models.Area
4 |
5 | interface MinefieldCreator {
6 | /**
7 | * Creates an empty minefield.
8 | */
9 | fun createEmpty(): List
10 |
11 | /**
12 | * Creates a minefield with the given safe index.
13 | * The neighbors of the safe index won't have mines.
14 | */
15 | suspend fun create(safeIndex: Int): List
16 | }
17 |
--------------------------------------------------------------------------------
/common/src/main/java/dev/lucasnlm/antimine/common/level/models/ActionCompleted.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.common.level.models
2 |
3 | import dev.lucasnlm.antimine.preferences.models.Action
4 |
5 | /**
6 | * This class represents an action that was completed.
7 | * @property action The action that was completed.
8 | * @property amount The amount of times the action was completed.
9 | */
10 | data class ActionCompleted(
11 | val action: Action,
12 | val amount: Int,
13 | )
14 |
--------------------------------------------------------------------------------
/common/src/main/java/dev/lucasnlm/antimine/common/level/repository/StatsRepository.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.common.level.repository
2 |
3 | import dev.lucasnlm.antimine.common.io.models.Stats
4 |
5 | /**
6 | * Repository for statistics.
7 | */
8 | interface StatsRepository {
9 | /**
10 | * @return A list of all stats files.
11 | */
12 | suspend fun getAllStats(): List
13 |
14 | /**
15 | * Add a list of stats.
16 | */
17 | suspend fun addAllStats(stats: List)
18 |
19 | /**
20 | * Add a stats.
21 | */
22 | suspend fun addStats(stats: Stats)
23 |
24 | /**
25 | * Delete the stats file.
26 | */
27 | suspend fun deleteLastStats()
28 | }
29 |
--------------------------------------------------------------------------------
/common/src/main/java/dev/lucasnlm/antimine/common/level/repository/StatsRepositoryImpl.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.common.level.repository
2 |
3 | import dev.lucasnlm.antimine.common.io.StatsFileManager
4 | import dev.lucasnlm.antimine.common.io.models.Stats
5 |
6 | class StatsRepositoryImpl(
7 | private val statsFileManager: StatsFileManager,
8 | ) : StatsRepository {
9 | override suspend fun getAllStats(): List {
10 | return statsFileManager.readStats()
11 | }
12 |
13 | override suspend fun addAllStats(stats: List) {
14 | return stats.forEach {
15 | statsFileManager.insert(it)
16 | }
17 | }
18 |
19 | override suspend fun addStats(stats: Stats) {
20 | statsFileManager.insert(stats)
21 | }
22 |
23 | override suspend fun deleteLastStats() {
24 | statsFileManager.deleteStats()
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/common/src/main/java/dev/lucasnlm/antimine/common/level/repository/TipRepository.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.common.level.repository
2 |
3 | /**
4 | * Repository for tips.
5 | */
6 | interface TipRepository {
7 | /**
8 | * Set the extra tips.
9 | * @param amount The amount of extra tips.
10 | */
11 | fun setExtraTips(amount: Int)
12 |
13 | /**
14 | * Remove one tip.
15 | * Return true if successful.
16 | */
17 | fun removeTip(): Boolean
18 |
19 | /**
20 | * Increase the amount of tips.
21 | */
22 | fun increaseTip(amount: Int)
23 |
24 | /**
25 | * @return The amount of tips.
26 | */
27 | fun getTotalTips(): Int
28 | }
29 |
--------------------------------------------------------------------------------
/common/src/main/java/dev/lucasnlm/antimine/common/level/solver/GameSolver.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.common.level.solver
2 |
3 | import dev.lucasnlm.antimine.core.models.Area
4 |
5 | abstract class GameSolver {
6 | /**
7 | * If true it may keep iterating on this algorithm.
8 | */
9 | open fun keepTrying() = true
10 |
11 | /**
12 | * Try solve the given [minefield].
13 | * Returns true if it's solvable or false otherwise.
14 | */
15 | abstract fun trySolve(minefield: MutableList): Boolean
16 | }
17 |
--------------------------------------------------------------------------------
/common/src/main/java/dev/lucasnlm/antimine/common/level/solver/LimitedCheckNeighborsSolver.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.common.level.solver
2 |
3 | /**
4 | * Brute force solver that try solve a minefield checking
5 | * all neighbors with time limit.
6 | *
7 | * Bad point:
8 | * - Solves only easy minefields.
9 | */
10 | class LimitedCheckNeighborsSolver(
11 | private val maxAttemptTime: Long = DEFAULT_BRUTE_FORCE_TIMEOUT,
12 | ) : CheckNeighborsSolver() {
13 |
14 | private val initialTime = System.currentTimeMillis()
15 |
16 | override fun keepTrying(): Boolean {
17 | return (System.currentTimeMillis() - initialTime) <= maxAttemptTime
18 | }
19 |
20 | companion object {
21 | const val DEFAULT_BRUTE_FORCE_TIMEOUT = 1000L
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/common/src/main/java/dev/lucasnlm/antimine/core/analytics/ProdAnalyticsManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.core.analytics
2 |
3 | import android.content.Context
4 | import dev.lucasnlm.antimine.core.models.Analytics
5 | import dev.lucasnlm.external.AnalyticsManager
6 | import dev.lucasnlm.external.ExternalAnalyticsWrapper
7 |
8 | class ProdAnalyticsManager(
9 | private val analyticsWrapper: ExternalAnalyticsWrapper,
10 | ) : AnalyticsManager {
11 | override fun setup(
12 | context: Context,
13 | properties: Map,
14 | ) {
15 | analyticsWrapper.setup(context, properties)
16 | }
17 |
18 | override fun sentEvent(event: Analytics) {
19 | analyticsWrapper.sendEvent(event.name, event.extra)
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/common/src/main/res/drawable/close.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/common/src/main/res/drawable/timer.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/common/src/main/res/drawable/touch.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-anydpi-v26/shortcut_four.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-anydpi-v26/shortcut_one.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-anydpi-v26/shortcut_three.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-anydpi-v26/shortcut_two.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-hdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/src/main/res/mipmap-hdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-mdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/src/main/res/mipmap-mdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-xhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/src/main/res/mipmap-xhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-xxhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/src/main/res/mipmap-xxhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png
--------------------------------------------------------------------------------
/common/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/common/src/main/res/raw/mine_explosion_sound.ogg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/common/src/main/res/raw/mine_explosion_sound.ogg
--------------------------------------------------------------------------------
/common/src/main/res/values/shortcut_colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #c0f099
4 | #f4e481
5 | #f8cc98
6 | #f6b6b3
7 |
--------------------------------------------------------------------------------
/common/src/main/res/xml/language_preferences.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
7 |
8 |
--------------------------------------------------------------------------------
/common/src/test/java/dev/lucasnlm/antimine/common/level/di/DisabledHapticFeedbackManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.common.level.di
2 |
3 | import dev.lucasnlm.antimine.core.haptic.HapticFeedbackManager
4 |
5 | class DisabledHapticFeedbackManager : HapticFeedbackManager {
6 | override fun longPressFeedback() {
7 | // Empty
8 | }
9 |
10 | override fun explosionFeedback() {
11 | // Empty
12 | }
13 |
14 | override fun tutorialErrorFeedback() {
15 | // Empty
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/control/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/control/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/control/consumer-rules.pro
--------------------------------------------------------------------------------
/control/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
2 | -dontwarn com.google.android.material.R$attr
3 | -dontwarn dev.lucasnlm.antimine.i18n.R$string
4 |
--------------------------------------------------------------------------------
/control/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/control/src/main/java/dev/lucasnlm/antimine/control/models/ControlDetails.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.control.models
2 |
3 | import androidx.annotation.StringRes
4 | import dev.lucasnlm.antimine.preferences.models.ControlStyle
5 |
6 | data class ControlDetails(
7 | val id: Long,
8 | val controlStyle: ControlStyle,
9 | @StringRes val firstActionId: Int,
10 | @StringRes val firstActionResponseId: Int,
11 | @StringRes val secondActionId: Int,
12 | @StringRes val secondActionResponseId: Int,
13 | )
14 |
--------------------------------------------------------------------------------
/control/src/main/java/dev/lucasnlm/antimine/control/view/ControlViewHolder.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.control.view
2 |
3 | import androidx.recyclerview.widget.RecyclerView
4 | import dev.lucasnlm.antimine.control.databinding.ViewControlItemBinding
5 | import dev.lucasnlm.antimine.control.databinding.ViewControlItemSimpleBinding
6 |
7 | class ControlViewHolder(
8 | val controlItem: ViewControlItemBinding?,
9 | val simpleItem: ViewControlItemSimpleBinding?,
10 | ) : RecyclerView.ViewHolder(
11 | (controlItem?.root ?: simpleItem?.root)!!,
12 | )
13 |
--------------------------------------------------------------------------------
/control/src/main/java/dev/lucasnlm/antimine/control/viewmodel/ControlEvent.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.control.viewmodel
2 |
3 | import dev.lucasnlm.antimine.preferences.models.ControlStyle
4 |
5 | sealed class ControlEvent {
6 | data class SelectControlStyle(
7 | val controlStyle: ControlStyle,
8 | ) : ControlEvent()
9 |
10 | data object Reset : ControlEvent()
11 |
12 | data class UpdateTouchSensibility(
13 | val value: Int,
14 | ) : ControlEvent()
15 |
16 | data class UpdateLongPress(
17 | val value: Int,
18 | ) : ControlEvent()
19 |
20 | data class UpdateDoubleClick(
21 | val value: Int,
22 | ) : ControlEvent()
23 |
24 | data class UpdateHapticFeedbackLevel(
25 | val value: Int,
26 | ) : ControlEvent()
27 | }
28 |
--------------------------------------------------------------------------------
/control/src/main/java/dev/lucasnlm/antimine/control/viewmodel/ControlState.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.control.viewmodel
2 |
3 | import dev.lucasnlm.antimine.control.models.ControlDetails
4 | import dev.lucasnlm.antimine.preferences.models.ControlStyle
5 |
6 | data class ControlState(
7 | val longPress: Int,
8 | val touchSensibility: Int,
9 | val doubleClick: Int,
10 | val hapticFeedbackLevel: Int,
11 | val selected: ControlStyle,
12 | val controls: List,
13 | val showReset: Boolean,
14 | )
15 |
--------------------------------------------------------------------------------
/control/src/main/res/drawable/delete.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/control/src/main/res/drawable/touch.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/control/src/main/res/drawable/undo.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/core/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/core/consumer-rules.pro
--------------------------------------------------------------------------------
/core/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
2 | -dontwarn com.google.android.material.R$attr
3 | -dontwarn dev.lucasnlm.antimine.i18n.R$string
4 |
--------------------------------------------------------------------------------
/core/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/core/src/main/java/dev/lucasnlm/antimine/core/AppVersionManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.core
2 |
3 | /**
4 | * Information about the app version.
5 | */
6 | interface AppVersionManager {
7 | /**
8 | * Check for valid smartphone version.
9 | */
10 | fun isValid(): Boolean
11 |
12 | /**
13 | * Check for Wear OS version.
14 | */
15 | fun isWatch(): Boolean
16 | }
17 |
--------------------------------------------------------------------------------
/core/src/main/java/dev/lucasnlm/antimine/core/AreaExt.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.core
2 |
3 | import dev.lucasnlm.antimine.core.models.Area
4 |
5 | object AreaExt {
6 | fun Area.getNeighborIdAtPos(
7 | field: List,
8 | dx: Int,
9 | dy: Int,
10 | ): Int {
11 | val posX = posX + dx
12 | val posY = posY + dy
13 |
14 | return neighborsIds.firstOrNull {
15 | val neighbor = field[it]
16 | neighbor.posX == posX && neighbor.posY == posY
17 | } ?: -1
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/core/src/main/java/dev/lucasnlm/antimine/core/audio/ComposerData.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.core.audio
2 |
3 | data class ComposerData(
4 | val composer: String,
5 | val composerLink: String,
6 | )
7 |
--------------------------------------------------------------------------------
/core/src/main/java/dev/lucasnlm/antimine/core/audio/GameAudioManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.core.audio
2 |
3 | interface GameAudioManager {
4 | fun playWin()
5 |
6 | fun playBombExplosion()
7 |
8 | fun playMusic()
9 |
10 | fun isPlayingMusic(): Boolean
11 |
12 | fun pauseMusic()
13 |
14 | fun resumeMusic()
15 |
16 | fun stopMusic()
17 |
18 | fun playClickSound(index: Int = 0)
19 |
20 | fun playOpenArea()
21 |
22 | fun playPutFlag()
23 |
24 | fun playOpenMultipleArea()
25 |
26 | fun playRevealBomb()
27 |
28 | fun playMonetization()
29 |
30 | fun playRevealBombReloaded()
31 |
32 | fun playSwitchAction()
33 |
34 | fun free()
35 |
36 | fun getComposerData(): List
37 | }
38 |
--------------------------------------------------------------------------------
/core/src/main/java/dev/lucasnlm/antimine/core/cloud/CloudSaveManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.core.cloud
2 |
3 | interface CloudSaveManager {
4 | /** Uploads the current save to the cloud. */
5 | fun uploadSave()
6 | }
7 |
--------------------------------------------------------------------------------
/core/src/main/java/dev/lucasnlm/antimine/core/haptic/HapticFeedbackManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.core.haptic
2 |
3 | interface HapticFeedbackManager {
4 | fun longPressFeedback()
5 |
6 | fun explosionFeedback()
7 |
8 | fun tutorialErrorFeedback()
9 | }
10 |
--------------------------------------------------------------------------------
/core/src/main/java/dev/lucasnlm/antimine/core/models/Area.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.core.models
2 |
3 | import androidx.annotation.Keep
4 |
5 | @Keep
6 | data class Area(
7 | val id: Int,
8 | val posX: Int,
9 | val posY: Int,
10 | val minesAround: Int = 0,
11 | val hasMine: Boolean = false,
12 | val mistake: Boolean = false,
13 | val isCovered: Boolean = true,
14 | val mark: Mark = Mark.None,
15 | val revealed: Boolean = false,
16 | val neighborsIds: List,
17 | val dimNumber: Boolean = false,
18 | ) {
19 | companion object {
20 | const val BYTE_SIZE = 20 * Int.SIZE_BYTES
21 | }
22 |
23 | val isOdd: Boolean =
24 | if (posY % 2 == 0) {
25 | posX % 2 != 0
26 | } else {
27 | posX % 2 == 0
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/core/src/main/java/dev/lucasnlm/antimine/core/models/Difficulty.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.core.models
2 |
3 | import androidx.annotation.Keep
4 |
5 | @Keep
6 | enum class Difficulty(
7 | val id: String,
8 | ) {
9 | Standard("STANDARD"),
10 | Beginner("BEGINNER"),
11 | Intermediate("INTERMEDIATE"),
12 | Expert("EXPERT"),
13 | Custom("CUSTOM"),
14 | Master("MASTER"),
15 | Legend("LEGEND"),
16 | FixedSize("FIXED_SIZE"),
17 | }
18 |
--------------------------------------------------------------------------------
/core/src/main/java/dev/lucasnlm/antimine/core/models/Mark.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.core.models
2 |
3 | import androidx.annotation.Keep
4 |
5 | @Keep
6 | enum class Mark(
7 | val ligatureMask: Int,
8 | ) {
9 | None(0),
10 | Flag(1),
11 | Question(1),
12 | PurposefulNone(0),
13 | ;
14 |
15 | fun isFlag(): Boolean = this == Flag
16 |
17 | fun isQuestion(): Boolean = this == Question
18 |
19 | fun isPureNone(): Boolean = this == None
20 |
21 | fun isNone(): Boolean = this == None || this == PurposefulNone
22 |
23 | fun isNotNone(): Boolean = this.isNone().not()
24 | }
25 |
--------------------------------------------------------------------------------
/core/src/main/java/dev/lucasnlm/antimine/core/models/MinefieldSize.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.core.models
2 |
3 | data class MinefieldSize(
4 | val width: Int,
5 | val height: Int,
6 | )
7 |
--------------------------------------------------------------------------------
/core/src/main/java/dev/lucasnlm/antimine/core/models/Score.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.core.models
2 |
3 | data class Score(
4 | val rightMines: Int,
5 | val totalMines: Int,
6 | val totalArea: Int,
7 | )
8 |
--------------------------------------------------------------------------------
/core/src/main/java/dev/lucasnlm/antimine/core/repository/DimensionRepository.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.core.repository
2 |
3 | import android.util.DisplayMetrics
4 |
5 | interface DimensionRepository {
6 | fun areaSize(): Float
7 |
8 | fun areaSizeWithPadding(): Float
9 |
10 | fun areaSeparator(): Float
11 |
12 | fun displayMetrics(): DisplayMetrics
13 |
14 | fun actionBarSizeWithStatus(): Int
15 |
16 | fun actionBarSize(): Int
17 |
18 | fun navigationBarHeight(): Int
19 |
20 | fun verticalNavigationBarHeight(): Int
21 |
22 | fun horizontalNavigationBarHeight(): Int
23 | }
24 |
--------------------------------------------------------------------------------
/core/src/main/res/values-land/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 | 16dp
3 | 96dp
4 |
5 |
--------------------------------------------------------------------------------
/core/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 | 4dp
3 | 16dp
4 |
5 | 38dp
6 | 1.5dp
7 | 1dp
8 | 2dp
9 | 5dp
10 | 2dp
11 | 16sp
12 |
13 |
--------------------------------------------------------------------------------
/donation/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/donation/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/donation/consumer-rules.pro
--------------------------------------------------------------------------------
/donation/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
2 | -dontwarn com.google.android.material.R$attr
3 | -dontwarn dev.lucasnlm.antimine.i18n.R$string
4 |
--------------------------------------------------------------------------------
/donation/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
9 |
10 |
11 |
12 |
13 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/external/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/external/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/external/src/main/java/dev/lucasnlm/external/Ads.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | object Ads {
4 | const val REWARD_AD = "ca-app-pub-3940256099942544/5224354917"
5 | const val SECOND_REWARD_AD = "ca-app-pub-3940256099942544/5224354917"
6 | const val INTERSTITIAL_AD = "ca-app-pub-3940256099942544/1033173712"
7 | const val SECOND_INTERSTITIAL_AD = "ca-app-pub-3940256099942544/1033173712"
8 | const val BANNER_AD = "ca-app-pub-3940256099942544/6300978111"
9 | const val MIN_FREQUENCY = 60 * 1000L
10 | }
11 |
--------------------------------------------------------------------------------
/external/src/main/java/dev/lucasnlm/external/AdsManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import android.app.Activity
4 | import android.content.Context
5 | import android.view.View
6 |
7 | interface AdsManager {
8 | fun start(context: Context)
9 |
10 | fun isAvailable(): Boolean
11 |
12 | fun showRewardedAd(
13 | activity: Activity,
14 | onStart: (() -> Unit)? = null,
15 | onRewarded: (() -> Unit)?,
16 | onFail: (() -> Unit)?,
17 | )
18 |
19 | fun showInterstitialAd(
20 | activity: Activity,
21 | onStart: (() -> Unit)? = null,
22 | onDismiss: (() -> Unit),
23 | onError: (() -> Unit)? = null,
24 | )
25 |
26 | fun createBannerAd(
27 | context: Context,
28 | onError: (() -> Unit)? = null,
29 | ): View?
30 | }
31 |
--------------------------------------------------------------------------------
/external/src/main/java/dev/lucasnlm/external/AnalyticsManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import android.content.Context
4 | import dev.lucasnlm.antimine.core.models.Analytics
5 |
6 | /**
7 | * Wrapper for external analytics libraries.
8 | */
9 | interface AnalyticsManager {
10 | /**
11 | * Setup the analytics library.
12 | */
13 | fun setup(
14 | context: Context,
15 | properties: Map,
16 | )
17 |
18 | /**
19 | * Send an event to the analytics library.
20 | */
21 | fun sentEvent(event: Analytics)
22 | }
23 |
--------------------------------------------------------------------------------
/external/src/main/java/dev/lucasnlm/external/BillingManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import android.app.Activity
4 | import dev.lucasnlm.external.model.Price
5 | import dev.lucasnlm.external.model.PurchaseInfo
6 | import kotlinx.coroutines.flow.Flow
7 |
8 | interface BillingManager {
9 | fun start()
10 |
11 | fun isEnabled(): Boolean
12 |
13 | suspend fun charge(activity: Activity)
14 |
15 | suspend fun getPrice(): Price?
16 |
17 | suspend fun getPriceFlow(): Flow
18 |
19 | fun listenPurchases(): Flow
20 | }
21 |
--------------------------------------------------------------------------------
/external/src/main/java/dev/lucasnlm/external/CloudStorageManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import dev.lucasnlm.external.model.CloudSave
4 |
5 | interface CloudStorageManager {
6 | fun uploadSave(cloudSave: CloudSave)
7 |
8 | suspend fun getSave(playId: String): CloudSave?
9 | }
10 |
--------------------------------------------------------------------------------
/external/src/main/java/dev/lucasnlm/external/CrashReporter.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import android.app.Application
4 |
5 | interface CrashReporter {
6 | fun sendError(message: String)
7 |
8 | fun start(application: Application)
9 | }
10 |
--------------------------------------------------------------------------------
/external/src/main/java/dev/lucasnlm/external/ExternalAnalyticsWrapper.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import android.content.Context
4 |
5 | interface ExternalAnalyticsWrapper {
6 | fun setup(
7 | context: Context,
8 | properties: Map,
9 | )
10 |
11 | fun sendEvent(
12 | name: String,
13 | content: Map,
14 | )
15 | }
16 |
--------------------------------------------------------------------------------
/external/src/main/java/dev/lucasnlm/external/FeatureFlagManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | interface FeatureFlagManager {
4 | /**
5 | * Whether the game history feature is enabled.
6 | */
7 | val isGameHistoryEnabled: Boolean
8 |
9 | /**
10 | * Whether the interstitial ad should be used.
11 | */
12 | val useInterstitialAd: Boolean
13 |
14 | /**
15 | * Whether the app is the FOSS version.
16 | */
17 | val isFoss: Boolean
18 |
19 | /**
20 | * Whether the banner ad should be used.
21 | */
22 | val isBannerAdEnabled: Boolean
23 |
24 | /**
25 | * Whether the countdown to continue should be shown.
26 | */
27 | val showCountdownToContinue: Boolean
28 | }
29 |
--------------------------------------------------------------------------------
/external/src/main/java/dev/lucasnlm/external/InAppUpdateManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import android.app.Activity
4 |
5 | interface InAppUpdateManager {
6 | fun checkUpdate(activity: Activity)
7 | }
8 |
--------------------------------------------------------------------------------
/external/src/main/java/dev/lucasnlm/external/InstantAppManager.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import android.content.Context
4 |
5 | interface InstantAppManager {
6 | fun isEnabled(context: Context): Boolean
7 | }
8 |
--------------------------------------------------------------------------------
/external/src/main/java/dev/lucasnlm/external/ReviewWrapper.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import android.app.Activity
4 |
5 | interface ReviewWrapper {
6 | fun startReviewPage(
7 | activity: Activity,
8 | appPackage: String,
9 | )
10 |
11 | fun startInAppReview(activity: Activity)
12 | }
13 |
--------------------------------------------------------------------------------
/external/src/main/java/dev/lucasnlm/external/model/Price.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external.model
2 |
3 | data class Price(
4 | val price: String,
5 | val offer: Boolean,
6 | )
7 |
--------------------------------------------------------------------------------
/external/src/main/java/dev/lucasnlm/external/model/PurchaseInfo.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external.model
2 |
3 | sealed class PurchaseInfo {
4 | data class PurchaseResult(
5 | val isFreeUnlock: Boolean,
6 | val unlockStatus: Boolean,
7 | ) : PurchaseInfo()
8 |
9 | data object PurchaseFail : PurchaseInfo()
10 | }
11 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/PL-szl/short_description.txt:
--------------------------------------------------------------------------------
1 | A puzzle game where you search for all hidden mines.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/PL-szl/title.txt:
--------------------------------------------------------------------------------
1 | Minesweeper - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/af-ZA/short_description.txt:
--------------------------------------------------------------------------------
1 | Verwyder versteekte myne van 'n mynveld
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/af-ZA/title.txt:
--------------------------------------------------------------------------------
1 | Mynveër - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ar-SA/short_description.txt:
--------------------------------------------------------------------------------
1 | لعبة ألغاز حيث تبحث عن الألغام المخفية.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ar-SA/title.txt:
--------------------------------------------------------------------------------
1 | كانسة الألغام - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/be-BY/short_description.txt:
--------------------------------------------------------------------------------
1 | Гульня-галаваломка, у якой вы шукаеце ўсе схаваныя міны.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/be-BY/title.txt:
--------------------------------------------------------------------------------
1 | Сапёр - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/bg-BG/short_description.txt:
--------------------------------------------------------------------------------
1 | Пъзел игра в която търсиш за всички скрити мини.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/bg-BG/title.txt:
--------------------------------------------------------------------------------
1 | Миночистач - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ca-ES/short_description.txt:
--------------------------------------------------------------------------------
1 | Netegeu les mines ocultes del camp de mines.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ca-ES/title.txt:
--------------------------------------------------------------------------------
1 | Buscamines - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/cs-CZ/short_description.txt:
--------------------------------------------------------------------------------
1 | Logická hra, ve které hledáte všechny skryté miny.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/cs-CZ/title.txt:
--------------------------------------------------------------------------------
1 | Hledání min - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/da-DK/short_description.txt:
--------------------------------------------------------------------------------
1 | Et puslespil, hvor du søger efter alle skjulte miner.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/da-DK/title.txt:
--------------------------------------------------------------------------------
1 | Antimine - Minestryger
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/de-DE/short_description.txt:
--------------------------------------------------------------------------------
1 | Ein Puzzle-Spiel, in dem du nach allen verborgenen Minen suchst.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/de-DE/title.txt:
--------------------------------------------------------------------------------
1 | Minesweeper - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/el-GR/short_description.txt:
--------------------------------------------------------------------------------
1 | Ένα παιχνίδι παζλ όπου αναζητάτε όλα τα κρυμμένα ναρκοπέδια.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/el-GR/title.txt:
--------------------------------------------------------------------------------
1 | Ναρκαλιευτής - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/fastlane/metadata/android/en-US/images/phoneScreenshots/8.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/short_description.txt:
--------------------------------------------------------------------------------
1 | A puzzle game where you search for all hidden mines.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/title.txt:
--------------------------------------------------------------------------------
1 | Minesweeper - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/eo-UY/short_description.txt:
--------------------------------------------------------------------------------
1 | Puzloludo pri serĉado de ĉiu kaŝita mino.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/eo-UY/title.txt:
--------------------------------------------------------------------------------
1 | Minesweeper - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es-ES/short_description.txt:
--------------------------------------------------------------------------------
1 | Un juego de rompecabezas en que buscas todas las minas ocultas.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es-ES/title.txt:
--------------------------------------------------------------------------------
1 | Buscaminas - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es-US/short_description.txt:
--------------------------------------------------------------------------------
1 | Un juego de buscaminas donde se buscan minas ocultas de un campo minado.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es-US/title.txt:
--------------------------------------------------------------------------------
1 | Antimine - Buscaminas
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/es-US/video.txt:
--------------------------------------------------------------------------------
1 | https://www.youtube.com/watch?v=OYBfyh0AQmE
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/eu-ES/short_description.txt:
--------------------------------------------------------------------------------
1 | Ezkutuko mina guztiak bilatzeko puzzle-jokoa.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/eu-ES/title.txt:
--------------------------------------------------------------------------------
1 | Dragamina - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fa-IR/short_description.txt:
--------------------------------------------------------------------------------
1 | A puzzle game where you search for all hidden mines.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fa-IR/title.txt:
--------------------------------------------------------------------------------
1 | Minesweeper - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fi-FI/short_description.txt:
--------------------------------------------------------------------------------
1 | Pulmapeli, jossa etsit kaikki piilotetut miinat.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fi-FI/title.txt:
--------------------------------------------------------------------------------
1 | Miinaharava - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fil-PH/short_description.txt:
--------------------------------------------------------------------------------
1 | A puzzle game where you search for all hidden mines.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fil-PH/title.txt:
--------------------------------------------------------------------------------
1 | Minesweeper - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fr-FR/short_description.txt:
--------------------------------------------------------------------------------
1 | Un jeu vidéo de réflexion dans lequel vous cherchez toutes les mines cachées.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/fr-FR/title.txt:
--------------------------------------------------------------------------------
1 | Démineur - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/he-IL/short_description.txt:
--------------------------------------------------------------------------------
1 | ניקוי מוקשים חבויים משדה מוקשים.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/he-IL/title.txt:
--------------------------------------------------------------------------------
1 | שולה מוקשים - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/hi-IN/short_description.txt:
--------------------------------------------------------------------------------
1 | बोर्ड से माइंस साफ करता है वर्ग से संकेत को प्रयोग करते हुए जिसे आपने पहले से खोला है
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/hi-IN/title.txt:
--------------------------------------------------------------------------------
1 | माइनस्वीपर - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/hu-HU/short_description.txt:
--------------------------------------------------------------------------------
1 | Elrejtett aknák eltávolítása az aknamezőről.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/hu-HU/title.txt:
--------------------------------------------------------------------------------
1 | Aknakereső - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/id-ID/short_description.txt:
--------------------------------------------------------------------------------
1 | Sebuah Game Puzzle yang mana anda mencari semua ranjau yang tersembunyi.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/id-ID/title.txt:
--------------------------------------------------------------------------------
1 | Penyapu Ranjau - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/it-IT/short_description.txt:
--------------------------------------------------------------------------------
1 | Un puzzle game dove scovare tutte le mine nascoste.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/it-IT/title.txt:
--------------------------------------------------------------------------------
1 | Campo Minato - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ja-JP/short_description.txt:
--------------------------------------------------------------------------------
1 | 地雷原から見えない地雷を除去してください
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ja-JP/title.txt:
--------------------------------------------------------------------------------
1 | マインスイーパー Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ko-KR/short_description.txt:
--------------------------------------------------------------------------------
1 | 지뢰밭에서 숨겨진 지뢰를 제거합니다
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ko-KR/title.txt:
--------------------------------------------------------------------------------
1 | 지뢰찾기 - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ku-TR/short_description.txt:
--------------------------------------------------------------------------------
1 | یاریەکی مەتەڵ کە تۆ بەدوای هەموو مینە شاڕاوەکان دەگەڕێیت.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ku-TR/title.txt:
--------------------------------------------------------------------------------
1 | مین پاککەر – دژە مین
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/lt-LT/short_description.txt:
--------------------------------------------------------------------------------
1 | Loginis žaidimas, kuriame ieškote paslėptų minų.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/lt-LT/title.txt:
--------------------------------------------------------------------------------
1 | Išminuotojas - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/lv-LV/short_description.txt:
--------------------------------------------------------------------------------
1 | Atjautības spēle, kurā ir jāatrod visas apslēptās mīnas.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/lv-LV/title.txt:
--------------------------------------------------------------------------------
1 | Mīnu meklētājs - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/nl-NL/short_description.txt:
--------------------------------------------------------------------------------
1 | Een puzzelspel waarin je naar alle verborgen mijnen zoekt.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/nl-NL/title.txt:
--------------------------------------------------------------------------------
1 | Mijnenveger - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/no-NO/short_description.txt:
--------------------------------------------------------------------------------
1 | Et hjernetrimspill der du leter etter alle skjulte miner.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/no-NO/title.txt:
--------------------------------------------------------------------------------
1 | Minesveiper - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pl-PL/short_description.txt:
--------------------------------------------------------------------------------
1 | Gra logiczna, w której należy znaleźć wszystkie ukryte miny.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pl-PL/title.txt:
--------------------------------------------------------------------------------
1 | Saper - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-BR/short_description.txt:
--------------------------------------------------------------------------------
1 | Um quebra-cabeças em que você procura por todas as minas escondidas.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-BR/title.txt:
--------------------------------------------------------------------------------
1 | Campo Minado - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-PT/short_description.txt:
--------------------------------------------------------------------------------
1 | Um jogo quebra-cabeças em que tens de encontrar todas as minas escondidas.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/pt-PT/title.txt:
--------------------------------------------------------------------------------
1 | Campo Minado - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ro-RO/short_description.txt:
--------------------------------------------------------------------------------
1 | Un joc-enigmă în care cauți minele ascunse.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ro-RO/title.txt:
--------------------------------------------------------------------------------
1 | Minesweeper – Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ru-RU/short_description.txt:
--------------------------------------------------------------------------------
1 | Головоломка, в которой вы ищете скрытые мины.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ru-RU/title.txt:
--------------------------------------------------------------------------------
1 | Сапер - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/si-LK/short_description.txt:
--------------------------------------------------------------------------------
1 | සැඟවුණු බෝම්බ සියල්ල සොයන ප්රහේලිකා ක්රීඩාවකි.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/si-LK/title.txt:
--------------------------------------------------------------------------------
1 | බිම් බෝම්බ - ඇන්ටිමයින්
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/sk-SK/short_description.txt:
--------------------------------------------------------------------------------
1 | A puzzle game where you search for all hidden mines.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/sk-SK/title.txt:
--------------------------------------------------------------------------------
1 | Minesweeper - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/sl-SI/short_description.txt:
--------------------------------------------------------------------------------
1 | Miselna igra, kjer moraš najti skrite mine.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/sl-SI/title.txt:
--------------------------------------------------------------------------------
1 | Minolovec - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/sl-SI/video.txt:
--------------------------------------------------------------------------------
1 | https://www.youtube.com/watch?v=OYBfyh0AQmE
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/sv-SE/short_description.txt:
--------------------------------------------------------------------------------
1 | Ett pusselspel där du letar efter alla gömda minfält.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/sv-SE/title.txt:
--------------------------------------------------------------------------------
1 | Minröj - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ta-IN/short_description.txt:
--------------------------------------------------------------------------------
1 | A puzzle game where you search for all hidden mines.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/ta-IN/title.txt:
--------------------------------------------------------------------------------
1 | Minesweeper - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/th-TH/short_description.txt:
--------------------------------------------------------------------------------
1 | กู้กับระเบิดที่ซ่อนอยู่จากสนาม
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/th-TH/title.txt:
--------------------------------------------------------------------------------
1 | ไมน์สวีปเปอร์ - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/tr-TR/short_description.txt:
--------------------------------------------------------------------------------
1 | Gizlenmiş haldeki mayınları aradığınız bir bulmaca oyunu.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/tr-TR/title.txt:
--------------------------------------------------------------------------------
1 | Mayın Tarlası - Antimayın
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/uk-UA/short_description.txt:
--------------------------------------------------------------------------------
1 | Логічна головоломка, в якій ви шукаєте всі приховані міни.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/uk-UA/title.txt:
--------------------------------------------------------------------------------
1 | Сапер - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/vec-IT/short_description.txt:
--------------------------------------------------------------------------------
1 | Un zogo de puzzle doche che se serca tute łe mine sconte.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/vec-IT/title.txt:
--------------------------------------------------------------------------------
1 | Canpo Minà - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/vi-VN/short_description.txt:
--------------------------------------------------------------------------------
1 | Một trò chơi giải đố nơi bạn tìm kiếm tất cả các quả mìn ẩn.
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/vi-VN/title.txt:
--------------------------------------------------------------------------------
1 | Dò mìn - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/zh-CN/full_description.txt:
--------------------------------------------------------------------------------
1 | 在挑战性的解谜游戏中测试您的推理能力,在这个游戏中你必须在不引爆任何地雷的情况下解决雷场。
2 | 这是经典扫雷的极简而现代的版本。
3 |
4 | 你是否能够清除雷场? 开始吧!
5 |
6 | 游戏目标
7 | 就像扫雷一样。 当你标出雷场中的所有地雷后,游戏胜利。 小心不要触发地雷!
8 |
9 | 无需猜测
10 | 此游戏的算法可以只生成有解雷场。 你不需要猜测最后一枚地雷在哪里!
11 |
12 | 游戏等级
13 | 就像扫雷一样,这场游戏有不同的等级:初级、中级和专家。 但此游戏还有一种独特的渐进模式。在这种模式下,你的每次获胜都会使游戏变得更难。
14 |
15 | 自定义级别
16 | 如果标准的游戏难度不能满足你,你可以创建你自己的难度等级!
17 |
18 | 主题
19 | Antimine 有超过 15 个主题(包括浅色、深色和 AMOLED)。 更多主题很快会被加入!
20 |
21 | 极简主义
22 | 清爽的感观:极简的视觉效果和轻量的应用大小 (小于 9MB)。
23 |
24 | 教程
25 | 你不知道扫雷怎么玩? 没问题,您可以尝试我们的教学关,以及在设置中启用提示。
26 |
27 | 统计
28 | 查看您的游戏结果与成长。
29 |
30 | 游戏助手
31 | 游戏将自动标记你孤立的正方形。
32 |
33 | 自定义
34 | 你可以把游戏更改成你想要的样子。
35 | 例如:帮助、动画、触摸反馈、问号标记。
36 |
37 | 控制
38 | 此游戏支持四种不同的操作方案。 例如:可以使用点击进行标记,也可以使用长按进行标记。
39 |
40 | 成就与排行榜
41 | 你有八个成就可以解锁,还有不同的排行榜可以与你的朋友分享。
42 |
43 | 在线或离线
44 | 运行此游戏不需要您在线!
45 |
46 | 自动保存
47 | 您可以先开始一局游戏,稍后再继续这局游戏! 此游戏会自动保存您的游戏。
48 |
49 | 尽情享受吧!
50 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/zh-CN/short_description.txt:
--------------------------------------------------------------------------------
1 | 扫除雷区里隐藏的地雷
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/zh-CN/title.txt:
--------------------------------------------------------------------------------
1 | 扫雷 (踩地雷) - Antimine
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/zh-TW/short_description.txt:
--------------------------------------------------------------------------------
1 | 在遊戲中找出所有隱藏的地雷。
2 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/zh-TW/title.txt:
--------------------------------------------------------------------------------
1 | 踩地雷 (掃雷) - Antimine
2 |
--------------------------------------------------------------------------------
/foss/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/foss/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn com.google.android.material.R$attr
2 | -dontwarn dev.lucasnlm.antimine.i18n.R$string
3 |
--------------------------------------------------------------------------------
/foss/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/foss/src/main/java/dev/lucasnlm/external/CloudStorageManagerImpl.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import dev.lucasnlm.external.model.CloudSave
4 |
5 | class CloudStorageManagerImpl : CloudStorageManager {
6 | override fun uploadSave(cloudSave: CloudSave) {
7 | // FOSS build doesn't support cloud save.
8 | }
9 |
10 | override suspend fun getSave(playId: String): CloudSave? {
11 | // FOSS build doesn't support cloud save.
12 | return null
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/foss/src/main/java/dev/lucasnlm/external/ExternalAnalyticsWrapperImpl.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import android.content.Context
4 |
5 | class ExternalAnalyticsWrapperImpl(
6 | context: Context,
7 | ) : ExternalAnalyticsWrapper {
8 | override fun setup(
9 | context: Context,
10 | properties: Map,
11 | ) {
12 | // F-droid build doesn't have analytics.
13 | }
14 |
15 | override fun sendEvent(
16 | name: String,
17 | content: Map,
18 | ) {
19 | // F-droid build doesn't have analytics.
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/foss/src/main/java/dev/lucasnlm/external/FeatureFlagManagerImpl.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | class FeatureFlagManagerImpl : FeatureFlagManager {
4 | override val isGameHistoryEnabled: Boolean = true
5 | override val isFoss: Boolean = true
6 | override val useInterstitialAd: Boolean = false
7 | override val isBannerAdEnabled: Boolean = false
8 | override val showCountdownToContinue: Boolean = false
9 | }
10 |
--------------------------------------------------------------------------------
/foss/src/main/java/dev/lucasnlm/external/InAppUpdateManagerImpl.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import android.app.Activity
4 |
5 | class InAppUpdateManagerImpl : InAppUpdateManager {
6 | override fun checkUpdate(activity: Activity) {
7 | // F-droid store doesn't support In-App update.
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/foss/src/main/java/dev/lucasnlm/external/InstantAppManagerImpl.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import android.content.Context
4 |
5 | class InstantAppManagerImpl : InstantAppManager {
6 | override fun isEnabled(context: Context): Boolean {
7 | return false
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/foss/src/main/java/dev/lucasnlm/external/ProprietaryAppWrapper.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import android.app.Activity
4 | import android.content.Context
5 | import android.content.Intent
6 |
7 | @Suppress("UNUSED_PARAMETER")
8 | class ProprietaryAppWrapper {
9 | // FOSS build doesn't support Instant App
10 | fun isInstantAppSupported(context: Context): Boolean = false
11 |
12 | fun isInAppPaymentsSupported(context: Context) = false
13 |
14 | fun showInstallPrompt(
15 | activity: Activity,
16 | intent: Intent?,
17 | requestCode: Int,
18 | referrer: String?,
19 | ) {
20 | // Empty
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/foss/src/main/java/dev/lucasnlm/external/ReviewWrapperImpl.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import android.app.Activity
4 |
5 | class ReviewWrapperImpl : ReviewWrapper {
6 | override fun startReviewPage(
7 | activity: Activity,
8 | appPackage: String,
9 | ) {
10 | // There's not review on FOSS build.
11 | }
12 |
13 | override fun startInAppReview(activity: Activity) {
14 | // There's not review on FOSS build.
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/gdx/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 | /libs
--------------------------------------------------------------------------------
/gdx/check_import.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # Check if a file was provided as argument
4 | if [ $# -eq 0 ]; then
5 | echo "Error: Please provide a filename as argument."
6 | exit 1
7 | fi
8 |
9 | # Check if the file exists
10 | if [ ! -f "$1" ]; then
11 | echo "Error: File '$1' not found."
12 | exit 1
13 | fi
14 |
15 | # Check if the file contains the string in an unique line
16 | if grep -xq "project.tasks.preBuild.dependsOn(\"copyAndroidNatives\")" "$1"; then
17 | exit 0
18 | else
19 | exit 1
20 | fi
21 |
--------------------------------------------------------------------------------
/gdx/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/gdx/consumer-rules.pro
--------------------------------------------------------------------------------
/gdx/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
2 | -dontwarn com.google.android.material.R$attr
3 | -dontwarn dev.lucasnlm.antimine.i18n.R$string
4 |
--------------------------------------------------------------------------------
/gdx/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/gdx/src/main/assets/classic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/gdx/src/main/assets/classic.png
--------------------------------------------------------------------------------
/gdx/src/main/assets/glass.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/gdx/src/main/assets/glass.png
--------------------------------------------------------------------------------
/gdx/src/main/assets/oldschool.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/gdx/src/main/assets/oldschool.png
--------------------------------------------------------------------------------
/gdx/src/main/assets/oldschool2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/gdx/src/main/assets/oldschool2.png
--------------------------------------------------------------------------------
/gdx/src/main/assets/square-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/gdx/src/main/assets/square-2.png
--------------------------------------------------------------------------------
/gdx/src/main/assets/square-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/gdx/src/main/assets/square-3.png
--------------------------------------------------------------------------------
/gdx/src/main/assets/square.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/gdx/src/main/assets/square.png
--------------------------------------------------------------------------------
/gdx/src/main/assets/standard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/gdx/src/main/assets/standard.png
--------------------------------------------------------------------------------
/gdx/src/main/assets/stone-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/gdx/src/main/assets/stone-2.png
--------------------------------------------------------------------------------
/gdx/src/main/assets/stone.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/gdx/src/main/assets/stone.png
--------------------------------------------------------------------------------
/gdx/src/main/java/dev/lucasnlm/antimine/gdx/events/GdxEvent.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.gdx.events
2 |
3 | sealed class GdxEvent(
4 | val id: Int,
5 | ) {
6 | class TouchUpEvent(
7 | id: Int,
8 | ) : GdxEvent(id)
9 |
10 | class TouchDownEvent(
11 | id: Int,
12 | ) : GdxEvent(id)
13 | }
14 |
--------------------------------------------------------------------------------
/gdx/src/main/java/dev/lucasnlm/antimine/gdx/models/ActionSettings.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.gdx.models
2 |
3 | data class ActionSettings(
4 | val handleDoubleTaps: Boolean,
5 | val longTapTimeout: Long,
6 | val doubleTapTimeout: Long,
7 | val touchSensibility: Int,
8 | )
9 |
--------------------------------------------------------------------------------
/gdx/src/main/java/dev/lucasnlm/antimine/gdx/models/GameTextures.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.gdx.models
2 |
3 | import com.badlogic.gdx.graphics.g2d.TextureRegion
4 |
5 | data class GameTextures(
6 | val detailedArea: TextureRegion,
7 | val areaBackground: TextureRegion,
8 | val aroundMines: List,
9 | val mine: TextureRegion,
10 | val flag: TextureRegion,
11 | val question: TextureRegion,
12 | val pieces: Map,
13 | )
14 |
--------------------------------------------------------------------------------
/gdx/src/main/java/dev/lucasnlm/antimine/gdx/models/InternalPadding.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.gdx.models
2 |
3 | data class InternalPadding(
4 | val start: Float,
5 | val end: Float,
6 | val top: Float,
7 | val bottom: Float,
8 | )
9 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sat Oct 07 16:06:38 BRT 2023
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
5 | zipStoreBase=GRADLE_USER_HOME
6 | zipStorePath=wrapper/dists
7 |
--------------------------------------------------------------------------------
/i18n/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/i18n/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/i18n/consumer-rules.pro
--------------------------------------------------------------------------------
/i18n/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
2 | -dontwarn com.google.android.material.R$attr
3 | -dontwarn dev.lucasnlm.antimine.i18n.R$string
4 |
--------------------------------------------------------------------------------
/i18n/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/instant/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/instant/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("com.android.library")
3 | id("kotlin-android")
4 | }
5 |
6 | android {
7 | namespace = "dev.lucasnlm.antimine.instant"
8 |
9 | defaultConfig {
10 | minSdk = libs.versions.minSdk.get().toInt()
11 | compileSdk = libs.versions.compileSdk.get().toInt()
12 | }
13 |
14 | buildTypes {
15 | release {
16 | isMinifyEnabled = false
17 | setProguardFiles(listOf(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"))
18 | }
19 | }
20 |
21 | compileOptions {
22 | sourceCompatibility = JavaVersion.VERSION_11
23 | targetCompatibility = JavaVersion.VERSION_11
24 | }
25 |
26 | kotlinOptions {
27 | jvmTarget = JavaVersion.VERSION_11.toString()
28 | }
29 |
30 | buildFeatures {
31 | buildConfig = true
32 | viewBinding = true
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/instant/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/instant/consumer-rules.pro
--------------------------------------------------------------------------------
/instant/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
2 | -dontwarn com.google.android.material.R$attr
3 | -dontwarn dev.lucasnlm.antimine.i18n.R$string
4 |
--------------------------------------------------------------------------------
/instant/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
13 |
14 |
--------------------------------------------------------------------------------
/lint.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/preferences/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/preferences/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/preferences/consumer-rules.pro
--------------------------------------------------------------------------------
/preferences/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
2 | -dontwarn com.google.android.material.R$attr
3 | -dontwarn dev.lucasnlm.antimine.i18n.R$string
4 |
--------------------------------------------------------------------------------
/preferences/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/preferences/src/main/java/dev/lucasnlm/antimine/preferences/models/Minefield.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.preferences.models
2 |
3 | import androidx.annotation.Keep
4 |
5 | @Keep
6 | data class Minefield(
7 | val width: Int,
8 | val height: Int,
9 | val mines: Int,
10 | val seed: Long? = null,
11 | ) {
12 | private fun ratio(): Double = mines.toDouble() / (width * height)
13 |
14 | fun ratioPercent(): Int = (ratio() * 100.0).toInt()
15 | }
16 |
--------------------------------------------------------------------------------
/proprietary/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/proprietary/src/main/java/dev/lucasnlm/external/CloudStorageManagerImpl.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import dev.lucasnlm.external.model.CloudSave
4 |
5 | class CloudStorageManagerImpl : CloudStorageManager {
6 |
7 | override fun uploadSave(cloudSave: CloudSave) {
8 | // Todo
9 | }
10 |
11 | override suspend fun getSave(playId: String): CloudSave? {
12 | return null
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/proprietary/src/main/java/dev/lucasnlm/external/CrashReporterImpl.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import android.app.Application
4 | import com.bugsnag.android.Bugsnag
5 |
6 | class CrashReporterImpl : CrashReporter {
7 | override fun sendError(message: String) {
8 | // No-op
9 | }
10 |
11 | override fun start(application: Application) {
12 | Bugsnag.start(application.applicationContext)
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/proprietary/src/main/java/dev/lucasnlm/external/FeatureFlagManagerImpl.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | class FeatureFlagManagerImpl : FeatureFlagManager {
4 | override val isFoss: Boolean = false
5 |
6 | override val isGameHistoryEnabled: Boolean = false
7 |
8 | override val useInterstitialAd: Boolean = true
9 |
10 | override val isBannerAdEnabled: Boolean = true
11 |
12 | override val showCountdownToContinue: Boolean = false
13 | }
14 |
--------------------------------------------------------------------------------
/proprietary/src/main/java/dev/lucasnlm/external/InstantAppManagerImpl.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.external
2 |
3 | import android.content.Context
4 | import com.google.android.gms.instantapps.InstantApps
5 |
6 | class InstantAppManagerImpl : InstantAppManager {
7 | override fun isEnabled(context: Context): Boolean {
8 | return InstantApps.getPackageManagerCompat(context).isInstantApp
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/proprietary/src/main/res/values/values.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 0
4 |
--------------------------------------------------------------------------------
/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | google()
4 | mavenCentral()
5 | gradlePluginPortal()
6 | }
7 | }
8 |
9 | include(
10 | ":app",
11 | ":common",
12 | ":proprietary",
13 | ":foss",
14 | ":about",
15 | ":external",
16 | ":instant",
17 | ":i18n",
18 | ":ui",
19 | ":preferences",
20 | ":core",
21 | ":control",
22 | ":themes",
23 | ":gdx",
24 | ":tutorial",
25 | ":sgtatham",
26 | ":donation",
27 | ":wear",
28 | ":audio",
29 | ":audio-low",
30 | ":utils",
31 | ":auto",
32 | )
33 |
--------------------------------------------------------------------------------
/sgtatham/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 | /.cxx
--------------------------------------------------------------------------------
/sgtatham/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/sgtatham/consumer-rules.pro
--------------------------------------------------------------------------------
/sgtatham/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
2 | -dontwarn com.google.android.material.R$attr
3 | -dontwarn dev.lucasnlm.antimine.i18n.R$string
4 |
--------------------------------------------------------------------------------
/sgtatham/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/sgtatham/src/main/cpp/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 3.10.2)
2 |
3 | project("sgtatham")
4 |
5 | add_library(# Sets the name of the library.
6 | sgtatham
7 |
8 | # Sets the library as a shared library.
9 | SHARED
10 |
11 | tree234.cpp
12 | random_generator.cpp
13 | minefield_creator.cpp
14 | sgtatham.cpp)
15 |
16 | target_link_libraries(# Specifies the target library.
17 | sgtatham)
18 |
19 | set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s -o3")
20 | set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s -o3")
--------------------------------------------------------------------------------
/sgtatham/src/main/cpp/malloc.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 | #include
5 | #include
6 |
7 | inline void sfree(void *p) {
8 | if (p) {
9 | free(p);
10 | p = NULL;
11 | }
12 | }
13 |
14 | inline void *smalloc(size_t size) {
15 | void *p;
16 | p = malloc(size);
17 | if (!p) abort();
18 | return p;
19 | }
20 |
21 | inline void *srealloc(void *p, size_t size) {
22 | void *q;
23 | if (p) {
24 | q = realloc(p, size);
25 | } else {
26 | q = malloc(size);
27 | }
28 | if (!q) abort();
29 | return q;
30 | }
31 |
--------------------------------------------------------------------------------
/sgtatham/src/main/cpp/minefield_solver.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 | #include "common.h"
5 |
6 | bool try_solve_minefield(mine_context& context, std::mt19937 &random);
--------------------------------------------------------------------------------
/sgtatham/src/main/cpp/random_generator.cpp:
--------------------------------------------------------------------------------
1 | #include "random_generator.h"
2 |
3 | std::uint8_t random_bits(std::mt19937& random) {
4 | static std::uint64_t last = 0L;
5 |
6 | if (last == 0L) {
7 | std::uniform_int_distribution dist;
8 | last = dist(random);
9 | }
10 |
11 | std::uint8_t result = last & 0xFF;
12 | last = last << 8;
13 | return result;
14 | }
15 |
16 | std::uint64_t random_up_to(std::mt19937& random, std::size_t limit) {
17 | std::uniform_int_distribution dist(0,limit - 1);
18 | return dist(random);
19 | }
20 |
--------------------------------------------------------------------------------
/sgtatham/src/main/cpp/random_generator.h:
--------------------------------------------------------------------------------
1 | #pragma once
2 |
3 | #include
4 |
5 | std::uint8_t random_bits(std::mt19937& random);
6 |
7 | std::uint64_t random_up_to(std::mt19937& random, std::size_t limit);
8 |
--------------------------------------------------------------------------------
/themes/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/themes/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/themes/consumer-rules.pro
--------------------------------------------------------------------------------
/themes/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
2 | -dontwarn com.google.android.material.R$attr
3 | -dontwarn dev.lucasnlm.antimine.i18n.R$string
4 |
5 |
--------------------------------------------------------------------------------
/themes/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/themes/src/main/java/dev/lucasnlm/antimine/themes/viewmodel/ThemeEvent.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.themes.viewmodel
2 |
3 | import dev.lucasnlm.antimine.ui.model.AppSkin
4 | import dev.lucasnlm.antimine.ui.model.AppTheme
5 |
6 | sealed class ThemeEvent {
7 | data class Unlock(
8 | val themeId: Long,
9 | ) : ThemeEvent()
10 |
11 | data class ChangeTheme(
12 | val newTheme: AppTheme,
13 | ) : ThemeEvent()
14 |
15 | data class ChangeSkin(
16 | val newSkin: AppSkin,
17 | ) : ThemeEvent()
18 | }
19 |
--------------------------------------------------------------------------------
/themes/src/main/java/dev/lucasnlm/antimine/themes/viewmodel/ThemeState.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.themes.viewmodel
2 |
3 | import dev.lucasnlm.antimine.ui.model.AppSkin
4 | import dev.lucasnlm.antimine.ui.model.AppTheme
5 |
6 | data class ThemeState(
7 | val currentTheme: AppTheme,
8 | val currentAppSkin: AppSkin,
9 | val themes: List,
10 | val appSkins: List,
11 | )
12 |
--------------------------------------------------------------------------------
/themes/src/main/res/drawable/delete.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/themes/src/main/res/drawable/lock.xml:
--------------------------------------------------------------------------------
1 |
8 |
11 |
12 |
--------------------------------------------------------------------------------
/themes/src/main/res/drawable/movie.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/themes/src/main/res/drawable/undo.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/themes/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 | 8dp
3 |
4 |
--------------------------------------------------------------------------------
/tutorial/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/tutorial/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/tutorial/consumer-rules.pro
--------------------------------------------------------------------------------
/tutorial/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
2 | -dontwarn com.google.android.material.R$attr
3 | -dontwarn dev.lucasnlm.antimine.i18n.R$string
4 |
--------------------------------------------------------------------------------
/tutorial/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/tutorial/src/main/res/drawable/tutorial_example_1.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/tutorial/src/main/res/drawable/tutorial_example_1.webp
--------------------------------------------------------------------------------
/tutorial/src/main/res/drawable/tutorial_example_2.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/tutorial/src/main/res/drawable/tutorial_example_2.webp
--------------------------------------------------------------------------------
/tutorial/src/main/res/drawable/tutorial_example_3.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/tutorial/src/main/res/drawable/tutorial_example_3.webp
--------------------------------------------------------------------------------
/tutorial/src/main/res/drawable/tutorial_example_4.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/tutorial/src/main/res/drawable/tutorial_example_4.webp
--------------------------------------------------------------------------------
/ui/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/ui/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/ui/consumer-rules.pro
--------------------------------------------------------------------------------
/ui/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
2 | -dontwarn com.google.android.material.R$attr
3 | -dontwarn dev.lucasnlm.antimine.i18n.R$string
4 |
--------------------------------------------------------------------------------
/ui/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/ui/src/main/java/dev/lucasnlm/antimine/ui/model/AppTheme.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.ui.model
2 |
3 | import androidx.annotation.StringRes
4 | import androidx.annotation.StyleRes
5 |
6 | /**
7 | * A class that represents a theme for the app.
8 | * @property id The id of the theme.
9 | * @property theme The resource id of the theme.
10 | * @property palette The palette of the theme.
11 | * @property isPremium Whether the theme is premium.
12 | * @property isDarkTheme Whether the theme is dark.
13 | * @property name The name of the theme.
14 | */
15 | data class AppTheme(
16 | val id: Long,
17 | @StyleRes val theme: Int,
18 | val palette: AreaPalette,
19 | val isPremium: Boolean = true,
20 | val isDarkTheme: Boolean,
21 | @StringRes val name: Int? = null,
22 | )
23 |
--------------------------------------------------------------------------------
/ui/src/main/java/dev/lucasnlm/antimine/ui/model/TopBarAction.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.ui.model
2 |
3 | import androidx.annotation.DrawableRes
4 | import androidx.annotation.StringRes
5 |
6 | class TopBarAction(
7 | @StringRes val name: Int,
8 | @DrawableRes val icon: Int,
9 | val action: () -> Unit,
10 | )
11 |
--------------------------------------------------------------------------------
/ui/src/main/java/dev/lucasnlm/antimine/ui/repository/ThemeRepository.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.ui.repository
2 |
3 | import dev.lucasnlm.antimine.ui.model.AppSkin
4 | import dev.lucasnlm.antimine.ui.model.AppTheme
5 |
6 | interface ThemeRepository {
7 | fun getCustomTheme(): AppTheme?
8 |
9 | fun getSkin(): AppSkin
10 |
11 | fun getTheme(): AppTheme
12 |
13 | fun getAllThemes(): List
14 |
15 | fun getAllDarkThemes(): List
16 |
17 | fun getAllSkins(): List
18 |
19 | fun setTheme(themeId: Long)
20 |
21 | fun setSkin(skinId: Long)
22 |
23 | fun reset(): AppTheme
24 | }
25 |
--------------------------------------------------------------------------------
/ui/src/main/java/dev/lucasnlm/antimine/ui/view/SpaceItemDecoration.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.ui.view
2 |
3 | import android.graphics.Rect
4 | import android.view.View
5 | import androidx.annotation.DimenRes
6 | import androidx.recyclerview.widget.RecyclerView
7 | import androidx.recyclerview.widget.RecyclerView.ItemDecoration
8 |
9 | class SpaceItemDecoration(
10 | @DimenRes private val spaceRes: Int,
11 | ) : ItemDecoration() {
12 | override fun getItemOffsets(
13 | outRect: Rect,
14 | view: View,
15 | parent: RecyclerView,
16 | state: RecyclerView.State,
17 | ) {
18 | super.getItemOffsets(outRect, view, parent, state)
19 | val space = view.context.resources.getDimension(spaceRes).toInt()
20 | outRect.offset(space, space)
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/back_arrow.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/close.xml:
--------------------------------------------------------------------------------
1 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/flag.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/flag_black.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/offer.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/oldschool.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/ui/src/main/res/drawable/oldschool.png
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/oldschool2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/ui/src/main/res/drawable/oldschool2.png
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/question.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/skin_classic.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/ui/src/main/res/drawable/skin_classic.webp
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/skin_glass_2.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/ui/src/main/res/drawable/skin_glass_2.webp
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/skin_square.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/ui/src/main/res/drawable/skin_square.webp
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/skin_square_2.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/ui/src/main/res/drawable/skin_square_2.webp
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/skin_square_3.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/ui/src/main/res/drawable/skin_square_3.webp
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/skin_standard.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/ui/src/main/res/drawable/skin_standard.webp
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/skin_standard_no_connection.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/ui/src/main/res/drawable/skin_standard_no_connection.webp
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/skin_stone.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/ui/src/main/res/drawable/skin_stone.webp
--------------------------------------------------------------------------------
/ui/src/main/res/drawable/skin_stone_2.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/ui/src/main/res/drawable/skin_stone_2.webp
--------------------------------------------------------------------------------
/ui/src/main/res/values-car/specifiq.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 28dp
5 | 28dp
6 | 24sp
7 | false
8 | 16dp
9 | 12dp
10 | 72dp
11 | 64dp
12 |
--------------------------------------------------------------------------------
/ui/src/main/res/values-night/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #d5d2cc
4 | #000000
5 | #FF212121
6 |
7 | #d5d2cc
8 | #d5d2cc
9 | #d5d2cc
10 | #d5d2cc
11 | #d5d2cc
12 | #d5d2cc
13 | #d5d2cc
14 | #d5d2cc
15 |
16 | #FFFFFF
17 | #FFFFFF
18 | #333
19 |
20 | #d5d2cc
21 | #ff424242
22 |
23 |
24 |
--------------------------------------------------------------------------------
/ui/src/main/res/values/specifiq.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 4dp
4 | 20dp
5 | 24dp
6 | 14sp
7 | true
8 | 8dp
9 | 4dp
10 | 52dp
11 | 52dp
12 |
--------------------------------------------------------------------------------
/ui/src/test/java/dev/lucasnlm/antimine/ui/repository/ThemeRepositoryTest.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.ui.repository
2 |
3 | import org.junit.Assert.assertEquals
4 | import org.junit.Test
5 |
6 | class ThemeRepositoryTest {
7 | @Test
8 | fun getAllThemesMustNotHaveDuplicatedIds() {
9 | val customThemes = Themes.getAllCustom()
10 | customThemes.distinctBy { it.id }.count()
11 | assertEquals(customThemes.size, customThemes.distinctBy { it.id }.count())
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/utils/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/utils/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/utils/consumer-rules.pro
--------------------------------------------------------------------------------
/utils/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
--------------------------------------------------------------------------------
/utils/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/utils/src/main/java/dev/lucasnlm/antimine/utils/ActivityExt.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.utils
2 |
3 | import android.app.Activity
4 | import androidx.activity.ComponentActivity
5 | import dev.lucasnlm.antimine.utils.BuildExt.androidUpsideDownCake
6 |
7 | object ActivityExt {
8 | @Suppress("DEPRECATION")
9 | fun Activity.compatOverridePendingTransition() {
10 | when {
11 | androidUpsideDownCake() -> {
12 | overrideActivityTransition(ComponentActivity.OVERRIDE_TRANSITION_OPEN, 0, 0)
13 | overrideActivityTransition(ComponentActivity.OVERRIDE_TRANSITION_CLOSE, 0, 0)
14 | }
15 | else -> {
16 | overridePendingTransition(0, 0)
17 | }
18 | }
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/utils/src/main/java/dev/lucasnlm/antimine/utils/ContextExt.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.utils
2 |
3 | import android.content.Context
4 | import android.content.res.Configuration
5 |
6 | object ContextExt {
7 | /**
8 | * @return true if the device is in portrait mode, false otherwise.
9 | */
10 | fun Context.isPortrait(): Boolean {
11 | return resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT
12 | }
13 |
14 | /**
15 | * @return true if the device is in landscape mode, false otherwise.
16 | */
17 | fun Context.dpToPx(dp: Int): Int {
18 | return (dp * resources.displayMetrics.density).toInt()
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/wear/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/wear/src/main/java/dev/lucasnlm/antimine/wear/core/AppVersionManagerImpl.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.wear.core
2 |
3 | import dev.lucasnlm.antimine.core.AppVersionManager
4 |
5 | /**
6 | * Information about the app version.
7 | * Wear implementation doesn't have any restriction.
8 | */
9 | class AppVersionManagerImpl : AppVersionManager {
10 | override fun isValid(): Boolean = true
11 |
12 | override fun isWatch(): Boolean = true
13 | }
14 |
--------------------------------------------------------------------------------
/wear/src/main/java/dev/lucasnlm/antimine/wear/di/ViewModelModule.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.wear.di
2 |
3 | import dev.lucasnlm.antimine.common.level.viewmodel.GameViewModel
4 | import dev.lucasnlm.antimine.control.viewmodel.ControlViewModel
5 | import org.koin.androidx.viewmodel.dsl.viewModel
6 | import org.koin.dsl.module
7 |
8 | val ViewModelModule =
9 | module {
10 | viewModel { ControlViewModel(get(), get()) }
11 | viewModel {
12 | GameViewModel(
13 | get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(), get(),
14 | )
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/wear/src/main/java/dev/lucasnlm/antimine/wear/main/models/ControlTypeItem.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.wear.main.models
2 |
3 | import androidx.annotation.StringRes
4 | import dev.lucasnlm.antimine.preferences.models.ControlStyle
5 |
6 | data class ControlTypeItem(
7 | val id: Long,
8 | val controlStyle: ControlStyle,
9 | @StringRes val primaryAction: Int,
10 | @StringRes val secondaryAction: Int? = null,
11 | )
12 |
--------------------------------------------------------------------------------
/wear/src/main/java/dev/lucasnlm/antimine/wear/main/models/MenuItem.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.wear.main.models
2 |
3 | import androidx.annotation.DrawableRes
4 | import androidx.annotation.StringRes
5 |
6 | data class MenuItem(
7 | val id: Long,
8 | @StringRes val label: Int,
9 | @DrawableRes val icon: Int,
10 | val highlight: Boolean = false,
11 | val onClick: () -> Unit,
12 | )
13 |
--------------------------------------------------------------------------------
/wear/src/main/java/dev/lucasnlm/antimine/wear/message/GameOverActivity.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.wear.message
2 |
3 | import dev.lucasnlm.antimine.wear.R
4 | import dev.lucasnlm.antimine.i18n.R as i18n
5 |
6 | class GameOverActivity(
7 | override val message: Int = i18n.string.you_lost,
8 | override val emojiRes: Int = R.drawable.emoji_bomb,
9 | ) : EmojiMessageActivity()
10 |
--------------------------------------------------------------------------------
/wear/src/main/java/dev/lucasnlm/antimine/wear/message/MessageActivity.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.wear.message
2 |
3 | import android.os.Bundle
4 | import dev.lucasnlm.antimine.ui.ext.ThemedActivity
5 | import dev.lucasnlm.antimine.wear.databinding.ActivityMessageBinding
6 |
7 | class MessageActivity : ThemedActivity() {
8 | private val binding: ActivityMessageBinding by lazy {
9 | ActivityMessageBinding.inflate(layoutInflater)
10 | }
11 |
12 | override fun onCreate(savedInstanceState: Bundle?) {
13 | super.onCreate(savedInstanceState)
14 | setContentView(binding.root)
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/wear/src/main/java/dev/lucasnlm/antimine/wear/message/VictoryActivity.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.wear.message
2 |
3 | import dev.lucasnlm.antimine.wear.R
4 | import dev.lucasnlm.antimine.i18n.R as i18n
5 |
6 | class VictoryActivity(
7 | override val message: Int = i18n.string.you_won,
8 | override val emojiRes: Int = R.drawable.emoji_smiling_face_with_sunglasses,
9 | ) : EmojiMessageActivity()
10 |
--------------------------------------------------------------------------------
/wear/src/main/java/dev/lucasnlm/antimine/wear/tutorial/WearTutorialActivity.kt:
--------------------------------------------------------------------------------
1 | package dev.lucasnlm.antimine.wear.tutorial
2 |
3 | import android.os.Bundle
4 | import dev.lucasnlm.antimine.ui.ext.ThemedActivity
5 | import dev.lucasnlm.antimine.wear.databinding.ActivityTutorialBinding
6 |
7 | class WearTutorialActivity : ThemedActivity() {
8 | private val binding: ActivityTutorialBinding by lazy {
9 | ActivityTutorialBinding.inflate(layoutInflater)
10 | }
11 |
12 | override fun onCreate(savedInstanceState: Bundle?) {
13 | super.onCreate(savedInstanceState)
14 | setContentView(binding.root)
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/about.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/add.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/check.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/close.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/flag.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/play.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/radio_button_checked.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/radio_button_unchecked.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/refresh.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/round_arrow.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/round_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/shovel.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/splash_screen.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/themes.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/touch.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/tutorial.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/tutorial_example_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/wear/src/main/res/drawable/tutorial_example_1.png
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/tutorial_example_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/wear/src/main/res/drawable/tutorial_example_2.png
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/tutorial_example_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/wear/src/main/res/drawable/tutorial_example_3.png
--------------------------------------------------------------------------------
/wear/src/main/res/drawable/tutorial_example_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucasnlm/antimine-android/86400370a7b7bd8e27ccc6520065c6b68d64b8f2/wear/src/main/res/drawable/tutorial_example_4.png
--------------------------------------------------------------------------------
/wear/src/main/res/layout/activity_control_types.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
16 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/wear/src/main/res/layout/activity_difficulty.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
16 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/wear/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
16 |
19 |
20 |
--------------------------------------------------------------------------------
/wear/src/main/res/layout/activity_themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/wear/src/main/res/layout/view_menu_item.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
14 |
15 |
--------------------------------------------------------------------------------
/wear/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
--------------------------------------------------------------------------------