Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 45 additions & 1 deletion .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
workflow_dispatch:

# Ensure that only the latest commit is tested for PRs
Expand Down Expand Up @@ -142,3 +141,48 @@ jobs:
with:
name: test-reports-${{ matrix.api-level }}
path: '**/build/reports/androidTests'

jetpacker_build_test:
name: "JetPacker Build and Unit Tests"
runs-on: ubuntu-latest
timeout-minutes: 60
permissions:
contents: read
defaults:
run:
working-directory: jetpacker/android
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'

- name: Accept Android SDK licenses
run: yes | "${ANDROID_HOME}/cmdline-tools/latest/bin/sdkmanager" --licenses || true

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Grant execute permission for gradlew
run: chmod +x gradlew

- name: Build debug APK and run unit tests
run: ./gradlew assembleDebug testDebugUnitTest --no-configuration-cache

- name: Upload JetPacker build outputs (APKs)
if: ${{ !cancelled() }}
uses: actions/upload-artifact@v4
with:
name: jetpacker-APKs
path: 'jetpacker/android/**/build/outputs/apk/debug/*.apk'

- name: Upload JetPacker JVM local test results (XML)
if: ${{ !cancelled() }}
uses: actions/upload-artifact@v4
with:
name: jetpacker-local-test-results
path: 'jetpacker/android/**/build/test-results/test*UnitTest/TEST-*.xml'
1 change: 1 addition & 0 deletions jetpacker/android/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ dependencies {
implementation(project(":data:trips"))
implementation(project(":feature:appfunctions"))
implementation(libs.androidx.appfunctions)
implementation(project(":feature:assistant"))
implementation(project(":feature:create_trip"))
implementation(project(":feature:detail"))
implementation(project(":feature:detail:museum_assistant"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ package com.example.jetpacker.core.flags
import android.content.Context

object FeatureFlags {
const val KEY_DEMO_PRESET = "demo_preset"
const val PRESET_ADS_003 = "ads_003"
const val PRESET_DEMO_BOOTH = "demo_booth"
const val PRESET_CUSTOM = "custom"

const val KEY_DEMO_LANGUAGE = "demo_language"
const val KEY_OVERRIDE_CURRENT_TIME_MILLIS = "override_current_time_millis"
const val EXTRA_OVERRIDE_TIME = "override_time"
Expand All @@ -32,11 +37,54 @@ object FeatureFlags {
const val KEY_ENABLE_URL_GROUNDING = "enable_url_grounding"
const val KEY_ENABLE_SEARCH_GROUNDING = "enable_search_grounding"
const val KEY_ENABLE_BOOKING_ASSISTANT = "enable_booking_assistant"
const val KEY_ENABLE_TRAVEL_ASSISTANT = "enable_travel_assistant"
const val KEY_ENABLE_DOCUMENTS = "enable_documents"

private var appContext: Context? = null

fun initialize(context: Context) {
appContext = context.applicationContext
val prefs = appContext?.getSharedPreferences("debug_settings", Context.MODE_PRIVATE)
if (prefs != null && !prefs.contains(KEY_DEMO_PRESET)) {
applyPreset(context, PRESET_ADS_003)
}
}

fun applyPreset(context: Context, preset: String) {
val editor = context.getSharedPreferences("debug_settings", Context.MODE_PRIVATE).edit()
when (preset) {
PRESET_ADS_003 -> {
editor
.putString(KEY_DEMO_PRESET, PRESET_ADS_003)
.putBoolean(KEY_ENABLE_TRAVEL_ASSISTANT, true)
.putBoolean(KEY_ENABLE_EXPENSE_MANAGEMENT, true)
.putBoolean(KEY_ENABLE_ITINERARY_ENRICHMENT, false)
.putBoolean(KEY_ENABLE_TRIP_SUMMARY_AND_TIPS, false)
.putBoolean(KEY_ENABLE_VOICE_NOTES, false)
.putBoolean(KEY_ENABLE_DOCUMENTS, false)
.putBoolean(KEY_ENABLE_BOOKING_ASSISTANT, false)
.putBoolean(KEY_ENABLE_REVIEW_GENERATION, false)
.putBoolean(KEY_ENABLE_MUSEUM_ASSISTANT, false)
.putBoolean(KEY_ENABLE_URL_GROUNDING, false)
.putBoolean(KEY_ENABLE_SEARCH_GROUNDING, false)
}
PRESET_DEMO_BOOTH -> {
editor
.putString(KEY_DEMO_PRESET, PRESET_DEMO_BOOTH)
.putBoolean(KEY_ENABLE_TRAVEL_ASSISTANT, true)
.putBoolean(KEY_ENABLE_EXPENSE_MANAGEMENT, true)
.putBoolean(KEY_ENABLE_ITINERARY_ENRICHMENT, true)
.putBoolean(KEY_ENABLE_TRIP_SUMMARY_AND_TIPS, true)
.putBoolean(KEY_ENABLE_VOICE_NOTES, true)
.putBoolean(KEY_ENABLE_DOCUMENTS, true)
.putBoolean(KEY_ENABLE_BOOKING_ASSISTANT, true)
.putBoolean(KEY_ENABLE_REVIEW_GENERATION, true)
.putBoolean(KEY_ENABLE_MUSEUM_ASSISTANT, true)
.putBoolean(KEY_ENABLE_URL_GROUNDING, true)
.putBoolean(KEY_ENABLE_SEARCH_GROUNDING, true)
}
}
editor.apply()
}

private fun readFlag(keyName: String, defaultValue: Boolean): Boolean {
Expand All @@ -53,15 +101,18 @@ object FeatureFlags {
.getString(keyName, defaultValue) ?: defaultValue
}

val DEMO_PRESET: String
get() = readStringFlag(KEY_DEMO_PRESET, PRESET_ADS_003)

// Voice / Demo Language Settings
val DEFAULT_DEMO_LANGUAGE = "nl"
val DEFAULT_DEMO_LANGUAGE = "en"

val DEMO_LANGUAGE: String
get() = readStringFlag(KEY_DEMO_LANGUAGE, DEFAULT_DEMO_LANGUAGE)

// Existing flags
val ENABLE_TRIP_SUMMARY_AND_TIPS: Boolean
get() = readFlag(KEY_ENABLE_TRIP_SUMMARY_AND_TIPS, true)
get() = readFlag(KEY_ENABLE_TRIP_SUMMARY_AND_TIPS, false)

val ENABLE_SURPRISE_ME: Boolean
get() = readFlag(KEY_ENABLE_SURPRISE_ME, false)
Expand All @@ -74,23 +125,29 @@ object FeatureFlags {
get() = readFlag(KEY_ENABLE_EXPENSE_MANAGEMENT, true)

val ENABLE_VOICE_NOTES: Boolean
get() = readFlag(KEY_ENABLE_VOICE_NOTES, true)
get() = readFlag(KEY_ENABLE_VOICE_NOTES, false)

val ENABLE_DOCUMENTS: Boolean
get() = readFlag(KEY_ENABLE_DOCUMENTS, false)

// Online features
val ENABLE_REVIEW_GENERATION: Boolean
get() = readFlag(KEY_ENABLE_REVIEW_GENERATION, true)
get() = readFlag(KEY_ENABLE_REVIEW_GENERATION, false)

val ENABLE_MUSEUM_ASSISTANT: Boolean
get() = readFlag(KEY_ENABLE_MUSEUM_ASSISTANT, true)
get() = readFlag(KEY_ENABLE_MUSEUM_ASSISTANT, false)

val ENABLE_URL_GROUNDING: Boolean
get() = readFlag(KEY_ENABLE_URL_GROUNDING, true)
get() = readFlag(KEY_ENABLE_URL_GROUNDING, false)

val ENABLE_SEARCH_GROUNDING: Boolean
get() = readFlag(KEY_ENABLE_SEARCH_GROUNDING, true)
get() = readFlag(KEY_ENABLE_SEARCH_GROUNDING, false)

val ENABLE_BOOKING_ASSISTANT: Boolean
get() = readFlag(KEY_ENABLE_BOOKING_ASSISTANT, true)
get() = readFlag(KEY_ENABLE_BOOKING_ASSISTANT, false)

val ENABLE_TRAVEL_ASSISTANT: Boolean
get() = readFlag(KEY_ENABLE_TRAVEL_ASSISTANT, true)

private fun readLongFlag(keyName: String, defaultValue: Long): Long {
val context = appContext ?: return defaultValue
Expand All @@ -110,6 +167,7 @@ object FeatureFlags {
.getSharedPreferences("debug_settings", Context.MODE_PRIVATE)
.edit()
.putBoolean(keyName, value)
.putString(KEY_DEMO_PRESET, PRESET_CUSTOM)
.apply()
}

Expand Down
Loading
Loading