Implement viewBindings

This commit is contained in:
2020-12-16 21:20:36 +01:00
parent 7c338acf81
commit ce94cfb566
12 changed files with 158 additions and 101 deletions

View File

@@ -1,7 +1,6 @@
plugins { plugins {
id("com.android.application") id("com.android.application")
id("kotlin-android") id("kotlin-android")
id("kotlin-android-extensions")
id("kotlin-kapt") id("kotlin-kapt")
id("com.google.gms.google-services") id("com.google.gms.google-services")
id("com.mikepenz.aboutlibraries.plugin") id("com.mikepenz.aboutlibraries.plugin")
@@ -38,8 +37,8 @@ android {
kotlinOptions { kotlinOptions {
jvmTarget = "1.8" jvmTarget = "1.8"
} }
androidExtensions { buildFeatures {
isExperimental = true viewBinding = true
} }
} }

View File

@@ -38,8 +38,8 @@ 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.android.synthetic.main.activity_main.*
import net.underdesk.circolapp.adapters.CircularLetterAdapter import net.underdesk.circolapp.adapters.CircularLetterAdapter
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
@@ -49,6 +49,8 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
internal const val PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 10 internal const val PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 10
} }
private lateinit var binding: ActivityMainBinding
var searchCallback: SearchCallback? = null var searchCallback: SearchCallback? = null
var refreshCallback: RefreshCallback? = null var refreshCallback: RefreshCallback? = null
override var fileToDownload: DownloadableFile? = null override var fileToDownload: DownloadableFile? = null
@@ -56,8 +58,9 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
loadDarkTheme() loadDarkTheme()
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) binding = ActivityMainBinding.inflate(layoutInflater)
setSupportActionBar(main_toolbar) setContentView(binding.root)
setSupportActionBar(binding.mainToolbar)
val navView: BottomNavigationView = findViewById(R.id.nav_view) val navView: BottomNavigationView = findViewById(R.id.nav_view)
val navController = findNavController(R.id.nav_host_fragment) val navController = findNavController(R.id.nav_host_fragment)
@@ -134,7 +137,7 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
downloadFile() downloadFile()
} else { } else {
Snackbar.make( Snackbar.make(
container, binding.container,
resources.getString(R.string.snackbar_write_permission_not_granted), resources.getString(R.string.snackbar_write_permission_not_granted),
Snackbar.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()
@@ -161,7 +164,7 @@ class MainActivity : AppCompatActivity(), CircularLetterAdapter.AdapterCallback
(getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager).enqueue(request) (getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager).enqueue(request)
Snackbar.make( Snackbar.make(
container, binding.container,
resources.getString(R.string.snackbar_circular_downloaded), resources.getString(R.string.snackbar_circular_downloaded),
Snackbar.LENGTH_LONG Snackbar.LENGTH_LONG
).show() ).show()

View File

@@ -24,7 +24,7 @@ import android.text.InputType
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
import androidx.preference.* import androidx.preference.*
import kotlinx.android.synthetic.main.settings_activity.* import net.underdesk.circolapp.databinding.SettingsActivityBinding
import net.underdesk.circolapp.push.FirebaseTopicUtils import net.underdesk.circolapp.push.FirebaseTopicUtils
import net.underdesk.circolapp.server.AndroidServerApi import net.underdesk.circolapp.server.AndroidServerApi
import net.underdesk.circolapp.shared.server.ServerAPI import net.underdesk.circolapp.shared.server.ServerAPI
@@ -32,10 +32,14 @@ import net.underdesk.circolapp.works.PollWork
class SettingsActivity : AppCompatActivity() { class SettingsActivity : AppCompatActivity() {
private lateinit var binding: SettingsActivityBinding
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.settings_activity) setContentView(R.layout.settings_activity)
setSupportActionBar(settings_toolbar) binding = SettingsActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
setSupportActionBar(binding.settingsToolbar)
supportFragmentManager supportFragmentManager
.beginTransaction() .beginTransaction()
.replace(R.id.settings, SettingsFragment()) .replace(R.id.settings, SettingsFragment())

View File

@@ -20,13 +20,11 @@ package net.underdesk.circolapp.adapters
import android.content.Context import android.content.Context
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.TextView import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.item_attachment.view.* import net.underdesk.circolapp.databinding.ItemAttachmentBinding
import net.underdesk.circolapp.R
import net.underdesk.circolapp.utils.DownloadableFile import net.underdesk.circolapp.utils.DownloadableFile
import net.underdesk.circolapp.utils.FileUtils import net.underdesk.circolapp.utils.FileUtils
@@ -38,18 +36,17 @@ class AttachmentAdapter(
RecyclerView.Adapter<AttachmentAdapter.AttachmentViewHolder>() { RecyclerView.Adapter<AttachmentAdapter.AttachmentViewHolder>() {
private lateinit var context: Context private lateinit var context: Context
inner class AttachmentViewHolder(view: View) : RecyclerView.ViewHolder(view) { inner class AttachmentViewHolder(binding: ItemAttachmentBinding) : RecyclerView.ViewHolder(binding.root) {
var title: TextView = view.attachment_title_textview var title: TextView = binding.attachmentTitleTextview
var viewButton: ImageButton = view.attachment_view_button var viewButton: ImageButton = binding.attachmentViewButton
var downloadButton: ImageButton = view.attachment_download_button var downloadButton: ImageButton = binding.attachmentDownloadButton
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AttachmentViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AttachmentViewHolder {
val itemView = LayoutInflater.from(parent.context) val binding = ItemAttachmentBinding.inflate(LayoutInflater.from(parent.context), parent, false)
.inflate(R.layout.item_attachment, parent, false)
context = parent.context context = parent.context
return AttachmentViewHolder(itemView) return AttachmentViewHolder(binding)
} }
override fun onBindViewHolder(holder: AttachmentViewHolder, position: Int) { override fun onBindViewHolder(holder: AttachmentViewHolder, position: Int) {

View File

@@ -31,12 +31,12 @@ import androidx.core.content.ContextCompat.getDrawable
import androidx.fragment.app.FragmentActivity import androidx.fragment.app.FragmentActivity
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.item_circular.view.*
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import net.underdesk.circolapp.AlarmBroadcastReceiver import net.underdesk.circolapp.AlarmBroadcastReceiver
import net.underdesk.circolapp.R import net.underdesk.circolapp.R
import net.underdesk.circolapp.data.AndroidDatabase import net.underdesk.circolapp.data.AndroidDatabase
import net.underdesk.circolapp.databinding.ItemCircularBinding
import net.underdesk.circolapp.fragments.NewReminderFragment import net.underdesk.circolapp.fragments.NewReminderFragment
import net.underdesk.circolapp.shared.data.Circular import net.underdesk.circolapp.shared.data.Circular
import net.underdesk.circolapp.utils.DownloadableFile import net.underdesk.circolapp.utils.DownloadableFile
@@ -55,17 +55,17 @@ class CircularLetterAdapter(
setHasStableIds(true) setHasStableIds(true)
} }
inner class CircularLetterViewHolder(view: View) : RecyclerView.ViewHolder(view) { inner class CircularLetterViewHolder(binding: ItemCircularBinding) : RecyclerView.ViewHolder(binding.root) {
var card: CardView = view.circular_card var card: CardView = binding.circularCard
var title: TextView = view.circular_title_textview var title: TextView = binding.circularTitleTextview
var number: TextView = view.circular_number_textview var number: TextView = binding.circularNumberTextview
var date: TextView = view.circular_date_textview var date: TextView = binding.circularDateTextview
var collapseButton: ImageButton = view.circular_collapse_button var collapseButton: ImageButton = binding.circularCollapseButton
var viewButton: ImageButton = view.circular_view_button var viewButton: ImageButton = binding.circularViewButton
var downloadButton: ImageButton = view.circular_download_button var downloadButton: ImageButton = binding.circularDownloadButton
var favouriteButton: ImageButton = view.circular_favourite_button var favouriteButton: ImageButton = binding.circularFavouriteButton
var reminderButton: ImageButton = view.circular_reminder_button var reminderButton: ImageButton = binding.circularReminderButton
var attachmentsList: RecyclerView = view.circulars_attachments_list var attachmentsList: RecyclerView = binding.circularsAttachmentsList
init { init {
attachmentsList.layoutManager = LinearLayoutManager(context) attachmentsList.layoutManager = LinearLayoutManager(context)
@@ -73,11 +73,10 @@ class CircularLetterAdapter(
} }
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CircularLetterViewHolder { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CircularLetterViewHolder {
val itemView = LayoutInflater.from(parent.context) val binding = ItemCircularBinding.inflate(LayoutInflater.from(parent.context), parent, false)
.inflate(R.layout.item_circular, parent, false)
context = parent.context context = parent.context
return CircularLetterViewHolder(itemView) return CircularLetterViewHolder(binding)
} }
override fun onBindViewHolder(holder: CircularLetterViewHolder, position: Int) { override fun onBindViewHolder(holder: CircularLetterViewHolder, position: Int) {

View File

@@ -28,12 +28,11 @@ import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import kotlinx.android.synthetic.main.fragment_circular_letters.*
import kotlinx.android.synthetic.main.fragment_circular_letters.view.*
import net.underdesk.circolapp.MainActivity import net.underdesk.circolapp.MainActivity
import net.underdesk.circolapp.R import net.underdesk.circolapp.R
import net.underdesk.circolapp.adapters.CircularLetterAdapter import net.underdesk.circolapp.adapters.CircularLetterAdapter
import net.underdesk.circolapp.data.AndroidCircularRepository import net.underdesk.circolapp.data.AndroidCircularRepository
import net.underdesk.circolapp.databinding.FragmentCircularLettersBinding
import net.underdesk.circolapp.viewmodels.CircularLetterViewModel import net.underdesk.circolapp.viewmodels.CircularLetterViewModel
import net.underdesk.circolapp.viewmodels.CircularLetterViewModelFactory import net.underdesk.circolapp.viewmodels.CircularLetterViewModelFactory
@@ -42,6 +41,10 @@ class CircularLetterFragment :
MainActivity.SearchCallback, MainActivity.SearchCallback,
MainActivity.RefreshCallback { MainActivity.RefreshCallback {
private var _binding: FragmentCircularLettersBinding? = null
// This property is only valid between onCreateView and onDestroyView.
private val binding get() = _binding!!
private val circularLetterViewModel: CircularLetterViewModel by viewModels { private val circularLetterViewModel: CircularLetterViewModel by viewModels {
CircularLetterViewModelFactory( CircularLetterViewModelFactory(
AndroidCircularRepository.getInstance(requireContext()), AndroidCircularRepository.getInstance(requireContext()),
@@ -53,19 +56,19 @@ class CircularLetterFragment :
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View {
val root = inflater.inflate(R.layout.fragment_circular_letters, container, false) _binding = FragmentCircularLettersBinding.inflate(inflater, container, false)
root.circulars_list.layoutManager = LinearLayoutManager(context) binding.circularsList.layoutManager = LinearLayoutManager(context)
circularLetterViewModel.circulars.observe( circularLetterViewModel.circulars.observe(
viewLifecycleOwner, viewLifecycleOwner,
{ {
if (root.circulars_list.adapter == null) { if (binding.circularsList.adapter == null) {
root.circulars_list.adapter = binding.circularsList.adapter =
CircularLetterAdapter(it, activity as MainActivity, lifecycleScope) CircularLetterAdapter(it, activity as MainActivity, lifecycleScope)
} else { } else {
(root.circulars_list.adapter as CircularLetterAdapter).changeDataSet(it) (binding.circularsList.adapter as CircularLetterAdapter).changeDataSet(it)
} }
} }
) )
@@ -87,18 +90,23 @@ class CircularLetterFragment :
viewLifecycleOwner, viewLifecycleOwner,
{ {
if (it) { if (it) {
root.circulars_refresh.isRefreshing = false binding.circularsRefresh.isRefreshing = false
circularLetterViewModel.showMessage.postValue(false) circularLetterViewModel.showMessage.postValue(false)
} }
} }
) )
root.circulars_refresh.setOnRefreshListener { circularLetterViewModel.updateCirculars() } binding.circularsRefresh.setOnRefreshListener { circularLetterViewModel.updateCirculars() }
(activity as MainActivity).searchCallback = this (activity as MainActivity).searchCallback = this
(activity as MainActivity).refreshCallback = this (activity as MainActivity).refreshCallback = this
return root return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
} }
override fun search(query: String) { override fun search(query: String) {
@@ -106,7 +114,7 @@ class CircularLetterFragment :
} }
override fun refresh() { override fun refresh() {
circulars_refresh.isRefreshing = true binding.circularsRefresh.isRefreshing = true
circularLetterViewModel.updateCirculars() circularLetterViewModel.updateCirculars()
} }
} }

View File

@@ -26,16 +26,19 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.fragment_circular_letters.view.*
import net.underdesk.circolapp.MainActivity import net.underdesk.circolapp.MainActivity
import net.underdesk.circolapp.R
import net.underdesk.circolapp.adapters.CircularLetterAdapter import net.underdesk.circolapp.adapters.CircularLetterAdapter
import net.underdesk.circolapp.data.AndroidCircularRepository import net.underdesk.circolapp.data.AndroidCircularRepository
import net.underdesk.circolapp.databinding.FragmentCircularLettersBinding
import net.underdesk.circolapp.viewmodels.FavouritesViewModel import net.underdesk.circolapp.viewmodels.FavouritesViewModel
import net.underdesk.circolapp.viewmodels.FavouritesViewModelFactory import net.underdesk.circolapp.viewmodels.FavouritesViewModelFactory
class FavouritesFragment : Fragment(), MainActivity.SearchCallback { class FavouritesFragment : Fragment(), MainActivity.SearchCallback {
private var _binding: FragmentCircularLettersBinding? = null
// This property is only valid between onCreateView and onDestroyView.
private val binding get() = _binding!!
private val favouritesViewModel: FavouritesViewModel by viewModels { private val favouritesViewModel: FavouritesViewModel by viewModels {
FavouritesViewModelFactory( FavouritesViewModelFactory(
AndroidCircularRepository.getInstance(requireContext()), AndroidCircularRepository.getInstance(requireContext()),
@@ -47,27 +50,32 @@ class FavouritesFragment : Fragment(), MainActivity.SearchCallback {
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View {
val root = inflater.inflate(R.layout.fragment_circular_letters, container, false) _binding = FragmentCircularLettersBinding.inflate(inflater, container, false)
root.circulars_list.layoutManager = LinearLayoutManager(context) binding.circularsList.layoutManager = LinearLayoutManager(context)
root.circulars_refresh.isEnabled = false binding.circularsRefresh.isEnabled = false
favouritesViewModel.circulars.observe( favouritesViewModel.circulars.observe(
viewLifecycleOwner, viewLifecycleOwner,
{ {
if (root.circulars_list.adapter == null) { if (binding.circularsList.adapter == null) {
root.circulars_list.adapter = binding.circularsList.adapter =
CircularLetterAdapter(it, activity as MainActivity, lifecycleScope) CircularLetterAdapter(it, activity as MainActivity, lifecycleScope)
} else { } else {
(root.circulars_list.adapter as CircularLetterAdapter).changeDataSet(it) (binding.circularsList.adapter as CircularLetterAdapter).changeDataSet(it)
} }
} }
) )
(activity as MainActivity).searchCallback = this (activity as MainActivity).searchCallback = this
(activity as MainActivity).refreshCallback = null (activity as MainActivity).refreshCallback = null
return root return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
} }
override fun search(query: String) { override fun search(query: String) {

View File

@@ -30,11 +30,11 @@ import android.view.ViewGroup
import androidx.core.app.AlarmManagerCompat import androidx.core.app.AlarmManagerCompat
import androidx.fragment.app.DialogFragment import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import kotlinx.android.synthetic.main.dialog_reminder.*
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import net.underdesk.circolapp.AlarmBroadcastReceiver import net.underdesk.circolapp.AlarmBroadcastReceiver
import net.underdesk.circolapp.R import net.underdesk.circolapp.R
import net.underdesk.circolapp.data.AndroidDatabase import net.underdesk.circolapp.data.AndroidDatabase
import net.underdesk.circolapp.databinding.DialogReminderBinding
import net.underdesk.circolapp.shared.data.Circular import net.underdesk.circolapp.shared.data.Circular
import java.util.* import java.util.*
@@ -48,6 +48,10 @@ class NewReminderFragment : DialogFragment() {
} }
} }
private var _binding: DialogReminderBinding? = null
// This property is only valid between onCreateView and onDestroyView.
private val binding get() = _binding!!
private var dateNotChosen = true private var dateNotChosen = true
lateinit var circular: Circular lateinit var circular: Circular
@@ -56,44 +60,50 @@ class NewReminderFragment : DialogFragment() {
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View { ): View {
return inflater.inflate(R.layout.dialog_reminder, container) _binding = DialogReminderBinding.inflate(inflater, container, false)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
dialog_time_picker.setIs24HourView(true) binding.dialogTimePicker.setIs24HourView(true)
dialog_ok_button.setOnClickListener { next() } binding.dialogOkButton.setOnClickListener { next() }
dialog_back_button.setOnClickListener { back() } binding.dialogBackButton.setOnClickListener { back() }
dialog_cancel_button.setOnClickListener { dismiss() } binding.dialogCancelButton.setOnClickListener { dismiss() }
} }
fun next() { fun next() {
if (dateNotChosen) { if (dateNotChosen) {
dialog_date_picker.visibility = View.GONE binding.dialogDatePicker.visibility = View.GONE
dialog_time_picker.visibility = View.VISIBLE binding.dialogTimePicker.visibility = View.VISIBLE
dialog_back_button.visibility = View.VISIBLE binding.dialogBackButton.visibility = View.VISIBLE
dialog_ok_button.text = getString(R.string.dialog_ok) binding.dialogOkButton.text = getString(R.string.dialog_ok)
dateNotChosen = false dateNotChosen = false
} else { } else {
val calendar = Calendar.getInstance() val calendar = Calendar.getInstance()
val hour = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { val hour = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
dialog_time_picker.hour binding.dialogTimePicker.hour
} else { } else {
dialog_time_picker.currentHour binding.dialogTimePicker.currentHour
} }
val minute = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { val minute = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
dialog_time_picker.minute binding.dialogTimePicker.minute
} else { } else {
dialog_time_picker.currentMinute binding.dialogTimePicker.currentMinute
} }
calendar.set( calendar.set(
dialog_date_picker.year, binding.dialogDatePicker.year,
dialog_date_picker.month, binding.dialogDatePicker.month,
dialog_date_picker.dayOfMonth, binding.dialogDatePicker.dayOfMonth,
hour, hour,
minute minute
) )
@@ -127,10 +137,10 @@ class NewReminderFragment : DialogFragment() {
} }
private fun back() { private fun back() {
dialog_date_picker.visibility = View.VISIBLE binding.dialogDatePicker.visibility = View.VISIBLE
dialog_time_picker.visibility = View.GONE binding.dialogTimePicker.visibility = View.GONE
dialog_back_button.visibility = View.GONE binding.dialogBackButton.visibility = View.GONE
dialog_ok_button.text = getString(R.string.dialog_next) binding.dialogOkButton.text = getString(R.string.dialog_next)
dateNotChosen = true dateNotChosen = true
} }
} }

View File

@@ -26,16 +26,19 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.fragment_circular_letters.view.*
import net.underdesk.circolapp.MainActivity import net.underdesk.circolapp.MainActivity
import net.underdesk.circolapp.R
import net.underdesk.circolapp.adapters.CircularLetterAdapter import net.underdesk.circolapp.adapters.CircularLetterAdapter
import net.underdesk.circolapp.data.AndroidCircularRepository import net.underdesk.circolapp.data.AndroidCircularRepository
import net.underdesk.circolapp.databinding.FragmentCircularLettersBinding
import net.underdesk.circolapp.viewmodels.RemindersViewModel import net.underdesk.circolapp.viewmodels.RemindersViewModel
import net.underdesk.circolapp.viewmodels.RemindersViewModelFactory import net.underdesk.circolapp.viewmodels.RemindersViewModelFactory
class RemindersFragment : Fragment(), MainActivity.SearchCallback { class RemindersFragment : Fragment(), MainActivity.SearchCallback {
private var _binding: FragmentCircularLettersBinding? = null
// This property is only valid between onCreateView and onDestroyView.
private val binding get() = _binding!!
private val remindersViewModel: RemindersViewModel by viewModels { private val remindersViewModel: RemindersViewModel by viewModels {
RemindersViewModelFactory( RemindersViewModelFactory(
AndroidCircularRepository.getInstance(requireContext()), AndroidCircularRepository.getInstance(requireContext()),
@@ -47,27 +50,32 @@ class RemindersFragment : Fragment(), MainActivity.SearchCallback {
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? { ): View {
val root = inflater.inflate(R.layout.fragment_circular_letters, container, false) _binding = FragmentCircularLettersBinding.inflate(inflater, container, false)
root.circulars_list.layoutManager = LinearLayoutManager(context) binding.circularsList.layoutManager = LinearLayoutManager(context)
root.circulars_refresh.isEnabled = false binding.circularsRefresh.isEnabled = false
remindersViewModel.circulars.observe( remindersViewModel.circulars.observe(
viewLifecycleOwner, viewLifecycleOwner,
{ {
if (root.circulars_list.adapter == null) { if (binding.circularsList.adapter == null) {
root.circulars_list.adapter = binding.circularsList.adapter =
CircularLetterAdapter(it, activity as MainActivity, lifecycleScope) CircularLetterAdapter(it, activity as MainActivity, lifecycleScope)
} else { } else {
(root.circulars_list.adapter as CircularLetterAdapter).changeDataSet(it) (binding.circularsList.adapter as CircularLetterAdapter).changeDataSet(it)
} }
} }
) )
(activity as MainActivity).searchCallback = this (activity as MainActivity).searchCallback = this
(activity as MainActivity).refreshCallback = null (activity as MainActivity).refreshCallback = null
return root return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
} }
override fun search(query: String) { override fun search(query: String) {

View File

@@ -8,37 +8,50 @@ import android.view.ViewGroup
import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import com.github.appintro.SlidePolicy import com.github.appintro.SlidePolicy
import kotlinx.android.synthetic.main.fragment_legal.view.*
import net.underdesk.circolapp.R import net.underdesk.circolapp.R
import net.underdesk.circolapp.databinding.FragmentLegalBinding
class LegalFragment : Fragment(), SlidePolicy { class LegalFragment : Fragment(), SlidePolicy {
private var _binding: FragmentLegalBinding? = null
// This property is only valid between onCreateView and onDestroyView.
private val binding get() = _binding!!
override fun onCreateView( override fun onCreateView(
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.fragment_legal, container, false) ): View {
_binding = FragmentLegalBinding.inflate(inflater, container, false)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
view.legal_text.text = HtmlCompat.fromHtml( binding.legalText.text = HtmlCompat.fromHtml(
getString(R.string.activity_intro_legal_text), getString(R.string.activity_intro_legal_text),
HtmlCompat.FROM_HTML_MODE_COMPACT HtmlCompat.FROM_HTML_MODE_COMPACT
) )
view.legal_text.movementMethod = LinkMovementMethod.getInstance() binding.legalText.movementMethod = LinkMovementMethod.getInstance()
view.legal_checkbox.setOnCheckedChangeListener { checkBox, checked -> binding.legalCheckbox.setOnCheckedChangeListener { checkBox, checked ->
if (checked) if (checked)
checkBox.error = null checkBox.error = null
} }
} }
override val isPolicyRespected: Boolean override val isPolicyRespected: Boolean
get() = view?.legal_checkbox?.isChecked ?: false get() = binding.legalCheckbox.isChecked
override fun onUserIllegallyRequestedNextPage() { override fun onUserIllegallyRequestedNextPage() {
view?.legal_checkbox?.error = binding.legalCheckbox.error =
getString(R.string.activity_intro_legal_error) getString(R.string.activity_intro_legal_error)
} }

View File

@@ -10,12 +10,17 @@ import androidx.fragment.app.Fragment
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import com.github.appintro.SlidePolicy import com.github.appintro.SlidePolicy
import com.tiper.MaterialSpinner import com.tiper.MaterialSpinner
import kotlinx.android.synthetic.main.fragment_school_selection.view.*
import net.underdesk.circolapp.R import net.underdesk.circolapp.R
import net.underdesk.circolapp.databinding.FragmentSchoolSelectionBinding
import net.underdesk.circolapp.server.AndroidServerApi import net.underdesk.circolapp.server.AndroidServerApi
import net.underdesk.circolapp.shared.server.ServerAPI import net.underdesk.circolapp.shared.server.ServerAPI
class SchoolSelectionFragment : Fragment(), SlidePolicy, MaterialSpinner.OnItemSelectedListener { class SchoolSelectionFragment : Fragment(), SlidePolicy, MaterialSpinner.OnItemSelectedListener {
private var _binding: FragmentSchoolSelectionBinding? = null
// This property is only valid between onCreateView and onDestroyView.
private val binding get() = _binding!!
private lateinit var preferenceManager: SharedPreferences private lateinit var preferenceManager: SharedPreferences
private var schoolSelected = false private var schoolSelected = false
@@ -23,7 +28,11 @@ class SchoolSelectionFragment : Fragment(), SlidePolicy, MaterialSpinner.OnItemS
inflater: LayoutInflater, inflater: LayoutInflater,
container: ViewGroup?, container: ViewGroup?,
savedInstanceState: Bundle? savedInstanceState: Bundle?
): View? = inflater.inflate(R.layout.fragment_school_selection, container, false) ): View {
_binding = FragmentSchoolSelectionBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
@@ -34,8 +43,8 @@ class SchoolSelectionFragment : Fragment(), SlidePolicy, MaterialSpinner.OnItemS
val adapter = val adapter =
ArrayAdapter(requireContext(), android.R.layout.simple_spinner_dropdown_item, items) ArrayAdapter(requireContext(), android.R.layout.simple_spinner_dropdown_item, items)
view.school_selection_spinner.adapter = adapter binding.schoolSelectionSpinner.adapter = adapter
view.school_selection_spinner.onItemSelectedListener = this binding.schoolSelectionSpinner.onItemSelectedListener = this
} }
private fun getSchoolListArray(): ArrayList<String> { private fun getSchoolListArray(): ArrayList<String> {
@@ -68,7 +77,7 @@ class SchoolSelectionFragment : Fragment(), SlidePolicy, MaterialSpinner.OnItemS
get() = schoolSelected get() = schoolSelected
override fun onUserIllegallyRequestedNextPage() { override fun onUserIllegallyRequestedNextPage() {
view?.school_selection_spinner?.error = binding.schoolSelectionSpinner.error =
getString(R.string.activity_intro_school_selection_error) getString(R.string.activity_intro_school_selection_error)
} }

View File

@@ -5,7 +5,6 @@ plugins {
kotlin("native.cocoapods") kotlin("native.cocoapods")
kotlin("plugin.serialization") kotlin("plugin.serialization")
id("com.android.library") id("com.android.library")
id("kotlin-android-extensions")
id("com.squareup.sqldelight") id("com.squareup.sqldelight")
} }