├── .github
├── actions
│ └── get-avd-info
│ │ └── action.yml
└── workflows
│ ├── android.yml
│ └── android_old.yml
├── .gitignore
├── .idea
├── .name
├── icon.svg
└── runConfigurations
│ ├── All_Tests.xml
│ ├── Detekt.xml
│ └── Lint.xml
├── LICENCE
├── README.md
├── app
├── .gitignore
├── build.gradle.kts
├── lint-baseline.xml
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── AndroidManifest.xml
│ └── main
│ ├── AndroidManifest.xml
│ ├── ic_launcher-playstore.png
│ ├── java
│ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ ├── NewQuizApp.kt
│ │ ├── core
│ │ ├── navigation
│ │ │ ├── AppNavGraphs.kt
│ │ │ ├── CommonNavGraphNavigator.kt
│ │ │ └── NavigationItem.kt
│ │ └── workers
│ │ │ └── AppStartLoggingAnalyticsWorker.kt
│ │ ├── initializer
│ │ ├── EnqueueStartWorksInitializer.kt
│ │ └── WorkManagerInitializer.kt
│ │ └── ui
│ │ ├── components
│ │ ├── DataCollectionConsentDialog.kt
│ │ └── DiamondsCounter.kt
│ │ ├── main
│ │ ├── MainActivity.kt
│ │ ├── MainScreenUiEvent.kt
│ │ ├── MainScreenUiState.kt
│ │ └── MainViewModel.kt
│ │ └── navigation
│ │ ├── CompactNavigationContainer.kt
│ │ ├── ExpandedNavigationContainer.kt
│ │ ├── MediumNavigationContainer.kt
│ │ ├── NavDrawerContent.kt
│ │ └── NavigationContainer.kt
│ └── res
│ ├── drawable
│ ├── round_password_24.xml
│ ├── round_play_circle_24.xml
│ └── round_quiz_24.xml
│ ├── resources.properties
│ ├── values-night
│ └── splash_screen.xml
│ ├── values
│ ├── colors.xml
│ ├── leak_canary.xml
│ ├── splash_screen.xml
│ └── strings.xml
│ └── xml-v25
│ └── shortcuts.xml
├── build-logic
├── .gitignore
├── README.md
├── convention
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── kotlin
│ │ ├── AndroidApplicationComposeConventionPlugin.kt
│ │ ├── AndroidApplicationConventionPlugin.kt
│ │ ├── AndroidApplicationFirebaseConventionPlugin.kt
│ │ ├── AndroidComposeDestinationsConventionPlugin.kt
│ │ ├── AndroidFeatureConventionPlugin.kt
│ │ ├── AndroidHiltConventionPlugin.kt
│ │ ├── AndroidLibraryComposeConventionPlugin.kt
│ │ ├── AndroidLibraryConventionPlugin.kt
│ │ ├── AndroidRoomConventionPlugin.kt
│ │ ├── DetektConventionPlugin.kt
│ │ ├── JvmLibraryConventionPlugin.kt
│ │ ├── KotlinSerializationConventionPlugin.kt
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ ├── AndroidCompose.kt
│ │ ├── AndroidInstrumentedTests.kt
│ │ ├── Flavors.kt
│ │ ├── KotlinAndroid.kt
│ │ ├── ProjectConfig.kt
│ │ ├── ProjectExtensions.kt
│ │ └── Utils.kt
├── gradle.properties
└── settings.gradle.kts
├── build.gradle.kts
├── comparison-quiz
├── .gitignore
├── README.md
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ ├── androidTest
│ ├── AndroidManifest.xml
│ └── java
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── comparison_quiz
│ │ ├── data
│ │ └── comparison_quiz
│ │ │ └── FakeComparisonQuizRepositoryImpl.kt
│ │ ├── list
│ │ └── components
│ │ │ ├── ComparisonModeComponentTest.kt
│ │ │ └── ComparisonModeComponentsTest.kt
│ │ └── ui
│ │ ├── ComparisonQuizScreenTest.kt
│ │ └── components
│ │ └── ComparisonItemTest.kt
│ ├── main
│ ├── AndroidManifest.xml
│ └── java
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── comparison_quiz
│ │ ├── core
│ │ ├── ComparisonQuizCoreImpl.kt
│ │ └── workers
│ │ │ └── ComparisonQuizEndGameWorker.kt
│ │ ├── di
│ │ └── ComparisonQuizModule.kt
│ │ ├── list
│ │ ├── ComparisonQuizListScreen.kt
│ │ ├── ComparisonQuizListScreenUiEvent.kt
│ │ ├── ComparisonQuizListScreenUiState.kt
│ │ ├── ComparisonQuizListScreenViewModel.kt
│ │ └── components
│ │ │ ├── ComparisonModeComponent.kt
│ │ │ └── ComparisonModeComponents.kt
│ │ └── ui
│ │ ├── AnimationState.kt
│ │ ├── ComparisonQuizScreen.kt
│ │ ├── ComparisonQuizUiEvent.kt
│ │ ├── ComparisonQuizUiState.kt
│ │ ├── ComparisonQuizViewModel.kt
│ │ └── components
│ │ ├── ComparisonItem.kt
│ │ ├── ComparisonMidContent.kt
│ │ ├── GameOverContent.kt
│ │ └── MiddleCircle.kt
│ └── test
│ └── java
│ └── com
│ └── infinitepower
│ └── newquiz
│ └── comparison_quiz
│ └── core
│ └── ComparisonQuizCoreImplTest.kt
├── compose_compiler_config.conf
├── core
├── .gitignore
├── analytics
│ ├── .gitignore
│ ├── LOGGING_ANALYTICS.md
│ ├── README.md
│ ├── build.gradle.kts
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ └── src
│ │ ├── foss
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── core
│ │ │ └── analytics
│ │ │ └── FossAnalyticsModule.kt
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── core
│ │ │ └── analytics
│ │ │ ├── AnalyticsEvent.kt
│ │ │ ├── AnalyticsHelper.kt
│ │ │ ├── LocalDebugAnalyticsHelper.kt
│ │ │ ├── NoOpAnalyticsHelper.kt
│ │ │ ├── UiHelpers.kt
│ │ │ └── UserProperty.kt
│ │ └── normal
│ │ └── kotlin
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── core
│ │ └── analytics
│ │ ├── FirebaseAnalyticsHelper.kt
│ │ └── NormalAnalyticsModule.kt
├── build.gradle.kts
├── consumer-rules.pro
├── database
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ ├── schemas
│ │ └── com.infinitepower.newquiz.core.database.AppDatabase
│ │ │ ├── 1.json
│ │ │ ├── 2.json
│ │ │ ├── 3.json
│ │ │ ├── 4.json
│ │ │ ├── 5.json
│ │ │ ├── 6.json
│ │ │ └── 7.json
│ └── src
│ │ ├── androidTest
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── core
│ │ │ └── database
│ │ │ └── dao
│ │ │ └── DailyChallengeDaoTest.kt
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── core
│ │ └── database
│ │ ├── AppDatabase.kt
│ │ ├── dao
│ │ ├── DailyChallengeDao.kt
│ │ ├── GameResultDao.kt
│ │ ├── MazeQuizDao.kt
│ │ └── SavedMultiChoiceQuestionsDao.kt
│ │ ├── di
│ │ ├── DaoModule.kt
│ │ └── DatabaseModule.kt
│ │ ├── model
│ │ ├── DailyChallengeTaskEntity.kt
│ │ ├── MazeQuizItemEntity.kt
│ │ ├── MultiChoiceQuestionEntity.kt
│ │ └── user
│ │ │ ├── BaseGameResultEntity.kt
│ │ │ ├── ComparisonQuizGameResultEntity.kt
│ │ │ ├── MultiChoiceGameResultEntity.kt
│ │ │ └── WordleGameResultEntity.kt
│ │ └── util
│ │ ├── converters
│ │ ├── ListConverter.kt
│ │ ├── LocalDateConverter.kt
│ │ ├── MathFormulaConverter.kt
│ │ └── QuestionDifficultyConverter.kt
│ │ └── mappers
│ │ └── MultiChoiceQuestionMapper.kt
├── datastore
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ └── src
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── core
│ │ │ └── datastore
│ │ │ ├── PreferenceRequest.kt
│ │ │ ├── common
│ │ │ ├── LocalUserCommon.kt
│ │ │ ├── RecentCategoryDataStoreCommon.kt
│ │ │ └── SettingsCommon.kt
│ │ │ ├── di
│ │ │ ├── LocalUserDatastoreModule.kt
│ │ │ ├── RecentCategoriesDatastoreModule.kt
│ │ │ └── SettingsDataStoreModule.kt
│ │ │ └── manager
│ │ │ ├── DataStoreManager.kt
│ │ │ └── PreferencesDatastoreManager.kt
│ │ ├── normal
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── core
│ │ │ └── datastore
│ │ │ ├── common
│ │ │ ├── DataAnalyticsCommon.kt
│ │ │ └── TranslationCommon.kt
│ │ │ └── di
│ │ │ └── DataAnalyticsDatastoreModule.kt
│ │ └── test
│ │ └── kotlin
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── core
│ │ └── datastore
│ │ └── manager
│ │ └── PreferencesDatastoreManagerTest.kt
├── proguard-rules.pro
├── remote-config
│ ├── .gitignore
│ ├── README.md
│ ├── build.gradle.kts
│ └── src
│ │ ├── foss
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── core
│ │ │ └── remote_config
│ │ │ └── initializer
│ │ │ └── RemoteConfigInitializer.kt
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── kotlin
│ │ │ └── com
│ │ │ │ └── infinitepower
│ │ │ │ └── newquiz
│ │ │ │ └── core
│ │ │ │ └── remote_config
│ │ │ │ ├── LocalDefaultsRemoteConfig.kt
│ │ │ │ ├── RemoteConfig.kt
│ │ │ │ ├── RemoteConfigValue.kt
│ │ │ │ └── RemoteConfigXmlParser.kt
│ │ └── res
│ │ │ └── xml
│ │ │ └── remote_config_defaults.xml
│ │ ├── normal
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── core
│ │ │ └── remote_config
│ │ │ ├── FirebaseRemoteConfigImpl.kt
│ │ │ └── initializer
│ │ │ └── RemoteConfigInitializer.kt
│ │ └── test
│ │ └── kotlin
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── core
│ │ └── remote_config
│ │ ├── LocalRemoteConfig.kt
│ │ └── RemoteConfigTest.kt
├── src
│ ├── androidTest
│ │ ├── AndroidManifest.xml
│ │ ├── assets
│ │ │ └── buttons
│ │ │ │ ├── back_button.png
│ │ │ │ └── back_button2.png
│ │ └── java
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── core
│ │ │ └── ui
│ │ │ └── components
│ │ │ ├── RemainingTimeComponentTest.kt
│ │ │ ├── category
│ │ │ ├── CategoryComponentTest.kt
│ │ │ └── CategoryConnectionInfoBadgeTest.kt
│ │ │ ├── icon
│ │ │ └── button
│ │ │ │ └── BackIconButtonTest.kt
│ │ │ └── skip_question
│ │ │ └── SkipQuestionDialogTest.kt
│ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── infinitepower
│ │ │ │ └── newquiz
│ │ │ │ └── core
│ │ │ │ ├── NumberFormatter.kt
│ │ │ │ ├── common
│ │ │ │ ├── BaseApiUrls.kt
│ │ │ │ ├── Common.kt
│ │ │ │ ├── compose
│ │ │ │ │ └── preview
│ │ │ │ │ │ └── BooleanPreviewParameterProvider.kt
│ │ │ │ └── database
│ │ │ │ │ └── DatabaseCommon.kt
│ │ │ │ ├── compose
│ │ │ │ └── preferences
│ │ │ │ │ └── LocalPreferenceEnabledStatus.kt
│ │ │ │ ├── di
│ │ │ │ ├── KtorModule.kt
│ │ │ │ └── NetworkStatusModule.kt
│ │ │ │ ├── game
│ │ │ │ ├── ComparisonQuizCore.kt
│ │ │ │ ├── GameCore.kt
│ │ │ │ └── SkipGame.kt
│ │ │ │ ├── math
│ │ │ │ └── evaluator
│ │ │ │ │ ├── Expressions.kt
│ │ │ │ │ └── internal
│ │ │ │ │ ├── Evaluator.kt
│ │ │ │ │ ├── Expr.kt
│ │ │ │ │ ├── Function.kt
│ │ │ │ │ ├── Parser.kt
│ │ │ │ │ ├── Scanner.kt
│ │ │ │ │ ├── Token.kt
│ │ │ │ │ └── TokenType.kt
│ │ │ │ ├── navigation
│ │ │ │ └── MazeNavigator.kt
│ │ │ │ ├── network
│ │ │ │ ├── NetworkStatusTracker.kt
│ │ │ │ └── NetworkStatusTrackerImpl.kt
│ │ │ │ ├── theme
│ │ │ │ ├── ExtendedColor.kt
│ │ │ │ ├── LocalAnimationsEnabled.kt
│ │ │ │ ├── Spacing.kt
│ │ │ │ ├── Theme.kt
│ │ │ │ └── Type.kt
│ │ │ │ ├── ui
│ │ │ │ ├── DisabledEmphasisWrappers.kt
│ │ │ │ ├── ObserveAsEvents.kt
│ │ │ │ ├── SnackbarController.kt
│ │ │ │ ├── components
│ │ │ │ │ ├── AppNameWithLogo.kt
│ │ │ │ │ ├── RemainingTimeComponent.kt
│ │ │ │ │ ├── RoundedPolygonShape.kt
│ │ │ │ │ ├── category
│ │ │ │ │ │ ├── CategoryBadge.kt
│ │ │ │ │ │ └── CategoryComponent.kt
│ │ │ │ │ ├── icon
│ │ │ │ │ │ └── button
│ │ │ │ │ │ │ └── BackIconButton.kt
│ │ │ │ │ └── skip_question
│ │ │ │ │ │ ├── SkipButton.kt
│ │ │ │ │ │ └── SkipQuestionDialog.kt
│ │ │ │ ├── home
│ │ │ │ │ ├── ExpandCategoriesButton.kt
│ │ │ │ │ ├── HomeCategoriesItems.kt
│ │ │ │ │ └── HomeLazyColumn.kt
│ │ │ │ ├── home_card
│ │ │ │ │ ├── HomeListContent.kt
│ │ │ │ │ ├── components
│ │ │ │ │ │ ├── HomeCardIcon.kt
│ │ │ │ │ │ ├── HomeCardItemContent.kt
│ │ │ │ │ │ ├── HomeGroupTitle.kt
│ │ │ │ │ │ ├── HomeHorizontalItems.kt
│ │ │ │ │ │ ├── HomeLargeCard.kt
│ │ │ │ │ │ ├── HomeMediumCard.kt
│ │ │ │ │ │ └── PlayRandomQuizCard.kt
│ │ │ │ │ └── model
│ │ │ │ │ │ └── HomeCardItem.kt
│ │ │ │ ├── icons
│ │ │ │ │ └── TrophyIcon.kt
│ │ │ │ └── text
│ │ │ │ │ └── CompactDecimalText.kt
│ │ │ │ └── util
│ │ │ │ ├── ComposeUtils.kt
│ │ │ │ ├── PackageUtils.kt
│ │ │ │ ├── UiTextUtils.kt
│ │ │ │ ├── UriUtils.kt
│ │ │ │ ├── android
│ │ │ │ ├── DrawableUtils.kt
│ │ │ │ └── resources
│ │ │ │ │ └── ResourcesUtil.kt
│ │ │ │ ├── collections
│ │ │ │ └── Collections.kt
│ │ │ │ ├── kotlin
│ │ │ │ ├── BooleanUtils.kt
│ │ │ │ ├── CollectionsUtils.kt
│ │ │ │ ├── Math.kt
│ │ │ │ ├── NumberUtils.kt
│ │ │ │ └── SetUtils.kt
│ │ │ │ └── model
│ │ │ │ └── QuestionDifficultyUtil.kt
│ │ └── res
│ │ │ ├── drawable-hdpi
│ │ │ ├── animals.webp
│ │ │ ├── art.webp
│ │ │ ├── books.webp
│ │ │ ├── celebrities.webp
│ │ │ ├── entertainment_board_games.webp
│ │ │ ├── entertainment_cartoon_and_animations.webp
│ │ │ ├── entertainment_comics.webp
│ │ │ ├── entertainment_japanese_anime_and_manga.webp
│ │ │ ├── entertainment_television.webp
│ │ │ ├── entertainment_video_games.webp
│ │ │ ├── films.webp
│ │ │ ├── general_knowledge.webp
│ │ │ ├── geography.webp
│ │ │ ├── history.webp
│ │ │ ├── music.webp
│ │ │ ├── musicals_and_theatres.webp
│ │ │ ├── mythology.webp
│ │ │ ├── politics.webp
│ │ │ ├── science_and_nature.webp
│ │ │ ├── science_computers.webp
│ │ │ ├── science_gadgets.webp
│ │ │ ├── science_mathematics.webp
│ │ │ ├── sports.webp
│ │ │ └── vehicles.webp
│ │ │ ├── drawable-mdpi
│ │ │ ├── animals.webp
│ │ │ ├── art.webp
│ │ │ ├── books.webp
│ │ │ ├── celebrities.webp
│ │ │ ├── entertainment_board_games.webp
│ │ │ ├── entertainment_cartoon_and_animations.webp
│ │ │ ├── entertainment_comics.webp
│ │ │ ├── entertainment_japanese_anime_and_manga.webp
│ │ │ ├── entertainment_television.webp
│ │ │ ├── entertainment_video_games.webp
│ │ │ ├── films.webp
│ │ │ ├── general_knowledge.webp
│ │ │ ├── geography.webp
│ │ │ ├── history.webp
│ │ │ ├── music.webp
│ │ │ ├── musicals_and_theatres.webp
│ │ │ ├── mythology.webp
│ │ │ ├── politics.webp
│ │ │ ├── science_and_nature.webp
│ │ │ ├── science_computers.webp
│ │ │ ├── science_gadgets.webp
│ │ │ ├── science_mathematics.webp
│ │ │ ├── sports.webp
│ │ │ └── vehicles.webp
│ │ │ ├── drawable-xhdpi
│ │ │ ├── animals.webp
│ │ │ ├── art.webp
│ │ │ ├── books.webp
│ │ │ ├── celebrities.webp
│ │ │ ├── entertainment_board_games.webp
│ │ │ ├── entertainment_cartoon_and_animations.webp
│ │ │ ├── entertainment_comics.webp
│ │ │ ├── entertainment_japanese_anime_and_manga.webp
│ │ │ ├── entertainment_television.webp
│ │ │ ├── entertainment_video_games.webp
│ │ │ ├── films.webp
│ │ │ ├── general_knowledge.webp
│ │ │ ├── geography.webp
│ │ │ ├── history.webp
│ │ │ ├── music.webp
│ │ │ ├── musicals_and_theatres.webp
│ │ │ ├── mythology.webp
│ │ │ ├── politics.webp
│ │ │ ├── science_and_nature.webp
│ │ │ ├── science_computers.webp
│ │ │ ├── science_gadgets.webp
│ │ │ ├── science_mathematics.webp
│ │ │ ├── sports.webp
│ │ │ └── vehicles.webp
│ │ │ ├── drawable-xxhdpi
│ │ │ ├── animals.webp
│ │ │ ├── art.webp
│ │ │ ├── books.webp
│ │ │ ├── celebrities.webp
│ │ │ ├── entertainment_board_games.webp
│ │ │ ├── entertainment_cartoon_and_animations.webp
│ │ │ ├── entertainment_comics.webp
│ │ │ ├── entertainment_japanese_anime_and_manga.webp
│ │ │ ├── entertainment_television.webp
│ │ │ ├── entertainment_video_games.webp
│ │ │ ├── films.webp
│ │ │ ├── general_knowledge.webp
│ │ │ ├── geography.webp
│ │ │ ├── history.webp
│ │ │ ├── music.webp
│ │ │ ├── musicals_and_theatres.webp
│ │ │ ├── mythology.webp
│ │ │ ├── politics.webp
│ │ │ ├── science_and_nature.webp
│ │ │ ├── science_computers.webp
│ │ │ ├── science_gadgets.webp
│ │ │ ├── science_mathematics.webp
│ │ │ ├── sports.webp
│ │ │ └── vehicles.webp
│ │ │ ├── drawable-xxxhdpi
│ │ │ ├── animals.webp
│ │ │ ├── art.webp
│ │ │ ├── books.webp
│ │ │ ├── celebrities.webp
│ │ │ ├── entertainment_board_games.webp
│ │ │ ├── entertainment_cartoon_and_animations.webp
│ │ │ ├── entertainment_comics.webp
│ │ │ ├── entertainment_japanese_anime_and_manga.webp
│ │ │ ├── entertainment_television.webp
│ │ │ ├── entertainment_video_games.webp
│ │ │ ├── films.webp
│ │ │ ├── general_knowledge.webp
│ │ │ ├── geography.webp
│ │ │ ├── history.webp
│ │ │ ├── music.webp
│ │ │ ├── musicals_and_theatres.webp
│ │ │ ├── mythology.webp
│ │ │ ├── politics.webp
│ │ │ ├── science_and_nature.webp
│ │ │ ├── science_computers.webp
│ │ │ ├── science_gadgets.webp
│ │ │ ├── science_mathematics.webp
│ │ │ ├── sports.webp
│ │ │ └── vehicles.webp
│ │ │ ├── drawable
│ │ │ ├── github_logo.xml
│ │ │ ├── logo_monochromatic.xml
│ │ │ ├── round_android_24.xml
│ │ │ └── round_flag_circle_24.xml
│ │ │ ├── mipmap-anydpi-v26
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.webp
│ │ │ ├── ic_launcher_foreground.webp
│ │ │ └── ic_launcher_round.webp
│ │ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.webp
│ │ │ ├── ic_launcher_foreground.webp
│ │ │ └── ic_launcher_round.webp
│ │ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.webp
│ │ │ ├── ic_launcher_foreground.webp
│ │ │ └── ic_launcher_round.webp
│ │ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.webp
│ │ │ ├── ic_launcher_foreground.webp
│ │ │ └── ic_launcher_round.webp
│ │ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher_foreground.webp
│ │ │ └── ic_launcher_round.webp
│ │ │ ├── raw
│ │ │ ├── trophy2.json
│ │ │ ├── trophy_winner.json
│ │ │ ├── wordle_list.txt
│ │ │ ├── wordle_list_es.txt
│ │ │ ├── wordle_list_fr.txt
│ │ │ └── wordle_list_pt.txt
│ │ │ ├── values-de
│ │ │ └── strings.xml
│ │ │ ├── values-es
│ │ │ └── strings.xml
│ │ │ ├── values-et
│ │ │ └── strings.xml
│ │ │ ├── values-fr
│ │ │ └── strings.xml
│ │ │ ├── values-nb-rNO
│ │ │ └── strings.xml
│ │ │ ├── values-night
│ │ │ └── themes.xml
│ │ │ ├── values-pt
│ │ │ └── strings.xml
│ │ │ ├── values-ta
│ │ │ └── strings.xml
│ │ │ ├── values-v29
│ │ │ └── themes.xml
│ │ │ └── values
│ │ │ ├── ic_launcher_background.xml
│ │ │ ├── strings.xml
│ │ │ └── themes.xml
│ ├── normal
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── core
│ │ │ └── initializer
│ │ │ └── CoreFirebaseInitializer.kt
│ └── test
│ │ └── java
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── core
│ │ ├── NumberFormatterTest.kt
│ │ ├── game
│ │ └── ComparisonQuizDataTest.kt
│ │ └── util
│ │ ├── UiTextTests.kt
│ │ ├── collections
│ │ └── CollectionsTest.kt
│ │ └── kotlin
│ │ ├── BooleanUtilsTest.kt
│ │ ├── CollectionsUtilsTest.kt
│ │ ├── MathTest.kt
│ │ ├── NumberUtilsTest.kt
│ │ └── SetUtilsTest.kt
├── testing
│ ├── .gitignore
│ ├── README.md
│ ├── build.gradle.kts
│ └── src
│ │ ├── foss
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── core
│ │ │ └── testing
│ │ │ └── di
│ │ │ └── TestRemoteConfigModule.kt
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── core
│ │ │ └── testing
│ │ │ ├── NewQuizTestRunner.kt
│ │ │ ├── ScreenshotComparator.kt
│ │ │ ├── data
│ │ │ ├── fake
│ │ │ │ ├── FakeComparisonQuizData.kt
│ │ │ │ └── FakeData.kt
│ │ │ └── repository
│ │ │ │ ├── comparison_quiz
│ │ │ │ └── FakeComparisonQuizRepositoryImpl.kt
│ │ │ │ ├── multi_choice_quiz
│ │ │ │ └── TestMultiChoiceQuestionRepositoryImpl.kt
│ │ │ │ └── numbers
│ │ │ │ └── FakeNumberTriviaQuestionApiImpl.kt
│ │ │ ├── di
│ │ │ ├── TestDatabaseModule.kt
│ │ │ ├── TestKtorModule.kt
│ │ │ ├── TestRepositoryModule.kt
│ │ │ └── WorkManagerModule.kt
│ │ │ ├── domain
│ │ │ ├── FakeDailyChallengeDao.kt
│ │ │ └── FakeGameResultDao.kt
│ │ │ ├── ui
│ │ │ └── theme
│ │ │ │ └── TestTheme.kt
│ │ │ └── utils
│ │ │ ├── ComposeRule.kt
│ │ │ ├── LocaleUtils.kt
│ │ │ └── LogUtils.kt
│ │ └── normal
│ │ └── kotlin
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── core
│ │ └── testing
│ │ └── di
│ │ ├── RemoteConfigModule.kt
│ │ └── TestAnalyticsModule.kt
├── translation
│ ├── .gitignore
│ ├── README.md
│ ├── build.gradle.kts
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ └── src
│ │ ├── androidTestNormal
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── translation
│ │ │ └── GoogleTranslatorUtilTest.kt
│ │ ├── foss
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── core
│ │ │ └── translation
│ │ │ ├── NoTranslatorUtil.kt
│ │ │ └── di
│ │ │ └── TranslatorModule.kt
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── core
│ │ │ └── translation
│ │ │ ├── TranslatorLanguageSettings.kt
│ │ │ ├── TranslatorModelState.kt
│ │ │ └── TranslatorUtil.kt
│ │ ├── normal
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── core
│ │ │ └── translation
│ │ │ ├── GoogleTranslatorUtil.kt
│ │ │ └── di
│ │ │ └── GoogleTranslatorModule.kt
│ │ ├── testFoss
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── core
│ │ │ └── translation
│ │ │ └── NoTranslatorUtilTest.kt
│ │ └── testNormal
│ │ └── kotlin
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── core
│ │ └── translation
│ │ └── GoogleTranslatorUtilTest.kt
└── user-services
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ ├── androidTest
│ ├── AndroidManifest.xml
│ └── kotlin
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── core
│ │ └── user_services
│ │ └── LocalUserServiceImplTest.kt
│ ├── main
│ ├── AndroidManifest.xml
│ └── kotlin
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── core
│ │ └── user_services
│ │ ├── DateTimeRangeFormatter.kt
│ │ ├── GameResultTracker.kt
│ │ ├── InsufficientDiamondsException.kt
│ │ ├── LocalUserService.kt
│ │ ├── LocalUserServiceImpl.kt
│ │ ├── UserService.kt
│ │ ├── XpManager.kt
│ │ ├── data
│ │ └── xp
│ │ │ ├── ComparisonQuizXpGeneratorImpl.kt
│ │ │ ├── MultiChoiceQuizXpGeneratorImpl.kt
│ │ │ └── WordleXpGeneratorImpl.kt
│ │ ├── di
│ │ ├── UserModule.kt
│ │ └── XpGeneratorsModule.kt
│ │ ├── domain
│ │ └── xp
│ │ │ ├── ComparisonQuizXpGenerator.kt
│ │ │ ├── MultiChoiceQuizXpGenerator.kt
│ │ │ ├── WordleXpGenerator.kt
│ │ │ └── XpGenerator.kt
│ │ ├── model
│ │ └── User.kt
│ │ └── workers
│ │ └── MultiChoiceQuizEndGameWorker.kt
│ └── test
│ └── kotlin
│ └── com
│ └── infinitepower
│ └── newquiz
│ └── core
│ └── user_services
│ ├── DateTimeRangeFormatterTest.kt
│ ├── LocalUserServiceImplUnitTest.kt
│ ├── data
│ └── xp
│ │ ├── ComparisonQuizXpGeneratorImplTest.kt
│ │ ├── MultiChoiceQuizXpGeneratorImplTest.kt
│ │ └── WordleXpGeneratorImplTest.kt
│ └── model
│ └── UserTest.kt
├── data
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ ├── androidTest
│ ├── AndroidManifest.xml
│ └── java
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── data
│ │ ├── daily_challenge
│ │ └── DailyChallengeRepositoryImplTest.kt
│ │ ├── repository
│ │ ├── comparison_quiz
│ │ │ └── ComparisonQuizRepositoryImplTest.kt
│ │ └── country
│ │ │ └── CountryRepositoryImplTest.kt
│ │ └── worker
│ │ ├── daily_challenge
│ │ └── VerifyDailyChallengeWorkerTest.kt
│ │ └── maze
│ │ ├── CleanMazeQuizWorkerTest.kt
│ │ └── GenerateMazeQuizWorkerTest.kt
│ ├── main
│ ├── AndroidManifest.xml
│ ├── assets
│ │ └── flags
│ │ │ ├── ad.svg
│ │ │ ├── ae.svg
│ │ │ ├── af.svg
│ │ │ ├── ag.svg
│ │ │ ├── al.svg
│ │ │ ├── am.svg
│ │ │ ├── ao.svg
│ │ │ ├── ar.svg
│ │ │ ├── at.svg
│ │ │ ├── au.svg
│ │ │ ├── az.svg
│ │ │ ├── ba.svg
│ │ │ ├── bb.svg
│ │ │ ├── bd.svg
│ │ │ ├── be.svg
│ │ │ ├── bf.svg
│ │ │ ├── bg.svg
│ │ │ ├── bh.svg
│ │ │ ├── bi.svg
│ │ │ ├── bj.svg
│ │ │ ├── bn.svg
│ │ │ ├── bo.svg
│ │ │ ├── br.svg
│ │ │ ├── bs.svg
│ │ │ ├── bt.svg
│ │ │ ├── bw.svg
│ │ │ ├── by.svg
│ │ │ ├── bz.svg
│ │ │ ├── ca.svg
│ │ │ ├── cd.svg
│ │ │ ├── cf.svg
│ │ │ ├── cg.svg
│ │ │ ├── ch.svg
│ │ │ ├── ci.svg
│ │ │ ├── cl.svg
│ │ │ ├── cm.svg
│ │ │ ├── cn.svg
│ │ │ ├── co.svg
│ │ │ ├── cr.svg
│ │ │ ├── cu.svg
│ │ │ ├── cv.svg
│ │ │ ├── cy.svg
│ │ │ ├── cz.svg
│ │ │ ├── de.svg
│ │ │ ├── dj.svg
│ │ │ ├── dk.svg
│ │ │ ├── dm.svg
│ │ │ ├── do.svg
│ │ │ ├── dz.svg
│ │ │ ├── ec.svg
│ │ │ ├── ee.svg
│ │ │ ├── eg.svg
│ │ │ ├── eh.svg
│ │ │ ├── er.svg
│ │ │ ├── es.svg
│ │ │ ├── et.svg
│ │ │ ├── fi.svg
│ │ │ ├── fj.svg
│ │ │ ├── fm.svg
│ │ │ ├── fr.svg
│ │ │ ├── ga.svg
│ │ │ ├── gb.svg
│ │ │ ├── gd.svg
│ │ │ ├── ge.svg
│ │ │ ├── gh.svg
│ │ │ ├── gm.svg
│ │ │ ├── gn.svg
│ │ │ ├── gq.svg
│ │ │ ├── gr.svg
│ │ │ ├── gt.svg
│ │ │ ├── gw.svg
│ │ │ ├── gy.svg
│ │ │ ├── hn.svg
│ │ │ ├── hr.svg
│ │ │ ├── ht.svg
│ │ │ ├── hu.svg
│ │ │ ├── id.svg
│ │ │ ├── ie.svg
│ │ │ ├── il.svg
│ │ │ ├── in.svg
│ │ │ ├── iq.svg
│ │ │ ├── ir.svg
│ │ │ ├── is.svg
│ │ │ ├── it.svg
│ │ │ ├── jm.svg
│ │ │ ├── jo.svg
│ │ │ ├── jp.svg
│ │ │ ├── ke.svg
│ │ │ ├── kg.svg
│ │ │ ├── kh.svg
│ │ │ ├── ki.svg
│ │ │ ├── km.svg
│ │ │ ├── kn.svg
│ │ │ ├── kp.svg
│ │ │ ├── kr.svg
│ │ │ ├── kw.svg
│ │ │ ├── kz.svg
│ │ │ ├── la.svg
│ │ │ ├── lb.svg
│ │ │ ├── lc.svg
│ │ │ ├── li.svg
│ │ │ ├── lk.svg
│ │ │ ├── lr.svg
│ │ │ ├── ls.svg
│ │ │ ├── lt.svg
│ │ │ ├── lu.svg
│ │ │ ├── lv.svg
│ │ │ ├── ly.svg
│ │ │ ├── ma.svg
│ │ │ ├── mc.svg
│ │ │ ├── md.svg
│ │ │ ├── me.svg
│ │ │ ├── mg.svg
│ │ │ ├── mh.svg
│ │ │ ├── mk.svg
│ │ │ ├── ml.svg
│ │ │ ├── mm.svg
│ │ │ ├── mn.svg
│ │ │ ├── mr.svg
│ │ │ ├── mt.svg
│ │ │ ├── mu.svg
│ │ │ ├── mv.svg
│ │ │ ├── mw.svg
│ │ │ ├── mx.svg
│ │ │ ├── my.svg
│ │ │ ├── mz.svg
│ │ │ ├── na.svg
│ │ │ ├── ne.svg
│ │ │ ├── ng.svg
│ │ │ ├── ni.svg
│ │ │ ├── nl.svg
│ │ │ ├── no.svg
│ │ │ ├── np.svg
│ │ │ ├── nr.svg
│ │ │ ├── nz.svg
│ │ │ ├── om.svg
│ │ │ ├── pa.svg
│ │ │ ├── pe.svg
│ │ │ ├── pg.svg
│ │ │ ├── ph.svg
│ │ │ ├── pk.svg
│ │ │ ├── pl.svg
│ │ │ ├── pt.svg
│ │ │ ├── pw.svg
│ │ │ ├── py.svg
│ │ │ ├── qa.svg
│ │ │ ├── ro.svg
│ │ │ ├── rs.svg
│ │ │ ├── ru.svg
│ │ │ ├── rw.svg
│ │ │ ├── sa.svg
│ │ │ ├── sb.svg
│ │ │ ├── sc.svg
│ │ │ ├── sd.svg
│ │ │ ├── se.svg
│ │ │ ├── sg.svg
│ │ │ ├── si.svg
│ │ │ ├── sk.svg
│ │ │ ├── sl.svg
│ │ │ ├── sm.svg
│ │ │ ├── sn.svg
│ │ │ ├── so.svg
│ │ │ ├── sr.svg
│ │ │ ├── ss.svg
│ │ │ ├── st.svg
│ │ │ ├── sv.svg
│ │ │ ├── sy.svg
│ │ │ ├── sz.svg
│ │ │ ├── td.svg
│ │ │ ├── tg.svg
│ │ │ ├── th.svg
│ │ │ ├── tj.svg
│ │ │ ├── tl.svg
│ │ │ ├── tm.svg
│ │ │ ├── tn.svg
│ │ │ ├── to.svg
│ │ │ ├── tr.svg
│ │ │ ├── tt.svg
│ │ │ ├── tv.svg
│ │ │ ├── tw.svg
│ │ │ ├── tz.svg
│ │ │ ├── ua.svg
│ │ │ ├── ug.svg
│ │ │ ├── us.svg
│ │ │ ├── uy.svg
│ │ │ ├── uz.svg
│ │ │ ├── vc.svg
│ │ │ ├── ve.svg
│ │ │ ├── vn.svg
│ │ │ ├── vu.svg
│ │ │ ├── ws.svg
│ │ │ ├── ye.svg
│ │ │ ├── za.svg
│ │ │ ├── zm.svg
│ │ │ └── zw.svg
│ ├── java
│ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── data
│ │ │ ├── di
│ │ │ ├── MathModule.kt
│ │ │ └── RepositoryModule.kt
│ │ │ ├── local
│ │ │ ├── multi_choice_quiz
│ │ │ │ └── category
│ │ │ │ │ └── MultiChoiceQuestionCategories.kt
│ │ │ └── wordle
│ │ │ │ └── WordleCategories.kt
│ │ │ ├── repository
│ │ │ ├── UserConfigRepositoryImpl.kt
│ │ │ ├── comparison_quiz
│ │ │ │ ├── ComparisonQuizApi.kt
│ │ │ │ ├── ComparisonQuizApiImpl.kt
│ │ │ │ └── ComparisonQuizRepositoryImpl.kt
│ │ │ ├── country
│ │ │ │ ├── CountryEntity.kt
│ │ │ │ └── CountryRepositoryImpl.kt
│ │ │ ├── daily_challenge
│ │ │ │ ├── DailyChallengeRepositoryImpl.kt
│ │ │ │ └── util
│ │ │ │ │ └── DailyChallengeTypeTitleUtil.kt
│ │ │ ├── home
│ │ │ │ └── RecentCategoriesRepositoryImpl.kt
│ │ │ ├── math_quiz
│ │ │ │ └── MathQuizCoreRepositoryImpl.kt
│ │ │ ├── maze_quiz
│ │ │ │ └── MazeQuizRepositoryImpl.kt
│ │ │ ├── multi_choice_quiz
│ │ │ │ ├── CountryCapitalFlagsQuizRepositoryImpl.kt
│ │ │ │ ├── FlagQuizRepositoryImpl.kt
│ │ │ │ ├── GuessMathSolutionRepositoryImpl.kt
│ │ │ │ ├── LogoQuizRepositoryImpl.kt
│ │ │ │ ├── MultiChoiceQuestionRepositoryImpl.kt
│ │ │ │ ├── dto
│ │ │ │ │ └── OpenTDBQuestionResponse.kt
│ │ │ │ └── saved_questions
│ │ │ │ │ └── SavedMultiChoiceQuestionsRepositoryImpl.kt
│ │ │ ├── numbers
│ │ │ │ ├── NumberTriviaQuestionApiImpl.kt
│ │ │ │ └── NumberTriviaQuestionRepositoryImpl.kt
│ │ │ └── wordle
│ │ │ │ ├── InvalidWordError.kt
│ │ │ │ └── WordleRepositoryImpl.kt
│ │ │ ├── util
│ │ │ ├── mappers
│ │ │ │ ├── comparisonquiz
│ │ │ │ │ └── ComparisonQuizMapper.kt
│ │ │ │ ├── daily_challenge
│ │ │ │ │ └── DailyChallengeTaskMapper.kt
│ │ │ │ └── maze
│ │ │ │ │ └── MazeQuizMappers.kt
│ │ │ └── translation
│ │ │ │ └── WordleTitleUtil.kt
│ │ │ └── worker
│ │ │ ├── UpdateGlobalEventDataWorker.kt
│ │ │ ├── daily_challenge
│ │ │ └── VerifyDailyChallengeWorker.kt
│ │ │ ├── maze
│ │ │ ├── CleanMazeQuizWorker.kt
│ │ │ └── GenerateMazeQuizWorker.kt
│ │ │ └── multichoicequiz
│ │ │ └── DownloadMultiChoiceQuestionsWorker.kt
│ └── res
│ │ └── raw
│ │ └── all_countries.json
│ └── test
│ └── java
│ └── com
│ └── infinitepower
│ └── newquiz
│ └── data
│ ├── local
│ ├── math_quiz
│ │ └── MathQuizCoreRepositoryImplTest.kt
│ └── wordle
│ │ └── WordleCategoriesTest.kt
│ └── repository
│ ├── comparison_quiz
│ ├── ComparisonQuizApiImplTest.kt
│ └── ComparisonQuizRepositoryImplTest.kt
│ ├── country
│ ├── CountryRepositoryImplTest.kt
│ └── TestCountryRepositoryImpl.kt
│ ├── daily_challenge
│ └── DailyChallengeRepositoryImplTest.kt
│ ├── home
│ └── RecentCategoriesRepositoryImplTest.kt
│ ├── maze_quiz
│ └── MazeQuizRepositoryImplTest.kt
│ ├── multi_choice_quiz
│ ├── CountryCapitalFlagsQuizRepositoryImplTest.kt
│ └── FlagQuizRepositoryImplTest.kt
│ └── wordle
│ └── WordleRepositoryImplTest.kt
├── detekt-compose.yml
├── detekt.yml
├── domain
├── .gitignore
├── build.gradle.kts
└── src
│ ├── main
│ └── java
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── domain
│ │ ├── repository
│ │ ├── CountryRepository.kt
│ │ ├── UserConfigRepository.kt
│ │ ├── comparison_quiz
│ │ │ └── ComparisonQuizRepository.kt
│ │ ├── daily_challenge
│ │ │ └── DailyChallengeRepository.kt
│ │ ├── home
│ │ │ └── RecentCategoriesRepository.kt
│ │ ├── math_quiz
│ │ │ └── MathQuizCoreRepository.kt
│ │ ├── maze
│ │ │ └── MazeQuizRepository.kt
│ │ ├── multi_choice_quiz
│ │ │ ├── CountryCapitalFlagsQuizRepository.kt
│ │ │ ├── FlagQuizRepository.kt
│ │ │ ├── GuessMathSolutionRepository.kt
│ │ │ ├── LogoQuizRepository.kt
│ │ │ ├── MultiChoiceQuestionBaseRepository.kt
│ │ │ ├── MultiChoiceQuestionRepository.kt
│ │ │ └── saved_questions
│ │ │ │ └── SavedMultiChoiceQuestionsRepository.kt
│ │ ├── numbers
│ │ │ ├── NumberTriviaQuestionApi.kt
│ │ │ └── NumberTriviaQuestionRepository.kt
│ │ └── wordle
│ │ │ └── WordleRepository.kt
│ │ └── use_case
│ │ └── question
│ │ ├── GetRandomMultiChoiceQuestionUseCase.kt
│ │ └── IsQuestionSavedUseCase.kt
│ └── test
│ └── kotlin
│ └── com
│ └── infinitepower
│ └── newquiz
│ └── domain
│ └── use_case
│ └── question
│ └── IsQuestionSavedUseCaseTest.kt
├── feature
├── daily-challenge
│ ├── .gitignore
│ ├── README.md
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── feature
│ │ └── daily_challenge
│ │ ├── DailyChallengeScreen.kt
│ │ ├── DailyChallengeScreenNavigator.kt
│ │ ├── DailyChallengeScreenUiEvent.kt
│ │ ├── DailyChallengeScreenUiState.kt
│ │ ├── DailyChallengeScreenViewModel.kt
│ │ └── components
│ │ └── DailyChallengeCard.kt
├── maze
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── infinitepower
│ │ │ └── newquiz
│ │ │ └── feature
│ │ │ └── maze
│ │ │ ├── MazeScreen.kt
│ │ │ ├── MazeScreenUiEvent.kt
│ │ │ ├── MazeScreenUiState.kt
│ │ │ ├── MazeScreenViewModel.kt
│ │ │ ├── categories_info
│ │ │ ├── MazeCategoriesInfoScreen.kt
│ │ │ ├── MazeCategoriesInfoUiState.kt
│ │ │ └── MazeCategoriesInfoViewModel.kt
│ │ │ ├── common
│ │ │ └── MazeCategories.kt
│ │ │ ├── components
│ │ │ ├── CategoriesInfoBottomSheet.kt
│ │ │ ├── InvalidCategoriesCard.kt
│ │ │ ├── MazeCompletedCard.kt
│ │ │ ├── MazeItemButton.kt
│ │ │ ├── MazePath.kt
│ │ │ └── ScrollToCurrentQuestionButton.kt
│ │ │ ├── generate
│ │ │ ├── GenerateMazeScreen.kt
│ │ │ ├── GenerateMazeScreenUiEvent.kt
│ │ │ ├── GenerateMazeScreenUiState.kt
│ │ │ └── GenerateMazeScreenViewModel.kt
│ │ │ └── level_results
│ │ │ ├── LevelResultsScreen.kt
│ │ │ ├── LevelResultsScreenUiState.kt
│ │ │ ├── LevelResultsScreenViewModel.kt
│ │ │ └── components
│ │ │ ├── LevelCompletedContent.kt
│ │ │ └── LevelFailedContent.kt
│ │ └── test
│ │ └── kotlin
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── feature
│ │ └── maze
│ │ └── MazeScreenUiStateTest.kt
├── profile
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── kotlin
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── feature
│ │ └── profile
│ │ ├── ProfileScreen.kt
│ │ ├── ProfileScreenUiEvent.kt
│ │ ├── ProfileScreenUiState.kt
│ │ ├── ProfileViewModel.kt
│ │ └── components
│ │ ├── GoodDayText.kt
│ │ ├── MainUserCard.kt
│ │ ├── UserXpAndLevelCard.kt
│ │ ├── XpEarnedByDayCard.kt
│ │ └── chart
│ │ └── Marker.kt
└── settings
│ ├── .gitignore
│ ├── README.md
│ ├── build.gradle.kts
│ └── src
│ ├── foss
│ └── kotlin
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── feature
│ │ └── settings
│ │ ├── common
│ │ └── BuildVariant.kt
│ │ └── screens
│ │ └── PreferencesScreen.kt
│ ├── main
│ ├── AndroidManifest.xml
│ └── kotlin
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── feature
│ │ └── settings
│ │ ├── SettingsScreen.kt
│ │ ├── components
│ │ ├── AboutAndHelpButtons.kt
│ │ └── preferences
│ │ │ ├── PreferenceGroupHeader.kt
│ │ │ ├── PreferenceItem.kt
│ │ │ └── widgets
│ │ │ ├── CustomPreferenceWidget.kt
│ │ │ ├── DropDownPreferenceWidget.kt
│ │ │ ├── ListPreferenceWidget.kt
│ │ │ ├── MultiSelectListPreferenceWidget.kt
│ │ │ ├── NavigationButtonWidget.kt
│ │ │ ├── SeekBarPreferenceWidget.kt
│ │ │ ├── SwitchPreferenceWidget.kt
│ │ │ └── TextPreferenceWidget.kt
│ │ ├── model
│ │ ├── Preference.kt
│ │ └── ScreenKey.kt
│ │ ├── screens
│ │ ├── PreferenceScreen.kt
│ │ ├── about_and_help
│ │ │ └── AboutAndHelpScreen.kt
│ │ ├── animations
│ │ │ └── AnimationsScreen.kt
│ │ ├── general
│ │ │ ├── GeneralScreen.kt
│ │ │ ├── GeneralScreenUiEvent.kt
│ │ │ ├── GeneralScreenUiState.kt
│ │ │ └── GeneralScreenViewModel.kt
│ │ ├── main
│ │ │ └── MainScreen.kt
│ │ ├── multi_choice_quiz
│ │ │ └── MultiChoiceQuizScreen.kt
│ │ └── wordle
│ │ │ └── WordleScreen.kt
│ │ └── util
│ │ ├── ShowCategoryConnectionInfoUtils.kt
│ │ └── datastore
│ │ └── DatastoreUtils.kt
│ └── normal
│ └── kotlin
│ └── com
│ └── infinitepower
│ └── newquiz
│ └── feature
│ └── settings
│ ├── common
│ └── BuildVariant.kt
│ └── screens
│ ├── PreferencesScreen.kt
│ ├── analytics
│ └── AnimationsScreen.kt
│ └── translation
│ ├── TranslationScreen.kt
│ ├── TranslationScreenUiEvent.kt
│ ├── TranslationScreenUiState.kt
│ └── TranslationScreenViewModel.kt
├── gradle.properties
├── gradle
├── libs.versions.toml
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── lint.xml
├── model
├── .gitignore
├── build.gradle.kts
└── src
│ ├── main
│ └── java
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── model
│ │ ├── BaseCategory.kt
│ │ ├── DataAnalyticsConsentState.kt
│ │ ├── GameMode.kt
│ │ ├── GameModeCategory.kt
│ │ ├── Language.kt
│ │ ├── NumberFormatType.kt
│ │ ├── RemainingTime.kt
│ │ ├── Resource.kt
│ │ ├── TimestampWithValue.kt
│ │ ├── UiText.kt
│ │ ├── XP.kt
│ │ ├── category
│ │ └── ShowCategoryConnectionInfo.kt
│ │ ├── comparison_quiz
│ │ ├── ComparisonMode.kt
│ │ ├── ComparisonQuizCategory.kt
│ │ ├── ComparisonQuizCategoryEntity.kt
│ │ ├── ComparisonQuizHelperValueState.kt
│ │ ├── ComparisonQuizItem.kt
│ │ ├── ComparisonQuizItemEntity.kt
│ │ └── ComparisonQuizQuestion.kt
│ │ ├── country
│ │ ├── Continent.kt
│ │ └── Country.kt
│ │ ├── daily_challenge
│ │ └── DailyChallengeTask.kt
│ │ ├── global_event
│ │ └── GameEvent.kt
│ │ ├── math_quiz
│ │ └── MathFormula.kt
│ │ ├── maze
│ │ ├── MazePoint.kt
│ │ └── MazeQuiz.kt
│ │ ├── multi_choice_quiz
│ │ ├── MultiChoiceBaseCategory.kt
│ │ ├── MultiChoiceCategory.kt
│ │ ├── MultiChoiceQuestion.kt
│ │ ├── MultiChoiceQuestionStep.kt
│ │ ├── MultiChoiceQuestionType.kt
│ │ ├── QuestionLanguage.kt
│ │ ├── SelectedAnswer.kt
│ │ ├── logo_quiz
│ │ │ └── LogoQuizBaseItem.kt
│ │ └── saved
│ │ │ └── SortSavedQuestionsBy.kt
│ │ ├── number
│ │ ├── NumberTriviaQuestion.kt
│ │ └── NumberTriviaQuestionsEntity.kt
│ │ ├── question
│ │ └── QuestionDifficulty.kt
│ │ ├── regional_preferences
│ │ ├── DistanceUnitType.kt
│ │ ├── RegionalPreferences.kt
│ │ └── TemperatureUnit.kt
│ │ ├── util
│ │ ├── base64
│ │ │ ├── Base64.kt
│ │ │ ├── Base64Encoding.kt
│ │ │ └── Base64Url.kt
│ │ └── serializers
│ │ │ └── URISerializer.kt
│ │ └── wordle
│ │ ├── WordleCategory.kt
│ │ ├── WordleItem.kt
│ │ ├── WordleQuizType.kt
│ │ ├── WordleRowItem.kt
│ │ └── WordleWord.kt
│ └── test
│ └── java
│ └── com
│ └── infinitepower
│ └── newquiz
│ └── model
│ ├── RemainingTimeTest.kt
│ ├── category
│ └── ShowCategoryConnectionInfoTest.kt
│ ├── comparison_quiz
│ ├── ComparisonQuizCategoryTest.kt
│ └── ComparisonQuizQuestionTest.kt
│ ├── daily_challenge
│ ├── DailyChallengeTaskTest.kt
│ └── DailyChallengeTaskTypeTest.kt
│ ├── math_quiz
│ └── maze
│ │ ├── MazePointTest.kt
│ │ └── MazeQuizTest.kt
│ ├── multi_choice_quiz
│ └── MultiChoiceQuestionTest.kt
│ ├── util
│ └── base64
│ │ ├── Base64Test.kt
│ │ └── Base64UrlTest.kt
│ └── wordle
│ ├── WordleItemTest.kt
│ └── WordleRowItemTest.kt
├── multi-choice-quiz
├── .gitignore
├── README.md
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── multi_choice_quiz
│ │ ├── MultiChoiceQuizScreenTest.kt
│ │ └── components
│ │ ├── CardQuestionOptionTest.kt
│ │ ├── QuizStepViewRowTest.kt
│ │ └── QuizStepViewTest.kt
│ └── main
│ ├── AndroidManifest.xml
│ ├── java
│ └── com
│ │ └── infinitepower
│ │ └── newquiz
│ │ └── multi_choice_quiz
│ │ ├── MultiChoiceQuizScreen.kt
│ │ ├── MultiChoiceQuizScreenUiEvent.kt
│ │ ├── MultiChoiceQuizScreenUiState.kt
│ │ ├── MultiChoiceQuizScreenViewModel.kt
│ │ ├── components
│ │ ├── CardQuestionAnswer.kt
│ │ ├── MultiChoiceQuizContainer.kt
│ │ ├── QuizStepView.kt
│ │ ├── QuizTopBar.kt
│ │ └── difficulty
│ │ │ ├── BaseCardDifficultyContent.kt
│ │ │ ├── FilledCardDifficulty.kt
│ │ │ ├── OutlinedCardDifficulty.kt
│ │ │ └── SelectableDifficultyRow.kt
│ │ ├── list
│ │ ├── MultiChoiceQuizListScreen.kt
│ │ ├── MultiChoiceQuizListScreenUiState.kt
│ │ └── MultiChoiceQuizListScreenViewModel.kt
│ │ ├── results
│ │ └── MultiChoiceQuizResultsScreen.kt
│ │ └── saved_questions
│ │ ├── SavedMultiChoiceQuestionsScreen.kt
│ │ ├── SavedMultiChoiceQuestionsScreenNavigator.kt
│ │ ├── SavedMultiChoiceQuestionsUiEvent.kt
│ │ ├── SavedMultiChoiceQuestionsUiState.kt
│ │ ├── SavedMultiChoiceQuestionsViewModel.kt
│ │ └── components
│ │ └── SavedQuestionItem.kt
│ └── res
│ └── values
│ └── strings.xml
├── pictures
├── NewQuiz-Promotion-green-night.png
├── NewQuiz-Promotion-purple-light.png
├── comparison_quiz.jpg
├── multichoicequiz.jpg
└── wordle.jpg
├── settings.gradle.kts
└── wordle
├── .gitignore
├── README.md
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
├── androidTest
└── java
│ └── com
│ └── infinitepower
│ └── newquiz
│ └── wordle
│ ├── WordleScreenTest.kt
│ └── components
│ ├── WordleKeyBoardTest.kt
│ └── WordleRowComponentTest.kt
├── main
├── AndroidManifest.xml
└── java
│ └── com
│ └── infinitepower
│ └── newquiz
│ └── wordle
│ ├── WordleScreen.kt
│ ├── WordleScreenUiEvent.kt
│ ├── WordleScreenUiState.kt
│ ├── WordleScreenViewModel.kt
│ ├── components
│ ├── InfoDialog.kt
│ ├── WordleKeyBoard.kt
│ └── WordleRowComponent.kt
│ ├── list
│ ├── WordleListScreen.kt
│ ├── WordleListScreenViewModel.kt
│ └── WordleListUiState.kt
│ └── util
│ ├── InvalidWordErrorUiText.kt
│ ├── word
│ └── WordUtil.kt
│ └── worker
│ └── WordleEndGameWorker.kt
└── test
└── java
└── com
└── infinitepower
└── newquiz
└── wordle
└── util
└── word
└── WordUtilTest.kt
/.github/actions/get-avd-info/action.yml:
--------------------------------------------------------------------------------
1 | # From: coil-kt/coil
2 | name: 'Get AVD Info'
3 | description: 'Get the AVD info based on its API level.'
4 | inputs:
5 | api-level:
6 | required: true
7 | outputs:
8 | arch:
9 | value: ${{ steps.get-avd-arch.outputs.arch }}
10 | target:
11 | value: ${{ steps.get-avd-target.outputs.target }}
12 | runs:
13 | using: "composite"
14 | steps:
15 | - id: get-avd-arch
16 | run: echo "::set-output name=arch::$(if [ ${{ inputs.api-level }} -ge 30 ]; then echo x86_64; else echo x86; fi)"
17 | shell: bash
18 | - id: get-avd-target
19 | run: echo "::set-output name=target::$(echo default)"
20 | shell: bash
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .gradle
2 | /local.properties
3 | .DS_Store
4 | /build
5 | /captures
6 | .externalNativeBuild
7 | .cxx
8 | local.properties
9 |
10 | /app/build
11 | /app/release
12 |
13 | /buildSrc/build
14 |
15 | # built application files
16 | *.apk
17 | *.ap_
18 |
19 | # files for the dex VM
20 | *.dex
21 |
22 | # Java class files
23 | *.class
24 |
25 | # generated files
26 | bin/
27 | gen/
28 | out/
29 |
30 | # Eclipse project files
31 | .classpath
32 | .project
33 |
34 | # IDEA/Android Studio project files, because
35 | # the project can be imported from settings.gradle.kts
36 | *.iml
37 | .idea/*
38 | !.idea/copyright
39 | # Keep the code styles.
40 | !/.idea/codeStyles
41 | /.idea/codeStyles/*
42 | !/.idea/codeStyles/Project.xml
43 | !/.idea/codeStyles/codeStyleConfig.xml
44 | !.idea/runConfigurations/
45 |
46 | .kotlin
47 |
--------------------------------------------------------------------------------
/.idea/.name:
--------------------------------------------------------------------------------
1 | NewQuiz
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 | google-services.json
3 |
4 | *.apk
5 | *.aab
6 | *.dm
7 | output-metadata.json
--------------------------------------------------------------------------------
/app/lint-baseline.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/ic_launcher-playstore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/app/src/main/ic_launcher-playstore.png
--------------------------------------------------------------------------------
/app/src/main/java/com/infinitepower/newquiz/NewQuizApp.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz
2 |
3 | import android.app.Application
4 | import dagger.hilt.android.HiltAndroidApp
5 |
6 | @HiltAndroidApp
7 | class NewQuizApp : Application()
8 |
--------------------------------------------------------------------------------
/app/src/main/java/com/infinitepower/newquiz/ui/main/MainScreenUiEvent.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.ui.main
2 |
3 | import androidx.annotation.Keep
4 |
5 | sealed interface MainScreenUiEvent {
6 | @Keep
7 | data class OnDataAnalyticsConsentClick(
8 | val agreed: Boolean
9 | ) : MainScreenUiEvent
10 | }
11 |
--------------------------------------------------------------------------------
/app/src/main/java/com/infinitepower/newquiz/ui/main/MainScreenUiState.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.ui.main
2 |
3 | import androidx.annotation.Keep
4 | import com.infinitepower.newquiz.core.theme.AnimationsEnabled
5 |
6 | /**
7 | * Represents the state of the main screen.
8 | *
9 | * @param loading True if the main screen state is loading. The splash screen will be shown until this is false.
10 | */
11 | @Keep
12 | data class MainScreenUiState(
13 | val loading: Boolean = true,
14 | val showDataAnalyticsConsentDialog: Boolean = false,
15 | val dailyChallengeClaimableCount: Int = 0,
16 | val animationsEnabled: AnimationsEnabled = AnimationsEnabled(),
17 | val userDiamonds: UInt = 0u
18 | )
19 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/round_play_circle_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/resources.properties:
--------------------------------------------------------------------------------
1 | unqualifiedResLocale=en
--------------------------------------------------------------------------------
/app/src/main/res/values-night/splash_screen.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FF000000
4 | #FFFFFFFF
5 |
--------------------------------------------------------------------------------
/app/src/main/res/values/leak_canary.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/app/src/main/res/values/splash_screen.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | NewQuiz
3 |
--------------------------------------------------------------------------------
/build-logic/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/caches
5 | /.idea/libraries
6 | /.idea/modules.xml
7 | /.idea/workspace.xml
8 | /.idea/navEditor.xml
9 | /.idea/assetWizardSettings.xml
10 | .DS_Store
11 | /build
12 | /convention/build
13 | /captures
14 | .externalNativeBuild
15 | .cxx
16 | local.properties
17 |
--------------------------------------------------------------------------------
/build-logic/README.md:
--------------------------------------------------------------------------------
1 | # Build logic
2 |
3 | The build-logic folder defines project-specific convention plugins, used to keep a single source of truth for common module configurations.
4 |
5 | Based in the [Now in Android](https://github.com/android/nowinandroid) project.
--------------------------------------------------------------------------------
/build-logic/convention/src/main/kotlin/AndroidApplicationComposeConventionPlugin.kt:
--------------------------------------------------------------------------------
1 | import com.android.build.api.dsl.ApplicationExtension
2 | import com.infinitepower.newquiz.configureAndroidCompose
3 | import org.gradle.api.Plugin
4 | import org.gradle.api.Project
5 | import org.gradle.kotlin.dsl.getByType
6 |
7 | class AndroidApplicationComposeConventionPlugin : Plugin {
8 | override fun apply(target: Project) {
9 | with(target) {
10 | pluginManager.apply("com.android.application")
11 |
12 | val extension = extensions.getByType()
13 | configureAndroidCompose(extension)
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/build-logic/convention/src/main/kotlin/AndroidLibraryComposeConventionPlugin.kt:
--------------------------------------------------------------------------------
1 | import com.android.build.api.dsl.LibraryExtension
2 | import com.infinitepower.newquiz.configureAndroidCompose
3 | import org.gradle.api.Plugin
4 | import org.gradle.api.Project
5 | import org.gradle.kotlin.dsl.configure
6 |
7 | class AndroidLibraryComposeConventionPlugin : Plugin {
8 | override fun apply(target: Project) {
9 | with(target) {
10 | with(pluginManager) {
11 | apply("newquiz.android.library")
12 | }
13 |
14 | extensions.configure {
15 | configureAndroidCompose(this)
16 | }
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/build-logic/convention/src/main/kotlin/KotlinSerializationConventionPlugin.kt:
--------------------------------------------------------------------------------
1 | import com.infinitepower.newquiz.implementation
2 | import com.infinitepower.newquiz.libs
3 | import org.gradle.api.Plugin
4 | import org.gradle.api.Project
5 | import org.gradle.kotlin.dsl.dependencies
6 |
7 | class KotlinSerializationConventionPlugin : Plugin {
8 | override fun apply(target: Project) {
9 | with(target) {
10 | plugins.apply("kotlinx-serialization")
11 |
12 | dependencies {
13 | implementation(libs.findLibrary("kotlinx.serialization.json").get())
14 | }
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/build-logic/convention/src/main/kotlin/com/infinitepower/newquiz/AndroidInstrumentedTests.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz
2 |
3 | import com.android.build.api.variant.LibraryAndroidComponentsExtension
4 | import org.gradle.api.Project
5 |
6 | /**
7 | * Disable android tests if there is no androidTest folder.
8 | */
9 | internal fun LibraryAndroidComponentsExtension.disableUnnecessaryAndroidTests(
10 | project: Project,
11 | ) = beforeVariants {
12 | it.enableAndroidTest = it.enableAndroidTest
13 | && project.projectDir.resolve("src/androidTest").exists()
14 | }
15 |
--------------------------------------------------------------------------------
/build-logic/convention/src/main/kotlin/com/infinitepower/newquiz/ProjectConfig.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz
2 |
3 | import org.gradle.api.JavaVersion
4 |
5 | object ProjectConfig {
6 | const val compileSdk = 35
7 |
8 | const val minSdk = 21
9 |
10 | const val targetSdk = 35
11 |
12 | val javaVersionCompatibility = JavaVersion.VERSION_17
13 |
14 | const val jvmTargetVersion = "17"
15 |
16 | const val jvmToolchainVersion = 17
17 | }
18 |
--------------------------------------------------------------------------------
/build-logic/convention/src/main/kotlin/com/infinitepower/newquiz/ProjectExtensions.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz
2 |
3 | import org.gradle.api.Project
4 | import org.gradle.api.artifacts.VersionCatalog
5 | import org.gradle.api.artifacts.VersionCatalogsExtension
6 | import org.gradle.kotlin.dsl.getByType
7 |
8 | val Project.libs
9 | get(): VersionCatalog = extensions.getByType().named("libs")
10 |
--------------------------------------------------------------------------------
/build-logic/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.parallel=true
2 | org.gradle.caching=true
3 | org.gradle.configureondemand=true
4 |
--------------------------------------------------------------------------------
/build-logic/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | dependencyResolutionManagement {
2 | repositories {
3 | google()
4 | mavenCentral()
5 | }
6 |
7 | versionCatalogs {
8 | create("libs") {
9 | from(files("../gradle/libs.versions.toml"))
10 | }
11 | }
12 | }
13 |
14 | rootProject.name = "build-logic"
15 | include(":convention")
16 |
--------------------------------------------------------------------------------
/comparison-quiz/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/comparison-quiz/README.md:
--------------------------------------------------------------------------------
1 | # Comparison quiz
2 |
3 | This is the code for the comparison game mode.
4 |
5 | 
--------------------------------------------------------------------------------
/comparison-quiz/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/comparison-quiz/consumer-rules.pro
--------------------------------------------------------------------------------
/comparison-quiz/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Temporary fix
2 | -dontwarn java.lang.invoke.StringConcatFactory
--------------------------------------------------------------------------------
/comparison-quiz/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/comparison-quiz/src/main/java/com/infinitepower/newquiz/comparison_quiz/di/ComparisonQuizModule.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.comparison_quiz.di
2 |
3 | import com.infinitepower.newquiz.comparison_quiz.core.ComparisonQuizCoreImpl
4 | import com.infinitepower.newquiz.core.game.ComparisonQuizCore
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.android.components.ViewModelComponent
9 |
10 | @Module
11 | @InstallIn(ViewModelComponent::class)
12 | abstract class ComparisonQuizModule {
13 | @Binds
14 | abstract fun bindComparisonQuizCore(impl: ComparisonQuizCoreImpl): ComparisonQuizCore
15 | }
16 |
--------------------------------------------------------------------------------
/comparison-quiz/src/main/java/com/infinitepower/newquiz/comparison_quiz/list/ComparisonQuizListScreenUiEvent.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.comparison_quiz.list
2 |
3 | import androidx.annotation.Keep
4 | import com.infinitepower.newquiz.model.comparison_quiz.ComparisonMode
5 |
6 | interface ComparisonQuizListScreenUiEvent {
7 | @Keep
8 | data class SelectMode(
9 | val mode: ComparisonMode
10 | ) : ComparisonQuizListScreenUiEvent
11 | }
12 |
--------------------------------------------------------------------------------
/comparison-quiz/src/main/java/com/infinitepower/newquiz/comparison_quiz/ui/ComparisonQuizUiEvent.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.comparison_quiz.ui
2 |
3 | import androidx.annotation.Keep
4 | import com.infinitepower.newquiz.model.comparison_quiz.ComparisonQuizItem
5 |
6 | interface ComparisonQuizUiEvent {
7 | @Keep
8 | data class OnAnswerClick(
9 | val item: ComparisonQuizItem
10 | ) : ComparisonQuizUiEvent
11 |
12 | object ShowSkipQuestionDialog : ComparisonQuizUiEvent
13 |
14 | object DismissSkipQuestionDialog : ComparisonQuizUiEvent
15 |
16 | object SkipQuestion : ComparisonQuizUiEvent
17 | }
18 |
--------------------------------------------------------------------------------
/compose_compiler_config.conf:
--------------------------------------------------------------------------------
1 | // Consider LocalDateTime stable
2 | java.time.LocalDateTime
3 | // Consider my datalayer and all submodules stable
4 | com.infinitepower.newquiz.model.**
5 | com.infinitepower.newquiz.domain.repository.home.HomeCategories<*>
--------------------------------------------------------------------------------
/core/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/analytics/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/analytics/README.md:
--------------------------------------------------------------------------------
1 | # Analytics Module (:core:analytics)
2 |
3 | The Analytics module provides a way to track user interactions with the application.
4 |
5 | ## Normal Flavor
6 |
7 | The normal flavor of the Analytics module uses the [Firebase Analytics](https://firebase.google.com/docs/analytics) service to track user interactions.
8 |
9 | ## FOSS Flavor
10 |
11 | The FOSS flavor of the Analytics module don't track any user interaction to the any third party services. Only logs the user interactions to the console.
12 |
--------------------------------------------------------------------------------
/core/analytics/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.newquiz.android.library.compose)
3 | alias(libs.plugins.newquiz.android.hilt)
4 | alias(libs.plugins.newquiz.detekt)
5 | }
6 |
7 | android {
8 | namespace = "com.infinitepower.newquiz.core.analytics"
9 | }
10 |
11 | dependencies {
12 | implementation(libs.androidx.compose.runtime)
13 |
14 | normalImplementation(platform(libs.firebase.bom))
15 | normalImplementation(libs.firebase.analytics)
16 | normalImplementation(libs.firebase.crashlytics)
17 | normalImplementation(libs.firebase.perf)
18 |
19 | implementation(projects.model)
20 | normalImplementation(projects.core.datastore)
21 | }
22 |
--------------------------------------------------------------------------------
/core/analytics/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/analytics/consumer-rules.pro
--------------------------------------------------------------------------------
/core/analytics/src/foss/kotlin/com/infinitepower/newquiz/core/analytics/FossAnalyticsModule.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.analytics
2 |
3 | import dagger.Binds
4 | import dagger.Module
5 | import dagger.hilt.InstallIn
6 | import dagger.hilt.components.SingletonComponent
7 |
8 | @Module
9 | @InstallIn(SingletonComponent::class)
10 | abstract class FossAnalyticsModule {
11 | @Binds
12 | abstract fun bindAnalyticsHelper(impl: LocalDebugAnalyticsHelper): AnalyticsHelper
13 | }
--------------------------------------------------------------------------------
/core/analytics/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/core/analytics/src/main/kotlin/com/infinitepower/newquiz/core/analytics/UiHelpers.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.analytics
2 |
3 | import androidx.compose.runtime.staticCompositionLocalOf
4 |
5 | /**
6 | * A local composition that provides an [AnalyticsHelper] instance.
7 | */
8 | val LocalAnalyticsHelper = staticCompositionLocalOf {
9 | LocalDebugAnalyticsHelper()
10 | }
11 |
--------------------------------------------------------------------------------
/core/analytics/src/main/kotlin/com/infinitepower/newquiz/core/analytics/UserProperty.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.analytics
2 |
3 | import androidx.annotation.Size
4 |
5 | sealed class UserProperty(
6 | @Size(min = 1L, max = 24L) val name: String,
7 | @Size(max = 36L) val value: String?
8 | ) {
9 | data class WordleLanguage(val lang: String) : UserProperty(
10 | name = "wordle_lang",
11 | value = lang
12 | )
13 |
14 | data class TranslatorModelDownloaded(val downloaded: Boolean) : UserProperty(
15 | name = "translator_downloaded",
16 | value = downloaded.toString()
17 | )
18 | }
19 |
--------------------------------------------------------------------------------
/core/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/consumer-rules.pro
--------------------------------------------------------------------------------
/core/database/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/database/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.newquiz.android.library)
3 | alias(libs.plugins.newquiz.android.room)
4 | alias(libs.plugins.newquiz.android.hilt)
5 | alias(libs.plugins.newquiz.kotlin.serialization)
6 | alias(libs.plugins.newquiz.detekt)
7 | }
8 |
9 | android {
10 | namespace = "com.infinitepower.newquiz.core.database"
11 | }
12 |
13 | dependencies {
14 | implementation(libs.kotlinx.datetime)
15 |
16 | implementation(projects.model)
17 |
18 | androidTestImplementation(projects.core.testing)
19 | }
20 |
--------------------------------------------------------------------------------
/core/database/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/database/consumer-rules.pro
--------------------------------------------------------------------------------
/core/database/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
--------------------------------------------------------------------------------
/core/database/src/androidTest/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
9 |
10 |
--------------------------------------------------------------------------------
/core/database/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/core/database/src/main/kotlin/com/infinitepower/newquiz/core/database/model/DailyChallengeTaskEntity.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.database.model
2 |
3 | import androidx.annotation.Keep
4 | import androidx.room.Entity
5 | import androidx.room.PrimaryKey
6 |
7 | @Keep
8 | @Entity(tableName = "daily_challenge_tasks")
9 | data class DailyChallengeTaskEntity(
10 | @PrimaryKey(autoGenerate = true) val id: Int = 0,
11 | val diamondsReward: Int,
12 | val experienceReward: Int,
13 | val isClaimed: Boolean,
14 | val currentValue: Int,
15 | val maxValue: Int,
16 | val type: String,
17 | val startDate: Long,
18 | val endDate: Long
19 | )
20 |
--------------------------------------------------------------------------------
/core/database/src/main/kotlin/com/infinitepower/newquiz/core/database/model/user/BaseGameResultEntity.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.database.model.user
2 |
3 | interface BaseGameResultEntity {
4 | val gameId: Int
5 | val earnedXp: Int
6 | val playedAt: Long
7 | }
8 |
--------------------------------------------------------------------------------
/core/database/src/main/kotlin/com/infinitepower/newquiz/core/database/util/converters/ListConverter.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.database.util.converters
2 |
3 | import androidx.room.TypeConverter
4 | import kotlinx.serialization.encodeToString
5 | import kotlinx.serialization.json.Json
6 |
7 | class ListConverter {
8 | @TypeConverter
9 | fun stringListToJson(value: List): String = Json.encodeToString(value)
10 |
11 | @TypeConverter
12 | fun jsonToStringList(value: String): List = Json.decodeFromString(value)
13 | }
14 |
--------------------------------------------------------------------------------
/core/database/src/main/kotlin/com/infinitepower/newquiz/core/database/util/converters/LocalDateConverter.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.database.util.converters
2 |
3 | import androidx.room.TypeConverter
4 | import kotlinx.datetime.LocalDate
5 |
6 | class LocalDateConverter {
7 | @TypeConverter
8 | fun localDateToJson(value: LocalDate): String = value.toString()
9 |
10 | @TypeConverter
11 | fun stringToLocalDate(value: String): LocalDate = LocalDate.parse(value)
12 | }
13 |
--------------------------------------------------------------------------------
/core/database/src/main/kotlin/com/infinitepower/newquiz/core/database/util/converters/MathFormulaConverter.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.database.util.converters
2 |
3 | import androidx.room.TypeConverter
4 | import com.infinitepower.newquiz.model.math_quiz.MathFormula
5 |
6 | class MathFormulaConverter {
7 | @TypeConverter
8 | fun mathFormulaToJson(value: MathFormula): String = value.fullFormula
9 |
10 | @TypeConverter
11 | fun stringToMathFormula(value: String): MathFormula = MathFormula.fromStringFullFormula(value)
12 | }
13 |
--------------------------------------------------------------------------------
/core/database/src/main/kotlin/com/infinitepower/newquiz/core/database/util/converters/QuestionDifficultyConverter.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.database.util.converters
2 |
3 | import androidx.room.TypeConverter
4 | import com.infinitepower.newquiz.model.question.QuestionDifficulty
5 |
6 | class QuestionDifficultyConverter {
7 | @TypeConverter
8 | fun localDateToJson(value: QuestionDifficulty): String = value.id
9 |
10 | @TypeConverter
11 | fun stringToLocalDate(value: String): QuestionDifficulty = QuestionDifficulty.from(value)
12 | }
13 |
--------------------------------------------------------------------------------
/core/datastore/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/datastore/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.newquiz.android.library)
3 | alias(libs.plugins.newquiz.android.hilt)
4 | alias(libs.plugins.newquiz.detekt)
5 | }
6 |
7 | android {
8 | namespace = "com.infinitepower.newquiz.core.datastore"
9 | }
10 |
11 | dependencies {
12 | api(libs.androidx.dataStore.preferences)
13 |
14 | implementation(projects.model)
15 | implementation(projects.core)
16 | }
17 |
--------------------------------------------------------------------------------
/core/datastore/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/datastore/consumer-rules.pro
--------------------------------------------------------------------------------
/core/datastore/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/core/datastore/src/main/kotlin/com/infinitepower/newquiz/core/datastore/PreferenceRequest.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.datastore
2 |
3 | import androidx.datastore.preferences.core.Preferences
4 |
5 | open class PreferenceRequest(
6 | val key: Preferences.Key,
7 | val defaultValue: T
8 | )
9 |
--------------------------------------------------------------------------------
/core/datastore/src/main/kotlin/com/infinitepower/newquiz/core/datastore/manager/DataStoreManager.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.datastore.manager
2 |
3 | import androidx.datastore.preferences.core.Preferences
4 | import com.infinitepower.newquiz.core.datastore.PreferenceRequest
5 | import kotlinx.coroutines.flow.Flow
6 |
7 | interface DataStoreManager {
8 | val preferenceFlow: Flow
9 |
10 | suspend fun getPreference(preferenceEntry: PreferenceRequest): T
11 |
12 | fun getPreferenceFlow(request: PreferenceRequest): Flow
13 |
14 | suspend fun editPreference(key: Preferences.Key, newValue: T)
15 |
16 | suspend fun editPreferences(vararg prefs: Preferences.Pair<*>)
17 |
18 | suspend fun clearPreferences()
19 | }
20 |
--------------------------------------------------------------------------------
/core/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
--------------------------------------------------------------------------------
/core/remote-config/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/remote-config/README.md:
--------------------------------------------------------------------------------
1 | # Remote Config Module (:core:remote_config)
2 |
--------------------------------------------------------------------------------
/core/remote-config/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.newquiz.android.library)
3 | alias(libs.plugins.newquiz.android.hilt)
4 | alias(libs.plugins.newquiz.kotlin.serialization)
5 | alias(libs.plugins.newquiz.detekt)
6 | }
7 |
8 | android {
9 | namespace = "com.infinitepower.newquiz.core.remote_config"
10 | }
11 |
12 | dependencies {
13 | implementation(libs.androidx.startup.runtime)
14 |
15 | normalImplementation(platform(libs.firebase.bom))
16 | normalImplementation(libs.firebase.remoteConfig)
17 |
18 | implementation(projects.model)
19 | normalImplementation(projects.core)
20 | }
21 |
--------------------------------------------------------------------------------
/core/remote-config/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
11 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/core/src/androidTest/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
9 |
10 |
--------------------------------------------------------------------------------
/core/src/androidTest/assets/buttons/back_button.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/androidTest/assets/buttons/back_button.png
--------------------------------------------------------------------------------
/core/src/androidTest/assets/buttons/back_button2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/androidTest/assets/buttons/back_button2.png
--------------------------------------------------------------------------------
/core/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/common/BaseApiUrls.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.common
2 |
3 | object BaseApiUrls {
4 | const val NEWQUIZ = "https://newquiz-app.vercel.app"
5 | }
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/common/Common.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.common
2 |
3 | const val DEFAULT_USER_PHOTO = "https://firebasestorage.googleapis.com/v0/b/newsocial-app.appspot.com/o/Default%2Fuser_default_image.png?alt=media&token=69389847-7158-42aa-aab5-fc6a5499d3c7"
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/common/compose/preview/BooleanPreviewParameterProvider.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.common.compose.preview
2 |
3 | import androidx.compose.ui.tooling.preview.PreviewParameterProvider
4 |
5 | class BooleanPreviewParameterProvider : PreviewParameterProvider {
6 | override val values: Sequence
7 | get() = sequenceOf(true, false)
8 | }
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/common/database/DatabaseCommon.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.common.database
2 |
3 | object DatabaseCommon {
4 | object UserCollection {
5 | const val NAME = "users"
6 |
7 | const val FIELD_DIAMONDS = "data.diamonds"
8 | const val FIELD_TOTAL_XP = "data.totalXp"
9 | const val FIELD_LAST_QUIZ_TIMES = "data.multiChoiceQuizData.lastQuizTimes"
10 | const val FIELD_TOTAL_QUESTIONS_PLAYED = "data.multiChoiceQuizData.totalQuestionsPlayed"
11 | const val FIELD_CORRECT_ANSWERS = "data.multiChoiceQuizData.totalCorrectAnswers"
12 |
13 | const val FIELD_WORDLE_WORDS_PLAYED = "data.wordleData.wordsPlayed"
14 | const val FIELD_WORDLE_WORDS_CORRECT = "data.wordleData.wordsCorrect"
15 | }
16 | }
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/compose/preferences/LocalPreferenceEnabledStatus.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.compose.preferences
2 |
3 | import androidx.compose.runtime.ProvidableCompositionLocal
4 | import androidx.compose.runtime.compositionLocalOf
5 | import androidx.compose.runtime.structuralEqualityPolicy
6 |
7 | val LocalPreferenceEnabledStatus: ProvidableCompositionLocal =
8 | compositionLocalOf(structuralEqualityPolicy()) { true }
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/di/KtorModule.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.di
2 |
3 | import dagger.Module
4 | import dagger.Provides
5 | import dagger.hilt.InstallIn
6 | import dagger.hilt.components.SingletonComponent
7 | import io.ktor.client.HttpClient
8 | import io.ktor.client.engine.okhttp.OkHttp
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | object KtorModule {
14 | @Provides
15 | @Singleton
16 | fun providerKtorClient(): HttpClient = HttpClient(OkHttp)
17 | }
18 |
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/di/NetworkStatusModule.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.di
2 |
3 | import com.infinitepower.newquiz.core.network.NetworkStatusTracker
4 | import com.infinitepower.newquiz.core.network.NetworkStatusTrackerImpl
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 |
10 | @Module
11 | @InstallIn(SingletonComponent::class)
12 | abstract class NetworkStatusModule {
13 | @Binds
14 | abstract fun bindNetworkStatusTracker(
15 | networkStatusTrackerImpl: NetworkStatusTrackerImpl
16 | ): NetworkStatusTracker
17 | }
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/game/SkipGame.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.game
2 |
3 | interface SkipGame {
4 | val skipCost: UInt
5 |
6 | suspend fun getUserDiamonds(): UInt
7 |
8 | suspend fun skip()
9 | }
10 |
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/math/evaluator/internal/Function.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.math.evaluator.internal
2 |
3 | import java.math.BigDecimal
4 |
5 | abstract class Function {
6 | abstract fun call(arguments: List): BigDecimal
7 | }
8 |
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/math/evaluator/internal/Token.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.math.evaluator.internal
2 |
3 | internal class Token(
4 | val type: TokenType,
5 | val lexeme: String,
6 | val literal: Any?,
7 | ) {
8 | override fun toString() = "$type $lexeme $literal"
9 | }
10 |
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/math/evaluator/internal/TokenType.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.math.evaluator.internal
2 |
3 | internal enum class TokenType {
4 | // Basic operators
5 | PLUS,
6 | MINUS,
7 | STAR,
8 | SLASH,
9 | MODULO,
10 | EXPONENT,
11 | ASSIGN,
12 | FACTORIAL,
13 |
14 | // Logical operators
15 | EQUAL_EQUAL,
16 | NOT_EQUAL,
17 | GREATER,
18 | GREATER_EQUAL,
19 | LESS,
20 | LESS_EQUAL,
21 | BAR_BAR,
22 | AMP_AMP,
23 |
24 | // Other
25 | COMMA,
26 |
27 | // Parentheses
28 | LEFT_PAREN,
29 | RIGHT_PAREN,
30 |
31 | // Literals
32 | NUMBER,
33 | IDENTIFIER,
34 |
35 | EOF
36 | }
37 |
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/navigation/MazeNavigator.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.navigation
2 |
3 | import com.infinitepower.newquiz.model.maze.MazeQuiz
4 |
5 | interface MazeNavigator {
6 | fun navigateToGame(item: MazeQuiz.MazeItem)
7 |
8 | fun navigateToMazeResults(itemId: Int)
9 | }
10 |
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/network/NetworkStatusTracker.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.network
2 |
3 | import kotlinx.coroutines.flow.Flow
4 |
5 | interface NetworkStatusTracker {
6 | val isOnline: Flow
7 |
8 | fun isCurrentlyConnected(): Boolean
9 | }
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/theme/LocalAnimationsEnabled.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.theme
2 |
3 | import androidx.annotation.Keep
4 | import androidx.compose.material3.MaterialTheme
5 | import androidx.compose.runtime.Composable
6 | import androidx.compose.runtime.ReadOnlyComposable
7 | import androidx.compose.runtime.compositionLocalOf
8 |
9 | @Keep
10 | data class AnimationsEnabled(
11 | val global: Boolean = true,
12 | val wordle: Boolean = true,
13 | val multiChoice: Boolean = true
14 | )
15 |
16 | val LocalAnimationsEnabled = compositionLocalOf { AnimationsEnabled() }
17 |
18 | val MaterialTheme.animationsEnabled: AnimationsEnabled
19 | @Composable
20 | @ReadOnlyComposable
21 | get() = LocalAnimationsEnabled.current
22 |
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/util/UriUtils.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.util
2 |
3 | import android.net.Uri
4 | import java.net.URI
5 |
6 | fun URI.toAndroidUri(): Uri = Uri.parse(this.toString())
7 |
8 | fun Uri.toJavaURI(): URI = URI.create(this.toString())
9 |
10 | fun emptyJavaURI(): URI = URI.create("")
11 |
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/util/android/DrawableUtils.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.util.android
2 |
3 | /*
4 | /**
5 | * Get the dominant color of the image asynchronously
6 | */
7 | fun Drawable.getDominantColor(
8 | onFinish: (Color) -> Unit
9 | ) {
10 | val bitmap = (this as BitmapDrawable).bitmap.copy(Bitmap.Config.ARGB_8888, true)
11 |
12 | Palette.from(bitmap).generate { palette ->
13 | palette?.vibrantSwatch?.rgb?.let { colorValue ->
14 | onFinish(Color(colorValue))
15 | }
16 | }
17 | }
18 |
19 | */
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/util/android/resources/ResourcesUtil.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.util.android.resources
2 |
3 | import android.content.res.Resources
4 | import androidx.annotation.RawRes
5 | import kotlinx.coroutines.Dispatchers
6 | import kotlinx.coroutines.withContext
7 | import kotlinx.serialization.json.Json
8 |
9 | suspend inline fun Resources.readRawJson(@RawRes rawResId: Int): T {
10 | return withContext(Dispatchers.IO) {
11 | val resStr = openRawResource(rawResId).use {
12 | it.readBytes().decodeToString()
13 | }
14 |
15 | Json.decodeFromString(resStr)
16 | }
17 | }
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/util/collections/Collections.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.util.collections
2 |
3 | inline fun Iterable.indexOfFirstOrNull(predicate: (T) -> Boolean) = indexOfFirst(predicate).takeIf { it >= 0 }
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/util/kotlin/BooleanUtils.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.util.kotlin
2 |
3 | fun Boolean.toInt(): Int = if (this) 1 else 0
4 |
5 | fun Boolean.toLong(): Long = if (this) 1L else 0L
6 |
7 | fun Boolean.toULong(): ULong = if (this) 1uL else 0uL
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/util/kotlin/Math.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.util.kotlin
2 |
3 | import kotlin.math.pow
4 | import kotlin.math.roundToInt
5 |
6 | fun Double.roundToUInt(): UInt = roundToInt().toUInt()
7 |
8 | infix fun UInt.pow(n: Int): UInt = toDouble().pow(n).toUInt()
9 |
10 | infix operator fun ULong.div(other: Float): Float = toLong() / other
11 |
12 | infix operator fun ULong.div(other: Double): Double = toLong() / other
13 |
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/util/kotlin/NumberUtils.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.util.kotlin
2 |
3 | fun Int.toDoubleDigit(): String = String.format("%02d", this)
4 |
5 | operator fun UInt.times(multiplierFactor: Float): UInt {
6 | return this.toInt().times(multiplierFactor).toUInt()
7 | }
8 |
9 | operator fun UIntRange.times(multiplierFactor: Float): UIntRange {
10 | return this.first * multiplierFactor..this.last * multiplierFactor
11 | }
12 |
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/util/kotlin/SetUtils.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.util.kotlin
2 |
3 | fun Set.removeFirst(): Set {
4 | return this - first()
5 | }
6 |
7 | fun Set.removeLast(): Set {
8 | return this - last()
9 | }
10 |
--------------------------------------------------------------------------------
/core/src/main/java/com/infinitepower/newquiz/core/util/model/QuestionDifficultyUtil.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.util.model
2 |
3 | import com.infinitepower.newquiz.model.UiText
4 | import com.infinitepower.newquiz.model.question.QuestionDifficulty
5 | import com.infinitepower.newquiz.core.R as CoreR
6 |
7 | fun QuestionDifficulty.getText(): UiText = when (this) {
8 | is QuestionDifficulty.Easy -> UiText.StringResource(CoreR.string.easy)
9 | is QuestionDifficulty.Medium -> UiText.StringResource(CoreR.string.medium)
10 | is QuestionDifficulty.Hard -> UiText.StringResource(CoreR.string.hard)
11 | }
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/animals.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/animals.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/art.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/art.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/books.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/books.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/celebrities.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/celebrities.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/entertainment_board_games.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/entertainment_board_games.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/entertainment_cartoon_and_animations.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/entertainment_cartoon_and_animations.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/entertainment_comics.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/entertainment_comics.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/entertainment_japanese_anime_and_manga.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/entertainment_japanese_anime_and_manga.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/entertainment_television.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/entertainment_television.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/entertainment_video_games.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/entertainment_video_games.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/films.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/films.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/general_knowledge.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/general_knowledge.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/geography.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/geography.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/history.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/history.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/music.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/music.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/musicals_and_theatres.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/musicals_and_theatres.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/mythology.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/mythology.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/politics.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/politics.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/science_and_nature.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/science_and_nature.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/science_computers.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/science_computers.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/science_gadgets.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/science_gadgets.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/science_mathematics.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/science_mathematics.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/sports.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/sports.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-hdpi/vehicles.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-hdpi/vehicles.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/animals.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/animals.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/art.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/art.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/books.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/books.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/celebrities.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/celebrities.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/entertainment_board_games.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/entertainment_board_games.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/entertainment_cartoon_and_animations.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/entertainment_cartoon_and_animations.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/entertainment_comics.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/entertainment_comics.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/entertainment_japanese_anime_and_manga.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/entertainment_japanese_anime_and_manga.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/entertainment_television.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/entertainment_television.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/entertainment_video_games.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/entertainment_video_games.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/films.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/films.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/general_knowledge.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/general_knowledge.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/geography.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/geography.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/history.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/history.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/music.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/music.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/musicals_and_theatres.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/musicals_and_theatres.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/mythology.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/mythology.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/politics.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/politics.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/science_and_nature.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/science_and_nature.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/science_computers.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/science_computers.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/science_gadgets.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/science_gadgets.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/science_mathematics.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/science_mathematics.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/sports.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/sports.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-mdpi/vehicles.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-mdpi/vehicles.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/animals.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/animals.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/art.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/art.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/books.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/books.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/celebrities.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/celebrities.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/entertainment_board_games.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/entertainment_board_games.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/entertainment_cartoon_and_animations.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/entertainment_cartoon_and_animations.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/entertainment_comics.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/entertainment_comics.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/entertainment_japanese_anime_and_manga.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/entertainment_japanese_anime_and_manga.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/entertainment_television.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/entertainment_television.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/entertainment_video_games.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/entertainment_video_games.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/films.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/films.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/general_knowledge.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/general_knowledge.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/geography.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/geography.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/history.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/history.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/music.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/music.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/musicals_and_theatres.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/musicals_and_theatres.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/mythology.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/mythology.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/politics.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/politics.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/science_and_nature.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/science_and_nature.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/science_computers.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/science_computers.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/science_gadgets.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/science_gadgets.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/science_mathematics.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/science_mathematics.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/sports.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/sports.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xhdpi/vehicles.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xhdpi/vehicles.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/animals.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/animals.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/art.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/art.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/books.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/books.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/celebrities.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/celebrities.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/entertainment_board_games.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/entertainment_board_games.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/entertainment_cartoon_and_animations.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/entertainment_cartoon_and_animations.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/entertainment_comics.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/entertainment_comics.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/entertainment_japanese_anime_and_manga.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/entertainment_japanese_anime_and_manga.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/entertainment_television.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/entertainment_television.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/entertainment_video_games.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/entertainment_video_games.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/films.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/films.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/general_knowledge.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/general_knowledge.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/geography.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/geography.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/history.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/history.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/music.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/music.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/musicals_and_theatres.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/musicals_and_theatres.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/mythology.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/mythology.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/politics.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/politics.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/science_and_nature.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/science_and_nature.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/science_computers.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/science_computers.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/science_gadgets.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/science_gadgets.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/science_mathematics.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/science_mathematics.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/sports.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/sports.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxhdpi/vehicles.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxhdpi/vehicles.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/animals.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/animals.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/art.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/art.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/books.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/books.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/celebrities.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/celebrities.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/entertainment_board_games.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/entertainment_board_games.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/entertainment_cartoon_and_animations.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/entertainment_cartoon_and_animations.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/entertainment_comics.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/entertainment_comics.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/entertainment_japanese_anime_and_manga.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/entertainment_japanese_anime_and_manga.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/entertainment_television.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/entertainment_television.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/entertainment_video_games.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/entertainment_video_games.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/films.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/films.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/general_knowledge.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/general_knowledge.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/geography.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/geography.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/history.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/history.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/music.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/music.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/musicals_and_theatres.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/musicals_and_theatres.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/mythology.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/mythology.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/politics.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/politics.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/science_and_nature.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/science_and_nature.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/science_computers.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/science_computers.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/science_gadgets.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/science_gadgets.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/science_mathematics.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/science_mathematics.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/sports.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/sports.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable-xxxhdpi/vehicles.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/drawable-xxxhdpi/vehicles.webp
--------------------------------------------------------------------------------
/core/src/main/res/drawable/github_logo.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/core/src/main/res/drawable/round_android_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/core/src/main/res/drawable/round_flag_circle_24.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/core/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/core/src/main/res/mipmap-hdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/mipmap-hdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/core/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp
--------------------------------------------------------------------------------
/core/src/main/res/mipmap-hdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/mipmap-hdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/core/src/main/res/mipmap-mdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/mipmap-mdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/core/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp
--------------------------------------------------------------------------------
/core/src/main/res/mipmap-mdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/mipmap-mdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/core/src/main/res/mipmap-xhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/mipmap-xhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/core/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp
--------------------------------------------------------------------------------
/core/src/main/res/mipmap-xhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/core/src/main/res/mipmap-xxhdpi/ic_launcher.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/mipmap-xxhdpi/ic_launcher.webp
--------------------------------------------------------------------------------
/core/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp
--------------------------------------------------------------------------------
/core/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/core/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp
--------------------------------------------------------------------------------
/core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
--------------------------------------------------------------------------------
/core/src/main/res/values-et/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Salvestatud küsimused
4 | Lisavalikud
5 | Kiire mälumäng
6 | Tagasi
7 | Lõputu Wordle
8 | Igapäevane Wordle
9 | Kontrolli
10 | Mängi uuesti
11 | Sulge
12 | Mäng on läbi
13 |
--------------------------------------------------------------------------------
/core/src/main/res/values-night/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/core/src/main/res/values-v29/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
--------------------------------------------------------------------------------
/core/src/main/res/values/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #6040D7
4 |
--------------------------------------------------------------------------------
/core/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/core/src/normal/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
11 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/core/src/test/java/com/infinitepower/newquiz/core/util/kotlin/SetUtilsTest.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.util.kotlin
2 |
3 | import com.google.common.truth.Truth.assertThat
4 | import org.junit.jupiter.api.Test
5 |
6 | internal class SetUtilsTest {
7 | @Test
8 | fun `Test Set removeFirst`() {
9 | val set = setOf("apple", "banana", "cherry")
10 | val result = set.removeFirst()
11 | assertThat(result).containsExactly("banana", "cherry")
12 | }
13 |
14 | @Test
15 | fun `Test Set removeLast`() {
16 | val set = setOf("apple", "banana", "cherry")
17 | val result = set.removeLast()
18 | assertThat(result).containsExactly("apple", "banana")
19 | }
20 | }
--------------------------------------------------------------------------------
/core/testing/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/testing/README.md:
--------------------------------------------------------------------------------
1 | # Core Testing Module (:core:testing)
2 |
3 | This module provides a set of utilities to help with testing.
4 |
--------------------------------------------------------------------------------
/core/testing/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/core/testing/src/main/kotlin/com/infinitepower/newquiz/core/testing/NewQuizTestRunner.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.testing
2 |
3 | import android.app.Application
4 | import android.content.Context
5 | import androidx.test.runner.AndroidJUnitRunner
6 | import dagger.hilt.android.testing.HiltTestApplication
7 |
8 | class NewQuizTestRunner : AndroidJUnitRunner() {
9 | override fun newApplication(cl: ClassLoader?, className: String?, context: Context?): Application {
10 | return super.newApplication(cl, HiltTestApplication::class.java.name, context)
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/core/testing/src/main/kotlin/com/infinitepower/newquiz/core/testing/di/WorkManagerModule.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.testing.di
2 |
3 | import android.content.Context
4 | import androidx.work.WorkManager
5 | import dagger.Module
6 | import dagger.Provides
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.android.qualifiers.ApplicationContext
9 | import dagger.hilt.components.SingletonComponent
10 | import javax.inject.Singleton
11 |
12 | @Module
13 | @InstallIn(SingletonComponent::class)
14 | object WorkManagerModule {
15 | @Singleton
16 | @Provides
17 | fun provideWorkManager(
18 | @ApplicationContext context: Context
19 | ): WorkManager = WorkManager.getInstance(context)
20 | }
21 |
--------------------------------------------------------------------------------
/core/testing/src/main/kotlin/com/infinitepower/newquiz/core/testing/ui/theme/TestTheme.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.testing.ui.theme
2 |
3 | import androidx.compose.runtime.Composable
4 | import com.infinitepower.newquiz.core.theme.NewQuizTheme
5 |
6 | @Composable
7 | fun NewQuizTestTheme(
8 | darkTheme: Boolean = false,
9 | dynamicColor: Boolean = false,
10 | content: @Composable () -> Unit
11 | ) {
12 | NewQuizTheme(
13 | darkTheme = darkTheme,
14 | dynamicColor = dynamicColor,
15 | content = content
16 | )
17 | }
18 |
--------------------------------------------------------------------------------
/core/testing/src/normal/kotlin/com/infinitepower/newquiz/core/testing/di/TestAnalyticsModule.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.testing.di
2 |
3 | import com.infinitepower.newquiz.core.analytics.AnalyticsHelper
4 | import com.infinitepower.newquiz.core.analytics.LocalDebugAnalyticsHelper
5 | import com.infinitepower.newquiz.core.analytics.NormalAnalyticsModule
6 | import dagger.Binds
7 | import dagger.Module
8 | import dagger.hilt.components.SingletonComponent
9 | import dagger.hilt.testing.TestInstallIn
10 |
11 | @Module
12 | @TestInstallIn(
13 | components = [SingletonComponent::class],
14 | replaces = [NormalAnalyticsModule::class]
15 | )
16 | abstract class TestAnalyticsModule {
17 | @Binds
18 | abstract fun bindAnalyticsHelper(impl: LocalDebugAnalyticsHelper): AnalyticsHelper
19 | }
--------------------------------------------------------------------------------
/core/translation/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/translation/README.md:
--------------------------------------------------------------------------------
1 | # Translation Module (:core:translation)
2 |
3 | This module provides a translation service for the game.
4 |
5 | ## Normal Flavor
6 |
7 | The normal flavor of the translation uses the [Ml Kit](https://developers.google.com/ml-kit/language/translation) from Google.
8 |
9 | ## FOSS Flavor
10 |
11 | Currently, the translation service is not available in the FOSS flavor.
12 |
--------------------------------------------------------------------------------
/core/translation/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.newquiz.android.library)
3 | alias(libs.plugins.newquiz.android.hilt)
4 | alias(libs.plugins.newquiz.detekt)
5 | }
6 |
7 | android {
8 | namespace = "com.infinitepower.newquiz.core.translation"
9 | }
10 |
11 | dependencies {
12 | implementation(projects.model)
13 | implementation(projects.core)
14 | implementation(projects.core.datastore)
15 |
16 | normalImplementation(libs.google.mlKit.translate)
17 | normalImplementation(libs.kotlinx.coroutines.playServices)
18 | }
19 |
--------------------------------------------------------------------------------
/core/translation/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/core/translation/consumer-rules.pro
--------------------------------------------------------------------------------
/core/translation/src/foss/kotlin/com/infinitepower/newquiz/core/translation/di/TranslatorModule.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.translation.di
2 |
3 | import com.infinitepower.newquiz.core.translation.NoTranslatorUtil
4 | import com.infinitepower.newquiz.core.translation.TranslatorUtil
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 |
10 | @Module
11 | @InstallIn(SingletonComponent::class)
12 | abstract class NoTranslatorModule {
13 | @Binds
14 | abstract fun bindTranslatorUtil(impl: NoTranslatorUtil): TranslatorUtil
15 | }
--------------------------------------------------------------------------------
/core/translation/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/core/translation/src/main/kotlin/com/infinitepower/newquiz/core/translation/TranslatorLanguageSettings.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.translation
2 |
3 | /**
4 | * Language settings for the translator.
5 | *
6 | * key - language code
7 | *
8 | * value - language name
9 | */
10 | typealias TranslatorTargetLanguages = Map
11 |
--------------------------------------------------------------------------------
/core/translation/src/main/kotlin/com/infinitepower/newquiz/core/translation/TranslatorModelState.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.translation
2 |
3 | enum class TranslatorModelState {
4 | None,
5 | Downloaded,
6 | Downloading
7 | }
8 |
--------------------------------------------------------------------------------
/core/translation/src/normal/kotlin/com/infinitepower/newquiz/core/translation/di/GoogleTranslatorModule.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.translation.di
2 |
3 | import com.infinitepower.newquiz.core.translation.GoogleTranslatorUtil
4 | import com.infinitepower.newquiz.core.translation.TranslatorUtil
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 |
10 | @Module
11 | @InstallIn(SingletonComponent::class)
12 | abstract class GoogleTranslatorModule {
13 | @Binds
14 | abstract fun bindTranslatorUtil(impl: GoogleTranslatorUtil): TranslatorUtil
15 | }
--------------------------------------------------------------------------------
/core/user-services/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/user-services/src/androidTest/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/core/user-services/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/core/user-services/src/main/kotlin/com/infinitepower/newquiz/core/user_services/InsufficientDiamondsException.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.user_services
2 |
3 | class InsufficientDiamondsException(diamondsNeeded: UInt, diamondsAvailable: UInt) : Exception(
4 | "Not enough diamonds. Need $diamondsNeeded, but only $diamondsAvailable are available."
5 | )
6 |
--------------------------------------------------------------------------------
/core/user-services/src/main/kotlin/com/infinitepower/newquiz/core/user_services/LocalUserService.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.user_services
2 |
3 | interface LocalUserService : UserService
4 |
--------------------------------------------------------------------------------
/core/user-services/src/main/kotlin/com/infinitepower/newquiz/core/user_services/UserService.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.user_services
2 |
3 | import com.infinitepower.newquiz.core.user_services.model.User
4 | import kotlinx.coroutines.flow.Flow
5 |
6 | interface UserService : GameResultTracker, XpManager {
7 | /**
8 | * @return true if the user is available, false otherwise
9 | */
10 | suspend fun userAvailable(): Boolean
11 |
12 | suspend fun getUser(): User?
13 |
14 | suspend fun getUserDiamonds(): UInt
15 |
16 | fun getUserDiamondsFlow(): Flow
17 |
18 | /**
19 | * @param diamonds the amount of diamonds to add/remove
20 | */
21 | suspend fun addRemoveDiamonds(diamonds: Int)
22 | }
23 |
--------------------------------------------------------------------------------
/core/user-services/src/main/kotlin/com/infinitepower/newquiz/core/user_services/XpManager.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.user_services
2 |
3 | import com.infinitepower.newquiz.model.TimestampWithXP
4 | import kotlinx.coroutines.flow.Flow
5 | import kotlinx.datetime.Instant
6 |
7 | interface XpManager {
8 | suspend fun getXpEarnedBy(start: Instant, end: Instant): List
9 |
10 | suspend fun getXpEarnedBy(timeRange: TimeRange): List
11 |
12 | fun getXpEarnedByFlow(timeRange: TimeRange): Flow>
13 | }
14 |
--------------------------------------------------------------------------------
/core/user-services/src/main/kotlin/com/infinitepower/newquiz/core/user_services/di/UserModule.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.user_services.di
2 |
3 | import com.infinitepower.newquiz.core.user_services.LocalUserServiceImpl
4 | import com.infinitepower.newquiz.core.user_services.UserService
5 | import dagger.Binds
6 | import dagger.Module
7 | import dagger.hilt.InstallIn
8 | import dagger.hilt.components.SingletonComponent
9 | import javax.inject.Singleton
10 |
11 | @Module
12 | @InstallIn(SingletonComponent::class)
13 | abstract class UserModule {
14 | @Binds
15 | @Singleton
16 | abstract fun bindUserService(
17 | impl: LocalUserServiceImpl
18 | ): UserService
19 | }
20 |
--------------------------------------------------------------------------------
/core/user-services/src/main/kotlin/com/infinitepower/newquiz/core/user_services/domain/xp/MultiChoiceQuizXpGenerator.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.user_services.domain.xp
2 |
3 | import com.infinitepower.newquiz.model.multi_choice_quiz.MultiChoiceQuestionStep
4 | import com.infinitepower.newquiz.model.question.QuestionDifficulty
5 |
6 | interface MultiChoiceQuizXpGenerator : XpGenerator {
7 | fun getDefaultXpReward(): Map
8 |
9 | /**
10 | * Generates a amount of XP based on the given question steps.
11 | */
12 | fun generateXp(
13 | questionSteps: List
14 | ): UInt
15 | }
16 |
--------------------------------------------------------------------------------
/core/user-services/src/main/kotlin/com/infinitepower/newquiz/core/user_services/domain/xp/WordleXpGenerator.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.user_services.domain.xp
2 |
3 | interface WordleXpGenerator : XpGenerator {
4 | fun getDefaultXp(): UInt
5 |
6 | /**
7 | * Calculates the XP awarded to the player for completing a game of Wordle.
8 | *
9 | * Currently it does not take into account the difficulty of the game, because
10 | * the difficulty is not yet implemented in the game.
11 | *
12 | * The formula is:
13 | *
14 | * xp = xpForDifficulty * (2 / sqrt(rowsUsed))
15 | *
16 | * @param rowsUsed The number of rows used in the game.
17 | * @return The XP awarded to the player.
18 | */
19 | fun generateXp(rowsUsed: UInt): UInt
20 | }
21 |
--------------------------------------------------------------------------------
/core/user-services/src/main/kotlin/com/infinitepower/newquiz/core/user_services/domain/xp/XpGenerator.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.core.user_services.domain.xp
2 |
3 | interface XpGenerator
4 |
--------------------------------------------------------------------------------
/data/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/data/consumer-rules.pro
--------------------------------------------------------------------------------
/data/src/androidTest/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
9 |
10 |
--------------------------------------------------------------------------------
/data/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ae.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ag.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/am.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/at.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/az.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ba.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/bb.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/bd.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/be.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/bf.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/bg.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/bh.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/bi.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/bj.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/bs.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/bw.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ca.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/cd.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/cf.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/cg.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ch.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ci.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/cl.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/cm.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/cn.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/co.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/cu.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/cz.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/de.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/dj.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/dk.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/dz.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ee.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/eh.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/et.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/fi.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/fm.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/fr.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ga.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/gb.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ge.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/gh.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/gm.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/gn.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/gr.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/gw.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/gy.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/hn.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/hu.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/id.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ie.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/il.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/in.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/is.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/it.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/jm.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/jo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/jp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/km.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/kn.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/kp.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/kr.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/kw.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/la.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/lc.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/lr.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/lt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/lu.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/lv.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ly.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ma.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/mc.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/mg.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/mh.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/mk.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ml.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/mm.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/mr.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/mu.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/mv.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/mw.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/my.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/na.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ne.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ng.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/nl.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/no.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/nr.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/pa.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/pe.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ph.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/pk.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/pl.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/pw.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/qa.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ro.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ru.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/sc.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/sd.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/se.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/sg.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/sl.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/sn.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/so.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/sr.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ss.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/st.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/sy.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/td.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/tg.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/th.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/tl.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/tn.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/to.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/tr.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/tt.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/tw.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/tz.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ua.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/us.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/vc.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/vn.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ws.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/ye.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/assets/flags/za.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/src/main/java/com/infinitepower/newquiz/data/di/MathModule.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.data.di
2 |
3 | import com.infinitepower.newquiz.core.math.evaluator.Expressions
4 | import dagger.Module
5 | import dagger.Provides
6 | import dagger.hilt.InstallIn
7 | import dagger.hilt.components.SingletonComponent
8 | import javax.inject.Singleton
9 |
10 | @Module
11 | @InstallIn(SingletonComponent::class)
12 | object MathModule {
13 | @Provides
14 | @Singleton
15 | fun provideExpressions(): Expressions = Expressions()
16 | }
--------------------------------------------------------------------------------
/data/src/main/java/com/infinitepower/newquiz/data/repository/comparison_quiz/ComparisonQuizApi.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.data.repository.comparison_quiz
2 |
3 | import com.infinitepower.newquiz.model.comparison_quiz.ComparisonQuizCategory
4 | import com.infinitepower.newquiz.model.comparison_quiz.ComparisonQuizItemEntity
5 | import kotlin.random.Random
6 |
7 | interface ComparisonQuizApi {
8 | suspend fun generateQuestions(
9 | category: ComparisonQuizCategory,
10 | size: Int,
11 | random: Random = Random
12 | ): List
13 | }
14 |
--------------------------------------------------------------------------------
/data/src/main/java/com/infinitepower/newquiz/data/repository/wordle/InvalidWordError.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.data.repository.wordle
2 |
3 | sealed class InvalidWordError : IllegalArgumentException() {
4 | data object Empty : InvalidWordError()
5 | data object NotOnlyLetters : InvalidWordError()
6 | data object NotOnlyDigits : InvalidWordError()
7 | data object InvalidMathFormula : InvalidWordError()
8 | }
9 |
--------------------------------------------------------------------------------
/data/src/main/java/com/infinitepower/newquiz/data/util/mappers/comparisonquiz/ComparisonQuizMapper.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.data.util.mappers.comparisonquiz
2 |
3 | import com.infinitepower.newquiz.model.comparison_quiz.ComparisonQuizItem
4 | import com.infinitepower.newquiz.model.comparison_quiz.ComparisonQuizItemEntity
5 | import java.net.URI
6 |
7 | fun ComparisonQuizItem.toEntity() = ComparisonQuizItemEntity(
8 | title = title,
9 | value = value,
10 | imgUrl = imgUri.toASCIIString(),
11 | )
12 |
13 | fun ComparisonQuizItemEntity.toModel() = ComparisonQuizItem(
14 | title = title,
15 | value = value,
16 | imgUri = URI.create(imgUrl)
17 | )
18 |
--------------------------------------------------------------------------------
/data/src/main/java/com/infinitepower/newquiz/data/util/translation/WordleTitleUtil.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.data.util.translation
2 |
3 | import com.infinitepower.newquiz.model.UiText
4 | import com.infinitepower.newquiz.model.wordle.WordleQuizType
5 | import com.infinitepower.newquiz.core.R as CoreR
6 |
7 | fun WordleQuizType?.getWordleTitle() = when (this) {
8 | WordleQuizType.TEXT -> UiText.StringResource(CoreR.string.guess_the_word)
9 | WordleQuizType.NUMBER -> UiText.StringResource(CoreR.string.guess_the_number)
10 | WordleQuizType.MATH_FORMULA -> UiText.StringResource(CoreR.string.guess_math_formula)
11 | WordleQuizType.NUMBER_TRIVIA -> UiText.StringResource(CoreR.string.number_trivia)
12 | else -> UiText.StringResource(CoreR.string.wordle)
13 | }
14 |
--------------------------------------------------------------------------------
/domain/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/domain/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.newquiz.jvm.library)
3 | alias(libs.plugins.newquiz.detekt)
4 | }
5 |
6 | dependencies {
7 | implementation(projects.model)
8 |
9 | api(libs.kotlinx.collections.immutable)
10 |
11 | implementation(libs.javax.inject)
12 | implementation(libs.androidx.annotation)
13 | implementation(libs.kotlinx.coroutines.core)
14 | }
15 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/infinitepower/newquiz/domain/repository/CountryRepository.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.domain.repository
2 |
3 | import com.infinitepower.newquiz.model.country.Country
4 |
5 | interface CountryRepository {
6 | suspend fun getAllCountries(): List
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/infinitepower/newquiz/domain/repository/UserConfigRepository.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.domain.repository
2 |
3 | import com.infinitepower.newquiz.model.regional_preferences.RegionalPreferences
4 |
5 | interface UserConfigRepository {
6 | suspend fun getRegionalPreferences(): RegionalPreferences
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/infinitepower/newquiz/domain/repository/maze/MazeQuizRepository.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.domain.repository.maze
2 |
3 | import com.infinitepower.newquiz.model.maze.MazeQuiz
4 | import kotlinx.coroutines.flow.Flow
5 |
6 | interface MazeQuizRepository {
7 | fun getSavedMazeQuizFlow(): Flow
8 |
9 | suspend fun countAllItems(): Int
10 |
11 | suspend fun insertItems(items: List)
12 |
13 | suspend fun removeItems(items: List)
14 |
15 | suspend fun getMazeItemById(id: Int): MazeQuiz.MazeItem?
16 |
17 | suspend fun getNextAvailableMazeItem(): MazeQuiz.MazeItem?
18 |
19 | suspend fun completeMazeItem(id: Int)
20 | }
21 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/infinitepower/newquiz/domain/repository/multi_choice_quiz/CountryCapitalFlagsQuizRepository.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.domain.repository.multi_choice_quiz
2 |
3 | import com.infinitepower.newquiz.model.multi_choice_quiz.MultiChoiceBaseCategory
4 |
5 | interface CountryCapitalFlagsQuizRepository :
6 | MultiChoiceQuestionBaseRepository
7 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/infinitepower/newquiz/domain/repository/multi_choice_quiz/FlagQuizRepository.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.domain.repository.multi_choice_quiz
2 |
3 | import com.infinitepower.newquiz.model.multi_choice_quiz.MultiChoiceBaseCategory
4 |
5 | interface FlagQuizRepository : MultiChoiceQuestionBaseRepository
6 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/infinitepower/newquiz/domain/repository/multi_choice_quiz/GuessMathSolutionRepository.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.domain.repository.multi_choice_quiz
2 |
3 | import com.infinitepower.newquiz.model.multi_choice_quiz.MultiChoiceBaseCategory
4 |
5 | interface GuessMathSolutionRepository : MultiChoiceQuestionBaseRepository
6 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/infinitepower/newquiz/domain/repository/multi_choice_quiz/LogoQuizRepository.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.domain.repository.multi_choice_quiz
2 |
3 | import com.infinitepower.newquiz.model.multi_choice_quiz.MultiChoiceBaseCategory
4 |
5 | interface LogoQuizRepository : MultiChoiceQuestionBaseRepository
6 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/infinitepower/newquiz/domain/repository/multi_choice_quiz/MultiChoiceQuestionBaseRepository.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.domain.repository.multi_choice_quiz
2 |
3 | import com.infinitepower.newquiz.model.multi_choice_quiz.MultiChoiceBaseCategory
4 | import com.infinitepower.newquiz.model.multi_choice_quiz.MultiChoiceQuestion
5 | import kotlin.random.Random
6 |
7 | sealed interface MultiChoiceQuestionBaseRepository {
8 | suspend fun getRandomQuestions(
9 | amount: Int = 5,
10 | category: T,
11 | difficulty: String? = null,
12 | random: Random = Random
13 | ): List
14 | }
15 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/infinitepower/newquiz/domain/repository/multi_choice_quiz/MultiChoiceQuestionRepository.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.domain.repository.multi_choice_quiz
2 |
3 | import com.infinitepower.newquiz.model.multi_choice_quiz.MultiChoiceBaseCategory
4 |
5 | interface MultiChoiceQuestionRepository : MultiChoiceQuestionBaseRepository
6 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/infinitepower/newquiz/domain/repository/numbers/NumberTriviaQuestionApi.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.domain.repository.numbers
2 |
3 | import androidx.annotation.IntRange
4 | import com.infinitepower.newquiz.model.number.NumberTriviaQuestionsEntity
5 |
6 | interface NumberTriviaQuestionApi {
7 | suspend fun getRandomQuestion(
8 | size: Int,
9 | @IntRange(from = 0) minNumber: Int,
10 | @IntRange(from = 0) maxNumber: Int
11 | ): NumberTriviaQuestionsEntity
12 | }
13 |
--------------------------------------------------------------------------------
/feature/daily-challenge/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature/daily-challenge/README.md:
--------------------------------------------------------------------------------
1 | # :feature:daily-challenge module
2 |
--------------------------------------------------------------------------------
/feature/daily-challenge/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.newquiz.android.feature)
3 | alias(libs.plugins.newquiz.android.compose.destinations)
4 | alias(libs.plugins.newquiz.detekt)
5 | }
6 |
7 | android {
8 | namespace = "com.infinitepower.newquiz.feature.daily_challenge"
9 | }
10 |
11 | dependencies {
12 | implementation(libs.kotlinx.datetime)
13 |
14 | implementation(projects.core.userServices)
15 | implementation(projects.domain)
16 | implementation(projects.data)
17 | }
18 |
--------------------------------------------------------------------------------
/feature/daily-challenge/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/feature/daily-challenge/src/main/kotlin/com/infinitepower/newquiz/feature/daily_challenge/DailyChallengeScreenUiEvent.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.feature.daily_challenge
2 |
3 | import androidx.annotation.Keep
4 | import com.infinitepower.newquiz.model.global_event.GameEvent
5 |
6 | interface DailyChallengeScreenUiEvent {
7 | @Keep
8 | data class OnClaimTaskClick(
9 | val taskType: GameEvent
10 | ) : DailyChallengeScreenUiEvent
11 | }
12 |
--------------------------------------------------------------------------------
/feature/daily-challenge/src/main/kotlin/com/infinitepower/newquiz/feature/daily_challenge/DailyChallengeScreenUiState.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.feature.daily_challenge
2 |
3 | import androidx.annotation.Keep
4 | import com.infinitepower.newquiz.model.comparison_quiz.ComparisonQuizCategory
5 | import com.infinitepower.newquiz.model.daily_challenge.DailyChallengeTask
6 |
7 | @Keep
8 | data class DailyChallengeScreenUiState(
9 | val loading: Boolean = true,
10 | val tasks: List = emptyList(),
11 | val comparisonQuizCategories: List = emptyList(),
12 | val userAvailable: Boolean = false
13 | )
14 |
--------------------------------------------------------------------------------
/feature/maze/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature/maze/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.newquiz.android.feature)
3 | alias(libs.plugins.newquiz.android.compose.destinations)
4 | alias(libs.plugins.newquiz.detekt)
5 | }
6 |
7 | android {
8 | namespace = "com.infinitepower.newquiz.feature.maze"
9 | }
10 |
11 | dependencies {
12 | implementation(libs.androidx.work.ktx)
13 |
14 | implementation(libs.androidx.lifecycle.livedata.ktx)
15 |
16 | implementation(libs.androidx.compose.material.iconsExtended)
17 | implementation(libs.androidx.graphics.shapes)
18 |
19 | implementation(libs.lottie.compose)
20 |
21 | implementation(projects.core.datastore)
22 | implementation(projects.data)
23 | implementation(projects.domain)
24 | testImplementation(projects.core.testing)
25 | }
26 |
--------------------------------------------------------------------------------
/feature/maze/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/feature/maze/src/main/kotlin/com/infinitepower/newquiz/feature/maze/MazeScreenUiEvent.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.feature.maze
2 |
3 | sealed interface MazeScreenUiEvent {
4 | data object RestartMaze : MazeScreenUiEvent
5 |
6 | data object RemoveInvalidCategories : MazeScreenUiEvent
7 | }
8 |
--------------------------------------------------------------------------------
/feature/maze/src/main/kotlin/com/infinitepower/newquiz/feature/maze/categories_info/MazeCategoriesInfoUiState.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.feature.maze.categories_info
2 |
3 | import com.infinitepower.newquiz.model.BaseCategory
4 | import kotlinx.collections.immutable.ImmutableList
5 | import kotlinx.collections.immutable.persistentListOf
6 |
7 | data class MazeCategoriesInfoUiState(
8 | val loading: Boolean = true,
9 | val multiChoiceCategories: ImmutableList = persistentListOf(),
10 | val wordleCategories: ImmutableList = persistentListOf(),
11 | val comparisonQuizCategories: ImmutableList = persistentListOf(),
12 | )
13 |
--------------------------------------------------------------------------------
/feature/maze/src/main/kotlin/com/infinitepower/newquiz/feature/maze/level_results/LevelResultsScreenUiState.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.feature.maze.level_results
2 |
3 | import com.infinitepower.newquiz.model.maze.MazeQuiz
4 |
5 | data class LevelResultsScreenUiState(
6 | val loading: Boolean = true,
7 | val completed: Boolean = false,
8 | val currentItem: MazeQuiz.MazeItem? = null,
9 | val nextAvailableItem: MazeQuiz.MazeItem? = null,
10 | val error: String? = null
11 | )
12 |
--------------------------------------------------------------------------------
/feature/profile/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature/profile/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.newquiz.android.feature)
3 | alias(libs.plugins.newquiz.android.compose.destinations)
4 | alias(libs.plugins.newquiz.detekt)
5 | }
6 |
7 | android {
8 | namespace = "com.infinitepower.newquiz.feature.profile"
9 | }
10 |
11 | dependencies {
12 | implementation(libs.androidx.lifecycle.livedata.ktx)
13 |
14 | implementation(libs.vico.compose)
15 | implementation(libs.vico.compose.m3)
16 |
17 | implementation(libs.kotlinx.datetime)
18 |
19 | implementation(libs.coil.kt.compose)
20 |
21 | implementation(projects.core)
22 | implementation(projects.core.userServices)
23 | }
24 |
--------------------------------------------------------------------------------
/feature/profile/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/feature/profile/src/main/kotlin/com/infinitepower/newquiz/feature/profile/ProfileScreenUiEvent.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.feature.profile
2 |
3 | import com.infinitepower.newquiz.core.user_services.DateTimeRangeFormatter
4 |
5 | interface ProfileScreenUiEvent {
6 | data class OnFilterByTimeRangeClick(val timeRange: DateTimeRangeFormatter) : ProfileScreenUiEvent
7 | }
8 |
--------------------------------------------------------------------------------
/feature/profile/src/main/kotlin/com/infinitepower/newquiz/feature/profile/ProfileScreenUiState.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.feature.profile
2 |
3 | import androidx.annotation.Keep
4 | import com.infinitepower.newquiz.core.user_services.DateTimeRangeFormatter
5 | import com.infinitepower.newquiz.core.user_services.model.User
6 | import com.infinitepower.newquiz.model.TimestampWithXP
7 | import kotlinx.collections.immutable.ImmutableList
8 | import kotlinx.collections.immutable.persistentListOf
9 |
10 | @Keep
11 | data class ProfileScreenUiState(
12 | val loading: Boolean = true,
13 | val user: User? = null,
14 | val selectedTimeRange: DateTimeRangeFormatter = DateTimeRangeFormatter.Day,
15 | val xpEarnedList: ImmutableList = persistentListOf(),
16 | )
17 |
--------------------------------------------------------------------------------
/feature/settings/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature/settings/README.md:
--------------------------------------------------------------------------------
1 | # :feature:settings module
2 |
--------------------------------------------------------------------------------
/feature/settings/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.newquiz.android.feature)
3 | alias(libs.plugins.newquiz.android.compose.destinations)
4 | alias(libs.plugins.newquiz.detekt)
5 | }
6 |
7 | android {
8 | namespace = "com.infinitepower.newquiz.feature.settings"
9 | }
10 |
11 | dependencies {
12 | implementation(libs.androidx.compose.material3.windowSizeClass)
13 | implementation(libs.androidx.compose.material.iconsExtended)
14 |
15 | implementation(libs.google.oss.licenses) {
16 | exclude(group = "androidx.appcompat")
17 | }
18 |
19 | implementation(projects.core.datastore)
20 | implementation(projects.domain)
21 | implementation(projects.data)
22 | normalImplementation(projects.core.translation)
23 | }
24 |
--------------------------------------------------------------------------------
/feature/settings/src/foss/kotlin/com/infinitepower/newquiz/feature/settings/common/BuildVariant.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.feature.settings.common
2 |
3 | object BuildVariant {
4 | internal const val DISTRIBUTION_FLAVOR = "foss"
5 | }
6 |
--------------------------------------------------------------------------------
/feature/settings/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/feature/settings/src/main/kotlin/com/infinitepower/newquiz/feature/settings/model/ScreenKey.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.feature.settings.model
2 |
3 | enum class ScreenKey {
4 | GENERAL,
5 | MULTI_CHOICE_QUIZ,
6 | WORDLE,
7 | TRANSLATION,
8 | ABOUT_AND_HELP,
9 | ANALYTICS,
10 | ANIMATIONS,
11 | }
12 |
--------------------------------------------------------------------------------
/feature/settings/src/main/kotlin/com/infinitepower/newquiz/feature/settings/screens/general/GeneralScreenUiEvent.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.feature.settings.screens.general
2 |
3 | interface GeneralScreenUiEvent {
4 | data object ClearHomeRecentCategories : GeneralScreenUiEvent
5 | }
6 |
--------------------------------------------------------------------------------
/feature/settings/src/main/kotlin/com/infinitepower/newquiz/feature/settings/screens/general/GeneralScreenUiState.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.feature.settings.screens.general
2 |
3 | import androidx.annotation.Keep
4 | import com.infinitepower.newquiz.model.category.ShowCategoryConnectionInfo
5 |
6 | @Keep
7 | data class GeneralScreenUiState(
8 | val defaultShowCategoryConnectionInfo: ShowCategoryConnectionInfo = ShowCategoryConnectionInfo.NONE
9 | )
10 |
--------------------------------------------------------------------------------
/feature/settings/src/main/kotlin/com/infinitepower/newquiz/feature/settings/util/datastore/DatastoreUtils.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.feature.settings.util.datastore
2 |
3 | import androidx.compose.runtime.Composable
4 | import androidx.compose.runtime.remember
5 | import androidx.compose.ui.platform.LocalContext
6 | import com.infinitepower.newquiz.core.datastore.common.settingsDataStore
7 | import com.infinitepower.newquiz.core.datastore.manager.DataStoreManager
8 | import com.infinitepower.newquiz.core.datastore.manager.PreferencesDatastoreManager
9 |
10 | @Composable
11 | fun rememberSettingsDataStoreManager(): DataStoreManager {
12 | val context = LocalContext.current
13 | val dataStore = context.settingsDataStore
14 |
15 | return remember {
16 | PreferencesDatastoreManager(dataStore)
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/feature/settings/src/normal/kotlin/com/infinitepower/newquiz/feature/settings/common/BuildVariant.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.feature.settings.common
2 |
3 | object BuildVariant {
4 | internal const val DISTRIBUTION_FLAVOR = "normal"
5 | }
6 |
--------------------------------------------------------------------------------
/feature/settings/src/normal/kotlin/com/infinitepower/newquiz/feature/settings/screens/translation/TranslationScreenUiEvent.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.feature.settings.screens.translation
2 |
3 | interface TranslationScreenUiEvent {
4 | data object DownloadTranslationModel : TranslationScreenUiEvent
5 |
6 | data object DeleteTranslationModel : TranslationScreenUiEvent
7 | }
--------------------------------------------------------------------------------
/feature/settings/src/normal/kotlin/com/infinitepower/newquiz/feature/settings/screens/translation/TranslationScreenUiState.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.feature.settings.screens.translation
2 |
3 | import androidx.annotation.Keep
4 | import com.infinitepower.newquiz.core.translation.TranslatorModelState
5 | import com.infinitepower.newquiz.core.translation.TranslatorTargetLanguages
6 |
7 | @Keep
8 | data class TranslationScreenUiState(
9 | val translationModelState: TranslatorModelState = TranslatorModelState.None,
10 | val translatorTargetLanguages: TranslatorTargetLanguages = emptyMap(),
11 | val translatorTargetLanguage: String = "",
12 | )
13 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Mon Jun 03 19:47:53 WEST 2024
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
5 | zipStoreBase=GRADLE_USER_HOME
6 | zipStorePath=wrapper/dists
7 |
--------------------------------------------------------------------------------
/lint.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/model/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/model/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.newquiz.jvm.library)
3 | alias(libs.plugins.newquiz.kotlin.serialization)
4 | alias(libs.plugins.newquiz.detekt)
5 | }
6 |
7 | dependencies {
8 | testImplementation(libs.google.truth)
9 | testImplementation(libs.junit.jupiter)
10 | testImplementation(libs.mockk)
11 |
12 | implementation(libs.androidx.annotation)
13 |
14 | implementation(libs.kotlinx.coroutines.core)
15 | implementation(libs.kotlinx.datetime)
16 |
17 | api(libs.kotlinx.collections.immutable)
18 | }
19 |
20 | tasks.withType {
21 | useJUnitPlatform()
22 | }
23 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/BaseCategory.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model
2 |
3 | interface BaseCategory : GameModeCategory {
4 | val id: String
5 |
6 | val name: UiText
7 |
8 | val image: Any
9 |
10 | val requireInternetConnection: Boolean
11 | }
12 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/DataAnalyticsConsentState.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model
2 |
3 | enum class DataAnalyticsConsentState {
4 | NONE,
5 | AGREED,
6 | DISAGREED
7 | }
8 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/GameMode.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model
2 |
3 | /**
4 | * This enum class is used to determine which game mode the user is playing.
5 | */
6 | enum class GameMode {
7 | /**
8 | * Multiple choice game mode.
9 | */
10 | MULTI_CHOICE,
11 |
12 | /**
13 | * Wordle game mode.
14 | */
15 | WORDLE,
16 |
17 | /**
18 | * Comparison game mode.
19 | */
20 | COMPARISON_QUIZ
21 | }
22 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/GameModeCategory.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model
2 |
3 | interface GameModeCategory {
4 | val gameMode: GameMode
5 | }
6 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/Language.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model
2 |
3 | @JvmInline
4 | value class Language(val value: String) {
5 | companion object {
6 | val ENGLISH = Language("en")
7 | }
8 |
9 | init {
10 | require(value.isNotEmpty()) { "Language value must not be empty" }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/TimestampWithValue.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model
2 |
3 | data class TimestampWithValue (
4 | val timestamp: Long,
5 | val value: T
6 | )
7 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/XP.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model
2 |
3 | typealias XP = Int
4 |
5 | typealias TimestampWithXP = TimestampWithValue
6 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/comparison_quiz/ComparisonMode.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model.comparison_quiz
2 |
3 | /**
4 | * Represents the comparison mode for a quiz question.
5 | */
6 | enum class ComparisonMode { GREATER, LESSER }
7 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/comparison_quiz/ComparisonQuizHelperValueState.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model.comparison_quiz
2 |
3 | /**
4 | * Represents the state of the helper value for the comparison quiz item.
5 | * @see ComparisonQuizItem
6 | */
7 | enum class ComparisonQuizHelperValueState {
8 | /**
9 | * The helper value is hidden.
10 | */
11 | HIDDEN,
12 |
13 | /**
14 | * The helper value is visible and has a normal state.
15 | */
16 | NORMAL
17 | }
18 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/comparison_quiz/ComparisonQuizItem.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model.comparison_quiz
2 |
3 | import androidx.annotation.Keep
4 | import java.net.URI
5 |
6 | @Keep
7 | data class ComparisonQuizItem(
8 | val title: String,
9 | val value: Double,
10 | val imgUri: URI
11 | )
12 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/comparison_quiz/ComparisonQuizItemEntity.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model.comparison_quiz
2 |
3 | import androidx.annotation.Keep
4 | import kotlinx.serialization.Serializable
5 |
6 | @Keep
7 | @Serializable
8 | data class ComparisonQuizItemEntity(
9 | val title: String,
10 | val value: Double = 0.0,
11 | val imgUrl: String
12 | ) : java.io.Serializable
13 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/multi_choice_quiz/MultiChoiceCategory.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model.multi_choice_quiz
2 |
3 | import androidx.annotation.Keep
4 | import com.infinitepower.newquiz.model.BaseCategory
5 | import com.infinitepower.newquiz.model.GameMode
6 | import com.infinitepower.newquiz.model.UiText
7 |
8 | @Keep
9 | data class MultiChoiceCategory(
10 | override val id: String,
11 | override val name: UiText,
12 | override val image: Any,
13 | override val requireInternetConnection: Boolean = true
14 | ) : BaseCategory {
15 | override val gameMode: GameMode = GameMode.MULTI_CHOICE
16 | }
17 |
18 | fun MultiChoiceCategory.toBaseCategory() = MultiChoiceBaseCategory.fromId(id)
19 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/multi_choice_quiz/MultiChoiceQuestionType.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model.multi_choice_quiz
2 |
3 | enum class MultiChoiceQuestionType { MULTIPLE, BOOLEAN }
4 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/multi_choice_quiz/QuestionLanguage.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model.multi_choice_quiz
2 |
3 | enum class QuestionLanguage { EN }
4 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/multi_choice_quiz/logo_quiz/LogoQuizBaseItem.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model.multi_choice_quiz.logo_quiz
2 |
3 | import androidx.annotation.Keep
4 | import kotlinx.serialization.SerialName
5 | import kotlinx.serialization.Serializable
6 |
7 | @Keep
8 | @Serializable
9 | data class LogoQuizBaseItem(
10 | val description: String,
11 | val name: String,
12 | @SerialName("img_url") val imgUrl: String,
13 | @SerialName("incorrect_answers") val incorrectAnswers: List,
14 | val difficulty: String
15 | )
16 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/multi_choice_quiz/saved/SortSavedQuestionsBy.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model.multi_choice_quiz.saved
2 |
3 | enum class SortSavedQuestionsBy {
4 | BY_DEFAULT,
5 | BY_DESCRIPTION,
6 | BY_CATEGORY
7 | }
8 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/number/NumberTriviaQuestion.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model.number
2 |
3 | import androidx.annotation.Keep
4 | import kotlinx.serialization.Serializable
5 |
6 | @Keep
7 | @Serializable
8 | data class NumberTriviaQuestion(
9 | val number: Int,
10 | val question: String
11 | ) : java.io.Serializable
12 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/regional_preferences/DistanceUnitType.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model.regional_preferences
2 |
3 | enum class DistanceUnitType {
4 | METRIC,
5 | IMPERIAL,
6 | }
7 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/regional_preferences/RegionalPreferences.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model.regional_preferences
2 |
3 | import java.util.Locale
4 |
5 | /** *
6 | * @param locale The locale of the user.
7 | */
8 | data class RegionalPreferences(
9 | val locale: Locale = Locale.getDefault(),
10 | val temperatureUnit: TemperatureUnit? = null,
11 | val distanceUnitType: DistanceUnitType? = null,
12 | )
13 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/wordle/WordleCategory.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model.wordle
2 |
3 | import androidx.annotation.Keep
4 | import com.infinitepower.newquiz.model.BaseCategory
5 | import com.infinitepower.newquiz.model.GameMode
6 | import com.infinitepower.newquiz.model.UiText
7 |
8 | @Keep
9 | data class WordleCategory(
10 | val wordleQuizType: WordleQuizType,
11 | override val id: String = wordleQuizType.name,
12 | override val name: UiText,
13 | override val image: Any,
14 | override val requireInternetConnection: Boolean = false
15 | ) : BaseCategory {
16 | override val gameMode: GameMode = GameMode.WORDLE
17 | }
18 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/wordle/WordleQuizType.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model.wordle
2 |
3 | enum class WordleQuizType {
4 | TEXT,
5 | NUMBER,
6 | MATH_FORMULA,
7 | NUMBER_TRIVIA
8 | }
9 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/wordle/WordleRowItem.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model.wordle
2 |
3 | @JvmInline
4 | value class WordleRowItem(
5 | val items: List
6 | ) {
7 | val isRowCorrect: Boolean
8 | get() = items.all { item -> item is WordleItem.Correct }
9 |
10 | val isRowCompleted: Boolean
11 | get() = items.all { item -> item.isCompleted }
12 |
13 | val isRowVerified: Boolean
14 | get() = items.all { item -> item.isVerified }
15 | }
16 |
17 | fun emptyRowItem(size: Int = 6): WordleRowItem = WordleRowItem(
18 | items = List(size) {
19 | WordleItem.Empty
20 | }
21 | )
22 |
--------------------------------------------------------------------------------
/model/src/main/java/com/infinitepower/newquiz/model/wordle/WordleWord.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.model.wordle
2 |
3 | import androidx.annotation.Keep
4 |
5 | @Keep
6 | data class WordleWord(
7 | val word: String,
8 | val textHelper: String? = null
9 | )
10 |
--------------------------------------------------------------------------------
/multi-choice-quiz/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/multi-choice-quiz/README.md:
--------------------------------------------------------------------------------
1 | # Multi choice quiz
2 |
3 | This is the code for the multi choice quiz game mode.
4 |
5 | 
--------------------------------------------------------------------------------
/multi-choice-quiz/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/multi-choice-quiz/consumer-rules.pro
--------------------------------------------------------------------------------
/multi-choice-quiz/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/multi-choice-quiz/src/main/java/com/infinitepower/newquiz/multi_choice_quiz/MultiChoiceQuizScreenUiEvent.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.multi_choice_quiz
2 |
3 | import com.infinitepower.newquiz.model.multi_choice_quiz.SelectedAnswer
4 |
5 | sealed class MultiChoiceQuizScreenUiEvent {
6 | data class SelectAnswer(val answer: SelectedAnswer) : MultiChoiceQuizScreenUiEvent()
7 |
8 | object VerifyAnswer : MultiChoiceQuizScreenUiEvent()
9 |
10 | object SaveQuestion : MultiChoiceQuizScreenUiEvent()
11 |
12 | object GetUserSkipQuestionDiamonds : MultiChoiceQuizScreenUiEvent()
13 |
14 | object CleanUserSkipQuestionDiamonds : MultiChoiceQuizScreenUiEvent()
15 |
16 | object SkipQuestion : MultiChoiceQuizScreenUiEvent()
17 | }
--------------------------------------------------------------------------------
/multi-choice-quiz/src/main/java/com/infinitepower/newquiz/multi_choice_quiz/saved_questions/SavedMultiChoiceQuestionsScreenNavigator.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.multi_choice_quiz.saved_questions
2 |
3 | import com.infinitepower.newquiz.model.multi_choice_quiz.MultiChoiceQuestion
4 |
5 | interface SavedQuestionsScreenNavigator {
6 | fun navigateToMultiChoiceQuiz(initialQuestions: ArrayList)
7 | }
8 |
9 | internal object SavedQuestionsScreenNavigatorPreview : SavedQuestionsScreenNavigator {
10 | override fun navigateToMultiChoiceQuiz(initialQuestions: ArrayList) {
11 | println("Navigating to quick quiz")
12 | }
13 | }
--------------------------------------------------------------------------------
/multi-choice-quiz/src/main/java/com/infinitepower/newquiz/multi_choice_quiz/saved_questions/SavedMultiChoiceQuestionsUiState.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.multi_choice_quiz.saved_questions
2 |
3 | import androidx.annotation.Keep
4 | import com.infinitepower.newquiz.model.multi_choice_quiz.MultiChoiceQuestion
5 |
6 | @Keep
7 | data class SavedMultiChoiceQuestionsUiState(
8 | val questions: List = emptyList(),
9 | val selectedQuestions: List = emptyList(),
10 | val loading: Boolean = true,
11 | val downloadingQuestions: Boolean = false
12 | ) {
13 | fun randomQuestions(limit: Int = 5): List {
14 | return questions.shuffled().take(limit)
15 | }
16 | }
--------------------------------------------------------------------------------
/multi-choice-quiz/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/pictures/NewQuiz-Promotion-green-night.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/pictures/NewQuiz-Promotion-green-night.png
--------------------------------------------------------------------------------
/pictures/NewQuiz-Promotion-purple-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/pictures/NewQuiz-Promotion-purple-light.png
--------------------------------------------------------------------------------
/pictures/comparison_quiz.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/pictures/comparison_quiz.jpg
--------------------------------------------------------------------------------
/pictures/multichoicequiz.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/pictures/multichoicequiz.jpg
--------------------------------------------------------------------------------
/pictures/wordle.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/pictures/wordle.jpg
--------------------------------------------------------------------------------
/wordle/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/wordle/README.md:
--------------------------------------------------------------------------------
1 | # Wordle
2 |
3 | This is the code for the wordle game mode.
4 |
5 | 
--------------------------------------------------------------------------------
/wordle/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/joaomanaia/newquiz/c6f3748ce80e0318a583f1785da728f7a3fdd0aa/wordle/consumer-rules.pro
--------------------------------------------------------------------------------
/wordle/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | -dontwarn java.lang.invoke.StringConcatFactory
--------------------------------------------------------------------------------
/wordle/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/wordle/src/main/java/com/infinitepower/newquiz/wordle/WordleScreenUiEvent.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.wordle
2 |
3 | sealed interface WordleScreenUiEvent {
4 | data class OnKeyClick(val key: Char) : WordleScreenUiEvent
5 |
6 | data class OnRemoveKeyClick(val index: Int) : WordleScreenUiEvent
7 |
8 | data object VerifyRow : WordleScreenUiEvent
9 |
10 | data object OnPlayAgainClick : WordleScreenUiEvent
11 | }
12 |
--------------------------------------------------------------------------------
/wordle/src/main/java/com/infinitepower/newquiz/wordle/list/WordleListUiState.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.wordle.list
2 |
3 | import androidx.annotation.Keep
4 | import com.infinitepower.newquiz.domain.repository.home.HomeCategories
5 | import com.infinitepower.newquiz.domain.repository.home.emptyHomeCategories
6 | import com.infinitepower.newquiz.model.category.ShowCategoryConnectionInfo
7 | import com.infinitepower.newquiz.model.wordle.WordleCategory
8 |
9 | @Keep
10 | data class WordleListUiState(
11 | val homeCategories: HomeCategories = emptyHomeCategories(),
12 | val internetConnectionAvailable: Boolean = true,
13 | val showCategoryConnectionInfo: ShowCategoryConnectionInfo = ShowCategoryConnectionInfo.NONE
14 | )
15 |
--------------------------------------------------------------------------------
/wordle/src/main/java/com/infinitepower/newquiz/wordle/util/InvalidWordErrorUiText.kt:
--------------------------------------------------------------------------------
1 | package com.infinitepower.newquiz.wordle.util
2 |
3 | import com.infinitepower.newquiz.data.repository.wordle.InvalidWordError
4 | import com.infinitepower.newquiz.model.UiText
5 | import com.infinitepower.newquiz.core.R as CoreR
6 |
7 | fun InvalidWordError.asUiText(): UiText {
8 | return when (this) {
9 | InvalidWordError.Empty -> UiText.StringResource(CoreR.string.empty_word)
10 | InvalidWordError.NotOnlyLetters -> UiText.StringResource(CoreR.string.word_not_only_letters_error)
11 | InvalidWordError.NotOnlyDigits -> UiText.StringResource(CoreR.string.word_not_only_digits_error)
12 | InvalidWordError.InvalidMathFormula -> UiText.StringResource(CoreR.string.word_invalid_math_formula_error)
13 | }
14 | }
15 |
--------------------------------------------------------------------------------