From ffe93368ef6512f7de3e20c49a2c9ac8f26f0fa7 Mon Sep 17 00:00:00 2001 From: v228a <v228a@proton.me> Date: Wed, 19 Feb 2025 18:19:49 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=B2=D1=8F=D0=B7=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B0=D0=B4=D0=BC=D0=B8=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/myitschool/work/ui/RootActivity.kt | 3 + .../work/ui/profile/ProfileFragment.kt | 14 ++++- .../work/ui/profile/ProfileViewModel.kt | 8 ++- .../ui/searchuser/SearchUserDestination.kt | 6 ++ .../work/ui/searchuser/SearchUserFragment.kt | 28 +++++++++ .../work/ui/searchuser/SearchUserViewModel.kt | 14 +++++ app/src/main/res/layout/fragment_admin.xml | 58 ------------------- .../main/res/layout/fragment_search_user.xml | 58 +++++++++++++++++++ 8 files changed, 128 insertions(+), 61 deletions(-) create mode 100644 app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserDestination.kt create mode 100644 app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserFragment.kt create mode 100644 app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserViewModel.kt delete mode 100644 app/src/main/res/layout/fragment_admin.xml create mode 100644 app/src/main/res/layout/fragment_search_user.xml diff --git a/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt b/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt index b650c8b..cc4d2ff 100644 --- a/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt +++ b/app/src/main/java/ru/myitschool/work/ui/RootActivity.kt @@ -19,6 +19,8 @@ import ru.myitschool.work.ui.qr.result.QrResultDestination import ru.myitschool.work.ui.qr.result.QrResultFragment import ru.myitschool.work.ui.qr.scan.QrScanDestination import ru.myitschool.work.ui.qr.scan.QrScanFragment +import ru.myitschool.work.ui.searchuser.SearchUserDestination +import ru.myitschool.work.ui.searchuser.SearchUserFragment import ru.myitschool.work.ui.splash.SplashDestination import ru.myitschool.work.ui.splash.SplashFragment @@ -42,6 +44,7 @@ class RootActivity : AppCompatActivity() { fragment<QrResultFragment, QrResultDestination>() fragment<QrScanFragment, QrScanDestination>() fragment<EntryListFragment, EntryListDestination>() + fragment<SearchUserFragment, SearchUserDestination>() } } diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt index 3acc748..e76fdee 100644 --- a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt +++ b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileFragment.kt @@ -15,6 +15,8 @@ import ru.myitschool.work.ui.entrylist.EntryListDestination import ru.myitschool.work.ui.login.LoginDestination import ru.myitschool.work.ui.qr.result.QrResultDestination import ru.myitschool.work.ui.qr.scan.QrScanDestination +import ru.myitschool.work.ui.searchuser.SearchUserDestination +import ru.myitschool.work.ui.searchuser.SearchUserFragment import ru.myitschool.work.utils.collectWhenStarted import ru.myitschool.work.utils.visibleOrGone @@ -59,11 +61,12 @@ class ProfileFragment : Fragment(R.layout.fragment_profile) { swipeRefreshLayout.isRefreshing = false binding.position.text = state.position binding.lastEntry.text = state.lastEntry + binding.fullname.text = state.fullname if (state.admin){ //TODO Приделать админские штучки - binding.fullname.text = state.fullname + " admin" + binding.admin.visibility = View.VISIBLE }else{ - binding.fullname.text = state.fullname + binding.admin.visibility = View.GONE } Picasso.get() .load(state.imageUrl) @@ -94,6 +97,12 @@ class ProfileFragment : Fragment(R.layout.fragment_profile) { } } + is ProfileViewModel.Action.OpenSearch -> { + findNavController().navigate(SearchUserDestination) { + popUpTo<SearchUserFragment> { inclusive = true } + } + } + } } } @@ -102,6 +111,7 @@ class ProfileFragment : Fragment(R.layout.fragment_profile) { binding.logout.setOnClickListener { viewModel.clickLogout() } binding.scan.setOnClickListener { viewModel.clickScan() } binding.entryList.setOnClickListener{ viewModel.clickLog()} + binding.admin.setOnClickListener { viewModel.clickSearch() } } override fun onDestroyView() { diff --git a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt index e1d1b35..b4ba863 100644 --- a/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt +++ b/app/src/main/java/ru/myitschool/work/ui/profile/ProfileViewModel.kt @@ -55,6 +55,11 @@ class ProfileViewModel @Inject constructor( _action.emit(Action.OpenScan) } } + fun clickSearch(){ + viewModelScope.launch { + _action.emit(Action.OpenSearch) + } + } fun updateUserInfo() { viewModelScope.launch { @@ -67,7 +72,7 @@ class ProfileViewModel @Inject constructor( imageUrl = value.imageUrl, position = value.position, lastEntry = simpleDateFormat.format(Date(value.lastEntryMillis)), - admin = false + admin = true ) } }, @@ -102,6 +107,7 @@ class ProfileViewModel @Inject constructor( data object OpenLogin : Action data object OpenScan : Action data object OpenLog : Action + data object OpenSearch : Action } companion object { diff --git a/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserDestination.kt b/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserDestination.kt new file mode 100644 index 0000000..0af2627 --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserDestination.kt @@ -0,0 +1,6 @@ +package ru.myitschool.work.ui.searchuser + +import kotlinx.serialization.Serializable + +@Serializable +data object SearchUserDestination \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserFragment.kt b/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserFragment.kt new file mode 100644 index 0000000..28d07db --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserFragment.kt @@ -0,0 +1,28 @@ +package ru.myitschool.work.ui.searchuser + +import androidx.fragment.app.viewModels +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.serialization.Serializable +import ru.myitschool.work.R + +@Serializable +@AndroidEntryPoint +class SearchUserFragment : Fragment(R.layout.fragment_search_user) { + + companion object { + fun newInstance() = SearchUserFragment() + } + + private val viewModel: SearchUserViewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + // TODO: Use the ViewModel + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserViewModel.kt b/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserViewModel.kt new file mode 100644 index 0000000..d6fcb7e --- /dev/null +++ b/app/src/main/java/ru/myitschool/work/ui/searchuser/SearchUserViewModel.kt @@ -0,0 +1,14 @@ +package ru.myitschool.work.ui.searchuser + +import android.content.Context +import androidx.lifecycle.ViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.qualifiers.ApplicationContext +import javax.inject.Inject + +@HiltViewModel +class SearchUserViewModel @Inject constructor( + @ApplicationContext private val context: Context, +) : ViewModel() { + // TODO: Implement the ViewModel +} \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_admin.xml b/app/src/main/res/layout/fragment_admin.xml deleted file mode 100644 index 3cc0174..0000000 --- a/app/src/main/res/layout/fragment_admin.xml +++ /dev/null @@ -1,58 +0,0 @@ -<?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"> -<LinearLayout - android:layout_width="match_parent" - android:layout_height="match_parent" - android:padding="16dp" - android:orientation="vertical"> - <com.google.android.material.floatingactionbutton.FloatingActionButton - android:id="@+id/floatingActionButton2" - style="@style/Theme.UiTemplate.FAB.Gray" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:clickable="true" - android:src="@drawable/ic_back" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> - <TextView - android:id="@+id/text_login" - android:padding="35dp" - style="@style/Theme.UiTemplate.TextH1" - android:layout_width="wrap_content" - android:layout_marginBottom="10dp" - android:layout_height="wrap_content" - android:gravity="center" - android:layout_gravity="center" - android:text="@string/admin_main" /> - <com.google.android.material.textfield.TextInputLayout - style="@style/Theme.UiTemplate.Input" - android:id="@+id/input_username" - android:layout_marginTop="45dp" - android:layout_width="match_parent" - app:layout_constraintWidth_max="400dp" - app:layout_constraintWidth_percent="0.8" - android:layout_height="58dp"> - - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/username" - style="@style/Theme.UiTemplate.Input.Text" - android:layout_width="match_parent" - android:layout_height="60dp" - android:inputType="text" - android:maxLines="1" - android:hint="@string/admin_input_hint"> - </com.google.android.material.textfield.TextInputEditText> - </com.google.android.material.textfield.TextInputLayout> - <Button - android:id="@+id/login" - android:layout_width="match_parent" - android:layout_height="wrap_content" - style="@style/Theme.UiTemplate.Button" - android:layout_marginTop="58dp" - android:layout_gravity="center" - android:text="@string/admin_button" /> -</LinearLayout> -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_search_user.xml b/app/src/main/res/layout/fragment_search_user.xml new file mode 100644 index 0000000..8ae3527 --- /dev/null +++ b/app/src/main/res/layout/fragment_search_user.xml @@ -0,0 +1,58 @@ +<?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"> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:padding="16dp" + android:orientation="vertical"> + <com.google.android.material.floatingactionbutton.FloatingActionButton + android:id="@+id/floatingActionButton2" + style="@style/Theme.UiTemplate.FAB.Gray" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:clickable="true" + android:src="@drawable/ic_back" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + <TextView + android:id="@+id/text_login" + android:padding="35dp" + style="@style/Theme.UiTemplate.TextH1" + android:layout_width="wrap_content" + android:layout_marginBottom="10dp" + android:layout_height="wrap_content" + android:gravity="center" + android:layout_gravity="center" + android:text="@string/admin_main" /> + <com.google.android.material.textfield.TextInputLayout + style="@style/Theme.UiTemplate.Input" + android:id="@+id/input_username" + android:layout_marginTop="45dp" + android:layout_width="match_parent" + app:layout_constraintWidth_max="400dp" + app:layout_constraintWidth_percent="0.8" + android:layout_height="58dp"> + + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/username" + style="@style/Theme.UiTemplate.Input.Text" + android:layout_width="match_parent" + android:layout_height="60dp" + android:inputType="text" + android:maxLines="1" + android:hint="@string/admin_input_hint"> + </com.google.android.material.textfield.TextInputEditText> + </com.google.android.material.textfield.TextInputLayout> + <Button + android:id="@+id/login" + android:layout_width="match_parent" + android:layout_height="wrap_content" + style="@style/Theme.UiTemplate.Button" + android:layout_marginTop="58dp" + android:layout_gravity="center" + android:text="@string/admin_button" /> + </LinearLayout> +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file From 488a3f90fbec8bb2deab086039c94d19cc558af7 Mon Sep 17 00:00:00 2001 From: v228a <v228a@proton.me> Date: Wed, 19 Feb 2025 18:34:08 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=A1=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=82?= =?UTF-8?q?=D0=B0=D1=80=D0=B3=D0=B5=D1=82=D0=BE=D0=B2=20=D0=B8=20=D0=BC?= =?UTF-8?q?=D0=B8=D0=BD=D0=B8=D0=BC=D1=83=D0=BC=D0=B0.=20=D0=AF=D0=B7?= =?UTF-8?q?=D1=8B=D0=BA=D0=B8=20=D0=B4=D0=B0=D1=82=D1=8B=20=D0=B2=20=D1=80?= =?UTF-8?q?=D0=B5=D0=BA=D1=83=D0=BA=D0=BB=D0=B5=D1=80=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 2 +- .../work/ui/entrylist/adapter/AdapterEntryHistory.kt | 11 ++++++++++- buildSrc/src/main/java/Version.kt | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0599e1a..1d8846d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -16,7 +16,7 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.UiTemplate" - tools:targetApi="31"> + tools:targetApi="34"> <activity android:name=".ui.RootActivity" android:exported="true"> diff --git a/app/src/main/java/ru/myitschool/work/ui/entrylist/adapter/AdapterEntryHistory.kt b/app/src/main/java/ru/myitschool/work/ui/entrylist/adapter/AdapterEntryHistory.kt index 0083927..e508c9c 100644 --- a/app/src/main/java/ru/myitschool/work/ui/entrylist/adapter/AdapterEntryHistory.kt +++ b/app/src/main/java/ru/myitschool/work/ui/entrylist/adapter/AdapterEntryHistory.kt @@ -1,14 +1,19 @@ package ru.myitschool.work.ui.entrylist.adapter import android.graphics.Color +import android.os.Build import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.AdapterView import android.widget.TextView +import androidx.annotation.RequiresApi import androidx.core.graphics.drawable.toDrawable import androidx.recyclerview.widget.RecyclerView import ru.myitschool.work.R +import java.time.LocalDateTime +import java.time.format.DateTimeFormatter +import java.util.Locale class AdapterEntryHistory(private val datas: List<EntryHistoryEntity>) : RecyclerView .Adapter<AdapterEntryHistory.MyViewHolder>() { @@ -25,8 +30,12 @@ class AdapterEntryHistory(private val datas: List<EntryHistoryEntity>) : Recycle return MyViewHolder(itemView) } + @RequiresApi(Build.VERSION_CODES.O) override fun onBindViewHolder(holder: MyViewHolder, position: Int) { - holder.dateText.text = datas[position].time.toString() + + + + holder.dateText.text = LocalDateTime.parse(datas[position].time).format(DateTimeFormatter.ofPattern("d MMMM yyyy, HH:mm:ss", Locale.getDefault())) holder.identificatorText.text = datas[position].identificator.toString() holder.typeText.text = datas[position].type.toString() diff --git a/buildSrc/src/main/java/Version.kt b/buildSrc/src/main/java/Version.kt index 7b7f7e8..330fa13 100644 --- a/buildSrc/src/main/java/Version.kt +++ b/buildSrc/src/main/java/Version.kt @@ -34,7 +34,7 @@ object Version { object Android { object Sdk { - const val min = 24 + const val min = 28 const val compile = 34 const val target = 34 }