diff --git a/app/src/main/java/net/underdesk/circolapp/AlarmBroadcastReceiver.kt b/app/src/main/java/net/underdesk/circolapp/AlarmBroadcastReceiver.kt index 988bef3..f5eb41f 100644 --- a/app/src/main/java/net/underdesk/circolapp/AlarmBroadcastReceiver.kt +++ b/app/src/main/java/net/underdesk/circolapp/AlarmBroadcastReceiver.kt @@ -37,6 +37,7 @@ class AlarmBroadcastReceiver : BroadcastReceiver() { companion object { const val CHANNEL_ID = "net.underdesk.circolapp.REMINDER" const val CIRCULAR_ID = "circular_id" + const val SCHOOL_ID = "school_id" } override fun onReceive(context: Context, intent: Intent) { @@ -47,6 +48,10 @@ class AlarmBroadcastReceiver : BroadcastReceiver() { intent.getLongExtra( CIRCULAR_ID, 0 + ), + intent.getIntExtra( + SCHOOL_ID, + 0 ) ) createNotification( diff --git a/app/src/main/java/net/underdesk/circolapp/data/AppDatabase.kt b/app/src/main/java/net/underdesk/circolapp/data/AppDatabase.kt index 754fd16..23b5f06 100644 --- a/app/src/main/java/net/underdesk/circolapp/data/AppDatabase.kt +++ b/app/src/main/java/net/underdesk/circolapp/data/AppDatabase.kt @@ -24,7 +24,7 @@ import androidx.room.Room import androidx.room.RoomDatabase import androidx.room.TypeConverters -@Database(entities = [Circular::class], version = 1, exportSchema = false) +@Database(entities = [Circular::class], version = 2, exportSchema = false) @TypeConverters(Converters::class) abstract class AppDatabase : RoomDatabase() { abstract fun circularDao(): CircularDao @@ -42,7 +42,7 @@ abstract class AppDatabase : RoomDatabase() { context, AppDatabase::class.java, DATABASE_NAME - ).build().also { instance = it } + ).fallbackToDestructiveMigration().build().also { instance = it } } } } diff --git a/app/src/main/java/net/underdesk/circolapp/data/Circular.kt b/app/src/main/java/net/underdesk/circolapp/data/Circular.kt index 44cce8e..f7b1705 100644 --- a/app/src/main/java/net/underdesk/circolapp/data/Circular.kt +++ b/app/src/main/java/net/underdesk/circolapp/data/Circular.kt @@ -20,13 +20,13 @@ package net.underdesk.circolapp.data import android.os.Parcelable import androidx.room.Entity -import androidx.room.PrimaryKey import kotlinx.android.parcel.Parcelize @Parcelize -@Entity(tableName = "circulars") +@Entity(tableName = "circulars", primaryKeys = ["id", "school"]) data class Circular( - @PrimaryKey val id: Long, + val id: Long, + val school: Int, val name: String, val url: String, val date: String, diff --git a/app/src/main/java/net/underdesk/circolapp/data/CircularDao.kt b/app/src/main/java/net/underdesk/circolapp/data/CircularDao.kt index 16c1d6f..e5a79fb 100644 --- a/app/src/main/java/net/underdesk/circolapp/data/CircularDao.kt +++ b/app/src/main/java/net/underdesk/circolapp/data/CircularDao.kt @@ -23,29 +23,29 @@ import androidx.room.* @Dao interface CircularDao { - @Query("SELECT * FROM circulars ORDER BY id DESC") - fun getCirculars(): List + @Query("SELECT * FROM circulars WHERE school is :school ORDER BY id DESC") + fun getCirculars(school: Int): List - @Query("SELECT * FROM circulars ORDER BY id DESC") - fun getLiveCirculars(): LiveData> + @Query("SELECT * FROM circulars WHERE school is :school ORDER BY id DESC") + fun getLiveCirculars(school: Int): LiveData> - @Query("SELECT * FROM circulars WHERE name LIKE :query ORDER BY id DESC") - fun searchCirculars(query: String): LiveData> + @Query("SELECT * FROM circulars WHERE school is :school AND name LIKE :query ORDER BY id DESC") + fun searchCirculars(query: String, school: Int): LiveData> - @Query("SELECT * FROM circulars WHERE id = :id ORDER BY id DESC") - fun getCircular(id: Long): Circular + @Query("SELECT * FROM circulars WHERE school is :school AND id = :id ORDER BY id DESC") + fun getCircular(id: Long, school: Int): Circular - @Query("SELECT * FROM circulars WHERE favourite ORDER BY id DESC") - fun getFavourites(): LiveData> + @Query("SELECT * FROM circulars WHERE school is :school AND favourite ORDER BY id DESC") + fun getFavourites(school: Int): LiveData> - @Query("SELECT * FROM circulars WHERE favourite AND name LIKE :query ORDER BY id DESC") - fun searchFavourites(query: String): LiveData> + @Query("SELECT * FROM circulars WHERE school is :school AND favourite AND name LIKE :query ORDER BY id DESC") + fun searchFavourites(query: String, school: Int): LiveData> - @Query("SELECT * FROM circulars WHERE reminder ORDER BY id DESC") - fun getReminders(): LiveData> + @Query("SELECT * FROM circulars WHERE school is :school AND reminder ORDER BY id DESC") + fun getReminders(school: Int): LiveData> - @Query("SELECT * FROM circulars WHERE reminder AND name LIKE :query ORDER BY id DESC") - fun searchReminders(query: String): LiveData> + @Query("SELECT * FROM circulars WHERE school is :school AND reminder AND name LIKE :query ORDER BY id DESC") + fun searchReminders(query: String, school: Int): LiveData> @Insert(onConflict = OnConflictStrategy.IGNORE) fun insertAll(circulars: List) diff --git a/app/src/main/java/net/underdesk/circolapp/data/CircularRepository.kt b/app/src/main/java/net/underdesk/circolapp/data/CircularRepository.kt index a2afb41..5a04edc 100644 --- a/app/src/main/java/net/underdesk/circolapp/data/CircularRepository.kt +++ b/app/src/main/java/net/underdesk/circolapp/data/CircularRepository.kt @@ -16,7 +16,7 @@ class CircularRepository( if (result.second == ServerAPI.Companion.Result.ERROR) return@withContext Pair(emptyList(), false) - val oldCirculars = circularDao.getCirculars() + val oldCirculars = circularDao.getCirculars(serverAPI.serverID()) val newCirculars = result.first if (newCirculars.size != oldCirculars.size) { diff --git a/app/src/main/java/net/underdesk/circolapp/fragments/CircularLetterFragment.kt b/app/src/main/java/net/underdesk/circolapp/fragments/CircularLetterFragment.kt index 9521e50..cf9a529 100644 --- a/app/src/main/java/net/underdesk/circolapp/fragments/CircularLetterFragment.kt +++ b/app/src/main/java/net/underdesk/circolapp/fragments/CircularLetterFragment.kt @@ -48,7 +48,8 @@ class CircularLetterFragment : CircularRepository.getInstance( AppDatabase.getInstance(requireContext()).circularDao(), ServerAPI.getInstance(requireContext()) - ) + ), + requireActivity().application ) } diff --git a/app/src/main/java/net/underdesk/circolapp/fragments/FavouritesFragment.kt b/app/src/main/java/net/underdesk/circolapp/fragments/FavouritesFragment.kt index fbf1d1e..5108909 100644 --- a/app/src/main/java/net/underdesk/circolapp/fragments/FavouritesFragment.kt +++ b/app/src/main/java/net/underdesk/circolapp/fragments/FavouritesFragment.kt @@ -42,7 +42,8 @@ class FavouritesFragment : Fragment(), MainActivity.SearchCallback { CircularRepository.getInstance( AppDatabase.getInstance(requireContext()).circularDao(), ServerAPI.getInstance(requireContext()) - ) + ), + requireActivity().application ) } diff --git a/app/src/main/java/net/underdesk/circolapp/fragments/NewReminderFragment.kt b/app/src/main/java/net/underdesk/circolapp/fragments/NewReminderFragment.kt index 181884c..5bd4e1e 100644 --- a/app/src/main/java/net/underdesk/circolapp/fragments/NewReminderFragment.kt +++ b/app/src/main/java/net/underdesk/circolapp/fragments/NewReminderFragment.kt @@ -112,7 +112,8 @@ class NewReminderFragment : DialogFragment() { context, circular.id.toInt(), Intent(context, AlarmBroadcastReceiver::class.java) - .putExtra(AlarmBroadcastReceiver.CIRCULAR_ID, circular.id), + .putExtra(AlarmBroadcastReceiver.CIRCULAR_ID, circular.id) + .putExtra(AlarmBroadcastReceiver.SCHOOL_ID, circular.school), 0 ) diff --git a/app/src/main/java/net/underdesk/circolapp/fragments/RemindersFragment.kt b/app/src/main/java/net/underdesk/circolapp/fragments/RemindersFragment.kt index e553c00..43bafe8 100644 --- a/app/src/main/java/net/underdesk/circolapp/fragments/RemindersFragment.kt +++ b/app/src/main/java/net/underdesk/circolapp/fragments/RemindersFragment.kt @@ -42,7 +42,8 @@ class RemindersFragment : Fragment(), MainActivity.SearchCallback { CircularRepository.getInstance( AppDatabase.getInstance(requireContext()).circularDao(), ServerAPI.getInstance(requireContext()) - ) + ), + requireActivity().application ) } diff --git a/app/src/main/java/net/underdesk/circolapp/server/Server.kt b/app/src/main/java/net/underdesk/circolapp/server/Server.kt index 9fa61be..18aa92c 100644 --- a/app/src/main/java/net/underdesk/circolapp/server/Server.kt +++ b/app/src/main/java/net/underdesk/circolapp/server/Server.kt @@ -21,6 +21,7 @@ package net.underdesk.circolapp.server import net.underdesk.circolapp.data.Circular abstract class Server { + abstract val serverID: Int abstract suspend fun getCircularsFromServer(): Pair, ServerAPI.Companion.Result> abstract suspend fun newCircularsAvailable(): Pair } diff --git a/app/src/main/java/net/underdesk/circolapp/server/ServerAPI.kt b/app/src/main/java/net/underdesk/circolapp/server/ServerAPI.kt index a383458..b736c05 100644 --- a/app/src/main/java/net/underdesk/circolapp/server/ServerAPI.kt +++ b/app/src/main/java/net/underdesk/circolapp/server/ServerAPI.kt @@ -27,6 +27,8 @@ import net.underdesk.circolapp.server.porporato.PorporatoServer class ServerAPI( private var server: Server ) { + fun serverID(): Int = server.serverID + suspend fun getCircularsFromServer(): Pair, Result> { val newCircularsAvailable = server.newCircularsAvailable() @@ -52,6 +54,10 @@ class ServerAPI( SUCCESS, ERROR } + fun getServerId(server: Servers): Int { + return Servers.values().indexOf(server) + } + fun getServerName(server: Servers) = when (server) { Servers.CURIE -> "Liceo scientifico Maria Curie" Servers.PORPORATO -> "Liceo G.F. Porporato" diff --git a/app/src/main/java/net/underdesk/circolapp/server/curie/CurieServer.kt b/app/src/main/java/net/underdesk/circolapp/server/curie/CurieServer.kt index 628293c..8e80d18 100644 --- a/app/src/main/java/net/underdesk/circolapp/server/curie/CurieServer.kt +++ b/app/src/main/java/net/underdesk/circolapp/server/curie/CurieServer.kt @@ -18,6 +18,8 @@ class CurieServer : Server() { private val responseAdapter = moshi.adapter(Response::class.java) private val client = OkHttpClient() + override val serverID = ServerAPI.getServerId(ServerAPI.Companion.Servers.CURIE) + override suspend fun getCircularsFromServer(): Pair, ServerAPI.Companion.Result> { return try { withContext(Dispatchers.Default) { @@ -85,9 +87,9 @@ class CurieServer : Server() { .removePrefix("_") .removePrefix(" ") - Circular(id.toLong(), title, url, matcherDate.group(1) ?: "") + Circular(id.toLong(), serverID, title, url, matcherDate.group(1) ?: "") } else { - Circular(id.toLong(), title, url, "") + Circular(id.toLong(), serverID, title, url, "") } } diff --git a/app/src/main/java/net/underdesk/circolapp/server/porporato/PorporatoServer.kt b/app/src/main/java/net/underdesk/circolapp/server/porporato/PorporatoServer.kt index 2e7d93b..d3b6397 100644 --- a/app/src/main/java/net/underdesk/circolapp/server/porporato/PorporatoServer.kt +++ b/app/src/main/java/net/underdesk/circolapp/server/porporato/PorporatoServer.kt @@ -30,6 +30,8 @@ class PorporatoServer : Server() { "https://www.liceoporporato.edu.it/ARCHIVIO/PR/VP/circolari.php?dirname=CIRCOLARIP/- CIRCOLARI 2020-21/-12-Agosto/" ) + override val serverID = ServerAPI.getServerId(ServerAPI.Companion.Servers.PORPORATO) + override suspend fun getCircularsFromServer(): Pair, ServerAPI.Companion.Result> { return try { val list = arrayListOf() @@ -150,9 +152,9 @@ class PorporatoServer : Server() { title = title.removeRange(matcherDate.start(), matcherDate.end()) .removeSuffix(" (pubb.: )") - Circular(id, title, fullUrl, matcherDate.group(1)?.replace("-", "/") ?: "") + Circular(id, serverID, title, fullUrl, matcherDate.group(1)?.replace("-", "/") ?: "") } else { - Circular(id, title, fullUrl, "") + Circular(id, serverID, title, fullUrl, "") } } } diff --git a/app/src/main/java/net/underdesk/circolapp/utils/DoubleTrigger.kt b/app/src/main/java/net/underdesk/circolapp/utils/DoubleTrigger.kt new file mode 100644 index 0000000..65fa529 --- /dev/null +++ b/app/src/main/java/net/underdesk/circolapp/utils/DoubleTrigger.kt @@ -0,0 +1,12 @@ +package net.underdesk.circolapp.utils + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MediatorLiveData + +// Taken from https://stackoverflow.com/questions/49493772/mediatorlivedata-or-switchmap-transformation-with-multiple-parameters +class DoubleTrigger(a: LiveData, b: LiveData) : MediatorLiveData>() { + init { + addSource(a) { value = it to b.value } + addSource(b) { value = a.value to it } + } +} diff --git a/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModel.kt b/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModel.kt index 91c3caf..e78ca54 100644 --- a/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModel.kt +++ b/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModel.kt @@ -18,26 +18,42 @@ package net.underdesk.circolapp.viewmodels +import android.app.Application +import android.content.SharedPreferences import androidx.lifecycle.* +import androidx.preference.PreferenceManager import kotlinx.coroutines.launch import net.underdesk.circolapp.data.Circular import net.underdesk.circolapp.data.CircularRepository +import net.underdesk.circolapp.utils.DoubleTrigger class CircularLetterViewModel internal constructor( - private val circularRepository: CircularRepository -) : ViewModel() { + private val circularRepository: CircularRepository, + application: Application +) : AndroidViewModel(application), SharedPreferences.OnSharedPreferenceChangeListener { + private val preferenceManager = PreferenceManager.getDefaultSharedPreferences(application) + + private val schoolID = + MutableLiveData(preferenceManager.getString("school", "0")?.toInt() ?: 0) + init { updateCirculars() + + preferenceManager.registerOnSharedPreferenceChangeListener(this) } val query = MutableLiveData("") - val circulars: LiveData> = Transformations.switchMap(query) { input -> - if (input == null || input == "") { - circularRepository.circularDao.getLiveCirculars() - } else { - circularRepository.circularDao.searchCirculars("%$input%") + val circulars: LiveData> = + Transformations.switchMap(DoubleTrigger(query, schoolID)) { input -> + if (input.first == null || input.first == "") { + circularRepository.circularDao.getLiveCirculars(input.second ?: 0) + } else { + circularRepository.circularDao.searchCirculars( + "%${input.first}%", + input.second ?: 0 + ) + } } - } val showMessage = MutableLiveData().apply { value = false } val circularsUpdated = MutableLiveData().apply { value = false } @@ -57,4 +73,9 @@ class CircularLetterViewModel internal constructor( } } } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + if (key == "school") + schoolID.postValue(preferenceManager.getString("school", "0")?.toInt() ?: 0) + } } diff --git a/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModelFactory.kt b/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModelFactory.kt index d8b5caf..5e29acd 100644 --- a/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModelFactory.kt +++ b/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModelFactory.kt @@ -1,15 +1,17 @@ package net.underdesk.circolapp.viewmodels +import android.app.Application import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import net.underdesk.circolapp.data.CircularRepository class CircularLetterViewModelFactory( - private val circularRepository: CircularRepository -) : ViewModelProvider.Factory { + private val circularRepository: CircularRepository, + val application: Application +) : ViewModelProvider.AndroidViewModelFactory(application) { @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T { - return CircularLetterViewModel(circularRepository) as T + return CircularLetterViewModel(circularRepository, application) as T } } diff --git a/app/src/main/java/net/underdesk/circolapp/viewmodels/FavouritesViewModel.kt b/app/src/main/java/net/underdesk/circolapp/viewmodels/FavouritesViewModel.kt index ca1dd83..c412a3b 100644 --- a/app/src/main/java/net/underdesk/circolapp/viewmodels/FavouritesViewModel.kt +++ b/app/src/main/java/net/underdesk/circolapp/viewmodels/FavouritesViewModel.kt @@ -18,22 +18,45 @@ package net.underdesk.circolapp.viewmodels +import android.app.Application +import android.content.SharedPreferences +import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Transformations -import androidx.lifecycle.ViewModel +import androidx.preference.PreferenceManager import net.underdesk.circolapp.data.Circular import net.underdesk.circolapp.data.CircularRepository +import net.underdesk.circolapp.utils.DoubleTrigger class FavouritesViewModel internal constructor( - private val circularRepository: CircularRepository -) : ViewModel() { + private val circularRepository: CircularRepository, + application: Application +) : AndroidViewModel(application), SharedPreferences.OnSharedPreferenceChangeListener { + private val preferenceManager = PreferenceManager.getDefaultSharedPreferences(application) + + private val schoolID = + MutableLiveData(preferenceManager.getString("school", "0")?.toInt() ?: 0) + + init { + preferenceManager.registerOnSharedPreferenceChangeListener(this) + } + val query = MutableLiveData("") - val circulars: LiveData> = Transformations.switchMap(query) { input -> - if (input == null || input == "") { - circularRepository.circularDao.getFavourites() - } else { - circularRepository.circularDao.searchFavourites("%$input%") + val circulars: LiveData> = + Transformations.switchMap(DoubleTrigger(query, schoolID)) { input -> + if (input.first == null || input.first == "") { + circularRepository.circularDao.getFavourites(input.second ?: 0) + } else { + circularRepository.circularDao.searchFavourites( + "%${input.first}%", + input.second ?: 0 + ) + } } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + if (key == "school") + schoolID.postValue(preferenceManager.getString("school", "0")?.toInt() ?: 0) } } diff --git a/app/src/main/java/net/underdesk/circolapp/viewmodels/FavouritesViewModelFactory.kt b/app/src/main/java/net/underdesk/circolapp/viewmodels/FavouritesViewModelFactory.kt index a1881a0..4636eb9 100644 --- a/app/src/main/java/net/underdesk/circolapp/viewmodels/FavouritesViewModelFactory.kt +++ b/app/src/main/java/net/underdesk/circolapp/viewmodels/FavouritesViewModelFactory.kt @@ -1,15 +1,17 @@ package net.underdesk.circolapp.viewmodels +import android.app.Application import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import net.underdesk.circolapp.data.CircularRepository class FavouritesViewModelFactory( - private val circularRepository: CircularRepository -) : ViewModelProvider.Factory { + private val circularRepository: CircularRepository, + val application: Application +) : ViewModelProvider.AndroidViewModelFactory(application) { @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T { - return FavouritesViewModel(circularRepository) as T + return FavouritesViewModel(circularRepository, application) as T } } diff --git a/app/src/main/java/net/underdesk/circolapp/viewmodels/RemindersViewModel.kt b/app/src/main/java/net/underdesk/circolapp/viewmodels/RemindersViewModel.kt index b95bcc5..092cf36 100644 --- a/app/src/main/java/net/underdesk/circolapp/viewmodels/RemindersViewModel.kt +++ b/app/src/main/java/net/underdesk/circolapp/viewmodels/RemindersViewModel.kt @@ -18,22 +18,45 @@ package net.underdesk.circolapp.viewmodels +import android.app.Application +import android.content.SharedPreferences +import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Transformations -import androidx.lifecycle.ViewModel +import androidx.preference.PreferenceManager import net.underdesk.circolapp.data.Circular import net.underdesk.circolapp.data.CircularRepository +import net.underdesk.circolapp.utils.DoubleTrigger class RemindersViewModel internal constructor( - private val circularRepository: CircularRepository -) : ViewModel() { + private val circularRepository: CircularRepository, + application: Application +) : AndroidViewModel(application), SharedPreferences.OnSharedPreferenceChangeListener { + private val preferenceManager = PreferenceManager.getDefaultSharedPreferences(application) + + private val schoolID = + MutableLiveData(preferenceManager.getString("school", "0")?.toInt() ?: 0) + + init { + preferenceManager.registerOnSharedPreferenceChangeListener(this) + } + val query = MutableLiveData("") - val circulars: LiveData> = Transformations.switchMap(query) { input -> - if (input == null || input == "") { - circularRepository.circularDao.getReminders() - } else { - circularRepository.circularDao.searchReminders("%$input%") + val circulars: LiveData> = + Transformations.switchMap(DoubleTrigger(query, schoolID)) { input -> + if (input.first == null || input.first == "") { + circularRepository.circularDao.getReminders(input.second ?: 0) + } else { + circularRepository.circularDao.searchReminders( + "%${input.first}%", + input.second ?: 0 + ) + } } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + if (key == "school") + schoolID.postValue(preferenceManager.getString("school", "0")?.toInt() ?: 0) } } diff --git a/app/src/main/java/net/underdesk/circolapp/viewmodels/RemindersViewModelFactory.kt b/app/src/main/java/net/underdesk/circolapp/viewmodels/RemindersViewModelFactory.kt index 29eca4e..af831ce 100644 --- a/app/src/main/java/net/underdesk/circolapp/viewmodels/RemindersViewModelFactory.kt +++ b/app/src/main/java/net/underdesk/circolapp/viewmodels/RemindersViewModelFactory.kt @@ -1,15 +1,17 @@ package net.underdesk.circolapp.viewmodels +import android.app.Application import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import net.underdesk.circolapp.data.CircularRepository class RemindersViewModelFactory( - private val circularRepository: CircularRepository -) : ViewModelProvider.Factory { + private val circularRepository: CircularRepository, + val application: Application +) : ViewModelProvider.AndroidViewModelFactory(application) { @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T { - return RemindersViewModel(circularRepository) as T + return RemindersViewModel(circularRepository, application) as T } }