From 54aca078d85f9a1931b7bf48713ea97de8849841 Mon Sep 17 00:00:00 2001 From: Matte23 Date: Mon, 23 Sep 2019 17:33:02 +0200 Subject: [PATCH] Add search functionality --- .../net/underdesk/circolapp/MainActivity.kt | 21 +++++++++++++++++++ .../underdesk/circolapp/data/CircularDao.kt | 9 ++++++++ .../fragments/CircularLetterFragment.kt | 8 ++++++- .../circolapp/fragments/FavouritesFragment.kt | 8 ++++++- .../circolapp/fragments/RemindersFragment.kt | 8 ++++++- .../viewmodels/CircularLetterViewModel.kt | 11 ++++++++-- .../viewmodels/FavouritesViewModel.kt | 12 +++++++++-- .../viewmodels/RemindersViewModel.kt | 12 +++++++++-- .../res/drawable/ic_search_black_24dp.xml | 9 ++++++++ app/src/main/res/menu/menu_main.xml | 9 +++++++- app/src/main/res/values/strings.xml | 1 + 11 files changed, 98 insertions(+), 10 deletions(-) create mode 100644 app/src/main/res/drawable/ic_search_black_24dp.xml diff --git a/app/src/main/java/net/underdesk/circolapp/MainActivity.kt b/app/src/main/java/net/underdesk/circolapp/MainActivity.kt index 418270c..7e33e75 100644 --- a/app/src/main/java/net/underdesk/circolapp/MainActivity.kt +++ b/app/src/main/java/net/underdesk/circolapp/MainActivity.kt @@ -29,6 +29,7 @@ import android.view.Menu import android.view.MenuItem import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.SearchView import androidx.navigation.findNavController import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.setupActionBarWithNavController @@ -46,6 +47,7 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback internal const val PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 10 } + var searchCallback: SearchCallback? = null override var circularToDownload: Circular? = null override fun onCreate(savedInstanceState: Bundle?) { @@ -80,6 +82,21 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.menu_main, menu) + + (menu.findItem(R.id.menu_main_search).actionView as SearchView).setOnQueryTextListener( + object : SearchView.OnQueryTextListener { + + override fun onQueryTextSubmit(query: String): Boolean { + searchCallback?.search(query) + return false + } + + override fun onQueryTextChange(query: String): Boolean { + searchCallback?.search(query) + return false + } + }) + return true } @@ -151,4 +168,8 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback builder.create().show() } + + interface SearchCallback { + fun search(query: 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 16e6f27..66408d2 100644 --- a/app/src/main/java/net/underdesk/circolapp/data/CircularDao.kt +++ b/app/src/main/java/net/underdesk/circolapp/data/CircularDao.kt @@ -29,15 +29,24 @@ interface CircularDao { @Query("SELECT * FROM circulars ORDER BY id DESC") fun getLiveCirculars(): LiveData> + @Query("SELECT * FROM circulars WHERE name LIKE :query ORDER BY id DESC") + fun searchCirculars(query: String): LiveData> + @Query("SELECT * FROM circulars WHERE id = :id ORDER BY id DESC") fun getCircular(id: Long): Circular @Query("SELECT * FROM circulars WHERE favourite ORDER BY id DESC") fun getFavourites(): 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 reminder ORDER BY id DESC") fun getReminders(): LiveData> + @Query("SELECT * FROM circulars WHERE reminder AND name LIKE :query ORDER BY id DESC") + fun searchReminders(query: String): LiveData> + @Insert(onConflict = OnConflictStrategy.REPLACE) fun insertAll(circulars: List) 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 9baf54f..4f2f060 100644 --- a/app/src/main/java/net/underdesk/circolapp/fragments/CircularLetterFragment.kt +++ b/app/src/main/java/net/underdesk/circolapp/fragments/CircularLetterFragment.kt @@ -34,7 +34,7 @@ import net.underdesk.circolapp.R import net.underdesk.circolapp.adapters.CircularLetterAdapter import net.underdesk.circolapp.viewmodels.CircularLetterViewModel -class CircularLetterFragment : Fragment() { +class CircularLetterFragment : Fragment(), MainActivity.SearchCallback { private lateinit var circularLetterViewModel: CircularLetterViewModel @@ -67,6 +67,12 @@ class CircularLetterFragment : Fragment() { circularLetterViewModel.showMessage.postValue(false) } }) + + (activity as MainActivity).searchCallback = this return root } + + override fun search(query: String) { + circularLetterViewModel.query.postValue(query) + } } \ No newline at end of file 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 f5630a8..bae49ba 100644 --- a/app/src/main/java/net/underdesk/circolapp/fragments/FavouritesFragment.kt +++ b/app/src/main/java/net/underdesk/circolapp/fragments/FavouritesFragment.kt @@ -32,7 +32,7 @@ import net.underdesk.circolapp.R import net.underdesk.circolapp.adapters.CircularLetterAdapter import net.underdesk.circolapp.viewmodels.FavouritesViewModel -class FavouritesFragment : Fragment() { +class FavouritesFragment : Fragment(), MainActivity.SearchCallback { private lateinit var favouritesViewModel: FavouritesViewModel @@ -54,6 +54,12 @@ class FavouritesFragment : Fragment() { (root.circulars_list.adapter as CircularLetterAdapter).changeDataSet(it) } }) + + (activity as MainActivity).searchCallback = this return root } + + override fun search(query: String) { + favouritesViewModel.query.postValue(query) + } } \ No newline at end of file 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 886a517..e02374c 100644 --- a/app/src/main/java/net/underdesk/circolapp/fragments/RemindersFragment.kt +++ b/app/src/main/java/net/underdesk/circolapp/fragments/RemindersFragment.kt @@ -32,7 +32,7 @@ import net.underdesk.circolapp.R import net.underdesk.circolapp.adapters.CircularLetterAdapter import net.underdesk.circolapp.viewmodels.RemindersViewModel -class RemindersFragment : Fragment() { +class RemindersFragment : Fragment(), MainActivity.SearchCallback { private lateinit var remindersViewModel: RemindersViewModel @@ -54,6 +54,12 @@ class RemindersFragment : Fragment() { (root.circulars_list.adapter as CircularLetterAdapter).changeDataSet(it) } }) + + (activity as MainActivity).searchCallback = this return root } + + override fun search(query: String) { + remindersViewModel.query.postValue(query) + } } \ No newline at end of file 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 e5f902d..76a6925 100644 --- a/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModel.kt +++ b/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModel.kt @@ -22,6 +22,7 @@ import android.app.Application import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.Transformations import net.underdesk.circolapp.data.AppDatabase import net.underdesk.circolapp.data.Circular import net.underdesk.circolapp.server.DataFetcher @@ -36,8 +37,14 @@ class CircularLetterViewModel(application: Application) : AndroidViewModel(appli }.start() } - val circulars: LiveData> = - AppDatabase.getInstance(getApplication()).circularDao().getLiveCirculars() + val query = MutableLiveData("") + val circulars: LiveData> = Transformations.switchMap(query) { input -> + if (input == null || input == "") { + AppDatabase.getInstance(getApplication()).circularDao().getLiveCirculars() + } else { + AppDatabase.getInstance(getApplication()).circularDao().searchCirculars("%$input%") + } + } val showMessage = MutableLiveData().apply { value = false } 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 5c1ee26..db6ef10 100644 --- a/app/src/main/java/net/underdesk/circolapp/viewmodels/FavouritesViewModel.kt +++ b/app/src/main/java/net/underdesk/circolapp/viewmodels/FavouritesViewModel.kt @@ -21,10 +21,18 @@ package net.underdesk.circolapp.viewmodels import android.app.Application import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.Transformations import net.underdesk.circolapp.data.AppDatabase import net.underdesk.circolapp.data.Circular class FavouritesViewModel(application: Application) : AndroidViewModel(application) { - val circulars: LiveData> = - AppDatabase.getInstance(getApplication()).circularDao().getFavourites() + val query = MutableLiveData("") + val circulars: LiveData> = Transformations.switchMap(query) { input -> + if (input == null || input == "") { + AppDatabase.getInstance(getApplication()).circularDao().getFavourites() + } else { + AppDatabase.getInstance(getApplication()).circularDao().searchFavourites("%$input%") + } + } } \ No newline at end of file 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 827b743..2f96e79 100644 --- a/app/src/main/java/net/underdesk/circolapp/viewmodels/RemindersViewModel.kt +++ b/app/src/main/java/net/underdesk/circolapp/viewmodels/RemindersViewModel.kt @@ -21,10 +21,18 @@ package net.underdesk.circolapp.viewmodels import android.app.Application import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.Transformations import net.underdesk.circolapp.data.AppDatabase import net.underdesk.circolapp.data.Circular class RemindersViewModel(application: Application) : AndroidViewModel(application) { - val circulars: LiveData> = - AppDatabase.getInstance(getApplication()).circularDao().getReminders() + val query = MutableLiveData("") + val circulars: LiveData> = Transformations.switchMap(query) { input -> + if (input == null || input == "") { + AppDatabase.getInstance(getApplication()).circularDao().getReminders() + } else { + AppDatabase.getInstance(getApplication()).circularDao().searchReminders("%$input%") + } + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_search_black_24dp.xml b/app/src/main/res/drawable/ic_search_black_24dp.xml new file mode 100644 index 0000000..d23ea57 --- /dev/null +++ b/app/src/main/res/drawable/ic_search_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml index ae71f2f..694502e 100644 --- a/app/src/main/res/menu/menu_main.xml +++ b/app/src/main/res/menu/menu_main.xml @@ -1,6 +1,13 @@ - + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 16b9772..4ef882e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,6 +6,7 @@ Third party licenses About + Search Circular letter number %1$d New circulars published