update my list on home screen, when changed

This commit is contained in:
Jannik 2020-10-16 11:23:32 +02:00
parent 085b2013ab
commit 9f1717e646
Signed by: Seil0
GPG Key ID: E8459F3723C52C24
7 changed files with 68 additions and 48 deletions

View File

@ -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()

View File

@ -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
} }
} }

View File

@ -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

View File

@ -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)
}
}
} }

View File

@ -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" />

View File

@ -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>

View File

@ -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>