|
|
|
|
@ -3,9 +3,8 @@ package net.pokeranalytics.android.ui.fragment |
|
|
|
|
import android.app.Activity |
|
|
|
|
import android.content.Intent |
|
|
|
|
import android.os.Bundle |
|
|
|
|
import android.view.LayoutInflater |
|
|
|
|
import android.view.View |
|
|
|
|
import android.view.ViewGroup |
|
|
|
|
import android.view.* |
|
|
|
|
import androidx.appcompat.widget.SearchView |
|
|
|
|
import androidx.core.view.isVisible |
|
|
|
|
import androidx.recyclerview.widget.ItemTouchHelper |
|
|
|
|
import androidx.recyclerview.widget.LinearLayoutManager |
|
|
|
|
@ -23,13 +22,17 @@ import net.pokeranalytics.android.ui.activity.FiltersActivity |
|
|
|
|
import net.pokeranalytics.android.ui.adapter.LiveRowRepresentableDataSource |
|
|
|
|
import net.pokeranalytics.android.ui.adapter.RowRepresentableAdapter |
|
|
|
|
import net.pokeranalytics.android.ui.adapter.RowRepresentableDelegate |
|
|
|
|
import net.pokeranalytics.android.ui.extensions.removeMargins |
|
|
|
|
import net.pokeranalytics.android.ui.fragment.components.DeletableItemFragment |
|
|
|
|
import net.pokeranalytics.android.ui.helpers.SwipeToDeleteCallback |
|
|
|
|
import net.pokeranalytics.android.ui.view.RowRepresentable |
|
|
|
|
import net.pokeranalytics.android.ui.view.RowViewType |
|
|
|
|
import net.pokeranalytics.android.util.extensions.find |
|
|
|
|
import net.pokeranalytics.android.util.extensions.sorted |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataSource, RowRepresentableDelegate { |
|
|
|
|
|
|
|
|
|
companion object { |
|
|
|
|
@ -40,6 +43,14 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS |
|
|
|
|
|
|
|
|
|
private lateinit var dataType: LiveData |
|
|
|
|
private lateinit var items: RealmResults<out Deletable> |
|
|
|
|
private var dataListMenu: Menu? = null |
|
|
|
|
|
|
|
|
|
var isSearchable: Boolean = false |
|
|
|
|
set(value) { |
|
|
|
|
field = value |
|
|
|
|
val searchMenuItem = dataListMenu?.findItem(R.id.action_search) |
|
|
|
|
searchMenuItem?.isVisible = value |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Set fragment data |
|
|
|
|
@ -51,13 +62,18 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS |
|
|
|
|
setToolbarTitle(this.dataType.pluralLocalizedTitle(requireContext())) |
|
|
|
|
|
|
|
|
|
this.items = this.retrieveItems(getRealm()) |
|
|
|
|
|
|
|
|
|
isSearchable = when(this.dataType) { |
|
|
|
|
LiveData.PLAYER, LiveData.LOCATION -> true |
|
|
|
|
else -> false |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
open fun retrieveItems(realm: Realm): RealmResults<out Deletable> { |
|
|
|
|
return realm.sorted(this.identifiableClass, editableOnly = true, filterableTypeUniqueIdentifier = dataType.subType) |
|
|
|
|
return realm.sorted(this.identifiableClass, editableOnly = true, filterableTypeUniqueIdentifier = dataType.subType) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
override fun deletableItems() : List<Deletable> { |
|
|
|
|
override fun deletableItems(): List<Deletable> { |
|
|
|
|
return this.items |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -71,44 +87,31 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS |
|
|
|
|
initUI() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Init UI |
|
|
|
|
*/ |
|
|
|
|
private fun initUI() { |
|
|
|
|
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { |
|
|
|
|
|
|
|
|
|
setDisplayHomeAsUpEnabled(true) |
|
|
|
|
menu.clear() |
|
|
|
|
inflater.inflate(R.menu.toolbar_data_list, menu) |
|
|
|
|
this.dataListMenu = menu |
|
|
|
|
|
|
|
|
|
val viewManager = LinearLayoutManager(requireContext()) |
|
|
|
|
dataListAdapter = RowRepresentableAdapter(this, this) |
|
|
|
|
val searchMenuItem = menu.findItem(R.id.action_search) |
|
|
|
|
searchMenuItem.isVisible = isSearchable |
|
|
|
|
|
|
|
|
|
val swipeToDelete = SwipeToDeleteCallback(dataListAdapter) { position -> |
|
|
|
|
val item = this.items[position] |
|
|
|
|
if (item != null) { |
|
|
|
|
val itemId = item.id |
|
|
|
|
deleteItem(dataListAdapter, items, itemId) |
|
|
|
|
} else { |
|
|
|
|
throw PAIllegalStateException("Item with position $position not found") |
|
|
|
|
val searchView = searchMenuItem.actionView as SearchView |
|
|
|
|
searchView.removeMargins() |
|
|
|
|
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { |
|
|
|
|
override fun onQueryTextSubmit(query: String?): Boolean { |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
val itemTouchHelper = ItemTouchHelper(swipeToDelete) |
|
|
|
|
|
|
|
|
|
recyclerView.apply { |
|
|
|
|
setHasFixedSize(true) |
|
|
|
|
layoutManager = viewManager |
|
|
|
|
adapter = dataListAdapter |
|
|
|
|
itemTouchHelper.attachToRecyclerView(this) |
|
|
|
|
} |
|
|
|
|
override fun onQueryTextChange(newText: String?): Boolean { |
|
|
|
|
filterItemsWithSearch(newText) |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
this.addButton.setOnClickListener { |
|
|
|
|
EditableDataActivity.newInstance( |
|
|
|
|
requireContext(), |
|
|
|
|
dataType = this.dataType.ordinal, |
|
|
|
|
primaryKey = null |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
super.onCreateOptionsMenu(menu, inflater) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
override fun onResume() { |
|
|
|
|
super.onResume() |
|
|
|
|
this.recyclerView?.adapter?.notifyDataSetChanged() |
|
|
|
|
@ -143,6 +146,52 @@ open class DataListFragment : DeletableItemFragment(), LiveRowRepresentableDataS |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Init UI |
|
|
|
|
*/ |
|
|
|
|
private fun initUI() { |
|
|
|
|
|
|
|
|
|
setDisplayHomeAsUpEnabled(true) |
|
|
|
|
|
|
|
|
|
val viewManager = LinearLayoutManager(requireContext()) |
|
|
|
|
dataListAdapter = RowRepresentableAdapter(this, this) |
|
|
|
|
|
|
|
|
|
val swipeToDelete = SwipeToDeleteCallback(dataListAdapter) { position -> |
|
|
|
|
val item = this.items[position] |
|
|
|
|
if (item != null) { |
|
|
|
|
val itemId = item.id |
|
|
|
|
deleteItem(dataListAdapter, items, itemId) |
|
|
|
|
} else { |
|
|
|
|
throw PAIllegalStateException("Item with position $position not found") |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
val itemTouchHelper = ItemTouchHelper(swipeToDelete) |
|
|
|
|
|
|
|
|
|
recyclerView.apply { |
|
|
|
|
setHasFixedSize(true) |
|
|
|
|
layoutManager = viewManager |
|
|
|
|
adapter = dataListAdapter |
|
|
|
|
itemTouchHelper.attachToRecyclerView(this) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
this.addButton.setOnClickListener { |
|
|
|
|
EditableDataActivity.newInstance( |
|
|
|
|
requireContext(), |
|
|
|
|
dataType = this.dataType.ordinal, |
|
|
|
|
primaryKey = null |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Filter the items list with the given search content |
|
|
|
|
*/ |
|
|
|
|
private fun filterItemsWithSearch(searchContent: String?) { |
|
|
|
|
this.items = getRealm().find(this.identifiableClass, searchContent) |
|
|
|
|
dataListAdapter.notifyDataSetChanged() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Update UI |
|
|
|
|
*/ |
|
|
|
|
|