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 ru.myitschool.work.R | ||||
| 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.qr.result.QrResultDestination | ||||
| import ru.myitschool.work.ui.qr.scan.QrScanDestination | ||||
| @ -43,7 +44,7 @@ class MainFragment: Fragment(R.layout.fragment_main) { | ||||
|         findNavController().navigate(QrScanDestination) | ||||
|       } | ||||
|       binding.admin.setOnClickListener{ | ||||
| 
 | ||||
|         findNavController().navigate(AdminDestination) | ||||
|       } | ||||
|     } | ||||
|     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