diff --git a/app/src/main/java/net/underdesk/circolapp/MainActivity.kt b/app/src/main/java/net/underdesk/circolapp/MainActivity.kt index 58cc52e..fa34bdf 100644 --- a/app/src/main/java/net/underdesk/circolapp/MainActivity.kt +++ b/app/src/main/java/net/underdesk/circolapp/MainActivity.kt @@ -30,6 +30,7 @@ import android.view.MenuItem import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.widget.SearchView +import androidx.lifecycle.lifecycleScope import androidx.navigation.findNavController import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupActionBarWithNavController @@ -38,7 +39,9 @@ import androidx.preference.PreferenceManager import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.snackbar.Snackbar import com.mikepenz.aboutlibraries.LibsBuilder +import kotlinx.coroutines.launch import net.underdesk.circolapp.adapters.CircularLetterAdapter +import net.underdesk.circolapp.data.AndroidDatabase import net.underdesk.circolapp.databinding.ActivityMainBinding import net.underdesk.circolapp.utils.DownloadableFile import net.underdesk.circolapp.works.PollWork @@ -113,6 +116,12 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback refreshCallback?.refresh() true } + R.id.menu_main_mark_all_read -> { + lifecycleScope.launch { + AndroidDatabase.getDaoInstance(this@MainActivity).markAllRead(true) + } + true + } R.id.menu_main_settings -> { startActivity(Intent(this, SettingsActivity::class.java)) true diff --git a/app/src/main/java/net/underdesk/circolapp/adapters/CircularLetterAdapter.kt b/app/src/main/java/net/underdesk/circolapp/adapters/CircularLetterAdapter.kt index 9079a85..3810591 100644 --- a/app/src/main/java/net/underdesk/circolapp/adapters/CircularLetterAdapter.kt +++ b/app/src/main/java/net/underdesk/circolapp/adapters/CircularLetterAdapter.kt @@ -21,6 +21,7 @@ package net.underdesk.circolapp.adapters import android.app.PendingIntent import android.content.Context import android.content.Intent +import android.graphics.Typeface import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -85,6 +86,14 @@ class CircularLetterAdapter( holder.title.text = circulars[position].name holder.date.text = circulars[position].date + if (circulars[position].read) { + holder.number.typeface = Typeface.DEFAULT + holder.date.typeface = Typeface.DEFAULT + } else { + holder.number.typeface = Typeface.defaultFromStyle(Typeface.BOLD) + holder.date.typeface = Typeface.defaultFromStyle(Typeface.BOLD) + } + holder.favouriteButton.setImageResource( if (circulars[position].favourite) { holder.favouriteButton.contentDescription = @@ -154,6 +163,14 @@ class CircularLetterAdapter( } holder.viewButton.setOnClickListener { + adapterScope.launch { + AndroidDatabase.getDaoInstance(context).markRead( + circulars[position].id, + circulars[position].school, + true + ) + } + FileUtils.viewFile(circulars[position].url, context) } diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index 5f85753..3943628 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -12,6 +12,10 @@ android:id="@+id/menu_main_refresh" android:title="@string/menu_refresh" app:showAsAction="never" /> + diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 7a37860..2818300 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -9,6 +9,7 @@ Informazioni Cerca Aggiorna + Segna tutte le circolari come lette Generale Notifiche diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7e4e9ac..c4d2324 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,6 +9,7 @@ About Search Refresh + Mark all circulars as read General Notifications diff --git a/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/data/Circular.kt b/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/data/Circular.kt index 44eecf4..687f010 100644 --- a/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/data/Circular.kt +++ b/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/data/Circular.kt @@ -26,6 +26,7 @@ data class Circular( val date: String, var favourite: Boolean = false, var reminder: Boolean = false, + var read: Boolean = false, val attachmentsNames: MutableList = mutableListOf(), val attachmentsUrls: MutableList = mutableListOf() ) diff --git a/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/data/CircularDao.kt b/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/data/CircularDao.kt index a585dde..ce26d65 100644 --- a/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/data/CircularDao.kt +++ b/shared/src/commonMain/kotlin/net/underdesk/circolapp/shared/data/CircularDao.kt @@ -16,7 +16,7 @@ class CircularDao( private val appDatabaseQueries = database.appDatabaseQueries private val circularMapper = - { id: Long, school: Long, name: String, url: String, date: String, favourite: Long, reminder: Long, attachmentsNames: String, attachmentsUrls: String -> + { id: Long, school: Long, name: String, url: String, date: String, favourite: Long, reminder: Long, read: Long, attachmentsNames: String, attachmentsUrls: String -> Circular( id, school.toInt(), @@ -25,6 +25,7 @@ class CircularDao( date, favourite.toBoolean(), reminder.toBoolean(), + read.toBoolean(), attachmentsNames.toList(), attachmentsUrls.toList() ) @@ -40,6 +41,7 @@ class CircularDao( it.date, it.favourite.toLong(), it.reminder.toLong(), + it.read.toLong(), it.attachmentsNames.joinToString(), it.attachmentsUrls.joinToString() ) @@ -56,11 +58,28 @@ class CircularDao( ) } + suspend fun markRead(id: Long, school: Int, read: Boolean) = + withContext(PlatformDispatcher.IO) { + appDatabaseQueries.markCircularRead( + read.toLong(), + id, + school.toLong() + ) + } + + suspend fun markAllRead(read: Boolean) = + withContext(PlatformDispatcher.IO) { + appDatabaseQueries.markAllRead( + read.toLong() + ) + } + suspend fun deleteAll() = withContext(PlatformDispatcher.IO) { appDatabaseQueries.deleteAllCirculars() } - fun getCircular(id: Long, school: Int) = appDatabaseQueries.getCircular(id, school.toLong(), circularMapper).executeAsOne() + fun getCircular(id: Long, school: Int) = + appDatabaseQueries.getCircular(id, school.toLong(), circularMapper).executeAsOne() fun getCirculars(school: Int) = appDatabaseQueries.getCirculars(school.toLong(), circularMapper).executeAsList() diff --git a/shared/src/commonMain/sqldelight/net.underdesk.circolapp.shared.data/AppDatabase.sq b/shared/src/commonMain/sqldelight/net.underdesk.circolapp.shared.data/AppDatabase.sq index 656f335..b5b4303 100644 --- a/shared/src/commonMain/sqldelight/net.underdesk.circolapp.shared.data/AppDatabase.sq +++ b/shared/src/commonMain/sqldelight/net.underdesk.circolapp.shared.data/AppDatabase.sq @@ -6,20 +6,30 @@ CREATE TABLE Circulars ( date TEXT NOT NULL, favourite INTEGER NOT NULL DEFAULT 0, reminder INTEGER NOT NULL DEFAULT 0, + read INTEGER NOT NULL DEFAULT 0, attachmentsNames TEXT NOT NULL, attachmentsUrls TEXT NOT NULL, PRIMARY KEY (id, school) ); insertCircular: -INSERT OR IGNORE INTO Circulars(id, school, name, url, date, favourite, reminder, attachmentsNames, attachmentsUrls) -VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?); +INSERT OR IGNORE INTO Circulars(id, school, name, url, date, favourite, reminder, read, attachmentsNames, attachmentsUrls) +VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?); updateCircular: UPDATE Circulars SET favourite = ?, reminder = ? WHERE id = ? AND school = ?; +markCircularRead: +UPDATE Circulars +SET read = ? +WHERE id = ? AND school = ?; + +markAllRead: +UPDATE Circulars +SET read = ?; + deleteAllCirculars: DELETE FROM Circulars;