update my list on home screen, when changed
This commit is contained in:
parent
085b2013ab
commit
9f1717e646
|
@ -42,29 +42,32 @@ import org.mosad.teapod.ui.fragments.HomeFragment
|
||||||
import org.mosad.teapod.ui.fragments.LibraryFragment
|
import org.mosad.teapod.ui.fragments.LibraryFragment
|
||||||
import org.mosad.teapod.ui.fragments.SearchFragment
|
import org.mosad.teapod.ui.fragments.SearchFragment
|
||||||
import org.mosad.teapod.ui.fragments.LoadingFragment
|
import org.mosad.teapod.ui.fragments.LoadingFragment
|
||||||
import org.mosad.teapod.util.CacheHelper
|
import org.mosad.teapod.util.StorageController
|
||||||
import org.mosad.teapod.util.Media
|
import org.mosad.teapod.util.Media
|
||||||
import org.mosad.teapod.util.TMDBApiController
|
import org.mosad.teapod.util.TMDBApiController
|
||||||
import kotlin.system.measureTimeMillis
|
import kotlin.system.measureTimeMillis
|
||||||
|
|
||||||
class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener {
|
class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemSelectedListener {
|
||||||
|
|
||||||
private var activeFragment: Fragment = HomeFragment() // the currently active fragment, home at the start
|
private var activeBaseFragment: Fragment = HomeFragment() // the currently active fragment, home at the start
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
setContentView(R.layout.activity_main)
|
setContentView(R.layout.activity_main)
|
||||||
val navView: BottomNavigationView = findViewById(R.id.nav_view)
|
nav_view.setOnNavigationItemSelectedListener(this)
|
||||||
navView.setOnNavigationItemSelectedListener(this)
|
|
||||||
|
|
||||||
load()
|
load()
|
||||||
|
|
||||||
|
supportFragmentManager.commit {
|
||||||
|
replace(R.id.nav_host_fragment, activeBaseFragment, activeBaseFragment.javaClass.simpleName)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onBackPressed() {
|
override fun onBackPressed() {
|
||||||
if (supportFragmentManager.backStackEntryCount > 0) {
|
if (supportFragmentManager.backStackEntryCount > 0) {
|
||||||
supportFragmentManager.popBackStack()
|
supportFragmentManager.popBackStack()
|
||||||
} else {
|
} else {
|
||||||
if (activeFragment !is HomeFragment) {
|
if (activeBaseFragment !is HomeFragment) {
|
||||||
nav_view.selectedItemId = R.id.navigation_home
|
nav_view.selectedItemId = R.id.navigation_home
|
||||||
} else {
|
} else {
|
||||||
super.onBackPressed()
|
super.onBackPressed()
|
||||||
|
@ -79,52 +82,56 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS
|
||||||
|
|
||||||
val ret = when (item.itemId) {
|
val ret = when (item.itemId) {
|
||||||
R.id.navigation_home -> {
|
R.id.navigation_home -> {
|
||||||
activeFragment = HomeFragment()
|
activeBaseFragment = HomeFragment()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
R.id.navigation_library -> {
|
R.id.navigation_library -> {
|
||||||
activeFragment = LibraryFragment()
|
activeBaseFragment = LibraryFragment()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
R.id.navigation_search -> {
|
R.id.navigation_search -> {
|
||||||
activeFragment = SearchFragment()
|
activeBaseFragment = SearchFragment()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
R.id.navigation_account -> {
|
R.id.navigation_account -> {
|
||||||
activeFragment = AccountFragment()
|
activeBaseFragment = AccountFragment()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
else -> false
|
else -> false
|
||||||
}
|
}
|
||||||
|
|
||||||
supportFragmentManager.commit {
|
supportFragmentManager.commit {
|
||||||
replace(R.id.nav_host_fragment, activeFragment)
|
replace(R.id.nav_host_fragment, activeBaseFragment, activeBaseFragment.javaClass.simpleName)
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun load() {
|
private fun load() {
|
||||||
EncryptedPreferences.readCredentials(this)
|
|
||||||
|
|
||||||
// make sure credentials are set
|
// make sure credentials are set
|
||||||
if (EncryptedPreferences.password.isEmpty()) {
|
EncryptedPreferences.readCredentials(this)
|
||||||
showLoginDialog(true)
|
if (EncryptedPreferences.password.isEmpty()) showLoginDialog(true)
|
||||||
}
|
|
||||||
|
|
||||||
CacheHelper.load(this)
|
StorageController.load(this)
|
||||||
|
|
||||||
// TODO save last loginSuccess, if false show login dialog even if credentials are present
|
|
||||||
// running login and list in parallel does not bring any speed improvements
|
// running login and list in parallel does not bring any speed improvements
|
||||||
val time = measureTimeMillis {
|
val time = measureTimeMillis {
|
||||||
|
// try to login in, as most sites can only bee loaded once loged in
|
||||||
|
if (!AoDParser().login()) showLoginDialog(false)
|
||||||
|
|
||||||
|
// initially load all media
|
||||||
AoDParser().listAnimes()
|
AoDParser().listAnimes()
|
||||||
|
|
||||||
|
// TODO load home screen, can be parallel to listAnimes
|
||||||
}
|
}
|
||||||
Log.i(javaClass.name, "login and list in $time ms")
|
Log.i(javaClass.name, "login and list in $time ms")
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* show the media fragment for the selected media
|
* Show the media fragment for the selected media.
|
||||||
* while loading show the loading fragment
|
* While loading show the loading fragment.
|
||||||
|
* The loading and media fragment are not stored in activeBaseFragment,
|
||||||
|
* as the don't replace a fragment but are added on top of one.
|
||||||
*/
|
*/
|
||||||
fun showMediaFragment(media: Media) = GlobalScope.launch {
|
fun showMediaFragment(media: Media) = GlobalScope.launch {
|
||||||
val loadingFragment = LoadingFragment()
|
val loadingFragment = LoadingFragment()
|
||||||
|
|
|
@ -14,7 +14,7 @@ import kotlinx.coroutines.withContext
|
||||||
import org.mosad.teapod.MainActivity
|
import org.mosad.teapod.MainActivity
|
||||||
import org.mosad.teapod.R
|
import org.mosad.teapod.R
|
||||||
import org.mosad.teapod.parser.AoDParser
|
import org.mosad.teapod.parser.AoDParser
|
||||||
import org.mosad.teapod.util.CacheHelper
|
import org.mosad.teapod.util.StorageController
|
||||||
import org.mosad.teapod.util.adapter.MediaItemAdapter
|
import org.mosad.teapod.util.adapter.MediaItemAdapter
|
||||||
import org.mosad.teapod.util.decoration.MediaItemDecoration
|
import org.mosad.teapod.util.decoration.MediaItemDecoration
|
||||||
|
|
||||||
|
@ -35,23 +35,32 @@ class HomeFragment : Fragment() {
|
||||||
AoDParser().listAnimes()
|
AoDParser().listAnimes()
|
||||||
}
|
}
|
||||||
|
|
||||||
val myListMedia = AoDParser.mediaList.filter { CacheHelper.myList.contains(it.link) }
|
|
||||||
|
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
context?.let {
|
context?.let {
|
||||||
layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
|
layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
|
||||||
adapter = MediaItemAdapter(myListMedia)
|
|
||||||
adapter.onItemClick = { media, _ ->
|
|
||||||
(activity as MainActivity).showMediaFragment(media)
|
|
||||||
}
|
|
||||||
|
|
||||||
recycler_my_list.layoutManager = layoutManager
|
recycler_my_list.layoutManager = layoutManager
|
||||||
recycler_my_list.adapter = adapter
|
|
||||||
recycler_my_list.addItemDecoration(MediaItemDecoration(9))
|
recycler_my_list.addItemDecoration(MediaItemDecoration(9))
|
||||||
|
|
||||||
|
updateMyListMedia()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO recreating the adapter on list change is not a good solution
|
||||||
|
fun updateMyListMedia() {
|
||||||
|
val myListMedia = StorageController.myList.map { listElement ->
|
||||||
|
AoDParser.mediaList.first {
|
||||||
|
listElement == it.link
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
adapter = MediaItemAdapter(myListMedia)
|
||||||
|
adapter.onItemClick = { media, _ ->
|
||||||
|
(activity as MainActivity).showMediaFragment(media)
|
||||||
|
}
|
||||||
|
|
||||||
|
recycler_my_list.adapter = adapter
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -17,7 +17,7 @@ import kotlinx.android.synthetic.main.fragment_media.*
|
||||||
import org.mosad.teapod.MainActivity
|
import org.mosad.teapod.MainActivity
|
||||||
import org.mosad.teapod.R
|
import org.mosad.teapod.R
|
||||||
import org.mosad.teapod.parser.AoDParser
|
import org.mosad.teapod.parser.AoDParser
|
||||||
import org.mosad.teapod.util.CacheHelper
|
import org.mosad.teapod.util.StorageController
|
||||||
import org.mosad.teapod.util.DataTypes.MediaType
|
import org.mosad.teapod.util.DataTypes.MediaType
|
||||||
import org.mosad.teapod.util.adapter.EpisodeItemAdapter
|
import org.mosad.teapod.util.adapter.EpisodeItemAdapter
|
||||||
import org.mosad.teapod.util.Media
|
import org.mosad.teapod.util.Media
|
||||||
|
@ -60,7 +60,7 @@ class MediaFragment(private val media: Media, private val tmdb: TMDBResponse) :
|
||||||
text_year.text = media.info.year.toString()
|
text_year.text = media.info.year.toString()
|
||||||
text_age.text = media.info.age.toString()
|
text_age.text = media.info.age.toString()
|
||||||
text_overview.text = media.info.shortDesc
|
text_overview.text = media.info.shortDesc
|
||||||
check_my_list.isChecked = CacheHelper.myList.contains(media.link)
|
check_my_list.isChecked = StorageController.myList.contains(media.link)
|
||||||
|
|
||||||
// specific gui
|
// specific gui
|
||||||
if (media.type == MediaType.TVSHOW) {
|
if (media.type == MediaType.TVSHOW) {
|
||||||
|
@ -91,14 +91,18 @@ class MediaFragment(private val media: Media, private val tmdb: TMDBResponse) :
|
||||||
}
|
}
|
||||||
|
|
||||||
// add or remove media from myList
|
// add or remove media from myList
|
||||||
check_my_list.setOnCheckedChangeListener { buttonView, isChecked ->
|
check_my_list.setOnCheckedChangeListener { _, isChecked ->
|
||||||
if (isChecked) {
|
if (isChecked) {
|
||||||
CacheHelper.myList.add(media.link)
|
StorageController.myList.add(media.link)
|
||||||
} else {
|
} else {
|
||||||
CacheHelper.myList.remove(media.link)
|
StorageController.myList.remove(media.link)
|
||||||
}
|
}
|
||||||
CacheHelper.saveMyList(requireContext())
|
StorageController.saveMyList(requireContext())
|
||||||
|
|
||||||
// TODO notify home fragment on change
|
// TODO notify home fragment on change
|
||||||
|
parentFragmentManager.findFragmentByTag("HomeFragment")?.let {
|
||||||
|
(it as HomeFragment).updateMyListMedia()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// set onItemClick only in adapter is initialized
|
// set onItemClick only in adapter is initialized
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
package org.mosad.teapod.util
|
package org.mosad.teapod.util
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.util.Log
|
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.google.gson.GsonBuilder
|
import com.google.gson.GsonBuilder
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* myList should be saved in a db
|
* This controller contains the logic for permanently saved data.
|
||||||
|
* On load, it loads the saved files into the variables
|
||||||
*/
|
*/
|
||||||
object CacheHelper {
|
object StorageController {
|
||||||
|
|
||||||
private const val fileNameMyList = "my_list.json"
|
private const val fileNameMyList = "my_list.json"
|
||||||
|
|
||||||
|
@ -27,7 +27,6 @@ object CacheHelper {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun saveMyList(context: Context): Job {
|
fun saveMyList(context: Context): Job {
|
||||||
val file = File(context.filesDir, fileNameMyList)
|
val file = File(context.filesDir, fileNameMyList)
|
||||||
|
|
||||||
|
@ -36,12 +35,4 @@ object CacheHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun save(file: File, text: String) {
|
|
||||||
try {
|
|
||||||
file.writeText(text)
|
|
||||||
} catch (ex: Exception) {
|
|
||||||
Log.e(javaClass.name, "failed to write file \"${file.absoluteFile}\"", ex)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -25,8 +25,11 @@
|
||||||
android:id="@+id/textView"
|
android:id="@+id/textView"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:padding="5dp"
|
android:paddingStart="10dp"
|
||||||
android:text="My List"
|
android:paddingTop="15dp"
|
||||||
|
android:paddingEnd="5dp"
|
||||||
|
android:paddingBottom="5dp"
|
||||||
|
android:text="@string/my_list"
|
||||||
android:textSize="16sp"
|
android:textSize="16sp"
|
||||||
android:textStyle="bold" />
|
android:textStyle="bold" />
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,9 @@
|
||||||
<string name="title_search">Suche</string>
|
<string name="title_search">Suche</string>
|
||||||
<string name="title_account">Account</string>
|
<string name="title_account">Account</string>
|
||||||
|
|
||||||
|
<!-- home fragment -->
|
||||||
|
<string name="my_list">Meine Liste</string>
|
||||||
|
|
||||||
<!-- search fragment -->
|
<!-- search fragment -->
|
||||||
<string name="search_hint">Suche nach Filmen und Serien</string>
|
<string name="search_hint">Suche nach Filmen und Serien</string>
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,9 @@
|
||||||
<string name="title_search">Search</string>
|
<string name="title_search">Search</string>
|
||||||
<string name="title_account">Account</string>
|
<string name="title_account">Account</string>
|
||||||
|
|
||||||
|
<!-- home fragment -->
|
||||||
|
<string name="my_list">My list</string>
|
||||||
|
|
||||||
<!-- search fragment -->
|
<!-- search fragment -->
|
||||||
<string name="search_hint">Search for movies and series</string>
|
<string name="search_hint">Search for movies and series</string>
|
||||||
<string name="media_poster_desc" translatable="false">poster</string>
|
<string name="media_poster_desc" translatable="false">poster</string>
|
||||||
|
|
Loading…
Reference in New Issue