...
This commit is contained in:
parent
1ba808fcf0
commit
3fefb5476f
@ -184,7 +184,7 @@ class SystemStatusFragment : Fragment() {
|
|||||||
cameraManager = requireContext().getSystemService(Context.CAMERA_SERVICE) as android.hardware.camera2.CameraManager
|
cameraManager = requireContext().getSystemService(Context.CAMERA_SERVICE) as android.hardware.camera2.CameraManager
|
||||||
|
|
||||||
binding.btnQuickFlash.setOnClickListener {
|
binding.btnQuickFlash.setOnClickListener {
|
||||||
toggleFlashlight()
|
toggleFlashlight()
|
||||||
}
|
}
|
||||||
binding.btnQuickFlash.setOnLongClickListener {
|
binding.btnQuickFlash.setOnLongClickListener {
|
||||||
toggleFlashlight(120)
|
toggleFlashlight(120)
|
||||||
@ -256,66 +256,71 @@ class SystemStatusFragment : Fragment() {
|
|||||||
private fun allPermissionsGranted() = androidx.core.content.ContextCompat.checkSelfPermission(
|
private fun allPermissionsGranted() = androidx.core.content.ContextCompat.checkSelfPermission(
|
||||||
requireContext(), CAMERA_PERMISSION) == android.content.pm.PackageManager.PERMISSION_GRANTED
|
requireContext(), CAMERA_PERMISSION) == android.content.pm.PackageManager.PERMISSION_GRANTED
|
||||||
|
|
||||||
|
private var mirrorDialog: android.app.Dialog? = null // 멤버 변수로 선언
|
||||||
|
|
||||||
private fun showMirrorDialog() {
|
private fun showMirrorDialog() {
|
||||||
val dialog = android.app.Dialog(requireContext(), android.R.style.Theme_Black_NoTitleBar_Fullscreen)
|
mirrorDialog = android.app.Dialog(requireContext(), android.R.style.Theme_Black_NoTitleBar_Fullscreen)
|
||||||
|
mirrorDialog?.let { mirrorDialog ->
|
||||||
|
|
||||||
// 레이아웃 구성을 위한 FrameLayout 생성
|
|
||||||
val frameLayout = android.widget.FrameLayout(requireContext())
|
|
||||||
val previewView = androidx.camera.view.PreviewView(requireContext())
|
|
||||||
|
|
||||||
// 타이머용 TextView 생성
|
// 레이아웃 구성을 위한 FrameLayout 생성
|
||||||
val timerText = TextView(requireContext()).apply {
|
val frameLayout = android.widget.FrameLayout(requireContext())
|
||||||
setTextColor(Color.WHITE)
|
val previewView = androidx.camera.view.PreviewView(requireContext())
|
||||||
setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f)
|
|
||||||
setBackgroundColor(Color.parseColor("#88000000")) // 반투명 배경
|
|
||||||
setPadding(32, 16, 32, 16)
|
|
||||||
gravity = android.view.Gravity.CENTER
|
|
||||||
}
|
|
||||||
|
|
||||||
val params = android.widget.FrameLayout.LayoutParams(
|
// 타이머용 TextView 생성
|
||||||
android.widget.FrameLayout.LayoutParams.WRAP_CONTENT,
|
val timerText = TextView(requireContext()).apply {
|
||||||
android.widget.FrameLayout.LayoutParams.WRAP_CONTENT
|
setTextColor(Color.WHITE)
|
||||||
).apply {
|
setTextSize(TypedValue.COMPLEX_UNIT_SP, 18f)
|
||||||
gravity = android.view.Gravity.TOP or android.view.Gravity.CENTER_HORIZONTAL
|
setBackgroundColor(Color.parseColor("#88000000")) // 반투명 배경
|
||||||
topMargin = 100
|
setPadding(32, 16, 32, 16)
|
||||||
}
|
gravity = android.view.Gravity.CENTER
|
||||||
|
|
||||||
frameLayout.addView(previewView)
|
|
||||||
frameLayout.addView(timerText, params)
|
|
||||||
dialog.setContentView(frameLayout)
|
|
||||||
|
|
||||||
val cameraProviderFuture = androidx.camera.lifecycle.ProcessCameraProvider.getInstance(requireContext())
|
|
||||||
|
|
||||||
cameraProviderFuture.addListener({
|
|
||||||
val cameraProvider = cameraProviderFuture.get()
|
|
||||||
val preview = androidx.camera.core.Preview.Builder().build()
|
|
||||||
|
|
||||||
// 전면 카메라 선택
|
|
||||||
val cameraSelector = androidx.camera.core.CameraSelector.DEFAULT_FRONT_CAMERA
|
|
||||||
|
|
||||||
try {
|
|
||||||
cameraProvider.unbindAll()
|
|
||||||
// 이 다이얼로그의 LifecycleOwner를 Fragment로 지정
|
|
||||||
cameraProvider.bindToLifecycle(this, cameraSelector, preview)
|
|
||||||
preview.setSurfaceProvider(previewView.surfaceProvider)
|
|
||||||
} catch (e: Exception) {
|
|
||||||
Blog.LOGE("거울 실행 실패: ${e.message}")
|
|
||||||
}
|
}
|
||||||
}, androidx.core.content.ContextCompat.getMainExecutor(requireContext()))
|
|
||||||
CoroutineScope(Dispatchers.Main).launch {
|
val params = android.widget.FrameLayout.LayoutParams(
|
||||||
for (i in 30 downTo 1) {
|
android.widget.FrameLayout.LayoutParams.WRAP_CONTENT,
|
||||||
if (!dialog.isShowing) break
|
android.widget.FrameLayout.LayoutParams.WRAP_CONTENT
|
||||||
timerText.text = "거울 모드 종료까지 $i" + "초"
|
).apply {
|
||||||
delay(1000L)
|
gravity = android.view.Gravity.TOP or android.view.Gravity.CENTER_HORIZONTAL
|
||||||
|
topMargin = 100
|
||||||
}
|
}
|
||||||
if (dialog.isShowing) {
|
|
||||||
dialog.dismiss()
|
frameLayout.addView(previewView)
|
||||||
context?.toast("배터리 절약을 위해 거울을 껐습니다.")
|
frameLayout.addView(timerText, params)
|
||||||
|
mirrorDialog?.setContentView(frameLayout)
|
||||||
|
|
||||||
|
val cameraProviderFuture = androidx.camera.lifecycle.ProcessCameraProvider.getInstance(requireContext())
|
||||||
|
|
||||||
|
cameraProviderFuture.addListener({
|
||||||
|
val cameraProvider = cameraProviderFuture.get()
|
||||||
|
val preview = androidx.camera.core.Preview.Builder().build()
|
||||||
|
|
||||||
|
// 전면 카메라 선택
|
||||||
|
val cameraSelector = androidx.camera.core.CameraSelector.DEFAULT_FRONT_CAMERA
|
||||||
|
|
||||||
|
try {
|
||||||
|
cameraProvider.unbindAll()
|
||||||
|
// 이 다이얼로그의 LifecycleOwner를 Fragment로 지정
|
||||||
|
cameraProvider.bindToLifecycle(this, cameraSelector, preview)
|
||||||
|
preview.setSurfaceProvider(previewView.surfaceProvider)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Blog.LOGE("거울 실행 실패: ${e.message}")
|
||||||
|
}
|
||||||
|
}, androidx.core.content.ContextCompat.getMainExecutor(requireContext()))
|
||||||
|
CoroutineScope(Dispatchers.Main).launch {
|
||||||
|
for (i in 30 downTo 1) {
|
||||||
|
if (!mirrorDialog.isShowing) break
|
||||||
|
timerText.text = "거울 모드 종료까지 $i" + "초"
|
||||||
|
delay(1000L)
|
||||||
|
}
|
||||||
|
if (mirrorDialog.isShowing == true) {
|
||||||
|
mirrorDialog.dismiss()
|
||||||
|
context?.toast("배터리 절약을 위해 거울을 껐습니다.")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
// 화면 터치 시 종료
|
||||||
|
previewView.setOnClickListener { mirrorDialog?.dismiss() }
|
||||||
|
mirrorDialog?.show()
|
||||||
}
|
}
|
||||||
// 화면 터치 시 종료
|
|
||||||
previewView.setOnClickListener { dialog.dismiss() }
|
|
||||||
dialog.show()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun updateQuickControlUI() {
|
private fun updateQuickControlUI() {
|
||||||
@ -337,6 +342,22 @@ class SystemStatusFragment : Fragment() {
|
|||||||
override fun onHiddenChanged(hidden: Boolean) {
|
override fun onHiddenChanged(hidden: Boolean) {
|
||||||
super.onHiddenChanged(hidden)
|
super.onHiddenChanged(hidden)
|
||||||
if (hidden) {
|
if (hidden) {
|
||||||
|
if (isFlashOn) {
|
||||||
|
isFlashOn = false
|
||||||
|
try {
|
||||||
|
cameraManager.setTorchMode(cameraManager.cameraIdList[0], false)
|
||||||
|
binding.btnQuickFlash.text = "🔦 조명"
|
||||||
|
binding.btnQuickFlash.setTextColor(Color.WHITE)
|
||||||
|
} catch (e: Exception) { e.printStackTrace() }
|
||||||
|
}
|
||||||
|
flashTimerJob?.cancel()
|
||||||
|
|
||||||
|
// 2. 거울 다이얼로그 닫기 (카메라 자원 해제)
|
||||||
|
mirrorDialog?.let {
|
||||||
|
if (it.isShowing) it.dismiss()
|
||||||
|
}
|
||||||
|
mirrorDialog = null
|
||||||
|
|
||||||
stopMonitoring()
|
stopMonitoring()
|
||||||
} else {
|
} else {
|
||||||
resetNetworkCounters()
|
resetNetworkCounters()
|
||||||
@ -348,7 +369,7 @@ class SystemStatusFragment : Fragment() {
|
|||||||
|
|
||||||
override fun onPause() {
|
override fun onPause() {
|
||||||
super.onPause()
|
super.onPause()
|
||||||
stopMonitoring()
|
onHiddenChanged(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onResume() {
|
override fun onResume() {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user