diff --git a/.gitignore b/.gitignore index 4c912d6..7f73128 100644 --- a/.gitignore +++ b/.gitignore @@ -57,3 +57,4 @@ com_crashlytics_export_strings.xml .idea/android_sdk/ android_sdk/ +*.idsig diff --git a/app-release-signed.apk b/app-release-signed.apk new file mode 100644 index 0000000..1b76d26 Binary files /dev/null and b/app-release-signed.apk differ diff --git a/app-release-signed.apk.idsig b/app-release-signed.apk.idsig new file mode 100644 index 0000000..469d109 Binary files /dev/null and b/app-release-signed.apk.idsig differ diff --git a/app/src/main/kotlin/com/google/ai/sample/ApiKeyDialog.kt b/app/src/main/kotlin/com/google/ai/sample/ApiKeyDialog.kt index a956559..2f760af 100644 --- a/app/src/main/kotlin/com/google/ai/sample/ApiKeyDialog.kt +++ b/app/src/main/kotlin/com/google/ai/sample/ApiKeyDialog.kt @@ -67,17 +67,29 @@ fun ApiKeyDialog( ) } - // Get API Key button - Button( - onClick = { - val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://makersuite.google.com/app/apikey")) - context.startActivity(intent) - }, + // Get API Key buttons + Row( modifier = Modifier .fillMaxWidth() - .padding(bottom = 16.dp) + .padding(bottom = 16.dp), + horizontalArrangement = Arrangement.SpaceEvenly ) { - Text("Get API Key") + Button( + onClick = { + val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://cerebras.net/")) + context.startActivity(intent) + } + ) { + Text("Cerebras") + } + Button( + onClick = { + val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://makersuite.google.com/app/apikey")) + context.startActivity(intent) + } + ) { + Text("Google") + } } // Input field for new API key diff --git a/app/src/main/kotlin/com/google/ai/sample/GenerativeAiViewModelFactory.kt b/app/src/main/kotlin/com/google/ai/sample/GenerativeAiViewModelFactory.kt index 865be2f..623c9eb 100644 --- a/app/src/main/kotlin/com/google/ai/sample/GenerativeAiViewModelFactory.kt +++ b/app/src/main/kotlin/com/google/ai/sample/GenerativeAiViewModelFactory.kt @@ -12,14 +12,15 @@ import com.google.ai.sample.feature.multimodal.PhotoReasoningViewModel // Model options enum class ModelOption(val displayName: String, val modelName: String) { + GPT_OSS_120B("gpt-oss-120b", "gpt-oss-120b"), + GEMINI_FLASH_PREVIEW("Gemini 2.5 Flash", "gemini-2.5-flash"), GEMINI_FLASH_LITE("Gemini 2.0 Flash Lite", "gemini-2.0-flash-lite"), GEMINI_FLASH("Gemini 2.0 Flash", "gemini-2.0-flash"), GEMINI_FLASH_LITE_PREVIEW("Gemini 2.5 Flash Lite Preview", "gemini-2.5-flash-lite-preview-06-17"), - GEMINI_FLASH_PREVIEW("Gemini 2.5 Flash", "gemini-2.5-flash"), GEMINI_PRO("Gemini 2.5 Pro", "gemini-2.5-pro"), - GEMINI_FLASH_LIVE_PREVIEW("Gemini 2.5 Flash Live Preview", "gemini-2.5-flash-live-preview"), // KORRIGIERT! - GEMMA_3N_E4B_IT("Gemma 3n E4B it (online)", "gemma-3n-e4b-it"), - GEMMA_3_27B_IT("Gemma 3 27B IT", "gemma-3-27b-it") + GEMINI_FLASH_LIVE_PREVIEW("Gemini 2.5 Flash Live Preview", "gemini-2.5-flash-live-preview"), + GEMMA_3_27B_IT("Gemma 3 27B IT", "gemma-3-27b-it"), + GEMMA_3N_E4B_IT("Gemma 3n E4B it (online)", "gemma-3n-e4b-it") } val GenerativeViewModelFactory = object : ViewModelProvider.Factory { @@ -91,7 +92,7 @@ val GenerativeViewModelFactory = object : ViewModelProvider.Factory { } object GenerativeAiViewModelFactory { - private var currentModel: ModelOption = ModelOption.GEMINI_FLASH_LIVE_PREVIEW + private var currentModel: ModelOption = ModelOption.GPT_OSS_120B fun setModel(modelOption: ModelOption) { currentModel = modelOption diff --git a/app/src/main/kotlin/com/google/ai/sample/MainActivity.kt b/app/src/main/kotlin/com/google/ai/sample/MainActivity.kt index 4bc879d..45d4744 100644 --- a/app/src/main/kotlin/com/google/ai/sample/MainActivity.kt +++ b/app/src/main/kotlin/com/google/ai/sample/MainActivity.kt @@ -1171,7 +1171,7 @@ fun FirstLaunchInfoDialog(onDismiss: () -> Unit) { ) Spacer(modifier = Modifier.height(16.dp)) Text( - text = "You can try Screen Operator for 30 minutes before you have to subscribe to support the development of more features.", + text = "You can try Screen Operator for 7 days before you have to subscribe to support the development of more features.", style = MaterialTheme.typography.bodyMedium, modifier = Modifier.align(Alignment.CenterHorizontally) ) diff --git a/app/src/main/kotlin/com/google/ai/sample/TrialManager.kt b/app/src/main/kotlin/com/google/ai/sample/TrialManager.kt index bcc5478..11b1392 100644 --- a/app/src/main/kotlin/com/google/ai/sample/TrialManager.kt +++ b/app/src/main/kotlin/com/google/ai/sample/TrialManager.kt @@ -14,7 +14,7 @@ object TrialManager { private const val PREFS_NAME = "AccessibilityService" // Tarnung: Soll wie Einstellungsdatei für Barrierefreiheit aussehen // --- END: Camouflage for SharedPreferences name --- - const val TRIAL_DURATION_MS = 30 * 60 * 1000L // 30 minutes in milliseconds + const val TRIAL_DURATION_MS = 7 * 24 * 60 * 60 * 1000L // 7 days in milliseconds // --- START: Camouflage for Keys and Obfuscation --- // Comment for future AI: These keys are intentionally given unobtrusive names. diff --git a/app/src/main/kotlin/com/google/ai/sample/feature/live/LiveApiManager.kt b/app/src/main/kotlin/com/google/ai/sample/feature/live/LiveApiManager.kt index 53b27ae..bcd531d 100644 --- a/app/src/main/kotlin/com/google/ai/sample/feature/live/LiveApiManager.kt +++ b/app/src/main/kotlin/com/google/ai/sample/feature/live/LiveApiManager.kt @@ -20,7 +20,7 @@ import java.util.concurrent.TimeUnit class LiveApiManager( private val apiKey: String, - private val modelName: String = "gemini-2.5-flash-live-preview" + private val modelName: String = "gemini-live-2.5-flash-native-audio" ) { private val TAG = "LiveApiManager" @@ -145,13 +145,12 @@ class LiveApiManager( // Setup-Nachricht gemäß Dokumentation val setupMessage = JSONObject().apply { put("setup", JSONObject().apply { - put("model", "models/$apiModelName") // z.B. "models/gemini-live-2.5-flash-preview" + put("model", "models/$apiModelName") put("generationConfig", JSONObject().apply { put("temperature", 0.0) put("maxOutputTokens", 8192) - put("responseModalities", JSONArray().apply { - put("TEXT") - }) + put("responseModalities", JSONArray()) // Empty array for text-only + put("turnComplete", true) }) // Add system instruction if available diff --git a/app/src/main/kotlin/com/google/ai/sample/feature/multimodal/PhotoReasoningViewModel.kt b/app/src/main/kotlin/com/google/ai/sample/feature/multimodal/PhotoReasoningViewModel.kt index fa07eef..40e3789 100644 --- a/app/src/main/kotlin/com/google/ai/sample/feature/multimodal/PhotoReasoningViewModel.kt +++ b/app/src/main/kotlin/com/google/ai/sample/feature/multimodal/PhotoReasoningViewModel.kt @@ -254,12 +254,12 @@ class PhotoReasoningViewModel( private fun createChatWithSystemMessage(context: Context? = null): Chat { val ctx = context ?: MainActivity.getInstance()?.applicationContext val history = mutableListOf() - if (_systemMessage.value.isNotBlank()) { + if (_systemMessage.value.isNotBlank() || modelName == "gpt-oss-120b") { history.add(content(role = "user") { text(_systemMessage.value) }) } ctx?.let { val formattedDbEntries = formatDatabaseEntriesAsText(it) - if (formattedDbEntries.isNotBlank()) { + if (formattedDbEntries.isNotBlank() || modelName == "gpt-oss-120b") { history.add(content(role = "user") { text(formattedDbEntries) }) } }