diff --git a/app/src/main/java/com/example/app/SettingsFragment.kt b/app/src/main/java/com/example/app/SettingsFragment.kt index 573f9b7..b5e346e 100644 --- a/app/src/main/java/com/example/app/SettingsFragment.kt +++ b/app/src/main/java/com/example/app/SettingsFragment.kt @@ -1,22 +1,12 @@ package com.example.app -import android.Manifest import android.content.Context -import android.content.pm.PackageManager -import android.location.Location import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.Button -import android.widget.EditText -import android.widget.RadioButton -import android.widget.RadioGroup -import android.widget.TextView -import android.widget.Toast -import androidx.appcompat.app.AlertDialog -import androidx.core.app.ActivityCompat +import android.widget.* import androidx.fragment.app.DialogFragment class SettingsFragment : DialogFragment() { @@ -25,6 +15,9 @@ class SettingsFragment : DialogFragment() { private lateinit var manualLatInput: EditText private lateinit var manualLngInput: EditText private lateinit var distanceInput: EditText + private lateinit var manualInputLayout: LinearLayout + private lateinit var watermarkStyleSpinner: Spinner + private lateinit var qualitySpinner: Spinner private lateinit var saveButton: Button private lateinit var cancelButton: Button @@ -36,7 +29,9 @@ class SettingsFragment : DialogFragment() { val view = inflater.inflate(R.layout.fragment_settings, container, false) initViews(view) + setupSpinners() setupClickListeners() + loadCurrentSettings() return view } @@ -46,23 +41,46 @@ class SettingsFragment : DialogFragment() { manualLatInput = view.findViewById(R.id.manualLatInput) manualLngInput = view.findViewById(R.id.manualLngInput) distanceInput = view.findViewById(R.id.distanceInput) + manualInputLayout = view.findViewById(R.id.manualInputLayout) + watermarkStyleSpinner = view.findViewById(R.id.watermarkStyleSpinner) + qualitySpinner = view.findViewById(R.id.qualitySpinner) saveButton = view.findViewById(R.id.saveButton) cancelButton = view.findViewById(R.id.cancelButton) } + private fun setupSpinners() { + // 设置水印样式选项 + val watermarkStyles = arrayOf("白色粗体", "黑色阴影", "彩色半透明", "经典样式") + val watermarkAdapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, watermarkStyles) + watermarkAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + watermarkStyleSpinner.adapter = watermarkAdapter + + // 设置质量选项 + val qualityOptions = arrayOf("高质量 (100%)", "标准 (80%)", "低质量 (60%)") + val qualityAdapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, qualityOptions) + qualityAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + qualitySpinner.adapter = qualityAdapter + } + private fun setupClickListeners() { locationCalibrationRadioGroup.setOnCheckedChangeListener { _, checkedId -> - val selectedMethod = when (checkedId) { - R.id.latLngDistanceCalibration -> "经纬度+距离校准" - R.id.onlineQueryCalibration -> "联网查询校准" - else -> "默认" + // 显示或隐藏手动输入区域 + when (checkedId) { + R.id.latLngDistanceCalibration -> { + manualInputLayout.visibility = View.VISIBLE + } + R.id.onlineQueryCalibration -> { + manualInputLayout.visibility = View.GONE + } } - Log.d("SettingsFragment", "选择了校准方式: $selectedMethod") } saveButton.setOnClickListener { - saveSettings() - dismiss() + if (validateInputs()) { + saveSettings() + Toast.makeText(context, "设置已保存", Toast.LENGTH_SHORT).show() + dismiss() + } } cancelButton.setOnClickListener { @@ -70,52 +88,134 @@ class SettingsFragment : DialogFragment() { } } + private fun validateInputs(): Boolean { + val selectedMethodId = locationCalibrationRadioGroup.checkedRadioButtonId + + // 如果选择了手动经纬度校准,验证输入 + if (selectedMethodId == R.id.latLngDistanceCalibration) { + val latStr = manualLatInput.text.toString().trim() + val lngStr = manualLngInput.text.toString().trim() + val distanceStr = distanceInput.text.toString().trim() + + if (latStr.isEmpty() || lngStr.isEmpty()) { + Toast.makeText(context, "请输入经纬度", Toast.LENGTH_SHORT).show() + return false + } + + try { + val latitude = latStr.toDouble() + val longitude = lngStr.toDouble() + + if (latitude !in -90.0..90.0) { + Toast.makeText(context, "纬度应在-90到90之间", Toast.LENGTH_SHORT).show() + return false + } + + if (longitude !in -180.0..180.0) { + Toast.makeText(context, "经度应在-180到180之间", Toast.LENGTH_SHORT).show() + return false + } + + if (distanceStr.isNotEmpty()) { + val distance = distanceStr.toDouble() + if (distance < 0) { + Toast.makeText(context, "距离应大于等于0", Toast.LENGTH_SHORT).show() + return false + } + } + } catch (e: NumberFormatException) { + Toast.makeText(context, "请输入有效的数字", Toast.LENGTH_SHORT).show() + return false + } + } + + return true + } + private fun saveSettings() { - // 获取选择的位置校准方式 + val sharedPreferences = requireContext().getSharedPreferences("LogCamSettings", Context.MODE_PRIVATE) + val editor = sharedPreferences.edit() + + // 保存位置校准方式 val selectedMethodId = locationCalibrationRadioGroup.checkedRadioButtonId val calibrationMethod = when (selectedMethodId) { R.id.latLngDistanceCalibration -> "lat_lng_distance" R.id.onlineQueryCalibration -> "online_query" - else -> "default" + else -> "online_query" // 默认选项 } - - // 保存设置到SharedPreferences - val sharedPreferences = requireContext().getSharedPreferences("LogCamSettings", Context.MODE_PRIVATE) - val editor = sharedPreferences.edit() editor.putString("calibration_method", calibrationMethod) - // 如果选择了手动输入经纬度,则保存经纬度和距离 + // 保存手动输入的经纬度和距离 if (selectedMethodId == R.id.latLngDistanceCalibration) { try { - val latStr = manualLatInput.text.toString() - val lngStr = manualLngInput.text.toString() - val distanceStr = distanceInput.text.toString() + val latStr = manualLatInput.text.toString().trim() + val lngStr = manualLngInput.text.toString().trim() + val distanceStr = distanceInput.text.toString().trim() if (latStr.isNotEmpty() && lngStr.isNotEmpty()) { val latitude = latStr.toDouble() val longitude = lngStr.toDouble() val distance = if (distanceStr.isNotEmpty()) distanceStr.toDouble() else 0.0 - if (latitude in -90.0..90.0 && longitude in -180.0..180.0) { - editor.putFloat("manual_latitude", latitude.toFloat()) - editor.putFloat("manual_longitude", longitude.toFloat()) - editor.putFloat("calibration_distance", distance.toFloat()) - Toast.makeText(context, "设置已保存", Toast.LENGTH_SHORT).show() - } else { - Toast.makeText(context, "经纬度超出有效范围", Toast.LENGTH_SHORT).show() - return - } + editor.putFloat("manual_latitude", latitude.toFloat()) + editor.putFloat("manual_longitude", longitude.toFloat()) + editor.putFloat("calibration_distance", distance.toFloat()) } } catch (e: NumberFormatException) { - Toast.makeText(context, "请输入有效的数字", Toast.LENGTH_SHORT).show() - return + Log.e("SettingsFragment", "保存设置时出现数字格式错误: ${e.message}") } } + // 保存水印样式 + val selectedWatermarkStyle = watermarkStyleSpinner.selectedItemPosition + editor.putInt("watermark_style", selectedWatermarkStyle) + + // 保存合成质量 + val selectedQuality = qualitySpinner.selectedItemPosition + editor.putInt("quality_setting", selectedQuality) + editor.apply() } - companion object { - const val REQUEST_CODE_LOCATION_PERMISSION = 100 + private fun loadCurrentSettings() { + val sharedPreferences = requireContext().getSharedPreferences("LogCamSettings", Context.MODE_PRIVATE) + + // 加载位置校准方式 + val calibrationMethod = sharedPreferences.getString("calibration_method", "online_query") + val selectedMethodId = when (calibrationMethod) { + "lat_lng_distance" -> R.id.latLngDistanceCalibration + else -> R.id.onlineQueryCalibration + } + locationCalibrationRadioGroup.check(selectedMethodId) + + // 根据选择显示或隐藏手动输入区域 + if (selectedMethodId == R.id.latLngDistanceCalibration) { + manualInputLayout.visibility = View.VISIBLE + + // 加载手动输入的经纬度和距离 + val latitude = sharedPreferences.getFloat("manual_latitude", 0f).toDouble() + val longitude = sharedPreferences.getFloat("manual_longitude", 0f).toDouble() + val distance = sharedPreferences.getFloat("calibration_distance", 0f).toDouble() + + if (latitude != 0.0 || longitude != 0.0) { + manualLatInput.setText(latitude.toString()) + manualLngInput.setText(longitude.toString()) + distanceInput.setText(distance.toString()) + } + } else { + manualInputLayout.visibility = View.GONE + } + + // 加载水印样式 + val watermarkStyle = sharedPreferences.getInt("watermark_style", 0) + if (watermarkStyle in 0 until watermarkStyleSpinner.adapter.count) { + watermarkStyleSpinner.setSelection(watermarkStyle) + } + + // 加载质量设置 + val qualitySetting = sharedPreferences.getInt("quality_setting", 1) // 默认标准质量 + if (qualitySetting in 0 until qualitySpinner.adapter.count) { + qualitySpinner.setSelection(qualitySetting) + } } } \ No newline at end of file