Highlight unread circulars on Android

This commit is contained in:
Matte23
2021-01-10 13:24:09 +01:00
parent 571e58095b
commit ca0ebc8e2c
8 changed files with 66 additions and 4 deletions

View File

@@ -30,6 +30,7 @@ import android.view.MenuItem
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SearchView
import androidx.lifecycle.lifecycleScope
import androidx.navigation.findNavController import androidx.navigation.findNavController
import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.AppBarConfiguration
import androidx.navigation.ui.setupActionBarWithNavController 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.bottomnavigation.BottomNavigationView
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.mikepenz.aboutlibraries.LibsBuilder import com.mikepenz.aboutlibraries.LibsBuilder
import kotlinx.coroutines.launch
import net.underdesk.circolapp.adapters.CircularLetterAdapter import net.underdesk.circolapp.adapters.CircularLetterAdapter
import net.underdesk.circolapp.data.AndroidDatabase
import net.underdesk.circolapp.databinding.ActivityMainBinding import net.underdesk.circolapp.databinding.ActivityMainBinding
import net.underdesk.circolapp.utils.DownloadableFile import net.underdesk.circolapp.utils.DownloadableFile
import net.underdesk.circolapp.works.PollWork import net.underdesk.circolapp.works.PollWork
@@ -113,6 +116,12 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
refreshCallback?.refresh() refreshCallback?.refresh()
true true
} }
R.id.menu_main_mark_all_read -> {
lifecycleScope.launch {
AndroidDatabase.getDaoInstance(this@MainActivity).markAllRead(true)
}
true
}
R.id.menu_main_settings -> { R.id.menu_main_settings -> {
startActivity(Intent(this, SettingsActivity::class.java)) startActivity(Intent(this, SettingsActivity::class.java))
true true

View File

@@ -21,6 +21,7 @@ package net.underdesk.circolapp.adapters
import android.app.PendingIntent import android.app.PendingIntent
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.graphics.Typeface
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
@@ -85,6 +86,14 @@ class CircularLetterAdapter(
holder.title.text = circulars[position].name holder.title.text = circulars[position].name
holder.date.text = circulars[position].date 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( holder.favouriteButton.setImageResource(
if (circulars[position].favourite) { if (circulars[position].favourite) {
holder.favouriteButton.contentDescription = holder.favouriteButton.contentDescription =
@@ -154,6 +163,14 @@ class CircularLetterAdapter(
} }
holder.viewButton.setOnClickListener { holder.viewButton.setOnClickListener {
adapterScope.launch {
AndroidDatabase.getDaoInstance(context).markRead(
circulars[position].id,
circulars[position].school,
true
)
}
FileUtils.viewFile(circulars[position].url, context) FileUtils.viewFile(circulars[position].url, context)
} }

View File

@@ -12,6 +12,10 @@
android:id="@+id/menu_main_refresh" android:id="@+id/menu_main_refresh"
android:title="@string/menu_refresh" android:title="@string/menu_refresh"
app:showAsAction="never" /> app:showAsAction="never" />
<item
android:id="@+id/menu_main_mark_all_read"
android:title="@string/menu_mark_all_read"
app:showAsAction="never" />
<item <item
android:id="@+id/menu_main_settings" android:id="@+id/menu_main_settings"
android:title="@string/title_settings" /> android:title="@string/title_settings" />

View File

@@ -9,6 +9,7 @@
<string name="menu_about">Informazioni</string> <string name="menu_about">Informazioni</string>
<string name="menu_search">Cerca</string> <string name="menu_search">Cerca</string>
<string name="menu_refresh">Aggiorna</string> <string name="menu_refresh">Aggiorna</string>
<string name="menu_mark_all_read">Segna tutte le circolari come lette</string>
<string name="preferences_general_header">Generale</string> <string name="preferences_general_header">Generale</string>
<string name="preference_notifications_header">Notifiche</string> <string name="preference_notifications_header">Notifiche</string>

View File

@@ -9,6 +9,7 @@
<string name="menu_about">About</string> <string name="menu_about">About</string>
<string name="menu_search">Search</string> <string name="menu_search">Search</string>
<string name="menu_refresh">Refresh</string> <string name="menu_refresh">Refresh</string>
<string name="menu_mark_all_read">Mark all circulars as read</string>
<string name="preferences_general_header">General</string> <string name="preferences_general_header">General</string>
<string name="preference_notifications_header">Notifications</string> <string name="preference_notifications_header">Notifications</string>

View File

@@ -26,6 +26,7 @@ data class Circular(
val date: String, val date: String,
var favourite: Boolean = false, var favourite: Boolean = false,
var reminder: Boolean = false, var reminder: Boolean = false,
var read: Boolean = false,
val attachmentsNames: MutableList<String> = mutableListOf(), val attachmentsNames: MutableList<String> = mutableListOf(),
val attachmentsUrls: MutableList<String> = mutableListOf() val attachmentsUrls: MutableList<String> = mutableListOf()
) )

View File

@@ -16,7 +16,7 @@ class CircularDao(
private val appDatabaseQueries = database.appDatabaseQueries private val appDatabaseQueries = database.appDatabaseQueries
private val circularMapper = 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( Circular(
id, id,
school.toInt(), school.toInt(),
@@ -25,6 +25,7 @@ class CircularDao(
date, date,
favourite.toBoolean(), favourite.toBoolean(),
reminder.toBoolean(), reminder.toBoolean(),
read.toBoolean(),
attachmentsNames.toList(), attachmentsNames.toList(),
attachmentsUrls.toList() attachmentsUrls.toList()
) )
@@ -40,6 +41,7 @@ class CircularDao(
it.date, it.date,
it.favourite.toLong(), it.favourite.toLong(),
it.reminder.toLong(), it.reminder.toLong(),
it.read.toLong(),
it.attachmentsNames.joinToString(), it.attachmentsNames.joinToString(),
it.attachmentsUrls.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) { suspend fun deleteAll() = withContext(PlatformDispatcher.IO) {
appDatabaseQueries.deleteAllCirculars() 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) = fun getCirculars(school: Int) =
appDatabaseQueries.getCirculars(school.toLong(), circularMapper).executeAsList() appDatabaseQueries.getCirculars(school.toLong(), circularMapper).executeAsList()

View File

@@ -6,20 +6,30 @@ CREATE TABLE Circulars (
date TEXT NOT NULL, date TEXT NOT NULL,
favourite INTEGER NOT NULL DEFAULT 0, favourite INTEGER NOT NULL DEFAULT 0,
reminder INTEGER NOT NULL DEFAULT 0, reminder INTEGER NOT NULL DEFAULT 0,
read INTEGER NOT NULL DEFAULT 0,
attachmentsNames TEXT NOT NULL, attachmentsNames TEXT NOT NULL,
attachmentsUrls TEXT NOT NULL, attachmentsUrls TEXT NOT NULL,
PRIMARY KEY (id, school) PRIMARY KEY (id, school)
); );
insertCircular: insertCircular:
INSERT OR IGNORE INTO Circulars(id, school, name, url, date, favourite, reminder, attachmentsNames, attachmentsUrls) INSERT OR IGNORE INTO Circulars(id, school, name, url, date, favourite, reminder, read, attachmentsNames, attachmentsUrls)
VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?); VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
updateCircular: updateCircular:
UPDATE Circulars UPDATE Circulars
SET favourite = ?, reminder = ? SET favourite = ?, reminder = ?
WHERE id = ? AND school = ?; WHERE id = ? AND school = ?;
markCircularRead:
UPDATE Circulars
SET read = ?
WHERE id = ? AND school = ?;
markAllRead:
UPDATE Circulars
SET read = ?;
deleteAllCirculars: deleteAllCirculars:
DELETE FROM Circulars; DELETE FROM Circulars;