From 52f173b7042583da288cc5a5b03e4b84b0f4d65c Mon Sep 17 00:00:00 2001 From: "hyunsung.shin" Date: Sun, 12 Jul 2020 21:20:14 +0900 Subject: [PATCH] [Feature] Change Fragment Factory logic --- .idea/misc.xml | 2 +- app/src/main/AndroidManifest.xml | 3 +- .../template/nanamare/di/FragmentModule.kt | 18 ++--------- .../nanamare/ext/AppCompatActivityExt.kt | 9 ++++-- .../com/template/nanamare/ext/StringExt.kt | 6 ++++ .../presentation/activity/MainActivity.kt | 9 +++++- .../activity/MovieInfoActivity.kt | 30 ++++++++++++++----- .../base/ui/BaseDialogFragment.kt | 25 +++++++++++----- .../presentation/base/ui/BaseViewPager.kt | 1 - .../presentation/dialog/VideoFragment.kt | 22 +++++++++----- .../fragment/MovieCategoryFragment.kt | 14 ++++++++- .../presentation/fragment/MovieFragment.kt | 7 +++-- .../presentation/model/GenrePresentation.kt | 30 ++++++++++++++++++- .../presentation/vm/VideoViewModel.kt | 4 +-- 14 files changed, 129 insertions(+), 51 deletions(-) create mode 100644 app/src/main/java/com/template/nanamare/ext/StringExt.kt diff --git a/.idea/misc.xml b/.idea/misc.xml index 5814b76..84d3dea 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -276,7 +276,7 @@ - + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 77de9e5..6abceac 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,8 +10,7 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" - android:theme="@style/AppTheme" - tools:ignore="LockedOrientationActivity"> + android:theme="@style/AppTheme"> diff --git a/app/src/main/java/com/template/nanamare/di/FragmentModule.kt b/app/src/main/java/com/template/nanamare/di/FragmentModule.kt index 1ab1a08..43c2162 100644 --- a/app/src/main/java/com/template/nanamare/di/FragmentModule.kt +++ b/app/src/main/java/com/template/nanamare/di/FragmentModule.kt @@ -3,7 +3,6 @@ package com.template.nanamare.di import com.template.nanamare.presentation.dialog.VideoFragment import com.template.nanamare.presentation.fragment.MovieCategoryFragment import com.template.nanamare.presentation.fragment.MovieFragment -import com.template.nanamare.presentation.model.GenrePresentation import org.koin.androidx.fragment.dsl.fragment import org.koin.core.module.Module import org.koin.dsl.module @@ -13,18 +12,7 @@ import org.koin.dsl.module * setupKoinFragmentFactory() in activity before super.onCreate(savedInstanceState) */ val fragmentModule: Module = module { - fragment(override = true) { - MovieFragment() - } - fragment(override = true) { (movies: List) -> - MovieFragment(movies) - } - fragment(override = true) { - MovieCategoryFragment() - } - fragment(override = true) { (movie: GenrePresentation) -> - MovieCategoryFragment(movie) - } - fragment(override = true) { VideoFragment() } - fragment(override = true) { (liveVideoUrl: String) -> VideoFragment(liveVideoUrl) } + fragment { MovieFragment() } + fragment { MovieCategoryFragment() } + fragment { VideoFragment() } } \ No newline at end of file diff --git a/app/src/main/java/com/template/nanamare/ext/AppCompatActivityExt.kt b/app/src/main/java/com/template/nanamare/ext/AppCompatActivityExt.kt index 06eb9f8..dd4598d 100755 --- a/app/src/main/java/com/template/nanamare/ext/AppCompatActivityExt.kt +++ b/app/src/main/java/com/template/nanamare/ext/AppCompatActivityExt.kt @@ -1,13 +1,18 @@ package com.template.nanamare.ext +import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment -fun AppCompatActivity.replaceFragmentInActivity(fragment: Fragment, frameId: Int) { +fun AppCompatActivity.replaceFragmentInActivity( + fragmentClazz: Class, + frameId: Int, + args: Bundle +) { supportFragmentManager.transact { - replace(frameId, fragment) + replace(frameId, fragmentClazz, args, "$fragmentClazz") } } diff --git a/app/src/main/java/com/template/nanamare/ext/StringExt.kt b/app/src/main/java/com/template/nanamare/ext/StringExt.kt new file mode 100644 index 0000000..40945aa --- /dev/null +++ b/app/src/main/java/com/template/nanamare/ext/StringExt.kt @@ -0,0 +1,6 @@ +package com.template.nanamare.ext + +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken + +inline fun String.fromJson() = Gson().fromJson(this, object : TypeToken() {}.type) \ No newline at end of file diff --git a/app/src/main/java/com/template/nanamare/presentation/activity/MainActivity.kt b/app/src/main/java/com/template/nanamare/presentation/activity/MainActivity.kt index cf62e42..9e681b5 100644 --- a/app/src/main/java/com/template/nanamare/presentation/activity/MainActivity.kt +++ b/app/src/main/java/com/template/nanamare/presentation/activity/MainActivity.kt @@ -10,6 +10,7 @@ import com.template.nanamare.data.network.NetworkState import com.template.nanamare.databinding.MainActivityBinding import com.template.nanamare.domain.model.GenreModel import com.template.nanamare.ext.replaceFragmentInActivity +import com.template.nanamare.ext.toJsonString import com.template.nanamare.presentation.base.ui.BaseActivity import com.template.nanamare.presentation.fragment.MovieFragment import com.template.nanamare.presentation.mapper.GenrePresentationMapper @@ -39,7 +40,9 @@ class MainActivity : BaseActivity(R.layout.main_activity) { is NetworkState.Init -> hideLoadingPopup() is NetworkState.Loading -> showLoadingPopup() is NetworkState.Success> -> - replaceFragmentInActivity(MovieFragment(it.item.map(GenrePresentationMapper::mapToPresentation)), R.id.flContent) + replaceFragmentInActivity(MovieFragment::class.java, R.id.flContent, Bundle().apply { + putString(KEY_GENE, it.item.map(GenrePresentationMapper::mapToPresentation).toJsonString()) + }) is NetworkState.Error -> showToast(it.throwable.toString()) is NetworkState.ServerError -> showToast(it.toString()) } @@ -65,4 +68,8 @@ class MainActivity : BaseActivity(R.layout.main_activity) { ) } } + + companion object { + const val KEY_GENE = "KEY_GENE" + } } diff --git a/app/src/main/java/com/template/nanamare/presentation/activity/MovieInfoActivity.kt b/app/src/main/java/com/template/nanamare/presentation/activity/MovieInfoActivity.kt index 8b20c31..df3c582 100644 --- a/app/src/main/java/com/template/nanamare/presentation/activity/MovieInfoActivity.kt +++ b/app/src/main/java/com/template/nanamare/presentation/activity/MovieInfoActivity.kt @@ -6,18 +6,18 @@ import androidx.lifecycle.Observer import com.template.nanamare.BR import com.template.nanamare.BuildConfig.VIDEO_URL import com.template.nanamare.R -import com.template.nanamare.presentation.base.ui.BaseActivity -import com.template.nanamare.presentation.base.ui.SimpleRecyclerView -import com.template.nanamare.presentation.model.ActorPresentation +import com.template.nanamare.data.network.NetworkState import com.template.nanamare.databinding.ItemActorBinding import com.template.nanamare.databinding.MovieInfoActivityBinding -import com.template.nanamare.data.network.NetworkState import com.template.nanamare.domain.model.CreditModel import com.template.nanamare.domain.model.VideoModel import com.template.nanamare.presentation.anim.SimpleAnimation +import com.template.nanamare.presentation.base.ui.BaseActivity +import com.template.nanamare.presentation.base.ui.SimpleRecyclerView import com.template.nanamare.presentation.dialog.VideoFragment import com.template.nanamare.presentation.mapper.ActorPresentationMapper import com.template.nanamare.presentation.mapper.ResultPresentationMapper +import com.template.nanamare.presentation.model.ActorPresentation import com.template.nanamare.presentation.vm.MovieInfoViewModel import org.koin.androidx.viewmodel.ext.android.viewModel import java.util.* @@ -28,7 +28,10 @@ class MovieInfoActivity : BaseActivity(R.layout.movie_ private val actorSimpleAdapter by lazy { object : - SimpleRecyclerView.Adapter(R.layout.item_actor, BR.actor) { + SimpleRecyclerView.Adapter( + R.layout.item_actor, + BR.actor + ) { } } @@ -71,7 +74,8 @@ class MovieInfoActivity : BaseActivity(R.layout.movie_ } private fun initActorAdapter(creditModel: CreditModel) { - movieInfoViewModel.liveActor.value = creditModel.cast.map(ActorPresentationMapper::mapToPresentation) + movieInfoViewModel.liveActor.value = + creditModel.cast.map(ActorPresentationMapper::mapToPresentation) } private fun getUrl(it: NetworkState.Success) { @@ -79,7 +83,19 @@ class MovieInfoActivity : BaseActivity(R.layout.movie_ .asSequence() .filter { "YouTube".toLowerCase(Locale.getDefault()) == it.site.toLowerCase(Locale.getDefault()) } .reduce { acc, result -> if (acc.size > result.size) acc else result }.let { - VideoFragment(Uri.parse(VIDEO_URL).buildUpon().appendQueryParameter("v", it.key).build().toString()).show(supportFragmentManager, VideoFragment::class.simpleName) + VideoFragment().show( + supportFragmentManager, + VideoFragment::class.java, + Bundle().apply { + putString( + VideoFragment.KEY_VIDEO_URL, + Uri.parse(VIDEO_URL).buildUpon().appendQueryParameter("v", it.key) + .build() + .toString() + ) + }, + VideoFragment::class.simpleName + ) } } diff --git a/app/src/main/java/com/template/nanamare/presentation/base/ui/BaseDialogFragment.kt b/app/src/main/java/com/template/nanamare/presentation/base/ui/BaseDialogFragment.kt index 8b9ac64..effaa85 100644 --- a/app/src/main/java/com/template/nanamare/presentation/base/ui/BaseDialogFragment.kt +++ b/app/src/main/java/com/template/nanamare/presentation/base/ui/BaseDialogFragment.kt @@ -10,16 +10,22 @@ import androidx.annotation.LayoutRes import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import androidx.fragment.app.DialogFragment +import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager +import com.template.nanamare.ext.transact import com.template.nanamare.presentation.base.navigator.BaseNavigator -abstract class BaseDialogFragment(@LayoutRes private val layoutId: Int) - : DialogFragment(), BaseNavigator { +abstract class BaseDialogFragment(@LayoutRes private val layoutId: Int) : + DialogFragment(), BaseNavigator { lateinit var binding: B - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { binding = DataBindingUtil.inflate(inflater, layoutId, container, false) binding.lifecycleOwner = this return binding.root @@ -63,9 +69,14 @@ abstract class BaseDialogFragment(@LayoutRes private val la } override fun show(manager: FragmentManager, tag: String?) { - manager.beginTransaction().let { - it.add(this, tag) - it.commitAllowingStateLoss() + manager.transact { + add(this@BaseDialogFragment, tag) + } + } + + fun show(manager: FragmentManager, clazz: Class, args: Bundle, tag: String?) { + manager.transact { + add(clazz, args, tag) } } @@ -80,7 +91,7 @@ abstract class BaseDialogFragment(@LayoutRes private val la } override fun errorHandling(errorCode: String) { - if(isAdded) { + if (isAdded) { (activity as? BaseActivity<*>)?.errorHandling(errorCode) } } diff --git a/app/src/main/java/com/template/nanamare/presentation/base/ui/BaseViewPager.kt b/app/src/main/java/com/template/nanamare/presentation/base/ui/BaseViewPager.kt index 2d40ee1..392f97e 100644 --- a/app/src/main/java/com/template/nanamare/presentation/base/ui/BaseViewPager.kt +++ b/app/src/main/java/com/template/nanamare/presentation/base/ui/BaseViewPager.kt @@ -25,5 +25,4 @@ class BaseViewPager(fm: FragmentManager) : FragmentPagerAdapter(fm, BEHAVIOR_RES return fragmentList[position].second } - } \ No newline at end of file diff --git a/app/src/main/java/com/template/nanamare/presentation/dialog/VideoFragment.kt b/app/src/main/java/com/template/nanamare/presentation/dialog/VideoFragment.kt index 0122ce7..5ed0367 100644 --- a/app/src/main/java/com/template/nanamare/presentation/dialog/VideoFragment.kt +++ b/app/src/main/java/com/template/nanamare/presentation/dialog/VideoFragment.kt @@ -15,18 +15,20 @@ import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory import com.google.android.exoplayer2.util.Util import com.template.nanamare.AppApplication import com.template.nanamare.R -import com.template.nanamare.presentation.base.ui.BaseDialogFragment import com.template.nanamare.databinding.VideoDialogBinding +import com.template.nanamare.presentation.base.ui.BaseDialogFragment import com.template.nanamare.presentation.vm.VideoViewModel import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf @SuppressLint("StaticFieldLeak") -class VideoFragment(private val liveVideoUrl: String? = null) : +class VideoFragment : BaseDialogFragment(R.layout.video_dialog) { + private val videoUrl by lazy { arguments?.getString(KEY_VIDEO_URL) } + private val videoViewModel by viewModel { - parametersOf(liveVideoUrl) + parametersOf(videoUrl) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -45,11 +47,12 @@ class VideoFragment(private val liveVideoUrl: String? = null) : val iTag = 22 // quality val videoSource: MediaSource = ProgressiveMediaSource.Factory(dataSourceFactory) .createMediaSource(Uri.parse(it[iTag].url)) - binding.videoView.player = SimpleExoPlayer.Builder(requireContext()).build().apply { - playWhenReady = playWhenReady; - seekTo(currentWindowIndex, 0) - prepare(videoSource, false, false) - } + binding.videoView.player = + SimpleExoPlayer.Builder(requireContext()).build().apply { + playWhenReady = playWhenReady; + seekTo(currentWindowIndex, 0) + prepare(videoSource, false, false) + } } ?: run { showToast(R.string.empty_movie_url) dismiss() @@ -68,5 +71,8 @@ class VideoFragment(private val liveVideoUrl: String? = null) : binding.videoView.player?.release() } + companion object { + const val KEY_VIDEO_URL = "KEY_VIDEO_URL" + } } \ No newline at end of file diff --git a/app/src/main/java/com/template/nanamare/presentation/fragment/MovieCategoryFragment.kt b/app/src/main/java/com/template/nanamare/presentation/fragment/MovieCategoryFragment.kt index 14a384b..fd52916 100644 --- a/app/src/main/java/com/template/nanamare/presentation/fragment/MovieCategoryFragment.kt +++ b/app/src/main/java/com/template/nanamare/presentation/fragment/MovieCategoryFragment.kt @@ -22,12 +22,15 @@ import com.template.nanamare.utils.decoration.GridSpacingItemDecoration import org.koin.androidx.viewmodel.ext.android.viewModel import org.koin.core.parameter.parametersOf -class MovieCategoryFragment(private val genre: GenrePresentation? = null) : +class MovieCategoryFragment : BaseFragment(R.layout.movie_category_fragment), BaseNavigator { private val movieCategoryViewModel by viewModel { parametersOf(this) } + + private val genre by lazy { arguments?.getParcelable(KEY_GENRE_PRESENTATION) } + private val column by lazy { resources.getInteger(R.integer.grid_column) } private val space by lazy { resources.getDimension(R.dimen.grid_space).toInt() } @@ -84,4 +87,13 @@ class MovieCategoryFragment(private val genre: GenrePresentation? = null) : } } + companion object { + const val KEY_GENRE_PRESENTATION = "KEY_GENRE_PRESENTATION" + fun getInstance(genre: GenrePresentation) = MovieCategoryFragment().apply { + arguments = Bundle().apply { + putParcelable(KEY_GENRE_PRESENTATION, genre) + } + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/template/nanamare/presentation/fragment/MovieFragment.kt b/app/src/main/java/com/template/nanamare/presentation/fragment/MovieFragment.kt index 51bd158..ea4de0c 100644 --- a/app/src/main/java/com/template/nanamare/presentation/fragment/MovieFragment.kt +++ b/app/src/main/java/com/template/nanamare/presentation/fragment/MovieFragment.kt @@ -4,12 +4,13 @@ import android.os.Bundle import android.view.View import com.template.nanamare.R import com.template.nanamare.databinding.MovieFragmentBinding +import com.template.nanamare.ext.fromJson import com.template.nanamare.presentation.activity.MainActivity import com.template.nanamare.presentation.base.ui.BaseFragment import com.template.nanamare.presentation.base.ui.BaseViewPager import com.template.nanamare.presentation.model.GenrePresentation -class MovieFragment(private val genres: List? = null) : +class MovieFragment : BaseFragment(R.layout.movie_fragment) { private val baseViewPager by lazy { BaseViewPager(childFragmentManager) } @@ -17,9 +18,9 @@ class MovieFragment(private val genres: List? = null) : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.run { - genres?.let { + arguments?.getString(MainActivity.KEY_GENE)?.fromJson>()?.let { for (genre in it) { - baseViewPager.addFragment(MovieCategoryFragment(genre), genre.name) + baseViewPager.addFragment(MovieCategoryFragment.getInstance(genre), genre.name) } } viewPager.adapter = baseViewPager diff --git a/app/src/main/java/com/template/nanamare/presentation/model/GenrePresentation.kt b/app/src/main/java/com/template/nanamare/presentation/model/GenrePresentation.kt index a336617..c17f1eb 100644 --- a/app/src/main/java/com/template/nanamare/presentation/model/GenrePresentation.kt +++ b/app/src/main/java/com/template/nanamare/presentation/model/GenrePresentation.kt @@ -1,6 +1,34 @@ package com.template.nanamare.presentation.model +import android.os.Parcel +import android.os.Parcelable + data class GenrePresentation( val id: Int, val name: String -): BasePresentation \ No newline at end of file +) : BasePresentation, Parcelable { + constructor(parcel: Parcel) : this( + parcel.readInt(), + parcel.readString() ?: "" + ) { + } + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeInt(id) + parcel.writeString(name) + } + + override fun describeContents(): Int { + return 0 + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): GenrePresentation { + return GenrePresentation(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/template/nanamare/presentation/vm/VideoViewModel.kt b/app/src/main/java/com/template/nanamare/presentation/vm/VideoViewModel.kt index 234c053..7d48bc4 100644 --- a/app/src/main/java/com/template/nanamare/presentation/vm/VideoViewModel.kt +++ b/app/src/main/java/com/template/nanamare/presentation/vm/VideoViewModel.kt @@ -3,8 +3,8 @@ package com.template.nanamare.presentation.vm import androidx.lifecycle.MutableLiveData import com.template.nanamare.presentation.base.ui.BaseViewModel -class VideoViewModel(private val liveVideoUrl: String) : BaseViewModel() { +class VideoViewModel(private val videoUrl: String) : BaseViewModel() { var liveVideoPath = MutableLiveData().apply { - value = liveVideoUrl + value = videoUrl } } \ No newline at end of file