Files
cam_control_android/.idea/copilotDiffState.xml
2025-12-03 19:39:42 +09:00

35 lines
24 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CopilotDiffPersistence">
<option name="pendingDiffs">
<map>
<entry key="$PROJECT_DIR$/app/src/main/java/com/example/camcontrol/CameraManager.kt">
<value>
<PendingDiffInfo>
<option name="filePath" value="$PROJECT_DIR$/app/src/main/java/com/example/camcontrol/CameraManager.kt" />
<option name="originalContent" value="package com.example.camcontrol&#10;&#10;import android.content.Context&#10;import android.util.Log&#10;import androidx.camera.core.CameraSelector&#10;import androidx.camera.core.ImageCapture&#10;import androidx.camera.core.ImageCaptureException&#10;import androidx.camera.core.Preview&#10;import androidx.camera.lifecycle.ProcessCameraProvider&#10;import androidx.core.content.ContextCompat&#10;import androidx.lifecycle.LifecycleOwner&#10;import com.google.common.util.concurrent.ListenableFuture&#10;import java.util.concurrent.Executors&#10;&#10;class CameraManager(private val context: Context) {&#10;&#10; private var cameraProvider: ProcessCameraProvider? = null&#10; private var imageCapture: ImageCapture? = null&#10; private val cameraExecutor = Executors.newSingleThreadExecutor()&#10;&#10; fun startCamera(&#10; lifecycleOwner: LifecycleOwner,&#10; previewSurfaceProvider: (Preview.SurfaceProvider) -&gt; Unit,&#10; onError: (String) -&gt; Unit&#10; ) {&#10; val cameraProviderFuture = ProcessCameraProvider.getInstance(context)&#10;&#10; cameraProviderFuture.addListener(&#10; {&#10; try {&#10; cameraProvider = cameraProviderFuture.get()&#10;&#10; // Create preview&#10; val preview = Preview.Builder()&#10; .build()&#10; .also {&#10; it.setSurfaceProvider { surfaceProvider -&gt;&#10; previewSurfaceProvider(surfaceProvider)&#10; }&#10; }&#10;&#10; // Create image capture&#10; imageCapture = ImageCapture.Builder()&#10; .setTargetRotation(android.view.Surface.ROTATION_0)&#10; .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)&#10; .build()&#10;&#10; // Select back camera&#10; val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA&#10;&#10; // Unbind all use cases&#10; cameraProvider?.unbindAll()&#10;&#10; // Bind use cases to camera&#10; cameraProvider?.bindToLifecycle(&#10; lifecycleOwner,&#10; cameraSelector,&#10; preview,&#10; imageCapture&#10; )&#10;&#10; Log.d(&quot;CameraManager&quot;, &quot;Camera started successfully&quot;)&#10; } catch (exc: Exception) {&#10; Log.e(&quot;CameraManager&quot;, &quot;Use case binding failed&quot;, exc)&#10; onError(&quot;Failed to start camera: ${exc.message}&quot;)&#10; }&#10; },&#10; ContextCompat.getMainExecutor(context)&#10; )&#10; }&#10;&#10; fun captureFrame(onFrameCaptured: (ByteArray) -&gt; Unit, onError: (String) -&gt; Unit) {&#10; val imageCapture = imageCapture ?: return&#10;&#10; val outputOptions = ImageCapture.OutputFileOptions.Builder(&#10; context.contentResolver,&#10; android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,&#10; android.content.ContentValues().apply {&#10; put(android.provider.MediaStore.MediaColumns.DISPLAY_NAME, System.currentTimeMillis())&#10; put(android.provider.MediaStore.MediaColumns.MIME_TYPE, &quot;image/jpeg&quot;)&#10; }&#10; ).build()&#10;&#10; imageCapture.takePicture(&#10; outputOptions,&#10; cameraExecutor,&#10; object : ImageCapture.OnImageSavedCallback {&#10; override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {&#10; Log.d(&quot;CameraManager&quot;, &quot;Image captured successfully&quot;)&#10; }&#10;&#10; override fun onError(exception: ImageCaptureException) {&#10; Log.e(&quot;CameraManager&quot;, &quot;Image capture failed: ${exception.message}&quot;)&#10; onError(&quot;Failed to capture image: ${exception.message}&quot;)&#10; }&#10; }&#10; )&#10; }&#10;&#10; fun stopCamera() {&#10; try {&#10; cameraProvider?.unbindAll()&#10; cameraExecutor.shutdown()&#10; Log.d(&quot;CameraManager&quot;, &quot;Camera stopped&quot;)&#10; } catch (exc: Exception) {&#10; Log.e(&quot;CameraManager&quot;, &quot;Error stopping camera&quot;, exc)&#10; }&#10; }&#10;}&#10;&#10;" />
<option name="updatedContent" value="package com.example.camcontrol&#10;&#10;import android.content.Context&#10;import android.util.Log&#10;import androidx.camera.core.CameraSelector&#10;import androidx.camera.core.ImageCapture&#10;import androidx.camera.core.ImageCaptureException&#10;import androidx.camera.core.Preview&#10;import androidx.camera.lifecycle.ProcessCameraProvider&#10;import androidx.core.content.ContextCompat&#10;import androidx.lifecycle.LifecycleOwner&#10;import com.google.common.util.concurrent.ListenableFuture&#10;import java.util.concurrent.Executors&#10;&#10;class CameraManager(private val context: Context) {&#10;&#10; private var cameraProvider: ProcessCameraProvider? = null&#10; private var imageCapture: ImageCapture? = null&#10; private val cameraExecutor = Executors.newSingleThreadExecutor()&#10;&#10; fun startCamera(&#10; lifecycleOwner: LifecycleOwner,&#10; previewSurfaceProvider: (Preview.SurfaceProvider) -&gt; Unit,&#10; onError: (String) -&gt; Unit&#10; ) {&#10; val cameraProviderFuture = ProcessCameraProvider.getInstance(context)&#10; &#10; cameraProviderFuture.addListener(&#10; {&#10; try {&#10; cameraProvider = cameraProviderFuture.get()&#10; &#10; // Create preview&#10; val preview = Preview.Builder()&#10; .build()&#10; .apply {&#10; setSurfaceProvider { surfaceProvider -&gt;&#10; previewSurfaceProvider(surfaceProvider)&#10; }&#10; }&#10;&#10; // Create image capture&#10; imageCapture = ImageCapture.Builder()&#10; .setTargetRotation(android.view.Surface.ROTATION_0)&#10; .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)&#10; .build()&#10;&#10; // Select back camera&#10; val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA&#10;&#10; // Unbind all use cases&#10; cameraProvider?.unbindAll()&#10;&#10; // Bind use cases to camera&#10; cameraProvider?.bindToLifecycle(&#10; lifecycleOwner,&#10; cameraSelector,&#10; preview,&#10; imageCapture&#10; )&#10;&#10; Log.d(&quot;CameraManager&quot;, &quot;Camera started successfully&quot;)&#10; } catch (exc: Exception) {&#10; Log.e(&quot;CameraManager&quot;, &quot;Use case binding failed&quot;, exc)&#10; onError(&quot;Failed to start camera: ${exc.message}&quot;)&#10; }&#10; },&#10; ContextCompat.getMainExecutor(context)&#10; )&#10; }&#10;&#10; fun captureFrame(onFrameCaptured: (ByteArray) -&gt; Unit, onError: (String) -&gt; Unit) {&#10; val imageCapture = imageCapture ?: return&#10;&#10; val outputOptions = ImageCapture.OutputFileOptions.Builder(&#10; context.contentResolver,&#10; android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,&#10; android.content.ContentValues().apply {&#10; put(android.provider.MediaStore.MediaColumns.DISPLAY_NAME, System.currentTimeMillis())&#10; put(android.provider.MediaStore.MediaColumns.MIME_TYPE, &quot;image/jpeg&quot;)&#10; }&#10; ).build()&#10;&#10; imageCapture.takePicture(&#10; outputOptions,&#10; cameraExecutor,&#10; object : ImageCapture.OnImageSavedCallback {&#10; override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {&#10; Log.d(&quot;CameraManager&quot;, &quot;Image captured successfully&quot;)&#10; }&#10;&#10; override fun onError(exception: ImageCaptureException) {&#10; Log.e(&quot;CameraManager&quot;, &quot;Image capture failed: ${exception.message}&quot;)&#10; onError(&quot;Failed to capture image: ${exception.message}&quot;)&#10; }&#10; }&#10; )&#10; }&#10;&#10; fun stopCamera() {&#10; try {&#10; cameraProvider?.unbindAll()&#10; cameraExecutor.shutdown()&#10; Log.d(&quot;CameraManager&quot;, &quot;Camera stopped&quot;)&#10; } catch (exc: Exception) {&#10; Log.e(&quot;CameraManager&quot;, &quot;Error stopping camera&quot;, exc)&#10; }&#10; }&#10;}&#10;&#10;" />
</PendingDiffInfo>
</value>
</entry>
<entry key="$PROJECT_DIR$/app/src/main/java/com/example/camcontrol/StreamViewModel.kt">
<value>
<PendingDiffInfo>
<option name="filePath" value="$PROJECT_DIR$/app/src/main/java/com/example/camcontrol/StreamViewModel.kt" />
<option name="updatedContent" value="package com.example.camcontrol&#10;&#10;import androidx.lifecycle.ViewModel&#10;import androidx.lifecycle.viewModelScope&#10;import kotlinx.coroutines.flow.MutableStateFlow&#10;import kotlinx.coroutines.flow.StateFlow&#10;import kotlinx.coroutines.launch&#10;import android.util.Log&#10;&#10;class StreamViewModel : ViewModel() {&#10;&#10; private val _connectionState = MutableStateFlow&lt;ConnectionState&gt;(ConnectionState.Idle)&#10; val connectionState: StateFlow&lt;ConnectionState&gt; = _connectionState&#10;&#10; private val _statusMessage = MutableStateFlow(&quot;&quot;)&#10; val statusMessage: StateFlow&lt;String&gt; = _statusMessage&#10;&#10; private val _isStreaming = MutableStateFlow(false)&#10; val isStreaming: StateFlow&lt;Boolean&gt; = _isStreaming&#10;&#10; private val _isCameraRunning = MutableStateFlow(false)&#10; val isCameraRunning: StateFlow&lt;Boolean&gt; = _isCameraRunning&#10;&#10; private val _fps = MutableStateFlow(0)&#10; val fps: StateFlow&lt;Int&gt; = _fps&#10;&#10; private val _bytesTransferred = MutableStateFlow(0L)&#10; val bytesTransferred: StateFlow&lt;Long&gt; = _bytesTransferred&#10;&#10; private var wsManager: WebSocketManager? = null&#10; private var config: ServerConnectionConfig? = null&#10; private var frameCount = 0&#10; private var lastFpsTime = System.currentTimeMillis()&#10; private var totalBytesTransferred = 0L&#10;&#10; fun initializeConnection(&#10; serverHost: String,&#10; serverPort: Int,&#10; roomId: String,&#10; password: String&#10; ) {&#10; config = ServerConnectionConfig(serverHost, serverPort, roomId, password)&#10; &#10; wsManager = WebSocketManager(&#10; onConnected = { onConnected() },&#10; onDisconnected = { onDisconnected() },&#10; onError = { error -&gt; onError(error) },&#10; onMessage = { message -&gt; onMessage(message) }&#10; )&#10;&#10; connect()&#10; }&#10;&#10; private fun connect() {&#10; viewModelScope.launch {&#10; try {&#10; _connectionState.value = ConnectionState.Connecting&#10; updateStatus(&quot;Подключение к серверу...&quot;)&#10; &#10; val config = config ?: return@launch&#10; wsManager?.connect(config.getWebSocketUrl())&#10; } catch (e: Exception) {&#10; Log.e(&quot;StreamViewModel&quot;, &quot;Connection error: ${e.message}&quot;)&#10; _connectionState.value = ConnectionState.Error(e.message ?: &quot;Unknown error&quot;)&#10; updateStatus(&quot;Ошибка подключения: ${e.message}&quot;)&#10; }&#10; }&#10; }&#10;&#10; private fun onConnected() {&#10; viewModelScope.launch {&#10; _connectionState.value = ConnectionState.Connected&#10; _isStreaming.value = true&#10; _isCameraRunning.value = true&#10; updateStatus(&quot;Подключено к серверу ✓&quot;)&#10; Log.d(&quot;StreamViewModel&quot;, &quot;Connected to server&quot;)&#10; }&#10; }&#10;&#10; private fun onDisconnected() {&#10; viewModelScope.launch {&#10; _connectionState.value = ConnectionState.Disconnected&#10; _isStreaming.value = false&#10; _isCameraRunning.value = false&#10; updateStatus(&quot;Отключено от сервера&quot;)&#10; Log.d(&quot;StreamViewModel&quot;, &quot;Disconnected from server&quot;)&#10; }&#10; }&#10;&#10; private fun onError(error: String) {&#10; viewModelScope.launch {&#10; _connectionState.value = ConnectionState.Error(error)&#10; updateStatus(&quot;Ошибка: $error&quot;)&#10; Log.e(&quot;StreamViewModel&quot;, &quot;Error: $error&quot;)&#10; }&#10; }&#10;&#10; private fun onMessage(message: String) {&#10; Log.d(&quot;StreamViewModel&quot;, &quot;Message received: $message&quot;)&#10; viewModelScope.launch {&#10; if (!message.contains(&quot;ping&quot;)) {&#10; updateStatus(&quot;Получено: $message&quot;)&#10; }&#10; }&#10; }&#10;&#10; fun sendVideoFrame(frameData: ByteArray) {&#10; try {&#10; wsManager?.sendBinary(frameData)&#10; &#10; // Update statistics&#10; frameCount++&#10; totalBytesTransferred += frameData.size&#10; _bytesTransferred.value = totalBytesTransferred&#10;&#10; // Update FPS every second&#10; val currentTime = System.currentTimeMillis()&#10; if (currentTime - lastFpsTime &gt;= 1000) {&#10; _fps.value = frameCount&#10; frameCount = 0&#10; lastFpsTime = currentTime&#10; }&#10; } catch (e: Exception) {&#10; Log.e(&quot;StreamViewModel&quot;, &quot;Failed to send frame: ${e.message}&quot;)&#10; }&#10; }&#10;&#10; fun sendCommand(command: VideoCommand) {&#10; try {&#10; wsManager?.sendMessage(command.toJson())&#10; updateStatus(&quot;Команда отправлена: ${command.type}&quot;)&#10; Log.d(&quot;StreamViewModel&quot;, &quot;Command sent: ${command.type}&quot;)&#10; } catch (e: Exception) {&#10; Log.e(&quot;StreamViewModel&quot;, &quot;Failed to send command: ${e.message}&quot;)&#10; updateStatus(&quot;Ошибка отправки команды: ${e.message}&quot;)&#10; }&#10; }&#10;&#10; fun disconnect() {&#10; viewModelScope.launch {&#10; _isStreaming.value = false&#10; _isCameraRunning.value = false&#10; wsManager?.disconnect()&#10; _connectionState.value = ConnectionState.Idle&#10; updateStatus(&quot;Отключение...&quot;)&#10; resetStatistics()&#10; }&#10; }&#10;&#10; private fun resetStatistics() {&#10; frameCount = 0&#10; totalBytesTransferred = 0L&#10; _fps.value = 0&#10; _bytesTransferred.value = 0L&#10; lastFpsTime = System.currentTimeMillis()&#10; }&#10;&#10; private fun updateStatus(message: String) {&#10; _statusMessage.value = message&#10; Log.d(&quot;StreamViewModel&quot;, &quot;Status: $message&quot;)&#10; }&#10;&#10; override fun onCleared() {&#10; super.onCleared()&#10; wsManager?.disconnect()&#10; }&#10;}&#10;&#10;sealed class ConnectionState {&#10; object Idle : ConnectionState()&#10; object Connecting : ConnectionState()&#10; object Connected : ConnectionState()&#10; object Disconnected : ConnectionState()&#10; data class Error(val message: String) : ConnectionState()&#10;}&#10;" />
</PendingDiffInfo>
</value>
</entry>
<entry key="$PROJECT_DIR$/app/src/main/java/com/example/camcontrol/WebSocketManager.kt">
<value>
<PendingDiffInfo>
<option name="filePath" value="$PROJECT_DIR$/app/src/main/java/com/example/camcontrol/WebSocketManager.kt" />
<option name="originalContent" value="package com.example.camcontrol&#10;&#10;import android.util.Log&#10;import okhttp3.OkHttpClient&#10;import okhttp3.Request&#10;import okhttp3.WebSocket&#10;import okhttp3.WebSocketListener&#10;import okhttp3.Response&#10;import java.util.concurrent.TimeUnit&#10;&#10;class WebSocketManager(&#10; private val onConnected: () -&gt; Unit = {},&#10; private val onDisconnected: () -&gt; Unit = {},&#10; private val onError: (String) -&gt; Unit = {},&#10; private val onMessage: (String) -&gt; Unit = {}&#10;) : WebSocketListener() {&#10;&#10; private var webSocket: WebSocket? = null&#10; private val client = OkHttpClient.Builder()&#10; .connectTimeout(30, TimeUnit.SECONDS)&#10; .readTimeout(30, TimeUnit.SECONDS)&#10; .writeTimeout(30, TimeUnit.SECONDS)&#10; .build()&#10;&#10; fun connect(url: String) {&#10; try {&#10; val request = Request.Builder()&#10; .url(url)&#10; .build()&#10;&#10; webSocket = client.newWebSocket(request, this)&#10; Log.d(&quot;WebSocket&quot;, &quot;Connecting to: $url&quot;)&#10; } catch (e: Exception) {&#10; Log.e(&quot;WebSocket&quot;, &quot;Connection error: ${e.message}&quot;)&#10; onError(e.message ?: &quot;Unknown error&quot;)&#10; }&#10; }&#10;&#10; fun sendMessage(message: String) {&#10; try {&#10; webSocket?.send(message)&#10; Log.d(&quot;WebSocket&quot;, &quot;Message sent: $message&quot;)&#10; } catch (e: Exception) {&#10; Log.e(&quot;WebSocket&quot;, &quot;Send error: ${e.message}&quot;)&#10; onError(e.message ?: &quot;Failed to send message&quot;)&#10; }&#10; }&#10;&#10; fun sendBinary(data: ByteArray) {&#10; try {&#10; webSocket?.send(okhttp3.ByteString.of(*data))&#10; Log.d(&quot;WebSocket&quot;, &quot;Binary data sent: ${data.size} bytes&quot;)&#10; } catch (e: Exception) {&#10; Log.e(&quot;WebSocket&quot;, &quot;Binary send error: ${e.message}&quot;)&#10; }&#10; }&#10;&#10; fun disconnect() {&#10; try {&#10; webSocket?.close(1000, &quot;Client disconnecting&quot;)&#10; webSocket = null&#10; Log.d(&quot;WebSocket&quot;, &quot;Disconnected&quot;)&#10; } catch (e: Exception) {&#10; Log.e(&quot;WebSocket&quot;, &quot;Disconnect error: ${e.message}&quot;)&#10; }&#10; }&#10;&#10; override fun onOpen(webSocket: WebSocket, response: Response) {&#10; Log.d(&quot;WebSocket&quot;, &quot;Connected!&quot;)&#10; onConnected()&#10; }&#10;&#10; override fun onMessage(webSocket: WebSocket, text: String) {&#10; Log.d(&quot;WebSocket&quot;, &quot;Message received: $text&quot;)&#10; onMessage(text)&#10; }&#10;&#10; override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {&#10; webSocket.close(1000, null)&#10; Log.d(&quot;WebSocket&quot;, &quot;Closing: $code $reason&quot;)&#10; }&#10;&#10; override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {&#10; Log.d(&quot;WebSocket&quot;, &quot;Closed: $code $reason&quot;)&#10; onDisconnected()&#10; }&#10;&#10; override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {&#10; Log.e(&quot;WebSocket&quot;, &quot;Failure: ${t.message}&quot;)&#10; onError(t.message ?: &quot;Connection failed&quot;)&#10; onDisconnected()&#10; }&#10;}&#10;&#10;" />
<option name="updatedContent" value="package com.example.camcontrol&#10;&#10;import android.util.Log&#10;import okhttp3.OkHttpClient&#10;import okhttp3.Request&#10;import okhttp3.WebSocket&#10;import okhttp3.WebSocketListener&#10;import okhttp3.Response&#10;import java.util.concurrent.TimeUnit&#10;&#10;class WebSocketManager(&#10; private val onConnected: () -&gt; Unit = {},&#10; private val onDisconnected: () -&gt; Unit = {},&#10; private val onError: (String) -&gt; Unit = {},&#10; private val onMessage: (String) -&gt; Unit = {}&#10;) : WebSocketListener() {&#10;&#10; private var webSocket: WebSocket? = null&#10; private val client = OkHttpClient.Builder()&#10; .connectTimeout(30, TimeUnit.SECONDS)&#10; .readTimeout(30, TimeUnit.SECONDS)&#10; .writeTimeout(30, TimeUnit.SECONDS)&#10; .build()&#10;&#10; fun connect(url: String) {&#10; try {&#10; val request = Request.Builder()&#10; .url(url)&#10; .build()&#10;&#10; webSocket = client.newWebSocket(request, this)&#10; Log.d(&quot;WebSocket&quot;, &quot;Connecting to: $url&quot;)&#10; } catch (e: Exception) {&#10; Log.e(&quot;WebSocket&quot;, &quot;Connection error: ${e.message}&quot;)&#10; onError(e.message ?: &quot;Unknown error&quot;)&#10; }&#10; }&#10;&#10; fun sendMessage(message: String) {&#10; try {&#10; webSocket?.send(message)&#10; Log.d(&quot;WebSocket&quot;, &quot;Message sent: $message&quot;)&#10; } catch (e: Exception) {&#10; Log.e(&quot;WebSocket&quot;, &quot;Send error: ${e.message}&quot;)&#10; onError(e.message ?: &quot;Failed to send message&quot;)&#10; }&#10; }&#10;&#10; fun sendBinary(data: ByteArray) {&#10; try {&#10; val byteString = okhttp3.ByteString.of(*data)&#10; webSocket?.send(byteString)&#10; Log.d(&quot;WebSocket&quot;, &quot;Binary data sent: ${data.size} bytes&quot;)&#10; } catch (e: Exception) {&#10; Log.e(&quot;WebSocket&quot;, &quot;Binary send error: ${e.message}&quot;)&#10; }&#10; }&#10;&#10; fun disconnect() {&#10; try {&#10; webSocket?.close(1000, &quot;Client disconnecting&quot;)&#10; webSocket = null&#10; Log.d(&quot;WebSocket&quot;, &quot;Disconnected&quot;)&#10; } catch (e: Exception) {&#10; Log.e(&quot;WebSocket&quot;, &quot;Disconnect error: ${e.message}&quot;)&#10; }&#10; }&#10;&#10; override fun onOpen(webSocket: WebSocket, response: Response) {&#10; Log.d(&quot;WebSocket&quot;, &quot;Connected!&quot;)&#10; onConnected()&#10; }&#10;&#10; override fun onMessage(webSocket: WebSocket, text: String) {&#10; Log.d(&quot;WebSocket&quot;, &quot;Message received: $text&quot;)&#10; onMessage(text)&#10; }&#10;&#10; override fun onClosing(webSocket: WebSocket, code: Int, reason: String) {&#10; webSocket.close(1000, null)&#10; Log.d(&quot;WebSocket&quot;, &quot;Closing: $code $reason&quot;)&#10; }&#10;&#10; override fun onClosed(webSocket: WebSocket, code: Int, reason: String) {&#10; Log.d(&quot;WebSocket&quot;, &quot;Closed: $code $reason&quot;)&#10; onDisconnected()&#10; }&#10;&#10; override fun onFailure(webSocket: WebSocket, t: Throwable, response: Response?) {&#10; Log.e(&quot;WebSocket&quot;, &quot;Failure: ${t.message}&quot;)&#10; onError(t.message ?: &quot;Connection failed&quot;)&#10; onDisconnected()&#10; }&#10;}&#10;&#10;" />
</PendingDiffInfo>
</value>
</entry>
</map>
</option>
</component>
</project>