fix: IME layout, message dedup, animation order, and overlay input positioning
- ChatScreen: restructure to Box overlay layout so only input area rises with IME, messages stay fixed. Add opaque background to input area. Use reverseLayout with newest-first animation order. - OverlayContent: remove all manual IME detection — system forces adjust=pan on VoiceInteractionSession windows, so manual padding caused double offset. Let system handle IME naturally. - ChatRepositoryImpl: add messageRemovals flow to clean up wrapping stream_end/response when review/multi_message items arrive later. Track lastResponseId in both stream_end and response handlers. - ChatViewModel/OverlayViewModel: fix dedup to check by message ID only. Sort descending (newest first). Observe messageRemovals. - NavGraph: keep all tabs composed with graphicsLayer alpha toggle — prevents ChatScreen destruction and re-render on tab switch. - CyreneVoiceInteractionSession: defer configureWindow via post() to override system softInputMode flags. - AndroidManifest: set windowSoftInputMode=adjustNothing on main activity. - Add WebSocketKeepAliveService for background connection persistence. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Vendored
+29
@@ -11,7 +11,14 @@
|
||||
-keepattributes Signature
|
||||
-keepattributes InnerClasses
|
||||
-keepattributes EnclosingMethod
|
||||
-keepattributes RuntimeVisibleAnnotations
|
||||
-keepattributes RuntimeVisibleParameterAnnotations
|
||||
-keepattributes AnnotationDefault
|
||||
-keepattributes KotlinMetadata
|
||||
-dontwarn kotlin.**
|
||||
-keep class kotlin.Metadata { *; }
|
||||
-keep class kotlin.coroutines.Continuation
|
||||
-keep class kotlinx.coroutines.** { *; }
|
||||
|
||||
# --- Retrofit ---
|
||||
-keep class retrofit2.** { *; }
|
||||
@@ -63,6 +70,28 @@
|
||||
# --- Keep PreferencesDataStore (Koin injects) ---
|
||||
-keep class top.yeij.cyrene.data.local.PreferencesDataStore { *; }
|
||||
|
||||
# --- Keep utility classes (VoiceRecorder, RuntimeLog, etc. — injected by Koin) ---
|
||||
-keep class top.yeij.cyrene.util.** { *; }
|
||||
-keepclassmembers class top.yeij.cyrene.util.** { *; }
|
||||
|
||||
# --- Keep voice/TTS/STT classes (injected by Koin into OverlayViewModel) ---
|
||||
-keep class top.yeij.cyrene.voice.** { *; }
|
||||
-keepclassmembers class top.yeij.cyrene.voice.** { *; }
|
||||
|
||||
# --- Keep domain use cases (injected by Koin into ViewModels) ---
|
||||
-keep class top.yeij.cyrene.domain.usecase.** { *; }
|
||||
-keepclassmembers class top.yeij.cyrene.domain.usecase.** { *; }
|
||||
|
||||
# --- Keep network interceptors and ApiService (Koin singletons) ---
|
||||
-keep class top.yeij.cyrene.data.remote.RetrofitClient { *; }
|
||||
-keep class top.yeij.cyrene.data.remote.ApiService { *; }
|
||||
-keep class top.yeij.cyrene.data.remote.AuthInterceptor { *; }
|
||||
-keep class top.yeij.cyrene.data.remote.DynamicUrlInterceptor { *; }
|
||||
-keep class top.yeij.cyrene.data.remote.TokenAuthenticator { *; }
|
||||
|
||||
# --- Keep WebSocketService (injected into ChatRepositoryImpl) ---
|
||||
-keep class top.yeij.cyrene.service.WebSocketService { *; }
|
||||
|
||||
# --- General AndroidX ---
|
||||
-keep class androidx.lifecycle.** { *; }
|
||||
-dontwarn androidx.lifecycle.**
|
||||
|
||||
Reference in New Issue
Block a user