Skip to content

Hw9 todo #8

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-parcelize'
id 'kotlin-kapt'
}

android {
Expand Down Expand Up @@ -37,15 +38,23 @@ android {
}

dependencies {
def room_version = "2.4.0"

implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.0'
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"

implementation 'androidx.core:core-ktx:1.6.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'

implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
implementation "androidx.media:media:1.2.0"
testImplementation 'junit:junit:4.+'

testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'

implementation('androidx.fragment:fragment-ktx:1.4.0-alpha02')
implementation 'com.google.android.gms:play-services-location:18.0.0'
}
3 changes: 2 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itis.androidlabproject">

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
Expand All @@ -10,7 +11,7 @@
android:supportsRtl="true"
android:theme="@style/Theme.AndroidLabProject">
<activity
android:name=".MainActivity"
android:name=".view.MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand Down
33 changes: 33 additions & 0 deletions app/src/main/java/com/itis/androidlabproject/App.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.itis.androidlabproject

import android.app.Application
import androidx.room.Room
import com.itis.androidlabproject.data.AppDatabase
import com.itis.androidlabproject.data.dao.TaskDao

class App : Application() {
lateinit var database: AppDatabase
lateinit var taskDao: TaskDao

companion object {
private lateinit var instance: App

fun getInstance(): App {
return instance
}
}

override fun onCreate() {
super.onCreate()
instance = this
database = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java,
"app-db"
).run {
allowMainThreadQueries()
build()
}
taskDao = database.taskDao()
}
}
11 changes: 0 additions & 11 deletions app/src/main/java/com/itis/androidlabproject/MainActivity.kt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.itis.androidlabproject.adapter

import android.os.Bundle
import android.view.ViewGroup
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.itis.androidlabproject.callbacks.TaskDiffItemCallback
import com.itis.androidlabproject.models.Task
import java.util.ArrayList

class TaskAdapter(
private val actionChoose: (Int) -> (Unit),
private val actionDelete: (Int) -> (Unit)
) : ListAdapter<Task, TaskHolder>(TaskDiffItemCallback()) {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): TaskHolder = TaskHolder.create(parent, actionChoose, actionDelete)

override fun onBindViewHolder(
holder: TaskHolder,
position: Int) = holder.bind(getItem(position))

override fun onBindViewHolder(
holder: TaskHolder,
position: Int,
payloads: MutableList<Any>
) {
if (payloads.isEmpty()) {
super.onBindViewHolder(holder, position, payloads)
} else {
payloads.last().takeIf {
it is Bundle
}?.let {
holder.updateFields(it as Bundle)
}
}
}

override fun submitList(list: MutableList<Task>?) {
super.submitList(
if (list == null) null
else ArrayList(list)
)
}
}
67 changes: 67 additions & 0 deletions app/src/main/java/com/itis/androidlabproject/adapter/TaskHolder.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.itis.androidlabproject.adapter

import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.itis.androidlabproject.databinding.TaskListItemBinding
import com.itis.androidlabproject.models.DateToStringConverter.convertDateToString
import com.itis.androidlabproject.models.Task

class TaskHolder(
private val binding: TaskListItemBinding,
private val actionChoose: (Int) -> (Unit),
private val actionDelete: (Int) -> (Unit)
) : RecyclerView.ViewHolder(binding.root) {
private var task: Task? = null

fun bind(item: Task) {
this.task = item
with(binding) {
tvTaskTitle.text = item.title
tvTaskDate.text = convertDateToString(item.date)

itemView.setOnClickListener {
actionChoose(item.id)
}
ivDelete.setOnClickListener {
actionDelete(item.id)
}
}
}

fun updateFields(bundle: Bundle?) {
bundle?.run {
getString("TITLE")?.also {
updateTitle(it)
}
getString("DATE")?.also {
updateDate(it)
}
}
}

private fun updateTitle(title: String) {
binding.tvTaskTitle.text = title
}

private fun updateDate(date: String) {
binding.tvTaskDate.text = date
}

companion object {
fun create(
parent: ViewGroup,
actionChoose: (Int) -> Unit,
actionDelete: (Int) -> Unit
) = TaskHolder(
TaskListItemBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
),
actionChoose,
actionDelete
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.itis.androidlabproject.callbacks

import android.annotation.SuppressLint
import android.os.Bundle
import androidx.core.os.bundleOf
import androidx.recyclerview.widget.DiffUtil
import com.itis.androidlabproject.models.DateToStringConverter
import com.itis.androidlabproject.models.Task

class TaskDiffItemCallback : DiffUtil.ItemCallback<Task>(){
override fun areItemsTheSame(
oldItem: Task,
newItem: Task
): Boolean = oldItem.id == newItem.id

override fun areContentsTheSame(
oldItem: Task,
newItem: Task
): Boolean {
return oldItem.equals(newItem)
}

override fun getChangePayload(
oldItem: Task,
newItem: Task
): Any? {
val bundle = Bundle().apply {
if (oldItem.title != newItem.title) {
putString("TITLE", newItem.title)
}

if (oldItem.description != newItem.description) {
putString("DESCRIPTION", newItem.description)
}

if (oldItem.date != newItem.date) {
putString("DATE", DateToStringConverter.convertDateToString(newItem.date))
}

if (oldItem.latitude != newItem.latitude) {
newItem.latitude?.let {
putDouble("LATITUDE", it)
}
}

if (oldItem.longitude != newItem.longitude) {
newItem.longitude?.let {
putDouble("LONGITUDE", it)
}
}
}


if (bundle.isEmpty) return null
return bundle
}
}
44 changes: 44 additions & 0 deletions app/src/main/java/com/itis/androidlabproject/data/AppDatabase.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.itis.androidlabproject.data

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import com.itis.androidlabproject.data.dao.TaskDao
import com.itis.androidlabproject.models.DateConverter
import com.itis.androidlabproject.models.Task

@Database(
entities = [Task::class],
version = 1,
exportSchema = false
)
@TypeConverters(DateConverter::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun taskDao(): TaskDao

companion object {
private const val DB_NAME = "task.db"

@Volatile
private var instance: AppDatabase? = null
private val LOCK = Any()

operator fun invoke(context: Context?) = Companion.instance ?: synchronized(LOCK) {
buildDatabase(context)
}

private fun buildDatabase(context: Context) {
instance = Room.databaseBuilder(
context,
AppDatabase::class.java,
DB_NAME
).run {
allowMainThreadQueries()
fallbackToDestructiveMigration()
build()
}
}
}
}
40 changes: 40 additions & 0 deletions app/src/main/java/com/itis/androidlabproject/data/dao/TaskDao.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.itis.androidlabproject.data.dao

import androidx.lifecycle.LiveData
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query
import androidx.room.Update
import com.itis.androidlabproject.models.Task

interface TaskDao {
@Query("SELECT * FROM Task")
fun getAll(): List<Task>

@Query("SELECT * FROM Task")
fun getAllLiveData(): LiveData<List<Task>>

@Query("SELECT * FROM Task WHERE id IN (:todoIds)")
fun loadAllByIds(todoIds: IntArray): List<Task>

@Query("SELECT * FROM Task WHERE title = :title LIMIT 1")
fun findByName(title: String): Task

@Query("SELECT * FROM Task WHERE id = :id LIMIT 1")
fun findById(id: Int): Task

@Insert
fun insert(task: Task)

@Update
fun update(task: Task)

@Delete
fun delete(task: Task)

@Query("DELETE FROM Task")
fun deleteAllTasks()

@Query("DELETE FROM task WHERE id=:id")
fun deleteTaskById(id: Int)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.itis.androidlabproject.extentions

import androidx.appcompat.app.AppCompatActivity
import androidx.navigation.NavController
import androidx.navigation.fragment.NavHostFragment

fun AppCompatActivity.findController (id: Int) : NavController {
return (supportFragmentManager.findFragmentById(id) as NavHostFragment).navController
}
Loading