commit f6b2b77f3ee8f0e1d0dbfb10d2c8184b21b19c53 Author: Вашукевич Евгений Юрьевич Date: Thu Jul 6 09:50:36 2023 +0300 first commit 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/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..70901d2 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..8f684dc --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,21 @@ + + + + + + + \ 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..0ad17cb --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ 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..7223ade --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,48 @@ +plugins { + id 'com.android.application' + id 'org.jetbrains.kotlin.android' +} + +android { + namespace 'com.example.rehabilitation' + compileSdk 33 + + defaultConfig { + applicationId "com.example.rehabilitation" + 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 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.9.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'com.android.car.ui:car-ui-lib:2.0.0' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.5' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' +} \ 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/rehabilitation/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/example/rehabilitation/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..959605c --- /dev/null +++ b/app/src/androidTest/java/com/example/rehabilitation/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package com.example.rehabilitation + +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.rehabilitation", 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..0ff8b48 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000..c15e36a Binary files /dev/null and b/app/src/main/ic_launcher-playstore.png differ diff --git a/app/src/main/java/com/example/rehabilitation/MainActivity.kt b/app/src/main/java/com/example/rehabilitation/MainActivity.kt new file mode 100644 index 0000000..3a4ed62 --- /dev/null +++ b/app/src/main/java/com/example/rehabilitation/MainActivity.kt @@ -0,0 +1,76 @@ +package com.example.rehabilitation + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.example.rehabilitation.databinding.ActivityMainBinding +import com.example.rehabilitation.fragment.User.* + +class MainActivity : AppCompatActivity() { + private lateinit var binding: ActivityMainBinding + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + + //Функция инициализации фрагметов + fragment_inicializ() + + /*binding.button.setOnClickListener { + val intent = Intent(this,MainActivity2::class.java)//Открытие окна + startActivity(intent) + }*/ + + binding.btnSetting.setOnClickListener { + val intent = Intent(this, SettingActivity::class.java) + startActivity(intent) + } + } + + + override fun onDestroy() { + super.onDestroy() + } + + override fun onResume() { + super.onResume() + } + + + //Инициализация фрагментов + fun fragment_inicializ() { + //Вывод фрагмента на активити при первоначальной загрузке + supportFragmentManager.beginTransaction() + .replace(R.id.placeHolderFragment, 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.schedule -> { + supportFragmentManager.beginTransaction().replace(R.id.placeHolderFragment, SceduleFragment.newInstance()).commit()//Заменяем наш экран на фрагмент (используем наш экран как основу)//R.id.placeHolder - куда всталяем //MainFragment.newInstance() - это то что мы вставляем + } + R.id.calendar -> { + supportFragmentManager.beginTransaction().replace(R.id.placeHolderFragment, CalendarFragment.newInstance()).commit()//Заменяем наш экран на фрагмент (используем наш экран как основу)//R.id.placeHolder - куда всталяем //MainFragment.newInstance() - это то что мы вставляем + } + R.id.home -> {//Если вы не авторизованный пользваотель то вам не будет доступен доступ к данном фрагменту + supportFragmentManager.beginTransaction().replace(R.id.placeHolderFragment, HomeFragment.newInstance()).commit()//Заменяем наш экран на фрагмент (используем наш экран как основу)//R.id.placeHolder - куда всталяем //MainFragment.newInstance() - это то что мы вставляем + } + R.id.progress -> {//Если вы не авторизованный пользваотель то вам не будет доступен доступ к данном фрагменту + supportFragmentManager.beginTransaction().replace(R.id.placeHolderFragment, ProgresFragment.newInstance()).commit()//Заменяем наш экран на фрагмент (используем наш экран как основу)//R.id.placeHolder - куда всталяем //MainFragment.newInstance() - это то что мы вставляем + } + R.id.information -> {//Если вы не авторизованный пользваотель то вам не будет доступен доступ к данном фрагменту + supportFragmentManager.beginTransaction().replace(R.id.placeHolderFragment, InformationFragment.newInstance()).commit()//Заменяем наш экран на фрагмент (используем наш экран как основу)//R.id.placeHolder - куда всталяем //MainFragment.newInstance() - это то что мы вставляем + } + } + true + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/rehabilitation/SettingActivity.kt b/app/src/main/java/com/example/rehabilitation/SettingActivity.kt new file mode 100644 index 0000000..4803c25 --- /dev/null +++ b/app/src/main/java/com/example/rehabilitation/SettingActivity.kt @@ -0,0 +1,20 @@ +package com.example.rehabilitation + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import com.example.rehabilitation.databinding.ActivitySettingBinding + +class SettingActivity : AppCompatActivity() { + private lateinit var binding: ActivitySettingBinding + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivitySettingBinding.inflate(layoutInflater) + setContentView(binding.root) + + binding.btnExitSetting.setOnClickListener { + finish() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/rehabilitation/db/ListItem.kt b/app/src/main/java/com/example/rehabilitation/db/ListItem.kt new file mode 100644 index 0000000..9ed5af6 --- /dev/null +++ b/app/src/main/java/com/example/rehabilitation/db/ListItem.kt @@ -0,0 +1,9 @@ +package com.example.rehabilitation.db + +class ListItem {//Класс который мы будем заполнять передавая в него данные из базы данных, он нужен чтобы можно было принимать не однк переменную а все 3 + var id = 0 + var title = "empty" + var desc = "empty" + var uri = "empty" + var time = "" +} \ No newline at end of file diff --git a/app/src/main/java/com/example/rehabilitation/db/MyAdapter.kt b/app/src/main/java/com/example/rehabilitation/db/MyAdapter.kt new file mode 100644 index 0000000..f1dcdee --- /dev/null +++ b/app/src/main/java/com/example/rehabilitation/db/MyAdapter.kt @@ -0,0 +1,97 @@ +package com.example.rehabilitation.db + +import android.annotation.SuppressLint +import android.content.Context +import android.content.Intent +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.example.rehabilitation.R +import com.example.rehabilitation.fragment.User.CalendarFragment + + +class MyAdapter(listMain: ArrayList, var contextMain:Context): RecyclerView.Adapter() {//ViewHolder(MyAdapter.MyHolder) - какого типа будет наш адаптер//listMain: ArrayList - конструктор в который мы будем передавать список//contextMain:Context - принимаемый контекст c MainActivity + private var listArray = listMain//listArray - переменная которая дас нам возможность работать со списком, то есть так как она находится в конструкторе, где он не доступен, и за счет переменно на уровне класса мы получим его данные(список) + var context = contextMain//Делаем принимаемый контекст доступным + + + class MyHolder(itemView: View, contextView: Context) : RecyclerView.ViewHolder(itemView) {//Класс который будет отвечать за элемент который будет добавляться на экран, то етсь дял каждого эленмента на экране будет свой MyHolder, он соджержит в себе элементы котрые будут содержаться в выведенном элементе + var context2 = contextView// + val tvTitel = itemView.findViewById(R.id.txtTitle)//Тут мы ишем наше место для текста в шалоне и делаем связь с ним чтобы передавать туда данные при заполнение //findViewById - найди мне + val tvTime= itemView.findViewById(R.id.txtTime) + fun setData(item: ListItem){//Функция для прередачи текста в шаблон при его выводе + tvTitel.text = item.title//Передаем текст title + tvTime.text = item.time//Передаем время + itemView.setOnClickListener { + val intent = Intent(context2, CalendarFragment::class.java).apply { //Передаем контекст(context2), чтобы запустить следуюшее активити//.apply - что бы передать через putExtra все что нам нужно + putExtra(MyIntentConstans.ITEM_TITLE_KEY, item.title)//Передача на другой экран Title + putExtra(MyIntentConstans.ITEM_DESK_KEY, item.desc) + putExtra(MyIntentConstans.ITEM_URI_KEY, item.uri) + putExtra(MyIntentConstans.ITEM_ID_KEY, item.id) + } + context2.startActivity(intent)//Передаем на следуюший экран весь intent, то ест мы хотим открыть EditActivity и передать на него title, desc и uri//intent - то что мы хотим запустить + } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyHolder {//Функция где мы создапем наш шаблон, то есть которая из XML шаблона rc_item сделает нам нужный объект, в который мы и бьудем передавать данные + val inflater = LayoutInflater.from(parent.context).inflate(R.layout.rc_item, parent, false)//.from(parent.context) - контекст //inflater - специальный класс который надувает наш XML шаблон и деалет из него объект, который и будет нарисован на нашем экране + return MyHolder(inflater, context)//.inflate() - надуй //R.layout.rc_item - что будем надуваем //parent - root элемент + } + + + override fun onBindViewHolder(holder: MyHolder, position: Int) {//Функция запускается когда на шаблон создатся в onCreateViewHolder, то есть тут мы будем иметь информацию о нашем textView и его позицию, и будим его заполнять + holder.setData(listArray[position])//Через функцию передаем все элементы в список + } + + override fun getItemCount(): Int {//Данная функция сообщает нашему адаптеру сколько элементом нужно будет вывести на экран(количество элементов в списке) + return listArray.size//Возвращаем размер + } + + @SuppressLint("NotifyDataSetChanged") + fun updateAdapter(listItem: List) {//Обновление адаптера(MyAdapter)//Данная функция юудт брать массив listArray, будет его очишать, добовлять другой массив(новый - уже с обновленными данными) и сообщаем с помошью специалной команды, что данные изменились и MyAdapter все перерисует + + listArray.clear()//Очистка прошлых данных в листе + listArray.addAll(listItem)//Передаем в лист лист с обновленными данными + notifyDataSetChanged()//Команда сообщающая MyAdapter, что данные обновились и MyAdapter все перезапишет и выведет + + + }//listItem - сюда рпередаем список из базы данных + + + fun removeItem(position: Int,dbManeger: MyDbManeger) {//Функция для удаления ячейки котрую мы свайпнули и обновления списка, что бы когда мы перезашил элемент неожиданно снова бы не появился и убарть с адаптера и предупредить адаптер, что мы убрали элемент + dbManeger.removeItemDeleteFromDB(listArray[position].id.toString())//Передаем тут объект дял удаления из базы данных//.toString() - для передачи в базу данных его конвертирвоаь в String + listArray.removeAt(position)//Передаем что список уменьшился + notifyItemChanged(0, listArray.size)//Говорим адаптеру, что элементов теперь меньше и теперь длина элементов внутри меньше и нужно указать где начинается, а где заканчивается//(0, listArray.size): 0 - это начало, listArray.size - это новый размер,Ю так как мы перезаписали наш лист, там теперь новое количество обьектов и этот рамер листа и будет нашим пределом + notifyItemRemoved(position)//Передаем что на данной позиции(position) мы удалили элемент + + + } + +} + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/example/rehabilitation/db/MyDbHelper.kt b/app/src/main/java/com/example/rehabilitation/db/MyDbHelper.kt new file mode 100644 index 0000000..eee60ab --- /dev/null +++ b/app/src/main/java/com/example/rehabilitation/db/MyDbHelper.kt @@ -0,0 +1,59 @@ +package com.example.rehabilitation.db + +import android.content.Context +import android.database.sqlite.SQLiteDatabase +import android.database.sqlite.SQLiteOpenHelper +//Для создания баз и таблиц к ним, а также обновления ее +class MyDbHelper(context: Context) : SQLiteOpenHelper(context,MyDbNameClass.DATABASE_NAME,null,MyDbNameClass.DATABASE_VERSION) { + //(context: Context) - контекст для открвтия базы данных//SQLiteOpenHelper - интерфейс даюший доступ к базе данных которые имеее внутреннние функции + override fun onCreate(db: SQLiteDatabase?) {//Добавление таблицы в базу + db?.execSQL(MyDbNameClass.CREATE_TABLE)//Создание базы по заготовке + } + + override fun onUpgrade(db: SQLiteDatabase?, p1: Int, p2: Int) {//Обновление базы или версии + db?.execSQL(MyDbNameClass.SQL_DELETE_TABLE)//Удаление + onCreate(db)//Создание новой версии + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/example/rehabilitation/db/MyDbManeger.kt b/app/src/main/java/com/example/rehabilitation/db/MyDbManeger.kt new file mode 100644 index 0000000..d797afd --- /dev/null +++ b/app/src/main/java/com/example/rehabilitation/db/MyDbManeger.kt @@ -0,0 +1,139 @@ +package com.example.rehabilitation.db + +import android.annotation.SuppressLint +import android.content.ContentValues +import android.content.Context +import android.database.sqlite.SQLiteDatabase +import android.provider.BaseColumns +import com.example.rehabilitation.db.MyDbHelper +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +//Для работы с базой данных(запись, считывание и вывод) +class MyDbManeger(contex: Context) {//(contex: Context) - контекс потому что наш MyDbHelper ждет контекста, и когда мы запустим MyDbHelper, то мы через contex и передадим в него его contex + + val myDbHelper = MyDbHelper(contex)//Вот мы и передали контекст в MyDbHelper и сделали для него отдельную переменную + var db: SQLiteDatabase? = null//Через этот объект мы будем открввать и записывать данные в базу данных + + fun openDB(){//Открытие + db = myDbHelper.writableDatabase//writableDatabase - база откылась для записей + } + + fun closeDB(){//Закрытие + myDbHelper.close()//close() - база закрылась для записей + } + + //Обновление данных + suspend fun updateItemDB(title: String, content:String,uri:String, id: Int, time:String) = withContext(Dispatchers.IO){//Обновление по id//Функция для обновленяи записей//title: String, content:String - 1 и 2 клонка + val selection = BaseColumns._ID + "=$id"//Индификатор по которому будем определять что обновлять + val valuess = ContentValues().apply {//ContentValues() - что-то типа массива или хэш-мап, где сохраняется в виде ключа наши значения//Тут мы созадлем ключи для более удобной связи с передаваемыми даннымми в колонку, а также чтобы сделать ключь для колонки + put(MyDbNameClass.COLUMN_NAME_TITLE, title)//1 колонка + put(MyDbNameClass.COLUMN_NAME_CONTENT, content)//2 колонка + put(MyDbNameClass.COLUMN_NAME_IMAGE_URI, uri)//3 колонка + put(MyDbNameClass.COLUMN_NAME_TIME, time)//4 колонка//Обновляем время после каждого пересохранения + } + db?.update(MyDbNameClass.TABLE_NAME,valuess,selection,null)//Обновление данных//1 - где хоти обновть(название таблицы), 2 - что хотим обноновить в данно м элементе, 3 - selction + } + + + + //Вставлять или добавлять данные + suspend fun insertToDB (title: String, content:String,uri:String, time: String)= withContext(Dispatchers.IO){//Запись//Функция для записей в базу данных, что бы создавать(отправлять) записи//title: String, content:String - 1 и 2 клонка + val valuess = ContentValues().apply {//ContentValues() - что-то типа массива или хэш-мап, где сохраняется в виде ключа наши значения//Тут мы созадлем ключи для более удобной связи с передаваемыми даннымми в колонку, а также чтобы сделать ключь для колонки + put(MyDbNameClass.COLUMN_NAME_TITLE, title)//1 колонка + put(MyDbNameClass.COLUMN_NAME_CONTENT, content)//2 колонка + put(MyDbNameClass.COLUMN_NAME_IMAGE_URI, uri)//3 колонка + put(MyDbNameClass.COLUMN_NAME_TIME, time)//4 колонка + } + db?.insert(MyDbNameClass.TABLE_NAME,null,valuess)//Передача в базу + } + + //Удаление + fun removeItemDeleteFromDB(id: String){//Функция удаления по свайпу, удаление рпоисходит по id так как названия могут совпадать, а id нет + val selection = BaseColumns._ID + "=$id"//Удадаляем по индификатору, где индификатор равен моему индификатору - / + "=$id" / + db?.delete(MyDbNameClass.TABLE_NAME,selection, null)//Удаление из базы//MyDbNameClass.TABLE_NAME - из какой таблицы + } + + //Считывание + @SuppressLint("Range")//suspend fun - эта функция будет блокировать Coroutine пока не завиршится, то есть теперь основной поток не будит блокироваться для обновления данных, а данные обновятся на второстепенном потоке, что бы не блокировать основные действия из-за прогрузки, а уже когда полностью загрузятся на второстепенном потоке, то они заблакирую основно поток и выведут данные и никакгого дискамфорта не будет от того что виснет от прогрузки что-то, то есть пока все не прогрузится на второстепенном потоке ничего лмшний раз блокировать основной поток не будет и программа будет работать без перебоее, а же когда загрузятся данные из базы данных, то основной поток займется для обновления данных// = withContext(Dispatchers.IO) - запускает эту функцию там где я укажу, то есть я укажу на второстепенном потоке //IO - второстепенный поток + suspend fun readDBData(searchText:String) : ArrayList = withContext(Dispatchers.IO){//Для считывания//ArrayList - будет возвращать массив в который будет записанно все, что будет в базе данных//ArrayList - тип данных котоорый мы ждем при чтение + val dataList = ArrayList()//Массив для данных//Кторы мы и перпедадим readDBData() + val selectionKolon = "${MyDbNameClass.COLUMN_NAME_TITLE} like ?"//То по какой колонке мы будим искать// like ? - это для запросов к базе + val cursor = db?.query(//Считывание данных, тут их можно сортировать, отслежывать и братьт определенные за счет всех этих параметров//После того как заполнили наш dataList, то cursor нужно отключть, чтобы не потреблять лишние данные + MyDbNameClass.TABLE_NAME, // The table to query + null, // The array of columns to return (pass null to get all) + selectionKolon,//Колонка по которой мы в базе данных будем искать // The columns for the WHERE clause + arrayOf("%$searchText%"),// arrayOf(searchText)- передаем в таком виде(в виде массива) так как мы не можем прост передат переменную с текстом//"%$searchText%" - ишим по любому совпадению// The values for the WHERE clause + null, // don't group the rows + null, // don't filter by row groups + null // The sort order + ) + + //СЧИТЫВАНИЕ ДАННЫХ + /*1 вариант + with(cursor){// with(cursor) - чтобы получить доступ к функциям нашего класса, не указывая cursor.moveToNext(), и теперь то что записанно в with(cursor) это и будит наш cursor + while (this?.moveToNext()!!){//!! - что бы небыл на cursor null, для того чтобы причсчитывание он остановылися когда закончились элементы в массиве, то есть считывает пока не придет к концу базы и придя к концу выходит из функции + val dataText = cursor?.getString(cursor.getColumnIndex(MyDbNameClass.COLUMN_NAME_TITLE))//.getColumnIndex() - номер строки + dataList.add(dataText.toString()) + } + }*/ + + //СЧИТЫВАНИЕ ДАННЫХ + /*2 вариант*/ + while (cursor?.moveToNext()!!){//!! - что бы небыл на cursor null, для того чтобы при считывание он остановылися когда закончились элементы в массиве, то есть считывает пока не придет к концу базы и придя к концу выходит из функции + val dataTitle = cursor.getString(cursor.getColumnIndex(MyDbNameClass.COLUMN_NAME_TITLE))//.getColumnIndex() - номер строки//То что мы считываем + val dataContent = cursor.getString(cursor.getColumnIndex(MyDbNameClass.COLUMN_NAME_CONTENT)) + val dataUri = cursor.getString(cursor.getColumnIndex(MyDbNameClass.COLUMN_NAME_IMAGE_URI)) + val dataId = cursor.getInt(cursor.getColumnIndex(BaseColumns._ID)) + val dataTime = cursor.getString(cursor.getColumnIndex(MyDbNameClass.COLUMN_NAME_TIME)) + + + + //val dataText2 = cursor.getString(cursor.getColumnIndex(MyDbNameClass.COLUMN_NAME_CONTENT))//.getColumnIndex() - номер строки + val item = ListItem()//Для связи с нашим класс в который мы и передаем данные + item.id = dataId//Передаем id + item.title = dataTitle//Передаем название + item.desc = dataContent//Передаем описание + item.uri = dataUri//Передаем фотографию + item.time = dataTime//Передаем время + dataList.add(item)//Передаем item со всеми данными + } + + cursor.close()//Закрыли курсор так как закончили с ним работать + + return@withContext dataList//@withContext - так как мы используем @withContext в функции для считывания, а она возврошает лист, то просто так его не примит и нужно указать @withContext для правильной работы + } + + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/com/example/rehabilitation/db/MyDbNameClass.kt b/app/src/main/java/com/example/rehabilitation/db/MyDbNameClass.kt new file mode 100644 index 0000000..bb215c2 --- /dev/null +++ b/app/src/main/java/com/example/rehabilitation/db/MyDbNameClass.kt @@ -0,0 +1,24 @@ +package com.example.rehabilitation.db + +import android.provider.BaseColumns +//BaseColumns - удобство данного интерфейса в том, что он уже имеет внутренний автоинкремент для индификации данных и нам не нужно его самим солздавать +object MyDbNameClass: BaseColumns { + const val TABLE_NAME = "my_table"//Название таблицы + const val COLUMN_NAME_TITLE = "title"//Название колонки 1 + const val COLUMN_NAME_CONTENT = "content"//Название колонки 2 + const val COLUMN_NAME_IMAGE_URI = "uri"//Название колонки 3 + const val COLUMN_NAME_TIME = "time"//Название колонки 4 + + const val DATABASE_VERSION = 1//Версия нужна для того чтобы указывать так сказать стадии, то есть как у телефонов новая версия означает новые обновления и тут также в зависимоти от версии будут добавлены новые детали в базу, изначально первая версия, при изменении версии функция удалит старую и запишите в неё новые данные + const val DATABASE_NAME = "MyLessonDb.db"//Название файла базы данных + + const val CREATE_TABLE = "CREATE TABLE if NOT EXISTS $TABLE_NAME(" + + "${BaseColumns._ID} INTEGER PRIMARY KEY," + //Индификатор + "$COLUMN_NAME_TITLE TEXT," +//Колонка 1 + "$COLUMN_NAME_CONTENT TEXT,"+//Колонка 2 + "$COLUMN_NAME_IMAGE_URI TEXT,"+//Колонка 3 + "$COLUMN_NAME_TIME TEXT)"//Колонка 4 + + const val SQL_DELETE_TABLE = "DROP TABLE IF EXISTS $TABLE_NAME"//Сброс(удалить) старую таблицу + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/rehabilitation/db/MyIntentConstans.kt b/app/src/main/java/com/example/rehabilitation/db/MyIntentConstans.kt new file mode 100644 index 0000000..9cefba7 --- /dev/null +++ b/app/src/main/java/com/example/rehabilitation/db/MyIntentConstans.kt @@ -0,0 +1,9 @@ +package com.example.rehabilitation.db + +object MyIntentConstans { + + const val ITEM_TITLE_KEY = "title_key" + const val ITEM_DESK_KEY = "desc_key" + const val ITEM_URI_KEY = "uri_key" + const val ITEM_ID_KEY = "id_key" +} \ No newline at end of file diff --git a/app/src/main/java/com/example/rehabilitation/fragment/User/CalendarFragment.kt b/app/src/main/java/com/example/rehabilitation/fragment/User/CalendarFragment.kt new file mode 100644 index 0000000..e7f0e99 --- /dev/null +++ b/app/src/main/java/com/example/rehabilitation/fragment/User/CalendarFragment.kt @@ -0,0 +1,27 @@ +package com.example.rehabilitation.fragment.User + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.rehabilitation.R +import com.example.rehabilitation.databinding.FragmentCalendarBinding + + +class CalendarFragment : Fragment() { + private lateinit var binding: FragmentCalendarBinding + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentCalendarBinding.inflate(layoutInflater,container,false) + return binding.root + } + + companion object { + + fun newInstance() = CalendarFragment() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/rehabilitation/fragment/User/HomeFragment.kt b/app/src/main/java/com/example/rehabilitation/fragment/User/HomeFragment.kt new file mode 100644 index 0000000..abf1365 --- /dev/null +++ b/app/src/main/java/com/example/rehabilitation/fragment/User/HomeFragment.kt @@ -0,0 +1,25 @@ +package com.example.rehabilitation.fragment.User + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.rehabilitation.R +import com.example.rehabilitation.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 + } + + companion object { + + fun newInstance() = HomeFragment() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/rehabilitation/fragment/User/InformationFragment.kt b/app/src/main/java/com/example/rehabilitation/fragment/User/InformationFragment.kt new file mode 100644 index 0000000..d8e76ff --- /dev/null +++ b/app/src/main/java/com/example/rehabilitation/fragment/User/InformationFragment.kt @@ -0,0 +1,26 @@ +package com.example.rehabilitation.fragment.User + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.rehabilitation.R +import com.example.rehabilitation.databinding.FragmentInformationBinding + + +class InformationFragment : Fragment() { + private lateinit var binding: FragmentInformationBinding + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentInformationBinding.inflate(layoutInflater, container, false) + return binding.root + } + + companion object { + + fun newInstance() = InformationFragment() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/rehabilitation/fragment/User/ProgresFragment.kt b/app/src/main/java/com/example/rehabilitation/fragment/User/ProgresFragment.kt new file mode 100644 index 0000000..5b59f57 --- /dev/null +++ b/app/src/main/java/com/example/rehabilitation/fragment/User/ProgresFragment.kt @@ -0,0 +1,26 @@ +package com.example.rehabilitation.fragment.User + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.rehabilitation.R +import com.example.rehabilitation.databinding.FragmentProgresBinding + + +class ProgresFragment : Fragment() { + private lateinit var binding: FragmentProgresBinding + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentProgresBinding.inflate(layoutInflater, container, false) + return binding.root + } + + companion object { + + fun newInstance() = ProgresFragment() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/rehabilitation/fragment/User/SceduleFragment.kt b/app/src/main/java/com/example/rehabilitation/fragment/User/SceduleFragment.kt new file mode 100644 index 0000000..518627a --- /dev/null +++ b/app/src/main/java/com/example/rehabilitation/fragment/User/SceduleFragment.kt @@ -0,0 +1,25 @@ +package com.example.rehabilitation.fragment.User + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.example.rehabilitation.R +import com.example.rehabilitation.databinding.FragmentSceduleBinding + + +class SceduleFragment : Fragment() { + private lateinit var binding: FragmentSceduleBinding + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + binding = FragmentSceduleBinding.inflate(layoutInflater, container, false) + return binding.root + } + + companion object { + fun newInstance() = SceduleFragment() + } +} \ 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/basket_24.xml b/app/src/main/res/drawable/basket_24.xml new file mode 100644 index 0000000..7a0a3eb --- /dev/null +++ b/app/src/main/res/drawable/basket_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/calendar24.xml b/app/src/main/res/drawable/calendar24.xml new file mode 100644 index 0000000..b89360f --- /dev/null +++ b/app/src/main/res/drawable/calendar24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/calendarv2.png b/app/src/main/res/drawable/calendarv2.png new file mode 100644 index 0000000..84ae4fb Binary files /dev/null and b/app/src/main/res/drawable/calendarv2.png differ diff --git a/app/src/main/res/drawable/cart_24.xml b/app/src/main/res/drawable/cart_24.xml new file mode 100644 index 0000000..ba0b471 --- /dev/null +++ b/app/src/main/res/drawable/cart_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/door_24.xml b/app/src/main/res/drawable/door_24.xml new file mode 100644 index 0000000..21f5a54 --- /dev/null +++ b/app/src/main/res/drawable/door_24.xml @@ -0,0 +1,5 @@ + + + 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/homev2.png b/app/src/main/res/drawable/homev2.png new file mode 100644 index 0000000..c184f1d Binary files /dev/null and b/app/src/main/res/drawable/homev2.png differ diff --git a/app/src/main/res/drawable/ic_add.png b/app/src/main/res/drawable/ic_add.png new file mode 100644 index 0000000..2526b2a Binary files /dev/null and b/app/src/main/res/drawable/ic_add.png differ diff --git a/app/src/main/res/drawable/ic_add_image.xml b/app/src/main/res/drawable/ic_add_image.xml new file mode 100644 index 0000000..8232c4d --- /dev/null +++ b/app/src/main/res/drawable/ic_add_image.xml @@ -0,0 +1,10 @@ + + + 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..36707c2 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/information.png b/app/src/main/res/drawable/information.png new file mode 100644 index 0000000..b4cf9c3 Binary files /dev/null and b/app/src/main/res/drawable/information.png differ diff --git a/app/src/main/res/drawable/informationv2.png b/app/src/main/res/drawable/informationv2.png new file mode 100644 index 0000000..9b942ea Binary files /dev/null and b/app/src/main/res/drawable/informationv2.png differ diff --git a/app/src/main/res/drawable/logo.png b/app/src/main/res/drawable/logo.png new file mode 100644 index 0000000..7ef0b34 Binary files /dev/null and b/app/src/main/res/drawable/logo.png differ diff --git a/app/src/main/res/drawable/medac.jpg b/app/src/main/res/drawable/medac.jpg new file mode 100644 index 0000000..b4ec44c Binary files /dev/null and b/app/src/main/res/drawable/medac.jpg differ diff --git a/app/src/main/res/drawable/message_24.xml b/app/src/main/res/drawable/message_24.xml new file mode 100644 index 0000000..c20e247 --- /dev/null +++ b/app/src/main/res/drawable/message_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/progres.png b/app/src/main/res/drawable/progres.png new file mode 100644 index 0000000..5f5ff84 Binary files /dev/null and b/app/src/main/res/drawable/progres.png differ diff --git a/app/src/main/res/drawable/progresv2.png b/app/src/main/res/drawable/progresv2.png new file mode 100644 index 0000000..b7a6d62 Binary files /dev/null and b/app/src/main/res/drawable/progresv2.png differ diff --git a/app/src/main/res/drawable/schedule.png b/app/src/main/res/drawable/schedule.png new file mode 100644 index 0000000..378c8c9 Binary files /dev/null and b/app/src/main/res/drawable/schedule.png differ diff --git a/app/src/main/res/drawable/schedulev2.png b/app/src/main/res/drawable/schedulev2.png new file mode 100644 index 0000000..45206ff Binary files /dev/null and b/app/src/main/res/drawable/schedulev2.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..2c4818e Binary files /dev/null and b/app/src/main/res/drawable/setting.png differ 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..b900fad --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,106 @@ + + + +