update qr scan and navigation
This commit is contained in:
parent
639719453f
commit
87ad1617a4
@ -1,5 +1,5 @@
|
|||||||
package ru.myitschool.work.core
|
package ru.myitschool.work.core
|
||||||
// БЕРИТЕ И ИЗМЕНЯЙТЕ ХОСТ ТОЛЬКО ЗДЕСЬ И НЕ БЕРИТЕ ИЗ ДРУГИХ МЕСТ. ФАЙЛ ПЕРЕМЕЩАТЬ НЕЛЬЗЯ
|
// БЕРИТЕ И ИЗМЕНЯЙТЕ ХОСТ ТОЛЬКО ЗДЕСЬ И НЕ БЕРИТЕ ИЗ ДРУГИХ МЕСТ. ФАЙЛ ПЕРЕМЕЩАТЬ НЕЛЬЗЯ
|
||||||
object Constants {
|
object Constants {
|
||||||
const val SERVER_ADDRESS = "http://10.0.2.2:8080"
|
const val SERVER_ADDRESS = "http://10.6.66.79:8080"
|
||||||
}
|
}
|
@ -3,12 +3,14 @@ package ru.myitschool.work.ui
|
|||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import android.view.View
|
||||||
import androidx.activity.OnBackPressedCallback
|
import androidx.activity.OnBackPressedCallback
|
||||||
import androidx.appcompat.app.AppCompatActivity
|
import androidx.appcompat.app.AppCompatActivity
|
||||||
import androidx.navigation.createGraph
|
import androidx.navigation.createGraph
|
||||||
import androidx.navigation.findNavController
|
import androidx.navigation.findNavController
|
||||||
import androidx.navigation.fragment.NavHostFragment
|
import androidx.navigation.fragment.NavHostFragment
|
||||||
import androidx.navigation.fragment.fragment
|
import androidx.navigation.fragment.fragment
|
||||||
|
import androidx.navigation.ui.setupWithNavController
|
||||||
import com.google.android.material.bottomnavigation.BottomNavigationView
|
import com.google.android.material.bottomnavigation.BottomNavigationView
|
||||||
import dagger.hilt.android.AndroidEntryPoint
|
import dagger.hilt.android.AndroidEntryPoint
|
||||||
import ru.myitschool.work.R
|
import ru.myitschool.work.R
|
||||||
@ -33,16 +35,17 @@ class RootActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
val navController = navHostFragment?.navController ?: throw IllegalStateException("NavHostFragment not found")
|
val navController = navHostFragment?.navController ?: throw IllegalStateException("NavHostFragment not found")
|
||||||
val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottom_navigation)
|
val bottomNavigationView = findViewById<BottomNavigationView>(R.id.bottom_navigation)
|
||||||
|
bottomNavigationView.setupWithNavController(navController)
|
||||||
|
|
||||||
//navController.setGraph(R.navigation.main_nav_graph)
|
//navController.setGraph(R.navigation.main_nav_graph)
|
||||||
//navController.navigate(R.id.fragment_profile)
|
//navController.navigate(R.id.fragment_profile)
|
||||||
Log.d("role", "$userRole")
|
Log.d("role", "$userRole")
|
||||||
if (userRole == "ROLE_ADMIN") {
|
if (userRole == "ROLE_ADMIN") {
|
||||||
navController.setGraph(R.navigation.main_nav_graph)
|
navController.setGraph(R.navigation.main_admin_nav_graph)
|
||||||
navController.navigate(R.id.fragment_profile)
|
navController.navigate(R.id.fragment_profile)
|
||||||
} else {
|
} else {
|
||||||
navController.setGraph(R.navigation.main_nav_graph)
|
navController.setGraph(R.navigation.main_nav_graph)
|
||||||
bottomNavigationView.menu.clear()
|
bottomNavigationView.visibility = View.GONE
|
||||||
navController.navigate(R.id.fragment_profile)
|
navController.navigate(R.id.fragment_profile)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,50 @@
|
|||||||
|
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.lifecycle.ViewModel
|
||||||
|
import androidx.navigation.fragment.findNavController
|
||||||
|
import com.squareup.picasso.Picasso
|
||||||
|
import ru.myitschool.work.R
|
||||||
|
import ru.myitschool.work.databinding.FragmentAdminBinding
|
||||||
|
import ru.myitschool.work.databinding.FragmentProfileBinding
|
||||||
|
import ru.myitschool.work.ui.profile.ProfileViewModel
|
||||||
|
import ru.myitschool.work.utils.collectWithLifecycle
|
||||||
|
|
||||||
|
class AdminFragment : Fragment(R.layout.fragment_admin) {
|
||||||
|
private var _viewBinding: FragmentAdminBinding? = null
|
||||||
|
private val viewBinding: FragmentAdminBinding get() = _viewBinding!!
|
||||||
|
|
||||||
|
private val viewModel by viewModels<AdminViewModel> { AdminViewModel.Factory }
|
||||||
|
|
||||||
|
|
||||||
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
_viewBinding = FragmentAdminBinding.bind(view)
|
||||||
|
super.onViewCreated(view, savedInstanceState)
|
||||||
|
|
||||||
|
|
||||||
|
/*viewModel.state.collectWithLifecycle(this) { state ->
|
||||||
|
|
||||||
|
viewBinding.error.visibility = if (state is AdminViewModel.State.Error) View.VISIBLE else View.GONE
|
||||||
|
|
||||||
|
|
||||||
|
when(state) {
|
||||||
|
is AdminViewModel.State.Loading -> Unit
|
||||||
|
is AdminViewModel.State.GoToInfo -> {
|
||||||
|
findNavController().navigate()
|
||||||
|
}
|
||||||
|
is ProfileViewModel.State.Error -> {
|
||||||
|
viewBinding.errorText.text = state.text
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}*/
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onDestroyView() {
|
||||||
|
_viewBinding = null
|
||||||
|
super.onDestroyView()
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,87 @@
|
|||||||
|
package ru.myitschool.work.ui.admin
|
||||||
|
|
||||||
|
import android.util.Log
|
||||||
|
import androidx.lifecycle.ViewModel
|
||||||
|
import androidx.lifecycle.ViewModelProvider
|
||||||
|
import androidx.lifecycle.viewModelScope
|
||||||
|
import kotlinx.coroutines.flow.MutableStateFlow
|
||||||
|
import kotlinx.coroutines.flow.asStateFlow
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
import ru.myitschool.work.data.auth.AuthStorageDataSource
|
||||||
|
import ru.myitschool.work.data.user.UserNetworkDataSource
|
||||||
|
import ru.myitschool.work.data.user.UserRepoImpl
|
||||||
|
import ru.myitschool.work.domain.user.EntranceEntity
|
||||||
|
import ru.myitschool.work.domain.user.GetUserUseCase
|
||||||
|
import ru.myitschool.work.domain.user.UserEntity
|
||||||
|
|
||||||
|
class AdminViewModel(
|
||||||
|
private val getUserUseCase: GetUserUseCase
|
||||||
|
) : ViewModel() {
|
||||||
|
private val _state = MutableStateFlow<State>(State.Loading)
|
||||||
|
val state = _state.asStateFlow()
|
||||||
|
|
||||||
|
init {
|
||||||
|
updateStateGet()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun clickRefresh() {
|
||||||
|
updateStateGet()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun updateStateGet() {
|
||||||
|
viewModelScope.launch {
|
||||||
|
_state.emit(State.Loading)
|
||||||
|
val entranceList : List<EntranceEntity> = getUserUseCase.getEntrancesList().fold(
|
||||||
|
onSuccess = { list ->
|
||||||
|
list
|
||||||
|
},
|
||||||
|
onFailure = {
|
||||||
|
emptyList()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
_state.emit(
|
||||||
|
getUserUseCase.invoke().fold(
|
||||||
|
onSuccess = { data ->
|
||||||
|
Log.d("uraa", "успех успех ${data.toString()}")
|
||||||
|
|
||||||
|
State.GoToInfo(data, entranceList)
|
||||||
|
},
|
||||||
|
onFailure = { error ->
|
||||||
|
Log.d("kaput", error.message.toString())
|
||||||
|
State.Error(error.message.toString())
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
//_state.emit(State.Error("о нет ошибка ошибка помогите"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sealed interface State {
|
||||||
|
data object Loading: State
|
||||||
|
data class GoToInfo(
|
||||||
|
val profileInfo: UserEntity,
|
||||||
|
val entrancesList : List<EntranceEntity>
|
||||||
|
) : State
|
||||||
|
data class Error(
|
||||||
|
val text: String
|
||||||
|
) : State
|
||||||
|
}
|
||||||
|
companion object {
|
||||||
|
val Factory : ViewModelProvider.Factory = object : ViewModelProvider.Factory {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
override fun <T : ViewModel> create(modelClass: Class<T>): T {
|
||||||
|
return AdminViewModel(
|
||||||
|
getUserUseCase = GetUserUseCase(
|
||||||
|
repo = UserRepoImpl(
|
||||||
|
userNetworkDataSource = UserNetworkDataSource()
|
||||||
|
),
|
||||||
|
authStorageDataSource = AuthStorageDataSource
|
||||||
|
)
|
||||||
|
) as T
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -56,7 +56,7 @@ class ProfileFragment : Fragment(R.layout.fragment_profile) {
|
|||||||
is ProfileViewModel.State.Show -> {
|
is ProfileViewModel.State.Show -> {
|
||||||
viewBinding.noData.visibility = View.GONE
|
viewBinding.noData.visibility = View.GONE
|
||||||
viewBinding.name.text = state.profileInfo.name
|
viewBinding.name.text = state.profileInfo.name
|
||||||
viewBinding.position.text = "Должность: ${state.profileInfo.name}"
|
viewBinding.position.text = "Должность: ${state.profileInfo.position}"
|
||||||
if (state.profileInfo.lastEntry == null) viewBinding.lastEntry.text = "Время последнего входа: Нет данных"
|
if (state.profileInfo.lastEntry == null) viewBinding.lastEntry.text = "Время последнего входа: Нет данных"
|
||||||
else viewBinding.lastEntry.text = "Время последнего входа: ${state.profileInfo.lastEntry}"
|
else viewBinding.lastEntry.text = "Время последнего входа: ${state.profileInfo.lastEntry}"
|
||||||
Picasso.get().load(state.profileInfo.avatarUrl).resize(100, 100).centerCrop().into(viewBinding.imageView)
|
Picasso.get().load(state.profileInfo.avatarUrl).resize(100, 100).centerCrop().into(viewBinding.imageView)
|
||||||
|
@ -26,8 +26,7 @@ class QrResultFragment : Fragment(R.layout.fragment_qr_result) {
|
|||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
parentFragmentManager.setFragmentResultListener(
|
parentFragmentManager.setFragmentResultListener(
|
||||||
QrScanDestination.REQUEST_KEY, viewLifecycleOwner
|
QrScanDestination.REQUEST_KEY, viewLifecycleOwner
|
||||||
) {
|
) { key, bundle ->
|
||||||
key, bundle ->
|
|
||||||
if (key == QrScanDestination.REQUEST_KEY) {
|
if (key == QrScanDestination.REQUEST_KEY) {
|
||||||
val code = QrScanDestination.getDataIfExist(bundle)
|
val code = QrScanDestination.getDataIfExist(bundle)
|
||||||
viewModel.sendResult(code)
|
viewModel.sendResult(code)
|
||||||
|
@ -23,6 +23,7 @@ data object QrScanDestination {
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal fun packToBundle(data: String): Bundle {
|
internal fun packToBundle(data: String): Bundle {
|
||||||
|
|
||||||
return bundleOf(
|
return bundleOf(
|
||||||
KEY_QR_DATA to data
|
KEY_QR_DATA to data
|
||||||
)
|
)
|
||||||
|
@ -1,28 +1,37 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<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_height="match_parent"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
<androidx.fragment.app.FragmentContainerView
|
<androidx.fragment.app.FragmentContainerView
|
||||||
android:id="@+id/nav_host_fragment"
|
android:id="@+id/nav_host_fragment"
|
||||||
android:name="androidx.navigation.fragment.NavHostFragment"
|
android:name="androidx.navigation.fragment.NavHostFragment"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="0dp"
|
||||||
app:defaultNavHost="true" />
|
app:defaultNavHost="true"
|
||||||
|
app:layout_constraintBottom_toTopOf="@+id/bottom_navigation"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
/>
|
||||||
|
|
||||||
<com.google.android.material.bottomnavigation.BottomNavigationView
|
<com.google.android.material.bottomnavigation.BottomNavigationView
|
||||||
android:id="@+id/bottom_navigation"
|
android:id="@+id/bottom_navigation"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="bottom"
|
android:layout_gravity="bottom"
|
||||||
|
android:layout_marginBottom="4dp"
|
||||||
|
|
||||||
|
android:background="@color/white"
|
||||||
|
app:itemActiveIndicatorStyle="@color/orange"
|
||||||
|
app:itemIconTint="@color/grey"
|
||||||
|
app:itemRippleColor="@color/orange"
|
||||||
|
app:labelVisibilityMode="unlabeled"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="0.0"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:menu="@menu/bottom_menu_admin"
|
app:menu="@menu/bottom_menu_admin" />
|
||||||
android:background="@color/white"
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
app:itemIconTint="@color/grey"
|
|
||||||
app:labelVisibilityMode="unlabeled"
|
|
||||||
app:itemRippleColor="@color/orange"
|
|
||||||
app:itemActiveIndicatorStyle="@color/orange" />
|
|
||||||
</FrameLayout>
|
|
94
app/src/main/res/layout/fragment_admin.xml
Normal file
94
app/src/main/res/layout/fragment_admin.xml
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/found_user"
|
||||||
|
android:textColor="@color/black"
|
||||||
|
android:textSize="20sp"
|
||||||
|
app:layout_constraintBottom_toTopOf="@+id/cardView"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent"
|
||||||
|
app:layout_constraintVertical_bias="1.0" />
|
||||||
|
|
||||||
|
<androidx.cardview.widget.CardView
|
||||||
|
android:id="@+id/cardView"
|
||||||
|
android:layout_width="270dp"
|
||||||
|
android:layout_height="72dp"
|
||||||
|
android:layout_marginTop="68dp"
|
||||||
|
android:outlineSpotShadowColor="@android:color/transparent"
|
||||||
|
app:cardBackgroundColor="@color/grey_light"
|
||||||
|
app:cardCornerRadius="10dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="0.262"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
|
<androidx.cardview.widget.CardView
|
||||||
|
android:layout_width="240dp"
|
||||||
|
android:layout_height="35dp"
|
||||||
|
android:layout_marginStart="15dp"
|
||||||
|
android:layout_marginTop="18dp"
|
||||||
|
android:layout_marginEnd="28dp"
|
||||||
|
android:outlineSpotShadowColor="@android:color/transparent"
|
||||||
|
app:cardBackgroundColor="@color/white"
|
||||||
|
app:cardCornerRadius="10dp">
|
||||||
|
|
||||||
|
<EditText
|
||||||
|
android:id="@+id/userLogin"
|
||||||
|
android:layout_width="205dp"
|
||||||
|
android:layout_height="33dp"
|
||||||
|
android:layout_marginLeft="13dp"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:hint="@string/login"
|
||||||
|
android:inputType="textEmailAddress"
|
||||||
|
android:maxLength="30"
|
||||||
|
android:maxLines="1"
|
||||||
|
android:textColorHint="@color/grey"
|
||||||
|
android:textSize="12sp">
|
||||||
|
|
||||||
|
</EditText>
|
||||||
|
|
||||||
|
</androidx.cardview.widget.CardView>
|
||||||
|
|
||||||
|
|
||||||
|
</androidx.cardview.widget.CardView>
|
||||||
|
|
||||||
|
<com.google.android.material.button.MaterialButton
|
||||||
|
android:id="@+id/find_button"
|
||||||
|
android:layout_width="100dp"
|
||||||
|
android:layout_height="42dp"
|
||||||
|
android:layout_marginTop="16dp"
|
||||||
|
android:backgroundTint="@color/orange"
|
||||||
|
android:textSize="16sp"
|
||||||
|
app:circularflow_defaultRadius="10dp"
|
||||||
|
app:circularflow_radiusInDP="1dp"
|
||||||
|
app:cornerRadius="10dp"
|
||||||
|
app:layout_constraintEnd_toEndOf="parent"
|
||||||
|
app:layout_constraintHorizontal_bias="0.498"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintTop_toBottomOf="@+id/cardView" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:elevation="10dp"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_vertical"
|
||||||
|
android:text="@string/find"
|
||||||
|
android:textColor="@color/white"
|
||||||
|
android:textSize="16sp"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@+id/find_button"
|
||||||
|
app:layout_constraintEnd_toEndOf="@+id/find_button"
|
||||||
|
app:layout_constraintStart_toStartOf="@+id/find_button"
|
||||||
|
app:layout_constraintTop_toTopOf="@+id/find_button">
|
||||||
|
|
||||||
|
</TextView>
|
||||||
|
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
@ -31,8 +31,8 @@
|
|||||||
app:layout_constraintTop_toTopOf="parent">
|
app:layout_constraintTop_toTopOf="parent">
|
||||||
|
|
||||||
<androidx.cardview.widget.CardView
|
<androidx.cardview.widget.CardView
|
||||||
android:layout_width="244dp"
|
android:layout_width="249dp"
|
||||||
android:layout_height="50dp"
|
android:layout_height="45dp"
|
||||||
android:layout_marginStart="28dp"
|
android:layout_marginStart="28dp"
|
||||||
android:layout_marginTop="20dp"
|
android:layout_marginTop="20dp"
|
||||||
android:layout_marginEnd="28dp"
|
android:layout_marginEnd="28dp"
|
||||||
|
@ -2,7 +2,8 @@
|
|||||||
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
|
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/admin_main_nav_graph">
|
android:id="@+id/admin_main_nav_graph"
|
||||||
|
app:startDestination="@id/fragment_profile">
|
||||||
|
|
||||||
<fragment
|
<fragment
|
||||||
android:id="@+id/fragment_profile"
|
android:id="@+id/fragment_profile"
|
||||||
@ -35,5 +36,12 @@
|
|||||||
android:id="@+id/action_fragment_qr_result_to_fragment_profile"
|
android:id="@+id/action_fragment_qr_result_to_fragment_profile"
|
||||||
app:destination="@id/fragment_profile" />
|
app:destination="@id/fragment_profile" />
|
||||||
</fragment>
|
</fragment>
|
||||||
|
<fragment
|
||||||
|
android:id="@+id/fragment_admin"
|
||||||
|
android:name="ru.myitschool.work.ui.admin.AdminFragment"
|
||||||
|
android:label="Admin"
|
||||||
|
tools:layout="@layout/fragment_admin">
|
||||||
|
|
||||||
|
</fragment>
|
||||||
|
|
||||||
</navigation>
|
</navigation>
|
@ -18,4 +18,6 @@
|
|||||||
<string name="qr_null_result">Вход был отменён</string>
|
<string name="qr_null_result">Вход был отменён</string>
|
||||||
<string name="profile">Профиль</string>
|
<string name="profile">Профиль</string>
|
||||||
<string name="user_view">Просмотр пользователя</string>
|
<string name="user_view">Просмотр пользователя</string>
|
||||||
|
<string name="found_user">Найти информацию о сотруднике</string>
|
||||||
|
<string name="find">Найти</string>
|
||||||
</resources>
|
</resources>
|
Loading…
x
Reference in New Issue
Block a user