Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
b4dee96
refactor(app): unify sync/async command action scaffolding
Android-PowerUser Mar 25, 2026
97c2151
refactor(app): expand command action scaffolding reuse
Android-PowerUser Mar 25, 2026
58ff335
Update app/src/main/kotlin/com/google/ai/sample/util/CoordinateParser.kt
Android-PowerUser Mar 25, 2026
34516a6
Add ApiKeyDialogSection wrapper in MainActivity
Android-PowerUser Mar 26, 2026
d9bd498
Merge pull request #61 from Android-PowerUser/codex/identify-technica…
Android-PowerUser Mar 26, 2026
f8be852
Migriere Billing pending purchases auf neue API
Android-PowerUser Mar 26, 2026
610d328
Merge pull request #62 from Android-PowerUser/codex/identify-technica…
Android-PowerUser Mar 26, 2026
aae238a
Revise README with updated Codex and build instructions
Android-PowerUser Mar 29, 2026
c2c6e2f
Update README.md
Android-PowerUser Mar 29, 2026
6df96c9
Update README.md
Android-PowerUser Mar 29, 2026
63136c2
Further decompose god classes with multi-concern extractions
Android-PowerUser Mar 29, 2026
5d0cadf
Update app/src/main/kotlin/com/google/ai/sample/AccessibilityCommandQ…
Android-PowerUser Mar 29, 2026
8c80c2f
Update app/src/main/kotlin/com/google/ai/sample/AccessibilityCommandQ…
Android-PowerUser Mar 29, 2026
5e70206
Update app/src/main/kotlin/com/google/ai/sample/AccessibilityCommandQ…
Android-PowerUser Mar 29, 2026
e0681f9
Merge pull request #63 from Android-PowerUser/identify-technical-debt…
Android-PowerUser Mar 29, 2026
f1e73d7
Extract BillingClient state checks from MainActivity
Android-PowerUser Mar 29, 2026
9514862
Fix Kotlin compile errors in photo reasoning modules
Android-PowerUser Mar 29, 2026
e87f0e9
Pin Gradle JVM to JDK 17 for Kotlin tooling compatibility
Android-PowerUser Mar 29, 2026
0f5ee9d
Increase Gradle daemon memory for stable local builds
Android-PowerUser Mar 29, 2026
6ded619
Merge pull request #64 from Android-PowerUser/refactor-god-classes-in…
Android-PowerUser Mar 30, 2026
01dbd82
Update README.md
Android-PowerUser Mar 30, 2026
2d78fef
Update AGENTS.md
Android-PowerUser Mar 30, 2026
61d16f6
Adjust Mistral retry scheduling for per-key 1.1s cooldown
Android-PowerUser Mar 30, 2026
3cbeac1
Update app/src/main/kotlin/com/google/ai/sample/feature/multimodal/Ph…
Android-PowerUser Mar 30, 2026
e89c450
Update app/src/main/kotlin/com/google/ai/sample/feature/multimodal/Ph…
Android-PowerUser Mar 30, 2026
d139fcc
[skip ci] Fix Mistral API retry logic and error handling
amazon-q-developer[bot] Mar 30, 2026
b080797
Merge pull request #65 from Android-PowerUser/plan-for-api-rate-limit…
Android-PowerUser Mar 30, 2026
7680d9b
Update AGENTS.md
Android-PowerUser Mar 30, 2026
9e66fa7
Add test comment block in AccessibilityCommandQueue.kt
Android-PowerUser Mar 30, 2026
a945a44
Fix corrupted Mistral retry block in view model
Android-PowerUser Mar 30, 2026
eb8520c
Merge pull request #67 from Android-PowerUser/fix-compilation-errors-…
Android-PowerUser Mar 30, 2026
4337661
Improve Mistral probe timing logic with Python runner
Android-PowerUser Mar 31, 2026
606b1e2
Merge pull request #68 from Android-PowerUser/fix-compilation-errors-…
Android-PowerUser Mar 31, 2026
8fe297e
Update PhotoReasoningViewModel.kt
Android-PowerUser Mar 31, 2026
8993e22
Honor Mistral server retry headers for cooldown scheduling
Android-PowerUser Mar 31, 2026
fe8b023
Merge branch 'codex/analyze-technical-debt-and-complexity-o6bm9p' int…
Android-PowerUser Mar 31, 2026
a772205
Merge pull request #69 from Android-PowerUser/fix-compilation-errors-…
Android-PowerUser Mar 31, 2026
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
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,19 @@
build/

# Local configuration file (sdk path, etc)
local.properties


# Log Files
*.log
build_log*.txt
build_errors*.txt
build_output*.txt
build_apk_log.txt
compile_error.txt
ho_build_result.txt
inspection_output.txt
signaling-server/node_modules/

# Android Studio Navigation editor files
.navigation/
Expand Down
7 changes: 4 additions & 3 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ plugins {
id("com.google.gms.google-services")
}

// Redirect build output to C: drive (NTFS) to avoid corrupted ExFAT build cache
if (System.getenv("CI") == null) {
layout.buildDirectory = file("C:/GradleBuild/app")
// Optional override for local build directory (e.g. external storage issues on specific setups).
// If not provided, Gradle default build directory is used.
System.getenv("SCREENOPERATOR_BUILD_DIR")?.takeIf { it.isNotBlank() }?.let { customBuildDir ->
layout.buildDirectory = file(customBuildDir)
}

android {
Expand Down
44 changes: 7 additions & 37 deletions app/src/main/kotlin/com/google/ai/sample/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ import com.google.ai.sample.feature.multimodal.PhotoReasoningRoute
import com.google.ai.sample.feature.multimodal.PhotoReasoningViewModel
import com.google.ai.sample.GenerativeAiViewModelFactory
import com.google.ai.sample.ui.theme.GenerativeAISample
import com.google.ai.sample.util.BroadcastReceiverCompat
import com.google.ai.sample.util.NotificationUtil
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
Expand Down Expand Up @@ -425,11 +426,7 @@ class MainActivity : ComponentActivity() {
addAction(TrialTimerService.ACTION_INTERNET_TIME_AVAILABLE)
}
Log.d(TAG, "onCreate: Registering trialStatusReceiver.")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
registerReceiver(trialStatusReceiver, intentFilter, RECEIVER_NOT_EXPORTED)
} else {
registerReceiver(trialStatusReceiver, intentFilter)
}
BroadcastReceiverCompat.register(this, trialStatusReceiver, intentFilter)
Log.d(TAG, "onCreate: trialStatusReceiver registered.")

Log.d(TAG, "onCreate: Performing initial trial state check. Calling TrialManager.getTrialState with null time (will use local time).")
Expand Down Expand Up @@ -721,20 +718,12 @@ class MainActivity : ComponentActivity() {
// Register screenshot request handler
Log.d(TAG, "Registering screenshotRequestHandler for ACTION_REQUEST_MEDIAPROJECTION_SCREENSHOT.")
val requestFilter = IntentFilter(ACTION_REQUEST_MEDIAPROJECTION_SCREENSHOT)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
registerReceiver(screenshotRequestHandler, requestFilter, Context.RECEIVER_NOT_EXPORTED)
} else {
registerReceiver(screenshotRequestHandler, requestFilter)
}
BroadcastReceiverCompat.register(this, screenshotRequestHandler, requestFilter)

// Register screenshot result handler
Log.d(TAG, "Registering screenshotResultHandler for ACTION_MEDIAPROJECTION_SCREENSHOT_CAPTURED.")
val resultFilter = IntentFilter(ACTION_MEDIAPROJECTION_SCREENSHOT_CAPTURED)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
registerReceiver(screenshotResultHandler, resultFilter, Context.RECEIVER_NOT_EXPORTED)
} else {
registerReceiver(screenshotResultHandler, resultFilter)
}
BroadcastReceiverCompat.register(this, screenshotResultHandler, resultFilter)

requestNotificationPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
if (isGranted) {
Expand Down Expand Up @@ -1187,28 +1176,9 @@ class MainActivity : ComponentActivity() {

stopScreenCaptureService() // Call to stop the service

// Unregister screenshot request handler (already there)
Log.d(TAG, "Unregistering screenshotRequestHandler.")
try {
unregisterReceiver(screenshotRequestHandler)
} catch (e: IllegalArgumentException) {
Log.w(TAG, "Screenshot request handler was not registered or already unregistered.", e)
}

// Unregister screenshot result handler (already there)
Log.d(TAG, "Unregistering screenshotResultHandler.")
try {
unregisterReceiver(screenshotResultHandler)
} catch (e: IllegalArgumentException) { Log.w(TAG, "Screenshot result handler was not registered or already unregistered.", e) }

// ... rest of existing onDestroy code (trialStatusReceiver, billingClient, etc.)
Log.d(TAG, "onDestroy: Unregistering trialStatusReceiver.")
try {
unregisterReceiver(trialStatusReceiver)
Log.d(TAG, "onDestroy: trialStatusReceiver unregistered successfully.")
} catch (e: IllegalArgumentException) {
Log.w(TAG, "onDestroy: trialStatusReceiver was not registered or already unregistered.", e)
}
BroadcastReceiverCompat.unregister(this, screenshotRequestHandler, "screenshotRequestHandler", TAG)
BroadcastReceiverCompat.unregister(this, screenshotResultHandler, "screenshotResultHandler", TAG)
BroadcastReceiverCompat.unregister(this, trialStatusReceiver, "trialStatusReceiver", TAG)

if (::billingClient.isInitialized && billingClient.isReady) {
Log.d(TAG, "onDestroy: BillingClient is initialized and ready. Ending connection.")
Expand Down
Loading