mirror of
https://github.com/Matte23/circolapp.git
synced 2025-12-06 07:29:10 +00:00
Add search functionality
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,15 +29,24 @@ interface CircularDao {
|
||||
@Query("SELECT * FROM circulars ORDER BY id DESC")
|
||||
fun getLiveCirculars(): LiveData<List<Circular>>
|
||||
|
||||
@Query("SELECT * FROM circulars WHERE name LIKE :query ORDER BY id DESC")
|
||||
fun searchCirculars(query: String): LiveData<List<Circular>>
|
||||
|
||||
@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<List<Circular>>
|
||||
|
||||
@Query("SELECT * FROM circulars WHERE favourite AND name LIKE :query ORDER BY id DESC")
|
||||
fun searchFavourites(query: String): LiveData<List<Circular>>
|
||||
|
||||
@Query("SELECT * FROM circulars WHERE reminder ORDER BY id DESC")
|
||||
fun getReminders(): LiveData<List<Circular>>
|
||||
|
||||
@Query("SELECT * FROM circulars WHERE reminder AND name LIKE :query ORDER BY id DESC")
|
||||
fun searchReminders(query: String): LiveData<List<Circular>>
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
fun insertAll(circulars: List<Circular>)
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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<List<Circular>> =
|
||||
val query = MutableLiveData<String>("")
|
||||
val circulars: LiveData<List<Circular>> = Transformations.switchMap(query) { input ->
|
||||
if (input == null || input == "") {
|
||||
AppDatabase.getInstance(getApplication()).circularDao().getLiveCirculars()
|
||||
} else {
|
||||
AppDatabase.getInstance(getApplication()).circularDao().searchCirculars("%$input%")
|
||||
}
|
||||
}
|
||||
|
||||
val showMessage = MutableLiveData<Boolean>().apply { value = false }
|
||||
|
||||
|
||||
@@ -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<List<Circular>> =
|
||||
val query = MutableLiveData<String>("")
|
||||
val circulars: LiveData<List<Circular>> = Transformations.switchMap(query) { input ->
|
||||
if (input == null || input == "") {
|
||||
AppDatabase.getInstance(getApplication()).circularDao().getFavourites()
|
||||
} else {
|
||||
AppDatabase.getInstance(getApplication()).circularDao().searchFavourites("%$input%")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<List<Circular>> =
|
||||
val query = MutableLiveData<String>("")
|
||||
val circulars: LiveData<List<Circular>> = Transformations.switchMap(query) { input ->
|
||||
if (input == null || input == "") {
|
||||
AppDatabase.getInstance(getApplication()).circularDao().getReminders()
|
||||
} else {
|
||||
AppDatabase.getInstance(getApplication()).circularDao().searchReminders("%$input%")
|
||||
}
|
||||
}
|
||||
}
|
||||
9
app/src/main/res/drawable/ic_search_black_24dp.xml
Normal file
9
app/src/main/res/drawable/ic_search_black_24dp.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24.0"
|
||||
android:viewportHeight="24.0">
|
||||
<path
|
||||
android:fillColor="#FF000000"
|
||||
android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z" />
|
||||
</vector>
|
||||
@@ -1,6 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<item
|
||||
android:id="@+id/menu_main_search"
|
||||
android:icon="@drawable/ic_search_black_24dp"
|
||||
android:title="@string/menu_search"
|
||||
app:actionViewClass="androidx.appcompat.widget.SearchView"
|
||||
app:showAsAction="ifRoom" />
|
||||
<item
|
||||
android:id="@+id/menu_main_about"
|
||||
android:title="@string/menu_about" />
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
<string name="title_licenses">Third party licenses</string>
|
||||
|
||||
<string name="menu_about">About</string>
|
||||
<string name="menu_search">Search</string>
|
||||
|
||||
<string name="notification_title">Circular letter number %1$d</string>
|
||||
<string name="notification_summary_title">New circulars published</string>
|
||||
|
||||
Reference in New Issue
Block a user