From 0eb8ec58721c77578d3dddf4f45a01a7172b1c75 Mon Sep 17 00:00:00 2001 From: Terebov_Maksim Date: Thu, 20 Feb 2025 16:41:48 +0300 Subject: [PATCH] day3_commit2_vse_slomalos --- .kotlin/errors/errors-1740053232762.log | 82 ++++++++++++ .../java/ru/myitschool/work/api/ApiService.kt | 10 +- .../myitschool/work/ui/Main/MainFragment.kt | 117 ++++++++++++------ .../myitschool/work/ui/qr/result/QrResult.kt | 39 ++++-- app/src/main/res/layout/fragment_main.xml | 8 ++ 5 files changed, 201 insertions(+), 55 deletions(-) create mode 100644 .kotlin/errors/errors-1740053232762.log diff --git a/.kotlin/errors/errors-1740053232762.log b/.kotlin/errors/errors-1740053232762.log new file mode 100644 index 0000000..51f29bd --- /dev/null +++ b/.kotlin/errors/errors-1740053232762.log @@ -0,0 +1,82 @@ +kotlin version: 2.0.21 +error message: Daemon compilation failed: null +java.lang.Exception + at org.jetbrains.kotlin.daemon.common.CompileService$CallResult$Error.get(CompileService.kt:69) + at org.jetbrains.kotlin.daemon.common.CompileService$CallResult$Error.get(CompileService.kt:65) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemon(GradleKotlinCompilerWork.kt:240) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemonOrFallbackImpl(GradleKotlinCompilerWork.kt:159) + at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:111) + at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:76) + at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62) + at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:100) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44) + at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) + at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) + at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) + at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) + at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) + at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41) + at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59) + at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:174) + at java.base/java.util.concurrent.FutureTask.run(Unknown Source) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:195) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:128) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:170) + at org.gradle.internal.Factories$1.create(Factories.java:31) + at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:267) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:131) + at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:136) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:165) + at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:134) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) + at java.base/java.util.concurrent.FutureTask.run(Unknown Source) + at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) + at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) + at java.base/java.lang.Thread.run(Unknown Source) +Caused by: java.nio.file.DirectoryNotEmptyException: C:\Users\User\AppData\Local\Temp\kotlin-backups1146231745401124119 + at java.base/sun.nio.fs.WindowsFileSystemProvider.implDelete(Unknown Source) + at java.base/sun.nio.fs.AbstractFileSystemProvider.delete(Unknown Source) + at java.base/java.nio.file.Files.delete(Unknown Source) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction$cleanupStash$2$1$1.invoke(CompilationTransaction.kt:244) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction$cleanupStash$2$1$1.invoke(CompilationTransaction.kt:244) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction.cleanupStash$lambda$11$lambda$10$lambda$9(CompilationTransaction.kt:244) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source) + at java.base/java.util.ArrayList.forEach(Unknown Source) + at java.base/java.util.stream.SortedOps$RefSortingSink.end(Unknown Source) + at java.base/java.util.stream.Sink$ChainedReference.end(Unknown Source) + at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source) + at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) + at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source) + at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source) + at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source) + at java.base/java.util.stream.ReferencePipeline.forEach(Unknown Source) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction.cleanupStash(CompilationTransaction.kt:244) + at org.jetbrains.kotlin.incremental.RecoverableCompilationTransaction.close(CompilationTransaction.kt:254) + at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.tryCompileIncrementally(IncrementalCompilerRunner.kt:747) + at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:120) + at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:675) + at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:92) + at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1660) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) + at java.base/java.lang.reflect.Method.invoke(Unknown Source) + at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) + at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source) + at java.rmi/sun.rmi.transport.Transport$1.run(Unknown Source) + at java.base/java.security.AccessController.doPrivileged(Unknown Source) + at java.rmi/sun.rmi.transport.Transport.serviceCall(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(Unknown Source) + at java.base/java.security.AccessController.doPrivileged(Unknown Source) + at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) + ... 3 more + + diff --git a/app/src/main/java/ru/myitschool/work/api/ApiService.kt b/app/src/main/java/ru/myitschool/work/api/ApiService.kt index c49b33a..968a586 100644 --- a/app/src/main/java/ru/myitschool/work/api/ApiService.kt +++ b/app/src/main/java/ru/myitschool/work/api/ApiService.kt @@ -1,6 +1,5 @@ package ru.myitschool.work.api -import okhttp3.ResponseBody import retrofit2.Response import retrofit2.http.Body import retrofit2.http.GET @@ -28,7 +27,10 @@ interface ApiService { suspend fun getEmployeeInfo(@Path("login") login: String): Response @PATCH("/api/open") // Открыть дверь - suspend fun openDoor(@Body request: OpenDoorRequest): Response // Измените Response на Response + suspend fun openDoor( + @Header("Authorization") authHeader: String, + @Body request: OpenDoorRequest + ): Response // Измените Response на Response @POST("/api/employee/toggleAccess") // Метод для блокировки/разблокировки доступа suspend fun toggleAccess(@Body request: ToggleAccessRequest): Response @@ -41,7 +43,8 @@ interface ApiService { data class EmployeeData( val name: String, val position: String, - val lastVisit: String + val lastVisit: String, + val avatarUrl: String? // Добавьте это поле ) // Модель данных для запроса блокировки/разблокировки доступа @@ -52,6 +55,5 @@ data class ToggleAccessRequest( // Модель данных для запроса открытия двери data class OpenDoorRequest( - val login: String, // Логин сотрудника val value: Long // Код для открытия двери ) \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/Main/MainFragment.kt b/app/src/main/java/ru/myitschool/work/ui/Main/MainFragment.kt index 27c1452..287a1a1 100644 --- a/app/src/main/java/ru/myitschool/work/ui/Main/MainFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/Main/MainFragment.kt @@ -1,12 +1,14 @@ package ru.myitschool.work.ui.main import android.os.Bundle +import android.util.Log import android.view.View import android.widget.Toast import androidx.fragment.app.Fragment import androidx.fragment.app.setFragmentResultListener import androidx.lifecycle.lifecycleScope import androidx.navigation.fragment.findNavController +import com.squareup.picasso.Picasso import kotlinx.coroutines.launch import ru.myitschool.work.R import ru.myitschool.work.api.ApiService @@ -44,6 +46,83 @@ class MainFragment : Fragment(R.layout.fragment_main) { checkQrResult() } + private fun setupUI() { + binding.refresh.setOnClickListener { + fetchUserInfo() + } + + binding.scanQrCode?.setOnClickListener { + // Переход к экрану сканирования QR-кода + findNavController().navigate(R.id.qrScanFragment) // Убедитесь, что у вас есть правильный ID для навигации + } + + // Проверяем роль пользователя и показываем кнопку AdminPanel, если роль admin + if (SessionManager.userRole == "admin") { + binding.adminPanelButton?.visibility = View.VISIBLE + binding.adminPanelButton?.setOnClickListener { + findNavController().navigate(R.id.adminFragment) // Переход к экрану администратора + } + } else { + binding.adminPanelButton?.visibility = View.GONE // Скрываем кнопку, если не admin + } + } + + private fun fetchUserInfo() { + lifecycleScope.launch { + val login = SessionManager.userLogin ?: run { + binding.error.text = "Пользователь не авторизован" + binding.error.visibility = View.VISIBLE + return@launch + } + val authHeader = SessionManager.getAuthHeader() ?: run { + binding.error.text = "Ошибка авторизации" + binding.error.visibility = View.VISIBLE + return@launch + } + + try { + val response = apiService.getUserInfo(login, authHeader) + + // Логируем код ответа + Log.d("MainFragment", "Response code: ${response.code()}") + + if (response.isSuccessful) { + val employeeData = response.body() + employeeData?.let { + binding.fullname.text = it.name + binding.position.text = it.position + binding.lastEntry.text = it.lastVisit + + // Логируем URL аватара + Log.d("MainFragment", "Avatar URL: ${it.avatarUrl}") + + // Загрузка аватара с помощью Picasso + if (it.avatarUrl != null) { + Picasso.get() + .load(it.avatarUrl) + .placeholder(R.drawable.ic_refresh) // Замените на ваш ресурс-заполнитель + .error(R.drawable.ic_close) // Замените на ваш ресурс ошибки + .into(binding.photo) + binding.photo.visibility = View.VISIBLE + } else { + binding.photo.visibility = View.GONE // Скрыть, если URL нет + } + + // Показываем кнопку "Сканировать QR-код" после успешного получения данных + binding.scanQrCode?.visibility = View.VISIBLE + } + } else { + binding.error.text = "Ошибка получения данных: ${response.message()}" + binding.error.visibility = View.VISIBLE + } + } catch (e: Exception) { + Log.e("MainFragment", "Error fetching user info", e) + binding.error.text = "Ошибка сети: ${e.message}" + binding.error.visibility = View.VISIBLE + } + } + } + private fun checkQrResult() { // Слушаем результат QR сканирования setFragmentResultListener(QrScanDestination.REQUEST_KEY) { _, bundle -> @@ -58,44 +137,6 @@ class MainFragment : Fragment(R.layout.fragment_main) { } } - private fun setupUI() { - binding.refresh.setOnClickListener { - fetchUserInfo() - } - - binding.scanQrCode?.setOnClickListener { - // Переход к экрану сканирования QR-кода - findNavController().navigate(R.id.qrScanFragment) // Убедитесь, что у вас есть правильный ID для навигации - } - } - - private fun fetchUserInfo() { - lifecycleScope.launch { - val login = SessionManager.userLogin ?: return@launch - val authHeader = SessionManager.getAuthHeader() - val response = apiService.getUserInfo(login, authHeader) - - if (response.isSuccessful) { - val employeeData = response.body() - employeeData?.let { - binding.fullname.text = it.name - binding.position.text = it.position - binding.lastEntry.text = it.lastVisit - binding.photo.visibility = View.VISIBLE - binding.fullname.visibility = View.VISIBLE - binding.position.visibility = View.VISIBLE - binding.lastEntry.visibility = View.VISIBLE - - // Показываем кнопку "Сканировать QR-код" после успешного получения данных - binding.scanQrCode?.visibility = View.VISIBLE - } - } else { - binding.error.text = "Ошибка получения данных" - binding.error.visibility = View.VISIBLE - } - } - } - override fun onDestroyView() { _binding = null super.onDestroyView() diff --git a/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResult.kt b/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResult.kt index 98b74e8..6279d4f 100644 --- a/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResult.kt +++ b/app/src/main/java/ru/myitschool/work/ui/qr/result/QrResult.kt @@ -8,6 +8,7 @@ import android.os.Bundle import android.util.Log import android.view.LayoutInflater import android.view.View +import android.util.Base64 import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope @@ -62,25 +63,37 @@ class QrResult : Fragment(R.layout.fragment_qr_scan_result) { private fun sendRequestToServer(qrData: String) { lifecycleScope.launch { try { - val login = SessionManager.userLogin - if (login != null) { - val openDoorRequest = OpenDoorRequest(login, qrData.toLong()) // Преобразуем qrData в Long - val response = apiService.openDoor(openDoorRequest) - if (response.isSuccessful) { - binding.result.text = "Успешно/Success" - } else { - binding.result.text = "Что-то пошло не так/Something went wrong: ${response.message()}" - } + val qrValue = qrData.toLong() // Преобразуем данные QR-кода в Long + val login = SessionManager.userLogin ?: "default_login" // Замените на ваш логин + val password = "your_password" // Замените на ваш пароль + val authHeader = "Basic " + Base64.encodeToString("$login:$password".toByteArray(), Base64.NO_WRAP) + + // Логируем данные перед отправкой + Log.d("QrResult", "Sending request with QR value: $qrValue and authHeader: $authHeader") + + // Создаем объект запроса + val request = OpenDoorRequest(qrValue) + + // Вызываем метод openDoor с правильными параметрами + val response = apiService.openDoor(authHeader, request) + + // Логируем код ответа и тело ответа + Log.d("QrResult", "Response code: ${response.code()}") + Log.d("QrResult", "Response body: ${response.body()}") + + if (response.isSuccessful) { + binding.result.text = "Door Opened" // Сообщение о том, что дверь открыта } else { - binding.result.text = "Пользователь не авторизован/Unauthorized user" + binding.result.text = "Door Closed" // Сообщение о том, что дверь закрыта } + } catch (e: NumberFormatException) { + binding.result.text = "Некорректные данные QR-кода" } catch (e: Exception) { - binding.result.text = "Что-то пошло не так/Something went wrong: ${e.message}" - Log.e("QrResult", "Error sending request to server", e) + binding.result.text = "Что-то пошло не так: ${e.message}" + Log.e("QrResult", "Error: ${e.message}", e) // Логируем ошибку } } } - override fun onDestroyView() { _binding = null super.onDestroyView() diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index 5eb405e..036c360 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -54,4 +54,12 @@ android:layout_height="wrap_content" android:text="Сканировать QR-код" android:visibility="gone" /> + +