Warning, /network/kdeconnect-android/src/org/kde/kdeconnect/Plugins/MousePadPlugin/ComposeSendActivity.kt is written in an unsupported language. File is not indexed.

0001 /*
0002  * SPDX-FileCopyrightText: 2023 Dmitry Yudin <dgyudin@gmail.com>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005  */
0006 
0007 package org.kde.kdeconnect.Plugins.MousePadPlugin
0008 
0009 import android.os.Bundle
0010 import android.util.Log
0011 import androidx.activity.compose.setContent
0012 import androidx.appcompat.app.AppCompatActivity
0013 import androidx.compose.foundation.layout.Box
0014 import androidx.compose.foundation.layout.fillMaxSize
0015 import androidx.compose.foundation.layout.fillMaxWidth
0016 import androidx.compose.foundation.layout.padding
0017 import androidx.compose.material.icons.Icons
0018 import androidx.compose.material.icons.filled.Send
0019 import androidx.compose.material3.Scaffold
0020 import androidx.compose.runtime.Composable
0021 import androidx.compose.runtime.mutableStateOf
0022 import androidx.compose.ui.Alignment
0023 import androidx.compose.ui.Modifier
0024 import androidx.compose.ui.res.stringResource
0025 import androidx.compose.ui.unit.dp
0026 import androidx.preference.PreferenceManager
0027 import com.google.accompanist.themeadapter.material3.Mdc3Theme
0028 import org.kde.kdeconnect.KdeConnect
0029 import org.kde.kdeconnect.NetworkPacket
0030 import org.kde.kdeconnect.UserInterface.compose.KdeTextButton
0031 import org.kde.kdeconnect.UserInterface.compose.KdeTextField
0032 import org.kde.kdeconnect.UserInterface.compose.KdeTopAppBar
0033 import org.kde.kdeconnect_tp.R
0034 
0035 private const val INPUT_CACHE_KEY = "compose_send_input_cache"
0036 
0037 class ComposeSendActivity : AppCompatActivity() {
0038     private var deviceId: String? = null
0039     private val userInput = mutableStateOf(String())
0040     private val prefs by lazy { PreferenceManager.getDefaultSharedPreferences(this) }
0041 
0042     override fun onCreate(savedInstanceState: Bundle?) {
0043 
0044         super.onCreate(savedInstanceState)
0045 
0046         prefs.getString(INPUT_CACHE_KEY, null)?.let { userInput.value = it }
0047 
0048         setContent { ComposeSendScreen() }
0049 
0050         deviceId = intent.getStringExtra("org.kde.kdeconnect.Plugins.MousePadPlugin.deviceId")
0051     }
0052 
0053     override fun onStop() {
0054         super.onStop()
0055         with(prefs.edit()) {
0056             if (userInput.value.isNotBlank()) putString(INPUT_CACHE_KEY, userInput.value) else remove(INPUT_CACHE_KEY)
0057             apply()
0058         }
0059     }
0060 
0061     private fun sendChars(chars: String) {
0062         val np = NetworkPacket(MousePadPlugin.PACKET_TYPE_MOUSEPAD_REQUEST)
0063         np["key"] = chars
0064         sendKeyPressPacket(np)
0065     }
0066 
0067     private fun sendKeyPressPacket(np: NetworkPacket) {
0068         try {
0069             Log.d("packed", np.serialize())
0070         } catch (e: Exception) {
0071             Log.e("KDE/ComposeSend", "Exception", e)
0072         }
0073         val plugin = KdeConnect.getInstance().getDevicePlugin(deviceId, MousePadPlugin::class.java)
0074         if (plugin == null) {
0075             finish()
0076             return
0077         }
0078         plugin.sendKeyboardPacket(np)
0079     }
0080 
0081     private fun sendComposed() {
0082         sendChars(userInput.value)
0083         clearComposeInput()
0084     }
0085 
0086     private fun clearComposeInput() {
0087         userInput.value = String()
0088     }
0089 
0090     @Composable
0091     private fun ComposeSendScreen() {
0092         Mdc3Theme {
0093             Scaffold(
0094                 topBar = {
0095                     KdeTopAppBar(
0096                         title = stringResource(R.string.compose_send_title),
0097                         navIconOnClick = { onBackPressedDispatcher.onBackPressed() },
0098                         actions = {
0099                             KdeTextButton(
0100                                 modifier = Modifier.padding(horizontal = 8.dp),
0101                                 onClick = { clearComposeInput() },
0102                                 text = stringResource(R.string.clear_compose),
0103                             )
0104                         }
0105                     )
0106                 },
0107             ) { scaffoldPadding ->
0108                 Box(modifier = Modifier.padding(scaffoldPadding).fillMaxSize()) {
0109                     KdeTextField(
0110                         modifier = Modifier
0111                             .padding(horizontal = 16.dp)
0112                             .padding(bottom = 80.dp)
0113                             .align(Alignment.BottomStart)
0114                             .fillMaxWidth(),
0115                         input = userInput,
0116                         label = stringResource(R.string.click_here_to_type),
0117                     )
0118                     KdeTextButton(
0119                         onClick = { sendComposed() },
0120                         modifier = Modifier.padding(all = 16.dp).align(Alignment.BottomEnd),
0121                         enabled = userInput.value.isNotEmpty(),
0122                         text = stringResource(R.string.send_compose),
0123                         iconLeft = Icons.Default.Send,
0124                     )
0125                 }
0126             }
0127         }
0128     }
0129 }