├── .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 | --------------------------------------------------------------------------------