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
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
10 changes: 10 additions & 0 deletions jetpacker/android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,16 @@
<property
android:name="android.app.appfunctions.app_metadata"
android:resource="@xml/app_metadata" />

<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>

</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import android.hardware.SensorManager
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.SystemBarStyle
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize
Expand All @@ -45,7 +46,10 @@ import dagger.hilt.android.AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
enableEdgeToEdge(
statusBarStyle = SystemBarStyle.dark(android.graphics.Color.TRANSPARENT),
navigationBarStyle = SystemBarStyle.dark(android.graphics.Color.TRANSPARENT),
)
handleFeatureFlags()

setContent {
Expand Down
24 changes: 23 additions & 1 deletion jetpacker/android/app/src/main/res/values-night/colors.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,27 @@
-->

<resources>
<color name="window_background">#141412</color>
<color name="window_background">#131314</color>

<!-- View-system mirror of the Compose ADS26 palette in core/ui Color.kt (dark). -->
<color name="jp_primary">#FF01AF57</color>
<color name="jp_on_primary">#FF061B0E</color>
<color name="jp_primary_container">#FF0A3D22</color>
<color name="jp_on_primary_container">#FFB9F6CA</color>
<color name="jp_secondary">#FF26C6DA</color>
<color name="jp_on_secondary">#FF052329</color>
<color name="jp_secondary_container">#FF183A9C</color>
<color name="jp_on_secondary_container">#FFD0E4FF</color>
<color name="jp_tertiary">#FF3DDC84</color>
<color name="jp_on_tertiary">#FF061B0E</color>
<color name="jp_error">#FFFF6E6E</color>
<color name="jp_on_error">#FF3B080A</color>
<color name="jp_error_container">#FF4A151B</color>
<color name="jp_surface">#FF131314</color>
<color name="jp_on_surface">#FFFFFFFF</color>
<color name="jp_surface_variant">#FF22262B</color>
<color name="jp_on_surface_variant">#FFC4C7C5</color>
<color name="jp_outline">#FF01AF57</color>
<color name="jp_outline_variant">#FF2A3038</color>
<color name="jp_surface_container">#FF1E2226</color>
</resources>
26 changes: 24 additions & 2 deletions jetpacker/android/app/src/main/res/values/colors.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,27 @@
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
<color name="window_background">#FCF8E5</color>
</resources>
<color name="window_background">#131314</color>

<!-- View-system mirror of the Compose ADS26 palette in core/ui Color.kt. -->
<color name="jp_primary">#FF01AF57</color>
<color name="jp_on_primary">#FF061B0E</color>
<color name="jp_primary_container">#FF0A3D22</color>
<color name="jp_on_primary_container">#FFB9F6CA</color>
<color name="jp_secondary">#FF26C6DA</color>
<color name="jp_on_secondary">#FF052329</color>
<color name="jp_secondary_container">#FF183A9C</color>
<color name="jp_on_secondary_container">#FFD0E4FF</color>
<color name="jp_tertiary">#FF3DDC84</color>
<color name="jp_on_tertiary">#FF061B0E</color>
<color name="jp_error">#FFFF6E6E</color>
<color name="jp_on_error">#FF3B080A</color>
<color name="jp_error_container">#FF4A151B</color>
<color name="jp_surface">#FF131314</color>
<color name="jp_on_surface">#FFFFFFFF</color>
<color name="jp_surface_variant">#FF22262B</color>
<color name="jp_on_surface_variant">#FFC4C7C5</color>
<color name="jp_outline">#FF01AF57</color>
<color name="jp_outline_variant">#FF2A3038</color>
<color name="jp_surface_container">#FF1E2226</color>
</resources>
2 changes: 1 addition & 1 deletion jetpacker/android/app/src/main/res/values/themes.xml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
-->

<resources>
<style name="Theme.JetPacker" parent="Theme.MaterialComponents.Light">
<style name="Theme.JetPacker" parent="Theme.MaterialComponents.NoActionBar">
<item name="windowSplashScreenBackground">@color/window_background</item>
<item name="android:windowBackground">@color/window_background</item>
</style>
Expand Down
20 changes: 20 additions & 0 deletions jetpacker/android/app/src/main/res/xml/file_paths.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2026 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<paths>
<cache-path name="camera_captures" path="camera_captures/" />
<files-path name="documents" path="travel_documents/" />
</paths>
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,66 @@ 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"

const val KEY_BOOKING_BACKEND_MODE = "booking_backend_mode"
const val BOOKING_BACKEND_MODE_MOCK = "mock"
const val BOOKING_BACKEND_MODE_LIVE = "live"

const val KEY_BACKEND_URL = "backend_url"
const val CLOUD_RUN_BACKEND_URL =
"https://jetpacker-server-348872485807.us-central1.run.app"
const val LOCAL_BACKEND_URL = "http://localhost:8000"
const val DEFAULT_BACKEND_URL = CLOUD_RUN_BACKEND_URL

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_DEMO_BOOTH)
}
}

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)
.putString(KEY_BOOKING_BACKEND_MODE, BOOKING_BACKEND_MODE_LIVE)
.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)
.putString(KEY_BOOKING_BACKEND_MODE, BOOKING_BACKEND_MODE_LIVE)
.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,8 +113,11 @@ object FeatureFlags {
.getString(keyName, defaultValue) ?: defaultValue
}

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

// 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)
Expand All @@ -76,6 +139,9 @@ object FeatureFlags {
val ENABLE_VOICE_NOTES: Boolean
get() = readFlag(KEY_ENABLE_VOICE_NOTES, true)

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

// Online features
val ENABLE_REVIEW_GENERATION: Boolean
get() = readFlag(KEY_ENABLE_REVIEW_GENERATION, true)
Expand All @@ -92,6 +158,15 @@ object FeatureFlags {
val ENABLE_BOOKING_ASSISTANT: Boolean
get() = readFlag(KEY_ENABLE_BOOKING_ASSISTANT, true)

val BOOKING_BACKEND_MODE: String
get() = readStringFlag(KEY_BOOKING_BACKEND_MODE, BOOKING_BACKEND_MODE_LIVE)

val BACKEND_URL: String
get() = readStringFlag(KEY_BACKEND_URL, DEFAULT_BACKEND_URL)

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
return context
Expand All @@ -110,6 +185,7 @@ object FeatureFlags {
.getSharedPreferences("debug_settings", Context.MODE_PRIVATE)
.edit()
.putBoolean(keyName, value)
.putString(KEY_DEMO_PRESET, PRESET_CUSTOM)
.apply()
}

Expand Down
Loading
Loading