From 1a887da8c775fd537b72ec300f4ec50d8619d389 Mon Sep 17 00:00:00 2001 From: Terebov_Maksim Date: Wed, 19 Feb 2025 11:12:23 +0300 Subject: [PATCH] day2_commit_4_UI_fixed_crash_app_when_backend_off --- .kotlin/errors/errors-1739952536870.log | 82 +++++++++++++++++++ .../myitschool/work/ui/Main/MainViewModel.kt | 25 ++++-- .../myitschool/work/ui/login/LoginFragment.kt | 37 ++++++--- .../work/ui/login/LoginViewModel.kt | 24 ++++-- 4 files changed, 144 insertions(+), 24 deletions(-) create mode 100644 .kotlin/errors/errors-1739952536870.log diff --git a/.kotlin/errors/errors-1739952536870.log b/.kotlin/errors/errors-1739952536870.log new file mode 100644 index 0000000..3be1f9e --- /dev/null +++ b/.kotlin/errors/errors-1739952536870.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-backups14802231755905846813 + 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/ui/Main/MainViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/Main/MainViewModel.kt index 41edf8c..e18e24a 100644 --- a/app/src/main/java/ru/myitschool/work/ui/Main/MainViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/Main/MainViewModel.kt @@ -23,13 +23,26 @@ class MainViewModel @Inject constructor( private fun loadUserData() { viewModelScope.launch { - val login = SessionManager.userLogin - if (login != null) { - val response = apiService.getUserInfo(login) - if (response.isSuccessful) { - _userInfoState.value = response.body() + try { + val login = SessionManager.userLogin + if (login != null) { + val response = apiService.getUserInfo(login) + if (response.isSuccessful) { + _userInfoState.value = response.body() + } else { + // Обработка ошибки, если ответ не успешен + _userInfoState.value = null // Или установите какое-то состояние ошибки + } + } else { + // Логин равен null, обработайте это состояние + _userInfoState.value = null // Или установите какое-то состояние ошибки } + } catch (e: Exception) { + // Логирование ошибки + e.printStackTrace() + // Установите состояние ошибки + _userInfoState.value = null // Или установите какое-то состояние ошибки } } } -} +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt b/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt index 7475f45..bd2f510 100644 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/login/LoginFragment.kt @@ -7,6 +7,7 @@ import android.text.TextWatcher import android.util.Log import android.view.View import android.widget.Toast +import androidx.appcompat.app.AlertDialog import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController @@ -83,19 +84,35 @@ class LoginFragment : Fragment(R.layout.fragment_login) { viewModel.state.collectWhenStarted(this) { state -> binding.loading.visibleOrGone(false) - if (state.error != null) { - binding.error.text = state.error - binding.error.visibility = View.VISIBLE - } else if (state.success) { - binding.error.visibility = View.GONE - authPreferences.saveLoginState(true) - authPreferences.saveLogin(binding.username.text.toString()) // Сохраняем логин - Toast.makeText(context, "Авторизация прошла успешно", Toast.LENGTH_SHORT).show() - navigateToMainScreen() + try { + if (state.maintenance) { + showMaintenanceDialog() // Показываем диалог о техработах + } else if (state.error != null) { + binding.error.text = state.error + binding.error.visibility = View.VISIBLE + } else if (state.success) { + binding.error.visibility = View.GONE + authPreferences.saveLoginState(true) + authPreferences.saveLogin(binding.username.text.toString()) // Сохраняем логин + Toast.makeText(context, "Авторизация прошла успешно", Toast.LENGTH_SHORT).show() + navigateToMainScreen() + } + } catch (e: Exception) { + Log.e("LoginFragment", "Ошибка при обработке состояния", e) + Toast.makeText(context, "Произошла ошибка. Пожалуйста, попробуйте снова.", Toast.LENGTH_SHORT).show() } } } + private fun showMaintenanceDialog() { + AlertDialog.Builder(requireContext()) + .setTitle("Технические работы") + .setMessage("Проводятся техработы, пожалуйста, подождите.") + .setPositiveButton("ОК") { dialog, _ -> dialog.dismiss() } + .setCancelable(false) + .show() + } + private fun navigateToMainScreen() { try { findNavController().apply { @@ -103,7 +120,7 @@ class LoginFragment : Fragment(R.layout.fragment_login) { navigate(R.id.mainFragment) } } catch (e: Exception) { - Log.e("LF", "Nav_err", e) + Log.e("LoginFragment", "Nav_err", e) Toast.makeText(context, "Ошибка перехода", Toast.LENGTH_SHORT).show() } } diff --git a/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt index 6252195..6ea460d 100644 --- a/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/login/LoginViewModel.kt @@ -34,13 +34,21 @@ class LoginViewModel @Inject constructor( fun authenticate(username: String, password: String) { if (isValidUsername(username)) { viewModelScope.launch { - val credentials = Credentials.basic(username, password) // Создаем Basic Auth заголовок - val response = apiService.authenticate(username, credentials) // Передаем заголовок в запрос - if (response.isSuccessful) { - SessionManager.userLogin = username - _state.value = LoginState(success = true) - } else { - _state.value = LoginState(error = "Ошибка авторизации") + try { + val credentials = Credentials.basic(username, password) // Создаем Basic Auth заголовок + val response = apiService.authenticate(username, credentials) // Передаем заголовок в запрос + if (response.isSuccessful) { + SessionManager.userLogin = username + _state.value = LoginState(success = true) + } else if (response.code() == 503) { // Пример кода для техработ + _state.value = LoginState(maintenance = true) + } else { + _state.value = LoginState(error = "Ошибка авторизации") + } + } catch (e: Exception) { + // Логирование ошибки + e.printStackTrace() + _state.value = LoginState(error = "Ошибка сети. Проверьте подключение к интернету.") } } } else { @@ -52,5 +60,5 @@ class LoginViewModel @Inject constructor( return username.length >= 3 && !username.first().isDigit() && username.all { it.isLetterOrDigit() } } - data class LoginState(val success: Boolean = false, val error: String? = null) + data class LoginState(val success: Boolean = false, val error: String? = null, val maintenance: Boolean = false) } \ No newline at end of file