admin panel worker info with block
This commit is contained in:
		
							parent
							
								
									4912c972fd
								
							
						
					
					
						commit
						933ac87888
					
				
							
								
								
									
										82
									
								
								.kotlin/errors/errors-1739897793894.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								.kotlin/errors/errors-1739897793894.log
									
									
									
									
									
										Normal file
									
								
							| @ -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-backups17220056760637860906 | ||||||
|  | 	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 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| @ -0,0 +1,5 @@ | |||||||
|  | package ru.myitschool.work.ui.admin | ||||||
|  | import kotlinx.serialization.Serializable | ||||||
|  | 
 | ||||||
|  | @Serializable | ||||||
|  | data object AdminDestination | ||||||
| @ -0,0 +1,85 @@ | |||||||
|  | package ru.myitschool.work.ui.admin | ||||||
|  | 
 | ||||||
|  | import android.os.Bundle | ||||||
|  | import android.view.View | ||||||
|  | import androidx.fragment.app.Fragment | ||||||
|  | import androidx.fragment.app.viewModels | ||||||
|  | import androidx.navigation.fragment.findNavController | ||||||
|  | import com.squareup.picasso.Picasso | ||||||
|  | import dagger.hilt.android.AndroidEntryPoint | ||||||
|  | import kotlinx.coroutines.flow.MutableStateFlow | ||||||
|  | import kotlinx.coroutines.flow.asStateFlow | ||||||
|  | import ru.myitschool.work.R | ||||||
|  | import ru.myitschool.work.databinding.FragmentAdminBinding | ||||||
|  | import ru.myitschool.work.ui.main.MainDestination | ||||||
|  | import ru.myitschool.work.utils.collectWhenStarted | ||||||
|  | import ru.myitschool.work.utils.TextChangedListener | ||||||
|  | 
 | ||||||
|  | @AndroidEntryPoint | ||||||
|  | class AdminFragment : Fragment(R.layout.fragment_admin) { | ||||||
|  |     private var _binding: FragmentAdminBinding? = null | ||||||
|  |     private val binding: FragmentAdminBinding get() = _binding!! | ||||||
|  |     private val picasso: Picasso by lazy { Picasso.get() } | ||||||
|  | 
 | ||||||
|  |     private val viewModel: AdminViewModel by viewModels() | ||||||
|  | 
 | ||||||
|  |     override fun onViewCreated(view: View, savedInstanceState: Bundle?) { | ||||||
|  |         super.onViewCreated(view, savedInstanceState) | ||||||
|  |         _binding = FragmentAdminBinding.bind(view) | ||||||
|  | 
 | ||||||
|  |         binding.loginadmin.addTextChangedListener(TextChangedListener { viewModel.onUsernameChanged(it) }) | ||||||
|  |         subscribe() | ||||||
|  |         binding.find.setOnClickListener { | ||||||
|  |             login(binding.loginadmin.text.toString()) | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private fun login(username: String) { | ||||||
|  |         viewModel.loadPersonInfo(username) { | ||||||
|  |             viewModel.state.collectWhenStarted(this) { state -> | ||||||
|  |                 if (state.photo.isNotEmpty()) { | ||||||
|  |                     picasso.load(state.photo).into(binding.photoAdmin) | ||||||
|  |                 } | ||||||
|  |                 binding.fullnameAdmin.text = state.fullName | ||||||
|  |                 binding.positionAdmin.text = state.position | ||||||
|  |                 binding.lastEntryAdmin.text = state.lastVisit | ||||||
|  |                 setError(state.error) | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private fun subscribe() { | ||||||
|  | //        viewModel.state.collectWhenStarted(this) { state -> | ||||||
|  | //            binding.login.isEnabled = state.isLoginEnabled | ||||||
|  | //            if (state.error != null) { | ||||||
|  | //                binding.error.visibility = View.VISIBLE | ||||||
|  | //                binding.error.text = state.error | ||||||
|  | //            } else { | ||||||
|  | //                binding.error.visibility = View.GONE | ||||||
|  | //            } | ||||||
|  | //        } | ||||||
|  | //        viewModel.savedUsername.collectWhenStarted(this) { username -> | ||||||
|  | //            viewModel.savedPassword.collectWhenStarted(this) { password -> | ||||||
|  | //                if (!username.isNullOrBlank() && !password.isNullOrBlank()) { | ||||||
|  | //                    login(username, password) | ||||||
|  | //                } | ||||||
|  | //            } | ||||||
|  | //        } | ||||||
|  |         println("akjshdfg") | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     private fun setError(error: String?) { | ||||||
|  |         val showError = error != null | ||||||
|  |         val views = listOf(binding.fullnameAdmin, binding.positionAdmin, binding.lastEntryAdmin, binding.photoAdmin) | ||||||
|  |         views.forEach { it.visibility = if (showError) View.GONE else View.VISIBLE} | ||||||
|  |         binding.errorAdmin.visibility = if (showError) View.VISIBLE else View.GONE | ||||||
|  |         binding.block.visibility = if (showError) View.GONE else View.VISIBLE | ||||||
|  |         binding.errorAdmin.text = error ?: "" | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     override fun onDestroyView() { | ||||||
|  |         _binding = null | ||||||
|  |         super.onDestroyView() | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								app/src/main/java/ru/myitschool/work/ui/admin/AdminState.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								app/src/main/java/ru/myitschool/work/ui/admin/AdminState.kt
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | |||||||
|  | package ru.myitschool.work.ui.admin | ||||||
|  | 
 | ||||||
|  | data class AdminState( | ||||||
|  |     val isLoginEnabled: Boolean = false, val error: String? = null | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | data class AdminMainState( | ||||||
|  |     val fullName: String = "", | ||||||
|  |     val photo: String = "", | ||||||
|  |     val position: String = "", | ||||||
|  |     val lastVisit: String = "", | ||||||
|  |     val error: String? = null | ||||||
|  | ) | ||||||
| @ -0,0 +1,86 @@ | |||||||
|  | package ru.myitschool.work.ui.admin | ||||||
|  | 
 | ||||||
|  | import android.content.Context | ||||||
|  | import android.util.Log | ||||||
|  | import androidx.lifecycle.ViewModel | ||||||
|  | import androidx.lifecycle.viewModelScope | ||||||
|  | import com.google.gson.GsonBuilder | ||||||
|  | import dagger.hilt.android.lifecycle.HiltViewModel | ||||||
|  | import dagger.hilt.android.qualifiers.ApplicationContext | ||||||
|  | import kotlinx.coroutines.flow.MutableStateFlow | ||||||
|  | import kotlinx.coroutines.flow.asStateFlow | ||||||
|  | import kotlinx.coroutines.flow.update | ||||||
|  | import kotlinx.coroutines.launch | ||||||
|  | import retrofit2.HttpException | ||||||
|  | import ru.myitschool.work.data.remote.LoginApi | ||||||
|  | import ru.myitschool.work.data.remote.ErrorDto | ||||||
|  | import ru.myitschool.work.di.AppModule | ||||||
|  | import ru.myitschool.work.ui.admin.AdminState | ||||||
|  | import java.text.SimpleDateFormat | ||||||
|  | import javax.inject.Inject | ||||||
|  | 
 | ||||||
|  | @HiltViewModel | ||||||
|  | class AdminViewModel @Inject constructor( | ||||||
|  |     @ApplicationContext private val context: Context, | ||||||
|  |     private val api: LoginApi, | ||||||
|  |     private val dataStoreManager: AppModule.DataStoreManager | ||||||
|  | ) : ViewModel() { | ||||||
|  |     private val _state = MutableStateFlow(AdminMainState()) | ||||||
|  |     val state = _state.asStateFlow() | ||||||
|  | 
 | ||||||
|  |     private val _stateL = MutableStateFlow(AdminState()) | ||||||
|  |     val stateL = _stateL.asStateFlow() | ||||||
|  | 
 | ||||||
|  |     private val dfo = SimpleDateFormat("yyyy-MM-dd HH:mm") | ||||||
|  |     private val dfi= SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss") | ||||||
|  | 
 | ||||||
|  |     fun loadPersonInfo(username: String, onSuccess: () -> Unit) { | ||||||
|  |         viewModelScope.launch { | ||||||
|  |             try { | ||||||
|  |                 val info = api.info(username) | ||||||
|  |                 _state.update { | ||||||
|  |                     AdminMainState( | ||||||
|  |                         fullName = info.name, | ||||||
|  |                         photo = info.photo, | ||||||
|  |                         position = info.position, | ||||||
|  |                         lastVisit = dfo.format(dfi.parse(info.lastVisit)!!), | ||||||
|  |                         error = null | ||||||
|  |                     ) | ||||||
|  |                 } | ||||||
|  |                 onSuccess() | ||||||
|  |             } catch (httpException: HttpException) { | ||||||
|  |                 try { | ||||||
|  |                     httpException.response()?.errorBody()?.string()?.let { errorString -> | ||||||
|  |                         val gson = GsonBuilder().create() | ||||||
|  |                         val errorDto = gson.fromJson(errorString, ErrorDto::class.java) | ||||||
|  |                         _state.update { | ||||||
|  |                             AdminMainState( | ||||||
|  |                                 error = errorDto.error | ||||||
|  |                             ) | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } catch (e: Exception) { | ||||||
|  |                     _state.update { AdminMainState(error = httpException.message()) } | ||||||
|  |                 } | ||||||
|  |             } catch (e: Exception) { | ||||||
|  |                 _state.update { AdminMainState(error = "Unknown error: ${e.message}") } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     fun onUsernameChanged(username: String) = | ||||||
|  |         _stateL.update { it.copy(isLoginEnabled = isUsernameValid(username), error = null) } | ||||||
|  | 
 | ||||||
|  |     companion object { | ||||||
|  |         fun isUsernameValid(username: String): Boolean { | ||||||
|  |             if (username.isEmpty() || username.length < 3 || username.first().isDigit()) { | ||||||
|  |                 return false | ||||||
|  |             } | ||||||
|  |             return username.all { it.isLetterOrDigit() && it.isAsciiPrintable() } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         private fun Char.isAsciiPrintable(): Boolean { | ||||||
|  |             return this.code in 32..126 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -10,6 +10,7 @@ import com.squareup.picasso.Picasso | |||||||
| import dagger.hilt.android.AndroidEntryPoint | import dagger.hilt.android.AndroidEntryPoint | ||||||
| import ru.myitschool.work.R | import ru.myitschool.work.R | ||||||
| import ru.myitschool.work.databinding.FragmentMainBinding | import ru.myitschool.work.databinding.FragmentMainBinding | ||||||
|  | import ru.myitschool.work.ui.admin.AdminDestination | ||||||
| import ru.myitschool.work.ui.login.LoginDestination | import ru.myitschool.work.ui.login.LoginDestination | ||||||
| import ru.myitschool.work.ui.qr.result.QrResultDestination | import ru.myitschool.work.ui.qr.result.QrResultDestination | ||||||
| import ru.myitschool.work.ui.qr.scan.QrScanDestination | import ru.myitschool.work.ui.qr.scan.QrScanDestination | ||||||
| @ -43,7 +44,7 @@ class MainFragment: Fragment(R.layout.fragment_main) { | |||||||
|         findNavController().navigate(QrScanDestination) |         findNavController().navigate(QrScanDestination) | ||||||
|       } |       } | ||||||
|       binding.admin.setOnClickListener{ |       binding.admin.setOnClickListener{ | ||||||
| 
 |         findNavController().navigate(AdminDestination) | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|     subscribe() |     subscribe() | ||||||
|  | |||||||
							
								
								
									
										141
									
								
								app/src/main/res/layout/fragment_admin.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								app/src/main/res/layout/fragment_admin.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,141 @@ | |||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||||
|  |     xmlns:tools="http://schemas.android.com/tools" | ||||||
|  |     android:layout_width="match_parent" | ||||||
|  |     android:layout_height="match_parent"> | ||||||
|  | 
 | ||||||
|  |     <TextView | ||||||
|  |         android:id="@+id/admin_name" | ||||||
|  |         android:layout_width="89dp" | ||||||
|  |         android:layout_height="25dp" | ||||||
|  |         android:text="TextView" | ||||||
|  |         app:layout_constraintBottom_toBottomOf="parent" | ||||||
|  |         app:layout_constraintEnd_toEndOf="parent" | ||||||
|  |         app:layout_constraintStart_toStartOf="parent" | ||||||
|  |         app:layout_constraintTop_toTopOf="parent" | ||||||
|  |         app:layout_constraintVertical_bias="0.118" /> | ||||||
|  | 
 | ||||||
|  |     <Button | ||||||
|  |         android:id="@+id/block" | ||||||
|  |         android:layout_width="wrap_content" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:layout_marginTop="24dp" | ||||||
|  |         android:layout_weight="1" | ||||||
|  |         android:text="заблокировать" | ||||||
|  |         android:visibility="gone" | ||||||
|  |         app:layout_constraintEnd_toEndOf="@+id/loginadmin" | ||||||
|  |         app:layout_constraintHorizontal_bias="0.0" | ||||||
|  |         app:layout_constraintStart_toStartOf="@+id/loginadmin" | ||||||
|  |         app:layout_constraintTop_toBottomOf="@+id/loginadmin" /> | ||||||
|  | 
 | ||||||
|  |     <TextView | ||||||
|  |         android:id="@+id/errorAdmin" | ||||||
|  |         android:layout_width="wrap_content" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:layout_marginTop="16dp" | ||||||
|  |         android:text="TextView" | ||||||
|  |         android:textSize="24sp" | ||||||
|  |         android:visibility="gone" | ||||||
|  |         app:layout_constraintEnd_toEndOf="parent" | ||||||
|  |         app:layout_constraintStart_toStartOf="parent" | ||||||
|  |         app:layout_constraintTop_toBottomOf="@+id/block" /> | ||||||
|  | 
 | ||||||
|  |     <TextView | ||||||
|  |         android:id="@+id/lastEntryAdmin" | ||||||
|  |         android:layout_width="wrap_content" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:layout_marginTop="20dp" | ||||||
|  |         android:text="TextView" | ||||||
|  |         android:textSize="20sp" | ||||||
|  |         android:visibility="gone" | ||||||
|  |         app:layout_constraintEnd_toEndOf="parent" | ||||||
|  |         app:layout_constraintHorizontal_bias="0.501" | ||||||
|  |         app:layout_constraintStart_toStartOf="parent" | ||||||
|  |         app:layout_constraintTop_toBottomOf="@+id/positionAdmin" /> | ||||||
|  | 
 | ||||||
|  |     <TextView | ||||||
|  |         android:id="@+id/fullnameAdmin" | ||||||
|  |         android:layout_width="wrap_content" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:text="TextView" | ||||||
|  |         android:textSize="24sp" | ||||||
|  |         android:visibility="gone" | ||||||
|  |         app:layout_constraintBottom_toBottomOf="parent" | ||||||
|  |         app:layout_constraintEnd_toEndOf="parent" | ||||||
|  |         app:layout_constraintStart_toStartOf="parent" | ||||||
|  |         app:layout_constraintTop_toBottomOf="@+id/errorAdmin" | ||||||
|  |         app:layout_constraintVertical_bias="0.033" /> | ||||||
|  | 
 | ||||||
|  |     <TextView | ||||||
|  |         android:id="@+id/positionAdmin" | ||||||
|  |         android:layout_width="wrap_content" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:layout_marginTop="8dp" | ||||||
|  |         android:text="TextView" | ||||||
|  |         android:textSize="20sp" | ||||||
|  |         android:visibility="gone" | ||||||
|  |         app:layout_constraintEnd_toEndOf="parent" | ||||||
|  |         app:layout_constraintHorizontal_bias="0.501" | ||||||
|  |         app:layout_constraintStart_toStartOf="parent" | ||||||
|  |         app:layout_constraintTop_toBottomOf="@+id/photoAdmin" /> | ||||||
|  | 
 | ||||||
|  |     <ScrollView | ||||||
|  |         android:layout_width="409dp" | ||||||
|  |         android:layout_height="438dp" | ||||||
|  |         android:layout_marginTop="20dp" | ||||||
|  |         app:layout_constraintTop_toBottomOf="@+id/lastEntryAdmin" | ||||||
|  |         tools:layout_editor_absoluteX="-2dp"> | ||||||
|  | 
 | ||||||
|  |         <LinearLayout | ||||||
|  |             android:layout_width="match_parent" | ||||||
|  |             android:layout_height="wrap_content" | ||||||
|  |             android:orientation="vertical" /> | ||||||
|  |     </ScrollView> | ||||||
|  | 
 | ||||||
|  |     <ImageView | ||||||
|  |         android:id="@+id/photoAdmin" | ||||||
|  |         android:layout_width="wrap_content" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:layout_marginTop="12dp" | ||||||
|  |         android:visibility="gone" | ||||||
|  |         app:layout_constraintEnd_toEndOf="parent" | ||||||
|  |         app:layout_constraintHorizontal_bias="0.501" | ||||||
|  |         app:layout_constraintStart_toStartOf="parent" | ||||||
|  |         app:layout_constraintTop_toBottomOf="@+id/fullnameAdmin" | ||||||
|  |         tools:srcCompat="@tools:sample/avatars" /> | ||||||
|  | 
 | ||||||
|  |     <EditText | ||||||
|  |         android:id="@+id/loginadmin" | ||||||
|  |         android:layout_width="164dp" | ||||||
|  |         android:layout_height="54dp" | ||||||
|  |         android:layout_marginTop="12dp" | ||||||
|  |         android:ems="10" | ||||||
|  |         android:inputType="text" | ||||||
|  |         android:hint = "@string/login_admin_label" | ||||||
|  |         app:layout_constraintEnd_toEndOf="parent" | ||||||
|  |         app:layout_constraintStart_toStartOf="parent" | ||||||
|  |         app:layout_constraintTop_toBottomOf="@+id/admin_name" /> | ||||||
|  | 
 | ||||||
|  |     <Button | ||||||
|  |         android:id="@+id/find" | ||||||
|  |         android:layout_width="98dp" | ||||||
|  |         android:layout_height="47dp" | ||||||
|  |         android:text="Найти" | ||||||
|  |         app:layout_constraintBottom_toBottomOf="@+id/loginadmin" | ||||||
|  |         app:layout_constraintEnd_toEndOf="parent" | ||||||
|  |         app:layout_constraintStart_toEndOf="@+id/loginadmin" | ||||||
|  |         app:layout_constraintTop_toTopOf="@+id/loginadmin" /> | ||||||
|  | 
 | ||||||
|  |     <Button | ||||||
|  |         android:id="@+id/backAdmin" | ||||||
|  |         android:layout_width="98dp" | ||||||
|  |         android:layout_height="47dp" | ||||||
|  |         android:text="назад" | ||||||
|  |         app:layout_constraintBottom_toBottomOf="@+id/loginadmin" | ||||||
|  |         app:layout_constraintEnd_toStartOf="@+id/loginadmin" | ||||||
|  |         app:layout_constraintStart_toStartOf="parent" | ||||||
|  |         app:layout_constraintTop_toTopOf="@+id/loginadmin" | ||||||
|  |         app:layout_constraintVertical_bias="0.0" /> | ||||||
|  | 
 | ||||||
|  | </androidx.constraintlayout.widget.ConstraintLayout> | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 shipovnikaaa
						shipovnikaaa