commit 819a66dcad68fbd5627f22000a2db789b033ed1c Author: Clogon Date: Fri Nov 3 09:59:18 2023 +0300 1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..ae388c2 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..2b8a50f --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..8978d23 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..a700852 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,96 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' +} + +android { + namespace 'com.example.doctor' + compileSdk 33 + + defaultConfig { + applicationId "com.example.doctor" + minSdk 28 + targetSdk 33 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } + buildFeatures{ + viewBinding true + } +} + +dependencies { + + implementation 'com.google.code.gson:gson:2.8.6' + + implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" + + implementation "com.mikepenz:materialdrawer:7.0.0" + implementation "com.mikepenz:materialdrawer-nav:7.0.0" + + implementation 'pl.droidsonroids.gif:android-gif-drawable:1.1.17' + + implementation platform('com.google.firebase:firebase-bom:31.2.0') + implementation 'com.google.firebase:firebase-database-ktx:20.1.0' + implementation 'com.google.firebase:firebase-auth-ktx:21.1.0' + + implementation 'com.android.volley:volley:1.2.1' + implementation 'com.squareup.picasso:picasso:2.71828' + implementation 'androidx.fragment:fragment-ktx:1.5.5' + implementation 'com.google.android.gms:play-services-location:21.0.1' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1' + + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.5.0' + implementation 'com.google.android.material:material:1.7.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'androidx.test:core-ktx:1.4.0' + implementation 'androidx.games:games-activity:1.1.0' + implementation 'com.google.mlkit:common:18.1.0' + implementation 'com.google.firebase:firebase-messaging-ktx:23.1.2' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1" + + coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3' + implementation 'com.kizitonwose.calendar:view:2.0.0' + + //Lifecycle + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.2' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2' + implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.6.1" + + //Retrofit + implementation "com.squareup.retrofit2:retrofit:2.9.0" + implementation "com.squareup.retrofit2:converter-gson:2.9.0" + + //OkHttp + implementation "com.squareup.okhttp3:logging-interceptor:4.7.2" + implementation "com.squareup.okhttp3:okhttp:4.7.2" + + implementation 'com.squareup.picasso:picasso:2.71828' + + //Свайп + implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" + + + + +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/doctor/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/doctor/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..740eed1 --- /dev/null +++ b/app/src/androidTest/java/com/example/doctor/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.doctor + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.example.doctor", appContext.packageName) + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..4acd25a --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Adapter/VpAdapter.kt b/app/src/main/java/com/example/doctor/Adapter/VpAdapter.kt new file mode 100644 index 0000000..ce1ef76 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Adapter/VpAdapter.kt @@ -0,0 +1,17 @@ +package com.example.doctor.Adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.viewpager2.adapter.FragmentStateAdapter + +class VpAdapter(fr_act:FragmentActivity, private val list:List):FragmentStateAdapter(fr_act) {//private val list:List - список с фрагментами сюда передастся, тоесть с двумя фрагментами + //Возврощаем для createFragment количество элементов(фрагментов) в листе(List) + override fun getItemCount(): Int { + return list.size//возврощаем количество фрагметов + } + + //Позиция фрагмента или 1 или 2, то есть 0 или 1. И по позиции будут выводится фрагмент. + override fun createFragment(position: Int): Fragment { + return list[position]//Возврощаем фрагмент из листа по позиции + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Adapter/VpEditSportAdapter.kt b/app/src/main/java/com/example/doctor/Adapter/VpEditSportAdapter.kt new file mode 100644 index 0000000..ad01193 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Adapter/VpEditSportAdapter.kt @@ -0,0 +1,17 @@ +package com.example.doctor.Adapter + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.viewpager2.adapter.FragmentStateAdapter + +class VpEditSportAdapter(fr_act:FragmentActivity, private val list: List):FragmentStateAdapter(fr_act) {//private val list:List - список с фрагментами сюда передастся, тоесть с двумя фрагментами + //Возврощаем для createFragment количество элементов(фрагментов) в листе(List) + override fun getItemCount(): Int { + return list.size//возврощаем количество фрагметов + } + + //Позиция фрагмента или 1 или 2, то есть 0 или 1. И по позиции будут выводится фрагмент. + override fun createFragment(position: Int): Fragment { + return list[position] as Fragment//Возврощаем фрагмент из листа по позиции + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Appeals/AppealsFragment.kt b/app/src/main/java/com/example/doctor/Appeals/AppealsFragment.kt new file mode 100644 index 0000000..a9ad849 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Appeals/AppealsFragment.kt @@ -0,0 +1,65 @@ +package com.example.doctor.Appeals + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.FragmentActivity +import com.example.doctor.Adapter.VpAdapter +import com.example.doctor.R +import com.example.doctor.Appeals.TabLayout.OldAppealsFragment +import com.example.doctor.Appeals.TabLayout.NewAppealsFragment +import com.example.doctor.databinding.FragmentAppealsBinding +import com.google.android.material.tabs.TabLayoutMediator + + +class AppealsFragment : Fragment() { + private lateinit var binding:FragmentAppealsBinding + + private val tList = listOf( + "новые", + "обработанные", + ) + + //Список с фрагментами для переключения + private val flist = listOf( + NewAppealsFragment.newInstance(), + OldAppealsFragment.newInstance(), + ) + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentAppealsBinding.inflate(layoutInflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + init() + } + + //Функция подключения переключения + private fun init() = with(binding) { + val adapter = VpAdapter(activity as FragmentActivity, flist) + vpProduct.adapter = adapter + + //Переключения (связываем таблаяут(переключатель) с viewpager, чтобы переключать фрагменты) + TabLayoutMediator(tabLayoutProduct, vpProduct) { tab, pos -> + tab.text = + tList[pos]//tab - нажатая кнопка, pos - позиция кнопки, tList[pos] - передаем название по полученной позиции + }.attach()// attach() - чтобы все переключалось, а не вывадило постоянно один экран + + //Изменения цвета в зависомости на каком из tabLayout вы находитесь + binding.tabLayoutProduct.setTabTextColors(getResources().getColor(R.color.black), + getResources().getColor(R.color.white)); + } + + companion object { + + fun newInstance() = AppealsFragment() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Appeals/AppealsNewAdapter.kt b/app/src/main/java/com/example/doctor/Appeals/AppealsNewAdapter.kt new file mode 100644 index 0000000..bc43850 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Appeals/AppealsNewAdapter.kt @@ -0,0 +1,112 @@ +package com.example.doctor.Appeals + +import android.annotation.SuppressLint +import android.os.Handler +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.example.doctor.R +import com.example.doctor.databinding.ItemAppealsBinding +import com.example.doctor.databinding.ItemAppealsNewBinding + + +class AppealsNewAdapter(val listener_zakaz: Listener) : + ListAdapter( + Comparator() + ) {//Productitem - по этой форме будем заполнять.//ProductAdapter.holder - это создаваемый holder который хранит логику как нужно заполнять карточку + + + //В holder создаетс код с помошью которого мы будем заполнять и сохронять разметку + class Holder(view: View, val listener_zakaz: Listener) : + RecyclerView.ViewHolder(view) {//Класс который будет хранить сссылки на элементы, и отвечает за один элемент за 1 раз, то есть сначсало нулевой элемент заполнит, потом первый, потом второй и т.д. + //Для передачи данных + + val binding = + ItemAppealsNewBinding.bind(view)//view - здесь храянтся элементы и мы их bind заполним в ListItemBinding//ListItemBinding - это клласс даннйо разметки(карточки) которую мы будем заполнять, а нужна дання переменная(binding), чтобы мжно было при заполнение обращатся к элементам карточки + + var itemTemp: AppealsNewModel? = + null//Глобальная переменная для нашего item, чтобы можно было передать данные для нажатия + + //init - дает возможность внутри адаптера обращаться к элементам экрана + init { + itemView.setOnClickListener {//Нажатие на ячейку//itemView - это весь элемент карточки из списка + itemView.setEnabled(false) + itemTemp?.let { it1 -> listener_zakaz.onClickAppeals(it1) } + + } + } + + @SuppressLint("SuspiciousIndentation") + fun bind(item: AppealsNewModel) = with(binding) {//Productitem - перпедаем данные + itemTemp = item + txtNumber.text = item.id.toString()+"." + txtAppeals.text = item.text + txtLoginPatient.text = item.login + + + if (item.expand) { + txtAppeals.maxLines = 100 + } else { + txtAppeals.maxLines = 1 + } + + CardViewNew.setOnClickListener { + if (item.expand == false) { + txtAppeals.maxLines = 100 + + item.expand = true + } else { + txtAppeals.maxLines = 1 + item.expand = false + } + } + + btnAdd.setOnClickListener{ + CardViewNew.visibility = View.GONE + } + } + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_appeals_new, parent, false)//Создаем(надуваем) list_item + return Holder(view, listener_zakaz)//Через Holder возврощаем view + } + + override fun onBindViewHolder(holder: Holder, position: Int) { + val view = holder.bind(getItem(position))//Заполняем по позиции карточку + } + + + //Comparator - сравнивает старый список и новый и если что-то изменилось, то работает с конкретным изменением списке, а не весь список переписывает + class Comparator : DiffUtil.ItemCallback() { + override fun areItemsTheSame( + oldItem: AppealsNewModel, + newItem: AppealsNewModel + ): Boolean {//Тут лучше всего сравнивать по id//oldItem - элементы старого списка, newItem - элементы нового списка//Возврощает Boolean, тоесть есть изменения или нет + return oldItem.id == newItem.id//Сравниваем полностью весь список новы и старый, по очередно по одной карточке и по элементно, то есть нулевой элемент, первый, второй и т.д.. Но лучше сравнивать по id списки, а не просто весь список, так как это эфективнее, так как id уникальный(oldItem.id == newItem.id) + } + + override fun areContentsTheSame( + oldItem: AppealsNewModel, + newItem: AppealsNewModel + ): Boolean {//Утут нужно сравнивать весь спсок старых элементов и новых + return oldItem == newItem//Сравниваем полностью весь список новы и старый + } + } + + //Интерфейс нажатия на кнопку удалить товар из корзины + interface Listener { + fun onClickAppeals(item: AppealsNewModel) + } + + +} + + + + diff --git a/app/src/main/java/com/example/doctor/Appeals/AppealsNewModel.kt b/app/src/main/java/com/example/doctor/Appeals/AppealsNewModel.kt new file mode 100644 index 0000000..136e6f0 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Appeals/AppealsNewModel.kt @@ -0,0 +1,10 @@ +package com.example.doctor.Appeals + +data class AppealsNewModel( + val id: Int, + val login: String, + val text: String, + val id_user:Int, + var expand : Boolean = false +) + diff --git a/app/src/main/java/com/example/doctor/Appeals/AppealsOldAdapter.kt b/app/src/main/java/com/example/doctor/Appeals/AppealsOldAdapter.kt new file mode 100644 index 0000000..f49a328 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Appeals/AppealsOldAdapter.kt @@ -0,0 +1,109 @@ +package com.example.doctor.Appeals + +import android.annotation.SuppressLint +import android.opengl.Visibility +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.example.doctor.R +import com.example.doctor.databinding.ItemAppealsOldBinding + + +class AppealsOldAdapter(val listener_zakaz: Listener) : + ListAdapter( + Comparator() + ) {//Productitem - по этой форме будем заполнять.//ProductAdapter.holder - это создаваемый holder который хранит логику как нужно заполнять карточку + + + //В holder создаетс код с помошью которого мы будем заполнять и сохронять разметку + class Holder(view: View, val listener_zakaz: Listener) : + RecyclerView.ViewHolder(view) {//Класс который будет хранить сссылки на элементы, и отвечает за один элемент за 1 раз, то есть сначсало нулевой элемент заполнит, потом первый, потом второй и т.д. + //Для передачи данных + + val binding = + ItemAppealsOldBinding.bind(view)//view - здесь храянтся элементы и мы их bind заполним в ListItemBinding//ListItemBinding - это клласс даннйо разметки(карточки) которую мы будем заполнять, а нужна дання переменная(binding), чтобы мжно было при заполнение обращатся к элементам карточки + + var itemTemp: AppealsOldModel? = + null//Глобальная переменная для нашего item, чтобы можно было передать данные для нажатия + + //init - дает возможность внутри адаптера обращаться к элементам экрана + init { + itemView.setOnClickListener {//Нажатие на ячейку//itemView - это весь элемент карточки из списка + itemView.setEnabled(false) + itemTemp?.let { it1 -> listener_zakaz.onClickAppeals(it1) } + } + } + + @SuppressLint("SuspiciousIndentation") + fun bind(item: AppealsOldModel) = with(binding) {//Productitem - перпедаем данные + itemTemp = item + txtNumber.text = item.id.toString()+"." + txtAppeals.text = item.text + txtLoginPatient.text = item.login + + if (item.expand) { + binding.txtAppeals.maxLines = 100 + + } else { + binding.txtAppeals.maxLines = 1 + + } + + binding.CardViewOld.setOnClickListener { + if (item.expand == false) { + binding.txtAppeals.maxLines = 100 + item.expand = true + } else { + binding.txtAppeals.maxLines = 1 + item.expand = false + } + } + + } + + + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_appeals_old, parent, false)//Создаем(надуваем) list_item + return Holder(view, listener_zakaz)//Через Holder возврощаем view + } + + override fun onBindViewHolder(holder: Holder, position: Int) { + val view = holder.bind(getItem(position))//Заполняем по позиции карточку + } + + + //Comparator - сравнивает старый список и новый и если что-то изменилось, то работает с конкретным изменением списке, а не весь список переписывает + class Comparator : DiffUtil.ItemCallback() { + override fun areItemsTheSame( + oldItem: AppealsOldModel, + newItem: AppealsOldModel + ): Boolean {//Тут лучше всего сравнивать по id//oldItem - элементы старого списка, newItem - элементы нового списка//Возврощает Boolean, тоесть есть изменения или нет + return oldItem.id == newItem.id//Сравниваем полностью весь список новы и старый, по очередно по одной карточке и по элементно, то есть нулевой элемент, первый, второй и т.д.. Но лучше сравнивать по id списки, а не просто весь список, так как это эфективнее, так как id уникальный(oldItem.id == newItem.id) + } + + override fun areContentsTheSame( + oldItem: AppealsOldModel, + newItem: AppealsOldModel + ): Boolean {//Утут нужно сравнивать весь спсок старых элементов и новых + return oldItem == newItem//Сравниваем полностью весь список новы и старый + } + } + + //Интерфейс нажатия на кнопку удалить товар из корзины + interface Listener { + fun onClickAppeals(item: AppealsOldModel) + } + + +} + + + + diff --git a/app/src/main/java/com/example/doctor/Appeals/AppealsOldModel.kt b/app/src/main/java/com/example/doctor/Appeals/AppealsOldModel.kt new file mode 100644 index 0000000..cf7b5a1 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Appeals/AppealsOldModel.kt @@ -0,0 +1,10 @@ +package com.example.doctor.Appeals + +data class AppealsOldModel( + val id: Int, + val login: String, + val text: String, + val id_user:Int, + var expand : Boolean = false +) + diff --git a/app/src/main/java/com/example/doctor/Appeals/TabLayout/NewAppealsFragment.kt b/app/src/main/java/com/example/doctor/Appeals/TabLayout/NewAppealsFragment.kt new file mode 100644 index 0000000..09d1a7d --- /dev/null +++ b/app/src/main/java/com/example/doctor/Appeals/TabLayout/NewAppealsFragment.kt @@ -0,0 +1,81 @@ +package com.example.doctor.Appeals.TabLayout + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.activityViewModels +import androidx.recyclerview.widget.GridLayoutManager +import com.example.doctor.Appeals.AppealsNewAdapter +import com.example.doctor.Appeals.AppealsNewModel +import com.example.doctor.DoctorViewModel +import com.example.doctor.databinding.FragmentNewAppealsBinding + + +class NewAppealsFragment : Fragment(), AppealsNewAdapter.Listener { + private lateinit var binding:FragmentNewAppealsBinding + private val model: DoctorViewModel by activityViewModels() + lateinit var adapter: AppealsNewAdapter + + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentNewAppealsBinding.inflate(layoutInflater,container,false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + initRcViewAppeals() + patientListCurrent() + model.appealsNewList.observe(viewLifecycleOwner) {//viewLifecycleOwner - следит за циклом жизни fragment + adapter.submitList(it)//Напрямую переадем созданный список в adapter(ProductAdapter) + } + + addNewAppeals() + } + + private fun addNewAppeals() { + val list = ArrayList() + + for (i in 1..5){ + val itemPatient = AppealsNewModel( + i, + "Patient_$i", + "asdasds adnas kjhdkl ashdlkashdkjalks hdjlkasjdlk ajldkhas j djask hsfldksjfksdf", + i, + ) + list.add(itemPatient)//Передали заполненый список + } + model.appealsNewList.value = list + } + + //Вывод прогресса на один день + private fun patientListCurrent() = with(binding) { +// model.appealsAllCurrent.observe(viewLifecycleOwner) {//viewLifecycleOwner - следит за циклом жизни fragment +// +// } + + } + + //Инициализация списка + private fun initRcViewAppeals() = with(binding) { + rcView.layoutManager = GridLayoutManager(requireContext(),1)//По вертикали будет выводить по умолчанию + adapter = AppealsNewAdapter(this@NewAppealsFragment) + rcView.adapter = adapter + } + + companion object { + + fun newInstance() = NewAppealsFragment() + } + + override fun onClickAppeals(item: AppealsNewModel) { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Appeals/TabLayout/OldAppealsFragment.kt b/app/src/main/java/com/example/doctor/Appeals/TabLayout/OldAppealsFragment.kt new file mode 100644 index 0000000..1c0bb62 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Appeals/TabLayout/OldAppealsFragment.kt @@ -0,0 +1,78 @@ +package com.example.doctor.Appeals.TabLayout + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.activityViewModels +import androidx.recyclerview.widget.GridLayoutManager +import com.example.doctor.Appeals.AppealsOldAdapter +import com.example.doctor.Appeals.AppealsOldModel +import com.example.doctor.DoctorViewModel +import com.example.doctor.databinding.FragmentOldAppealsBinding + + +class OldAppealsFragment : Fragment(), AppealsOldAdapter.Listener { + private lateinit var binding:FragmentOldAppealsBinding + private val model: DoctorViewModel by activityViewModels() + lateinit var adapter: AppealsOldAdapter + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentOldAppealsBinding.inflate(layoutInflater,container,false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + initRcViewAppeals() + appealsAllCurrent() + model.appealsAllList.observe(viewLifecycleOwner) {//viewLifecycleOwner - следит за циклом жизни fragment + adapter.submitList(it)//Напрямую переадем созданный список в adapter(ProductAdapter) + } + + addAllAppeals() + } + + private fun addAllAppeals() { + val list = ArrayList() + + for (i in 1..7){ + val itemPatient = AppealsOldModel( + i, + "Patient_$i", + " 81 23891 23812 37817411 sdasds adnas kjhdkl ashdlk ashdkjalks ashdlkashdkjalks hdjlkasjdlk ajldkhas hdjlkasjdlk ajldkhasas hdlkashdkjalks hdjlkasjdlk ajldkhasashdlkashdkjalks hdjlkasjdlk ajldkhas j djask hsfldksjfksdf", + i, + ) + list.add(itemPatient)//Передали заполненый список + } + model.appealsAllList.value = list + } + + //Вывод прогресса на один день + private fun appealsAllCurrent() = with(binding) { +// model.appealsAllCurrent.observe(viewLifecycleOwner) {//viewLifecycleOwner - следит за циклом жизни fragment +// +// } + + } + + //Инициализация списка + private fun initRcViewAppeals() = with(binding) { + rcView.layoutManager = GridLayoutManager(requireContext(),1)//По вертикали будет выводить по умолчанию + adapter = AppealsOldAdapter(this@OldAppealsFragment) + rcView.adapter = adapter + } + companion object { + + fun newInstance() = OldAppealsFragment() + } + + override fun onClickAppeals(item: AppealsOldModel) { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Auth/AuthActivity.kt b/app/src/main/java/com/example/doctor/Auth/AuthActivity.kt new file mode 100644 index 0000000..7f85244 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Auth/AuthActivity.kt @@ -0,0 +1,22 @@ +package com.example.doctor.Auth + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.example.doctor.R +import com.example.doctor.databinding.ActivityAuthBinding + +class AuthActivity : AppCompatActivity() { + private lateinit var binding:ActivityAuthBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityAuthBinding.inflate(layoutInflater) + setContentView(binding.root) + + //Вывод фрагмента на активити при первоначальной загрузке + supportFragmentManager.beginTransaction() + .replace(R.id.CLAuth, AuthFragment.newInstance()) + .commit()//Заменяем наш экран на фрагмент (используем наш экран как основу)//R.id.placeHolder - куда всталяем //MainFragment.newInstance() - это то что мы вставляем + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Auth/AuthFragment.kt b/app/src/main/java/com/example/doctor/Auth/AuthFragment.kt new file mode 100644 index 0000000..8312813 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Auth/AuthFragment.kt @@ -0,0 +1,173 @@ +package com.example.doctor.Auth + +import android.annotation.SuppressLint +import android.content.Intent +import android.os.Bundle +import android.util.Log +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.fragment.app.activityViewModels +import com.example.doctor.Auth.Model.AuthModel +import com.example.doctor.Auth.Model.UserModel +import com.example.doctor.DoctorViewModel +import com.example.doctor.MainActivity +import com.example.doctor.Pref.ConclusionPref +import com.example.doctor.R +import com.example.doctor.Retrofit.DoctorApi +import com.example.doctor.Pref.SavePref +import com.example.doctor.Toast.showCustomDangerToast +import com.example.doctor.Toast.showCustomInfoToast +import com.example.doctor.databinding.FragmentAuthBinding +import com.squareup.picasso.Picasso +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import org.json.JSONObject +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.create + + +class AuthFragment : Fragment() { + + private lateinit var binding: FragmentAuthBinding + private lateinit var doctorApi: DoctorApi + private val DoctorviewModel: DoctorViewModel by activityViewModels() + + //private var prefToken: SharedPreferences? = null + private var Token = "" + val prefDoctorSave = SavePref() + val prefDoctorConclusion = ConclusionPref() + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentAuthBinding.inflate(layoutInflater, container, false) + return binding.root + } + + @SuppressLint("SuspiciousIndentation") + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initRetrofit() + + Token = prefDoctorConclusion.conclusionToken(requireContext()) + + binding.apply { + binding.textError.text = "" + + //Авторизоваться + binding.btnAuth.setOnClickListener { + if(edLogin.text.toString() == ""||edPassword.text.toString() == ""){ + Toast(requireContext()).showCustomInfoToast( + "Не все поля заполнены", + requireActivity() + ) + } + else{ + Auth( + AuthModel( + edLogin.text.toString(), + edPassword.text.toString(), + ) + ) + } + } + } + } + +// private fun Auth(authModel: AuthModel) { +// CoroutineScope(Dispatchers.IO).launch { +// val response = doctorApi.Auth(authModel) +// val errorMessage = response.errorBody()?.string() +// ?.let { JSONObject(it).getString("message") }//JSONObject(response.errorBody()?.string()) +// requireActivity().runOnUiThread { +// binding.textError.text = errorMessage +// val user = response.body() +// +// //Если есть такой пользователь +// if (user != null) { +// DoctorviewModel.token.value = user.token +// prefDoctor.saveToken(user.token) +// val intetn = Intent(requireContext(), MainActivity::class.java) +// startActivity(intetn) +// activity?.finish() +// } +// } +// } +// +// } +// +// private fun Auth(authModel: AuthModel) { +// //Если есть такой пользователь +// if (authModel.login == "asd" && authModel.password == "asd" ) { +// DoctorviewModel.token.value = "sdadssdasdaasdad434fk3ioj9" +// prefDoctorSave.saveToken(requireContext(),"sdadssdasdaasdad434fk3ioj9") +// val intetn = Intent(requireContext(), MainActivity::class.java) +// startActivity(intetn) +// activity?.finish() +// } +// +// } + + + private fun Auth(authModel: AuthModel) { + CoroutineScope(Dispatchers.IO).launch { + val response = doctorApi.LoginDoctor(authModel) + val errorMessage = response.errorBody()?.string() + ?.let { JSONObject(it).getString("error") }//JSONObject(response.errorBody()?.string()) + requireActivity().runOnUiThread { + Log.i("errorMessage",errorMessage.toString()) + val user = response.body() + + //Если есть такой пользователь + if (user != null) { + DoctorviewModel.token.value = user.token + prefDoctorSave.saveToken(requireContext(), user.token) + + val intetn = Intent(requireContext(), MainActivity::class.java) + startActivity(intetn) + activity?.finish() + } + else{ + Toast(requireContext()).showCustomInfoToast( + "Такого пользователя нету", + requireActivity() + ) + } + } + } + } + + + //Инициализируем Retrofit + private fun initRetrofit() { + val interceptor = HttpLoggingInterceptor() + interceptor.level = HttpLoggingInterceptor.Level.BODY + + val client = OkHttpClient + .Builder() + .addInterceptor(interceptor) + .build() + + val retrofit = Retrofit.Builder() + .baseUrl("http://mobileapp.vmeda.org/api/") + .client(client) + .addConverterFactory(GsonConverterFactory.create()) + .build() + + doctorApi = retrofit.create(DoctorApi::class.java) + + } + + + + companion object { + fun newInstance() = AuthFragment() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Auth/Model/AuthModel.kt b/app/src/main/java/com/example/doctor/Auth/Model/AuthModel.kt new file mode 100644 index 0000000..d7e8e76 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Auth/Model/AuthModel.kt @@ -0,0 +1,7 @@ +package com.example.doctor.Auth.Model + +data class AuthModel( + //val login:String, + val login:String, + val password:String, +) diff --git a/app/src/main/java/com/example/doctor/Auth/Model/CheckTokenModel.kt b/app/src/main/java/com/example/doctor/Auth/Model/CheckTokenModel.kt new file mode 100644 index 0000000..89f05b8 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Auth/Model/CheckTokenModel.kt @@ -0,0 +1,5 @@ +package com.example.doctor.Auth.Model + +data class CheckTokenModel( + val status:String, +) diff --git a/app/src/main/java/com/example/doctor/Auth/Model/UserModel.kt b/app/src/main/java/com/example/doctor/Auth/Model/UserModel.kt new file mode 100644 index 0000000..4406bae --- /dev/null +++ b/app/src/main/java/com/example/doctor/Auth/Model/UserModel.kt @@ -0,0 +1,7 @@ +package com.example.doctor.Auth.Model + +data class UserModel( + val id:String, + val token:String, + +) diff --git a/app/src/main/java/com/example/doctor/BottomSheetMenu/AccountBottomSheetMenu.kt b/app/src/main/java/com/example/doctor/BottomSheetMenu/AccountBottomSheetMenu.kt new file mode 100644 index 0000000..1bec8b4 --- /dev/null +++ b/app/src/main/java/com/example/doctor/BottomSheetMenu/AccountBottomSheetMenu.kt @@ -0,0 +1,171 @@ +//package com.example.doctor.BottomSheetMenu +// +//import android.annotation.SuppressLint +//import android.app.Dialog +//import android.graphics.Color +//import android.os.Bundle +//import android.support.annotation.Nullable +//import android.view.KeyEvent +//import android.view.LayoutInflater +//import android.view.View +//import android.view.ViewGroup +//import android.widget.FrameLayout +//import android.widget.Toast +//import androidx.coordinatorlayout.widget.CoordinatorLayout +//import androidx.fragment.app.activityViewModels +//import com.example.doctor.DoctorViewModel +//import com.example.doctor.R +//import com.example.doctor.databinding.ItemButtomMenu2Binding +//import com.google.android.material.bottomsheet.BottomSheetBehavior +//import com.google.android.material.bottomsheet.BottomSheetDialogFragment +// +//class AccountBottomSheetMenu: BottomSheetDialogFragment() { +// private lateinit var binding: ItemButtomMenu2Binding +// private val model: DoctorViewModel by activityViewModels()//Инициализировали класс +// +// @SuppressLint("RestrictedApi") +// override fun setupDialog(dialog: Dialog, style: Int) { +// super.setupDialog(dialog, style) +// +// val view = LayoutInflater.from(context).inflate(R.layout.item_buttom_menu, null) +// dialog.setContentView(view) +// +// val param = (view.parent as View).layoutParams as CoordinatorLayout.LayoutParams +// +// val behavior = param.behavior +// +// if(behavior is BottomSheetBehavior<*>){ +// behavior.setBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback(){ +// override fun onStateChanged(bottomSheet: View, newState: Int) { +// var state = "" +// when(newState){ +// BottomSheetBehavior.STATE_DRAGGING->{ +// state = "DRAGGING" +// } +// BottomSheetBehavior.STATE_SETTLING->{ +// state = "SETTLING" +// } +// BottomSheetBehavior.STATE_EXPANDED->{ +// state = "EXPANDED" +// } +// BottomSheetBehavior.STATE_COLLAPSED->{ +// state = "COLLAPSED" +// } +// BottomSheetBehavior.STATE_HIDDEN->{ +// state = "HIDDEN" +// dismiss() +// behavior.state = BottomSheetBehavior.STATE_COLLAPSED +// } +// +// } +// } +// +// override fun onSlide(bottomSheet: View, slideOffset: Float) { +// +// } +// +// }) +// } +// } +// +// //Данная функция необходима чтобы убрать белый фон в нижнем всплывающем меню +// override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { +// +// return super.onCreateDialog(savedInstanceState).apply { +// // window?.setDimAmount(0.2f) // Set dim amount here +// setOnShowListener { +// val bottomSheet = findViewById(com.google.android.material.R.id.design_bottom_sheet) as FrameLayout +// bottomSheet.setBackgroundResource(android.R.color.transparent) +// } +// } +// } +// +// +// override fun onCreateView( +// inflater: LayoutInflater, +// container: ViewGroup?, +// savedInstanceState: Bundle? +// ): View? { +// binding = ItemButtomMenu2Binding.inflate(inflater,container,false) +// return binding.root +// } +// +// +// +// +// companion object { +// +// fun newInstance(): AccountBottomSheetMenu { +// val args = Bundle() +// val fragment = AccountBottomSheetMenu() +// fragment.arguments = args +// return fragment +// } +// } +// +// +// override fun onViewCreated(view: View, savedInstanceState: Bundle?) { +// super.onViewCreated(view, savedInstanceState) +// +// /* //Ввод адреса вручную +// binding.btnAdresAdd.setOnClickListener{ +// binding.CardViewStart.visibility = View.GONE +// binding.CardView1.visibility = View.VISIBLE +// } +// //Вернутся из ввода адреса +// binding.btnBack.setOnClickListener{ +// binding.CardViewStart.visibility = View.VISIBLE +// binding.CardView1.visibility = View.GONE +// }*/ +// //Оформления заказа по введенному адресу +// /* binding.btnAddZakaz.setOnClickListener{ +// setListener() +// }*/ +// /*//Оформления заказа по адресу из профиля +// binding.btnZakazAdresUserProfile.setOnClickListener{ +// setListener() +// }*/ +// //Вызов фунции +// setListener() +// +// +// //binding.textView34.setText(binding.editTextAdres.getText().toString()) +// } +// +// //Функция оформления заказа +// private fun setListener(){ +// /* binding.btnAddZakaz.setOnClickListener{ +// adresUser = binding.editTextAdres.text.toString() +// if(adresUser == ""){ +// Toast.makeText(requireContext(), "Нужен адрес", Toast.LENGTH_SHORT).show() +// } +// else{ +// //Данная модель нужна только для того чтобы передать сигнал для BasketFragmen и в случае если true, то он вызовет запрос и прогрузочный экран +// val itemStatus = StatusModel(true) +// model.addZakaz.value = itemStatus +// dismiss()//После нажатия закрываем +// } +// //requestWithSomeHttpHeadersZakaz(requireContext(), adresUser) +// } +// binding.editTextAdres.setOnKeyListener { v, keyCode, event -> +// +// when { +// //Проверяем нажалили мы на "ввод" +// //Check if it is the Enter-Key, Check if the Enter Key was pressed down +// ((keyCode == KeyEvent.KEYCODE_ENTER) && (event.action == KeyEvent.ACTION_DOWN)) -> { +// +// //Если да, то выполняем нажати на кнопку отправки сообщения +// binding.btnAddZakaz.performClick() +// +// //return true +// return@setOnKeyListener true +// } +// else -> false +// } +// +// +// }*/ +// +// } +// +//} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/BottomSheetMenu/NoteBottomSheetMenu.kt b/app/src/main/java/com/example/doctor/BottomSheetMenu/NoteBottomSheetMenu.kt new file mode 100644 index 0000000..eb64d0c --- /dev/null +++ b/app/src/main/java/com/example/doctor/BottomSheetMenu/NoteBottomSheetMenu.kt @@ -0,0 +1,176 @@ +package com.example.user.BottomSheetMenu + +import android.annotation.SuppressLint +import android.app.Dialog +import android.graphics.Color +import android.os.Bundle +import android.support.annotation.Nullable +import android.view.KeyEvent +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.FrameLayout +import android.widget.Toast +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.fragment.app.activityViewModels +import com.example.doctor.DoctorViewModel +import com.example.doctor.Patients.Model.CreatePatientModel +import com.example.doctor.Pref.ConclusionPref +import com.example.doctor.R +import com.example.doctor.Retrofit.DoctorApi +import com.example.doctor.Toast.showCustomInfoToast +import com.example.doctor.databinding.ItemButtomMenuBinding +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +class NoteBottomSheetMenu: BottomSheetDialogFragment() { + private lateinit var binding: ItemButtomMenuBinding + private lateinit var doctorApi: DoctorApi + val prefDoctorConclusion = ConclusionPref() + + @SuppressLint("RestrictedApi") + override fun setupDialog(dialog: Dialog, style: Int) { + super.setupDialog(dialog, style) + + val view = LayoutInflater.from(context).inflate(R.layout.item_buttom_menu, null) + dialog.setContentView(view) + + val param = (view.parent as View).layoutParams as CoordinatorLayout.LayoutParams + + val behavior = param.behavior + + if(behavior is BottomSheetBehavior<*>){ + behavior.setBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback(){ + override fun onStateChanged(bottomSheet: View, newState: Int) { + var state = "" + when(newState){ + BottomSheetBehavior.STATE_DRAGGING->{ + state = "DRAGGING" + } + BottomSheetBehavior.STATE_SETTLING->{ + state = "SETTLING" + } + BottomSheetBehavior.STATE_EXPANDED->{ + state = "EXPANDED" + } + BottomSheetBehavior.STATE_COLLAPSED->{ + state = "COLLAPSED" + } + BottomSheetBehavior.STATE_HIDDEN->{ + state = "HIDDEN" + dismiss() + behavior.state = BottomSheetBehavior.STATE_COLLAPSED + } + + } + } + + override fun onSlide(bottomSheet: View, slideOffset: Float) { + + } + + }) + } + } + + //Данная функция необходима чтобы убрать белый фон в нижнем всплывающем меню + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + + return super.onCreateDialog(savedInstanceState).apply { + // window?.setDimAmount(0.2f) // Set dim amount here + setOnShowListener { + val bottomSheet = findViewById(com.google.android.material.R.id.design_bottom_sheet) as FrameLayout + bottomSheet.setBackgroundResource(android.R.color.transparent) + } + } + } + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = ItemButtomMenuBinding.inflate(inflater,container,false) + return binding.root + } + + + + + companion object { + + fun newInstance(): NoteBottomSheetMenu { + val args = Bundle() + val fragment = NoteBottomSheetMenu() + fragment.arguments = args + return fragment + } + } + + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + binding.btnAddPatient.setOnClickListener{ + if(binding.edEmail.text.toString() == "" && binding.edPassword.text.toString() == ""){ + Toast(requireContext()).showCustomInfoToast("Не все поля заполнены", requireActivity()) + } + else{ + CreateAccountPatient(CreatePatientModel(binding.edEmail.text.toString(),binding.edPassword.text.toString())) + } + } + } + + + fun CreateAccountPatient(createPatientModel: CreatePatientModel) { + initRetrofit() + val Tokens = prefDoctorConclusion.conclusionToken(requireContext()) + CoroutineScope(Dispatchers.IO).launch { + val listProduct = doctorApi.CreateAccountPatient("Bearer $Tokens",createPatientModel) + requireActivity().runOnUiThread { + + //Фиксируем полученные данные + val patientList = listProduct.body() + + //Если нету ошибок + if (patientList != null) { + Toast(requireContext()).showCustomInfoToast("Аккаунт для пациента создан", requireActivity()) + dismiss()//После нажатия закрываем + } + else{ + Toast(requireContext()).showCustomInfoToast("Ошибка валидации", requireActivity()) + } + } + + } + } + + + //Инициализируем Retrofit + private fun initRetrofit() { + val interceptor = HttpLoggingInterceptor() + interceptor.level = HttpLoggingInterceptor.Level.BODY + + val client = OkHttpClient + .Builder() + .addInterceptor(interceptor) + .build() + + val retrofit = Retrofit.Builder() + .baseUrl("http://mobileapp.vmeda.org/api/") + .client(client) + .addConverterFactory(GsonConverterFactory.create()) + .build() + + doctorApi = retrofit.create(DoctorApi::class.java) + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/BottomSheetMenu/StatusModel.kt b/app/src/main/java/com/example/doctor/BottomSheetMenu/StatusModel.kt new file mode 100644 index 0000000..34ab9e5 --- /dev/null +++ b/app/src/main/java/com/example/doctor/BottomSheetMenu/StatusModel.kt @@ -0,0 +1,5 @@ +package com.example.doctor.BottomSheetMenu + +data class StatusModel( + val status: Boolean = false + ) diff --git a/app/src/main/java/com/example/doctor/DoctorViewModel.kt b/app/src/main/java/com/example/doctor/DoctorViewModel.kt new file mode 100644 index 0000000..334ae00 --- /dev/null +++ b/app/src/main/java/com/example/doctor/DoctorViewModel.kt @@ -0,0 +1,56 @@ +package com.example.doctor + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.example.doctor.Appeals.AppealsOldModel +import com.example.doctor.Appeals.AppealsNewModel +import com.example.doctor.Patients.Model.PatientAllModel +import com.example.doctor.Patients.Model.PatientModel +import com.example.doctor.Patients.Reports.Edit.EditSportListNoModel +import com.example.doctor.Patients.Reports.Edit.EditSportListYesModel +import com.example.doctor.Patients.Reports.Edit.EditSportModel +import com.example.doctor.Patients.Reports.QBAModel +import com.example.doctor.Patients.Reports.SportCoursModel + +//import com.example.retrofit.model.Product + +class DoctorViewModel: ViewModel() { + + //Токен + val token = MutableLiveData() + + //Пациенты + val patientCurrent = MutableLiveData() + val patientListList= MutableLiveData() + + //Обращения новые + val appealsNewCurrent = MutableLiveData() + val appealsNewList= MutableLiveData>() + + //Обращения все + val appealsAllCurrent = MutableLiveData() + val appealsAllList= MutableLiveData>() + + //val productList = MutableLiveData>() + val patientOneCurrent = MutableLiveData() + + //Отчеты + val qbaCurrent = MutableLiveData() + val qbaList= MutableLiveData>() + + //КУрсы + val SportCoursCurrent = MutableLiveData() + val SportCoursList= MutableLiveData>() + + //Редактирование занятий + val EditSportCurrentYes = MutableLiveData() + val EditSportListYes= MutableLiveData>() + + //Редактирование занятий + val EditSportCurrentNO = MutableLiveData() + val EditSportListNo= MutableLiveData>() + + + //id пациента + val id_patient = MutableLiveData() +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Home/HomeFragment.kt b/app/src/main/java/com/example/doctor/Home/HomeFragment.kt new file mode 100644 index 0000000..e5c64dc --- /dev/null +++ b/app/src/main/java/com/example/doctor/Home/HomeFragment.kt @@ -0,0 +1,31 @@ +package com.example.doctor.Home + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.doctor.databinding.FragmentHomeBinding + + +class HomeFragment : Fragment() { + private lateinit var binding: FragmentHomeBinding + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentHomeBinding.inflate(layoutInflater,container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + } + + companion object { + + fun newInstance() = HomeFragment() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/MainActivity.kt b/app/src/main/java/com/example/doctor/MainActivity.kt new file mode 100644 index 0000000..d7e78b3 --- /dev/null +++ b/app/src/main/java/com/example/doctor/MainActivity.kt @@ -0,0 +1,146 @@ +package com.example.doctor + +import android.annotation.SuppressLint +import android.content.Context +import android.content.Intent +import android.content.SharedPreferences +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.util.Log +import android.widget.ArrayAdapter +import android.widget.Toast +import androidx.appcompat.app.AlertDialog +import com.example.doctor.Auth.AuthActivity +import com.example.doctor.Auth.AuthFragment +import com.example.doctor.Auth.Model.AuthModel +import com.example.doctor.Pref.ConclusionPref +import com.example.doctor.Pref.SavePref +import com.example.doctor.Retrofit.DoctorApi +import com.example.doctor.Toast.showCustomInfoToast +import com.example.doctor.databinding.ActivityMainBinding +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import org.json.JSONObject +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +class MainActivity : AppCompatActivity() { + private lateinit var binding: ActivityMainBinding + private lateinit var doctorApi: DoctorApi + + //Токен + private var Token = "" + val prefDoctorSave = SavePref() + val prefDoctorConclusion = ConclusionPref() + var backPressedTime: Long = 0 + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + + initRetrofit() + + MainAndAuth() + + + } + + + fun MainAndAuth() { + Token = prefDoctorConclusion.conclusionToken(this) + //CheckTokenAuth(Token) + if (Token == "") { + Auth() + } else { + CheckTokenAuth(Token) + } + } + + fun Auth() { + supportFragmentManager.beginTransaction() + .replace(R.id.CLMain, AuthFragment.newInstance()) + .commit() + } + + fun Main() { + fragment_inicializ() + } + + @SuppressLint("SuspiciousIndentation") + private fun CheckTokenAuth(token: String) { + CoroutineScope(Dispatchers.IO).launch { + val response = doctorApi.CheckToken("Bearer $token") + runOnUiThread { + val checkToken = response.body() + val user1 = response.code() + Log.i("12213213213", user1.toString()) + + if (user1.toString() == "200") { + Main() + } else { + Auth() + } + } + + } + + } + + + //Инициализируем Retrofit + private fun initRetrofit() { + val interceptor = HttpLoggingInterceptor() + interceptor.level = HttpLoggingInterceptor.Level.BODY + + val client = OkHttpClient + .Builder() + .addInterceptor(interceptor) + .build() + + val retrofit = Retrofit.Builder() + .baseUrl("http://mobileapp.vmeda.org/api/") + .client(client) + .addConverterFactory(GsonConverterFactory.create()) + .build() + + doctorApi = retrofit.create(DoctorApi::class.java) + + } + + private fun fragment_inicializ() { + //Вывод фрагмента на активити при первоначальной загрузке + supportFragmentManager.beginTransaction() + .replace(R.id.CLMain, MainFragment.newInstance()) + .commit()//Заменяем наш экран на фрагмент (используем наш экран как основу)//R.id.placeHolder - куда всталяем //MainFragment.newInstance() - это то что мы вставляем + + } +// override fun onBackPressed() { +// if (backPressedTime + 3000 > System.currentTimeMillis()) { +// super.onBackPressed() +// finish() +// } else { +// AlertDialog.Builder(this@MainActivity) +// .setTitle("Выйти") +// .setMessage("Вы точно хотите выйти из приложения?") +// .setPositiveButton("Да") { dialog, whichButton -> +// super.onBackPressed() +// } +// .setNegativeButton("Нет") { dialog, whichButton -> +// +// } +// .show() +// } +// backPressedTime = System.currentTimeMillis() +// } + + override fun onResume() { + super.onResume() + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/MainFragment.kt b/app/src/main/java/com/example/doctor/MainFragment.kt new file mode 100644 index 0000000..17bee90 --- /dev/null +++ b/app/src/main/java/com/example/doctor/MainFragment.kt @@ -0,0 +1,108 @@ +package com.example.doctor + + +import android.annotation.SuppressLint +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import com.example.doctor.Appeals.AppealsFragment +import com.example.doctor.Home.HomeFragment +import com.example.doctor.Patients.PatientsListFragment +import com.example.doctor.Pref.ConclusionPref +import com.example.doctor.Pref.SavePref +import com.example.doctor.Setting.SettingFragment +import com.example.doctor.databinding.FragmentMainBinding + + +class MainFragment : Fragment() { + private lateinit var binding: FragmentMainBinding + + val prefDoctorSave = SavePref() + val prefDoctorConclusion = ConclusionPref() + + private var Token = "" + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentMainBinding.inflate(layoutInflater,container,false) + return binding.root + } + + @SuppressLint("ResourceType") + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + //MainAndAuth() + fragment_inicializ() + } + +// fun MainAndAuth(){ +// +// //Token = prefDoctorConclusion.conclusionToken() +// if(Token == ""){ +// Auth() +// } +// else{ +// Main() +// } +// } + +// fun Auth(){ +// val intetn = Intent(requireContext(), AuthActivity::class.java) +// startActivity(intetn) +// activity?.finish() +// } +// fun Main(){ +// fragment_inicializ() +// } + + + + //Инициализация фрагментов + fun fragment_inicializ() { + Token = prefDoctorConclusion.conclusionToken(requireContext()) + //Вывод фрагмента на активити при первоначальной загрузке + activity?.supportFragmentManager?.beginTransaction() + ?.replace(R.id.CLMainFragment, HomeFragment.newInstance()) + ?.commit()//Заменяем наш экран на фрагмент (используем наш экран как основу)//R.id.placeHolder - куда всталяем //MainFragment.newInstance() - это то что мы вставляем + + + //Эран который будет выбран по умолчанию(кнопка которая будет прожата по умолчанию) + binding.buttonNavigation.selectedItemId = R.id.home//По умолчанию и так первая, но на всякий случай выберу еще програмным путем первую ячейку + + //Нажатие на bottom navigation + binding.buttonNavigation.setOnItemSelectedListener { + + when (it.itemId) {//it.itemId - это id нажатого элемента + R.id.home -> { + activity?.supportFragmentManager?.beginTransaction() + ?.replace(R.id.CLMainFragment, HomeFragment.newInstance())?.commit()//Заменяем наш экран на фрагмент (используем наш экран как основу)//R.id.placeHolder - куда всталяем //MainFragment.newInstance() - это то что мы вставляем + } + R.id.patient -> { + activity?.supportFragmentManager?.beginTransaction() + ?.replace(R.id.CLMainFragment, PatientsListFragment.newInstance())?.commit()//Заменяем наш экран на фрагмент (используем наш экран как основу)//R.id.placeHolder - куда всталяем //MainFragment.newInstance() - это то что мы вставляем + } + + + R.id.list_check -> {//Если вы не авторизованный пользваотель то вам не будет доступен доступ к данном фрагменту + activity?.supportFragmentManager?.beginTransaction() + ?.replace(R.id.CLMainFragment, AppealsFragment.newInstance())?.commit()//Заменяем наш экран на фрагмент (используем наш экран как основу)//R.id.placeHolder - куда всталяем //MainFragment.newInstance() - это то что мы вставляем + } + R.id.setting -> {//Если вы не авторизованный пользваотель то вам не будет доступен доступ к данном фрагменту + activity?.supportFragmentManager?.beginTransaction() + ?.replace(R.id.CLMainFragment, SettingFragment.newInstance())?.commit()//Заменяем наш экран на фрагмент (используем наш экран как основу)//R.id.placeHolder - куда всталяем //MainFragment.newInstance() - это то что мы вставляем + } + + } + true + } + } + + companion object { + + fun newInstance() = MainFragment() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Patients/Adapter/PatientListAdapter.kt b/app/src/main/java/com/example/doctor/Patients/Adapter/PatientListAdapter.kt new file mode 100644 index 0000000..5f2e15f --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Adapter/PatientListAdapter.kt @@ -0,0 +1,92 @@ +package com.example.doctor.Patients.Adapter + +import android.annotation.SuppressLint +import android.os.Handler +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.example.doctor.Patients.Model.PatientAllModel +import com.example.doctor.Patients.Model.PatientModel +import com.example.doctor.R +import com.example.doctor.databinding.ItemCardPatientBinding + + +class PatientListAdapter(val listener_patient: Listener) : + ListAdapter( + Comparator() + ) {//Productitem - по этой форме будем заполнять.//ProductAdapter.holder - это создаваемый holder который хранит логику как нужно заполнять карточку + + + //В holder создаетс код с помошью которого мы будем заполнять и сохронять разметку + class Holder(view: View, val listener_patient: Listener) : + RecyclerView.ViewHolder(view) {//Класс который будет хранить сссылки на элементы, и отвечает за один элемент за 1 раз, то есть сначсало нулевой элемент заполнит, потом первый, потом второй и т.д. + //Для передачи данных + + val binding = + ItemCardPatientBinding.bind(view)//view - здесь храянтся элементы и мы их bind заполним в ListItemBinding//ListItemBinding - это клласс даннйо разметки(карточки) которую мы будем заполнять, а нужна дання переменная(binding), чтобы мжно было при заполнение обращатся к элементам карточки + + var itemTemp: PatientAllModel? = + null//Глобальная переменная для нашего item, чтобы можно было передать данные для нажатия + + //init - дает возможность внутри адаптера обращаться к элементам экрана + init { + itemView.setOnClickListener {//Нажатие на ячейку//itemView - это весь элемент карточки из списка + //itemView.setEnabled(false) + itemTemp?.let { it1 -> listener_patient.onClickPatient(it1) } + + } + } + + @SuppressLint("SuspiciousIndentation", "SetTextI18n") + fun bind(item: PatientAllModel) = with(binding) {//Productitem - перпедаем данные + itemTemp = item + txtNumberCurds.text = item.id.toString() + "." + txtLoginPatient.text = item.login + } + + + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_card_patient, parent, false)//Создаем(надуваем) list_item + return Holder(view, listener_patient)//Через Holder возврощаем view + } + + override fun onBindViewHolder(holder: Holder, position: Int) { + val view = holder.bind(getItem(position))//Заполняем по позиции карточку + } + + + //Comparator - сравнивает старый список и новый и если что-то изменилось, то работает с конкретным изменением списке, а не весь список переписывает + class Comparator : DiffUtil.ItemCallback() { + override fun areItemsTheSame( + oldItem: PatientAllModel, + newItem: PatientAllModel + ): Boolean {//Тут лучше всего сравнивать по id//oldItem - элементы старого списка, newItem - элементы нового списка//Возврощает Boolean, тоесть есть изменения или нет + return oldItem.id == newItem.id//Сравниваем полностью весь список новы и старый, по очередно по одной карточке и по элементно, то есть нулевой элемент, первый, второй и т.д.. Но лучше сравнивать по id списки, а не просто весь список, так как это эфективнее, так как id уникальный(oldItem.id == newItem.id) + } + + override fun areContentsTheSame( + oldItem: PatientAllModel, + newItem: PatientAllModel + ): Boolean {//Утут нужно сравнивать весь спсок старых элементов и новых + return oldItem == newItem//Сравниваем полностью весь список новы и старый + } + } + + //Интерфейс нажатия на кнопку удалить товар из корзины + interface Listener { + fun onClickPatient(item: PatientAllModel) + } + + +} + + + + diff --git a/app/src/main/java/com/example/doctor/Patients/Model/CreatePatientModel.kt b/app/src/main/java/com/example/doctor/Patients/Model/CreatePatientModel.kt new file mode 100644 index 0000000..a47f4df --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Model/CreatePatientModel.kt @@ -0,0 +1,7 @@ +package com.example.doctor.Patients.Model + +data class CreatePatientModel( + //val login:String, + val login:String, + val password:String, +) diff --git a/app/src/main/java/com/example/doctor/Patients/Model/MessageModel.kt b/app/src/main/java/com/example/doctor/Patients/Model/MessageModel.kt new file mode 100644 index 0000000..47b4221 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Model/MessageModel.kt @@ -0,0 +1,6 @@ +package com.example.doctor.Patients.Model + +data class MessageModel( + val message: String, +) + diff --git a/app/src/main/java/com/example/doctor/Patients/Model/PatientAllListModel.kt b/app/src/main/java/com/example/doctor/Patients/Model/PatientAllListModel.kt new file mode 100644 index 0000000..8f9ae8c --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Model/PatientAllListModel.kt @@ -0,0 +1,6 @@ +package com.example.doctor.Patients.Model + +data class PatientAllListModel( + val patient: List +) + diff --git a/app/src/main/java/com/example/doctor/Patients/Model/PatientAllModel.kt b/app/src/main/java/com/example/doctor/Patients/Model/PatientAllModel.kt new file mode 100644 index 0000000..65328f9 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Model/PatientAllModel.kt @@ -0,0 +1,21 @@ +package com.example.doctor.Patients.Model + +import java.util.Date + +data class PatientAllModel( + val id: Int? = null, + val login: String? = null, + val email: String? = null, + val loginDoctor: String? = null, + val emailDoctor: String? = null, + val pause: String? = null, + val block: String? = null, + val report7day: String? = null, + val report15day: String? = null, + val id_sport_patient: Int? = null, + val total_days_sports: Int? = null, + val now_days_sports: Int? = null, + val created_at: String? = null, + val updated_at: String? = null, +) + diff --git a/app/src/main/java/com/example/doctor/Patients/Model/PatientModel.kt b/app/src/main/java/com/example/doctor/Patients/Model/PatientModel.kt new file mode 100644 index 0000000..fed20f8 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Model/PatientModel.kt @@ -0,0 +1,8 @@ +package com.example.doctor.Patients.Model + +data class PatientModel( + val id: Int, + val login: String, + //val email:String, +) + diff --git a/app/src/main/java/com/example/doctor/Patients/Model/PauseModel.kt b/app/src/main/java/com/example/doctor/Patients/Model/PauseModel.kt new file mode 100644 index 0000000..06d4bc2 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Model/PauseModel.kt @@ -0,0 +1,6 @@ +package com.example.doctor.Patients.Model + +data class PauseModel( + val message: String, +) + diff --git a/app/src/main/java/com/example/doctor/Patients/PatientsListFragment.kt b/app/src/main/java/com/example/doctor/Patients/PatientsListFragment.kt new file mode 100644 index 0000000..a7c044d --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/PatientsListFragment.kt @@ -0,0 +1,182 @@ +package com.example.doctor.Patients + +//noinspection SuspiciousImport +import android.R +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ArrayAdapter +import androidx.fragment.app.activityViewModels +import androidx.recyclerview.widget.GridLayoutManager +import com.example.doctor.DoctorViewModel +import com.example.doctor.Patients.Adapter.PatientListAdapter +import com.example.doctor.Patients.Model.PatientAllModel +import com.example.doctor.Patients.Model.PatientModel +import com.example.doctor.Patients.Reports.PatientFragment +import com.example.doctor.Pref.ConclusionPref +import com.example.doctor.Retrofit.DoctorApi +import com.example.doctor.databinding.FragmentPatientsListBinding +import com.example.user.BottomSheetMenu.NoteBottomSheetMenu +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + + +class PatientsListFragment : Fragment(), PatientListAdapter.Listener { + private lateinit var binding: FragmentPatientsListBinding + private val model: DoctorViewModel by activityViewModels() + lateinit var adapterPatient: PatientListAdapter + private lateinit var doctorApi: DoctorApi + val prefDoctorConclusion = ConclusionPref() + + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentPatientsListBinding.inflate(layoutInflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initRcViewDay() + patientListCurrent() + GetPatientList() + + + + +// //Swipe down +// binding.refreshLayout.setOnRefreshListener{ +// GetPatientList() +// binding.refreshLayout.isRefreshing = false +// } + + + //Нажатие на кнопку заказать заказ + binding.btnAddPatient.setOnClickListener { + val noteBottomSheetMenu = NoteBottomSheetMenu.newInstance() + noteBottomSheetMenu.show( + requireActivity().supportFragmentManager, + "Note Bottom Sheet Fragment" + ) + } + } + + //Получения списка пациентов + fun GetPatientList() { + initRetrofit() + val Tokens = prefDoctorConclusion.conclusionToken(requireContext()) + CoroutineScope(Dispatchers.IO).launch { + val listProduct = doctorApi.GetPatientAll("Bearer $Tokens") + requireActivity().runOnUiThread { + + //Фиксируем полученные данные + val patientList = listProduct.body() + + //Если нету ошибок + if (patientList != null) { + adapterPatient.submitList(patientList.patient) + //model.patientListList.value = patientList.PatientList + addListSerchPatient(patientList.patient) + } + } + + } + } + + + + private fun addListSerchPatient(patient: List) { + val listPatient = arrayListOf("") + for(i in 0 .. patient.count()-1){ + listPatient.add(patient[i].login.toString()) + } + + val adapter = ArrayAdapter(requireContext(), R.layout.simple_list_item_1, listPatient) + binding.searchPatient.threshold = 1 + binding.searchPatient.setAdapter(adapter) + + binding.searchPatient.setOnItemClickListener { parent, arg1, pos, id -> + //val list = ArrayList() + val serpat = binding.searchPatient.text.toString() + + //Вывод фрагмента на активити при первоначальной загрузке + activity?.supportFragmentManager?.beginTransaction() + ?.replace(com.example.doctor.R.id.CLMainListPatient, PatientFragment.newInstance()) + ?.commit() + + + binding.CLMainListPatient2.visibility = View.GONE + //Ищем пациента по логину + for(i in 0 ..patient.count()-1) { + if(patient[i].login == serpat){ + model.patientCurrent.value = patient[i] + } + } + + + } + + } + + //Вывод прогресса на один день + private fun patientListCurrent() = with(binding) { +// model.patientListCurrent.observe(viewLifecycleOwner) {//viewLifecycleOwner - следит за циклом жизни fragment +// +// } + + } + + //Инициализируем Retrofit + private fun initRetrofit() { + val interceptor = HttpLoggingInterceptor() + interceptor.level = HttpLoggingInterceptor.Level.BODY + + val client = OkHttpClient + .Builder() + .addInterceptor(interceptor) + .build() + + val retrofit = Retrofit.Builder() + .baseUrl("http://mobileapp.vmeda.org/api/") + .client(client) + .addConverterFactory(GsonConverterFactory.create()) + .build() + + doctorApi = retrofit.create(DoctorApi::class.java) + + } + + //Инициализация списка + private fun initRcViewDay() = with(binding) { + rcView.layoutManager = + GridLayoutManager(requireContext(), 1)//По вертикали будет выводить по умолчанию + adapterPatient = PatientListAdapter(this@PatientsListFragment) + rcView.adapter = adapterPatient + } + + companion object { + fun newInstance() = PatientsListFragment() + } + + + override fun onClickPatient(item: PatientAllModel) { + //Вывод фрагмента на активити при первоначальной загрузке + activity?.supportFragmentManager?.beginTransaction() + ?.replace(com.example.doctor.R.id.CLMainListPatient, PatientFragment.newInstance()) + ?.commit() + //binding.rcView.visibility = View.GONE + binding.CLMainListPatient2.visibility = View.GONE + model.patientCurrent.value = item + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/CoursesAdapter.kt b/app/src/main/java/com/example/doctor/Patients/Reports/CoursesAdapter.kt new file mode 100644 index 0000000..98d641c --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/CoursesAdapter.kt @@ -0,0 +1,76 @@ +package com.example.doctor.Patients.Reports + +import android.annotation.SuppressLint +import android.graphics.Color +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.example.doctor.Patients.Reports.Edit.EditSportModel +import com.example.doctor.Patients.Reports.Edit.EditSportNoAdapter +import com.example.doctor.R +import com.example.doctor.databinding.ItemQbaBinding +import com.example.doctor.databinding.ItemSportCourseBinding + + +class CoursesAdapter(val listener_cours: CoursesAdapter.Listener) : ListAdapter(Comparator()) { + class Holder(view: View,val listener_cours: CoursesAdapter.Listener) : + RecyclerView.ViewHolder(view) { + + val binding = ItemSportCourseBinding.bind(view) + + var itemTemp: SportCoursModel? = + null//Глобальная переменная для нашего item, чтобы можно было передать данные для нажатия + + //init - дает возможность внутри адаптера обращаться к элементам экрана + init { + itemView.setOnClickListener {//Нажатие на ячейку//itemView - это весь элемент карточки из списка + itemTemp?.let { it1 -> listener_cours.onClickCoursAdd(it1) } + } + } + + @SuppressLint("SuspiciousIndentation") + fun bind(item: SportCoursModel) = with(binding) { + txtCoursesSport.text = item.name + if(item.visibility == 1){ + CVCours.setCardBackgroundColor(Color.parseColor("#83da83")) + } + else{ + CVCours.setCardBackgroundColor(Color.parseColor("#b6b6b6")) + } + + } + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_sport_course, parent, false) + return Holder(view,listener_cours) + } + + override fun onBindViewHolder(holder: Holder, position: Int) { + val view = holder.bind(getItem(position)) + } + + class Comparator : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: SportCoursModel, newItem: SportCoursModel): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame(oldItem: SportCoursModel, newItem: SportCoursModel): Boolean { + return oldItem == newItem + } + } + + //Интерфейс нажатия на кнопку удалить товар из корзины + interface Listener { + fun onClickCoursAdd(item: SportCoursModel) + } + +} + + + + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportFragment.kt b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportFragment.kt new file mode 100644 index 0000000..0c67a78 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportFragment.kt @@ -0,0 +1,76 @@ +package com.example.doctor.Patients.Reports.Edit + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.FragmentActivity +import com.example.doctor.Adapter.VpEditSportAdapter +import com.example.doctor.Patients.Reports.Edit.TabLayout.EditSportNoFragment +import com.example.doctor.Patients.Reports.Edit.TabLayout.EditSportYesFragment +import com.example.doctor.R +import com.example.doctor.databinding.FragmentEditSportBinding +import com.google.android.material.tabs.TabLayoutMediator + + +class EditSportFragment : Fragment() { + private lateinit var binding: FragmentEditSportBinding + + private val tListSport = listOf( + "Активные", + "Отключенные", + ) + + //Список с фрагментами для переключения + private val flistSport = listOf( + EditSportYesFragment.newInstance(), + EditSportNoFragment.newInstance(), + ) + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentEditSportBinding.inflate(layoutInflater,container,false) + return binding.root + } + + companion object { + + fun newInstance() = EditSportFragment() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + init() + + } + + + //Функция подключения переключения + private fun init() = with(binding) { + val adapter = VpEditSportAdapter(activity as FragmentActivity, flistSport) + vpEditSport.adapter = adapter + + //Переключения (связываем таблаяут(переключатель) с viewpager, чтобы переключать фрагменты) + TabLayoutMediator(tabLayoutSport, vpEditSport) { tab, pos -> + tab.text = + tListSport[pos]//tab - нажатая кнопка, pos - позиция кнопки, tList[pos] - передаем название по полученной позиции + }.attach()// attach() - чтобы все переключалось, а не вывадило постоянно один экран + + //Изменения цвета в зависомости на каком из tabLayout вы находитесь + binding.tabLayoutSport.setTabTextColors(getResources().getColor(R.color.black), + getResources().getColor(R.color.white)); + } + + + +// //Инициализация списка +// private fun initRcViewDay() = with(binding) { +// rcView.layoutManager = +// GridLayoutManager(requireContext(), 1)//По вертикали будет выводить по умолчанию +// adapterPatient = PatientListAdapter(this@PatientsListFragment) +// rcView.adapter = adapterPatient +// } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportListNoModel.kt b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportListNoModel.kt new file mode 100644 index 0000000..dcfd6d6 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportListNoModel.kt @@ -0,0 +1,8 @@ +package com.example.doctor.Patients.Reports.Edit + +data class EditSportListNoModel( + val set_of_sports_exercises_no: List + + + ) + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportListYesModel.kt b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportListYesModel.kt new file mode 100644 index 0000000..2ea1e5b --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportListYesModel.kt @@ -0,0 +1,10 @@ +package com.example.doctor.Patients.Reports.Edit + +import com.example.doctor.Patients.Reports.QBAModel + +data class EditSportListYesModel( + val set_of_sports_exercises_yes: List + + + ) + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportModel.kt b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportModel.kt new file mode 100644 index 0000000..1268464 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportModel.kt @@ -0,0 +1,11 @@ +package com.example.doctor.Patients.Reports.Edit + +data class EditSportModel( + val number: Int, + val id: Int, + val name:String, + val description:String, + val url_image:String, + var expand : Boolean = false, + ) + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportNoAdapter.kt b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportNoAdapter.kt new file mode 100644 index 0000000..77d1744 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportNoAdapter.kt @@ -0,0 +1,107 @@ +package com.example.doctor.Patients.Reports.Edit + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.example.doctor.R +import com.example.doctor.databinding.ItemEditSportNoBinding +import com.example.doctor.databinding.ItemEditSportYesBinding + + +class EditSportNoAdapter(val listener_sport: Listener) : + ListAdapter( + Comparator() + ) {//Productitem - по этой форме будем заполнять.//ProductAdapter.holder - это создаваемый holder который хранит логику как нужно заполнять карточку + + + //В holder создаетс код с помошью которого мы будем заполнять и сохронять разметку + class Holder(view: View, val listener_sport: Listener) : + RecyclerView.ViewHolder(view) {//Класс который будет хранить сссылки на элементы, и отвечает за один элемент за 1 раз, то есть сначсало нулевой элемент заполнит, потом первый, потом второй и т.д. + //Для передачи данных + + val binding = ItemEditSportNoBinding.bind(view)//view - здесь храянтся элементы и мы их bind заполним в ListItemBinding//ListItemBinding - это клласс даннйо разметки(карточки) которую мы будем заполнять, а нужна дання переменная(binding), чтобы мжно было при заполнение обращатся к элементам карточки + + var itemTemp: EditSportModel? = + null//Глобальная переменная для нашего item, чтобы можно было передать данные для нажатия + + //init - дает возможность внутри адаптера обращаться к элементам экрана + init { + itemView.setOnClickListener {//Нажатие на ячейку//itemView - это весь элемент карточки из списка + itemTemp?.let { it1 -> listener_sport.onClickAppeals(it1) } + } + } + + @SuppressLint("SuspiciousIndentation") + fun bind(item: EditSportModel) = with(binding) {//Productitem - перпедаем данные + itemTemp = item + txtNumber.text = item.number.toString()+"." + txtNameSport.text = item.name + txtDescriptionSport.text = item.description + + if (item.expand) { + binding.txtDescriptionSport.maxLines = 100 + + } else { + binding.txtDescriptionSport.maxLines = 1 + + } + + binding.CardViewOld.setOnClickListener { + if (item.expand == false) { + binding.txtDescriptionSport.maxLines = 100 + item.expand = true + } else { + binding.txtDescriptionSport.maxLines = 1 + item.expand = false + } + } + + } + + + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_edit_sport_no, parent, false)//Создаем(надуваем) list_item + return Holder(view, listener_sport)//Через Holder возврощаем view + } + + override fun onBindViewHolder(holder: Holder, position: Int) { + val view = holder.bind(getItem(position))//Заполняем по позиции карточку + } + + + //Comparator - сравнивает старый список и новый и если что-то изменилось, то работает с конкретным изменением списке, а не весь список переписывает + class Comparator : DiffUtil.ItemCallback() { + override fun areItemsTheSame( + oldItem: EditSportModel, + newItem: EditSportModel + ): Boolean {//Тут лучше всего сравнивать по id//oldItem - элементы старого списка, newItem - элементы нового списка//Возврощает Boolean, тоесть есть изменения или нет + return oldItem.id == newItem.id//Сравниваем полностью весь список новы и старый, по очередно по одной карточке и по элементно, то есть нулевой элемент, первый, второй и т.д.. Но лучше сравнивать по id списки, а не просто весь список, так как это эфективнее, так как id уникальный(oldItem.id == newItem.id) + } + + override fun areContentsTheSame( + oldItem: EditSportModel, + newItem: EditSportModel + ): Boolean {//Утут нужно сравнивать весь спсок старых элементов и новых + return oldItem == newItem//Сравниваем полностью весь список новы и старый + } + } + + //Интерфейс нажатия на кнопку удалить товар из корзины + interface Listener { + fun onClickAppeals(item: EditSportModel) + } + + +} + + + + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportSearchModel.kt b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportSearchModel.kt new file mode 100644 index 0000000..fb870e2 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportSearchModel.kt @@ -0,0 +1,8 @@ +package com.example.doctor.Patients.Reports.Edit + +data class EditSportSearchModel( + val id_patient: Int, + val id_sports_courses_patient: Int, + + ) + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportYesAdapter.kt b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportYesAdapter.kt new file mode 100644 index 0000000..8225412 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/EditSportYesAdapter.kt @@ -0,0 +1,106 @@ +package com.example.doctor.Patients.Reports.Edit + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.example.doctor.R +import com.example.doctor.databinding.ItemEditSportYesBinding + + +class EditSportYesAdapter(val listener_sport: Listener) : + ListAdapter( + Comparator() + ) {//Productitem - по этой форме будем заполнять.//ProductAdapter.holder - это создаваемый holder который хранит логику как нужно заполнять карточку + + + //В holder создаетс код с помошью которого мы будем заполнять и сохронять разметку + class Holder(view: View, val listener_sport: Listener) : + RecyclerView.ViewHolder(view) {//Класс который будет хранить сссылки на элементы, и отвечает за один элемент за 1 раз, то есть сначсало нулевой элемент заполнит, потом первый, потом второй и т.д. + //Для передачи данных + + val binding = ItemEditSportYesBinding.bind(view)//view - здесь храянтся элементы и мы их bind заполним в ListItemBinding//ListItemBinding - это клласс даннйо разметки(карточки) которую мы будем заполнять, а нужна дання переменная(binding), чтобы мжно было при заполнение обращатся к элементам карточки + + var itemTemp: EditSportModel? = + null//Глобальная переменная для нашего item, чтобы можно было передать данные для нажатия + + //init - дает возможность внутри адаптера обращаться к элементам экрана + init { + binding.btnYeyYes.setOnClickListener {//Нажатие на ячейку//itemView - это весь элемент карточки из списка + itemTemp?.let { it1 -> listener_sport.onClickAppeals(it1) } + } + } + + @SuppressLint("SuspiciousIndentation") + fun bind(item: EditSportModel) = with(binding) {//Productitem - перпедаем данные + itemTemp = item + txtNumber.text = item.number.toString()+"." + txtNameSport.text = item.name + txtDescriptionSport.text = item.description + + if (item.expand) { + binding.txtDescriptionSport.maxLines = 100 + + } else { + binding.txtDescriptionSport.maxLines = 1 + + } + + binding.CardViewOld.setOnClickListener { + if (item.expand == false) { + binding.txtDescriptionSport.maxLines = 100 + item.expand = true + } else { + binding.txtDescriptionSport.maxLines = 1 + item.expand = false + } + } + + } + + + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_edit_sport_yes, parent, false)//Создаем(надуваем) list_item + return Holder(view, listener_sport)//Через Holder возврощаем view + } + + override fun onBindViewHolder(holder: Holder, position: Int) { + val view = holder.bind(getItem(position))//Заполняем по позиции карточку + } + + + //Comparator - сравнивает старый список и новый и если что-то изменилось, то работает с конкретным изменением списке, а не весь список переписывает + class Comparator : DiffUtil.ItemCallback() { + override fun areItemsTheSame( + oldItem: EditSportModel, + newItem: EditSportModel + ): Boolean {//Тут лучше всего сравнивать по id//oldItem - элементы старого списка, newItem - элементы нового списка//Возврощает Boolean, тоесть есть изменения или нет + return oldItem.id == newItem.id//Сравниваем полностью весь список новы и старый, по очередно по одной карточке и по элементно, то есть нулевой элемент, первый, второй и т.д.. Но лучше сравнивать по id списки, а не просто весь список, так как это эфективнее, так как id уникальный(oldItem.id == newItem.id) + } + + override fun areContentsTheSame( + oldItem: EditSportModel, + newItem: EditSportModel + ): Boolean {//Утут нужно сравнивать весь спсок старых элементов и новых + return oldItem == newItem//Сравниваем полностью весь список новы и старый + } + } + + //Интерфейс нажатия на кнопку удалить товар из корзины + interface Listener { + fun onClickAppeals(item: EditSportModel) + } + + +} + + + + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/Edit/TabLayout/EditSportNoFragment.kt b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/TabLayout/EditSportNoFragment.kt new file mode 100644 index 0000000..d1dcadb --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/TabLayout/EditSportNoFragment.kt @@ -0,0 +1,172 @@ +package com.example.doctor.Patients.Reports.Edit.TabLayout + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.fragment.app.activityViewModels +import androidx.recyclerview.widget.GridLayoutManager +import com.example.doctor.DoctorViewModel +import com.example.doctor.Patients.Reports.Edit.EditSportYesAdapter +import com.example.doctor.Patients.Reports.Edit.EditSportModel +import com.example.doctor.Patients.Reports.Edit.EditSportNoAdapter +import com.example.doctor.Pref.ConclusionPref +import com.example.doctor.Retrofit.DoctorApi +import com.example.doctor.Toast.showCustomInfoToast +import com.example.doctor.databinding.FragmentEditSportNoBinding +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + + +class EditSportNoFragment : Fragment(),EditSportNoAdapter.Listener { + private lateinit var binding:FragmentEditSportNoBinding + lateinit var adapterNo: EditSportNoAdapter + private lateinit var doctorApi: DoctorApi + val prefDoctorConclusion = ConclusionPref() + private val model: DoctorViewModel by activityViewModels() + var id_patient = 0; + + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentEditSportNoBinding.inflate(layoutInflater,container,false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initRcViewDay() + model.EditSportListNo.observe(viewLifecycleOwner){ + adapterNo.submitList(it) + } + model.id_patient.observe(viewLifecycleOwner) {id-> + id_patient = id.toInt() + GetCoursesSportNo(id_patient) + } + } + + + //Инициализация списка + private fun initRcViewDay() = with(binding) { + rcViewEditSportNo.layoutManager = + GridLayoutManager(requireContext(), 1)//По вертикали будет выводить по умолчанию + adapterNo = EditSportNoAdapter(this@EditSportNoFragment) + rcViewEditSportNo.adapter = adapterNo + } + + //Инициализируем Retrofit + private fun initRetrofit() { + val interceptor = HttpLoggingInterceptor() + interceptor.level = HttpLoggingInterceptor.Level.BODY + + val client = OkHttpClient + .Builder() + .addInterceptor(interceptor) + .build() + + val retrofit = Retrofit.Builder() + .baseUrl("http://mobileapp.vmeda.org/api/") + .client(client) + .addConverterFactory(GsonConverterFactory.create()) + .build() + + doctorApi = retrofit.create(DoctorApi::class.java) + + } + + + //Получения списка пациентов + fun GetCoursesSportYes(id_patient:Int) { + initRetrofit() + val Tokens = prefDoctorConclusion.conclusionToken(requireContext()) + CoroutineScope(Dispatchers.IO).launch { + val sportEdit = doctorApi.GetCoursesSportYes("Bearer $Tokens", id_patient) + requireActivity().runOnUiThread { + + //Фиксируем полученные данные + val sportEditList = sportEdit.body() + + //Если нету ошибок + if (sportEditList != null) { + model.EditSportListYes.value = sportEditList.set_of_sports_exercises_yes + //adapterYes.submitList(sportEditList.set_of_sports_exercises_yes) + } + } + + } + } + //Получения списка пациентов + fun GetCoursesSportNo(id_patient:Int) { + initRetrofit() + val Tokens = prefDoctorConclusion.conclusionToken(requireContext()) + CoroutineScope(Dispatchers.IO).launch { + val sportEdit = doctorApi.GetCoursesSportNo("Bearer $Tokens", id_patient) + requireActivity().runOnUiThread { + + //Фиксируем полученные данные + val sportEditList = sportEdit.body() + + //Если нету ошибок + if (sportEditList != null) { + model.EditSportListNo.value = sportEditList.set_of_sports_exercises_no + //adapterNo.submitList(sportEditList.set_of_sports_exercises_no) + binding.txtNo.visibility = View.GONE + } + else{ + binding.txtNo.visibility = View.VISIBLE + + } + } + + } + } + + + //Получения списка пациентов + fun UpdateBlockSportTasksNo(id:Int) { + initRetrofit() + val Tokens = prefDoctorConclusion.conclusionToken(requireContext()) + CoroutineScope(Dispatchers.IO).launch { + val NoEdit = doctorApi.UpdateBlockSportTasksNo("Bearer $Tokens", id) + requireActivity().runOnUiThread { + + //Фиксируем полученные данные + val sportNoList= NoEdit.body() + + //Если нету ошибок + if (sportNoList != null) { + Toast(requireContext()).showCustomInfoToast(sportNoList.message, requireActivity()) + GetCoursesSportYes(id_patient) + GetCoursesSportNo(id_patient) + + } + else{ + if (sportNoList != null) { + Toast(requireContext()).showCustomInfoToast(sportNoList.message, requireActivity()) + } + } + } + } + } + + + companion object { + fun newInstance() = EditSportNoFragment() + } + + override fun onClickAppeals(item: EditSportModel) { + + UpdateBlockSportTasksNo(item.id) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/Edit/TabLayout/EditSportYesFragment.kt b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/TabLayout/EditSportYesFragment.kt new file mode 100644 index 0000000..356ff6c --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/TabLayout/EditSportYesFragment.kt @@ -0,0 +1,174 @@ +package com.example.doctor.Patients.Reports.Edit.TabLayout + +import android.os.Bundle +import android.util.Log +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.fragment.app.activityViewModels +import androidx.recyclerview.widget.GridLayoutManager +import com.example.doctor.DoctorViewModel +import com.example.doctor.Patients.Reports.Edit.EditSportYesAdapter +import com.example.doctor.Patients.Reports.Edit.EditSportModel +import com.example.doctor.Patients.Reports.Edit.EditSportNoAdapter +import com.example.doctor.Pref.ConclusionPref +import com.example.doctor.Retrofit.DoctorApi +import com.example.doctor.Toast.showCustomInfoToast +import com.example.doctor.databinding.FragmentEditSportYesBinding +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + + +class EditSportYesFragment : Fragment(), EditSportYesAdapter.Listener { + private lateinit var binding:FragmentEditSportYesBinding + lateinit var adapterYes: EditSportYesAdapter + private lateinit var doctorApi: DoctorApi + val prefDoctorConclusion = ConclusionPref() + private val model: DoctorViewModel by activityViewModels() + var id_patient = 0; + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentEditSportYesBinding.inflate(layoutInflater,container,false) + return binding.root + } + + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initRcViewDay() + + + model.id_patient.observe(viewLifecycleOwner) {id-> + id_patient = id.toInt() + Log.i("id_patient",id_patient.toString()) + Log.i("id",id.toString()) + GetCoursesSportYes(id_patient) + } + + model.EditSportListYes.observe(viewLifecycleOwner){ + adapterYes.submitList(it) + } + } + + + //Инициализация списка + private fun initRcViewDay() = with(binding) { + rcViewEditSportYes.layoutManager = + GridLayoutManager(requireContext(), 1)//По вертикали будет выводить по умолчанию + adapterYes = EditSportYesAdapter(this@EditSportYesFragment) + rcViewEditSportYes.adapter = adapterYes + } + + + + //Инициализируем Retrofit + private fun initRetrofit() { + val interceptor = HttpLoggingInterceptor() + interceptor.level = HttpLoggingInterceptor.Level.BODY + + val client = OkHttpClient + .Builder() + .addInterceptor(interceptor) + .build() + + val retrofit = Retrofit.Builder() + .baseUrl("http://mobileapp.vmeda.org/api/") + .client(client) + .addConverterFactory(GsonConverterFactory.create()) + .build() + + doctorApi = retrofit.create(DoctorApi::class.java) + + } + + //Получения списка пациентов + fun GetCoursesSportYes(id_patient:Int) { + initRetrofit() + val Tokens = prefDoctorConclusion.conclusionToken(requireContext()) + CoroutineScope(Dispatchers.IO).launch { + val sportEdit = doctorApi.GetCoursesSportYes("Bearer $Tokens", id_patient) + requireActivity().runOnUiThread { + + //Фиксируем полученные данные + val sportEditList = sportEdit.body() + + //Если нету ошибок + if (sportEditList != null) { + model.EditSportListYes.value = sportEditList.set_of_sports_exercises_yes + binding.txtYes.visibility = View.GONE + } + else{ + binding.txtYes.visibility = View.VISIBLE + } + } + + } + } + //Получения списка пациентов + fun GetCoursesSportNo(id_patient:Int) { + initRetrofit() + val Tokens = prefDoctorConclusion.conclusionToken(requireContext()) + CoroutineScope(Dispatchers.IO).launch { + val sportEdit = doctorApi.GetCoursesSportNo("Bearer $Tokens",id_patient) + requireActivity().runOnUiThread { + + //Фиксируем полученные данные + val sportEditList = sportEdit.body() + + //Если нету ошибок + if (sportEditList != null) { + model.EditSportListNo.value = sportEditList.set_of_sports_exercises_no + //adapterNo.submitList(sportEditList.set_of_sports_exercises_no) + } + } + + } + } + + + //Получения списка пациентов + fun UpdateBlockSportTasksYes(id_pateint:Int,id_sports_tasks:Int) { + initRetrofit() + val Tokens = prefDoctorConclusion.conclusionToken(requireContext()) + CoroutineScope(Dispatchers.IO).launch { + val sportEdit = doctorApi.UpdateBlockSportTasksYes("Bearer $Tokens", id_pateint,id_sports_tasks) + requireActivity().runOnUiThread { + + //Фиксируем полученные данные + val sportEditList = sportEdit.body() + + //Если нету ошибок + if (sportEditList != null) { + Toast(requireContext()).showCustomInfoToast(sportEditList.message, requireActivity()) + GetCoursesSportYes(id_patient) + GetCoursesSportNo(id_patient) + } + else{ + if (sportEditList != null) { + Toast(requireContext()).showCustomInfoToast(sportEditList.message, requireActivity()) + } + } + } + } + } + + + companion object { + fun newInstance() = EditSportYesFragment() + } + + override fun onClickAppeals(item: EditSportModel) { + UpdateBlockSportTasksYes(id_patient, item.id) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/Edit/UpdateSportTaskNoModel.kt b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/UpdateSportTaskNoModel.kt new file mode 100644 index 0000000..40206c0 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/UpdateSportTaskNoModel.kt @@ -0,0 +1,6 @@ +package com.example.doctor.Patients.Reports.Edit + +data class UpdateSportTaskNoModel( + val id: Int, +) + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/Edit/UpdateSportTaskYesModel.kt b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/UpdateSportTaskYesModel.kt new file mode 100644 index 0000000..4750ab6 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/Edit/UpdateSportTaskYesModel.kt @@ -0,0 +1,7 @@ +package com.example.doctor.Patients.Reports.Edit + +data class UpdateSportTaskYesModel( + val id_sport_patient: Int, + val id_sports_tasks: Int, + ) + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/PatientFragment.kt b/app/src/main/java/com/example/doctor/Patients/Reports/PatientFragment.kt new file mode 100644 index 0000000..ad66fb0 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/PatientFragment.kt @@ -0,0 +1,473 @@ +package com.example.doctor.Patients.Reports + +import android.graphics.Color +import android.os.Bundle +import android.util.Log +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.Menu +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.appcompat.widget.PopupMenu +import androidx.fragment.app.activityViewModels +import androidx.recyclerview.widget.GridLayoutManager +import com.example.doctor.DoctorViewModel +import com.example.doctor.Patients.PatientsListFragment +import com.example.doctor.Patients.Reports.Edit.EditSportFragment +import com.example.doctor.Pref.ConclusionPref +import com.example.doctor.Retrofit.DoctorApi +import com.example.doctor.Toast.showCustomInfoToast +import com.example.doctor.databinding.FragmentPatientsBinding +import com.example.doctor.databinding.ItemQuestionnaireAfterBinding +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import java.time.LocalDate + + +class PatientFragment : Fragment(),CoursesAdapter.Listener { + private lateinit var binding: FragmentPatientsBinding + private val model: DoctorViewModel by activityViewModels() + lateinit var adapter: QBBAdapter + lateinit var adapterCours: CoursesAdapter + private lateinit var doctorApi: DoctorApi + val prefDoctorConclusion = ConclusionPref() + var id: Int? = null + var block = "" + var pause = "" + var id_sport = "" + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentPatientsBinding.inflate(layoutInflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + initRcViewDay() + initRcViewCours() + + model.qbaList.observe(viewLifecycleOwner) {//viewLifecycleOwner - следит за циклом жизни fragment + adapter.submitList(it)//Напрямую переадем созданный список в adapter(ProductAdapter) + } + + model.SportCoursList.observe(viewLifecycleOwner) {//viewLifecycleOwner - следит за циклом жизни fragment + adapterCours.submitList(it)//Напрямую переадем созданный список в adapter(ProductAdapter) + } + + binding.btnExit.setOnClickListener { + //Вывод фрагмента на активити при первоначальной загрузке + activity?.supportFragmentManager?.beginTransaction() + ?.replace( + com.example.doctor.R.id.CLMainFragment, + PatientsListFragment.newInstance() + ) + ?.commit() + } + + popMenu() + + model.patientCurrent.observe(viewLifecycleOwner) { + binding.txtLogin.text = it.login + id = it.id + model.id_patient.value = id + block = it.block.toString() + pause = it.pause.toString() + id_sport = it.id_sport_patient.toString() + //Проверка даты, так как если дата уже прошла, то должно выводится что блока нету + if(block == "null"){ + block(block) + } + else{ + if(LocalDate.parse(block)(Comparator()) { + + class Holder(view: View) : + RecyclerView.ViewHolder(view) { + + val binding = ItemQuestionnaireAfterBinding.bind(view) + + @SuppressLint("SuspiciousIndentation") + fun bind(item: QAModel) = with(binding) { + +// if (item.one == 1) { +// txtB1.text = "Да" +// } else { +// txtB1.text = "Нет" +// } +// txtA1.text = item.one.toString() +// +// if (item.two == 2) { +// txtA2.text = "Да" +// } else { +// txtA2.text = "Нет" +// } +// +// if (item.three == 3) { +// txtA3.text = "Да" +// } else { +// txtA3.text = "Нет" +// } +// +// if (item.four == 4) { +// txtA4.text = "Да" +// } else { +// txtA4.text = "Нет" +// } +// +// if (item.five == 5) { +// txtA5.text = "Да" +// } else { +// txtA5.text = "Нет" +// } +// +// if (item.six == 6) { +// txtA6.text = "Да" +// } else { +// txtA6.text = "Нет" +// } +// +// if (item.seven == 7) { +// txtA7.text = "Да" +// } else { +// txtA7.text = "Нет" +// } +// +// if (item.eight == 8) { +// txtA8.text = "Да" +// } else { +// txtA8.text = "Нет" +// } +// +// if (item.nine == 9) { +// txtA9.text = "Да" +// } else { +// txtA9.text = "Нет" +// } +// +// if (item.ten == 10) { +// txtA10.text = "Да" +// } else { +// txtA10.text = "Нет" +// } +// +// if (item.eleven == 11) { +// txtA11.text = "Да" +// } else { +// txtA11.text = "Нет" +// } +// +// if (item.twelve == 12) { +// txtA12.text = "Да" +// } else { +// txtA12.text = "Нет" +// } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_questionnaire_after, parent, false) + return Holder(view) + } + + override fun onBindViewHolder(holder: Holder, position: Int) { + val view = holder.bind(getItem(position)) + } + + class Comparator : DiffUtil.ItemCallback() { + override fun areItemsTheSame( + oldItem: QAModel, + newItem: QAModel + ): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame( + oldItem: QAModel, + newItem: QAModel + ): Boolean { + return oldItem == newItem + } + } + +} + + + + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/QAModel.kt b/app/src/main/java/com/example/doctor/Patients/Reports/QAModel.kt new file mode 100644 index 0000000..ad94cf1 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/QAModel.kt @@ -0,0 +1,19 @@ +package com.example.doctor.Patients.Reports + +data class QAModel( + val id: Int, + val status: String, + val one: Int, + val two: Int, + val three: Int, + val four: Int, + val five: Int, + val six: Int, + val seven: Int, + val eight: Int, + val nine: Int, + val ten: Int, + val eleven: Int, + val twelve: Int, + ) + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/QBAListModel.kt b/app/src/main/java/com/example/doctor/Patients/Reports/QBAListModel.kt new file mode 100644 index 0000000..919c9c6 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/QBAListModel.kt @@ -0,0 +1,6 @@ +package com.example.doctor.Patients.Reports + +data class QBAListModel( + val questionnaire: List +) + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/QBAModel.kt b/app/src/main/java/com/example/doctor/Patients/Reports/QBAModel.kt new file mode 100644 index 0000000..ca522c7 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/QBAModel.kt @@ -0,0 +1,35 @@ +package com.example.doctor.Patients.Reports + +data class QBAModel( + val id: Int, + + val date: String, + + val idb: Int, + //val statusb: Int, + val oneb: Int, + val twob: Int, + val threeb: Int, + val fourb: Int, + val fiveb: Int, + val sixb: Int, + val sevenb: Int, + val eightb: Int, + val nineb: Int, + + val ida: Int, + //val statusa: Int, + val onea: Int, + val twoa: Int, + val threea: Int, + val foura: Int, + val fivea: Int, + val sixa: Int, + val sevena: Int, + val eighta: Int, + val ninea: Int, + val tena: Int, + val elevena: Int, + val twelvea: Int, + ) + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/QBAdapter.kt b/app/src/main/java/com/example/doctor/Patients/Reports/QBAdapter.kt new file mode 100644 index 0000000..d6c33ca --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/QBAdapter.kt @@ -0,0 +1,112 @@ +package com.example.doctor.Patients.Reports + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.example.doctor.R +import com.example.doctor.databinding.ItemQuestionnaireBeforeBinding + + +class QBAdapter() : ListAdapter(Comparator()) { + class Holder(view: View) : + RecyclerView.ViewHolder(view) { + + val binding = ItemQuestionnaireBeforeBinding.bind(view) + + + @SuppressLint("SuspiciousIndentation") + fun bind(item: QBModel) = with(binding) { +// if (item.one == 1) { +// txtB1.text = "Да" +// } else { +// txtB1.text = "Нет" +// } + + + +// txtB1.text = item.one.toString() +// +// if (item.two == 2) { +// txtB2.text = "Да" +// } else { +// txtB2.text = "Нет" +// } +// +// if (item.three == 3) { +// txtB3.text = "Да" +// } else { +// txtB3.text = "Нет" +// } +// +// if (item.four == 4) { +// txtB4.text = "Да" +// } else { +// txtB4.text = "Нет" +// } +// +// if (item.five == 5) { +// txtB5.text = "Да" +// } else { +// txtB5.text = "Нет" +// } +// +// if (item.six == 6) { +// txtB6.text = "Да" +// } else { +// txtB6.text = "Нет" +// } +// +// if (item.seven == 7) { +// txtB7.text = "Да" +// } else { +// txtB7.text = "Нет" +// } +// +// if (item.eight == 8) { +// txtB8.text = "Да" +// } else { +// txtB8.text = "Нет" +// } +// +// if (item.nine == 9) { +// txtB9.text = "Да" +// } else { +// txtB9.text = "Нет" +// } +// + } + + + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_questionnaire_before, parent, false) + return Holder(view) + } + + override fun onBindViewHolder(holder: Holder, position: Int) { + val view = holder.bind(getItem(position)) + } + + class Comparator : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: QBModel, newItem: QBModel): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame(oldItem: QBModel, newItem: QBModel): Boolean { + return oldItem == newItem + } + } + + + +} + + + + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/QBBAdapter.kt b/app/src/main/java/com/example/doctor/Patients/Reports/QBBAdapter.kt new file mode 100644 index 0000000..dba6de7 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/QBBAdapter.kt @@ -0,0 +1,266 @@ +package com.example.doctor.Patients.Reports + +import android.annotation.SuppressLint +import android.graphics.Color +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.ListAdapter +import androidx.recyclerview.widget.RecyclerView +import com.example.doctor.R +import com.example.doctor.databinding.ItemQbaBinding + + +class QBBAdapter() : ListAdapter(Comparator()) { + class Holder(view: View) : + RecyclerView.ViewHolder(view) { + + val binding = ItemQbaBinding.bind(view) + + + @SuppressLint("SuspiciousIndentation") + fun bind(item: QBAModel) = with(binding) { +// if (item.one == 1) { +// txtB1.text = "Да" +// } else { +// txtB1.text = "Нет" +// } + + txtDate.text = item.date + if(item.oneb >= 6){ + txtStatusB.text = "Плохо" + CVB.setCardBackgroundColor(Color.parseColor("#DA8383")) + } + + else if(item.fourb == 1 || item.fiveb == 1 ||item.sixb == 1 ||item.sevenb == 1 ||item.nineb == 1){ + txtStatusB.text = "Средне" + CVB.setCardBackgroundColor(Color.parseColor("#DABA83")) + } + else{ + txtStatusB.text = "Хорошо" + CVB.setCardBackgroundColor(Color.parseColor("#ABDA83")) + } + + if(item.ninea == 1){ + txtStatusA.text = "Плохо" + CVA.setCardBackgroundColor(Color.parseColor("#DA8383")) + } + else if(item.onea >= 6 || item.threea == 1 ||item.sixa == 1 ||item.eighta == 1 ||item.elevena == 1){ + txtStatusA.text = "Средне" + CVA.setCardBackgroundColor(Color.parseColor("#DABA83")) + } + else{ + txtStatusA.text= "Хорошо" + CVA.setCardBackgroundColor(Color.parseColor("#ABDA83")) + } + + txtB1.text = item.oneb.toString() + if(item.oneb==0){ + CLQB1.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + else if(item.oneb in 1..5){ + CLQB1.setBackgroundColor(Color.parseColor("#C6DFD386")) + } + else{ + CLQB1.setBackgroundColor(Color.parseColor("#C6DF8686")) + } + + //Красный - "#C6DF8686" + //Зеленый - "#C686DF8F" + //Желтый - "#C6DFD386" + if (item.twob == 1) { + txtB2.text = "Да" + CLQB2.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtB2.text = "Нет" + CLQB2.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.threeb == 1) { + txtB3.text = "Да" + CLQB3.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtB3.text = "Нет" + CLQB3.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.fourb == 1) { + txtB4.text = "Да" + CLQB4.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtB4.text = "Нет" + CLQB4.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.fiveb == 1) { + txtB5.text = "Да" + CLQB5.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtB5.text = "Нет" + CLQB5.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.sixb == 1) { + txtB6.text = "Да" + CLQB6.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtB6.text = "Нет" + CLQB6.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.sevenb == 1) { + txtB7.text = "Да" + CLQB7.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtB7.text = "Нет" + CLQB7.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.eightb == 1) { + txtB8.text = "Да" + CLQB8.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtB8.text = "Нет" + CLQB8.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.nineb == 1) { + txtB9.text = "Да" + CLQB9.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtB9.text = "Нет" + CLQB9.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + + txtA1.text = item.onea.toString() + if(item.onea==0){ + CLQA1.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + else if(item.onea in 1..5){ + CLQA1.setBackgroundColor(Color.parseColor("#C6DFD386")) + } + else{ + CLQA1.setBackgroundColor(Color.parseColor("#C6DF8686")) + } + + if (item.twoa == 1) { + txtA2.text = "Да" + CLQA2.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtA2.text = "Нет" + CLQA2.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.threea == 1) { + txtA3.text = "Да" + CLQA3.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtA3.text = "Нет" + CLQA3.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.foura == 1) { + txtA4.text = "Да" + CLQA4.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtA4.text = "Нет" + CLQA4.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.fivea == 1) { + txtA5.text = "Да" + CLQA5.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtA5.text = "Нет" + CLQA5.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.sixa == 1) { + txtA6.text = "Да" + CLQA6.setBackgroundColor(Color.parseColor("#C6DF8686")) + + } else { + txtA6.text = "Нет" + CLQA6.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.sevena == 1) { + txtA7.text = "Да" + CLQA7.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtA7.text = "Нет" + CLQA7.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.eighta == 1) { + txtA8.text = "Да" + CLQA8.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtA8.text = "Нет" + CLQA8.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.ninea == 1) { + txtA9.text = "Да" + CLQA9.setBackgroundColor(Color.parseColor("#C6DF8686")) + + } else { + txtA9.text = "Нет" + CLQA9.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.tena == 1) { + txtA10.text = "Да" + CLQA10.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtA10.text = "Нет" + CLQA10.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.elevena == 1) { + txtA11.text = "Да" + CLQA11.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtA11.text = "Нет" + CLQA11.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + + if (item.twelvea == 1) { + txtA12.text = "Да" + CLQA12.setBackgroundColor(Color.parseColor("#C6DF8686")) + } else { + txtA12.text = "Нет" + CLQA12.setBackgroundColor(Color.parseColor("#C686DF8F")) + } + } + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_qba, parent, false) + return Holder(view) + } + + override fun onBindViewHolder(holder: Holder, position: Int) { + val view = holder.bind(getItem(position)) + } + + class Comparator : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: QBAModel, newItem: QBAModel): Boolean { + return oldItem.id == newItem.id + } + + override fun areContentsTheSame(oldItem: QBAModel, newItem: QBAModel): Boolean { + return oldItem == newItem + } + } + + + +} + + + + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/QBModel.kt b/app/src/main/java/com/example/doctor/Patients/Reports/QBModel.kt new file mode 100644 index 0000000..224924c --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/QBModel.kt @@ -0,0 +1,16 @@ +package com.example.doctor.Patients.Reports + +data class QBModel( + val id: Int, + val status: String, + val one: Int, + val two: Int, + val three: Int, + val four: Int, + val five: Int, + val six: Int, + val seven: Int, + val eight: Int, + val nine: Int, + ) + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/Requests/ClearSportPatientModel.kt b/app/src/main/java/com/example/doctor/Patients/Reports/Requests/ClearSportPatientModel.kt new file mode 100644 index 0000000..535047b --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/Requests/ClearSportPatientModel.kt @@ -0,0 +1,6 @@ +package com.example.doctor.Patients.Reports.Requests + +data class ClearSportPatientModel( + val message: String, + ) + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/SportCoursListModel.kt b/app/src/main/java/com/example/doctor/Patients/Reports/SportCoursListModel.kt new file mode 100644 index 0000000..6e1c7c3 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/SportCoursListModel.kt @@ -0,0 +1,6 @@ +package com.example.doctor.Patients.Reports + +data class SportCoursListModel( + val courses: List + ) + diff --git a/app/src/main/java/com/example/doctor/Patients/Reports/SportCoursModel.kt b/app/src/main/java/com/example/doctor/Patients/Reports/SportCoursModel.kt new file mode 100644 index 0000000..3f5c927 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Patients/Reports/SportCoursModel.kt @@ -0,0 +1,11 @@ +package com.example.doctor.Patients.Reports + +data class SportCoursModel( + val id: Int, + val name: String, + val description: String, + val visibility: Int, + val created_at: String, + val updated_at: String, + ) + diff --git a/app/src/main/java/com/example/doctor/Pref/ClearPref.kt b/app/src/main/java/com/example/doctor/Pref/ClearPref.kt new file mode 100644 index 0000000..54ca6ef --- /dev/null +++ b/app/src/main/java/com/example/doctor/Pref/ClearPref.kt @@ -0,0 +1,14 @@ +package com.example.doctor.Pref + +import android.content.Context +import android.content.SharedPreferences + +class ClearPref() { + + fun clearToken(context: Context) { + val prefDoctor: SharedPreferences = context.getSharedPreferences("DOCTOR", Context.MODE_PRIVATE) + val edit = prefDoctor.edit() + edit?.clear() + edit?.apply() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Pref/ConclusionPref.kt b/app/src/main/java/com/example/doctor/Pref/ConclusionPref.kt new file mode 100644 index 0000000..cd2a344 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Pref/ConclusionPref.kt @@ -0,0 +1,13 @@ +package com.example.doctor.Pref + +import android.content.Context +import android.content.SharedPreferences + +class ConclusionPref() { + + fun conclusionToken(context: Context):String { + val prefDoctor: SharedPreferences = context.getSharedPreferences("DOCTOR", Context.MODE_PRIVATE) + val token = prefDoctor.getString("token", "") + return token.toString() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Pref/SavePref.kt b/app/src/main/java/com/example/doctor/Pref/SavePref.kt new file mode 100644 index 0000000..b7cbf07 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Pref/SavePref.kt @@ -0,0 +1,15 @@ +package com.example.doctor.Pref + +import android.content.Context +import android.content.SharedPreferences + +class SavePref (){ + + + fun saveToken(context: Context,token: String) { + val prefDoctor: SharedPreferences = context.getSharedPreferences("DOCTOR", Context.MODE_PRIVATE) + val edit = prefDoctor.edit() + prefDoctor.edit().putString("token", token).apply() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Retrofit/DoctorApi.kt b/app/src/main/java/com/example/doctor/Retrofit/DoctorApi.kt new file mode 100644 index 0000000..0ecc9d2 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Retrofit/DoctorApi.kt @@ -0,0 +1,136 @@ +package com.example.doctor.Retrofit + +import com.example.doctor.Auth.Model.AuthModel +import com.example.doctor.Auth.Model.CheckTokenModel +import com.example.doctor.Auth.Model.UserModel +import com.example.doctor.Patients.Model.MessageModel +import com.example.doctor.Patients.Model.CreatePatientModel +import com.example.doctor.Patients.Model.PatientAllListModel +import com.example.doctor.Patients.Model.PatientAllModel +import com.example.doctor.Patients.Model.PatientModel +import com.example.doctor.Patients.Model.PauseModel +import com.example.doctor.Patients.Reports.Edit.EditSportListNoModel +import com.example.doctor.Patients.Reports.Edit.EditSportListYesModel +import com.example.doctor.Patients.Reports.Edit.UpdateSportTaskNoModel +import com.example.doctor.Patients.Reports.Edit.UpdateSportTaskYesModel +import com.example.doctor.Patients.Reports.QBAListModel +import com.example.doctor.Patients.Reports.Requests.ClearSportPatientModel +import com.example.doctor.Patients.Reports.SportCoursListModel +import com.example.doctor.Sport.AddSportPatientModel +import retrofit2.Response +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.Headers +import retrofit2.http.POST +import retrofit2.http.PUT +import retrofit2.http.Query + +interface DoctorApi { + + //Проверка токена + @Headers("Content-Type: application/json") + @GET("CheckTokenDoctor") + suspend fun CheckToken(@Header("Authorization") token:String): Response + + //Выход из аккаунта + @Headers("Content-Type: application/json") + @POST("LoginDoctor") + suspend fun LoginDoctor(@Body authModel: AuthModel): Response + + //Выход из аккаунта + @Headers("Content-Type: application/json") + @POST("LogoutDoctor") + suspend fun LogoutDoctor(@Header("Authorization") token:String):Response + + + //Вывод всех пациентов + @Headers("Content-Type: application/json") + @GET("GetPatientAll") + suspend fun GetPatientAll(@Header("Authorization") token:String):Response + + //Вывод всех пациентов + @Headers("Content-Type: application/json") + @GET("GetPatientID") + suspend fun GetPatientID(@Header("Authorization") token:String):Response + + //Поиск пациентов + @Headers("Content-Type: application/json") + @GET("GetPatientSearch") + suspend fun GetPatientSearch(@Header("Authorization") token:String,@Query("login") login:String):PatientModel + + //Вывод всех курсов + @Headers("Content-Type: application/json") + @GET("GetCoursAll") + suspend fun GetCoursAll(@Header("Authorization") token:String):Response + //Вывод всех курсов + @Headers("Content-Type: application/json") + @GET("GetCoursAllPatient") + suspend fun GetCoursAllPatient(@Header("Authorization") token:String,@Query("id") id:Int):Response + + //Вывод анкеты пациентов которые сейчас действуют + @Headers("Content-Type: application/json") + @GET("GetPatientBAQiestionar") + suspend fun GetPatientBAQiestionar(@Header("Authorization") token:String,@Query("id") id:Int):Response + + //Создание аккаунта + @Headers("Content-Type: application/json") + @POST("CreateAccountPatient") + suspend fun CreateAccountPatient(@Header("Authorization") token:String,@Body createPatientModel: CreatePatientModel):Response + + //Обновление данных пользователя + @Headers("Content-Type: application/json") + @PUT("UpdateAccountPatient") + suspend fun UpdateAccountPatient(@Header("Authorization") token:String,@Query("id") id:String, @Query("login") login:String,@Query("password") password:String) + + //Добавление блокировки + @Headers("Content-Type: application/json") + @PUT("UpdateBlockAccountPatient") + suspend fun UpdateBlockAccountPatient(@Header("Authorization") token:String,@Query("id") id:Int):Response + + //Добавление паузы + @Headers("Content-Type: application/json") + @PUT("UpdatePauseAccountPatient") + suspend fun UpdatePauseAccountPatient(@Header("Authorization") token:String,@Query("id") id:Int):Response + + //Получения курса пациента в зависимости от того сколько дней пройдено + @Headers("Content-Type: application/json") + @GET("GetCours") + suspend fun GetCours(@Header("Authorization") token:String,@Query("name") name:String,@Query("day") day:String) + + //Добавление курса пациенту + @Headers("Content-Type: application/json") + @POST("AddSportPatient") + suspend fun AddSportPatient(@Header("Authorization") token:String,@Body addSportPatientModel: AddSportPatientModel) + + //Очистка курса у пациента + @Headers("Content-Type: application/json") + @PUT("ClearPatientSport") + suspend fun ClearPatientSport(@Header("Authorization") token:String,@Query("id_patient") id_patient:Int):Response + + + //Вывод всех курсов + @Headers("Content-Type: application/json") + @GET("GetCoursesSport") + suspend fun GetCoursesSport(@Header("Authorization") token:String,@Query("id_patient") id_patient:Int,@Query("id_sports_courses_patient") id_sports_courses_patient:Int):Response + + //Вывод всех включенных упражненйи + @Headers("Content-Type: application/json") + @GET("GetCoursesSportYes") + suspend fun GetCoursesSportYes(@Header("Authorization") token:String,@Query("id_patient") id_patient:Int):Response + + //Вывод всех отключенных упражнений + @Headers("Content-Type: application/json") + @GET("GetCoursesSportNo") + suspend fun GetCoursesSportNo(@Header("Authorization") token:String,@Query("id_patient") id_patient:Int):Response + + //Отключенных упражнений + @Headers("Content-Type: application/json") + @PUT("UpdateBlockSportTasksYes") + suspend fun UpdateBlockSportTasksYes(@Header("Authorization") token:String,@Query("id_patient") id_patient:Int,@Query("id_sports_tasks") id_sports_tasks:Int):Response + //Отключенных упражнений + @Headers("Content-Type: application/json") + @PUT("UpdateBlockSportTasksNo") + suspend fun UpdateBlockSportTasksNo(@Header("Authorization") token:String,@Query("id") id:Int,):Response + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Setting/SettingFragment.kt b/app/src/main/java/com/example/doctor/Setting/SettingFragment.kt new file mode 100644 index 0000000..7bd8131 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Setting/SettingFragment.kt @@ -0,0 +1,135 @@ +package com.example.doctor.Setting + +import android.content.Context +import android.content.Intent +import android.content.SharedPreferences +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.appcompat.app.AlertDialog +import com.example.doctor.Auth.AuthActivity +import com.example.doctor.Auth.AuthFragment +import com.example.doctor.Patients.Reports.PatientFragment +import com.example.doctor.Pref.ClearPref +import com.example.doctor.Pref.ConclusionPref +import com.example.doctor.Pref.SavePref +import com.example.doctor.R +import com.example.doctor.Retrofit.DoctorApi +import com.example.doctor.Toast.showCustomInfoToast +import com.example.doctor.databinding.FragmentSettingBinding +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +class SettingFragment : Fragment() { + private lateinit var binding:FragmentSettingBinding + + private var Token = "" + val prefDoctorClear= ClearPref() + private lateinit var doctorApi: DoctorApi + val prefDoctorConclusion = ConclusionPref() + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentSettingBinding.inflate(layoutInflater,container,false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + + button() + } + + private fun button() = with(binding) { + btnLogout.setOnClickListener{ + + createAlеrtDialogExitAuth() + } + + btnYourData.setOnClickListener{ + activity?.supportFragmentManager?.beginTransaction() + ?.replace(com.example.doctor.R.id.CLMainFragment, YourDataFragment.newInstance()) + ?.commit() + } + + + + } + + + //Диалоговое окно + private fun createAlеrtDialogExitAuth() { + val builder = AlertDialog.Builder(requireContext()) + builder.setTitle("Выход") + builder.setMessage("Вы уверены что хотите выйти из аккаунта") + builder.setNegativeButton("Назад") { dialogInterface, i -> + + } + builder.setPositiveButton("Подтвердить") { dialogInterface, i -> + + Logout() + + } + builder.show() + } + + //Получения списка пациентов + fun Logout() { + initRetrofit() + val Tokens = prefDoctorConclusion.conclusionToken(requireContext()) + CoroutineScope(Dispatchers.IO).launch { + val listProduct = doctorApi.LogoutDoctor("Bearer $Tokens") + + activity?.runOnUiThread { + + //Фиксируем полученные данные + val visibleviewList = listProduct.body() + val visibleviewListCode = listProduct.isSuccessful() + //Если нету ошибок + if (visibleviewListCode) { + Toast(requireContext()).showCustomInfoToast(visibleviewList?.message.toString(), requireActivity()) + prefDoctorClear.clearToken(requireContext()) + activity?.supportFragmentManager?.beginTransaction() + ?.replace(R.id.CLMain, AuthFragment.newInstance()) + ?.commit() + + + } + } + } + } + //Инициализируем Retrofit + private fun initRetrofit() { + val interceptor = HttpLoggingInterceptor() + interceptor.level = HttpLoggingInterceptor.Level.BODY + + val client = OkHttpClient + .Builder() + .addInterceptor(interceptor) + .build() + + val retrofit = Retrofit.Builder() + .baseUrl("http://mobileapp.vmeda.org/api/") + .client(client) + .addConverterFactory(GsonConverterFactory.create()) + .build() + + doctorApi = retrofit.create(DoctorApi::class.java) + + } + + companion object { + fun newInstance() = SettingFragment() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Setting/YourDataFragment.kt b/app/src/main/java/com/example/doctor/Setting/YourDataFragment.kt new file mode 100644 index 0000000..8651804 --- /dev/null +++ b/app/src/main/java/com/example/doctor/Setting/YourDataFragment.kt @@ -0,0 +1,44 @@ +package com.example.doctor.Setting + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.doctor.R +import com.example.doctor.databinding.FragmentYourDataBinding + + +class YourDataFragment : Fragment() { + private lateinit var binding:FragmentYourDataBinding + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentYourDataBinding.inflate(layoutInflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + button() + } + + private fun button()= with(binding) { + btnExitYorData.setOnClickListener{ + activity?.supportFragmentManager?.beginTransaction() + ?.replace(R.id.CLMainFragment, SettingFragment.newInstance()) + ?.commit() + } + + } + + companion object { + fun newInstance() = YourDataFragment() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/doctor/Sport/AddSportPatientModel.kt b/app/src/main/java/com/example/doctor/Sport/AddSportPatientModel.kt new file mode 100644 index 0000000..02190aa --- /dev/null +++ b/app/src/main/java/com/example/doctor/Sport/AddSportPatientModel.kt @@ -0,0 +1,8 @@ +package com.example.doctor.Sport + +data class AddSportPatientModel( + val id_patient: Int, + val id_course: Int, + val all_day: Int, +) + diff --git a/app/src/main/java/com/example/doctor/Toast/WrapToast.kt b/app/src/main/java/com/example/doctor/Toast/WrapToast.kt new file mode 100644 index 0000000..e77ae1d --- /dev/null +++ b/app/src/main/java/com/example/doctor/Toast/WrapToast.kt @@ -0,0 +1,103 @@ +package com.example.doctor.Toast + +import android.app.Activity +import android.view.Gravity +import android.widget.TextView +import android.widget.Toast +import com.example.doctor.R + + +fun Toast.showCustomToast(message: String, activity: Activity) +{ + + val layout = activity.layoutInflater.inflate ( + R.layout.custom_toast_layout, + activity.findViewById(R.id.toast_container) + ) + + + // set the text of the TextView of the message + val textView = layout.findViewById(R.id.toast_text) + //Передача текста который мы введем + textView.text = message + + //Если добавить кнопку то можно сделать некую функцию, к примеру при добавление товара в корзину, можно сверху выводить перейти в корзину и по нажатию мы переходим в корзину + /* textView.setOnClickListener{ + setToolbarTitle.perehods() + Log.d("dsfsd","111111111111111111111111111") + }*/ + // use the application extension function + this.apply { + //setGravity(Gravity.BOTTOM, 0, 40) + duration = Toast.LENGTH_SHORT + view = layout.rootView + show() + } + + +} fun Toast.showCustomDangerToast(message: String, activity: Activity) +{ + val layout = activity.layoutInflater.inflate ( + R.layout.custom_toast_layout_danger, + activity.findViewById(R.id.toast_container) + ) + + // set the text of the TextView of the message + val textView = layout.findViewById(R.id.toast_text) + //Передача текста который мы введем + textView.text = message + + //Если добавить кнопку то можно сделать некую функцию, к примеру при добавление товара в корзину, можно сверху выводить перейти в корзину и по нажатию мы переходим в корзину + + // use the application extension function + this.apply { + setGravity(Gravity.BOTTOM, 0, 40) + duration = Toast.LENGTH_SHORT + view = layout.rootView + show() + } +} + +fun Toast.showCustomInfoToast(message: String, activity: Activity) { + val layout = activity.layoutInflater.inflate( + R.layout.custom_toast_layout_info, + activity.findViewById(R.id.toast_container) + ) + + // set the text of the TextView of the message + val textView = layout.findViewById(R.id.toast_text) + //Передача текста который мы введем + textView.text = message + + //Если добавить кнопку то можно сделать некую функцию, к примеру при добавление товара в корзину, можно сверху выводить перейти в корзину и по нажатию мы переходим в корзину + + // use the application extension function + this.apply { + setGravity(Gravity.BOTTOM, 0, 40) + duration = Toast.LENGTH_SHORT + view = layout.rootView + show() + } +} + +fun Toast.showCustomNiceToast(message: String, activity: Activity) { + val layout = activity.layoutInflater.inflate( + R.layout.custom_toast_layout_nice, + activity.findViewById(R.id.toast_container) + ) + + // set the text of the TextView of the message + val textView = layout.findViewById(R.id.toast_text) + //Передача текста который мы введем + textView.text = message + + //Если добавить кнопку то можно сделать некую функцию, к примеру при добавление товара в корзину, можно сверху выводить перейти в корзину и по нажатию мы переходим в корзину + + // use the application extension function + this.apply { + setGravity(Gravity.BOTTOM, 0, 40) + duration = Toast.LENGTH_SHORT + view = layout.rootView + show() + } +} \ No newline at end of file diff --git a/app/src/main/res/color/bnv_tab_item_foreground.xml b/app/src/main/res/color/bnv_tab_item_foreground.xml new file mode 100644 index 0000000..4c5d3f0 --- /dev/null +++ b/app/src/main/res/color/bnv_tab_item_foreground.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/add_patient_1.png b/app/src/main/res/drawable/add_patient_1.png new file mode 100644 index 0000000..b9429e1 Binary files /dev/null and b/app/src/main/res/drawable/add_patient_1.png differ diff --git a/app/src/main/res/drawable/add_patient_2.png b/app/src/main/res/drawable/add_patient_2.png new file mode 100644 index 0000000..81b3fd0 Binary files /dev/null and b/app/src/main/res/drawable/add_patient_2.png differ diff --git a/app/src/main/res/drawable/angle_right.png b/app/src/main/res/drawable/angle_right.png new file mode 100644 index 0000000..611eda6 Binary files /dev/null and b/app/src/main/res/drawable/angle_right.png differ diff --git a/app/src/main/res/drawable/appeals.png b/app/src/main/res/drawable/appeals.png new file mode 100644 index 0000000..dac2ecc Binary files /dev/null and b/app/src/main/res/drawable/appeals.png differ diff --git a/app/src/main/res/drawable/arrow_24.xml b/app/src/main/res/drawable/arrow_24.xml new file mode 100644 index 0000000..8452791 --- /dev/null +++ b/app/src/main/res/drawable/arrow_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/arrow_right.png b/app/src/main/res/drawable/arrow_right.png new file mode 100644 index 0000000..1f6eb56 Binary files /dev/null and b/app/src/main/res/drawable/arrow_right.png differ diff --git a/app/src/main/res/drawable/check.png b/app/src/main/res/drawable/check.png new file mode 100644 index 0000000..ede32da Binary files /dev/null and b/app/src/main/res/drawable/check.png differ diff --git a/app/src/main/res/drawable/close.png b/app/src/main/res/drawable/close.png new file mode 100644 index 0000000..ff3cb9c Binary files /dev/null and b/app/src/main/res/drawable/close.png differ diff --git a/app/src/main/res/drawable/close_24.xml b/app/src/main/res/drawable/close_24.xml new file mode 100644 index 0000000..844b6b6 --- /dev/null +++ b/app/src/main/res/drawable/close_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/door.png b/app/src/main/res/drawable/door.png new file mode 100644 index 0000000..efa0134 Binary files /dev/null and b/app/src/main/res/drawable/door.png differ diff --git a/app/src/main/res/drawable/door2.png b/app/src/main/res/drawable/door2.png new file mode 100644 index 0000000..6dfac0a Binary files /dev/null and b/app/src/main/res/drawable/door2.png differ diff --git a/app/src/main/res/drawable/eye_no.png b/app/src/main/res/drawable/eye_no.png new file mode 100644 index 0000000..62dc80a Binary files /dev/null and b/app/src/main/res/drawable/eye_no.png differ diff --git a/app/src/main/res/drawable/eye_yes.png b/app/src/main/res/drawable/eye_yes.png new file mode 100644 index 0000000..59c30d9 Binary files /dev/null and b/app/src/main/res/drawable/eye_yes.png differ diff --git a/app/src/main/res/drawable/folder.png b/app/src/main/res/drawable/folder.png new file mode 100644 index 0000000..a7f15a2 Binary files /dev/null and b/app/src/main/res/drawable/folder.png differ diff --git a/app/src/main/res/drawable/gradientv1.xml b/app/src/main/res/drawable/gradientv1.xml new file mode 100644 index 0000000..2b00d72 --- /dev/null +++ b/app/src/main/res/drawable/gradientv1.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/home.png b/app/src/main/res/drawable/home.png new file mode 100644 index 0000000..8eea8b2 Binary files /dev/null and b/app/src/main/res/drawable/home.png differ diff --git a/app/src/main/res/drawable/home_24.xml b/app/src/main/res/drawable/home_24.xml new file mode 100644 index 0000000..5a870f5 --- /dev/null +++ b/app/src/main/res/drawable/home_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/kyb.png b/app/src/main/res/drawable/kyb.png new file mode 100644 index 0000000..02dcecd Binary files /dev/null and b/app/src/main/res/drawable/kyb.png differ diff --git a/app/src/main/res/drawable/logovm.png b/app/src/main/res/drawable/logovm.png new file mode 100644 index 0000000..13ed986 Binary files /dev/null and b/app/src/main/res/drawable/logovm.png differ diff --git a/app/src/main/res/drawable/logovmediv2.png b/app/src/main/res/drawable/logovmediv2.png new file mode 100644 index 0000000..57f2d36 Binary files /dev/null and b/app/src/main/res/drawable/logovmediv2.png differ diff --git a/app/src/main/res/drawable/nice.png b/app/src/main/res/drawable/nice.png new file mode 100644 index 0000000..ebe772d Binary files /dev/null and b/app/src/main/res/drawable/nice.png differ diff --git a/app/src/main/res/drawable/patient.png b/app/src/main/res/drawable/patient.png new file mode 100644 index 0000000..d225a6d Binary files /dev/null and b/app/src/main/res/drawable/patient.png differ diff --git a/app/src/main/res/drawable/search.png b/app/src/main/res/drawable/search.png new file mode 100644 index 0000000..48b8e6d Binary files /dev/null and b/app/src/main/res/drawable/search.png differ diff --git a/app/src/main/res/drawable/setting.png b/app/src/main/res/drawable/setting.png new file mode 100644 index 0000000..7a85563 Binary files /dev/null and b/app/src/main/res/drawable/setting.png differ diff --git a/app/src/main/res/drawable/tab_indicator.xml b/app/src/main/res/drawable/tab_indicator.xml new file mode 100644 index 0000000..1c759f9 --- /dev/null +++ b/app/src/main/res/drawable/tab_indicator.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/font/akaya_telivigala.xml b/app/src/main/res/font/akaya_telivigala.xml new file mode 100644 index 0000000..acd5639 --- /dev/null +++ b/app/src/main/res/font/akaya_telivigala.xml @@ -0,0 +1,7 @@ + + + diff --git a/app/src/main/res/font/hero.ttf b/app/src/main/res/font/hero.ttf new file mode 100644 index 0000000..53cf604 Binary files /dev/null and b/app/src/main/res/font/hero.ttf differ diff --git a/app/src/main/res/font/hero_medium.ttf b/app/src/main/res/font/hero_medium.ttf new file mode 100644 index 0000000..985d768 Binary files /dev/null and b/app/src/main/res/font/hero_medium.ttf differ diff --git a/app/src/main/res/font/montserrat_alternates.ttf b/app/src/main/res/font/montserrat_alternates.ttf new file mode 100644 index 0000000..1930e0e Binary files /dev/null and b/app/src/main/res/font/montserrat_alternates.ttf differ diff --git a/app/src/main/res/font/montserrat_alternates_medium.ttf b/app/src/main/res/font/montserrat_alternates_medium.ttf new file mode 100644 index 0000000..b5d0af3 Binary files /dev/null and b/app/src/main/res/font/montserrat_alternates_medium.ttf differ diff --git a/app/src/main/res/layout/activity_auth.xml b/app/src/main/res/layout/activity_auth.xml new file mode 100644 index 0000000..6f9d1fd --- /dev/null +++ b/app/src/main/res/layout/activity_auth.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..48c1732 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/adsad.xml b/app/src/main/res/layout/adsad.xml new file mode 100644 index 0000000..76a6438 --- /dev/null +++ b/app/src/main/res/layout/adsad.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/custom_toast_layout.xml b/app/src/main/res/layout/custom_toast_layout.xml new file mode 100644 index 0000000..4a5cab2 --- /dev/null +++ b/app/src/main/res/layout/custom_toast_layout.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/custom_toast_layout_danger.xml b/app/src/main/res/layout/custom_toast_layout_danger.xml new file mode 100644 index 0000000..f5e2a16 --- /dev/null +++ b/app/src/main/res/layout/custom_toast_layout_danger.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/custom_toast_layout_info.xml b/app/src/main/res/layout/custom_toast_layout_info.xml new file mode 100644 index 0000000..857c193 --- /dev/null +++ b/app/src/main/res/layout/custom_toast_layout_info.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/custom_toast_layout_nice.xml b/app/src/main/res/layout/custom_toast_layout_nice.xml new file mode 100644 index 0000000..caa2f48 --- /dev/null +++ b/app/src/main/res/layout/custom_toast_layout_nice.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_appeals.xml b/app/src/main/res/layout/fragment_appeals.xml new file mode 100644 index 0000000..7ad5851 --- /dev/null +++ b/app/src/main/res/layout/fragment_appeals.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_auth.xml b/app/src/main/res/layout/fragment_auth.xml new file mode 100644 index 0000000..b4a8465 --- /dev/null +++ b/app/src/main/res/layout/fragment_auth.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + +