mirror of
https://github.com/AdrianKuta/KahootQuiz.git
synced 2025-09-14 17:24:21 +02:00
feat: Implement initial project structure and network layer
This commit introduces the foundational structure of the Kahoot Quiz application and implements the core network layer. Key changes include: - Added new Gradle modules: `core:network`, `domain`, `model:data`, and `ui:quiz`. - Configured Detekt for static code analysis in the new modules. - Implemented Retrofit and Gson for network communication and JSON parsing. - Defined DTOs for the Kahoot quiz API response, splitting them into logical files (QuizResponseDto, CommonDtos, CoverDtos, QuestionDtos, MetadataDtos, ContentTagsDto) for better organization. - Created `QuizApi` interface with a GET request for fetching quiz data. - Added `QuizService` interface and its initial implementation `QuizServiceImpl`. - Set up Hilt for dependency injection in the network module, providing Retrofit and QuizApi instances. - Included a `sample_quiz.json` file for testing and development. - Added unit tests (`QuizResponseDtoParsingTest`) to verify the correct parsing of the sample JSON into DTOs. - Updated `.gitignore` to exclude additional generated files and IDE specific folders. - Modified `settings.gradle.kts` to include the new modules. - Updated `app/build.gradle.kts` to include dependencies on the new `ui:quiz` and `model:data` modules and removed unused dependencies.
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -8,7 +8,7 @@
|
|||||||
/.idea/navEditor.xml
|
/.idea/navEditor.xml
|
||||||
/.idea/assetWizardSettings.xml
|
/.idea/assetWizardSettings.xml
|
||||||
.DS_Store
|
.DS_Store
|
||||||
/build
|
build/
|
||||||
/captures
|
/captures
|
||||||
.externalNativeBuild
|
.externalNativeBuild
|
||||||
.cxx
|
.cxx
|
||||||
@@ -17,3 +17,4 @@ local.properties
|
|||||||
# Project exclude paths
|
# Project exclude paths
|
||||||
/build-logic/convention/build/
|
/build-logic/convention/build/
|
||||||
/build-logic/convention/build/classes/kotlin/main/
|
/build-logic/convention/build/classes/kotlin/main/
|
||||||
|
/.idea/
|
||||||
|
BIN
Kahoot__-_App_Developer_Challenge.pdf
Normal file
BIN
Kahoot__-_App_Developer_Challenge.pdf
Normal file
Binary file not shown.
@@ -27,8 +27,10 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(projects.ui.quiz)
|
||||||
|
|
||||||
|
implementation(projects.model.data)
|
||||||
|
|
||||||
implementation(libs.androidx.activity.compose)
|
implementation(libs.androidx.activity.compose)
|
||||||
implementation(libs.androidx.core.splashscreen)
|
|
||||||
implementation(libs.androidx.hilt.navigation.compose)
|
implementation(libs.androidx.hilt.navigation.compose)
|
||||||
implementation(libs.app.update.ktx)
|
|
||||||
}
|
}
|
22
core/network/build.gradle.kts
Normal file
22
core/network/build.gradle.kts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
plugins {
|
||||||
|
alias(libs.plugins.kahootquiz.android.library)
|
||||||
|
alias(libs.plugins.kahootquiz.android.library.hilt)
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace = "dev.adriankuta.kahootquiz.core.network"
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
buildConfigField("String", "KAHOOT_BASE_URL", "\"https://create.kahoot.it\"")
|
||||||
|
}
|
||||||
|
|
||||||
|
buildFeatures {
|
||||||
|
buildConfig = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
// Gson for JSON serialization/deserialization
|
||||||
|
implementation(libs.retrofit)
|
||||||
|
implementation(libs.retrofit.converter.gson)
|
||||||
|
}
|
10
core/network/config/detekt/detekt.yml
Normal file
10
core/network/config/detekt/detekt.yml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Deviations from defaults
|
||||||
|
formatting:
|
||||||
|
TrailingCommaOnCallSite:
|
||||||
|
active: true
|
||||||
|
autoCorrect: true
|
||||||
|
useTrailingCommaOnCallSite: true
|
||||||
|
TrailingCommaOnDeclarationSite:
|
||||||
|
active: true
|
||||||
|
autoCorrect: true
|
||||||
|
useTrailingCommaOnDeclarationSite: true
|
@@ -0,0 +1,4 @@
|
|||||||
|
package dev.adriankuta.kahootquiz.core.network
|
||||||
|
|
||||||
|
interface QuizService {
|
||||||
|
}
|
@@ -0,0 +1,4 @@
|
|||||||
|
package dev.adriankuta.kahootquiz.core.network
|
||||||
|
|
||||||
|
internal class QuizServiceImpl: QuizService {
|
||||||
|
}
|
@@ -0,0 +1,29 @@
|
|||||||
|
package dev.adriankuta.kahootquiz.core.network.di
|
||||||
|
|
||||||
|
import dagger.Module
|
||||||
|
import dagger.Provides
|
||||||
|
import dagger.hilt.InstallIn
|
||||||
|
import dagger.hilt.components.SingletonComponent
|
||||||
|
import dev.adriankuta.kahootquiz.core.network.BuildConfig
|
||||||
|
import dev.adriankuta.kahootquiz.core.network.retrofit.QuizApi
|
||||||
|
import retrofit2.Retrofit
|
||||||
|
import retrofit2.converter.gson.GsonConverterFactory
|
||||||
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
@Module
|
||||||
|
@InstallIn(SingletonComponent::class)
|
||||||
|
object NetworkModule {
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
fun providesRetrofit(): Retrofit =
|
||||||
|
Retrofit.Builder()
|
||||||
|
.baseUrl(BuildConfig.KAHOOT_BASE_URL)
|
||||||
|
.addConverterFactory(GsonConverterFactory.create())
|
||||||
|
.build()
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
fun providesQuizApi(retrofit: Retrofit): QuizApi =
|
||||||
|
retrofit.create(QuizApi::class.java)
|
||||||
|
}
|
@@ -0,0 +1,20 @@
|
|||||||
|
package dev.adriankuta.kahootquiz.core.network.model
|
||||||
|
|
||||||
|
// Commonly reused DTOs
|
||||||
|
|
||||||
|
data class LanguageInfoDto(
|
||||||
|
val language: String?,
|
||||||
|
val lastUpdatedOn: Long?,
|
||||||
|
val readAloudSupported: Boolean?
|
||||||
|
)
|
||||||
|
|
||||||
|
// Minimal channel info
|
||||||
|
|
||||||
|
data class ChannelDto(val id: String?)
|
||||||
|
|
||||||
|
// Geometry helpers
|
||||||
|
|
||||||
|
data class PointDto(
|
||||||
|
val x: Int?,
|
||||||
|
val y: Int?
|
||||||
|
)
|
@@ -0,0 +1,8 @@
|
|||||||
|
package dev.adriankuta.kahootquiz.core.network.model
|
||||||
|
|
||||||
|
// Content tags DTOs
|
||||||
|
|
||||||
|
data class ContentTagsDto(
|
||||||
|
val curriculumCodes: List<String>?,
|
||||||
|
val generatedCurriculumCodes: List<String>?
|
||||||
|
)
|
@@ -0,0 +1,32 @@
|
|||||||
|
package dev.adriankuta.kahootquiz.core.network.model
|
||||||
|
|
||||||
|
// Cover metadata and related DTOs
|
||||||
|
|
||||||
|
data class CoverMetadataDto(
|
||||||
|
val id: String?,
|
||||||
|
val altText: String?,
|
||||||
|
val contentType: String?,
|
||||||
|
val origin: String?,
|
||||||
|
val externalRef: String?,
|
||||||
|
val resources: String?,
|
||||||
|
val width: Int?,
|
||||||
|
val height: Int?,
|
||||||
|
val extractedColors: List<ExtractedColorDto>?,
|
||||||
|
val blurhash: String?,
|
||||||
|
val crop: CropDto?
|
||||||
|
)
|
||||||
|
|
||||||
|
// Color extracted from cover image
|
||||||
|
|
||||||
|
data class ExtractedColorDto(
|
||||||
|
val swatch: String?,
|
||||||
|
val rgbHex: String?
|
||||||
|
)
|
||||||
|
|
||||||
|
// Crop descriptor
|
||||||
|
|
||||||
|
data class CropDto(
|
||||||
|
val origin: PointDto?,
|
||||||
|
val target: PointDto?,
|
||||||
|
val circular: Boolean?
|
||||||
|
)
|
@@ -0,0 +1,42 @@
|
|||||||
|
package dev.adriankuta.kahootquiz.core.network.model
|
||||||
|
|
||||||
|
// Metadata section DTOs
|
||||||
|
|
||||||
|
data class MetadataDto(
|
||||||
|
val access: AccessDto?,
|
||||||
|
val duplicationProtection: Boolean?,
|
||||||
|
val featuredListMemberships: List<FeaturedListMembershipDto>?,
|
||||||
|
val lastEdit: LastEditDto?,
|
||||||
|
val versionMetadata: VersionMetadataDto?
|
||||||
|
)
|
||||||
|
|
||||||
|
// Access settings
|
||||||
|
|
||||||
|
data class AccessDto(
|
||||||
|
val groupRead: List<String>?,
|
||||||
|
val folderGroupIds: List<String>?,
|
||||||
|
val features: List<String>?
|
||||||
|
)
|
||||||
|
|
||||||
|
// Featured list membership
|
||||||
|
|
||||||
|
data class FeaturedListMembershipDto(
|
||||||
|
val list: String?,
|
||||||
|
val addedAt: Long?
|
||||||
|
)
|
||||||
|
|
||||||
|
// Last edit information
|
||||||
|
|
||||||
|
data class LastEditDto(
|
||||||
|
val editorUserId: String?,
|
||||||
|
val editorUsername: String?,
|
||||||
|
val editTimestamp: Long?
|
||||||
|
)
|
||||||
|
|
||||||
|
// Version metadata
|
||||||
|
|
||||||
|
data class VersionMetadataDto(
|
||||||
|
val version: Int?,
|
||||||
|
val created: Long?,
|
||||||
|
val creator: String?
|
||||||
|
)
|
@@ -0,0 +1,81 @@
|
|||||||
|
package dev.adriankuta.kahootquiz.core.network.model
|
||||||
|
|
||||||
|
// Question and choice related DTOs
|
||||||
|
|
||||||
|
data class QuestionDto(
|
||||||
|
val type: String?,
|
||||||
|
val question: String?,
|
||||||
|
val time: Int?,
|
||||||
|
val points: Boolean?,
|
||||||
|
val pointsMultiplier: Int?,
|
||||||
|
val choices: List<ChoiceDto>?,
|
||||||
|
val layout: String?,
|
||||||
|
val image: String?,
|
||||||
|
val imageMetadata: ImageMetadataDto?,
|
||||||
|
val resources: String?,
|
||||||
|
val video: VideoDto?,
|
||||||
|
val questionFormat: Int?,
|
||||||
|
val languageInfo: LanguageInfoDto?,
|
||||||
|
val media: List<MediaItemDto>?,
|
||||||
|
val choiceRange: ChoiceRangeDto?
|
||||||
|
)
|
||||||
|
|
||||||
|
// Choice option
|
||||||
|
|
||||||
|
data class ChoiceDto(
|
||||||
|
val answer: String?,
|
||||||
|
val correct: Boolean?,
|
||||||
|
val languageInfo: LanguageInfoDto?
|
||||||
|
)
|
||||||
|
|
||||||
|
// Optional video attachment
|
||||||
|
|
||||||
|
data class VideoDto(
|
||||||
|
val id: String? = null,
|
||||||
|
val startTime: Int?,
|
||||||
|
val endTime: Int?,
|
||||||
|
val service: String?,
|
||||||
|
val fullUrl: String?
|
||||||
|
)
|
||||||
|
|
||||||
|
// Image metadata appearing in multiple places
|
||||||
|
|
||||||
|
data class ImageMetadataDto(
|
||||||
|
val id: String?,
|
||||||
|
val altText: String? = null,
|
||||||
|
val contentType: String?,
|
||||||
|
val origin: String? = null,
|
||||||
|
val externalRef: String? = null,
|
||||||
|
val resources: String? = null,
|
||||||
|
val width: Int? = null,
|
||||||
|
val height: Int? = null,
|
||||||
|
val effects: List<String>? = null,
|
||||||
|
val crop: CropDto? = null
|
||||||
|
)
|
||||||
|
|
||||||
|
// Generic media item on question
|
||||||
|
|
||||||
|
data class MediaItemDto(
|
||||||
|
val type: String?,
|
||||||
|
val zIndex: Int?,
|
||||||
|
val isColorOnly: Boolean?,
|
||||||
|
val id: String?,
|
||||||
|
val altText: String? = null,
|
||||||
|
val contentType: String?,
|
||||||
|
val origin: String? = null,
|
||||||
|
val externalRef: String? = null,
|
||||||
|
val resources: String? = null,
|
||||||
|
val width: Int? = null,
|
||||||
|
val height: Int? = null,
|
||||||
|
val crop: CropDto? = null
|
||||||
|
)
|
||||||
|
|
||||||
|
// Slider range for "slider" question type
|
||||||
|
|
||||||
|
data class ChoiceRangeDto(
|
||||||
|
val start: Int?,
|
||||||
|
val end: Int?,
|
||||||
|
val step: Int?,
|
||||||
|
val correct: Int?,
|
||||||
|
val tolerance: Int?
|
||||||
|
)
|
@@ -0,0 +1,10 @@
|
|||||||
|
package dev.adriankuta.kahootquiz.core.network.model
|
||||||
|
|
||||||
|
// This file used to contain all DTOs in one place.
|
||||||
|
// The DTOs have been split into separate files for maintainability:
|
||||||
|
// - QuizResponseDto.kt
|
||||||
|
// - CommonDtos.kt
|
||||||
|
// - CoverDtos.kt
|
||||||
|
// - QuestionDtos.kt
|
||||||
|
// - MetadataDtos.kt
|
||||||
|
// Keeping this file as a placeholder to avoid breaking any imports by file path (package remains the same).
|
@@ -0,0 +1,36 @@
|
|||||||
|
package dev.adriankuta.kahootquiz.core.network.model
|
||||||
|
|
||||||
|
import com.google.gson.annotations.SerializedName
|
||||||
|
|
||||||
|
// Root response for a Kahoot quiz details (network layer DTO)
|
||||||
|
data class QuizResponseDto(
|
||||||
|
val uuid: String?,
|
||||||
|
val language: String?,
|
||||||
|
val creator: String?,
|
||||||
|
@SerializedName("creator_username") val creatorUsername: String?,
|
||||||
|
val compatibilityLevel: Int?,
|
||||||
|
@SerializedName("creator_primary_usage") val creatorPrimaryUsage: String?,
|
||||||
|
val folderId: String?,
|
||||||
|
val themeId: String?,
|
||||||
|
val visibility: Int?,
|
||||||
|
val audience: String?,
|
||||||
|
val title: String?,
|
||||||
|
val description: String?,
|
||||||
|
val quizType: String?,
|
||||||
|
val cover: String?,
|
||||||
|
val coverMetadata: CoverMetadataDto?,
|
||||||
|
val questions: List<QuestionDto>?,
|
||||||
|
val contentTags: ContentTagsDto?,
|
||||||
|
val metadata: MetadataDto?,
|
||||||
|
val resources: String?,
|
||||||
|
val slug: String?,
|
||||||
|
val languageInfo: LanguageInfoDto?,
|
||||||
|
val inventoryItemIds: List<String>?,
|
||||||
|
val channels: List<ChannelDto>?,
|
||||||
|
val isValid: Boolean?,
|
||||||
|
val playAsGuest: Boolean?,
|
||||||
|
val hasRestrictedContent: Boolean?,
|
||||||
|
val type: String?,
|
||||||
|
val created: Long?,
|
||||||
|
val modified: Long?
|
||||||
|
)
|
@@ -0,0 +1,10 @@
|
|||||||
|
package dev.adriankuta.kahootquiz.core.network.retrofit
|
||||||
|
|
||||||
|
import dev.adriankuta.kahootquiz.core.network.model.QuizResponseDto
|
||||||
|
import retrofit2.http.GET
|
||||||
|
|
||||||
|
interface QuizApi {
|
||||||
|
|
||||||
|
@GET("/rest/kahoots/fb4054fc-6a71-463e-88cd-243876715bc1")
|
||||||
|
suspend fun getQuiz(): QuizResponseDto
|
||||||
|
}
|
@@ -0,0 +1,100 @@
|
|||||||
|
package dev.adriankuta.kahootquiz.core.network
|
||||||
|
|
||||||
|
import com.google.common.truth.Truth.assertThat
|
||||||
|
import com.google.gson.Gson
|
||||||
|
import dev.adriankuta.kahootquiz.core.network.model.QuizResponseDto
|
||||||
|
import org.junit.Test
|
||||||
|
import java.io.InputStreamReader
|
||||||
|
|
||||||
|
class QuizResponseDtoParsingTest {
|
||||||
|
|
||||||
|
private fun loadSample(): QuizResponseDto {
|
||||||
|
val stream = checkNotNull(javaClass.classLoader?.getResourceAsStream("sample_quiz.json")) {
|
||||||
|
"sample_quiz.json not found on test classpath"
|
||||||
|
}
|
||||||
|
stream.use { input ->
|
||||||
|
return Gson().fromJson(InputStreamReader(input), QuizResponseDto::class.java)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun parses_root_fields_correctly() {
|
||||||
|
val dto = loadSample()
|
||||||
|
|
||||||
|
assertThat(dto.uuid).isEqualTo("fb4054fc-6a71-463e-88cd-243876715bc1")
|
||||||
|
assertThat(dto.title).isEqualTo("Seven Wonders of the Ancient World")
|
||||||
|
assertThat(dto.creatorUsername).isEqualTo("KahootStudio")
|
||||||
|
assertThat(dto.creatorPrimaryUsage).isEqualTo("teacher")
|
||||||
|
assertThat(dto.quizType).isEqualTo("quiz")
|
||||||
|
assertThat(dto.isValid).isTrue()
|
||||||
|
assertThat(dto.playAsGuest).isTrue()
|
||||||
|
assertThat(dto.hasRestrictedContent).isFalse()
|
||||||
|
assertThat(dto.created).isGreaterThan(0)
|
||||||
|
assertThat(dto.modified).isGreaterThan(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun parses_cover_metadata_and_colors() {
|
||||||
|
val dto = loadSample()
|
||||||
|
val cover = checkNotNull(dto.coverMetadata)
|
||||||
|
assertThat(cover.id).isEqualTo("0b64142f-0624-4014-9f50-b65e6be93d8f")
|
||||||
|
assertThat(cover.contentType).isEqualTo("image/jpeg")
|
||||||
|
assertThat(cover.extractedColors).isNotNull()
|
||||||
|
assertThat(cover.extractedColors).hasSize(4)
|
||||||
|
assertThat(cover.extractedColors?.first()?.swatch).isEqualTo("VIBRANT")
|
||||||
|
assertThat(cover.blurhash).isNotNull()
|
||||||
|
val crop = checkNotNull(cover.crop)
|
||||||
|
assertThat(crop.circular).isFalse()
|
||||||
|
assertThat(crop.origin?.x).isEqualTo(227)
|
||||||
|
assertThat(crop.target?.y).isEqualTo(1299)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun parses_questions_and_choices() {
|
||||||
|
val dto = loadSample()
|
||||||
|
val questions = checkNotNull(dto.questions)
|
||||||
|
assertThat(questions).hasSize(12)
|
||||||
|
|
||||||
|
// First question true/false
|
||||||
|
val q1 = questions[0]
|
||||||
|
assertThat(q1.type).isEqualTo("quiz")
|
||||||
|
assertThat(q1.layout).isEqualTo("TRUE_FALSE")
|
||||||
|
assertThat(q1.choices).hasSize(2)
|
||||||
|
assertThat(q1.choices?.get(0)?.answer).isEqualTo("True")
|
||||||
|
assertThat(q1.choices?.get(0)?.correct).isTrue()
|
||||||
|
assertThat(q1.choices?.get(1)?.answer).isEqualTo("False")
|
||||||
|
assertThat(q1.choices?.get(1)?.correct).isFalse()
|
||||||
|
|
||||||
|
// Open ended question exists and has accepted answers
|
||||||
|
val openEnded = questions.first { it.type == "open_ended" }
|
||||||
|
assertThat(openEnded.choices).isNotNull()
|
||||||
|
val answers = openEnded.choices!!.map { it.answer }
|
||||||
|
assertThat(answers).containsAtLeast("Helios", "helios")
|
||||||
|
|
||||||
|
// Slider question has choiceRange
|
||||||
|
val slider = questions.first { it.type == "slider" }
|
||||||
|
val range = checkNotNull(slider.choiceRange)
|
||||||
|
assertThat(range.start).isEqualTo(0)
|
||||||
|
assertThat(range.end).isEqualTo(7)
|
||||||
|
assertThat(range.step).isEqualTo(1)
|
||||||
|
assertThat(range.correct).isEqualTo(1)
|
||||||
|
assertThat(range.tolerance).isEqualTo(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun parses_metadata_and_channels() {
|
||||||
|
val dto = loadSample()
|
||||||
|
val metadata = checkNotNull(dto.metadata)
|
||||||
|
assertThat(metadata.duplicationProtection).isTrue()
|
||||||
|
assertThat(metadata.featuredListMemberships).isNotNull()
|
||||||
|
assertThat(metadata.featuredListMemberships).isNotEmpty()
|
||||||
|
assertThat(metadata.versionMetadata?.version).isEqualTo(4)
|
||||||
|
assertThat(metadata.lastEdit?.editorUsername).isEqualTo("KahootStudio")
|
||||||
|
|
||||||
|
val channels = checkNotNull(dto.channels)
|
||||||
|
assertThat(channels).hasSize(1)
|
||||||
|
assertThat(channels.first().id).isEqualTo("247c3eb4-af80-4c1f-b006-558682c7bd2f")
|
||||||
|
|
||||||
|
assertThat(dto.languageInfo?.readAloudSupported).isTrue()
|
||||||
|
}
|
||||||
|
}
|
404
core/network/src/test/resources/sample_quiz.json
Normal file
404
core/network/src/test/resources/sample_quiz.json
Normal file
@@ -0,0 +1,404 @@
|
|||||||
|
{
|
||||||
|
"uuid": "fb4054fc-6a71-463e-88cd-243876715bc1",
|
||||||
|
"language": "English",
|
||||||
|
"creator": "4c1574ee-de54-40a2-be15-8d72b333afad",
|
||||||
|
"creator_username": "KahootStudio",
|
||||||
|
"compatibilityLevel": 27,
|
||||||
|
"creator_primary_usage": "teacher",
|
||||||
|
"folderId": "20915e7a-34d5-458b-91e9-2ed290484438",
|
||||||
|
"themeId": "ace311f1-2de4-450b-ba7d-d8a7a81705a5",
|
||||||
|
"visibility": 1,
|
||||||
|
"audience": "Social",
|
||||||
|
"title": "Seven Wonders of the Ancient World",
|
||||||
|
"description": "A geography quiz about the Seven Wonders of the Ancient World. See how much you know about these ancient buildings and monuments!\n#trivia #history #geography #sevenwonders",
|
||||||
|
"quizType": "quiz",
|
||||||
|
"cover": "https://media.kahoot.it/0b64142f-0624-4014-9f50-b65e6be93d8f",
|
||||||
|
"coverMetadata": {
|
||||||
|
"id": "0b64142f-0624-4014-9f50-b65e6be93d8f",
|
||||||
|
"altText": "The Pyramids, Giza, Egypt",
|
||||||
|
"contentType": "image/jpeg",
|
||||||
|
"origin": "Getty Images",
|
||||||
|
"externalRef": "1360795720",
|
||||||
|
"resources": "Nick Brundle Photography/Moment/Getty Images",
|
||||||
|
"width": 2309,
|
||||||
|
"height": 1299,
|
||||||
|
"extractedColors": [
|
||||||
|
{
|
||||||
|
"swatch": "VIBRANT",
|
||||||
|
"rgbHex": "#28a8d8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"swatch": "LIGHT_VIBRANT",
|
||||||
|
"rgbHex": "#88c8e0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"swatch": "DARK_VIBRANT",
|
||||||
|
"rgbHex": "#307890"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"swatch": "LIGHT_MUTED",
|
||||||
|
"rgbHex": "#d0d0c0"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"blurhash": "UuJ*#Qxtx]xaCAj[W=WqEma}M{R*M|WVn#j?",
|
||||||
|
"crop": {
|
||||||
|
"origin": {"x": 227, "y": 0},
|
||||||
|
"target": {"x": 1948, "y": 1299},
|
||||||
|
"circular": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"questions": [
|
||||||
|
{
|
||||||
|
"type": "quiz",
|
||||||
|
"question": "\u003Cb\u003ETrue or false: \u003C/b\u003EThe list of seven wonders is based on ancient Greek guidebooks for tourists.",
|
||||||
|
"time": 20000,
|
||||||
|
"points": true,
|
||||||
|
"pointsMultiplier": 1,
|
||||||
|
"choices": [
|
||||||
|
{"answer": "True", "correct": true, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "False", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}}
|
||||||
|
],
|
||||||
|
"layout": "TRUE_FALSE",
|
||||||
|
"image": "https://media.kahoot.it/b2709905-1c6e-45a0-9cc1-34c6580495e5",
|
||||||
|
"imageMetadata": {
|
||||||
|
"id": "b2709905-1c6e-45a0-9cc1-34c6580495e5",
|
||||||
|
"altText": "Old engraved illustration of bird's eye View of Alexandria, Egypt",
|
||||||
|
"contentType": "image/jpeg",
|
||||||
|
"origin": "Getty Images",
|
||||||
|
"externalRef": "1352146635",
|
||||||
|
"resources": "mikroman6/Moment/Getty Images",
|
||||||
|
"width": 2133,
|
||||||
|
"height": 1406
|
||||||
|
},
|
||||||
|
"resources": "mikroman6/Moment/Getty Images",
|
||||||
|
"video": {"startTime": 0, "endTime": 0, "service": "youtube", "fullUrl": ""},
|
||||||
|
"questionFormat": 0,
|
||||||
|
"languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true},
|
||||||
|
"media": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "quiz",
|
||||||
|
"question": "The Great Pyramid of Giza is the oldest of the wonders. What was its purpose?",
|
||||||
|
"time": 30000,
|
||||||
|
"points": true,
|
||||||
|
"pointsMultiplier": 1,
|
||||||
|
"choices": [
|
||||||
|
{"answer": "A monument to the god Ra", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "A tomb", "correct": true, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "A momument to a great war victory", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "A temple", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}}
|
||||||
|
],
|
||||||
|
"resources": "",
|
||||||
|
"video": {"startTime": 0, "endTime": 0, "service": "youtube", "fullUrl": ""},
|
||||||
|
"questionFormat": 0,
|
||||||
|
"languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true},
|
||||||
|
"media": [
|
||||||
|
{
|
||||||
|
"type": "background_image",
|
||||||
|
"zIndex": -1,
|
||||||
|
"isColorOnly": false,
|
||||||
|
"id": "0b64142f-0624-4014-9f50-b65e6be93d8f",
|
||||||
|
"altText": "The Pyramids, Giza, Egypt",
|
||||||
|
"contentType": "image/jpeg",
|
||||||
|
"origin": "Getty Images",
|
||||||
|
"externalRef": "1360795720",
|
||||||
|
"resources": "Nick Brundle Photography/Moment/Getty Images",
|
||||||
|
"width": 2309,
|
||||||
|
"height": 1299,
|
||||||
|
"crop": {"origin": {"x": 227, "y": 0}, "target": {"x": 1948, "y": 1299}, "circular": false}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "quiz",
|
||||||
|
"question": "Why were the Hanging Gardens of Babylon supposedly built?",
|
||||||
|
"time": 30000,
|
||||||
|
"points": true,
|
||||||
|
"pointsMultiplier": 1,
|
||||||
|
"choices": [
|
||||||
|
{"answer": "As a tourist destination", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "A monument to Ninurta, the god of farmers", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "An engagement gift from a king to his future queen", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "A gift for the king's wife", "correct": true, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}}
|
||||||
|
],
|
||||||
|
"image": "https://media.kahoot.it/7bce7efb-3d94-495c-905f-9c14190b7910",
|
||||||
|
"imageMetadata": {
|
||||||
|
"id": "7bce7efb-3d94-495c-905f-9c14190b7910",
|
||||||
|
"contentType": "image/*",
|
||||||
|
"resources": "https://upload.wikimedia.org/wikipedia/commons/a/ae/Hanging_Gardens_of_Babylon.jpg CC0",
|
||||||
|
"effects": []
|
||||||
|
},
|
||||||
|
"resources": "https://upload.wikimedia.org/wikipedia/commons/a/ae/Hanging_Gardens_of_Babylon.jpg CC0",
|
||||||
|
"video": {"startTime": 0, "endTime": 0, "service": "youtube", "fullUrl": ""},
|
||||||
|
"questionFormat": 0,
|
||||||
|
"languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true},
|
||||||
|
"media": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "quiz",
|
||||||
|
"question": "The Temple of Artemis was located in the city Ephesus. It's the territory of _____ today.",
|
||||||
|
"time": 30000,
|
||||||
|
"points": true,
|
||||||
|
"pointsMultiplier": 1,
|
||||||
|
"choices": [
|
||||||
|
{"answer": "Greece", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "Turkey", "correct": true, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "Syria", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "Iran", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}}
|
||||||
|
],
|
||||||
|
"image": "https://media.kahoot.it/f999f2a2-5450-4821-a3c8-94288720bd46",
|
||||||
|
"imageMetadata": {
|
||||||
|
"id": "f999f2a2-5450-4821-a3c8-94288720bd46",
|
||||||
|
"contentType": "image/*",
|
||||||
|
"resources": "Zee Prime at cs.wikipedia [GFDL (http://www.gnu.org/copyleft/fdl.html), CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0/) or CC BY-SA 2.5 (https://creativecommons.org/licenses/by-sa/2.5)], from Wikimedia Commons\nhttps://upload.wikimedia.org/wikipedia/commons/1/1d/Miniaturk_009.jpg",
|
||||||
|
"effects": []
|
||||||
|
},
|
||||||
|
"resources": "Zee Prime at cs.wikipedia [GFDL (http://www.gnu.org/copyleft/fdl.html), CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0/) or CC BY-SA 2.5 (https://creativecommons.org/licenses/by-sa/2.5)], from Wikimedia Commons\nhttps://upload.wikimedia.org/wikipedia/commons/1/1d/Miniaturk_009.jpg",
|
||||||
|
"video": {"startTime": 0, "endTime": 0, "service": "youtube", "fullUrl": ""},
|
||||||
|
"questionFormat": 0,
|
||||||
|
"languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true},
|
||||||
|
"media": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "quiz",
|
||||||
|
"question": "The second Temple of Artemis was burnt down by Herostratus. Why did he set the temple on fire?",
|
||||||
|
"time": 30000,
|
||||||
|
"points": true,
|
||||||
|
"pointsMultiplier": 1,
|
||||||
|
"choices": [
|
||||||
|
{"answer": "To become famous", "correct": true, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "It was an accident", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "He was angry at the gods", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "Because of a bet", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}}
|
||||||
|
],
|
||||||
|
"image": "https://media.kahoot.it/fe2c5c06-6d2e-4a5a-9441-a9c77391130e_opt",
|
||||||
|
"imageMetadata": {
|
||||||
|
"id": "fe2c5c06-6d2e-4a5a-9441-a9c77391130e",
|
||||||
|
"contentType": "image/*",
|
||||||
|
"resources": " [Public domain], via Wikimedia Commons\nhttps://upload.wikimedia.org/wikipedia/commons/a/a9/Temple_of_Artemis.jpg",
|
||||||
|
"effects": []
|
||||||
|
},
|
||||||
|
"resources": " [Public domain], via Wikimedia Commons\nhttps://upload.wikimedia.org/wikipedia/commons/a/a9/Temple_of_Artemis.jpg",
|
||||||
|
"video": {"id": "", "startTime": 0, "endTime": 0, "service": "youtube", "fullUrl": ""},
|
||||||
|
"questionFormat": 0,
|
||||||
|
"languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true},
|
||||||
|
"media": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "quiz",
|
||||||
|
"question": "The Statue of Zeus was built by the sculptor Phidias. Where was it located?",
|
||||||
|
"time": 30000,
|
||||||
|
"points": true,
|
||||||
|
"pointsMultiplier": 1,
|
||||||
|
"choices": [
|
||||||
|
{"answer": "Sparta", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "Athens", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "Olympia", "correct": true, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "Delphi", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}}
|
||||||
|
],
|
||||||
|
"image": "https://media.kahoot.it/9074a275-1874-4cb9-9c9f-248173ceae9d",
|
||||||
|
"imageMetadata": {
|
||||||
|
"id": "9074a275-1874-4cb9-9c9f-248173ceae9d",
|
||||||
|
"contentType": "image/*",
|
||||||
|
"resources": " [Public domain or Public domain], via Wikimedia Commons\nhttps://upload.wikimedia.org/wikipedia/commons/6/66/Le_Jupiter_Olympien_ou_l%27art_de_la_sculpture_antique.jpg",
|
||||||
|
"effects": [],
|
||||||
|
"crop": {"origin": {"x": 53, "y": 0}, "target": {"x": 577, "y": 866}, "circular": false}
|
||||||
|
},
|
||||||
|
"resources": " [Public domain or Public domain], via Wikimedia Commons\nhttps://upload.wikimedia.org/wikipedia/commons/6/66/Le_Jupiter_Olympien_ou_l%27art_de_la_sculpture_antique.jpg",
|
||||||
|
"video": {"startTime": 0, "endTime": 0, "service": "youtube", "fullUrl": ""},
|
||||||
|
"questionFormat": 0,
|
||||||
|
"languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true},
|
||||||
|
"media": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "quiz",
|
||||||
|
"question": "The Mausoleum at Halicarnassus was a tomb for a Persian governor. Who was buried there?",
|
||||||
|
"time": 20000,
|
||||||
|
"points": true,
|
||||||
|
"pointsMultiplier": 1,
|
||||||
|
"choices": [
|
||||||
|
{"answer": "Darius", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "Xerxes", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "Cyrus", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "Mausoleus", "correct": true, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}}
|
||||||
|
],
|
||||||
|
"image": "https://media.kahoot.it/38f43ef3-4507-4f11-ae33-f3e833a47d19",
|
||||||
|
"imageMetadata": {
|
||||||
|
"id": "38f43ef3-4507-4f11-ae33-f3e833a47d19",
|
||||||
|
"altText": "Yellow Question Mark on Purple Background, Paper Craft",
|
||||||
|
"contentType": "image/jpeg",
|
||||||
|
"origin": "Getty Images",
|
||||||
|
"externalRef": "1501192535",
|
||||||
|
"resources": "MirageC/Moment/Getty Images",
|
||||||
|
"width": 2120,
|
||||||
|
"height": 1414
|
||||||
|
},
|
||||||
|
"resources": "MirageC/Moment/Getty Images",
|
||||||
|
"video": {"startTime": 0, "endTime": 0, "service": "youtube", "fullUrl": ""},
|
||||||
|
"questionFormat": 0,
|
||||||
|
"languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true},
|
||||||
|
"media": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "open_ended",
|
||||||
|
"question": "The Colossus of Rhodes was 108 feet (33 metres) high. Which God was it based on?",
|
||||||
|
"time": 60000,
|
||||||
|
"pointsMultiplier": 2,
|
||||||
|
"choices": [
|
||||||
|
{"answer": "Helios", "correct": true, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "helios", "correct": true, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}}
|
||||||
|
],
|
||||||
|
"image": "https://media.kahoot.it/d4ccbf4e-1026-46ad-ab35-84dc17c4d3a0_opt",
|
||||||
|
"imageMetadata": {
|
||||||
|
"id": "d4ccbf4e-1026-46ad-ab35-84dc17c4d3a0",
|
||||||
|
"contentType": "image/*",
|
||||||
|
"resources": "By gravure sur bois de Sidney Barclay numérisée Google [Public domain], via Wikimedia Commons\nhttps://upload.wikimedia.org/wikipedia/commons/5/5f/Colosse_de_Rhodes_%28Barclay%29.jpg",
|
||||||
|
"effects": [],
|
||||||
|
"crop": {"origin": {"x": 49, "y": 83}, "target": {"x": 531, "y": 796}, "circular": false}
|
||||||
|
},
|
||||||
|
"resources": "By gravure sur bois de Sidney Barclay numérisée Google [Public domain], via Wikimedia Commons\nhttps://upload.wikimedia.org/wikipedia/commons/5/5f/Colosse_de_Rhodes_%28Barclay%29.jpg",
|
||||||
|
"video": {"id": "", "startTime": 0, "endTime": 0, "service": "youtube", "fullUrl": ""},
|
||||||
|
"questionFormat": 0,
|
||||||
|
"languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true},
|
||||||
|
"media": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "quiz",
|
||||||
|
"question": "The Lighthouse of Alexandria was destroyed in the 14th century. How?",
|
||||||
|
"time": 30000,
|
||||||
|
"points": true,
|
||||||
|
"pointsMultiplier": 1,
|
||||||
|
"choices": [
|
||||||
|
{"answer": "Fire", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "Earthquake", "correct": true, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "Tidal Wave", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "Storm", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}}
|
||||||
|
],
|
||||||
|
"image": "https://media.kahoot.it/e2d22765-942b-4dbd-9fd6-d71142d775c3",
|
||||||
|
"imageMetadata": {
|
||||||
|
"id": "e2d22765-942b-4dbd-9fd6-d71142d775c3",
|
||||||
|
"contentType": "image/*",
|
||||||
|
"resources": "Emad Victor SHENOUDA [Attribution], from Wikimedia Commons\nhttps://upload.wikimedia.org/wikipedia/commons/3/33/PHAROS2013-3000x2250.jpg",
|
||||||
|
"effects": [],
|
||||||
|
"crop": {"origin": {"x": 0, "y": 10}, "target": {"x": 1024, "y": 683}, "circular": false}
|
||||||
|
},
|
||||||
|
"resources": "Emad Victor SHENOUDA [Attribution], from Wikimedia Commons\nhttps://upload.wikimedia.org/wikipedia/commons/3/33/PHAROS2013-3000x2250.jpg",
|
||||||
|
"video": {"startTime": 0, "endTime": 0, "service": "youtube", "fullUrl": ""},
|
||||||
|
"questionFormat": 0,
|
||||||
|
"languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true},
|
||||||
|
"media": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "quiz",
|
||||||
|
"question": "Which of the seven wonders was the tallest?",
|
||||||
|
"time": 30000,
|
||||||
|
"points": true,
|
||||||
|
"pointsMultiplier": 1,
|
||||||
|
"choices": [
|
||||||
|
{"answer": "The Colossus of Rhodes", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "The Lighthouse of Alexandria", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "The Mausoleum at Halicarnassus", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "The Great Pyramid of Giza", "correct": true, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}}
|
||||||
|
],
|
||||||
|
"image": "https://media.kahoot.it/19382163-196f-495d-9a84-c2d8c3fd716c",
|
||||||
|
"imageMetadata": {
|
||||||
|
"id": "19382163-196f-495d-9a84-c2d8c3fd716c",
|
||||||
|
"contentType": "image/*",
|
||||||
|
"resources": "By The original uploader was Mark22 at English Wikipedia (Transferred from en.wikipedia to Commons.) [Public domain], via Wikimedia Commons\nhttps://upload.wikimedia.org/wikipedia/commons/b/b7/SevenWondersOfTheWorld.png",
|
||||||
|
"effects": [],
|
||||||
|
"crop": {"origin": {"x": 19, "y": 0}, "target": {"x": 491, "y": 736}, "circular": false}
|
||||||
|
},
|
||||||
|
"resources": "By The original uploader was Mark22 at English Wikipedia (Transferred from en.wikipedia to Commons.) [Public domain], via Wikimedia Commons\nhttps://upload.wikimedia.org/wikipedia/commons/b/b7/SevenWondersOfTheWorld.png",
|
||||||
|
"video": {"id": "", "startTime": 0, "endTime": 0, "service": "youtube", "fullUrl": ""},
|
||||||
|
"questionFormat": 0,
|
||||||
|
"languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true},
|
||||||
|
"media": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "slider",
|
||||||
|
"question": "How many of the Seven Wonders still exist?",
|
||||||
|
"time": 20000,
|
||||||
|
"pointsMultiplier": 2,
|
||||||
|
"choiceRange": {"start": 0, "end": 7, "step": 1, "correct": 1, "tolerance": 0},
|
||||||
|
"image": "https://media.kahoot.it/b431b3aa-4a46-49c9-b4ac-aa1dde40333f",
|
||||||
|
"imageMetadata": {
|
||||||
|
"id": "b431b3aa-4a46-49c9-b4ac-aa1dde40333f",
|
||||||
|
"contentType": "image/*",
|
||||||
|
"resources": "By Kandi [GFDL (http://www.gnu.org/copyleft/fdl.html) or CC BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0)], from Wikimedia Commons\nhttps://upload.wikimedia.org/wikipedia/commons/a/a4/Seven_Wonders_of_the_Ancient_World.png",
|
||||||
|
"effects": []
|
||||||
|
},
|
||||||
|
"resources": "By Kandi [GFDL (http://www.gnu.org/copyleft/fdl.html) or CC BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0)], from Wikimedia Commons\nhttps://upload.wikimedia.org/wikipedia/commons/a/a4/Seven_Wonders_of_the_Ancient_World.png",
|
||||||
|
"video": {"id": "", "startTime": 0, "endTime": 0, "service": "youtube", "fullUrl": ""},
|
||||||
|
"questionFormat": 0,
|
||||||
|
"languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true},
|
||||||
|
"media": []
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "quiz",
|
||||||
|
"question": "Which of the Seven Wonders is the only one that still exists?",
|
||||||
|
"time": 30000,
|
||||||
|
"points": true,
|
||||||
|
"pointsMultiplier": 1,
|
||||||
|
"choices": [
|
||||||
|
{"answer": "The Great Pyramid of Giza", "correct": true, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "The Temple of Artemis", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "The Mausoleum at Halicarnassus", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}},
|
||||||
|
{"answer": "The Colossus of Rhodes", "correct": false, "languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true}}
|
||||||
|
],
|
||||||
|
"image": "https://media.kahoot.it/34b01038-031c-4d23-b8a0-55402916586f_opt",
|
||||||
|
"imageMetadata": {
|
||||||
|
"id": "34b01038-031c-4d23-b8a0-55402916586f",
|
||||||
|
"contentType": "image/*",
|
||||||
|
"resources": "By Varios [CC BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons\nhttps://upload.wikimedia.org/wikipedia/commons/d/d6/Siete_maravillas_antiguas.jpg",
|
||||||
|
"effects": [],
|
||||||
|
"crop": {"origin": {"x": 19, "y": 0}, "target": {"x": 491, "y": 736}, "circular": false}
|
||||||
|
},
|
||||||
|
"resources": "By Varios [CC BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0)], via Wikimedia Commons\nhttps://upload.wikimedia.org/wikipedia/commons/d/d6/Siete_maravillas_antiguas.jpg",
|
||||||
|
"video": {"id": "", "startTime": 0, "endTime": 0, "service": "youtube", "fullUrl": ""},
|
||||||
|
"questionFormat": 0,
|
||||||
|
"languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true},
|
||||||
|
"media": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"contentTags": {"curriculumCodes": [], "generatedCurriculumCodes": []},
|
||||||
|
"metadata": {
|
||||||
|
"access": {
|
||||||
|
"groupRead": [
|
||||||
|
"b5c71d39-c229-4eeb-8648-cd8518ec068a",
|
||||||
|
"99159f29-7004-460b-a87a-cd4aab39ba4c",
|
||||||
|
"4597f49e-8b3b-40a5-985a-e6da01761947",
|
||||||
|
"ff2abab7-29f9-4669-8085-66e1089045a0",
|
||||||
|
"4caead57-3dd8-41c0-8f60-c5da69881b8e",
|
||||||
|
"36022fd9-43e1-4b36-9c98-a6a3b2b53038"
|
||||||
|
],
|
||||||
|
"folderGroupIds": [],
|
||||||
|
"features": ["PremiumEduContent"]
|
||||||
|
},
|
||||||
|
"duplicationProtection": true,
|
||||||
|
"featuredListMemberships": [
|
||||||
|
{"list": "youngfeatured", "addedAt": 1682336780289},
|
||||||
|
{"list": "featured", "addedAt": 1682336738189}
|
||||||
|
],
|
||||||
|
"lastEdit": {
|
||||||
|
"editorUserId": "4c1574ee-de54-40a2-be15-8d72b333afad",
|
||||||
|
"editorUsername": "KahootStudio",
|
||||||
|
"editTimestamp": 1727277651459
|
||||||
|
},
|
||||||
|
"versionMetadata": {
|
||||||
|
"version": 4,
|
||||||
|
"created": 1727277651160,
|
||||||
|
"creator": "4c1574ee-de54-40a2-be15-8d72b333afad"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"resources": "Nick Brundle Photography/Moment/Getty Images",
|
||||||
|
"slug": "seven-wonders-of-the-ancient-world",
|
||||||
|
"languageInfo": {"language": "en-US", "lastUpdatedOn": 1741920189202, "readAloudSupported": true},
|
||||||
|
"inventoryItemIds": [],
|
||||||
|
"channels": [{"id": "247c3eb4-af80-4c1f-b006-558682c7bd2f"}],
|
||||||
|
"isValid": true,
|
||||||
|
"playAsGuest": true,
|
||||||
|
"hasRestrictedContent": false,
|
||||||
|
"type": "quiz",
|
||||||
|
"created": 1527169083018,
|
||||||
|
"modified": 1754523196463
|
||||||
|
}
|
11
domain/build.gradle.kts
Normal file
11
domain/build.gradle.kts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
plugins {
|
||||||
|
alias(libs.plugins.kahootquiz.android.library)
|
||||||
|
alias(libs.plugins.kahootquiz.android.library.hilt)
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace = "dev.adriankuta.kahootquiz.domain"
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
}
|
10
domain/config/detekt/detekt.yml
Normal file
10
domain/config/detekt/detekt.yml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Deviations from defaults
|
||||||
|
formatting:
|
||||||
|
TrailingCommaOnCallSite:
|
||||||
|
active: true
|
||||||
|
autoCorrect: true
|
||||||
|
useTrailingCommaOnCallSite: true
|
||||||
|
TrailingCommaOnDeclarationSite:
|
||||||
|
active: true
|
||||||
|
autoCorrect: true
|
||||||
|
useTrailingCommaOnDeclarationSite: true
|
@@ -1,4 +1,5 @@
|
|||||||
[versions]
|
[versions]
|
||||||
|
retrofit = "3.0.0"
|
||||||
targetSdk = "36"
|
targetSdk = "36"
|
||||||
compileSdk = "36"
|
compileSdk = "36"
|
||||||
minSdk = "23"
|
minSdk = "23"
|
||||||
@@ -115,6 +116,8 @@ kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-
|
|||||||
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
|
material = { group = "com.google.android.material", name = "material", version.ref = "material" }
|
||||||
mockk-android = { module = "io.mockk:mockk-android", version.ref = "mockk" }
|
mockk-android = { module = "io.mockk:mockk-android", version.ref = "mockk" }
|
||||||
play-services-ads = { module = "com.google.android.gms:play-services-ads", version.ref = "playServicesAds" }
|
play-services-ads = { module = "com.google.android.gms:play-services-ads", version.ref = "playServicesAds" }
|
||||||
|
retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" }
|
||||||
|
retrofit-converter-gson = { group = "com.squareup.retrofit2", name = "converter-gson", version.ref = "retrofit" }
|
||||||
review-ktx = { module = "com.google.android.play:review-ktx", version.ref = "reviewKtx" }
|
review-ktx = { module = "com.google.android.play:review-ktx", version.ref = "reviewKtx" }
|
||||||
room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" }
|
room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" }
|
||||||
room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" }
|
room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" }
|
||||||
|
13
model/data/build.gradle.kts
Normal file
13
model/data/build.gradle.kts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
plugins {
|
||||||
|
alias(libs.plugins.kahootquiz.android.library)
|
||||||
|
alias(libs.plugins.kahootquiz.android.library.hilt)
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace = "dev.adriankuta.kahootquiz.model.data"
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(projects.core.network)
|
||||||
|
implementation(projects.domain)
|
||||||
|
}
|
10
model/data/config/detekt/detekt.yml
Normal file
10
model/data/config/detekt/detekt.yml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Deviations from defaults
|
||||||
|
formatting:
|
||||||
|
TrailingCommaOnCallSite:
|
||||||
|
active: true
|
||||||
|
autoCorrect: true
|
||||||
|
useTrailingCommaOnCallSite: true
|
||||||
|
TrailingCommaOnDeclarationSite:
|
||||||
|
active: true
|
||||||
|
autoCorrect: true
|
||||||
|
useTrailingCommaOnDeclarationSite: true
|
@@ -25,3 +25,7 @@ rootProject.name = "KahootQuiz"
|
|||||||
|
|
||||||
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
|
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
|
||||||
include(":app")
|
include(":app")
|
||||||
|
include(":core:network")
|
||||||
|
include(":domain")
|
||||||
|
include(":model:data")
|
||||||
|
include(":ui:quiz")
|
||||||
|
10
ui/config/detekt/detekt.yml
Normal file
10
ui/config/detekt/detekt.yml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Deviations from defaults
|
||||||
|
formatting:
|
||||||
|
TrailingCommaOnCallSite:
|
||||||
|
active: true
|
||||||
|
autoCorrect: true
|
||||||
|
useTrailingCommaOnCallSite: true
|
||||||
|
TrailingCommaOnDeclarationSite:
|
||||||
|
active: true
|
||||||
|
autoCorrect: true
|
||||||
|
useTrailingCommaOnDeclarationSite: true
|
12
ui/quiz/build.gradle.kts
Normal file
12
ui/quiz/build.gradle.kts
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
plugins {
|
||||||
|
alias(libs.plugins.kahootquiz.android.library.compose)
|
||||||
|
alias(libs.plugins.kahootquiz.android.library.hilt)
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
namespace = "dev.adriankuta.kahootquiz.ui.quiz"
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(projects.domain)
|
||||||
|
}
|
10
ui/quiz/config/detekt/detekt.yml
Normal file
10
ui/quiz/config/detekt/detekt.yml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Deviations from defaults
|
||||||
|
formatting:
|
||||||
|
TrailingCommaOnCallSite:
|
||||||
|
active: true
|
||||||
|
autoCorrect: true
|
||||||
|
useTrailingCommaOnCallSite: true
|
||||||
|
TrailingCommaOnDeclarationSite:
|
||||||
|
active: true
|
||||||
|
autoCorrect: true
|
||||||
|
useTrailingCommaOnDeclarationSite: true
|
Reference in New Issue
Block a user