From 9f1717e6462de15bc046164423e165a1f205b5a0 Mon Sep 17 00:00:00 2001 From: Jannik Date: Fri, 16 Oct 2020 11:23:32 +0200 Subject: [PATCH] update my list on home screen, when changed --- .../java/org/mosad/teapod/MainActivity.kt | 45 +++++++++++-------- .../mosad/teapod/ui/fragments/HomeFragment.kt | 27 +++++++---- .../teapod/ui/fragments/MediaFragment.kt | 16 ++++--- .../{CacheHelper.kt => StorageController.kt} | 15 ++----- app/src/main/res/layout/fragment_home.xml | 7 ++- app/src/main/res/values-de-rDE/strings.xml | 3 ++ app/src/main/res/values/strings.xml | 3 ++ 7 files changed, 68 insertions(+), 48 deletions(-) rename app/src/main/java/org/mosad/teapod/util/{CacheHelper.kt => StorageController.kt} (72%) diff --git a/app/src/main/java/org/mosad/teapod/MainActivity.kt b/app/src/main/java/org/mosad/teapod/MainActivity.kt index 94a7943..7f69f8a 100644 --- a/app/src/main/java/org/mosad/teapod/MainActivity.kt +++ b/app/src/main/java/org/mosad/teapod/MainActivity.kt @@ -42,29 +42,32 @@ import org.mosad.teapod.ui.fragments.HomeFragment import org.mosad.teapod.ui.fragments.LibraryFragment import org.mosad.teapod.ui.fragments.SearchFragment 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.TMDBApiController import kotlin.system.measureTimeMillis 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?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - val navView: BottomNavigationView = findViewById(R.id.nav_view) - navView.setOnNavigationItemSelectedListener(this) + nav_view.setOnNavigationItemSelectedListener(this) load() + + supportFragmentManager.commit { + replace(R.id.nav_host_fragment, activeBaseFragment, activeBaseFragment.javaClass.simpleName) + } } override fun onBackPressed() { if (supportFragmentManager.backStackEntryCount > 0) { supportFragmentManager.popBackStack() } else { - if (activeFragment !is HomeFragment) { + if (activeBaseFragment !is HomeFragment) { nav_view.selectedItemId = R.id.navigation_home } else { super.onBackPressed() @@ -79,52 +82,56 @@ class MainActivity : AppCompatActivity(), BottomNavigationView.OnNavigationItemS val ret = when (item.itemId) { R.id.navigation_home -> { - activeFragment = HomeFragment() + activeBaseFragment = HomeFragment() true } R.id.navigation_library -> { - activeFragment = LibraryFragment() + activeBaseFragment = LibraryFragment() true } R.id.navigation_search -> { - activeFragment = SearchFragment() + activeBaseFragment = SearchFragment() true } R.id.navigation_account -> { - activeFragment = AccountFragment() + activeBaseFragment = AccountFragment() true } else -> false } supportFragmentManager.commit { - replace(R.id.nav_host_fragment, activeFragment) + replace(R.id.nav_host_fragment, activeBaseFragment, activeBaseFragment.javaClass.simpleName) } return ret } private fun load() { - EncryptedPreferences.readCredentials(this) - // make sure credentials are set - if (EncryptedPreferences.password.isEmpty()) { - showLoginDialog(true) - } + EncryptedPreferences.readCredentials(this) + 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 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() + + // TODO load home screen, can be parallel to listAnimes } Log.i(javaClass.name, "login and list in $time ms") } /** - * show the media fragment for the selected media - * while loading show the loading fragment + * Show the media fragment for the selected media. + * 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 { val loadingFragment = LoadingFragment() diff --git a/app/src/main/java/org/mosad/teapod/ui/fragments/HomeFragment.kt b/app/src/main/java/org/mosad/teapod/ui/fragments/HomeFragment.kt index b1b80dc..fe2050a 100644 --- a/app/src/main/java/org/mosad/teapod/ui/fragments/HomeFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/fragments/HomeFragment.kt @@ -14,7 +14,7 @@ import kotlinx.coroutines.withContext import org.mosad.teapod.MainActivity import org.mosad.teapod.R 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.decoration.MediaItemDecoration @@ -35,23 +35,32 @@ class HomeFragment : Fragment() { AoDParser().listAnimes() } - val myListMedia = AoDParser.mediaList.filter { CacheHelper.myList.contains(it.link) } - withContext(Dispatchers.Main) { context?.let { 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.adapter = adapter 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 } } \ No newline at end of file diff --git a/app/src/main/java/org/mosad/teapod/ui/fragments/MediaFragment.kt b/app/src/main/java/org/mosad/teapod/ui/fragments/MediaFragment.kt index ec88020..8cd66b4 100644 --- a/app/src/main/java/org/mosad/teapod/ui/fragments/MediaFragment.kt +++ b/app/src/main/java/org/mosad/teapod/ui/fragments/MediaFragment.kt @@ -17,7 +17,7 @@ import kotlinx.android.synthetic.main.fragment_media.* import org.mosad.teapod.MainActivity import org.mosad.teapod.R 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.adapter.EpisodeItemAdapter 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_age.text = media.info.age.toString() 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 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 - check_my_list.setOnCheckedChangeListener { buttonView, isChecked -> + check_my_list.setOnCheckedChangeListener { _, isChecked -> if (isChecked) { - CacheHelper.myList.add(media.link) + StorageController.myList.add(media.link) } else { - CacheHelper.myList.remove(media.link) + StorageController.myList.remove(media.link) } - CacheHelper.saveMyList(requireContext()) + StorageController.saveMyList(requireContext()) + // TODO notify home fragment on change + parentFragmentManager.findFragmentByTag("HomeFragment")?.let { + (it as HomeFragment).updateMyListMedia() + } } // set onItemClick only in adapter is initialized diff --git a/app/src/main/java/org/mosad/teapod/util/CacheHelper.kt b/app/src/main/java/org/mosad/teapod/util/StorageController.kt similarity index 72% rename from app/src/main/java/org/mosad/teapod/util/CacheHelper.kt rename to app/src/main/java/org/mosad/teapod/util/StorageController.kt index b40bbce..f11592d 100644 --- a/app/src/main/java/org/mosad/teapod/util/CacheHelper.kt +++ b/app/src/main/java/org/mosad/teapod/util/StorageController.kt @@ -1,16 +1,16 @@ package org.mosad.teapod.util import android.content.Context -import android.util.Log import com.google.gson.Gson import com.google.gson.GsonBuilder import kotlinx.coroutines.* 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" @@ -27,7 +27,6 @@ object CacheHelper { ) } - fun saveMyList(context: Context): Job { 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) - } - } - } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index fd30f17..4ef6a7b 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -25,8 +25,11 @@ android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="5dp" - android:text="My List" + android:paddingStart="10dp" + android:paddingTop="15dp" + android:paddingEnd="5dp" + android:paddingBottom="5dp" + android:text="@string/my_list" android:textSize="16sp" android:textStyle="bold" /> diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index f41c068..f69a35b 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -5,6 +5,9 @@ Suche Account + + Meine Liste + Suche nach Filmen und Serien diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e592849..ad70b45 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5,6 +5,9 @@ Search Account + + My list + Search for movies and series poster