diff --git a/app/src/main/java/net/underdesk/circolapp/adapters/CircularLetterAdapter.kt b/app/src/main/java/net/underdesk/circolapp/adapters/CircularLetterAdapter.kt new file mode 100644 index 0000000..96aa300 --- /dev/null +++ b/app/src/main/java/net/underdesk/circolapp/adapters/CircularLetterAdapter.kt @@ -0,0 +1,32 @@ +package net.underdesk.circolapp.adapters + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import kotlinx.android.synthetic.main.item_circular.view.* +import net.underdesk.circolapp.R +import net.underdesk.circolapp.data.Circular + + +class CircularLetterAdapter(private val circulars: List) : + RecyclerView.Adapter() { + + inner class CircularLetterViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var title: TextView = view.circular_title_textview + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CircularLetterViewHolder { + val itemView = LayoutInflater.from(parent.context) + .inflate(R.layout.item_circular, parent, false) + + return CircularLetterViewHolder(itemView) + } + + override fun onBindViewHolder(holder: CircularLetterViewHolder, position: Int) { + holder.title.text = circulars[position].name + } + + override fun getItemCount() = circulars.size +} \ No newline at end of file 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 6f239ae..45fd828 100644 --- a/app/src/main/java/net/underdesk/circolapp/data/Circular.kt +++ b/app/src/main/java/net/underdesk/circolapp/data/Circular.kt @@ -23,7 +23,7 @@ import androidx.room.PrimaryKey @Entity(tableName = "circulars") data class Circular( - @PrimaryKey(autoGenerate = true) val id: Long, + @PrimaryKey(autoGenerate = true) val id: Long?, val name: String, val url: String ) \ No newline at end of file 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 49c54ac..b91ecf1 100644 --- a/app/src/main/java/net/underdesk/circolapp/data/CircularDao.kt +++ b/app/src/main/java/net/underdesk/circolapp/data/CircularDao.kt @@ -18,7 +18,6 @@ package net.underdesk.circolapp.data -import androidx.lifecycle.LiveData import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy @@ -27,8 +26,11 @@ import androidx.room.Query @Dao interface CircularDao { @Query("SELECT * FROM circulars") - fun getCirculars(): LiveData> + fun getCirculars(): List @Insert(onConflict = OnConflictStrategy.REPLACE) - suspend fun insertAll(circulars: List) + fun insertAll(circulars: List) + + @Query("DELETE FROM circulars") + fun deleteAll() } \ No newline at end of file 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 5d500fe..2a531fd 100644 --- a/app/src/main/java/net/underdesk/circolapp/fragments/CircularLetterFragment.kt +++ b/app/src/main/java/net/underdesk/circolapp/fragments/CircularLetterFragment.kt @@ -25,7 +25,10 @@ import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders +import androidx.recyclerview.widget.LinearLayoutManager +import kotlinx.android.synthetic.main.fragment_circular_letters.view.* import net.underdesk.circolapp.R +import net.underdesk.circolapp.adapters.CircularLetterAdapter import net.underdesk.circolapp.viewmodels.CircularLetterViewModel class CircularLetterFragment : Fragment() { @@ -37,11 +40,14 @@ class CircularLetterFragment : Fragment() { container: ViewGroup?, savedInstanceState: Bundle? ): View? { + val root = inflater.inflate(R.layout.fragment_circular_letters, container, false) + + root.circulars_list.layoutManager = LinearLayoutManager(context) + circularLetterViewModel = ViewModelProviders.of(this).get(CircularLetterViewModel::class.java) - val root = inflater.inflate(R.layout.fragment_circular_letters, container, false) - circularLetterViewModel.text.observe(this, Observer { - + circularLetterViewModel.circulars.observe(this, Observer { + root.circulars_list.adapter = CircularLetterAdapter(it) }) return root } 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 c9a59e0..34f34e5 100644 --- a/app/src/main/java/net/underdesk/circolapp/fragments/FavouritesFragment.kt +++ b/app/src/main/java/net/underdesk/circolapp/fragments/FavouritesFragment.kt @@ -40,7 +40,7 @@ class FavouritesFragment : Fragment() { circularLetterViewModel = ViewModelProviders.of(this).get(CircularLetterViewModel::class.java) val root = inflater.inflate(R.layout.fragment_circular_letters, container, false) - circularLetterViewModel.text.observe(this, Observer { + circularLetterViewModel.circulars.observe(this, Observer { }) return root 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 eb81400..cbec325 100644 --- a/app/src/main/java/net/underdesk/circolapp/fragments/RemindersFragment.kt +++ b/app/src/main/java/net/underdesk/circolapp/fragments/RemindersFragment.kt @@ -40,7 +40,7 @@ class RemindersFragment : Fragment() { circularLetterViewModel = ViewModelProviders.of(this).get(CircularLetterViewModel::class.java) val root = inflater.inflate(R.layout.fragment_circular_letters, container, false) - circularLetterViewModel.text.observe(this, Observer { + circularLetterViewModel.circulars.observe(this, Observer { }) return root diff --git a/app/src/main/java/net/underdesk/circolapp/server/DataFetcher.kt b/app/src/main/java/net/underdesk/circolapp/server/DataFetcher.kt index 8177f23..dea7bf9 100644 --- a/app/src/main/java/net/underdesk/circolapp/server/DataFetcher.kt +++ b/app/src/main/java/net/underdesk/circolapp/server/DataFetcher.kt @@ -19,6 +19,7 @@ package net.underdesk.circolapp.server import com.google.gson.Gson +import net.underdesk.circolapp.data.Circular import net.underdesk.circolapp.server.pojo.Response import org.jsoup.Jsoup import java.io.IOException @@ -33,16 +34,16 @@ class DataFetcher { } @Throws(IOException::class) - fun getCircularsFromServer(): ArrayList> { + public fun getCircularsFromServer(): List { val json = gson.fromJson(retrieveDataFromServer(), Response::class.java) val document = Jsoup.parseBodyFragment(json.content!!.rendered) val htmlList = document.getElementsByTag("ul")[0].getElementsByTag("a") - val list = ArrayList>() + val list = ArrayList() htmlList.forEach { element -> - list.add(Pair(element.text(), element.attr("href"))) + list.add(Circular(null, element.text(), element.attr("href"))) } return list 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 5c28c27..5b59cd5 100644 --- a/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModel.kt +++ b/app/src/main/java/net/underdesk/circolapp/viewmodels/CircularLetterViewModel.kt @@ -18,14 +18,41 @@ package net.underdesk.circolapp.viewmodels +import android.app.Application +import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel +import net.underdesk.circolapp.data.AppDatabase +import net.underdesk.circolapp.data.Circular +import net.underdesk.circolapp.server.DataFetcher -class CircularLetterViewModel : ViewModel() { +class CircularLetterViewModel(application: Application) : AndroidViewModel(application) { - private val _text = MutableLiveData().apply { - value = "" + private val _circulars: MutableLiveData> by lazy { + MutableLiveData>().also { + loadCirculars() + } + } + + val circulars: LiveData> = _circulars + + private fun loadCirculars() { + object : Thread() { + override fun run() { + _circulars.postValue(AppDatabase.getInstance(getApplication()).circularDao().getCirculars()) + updateCirculars() + } + }.start() + } + + private fun updateCirculars() { + val fetcher = DataFetcher() + + val newCirculars = fetcher.getCircularsFromServer() + if (newCirculars.size != _circulars.value?.size ?: true) { + _circulars.postValue(newCirculars) + AppDatabase.getInstance(getApplication()).circularDao().deleteAll() + AppDatabase.getInstance(getApplication()).circularDao().insertAll(newCirculars) + } } - val text: LiveData = _text } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 38c0aa8..d504aa5 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,8 +3,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/container" android:layout_width="match_parent" - android:layout_height="match_parent" - android:paddingTop="?attr/actionBarSize"> + android:layout_height="match_parent"> + \ No newline at end of file diff --git a/app/src/main/res/layout/item_circular.xml b/app/src/main/res/layout/item_circular.xml new file mode 100644 index 0000000..a51e3cd --- /dev/null +++ b/app/src/main/res/layout/item_circular.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file