package com.example.flomo_ai import android.annotation.SuppressLint import android.os.Bundle import android.graphics.Color import android.widget.Button import android.widget.EditText import android.widget.LinearLayout import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import com.google.gson.Gson import com.google.gson.reflect.TypeToken import android.graphics.Bitmap import android.graphics.BitmapFactory import android.net.Uri import androidx.activity.result.contract.ActivityResultContracts import android.graphics.drawable.BitmapDrawable import java.io.InputStream import android.widget.RelativeLayout class SecondActivity : AppCompatActivity() { private lateinit var etApiButtonName: EditText private lateinit var etApiName: EditText private lateinit var etApiUrl: EditText private lateinit var etApiKey: EditText private lateinit var etApiSecretKey: EditText private lateinit var etApiModel: EditText private lateinit var btnSave: Button private lateinit var llConfigList: LinearLayout private lateinit var backgroundLayout: RelativeLayout private var configs = mutableListOf() private var editingId: Long? = null override fun onCreate(savedInstanceState: Bundle?) { setTheme(androidx.appcompat.R.style.Theme_AppCompat) super.onCreate(savedInstanceState) initViews() loadConfigs() displayConfigs() val btnGoBack: Button = findViewById(R.id.btnGoBack) btnGoBack.setOnClickListener { finish() } btnSave.setOnClickListener { if (editingId != null) { updateConfig() } else { addConfig() } } backgroundLayout = findViewById(R.id.mainLinearLayout) val btnSelectImage: Button = findViewById(R.id.chooseButton) val getContent = registerForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> uri?.let { try { val inputStream: InputStream = contentResolver.openInputStream(uri)!! val bitmap: Bitmap = BitmapFactory.decodeStream(inputStream) backgroundLayout.background = BitmapDrawable(resources, bitmap) } catch (e: Exception) { e.printStackTrace() } } } btnSelectImage.setOnClickListener { getContent.launch("image/*") } } private fun initViews() { etApiButtonName = findViewById(R.id.etApiButtonName) etApiName = findViewById(R.id.etApiName) etApiUrl = findViewById(R.id.etApiUrl) etApiKey = findViewById(R.id.etApiKey) etApiSecretKey = findViewById(R.id.etApiSecretKey) etApiModel = findViewById(R.id.etApiModel) btnSave = findViewById(R.id.btnSave) llConfigList = findViewById(R.id.llConfigList) } private fun loadConfigs() { val sharedPrefs = getSharedPreferences("APIConfigs", MODE_PRIVATE) val json = sharedPrefs.getString("configs", null) if (json != null) { val type = object : TypeToken>() {}.type configs = Gson().fromJson(json, type) } } private fun saveConfigs() { val sharedPrefs = getSharedPreferences("APIConfigs", MODE_PRIVATE) val json = Gson().toJson(configs) sharedPrefs.edit().putString("configs", json).apply() } private fun addConfig() { val buttonname = etApiButtonName.text.toString() val name = etApiName.text.toString() val url = etApiUrl.text.toString() val key = etApiKey.text.toString() val secretKey = etApiSecretKey.text.toString() val model = etApiModel.text.toString() // 生成唯一的 id val id = System.currentTimeMillis() // 创建新的配置项 val newConfig = APIConfig(id, buttonname, name, url, key, secretKey, model) // 添加配置项 configs.add(newConfig) // 保存配置 saveConfigs() // 显示配置 displayConfigs() // 清空输入框 clearInputs() } private fun updateConfig() { val buttonname = etApiButtonName.text.toString() val name = etApiName.text.toString() val url = etApiUrl.text.toString() val key = etApiKey.text.toString() val secretKey = etApiSecretKey.text.toString() val model = etApiModel.text.toString() // 获取编辑的配置项 id val id = editingId ?: return // 更新配置项 val updatedConfig = APIConfig(id, buttonname, name, url, key, secretKey, model) val existingConfigIndex = configs.indexOfFirst { it.id == id } if (existingConfigIndex != -1) { configs[existingConfigIndex] = updatedConfig } // 保存配置 saveConfigs() // 显示配置 displayConfigs() // 清空输入框 clearInputs() // 重置编辑状态 editingId = null } @SuppressLint("MissingInflatedId", "SetTextI18n", "InflateParams") private fun displayConfigs() { llConfigList.removeAllViews() for (config in configs) { // 为每个配置项加载对应的布局文件 val configView = layoutInflater.inflate(R.layout.item_api_config, null) // 设置各项文本信息 // 获取并设置 Name 的 TextView 前景色和背景色 val tvButtonName = configView.findViewById(R.id.tvButtonName) tvButtonName.text = "按钮名称: ${config.buttonname}" tvButtonName.setTextColor(Color.BLACK) // 获取并设置 Name 的 TextView 前景色和背景色 val tvName = configView.findViewById(R.id.tvName) tvName.text = "Name: ${config.name}" tvName.setTextColor(Color.BLACK) // 获取并设置 URL 的 TextView 前景色和背景色 val tvUrl = configView.findViewById(R.id.tvUrl) tvUrl.text = "URL: ${config.url}" tvUrl.setTextColor(Color.BLACK) // 获取并设置 Key 的 TextView 前景色和背景色 val tvKey = configView.findViewById(R.id.tvKey) tvKey.text = "Key: ${config.key.take(4)}..." tvKey.setTextColor(Color.BLACK) // 获取并设置 SecretKey 的 TextView 前景色和背景色 val tvSecretKey = configView.findViewById(R.id.tvSecretKey) tvSecretKey.text = "Secret Key: ${config.secretKey.take(4)}..." tvSecretKey.setTextColor(Color.BLACK) // 获取并设置 model 的 TextView 前景色和背景色 val tvApiModel = configView.findViewById(R.id.tvApiModel) tvApiModel.text = "Model: ${config.model}" tvApiModel.setTextColor(Color.BLACK) // 设置编辑按钮点击事件 configView.findViewById