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
         }