Skip to content

Commit

Permalink
added manga reader and network security configs. Also changed bottom …
Browse files Browse the repository at this point in the history
…bar a little
  • Loading branch information
justdvnsh committed Oct 10, 2021
1 parent 5bf7bdb commit fa6ce4a
Show file tree
Hide file tree
Showing 21 changed files with 321 additions and 26 deletions.
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/AppTheme">
<activity
android:name=".SplashActivity"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import dagger.hilt.android.AndroidEntryPoint
import divyansh.tech.animeclassroom.Event
import divyansh.tech.animeclassroom.EventObserver
import divyansh.tech.animeclassroom.databinding.FragmentMangaDetailsBinding
import divyansh.tech.animeclassroom.manga.screens.mangaDetail.callbacks.MangaDetailCallbacks
import divyansh.tech.animeclassroom.manga.screens.mangaDetail.epoxy.EpoxyMangaDetailController

@AndroidEntryPoint
Expand All @@ -27,7 +28,7 @@ class MangaDetailFragment: Fragment() {
private val args by navArgs<MangaDetailFragmentArgs>()

private val controller by lazy {
EpoxyMangaDetailController()
EpoxyMangaDetailController(MangaDetailCallbacks(viewModel))
}

override fun onCreateView(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package divyansh.tech.animeclassroom.manga.screens.mangaDetail.callbacks

import divyansh.tech.animeclassroom.manga.screens.mangaDetail.MangaDetailFragment
import divyansh.tech.animeclassroom.manga.screens.mangaDetail.MangaDetailFragmentDirections
import divyansh.tech.animeclassroom.manga.screens.mangaDetail.MangaDetailViewModel
import divyansh.tech.animeclassroom.mangaModels.Chapters

class MangaDetailCallbacks(
private val mangaDetailViewModel: MangaDetailViewModel
) {

fun onChapterClick(chapters: Chapters, mangaName: String) {
val action = MangaDetailFragmentDirections.actionMangaDetailFragmentToMangaPlayerFragment(
chapterName = chapters.chapterName,
chapterUrl = chapters.chapterUrl,
mangaName = mangaName
)
mangaDetailViewModel.changeNavigation(action)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,31 +6,34 @@ import com.airbnb.epoxy.TypedEpoxyController
import divyansh.tech.animeclassroom.animeDetail.epoxy.EpoxyAnimeDetailGenreModel_
import divyansh.tech.animeclassroom.animeDetail.epoxy.epoxyAnimeDetailPlotSummary
import divyansh.tech.animeclassroom.home.epoxy.epoxyTitle
import divyansh.tech.animeclassroom.manga.screens.mangaDetail.callbacks.MangaDetailCallbacks
import divyansh.tech.animeclassroom.mangaModels.MangaDetail

class EpoxyMangaDetailController: TypedEpoxyController<MangaDetail>() {
class EpoxyMangaDetailController(
private val callback: MangaDetailCallbacks
): TypedEpoxyController<MangaDetail>() {
override fun buildModels(data: MangaDetail?) {
data?.let {
data?.let {manga ->
epoxyMangaDetailHeader{
id(it.imageUrl)
manga(it)
id(manga.imageUrl)
manga(manga)
spanSizeOverride { totalSpanCount, position, itemCount -> totalSpanCount }
}

epoxyMangaDetailPlotSummary {
id(it.name)
mangaDetail(it)
id(manga.name)
mangaDetail(manga)
spanSizeOverride { totalSpanCount, position, itemCount -> totalSpanCount}
}

epoxyTitle {
id(it.name)
id(manga.name)
headerTitle("Genres")
}

val list: ArrayList<EpoxyAnimeDetailGenreModel_> = ArrayList()

it.genreModel.forEach {
manga.genreModel.forEach {
list.add(
EpoxyAnimeDetailGenreModel_()
.id(it.genreUrl)
Expand All @@ -39,21 +42,23 @@ class EpoxyMangaDetailController: TypedEpoxyController<MangaDetail>() {
}

CarouselModel_()
.id(it.hashCode())
.id(manga.hashCode())
.models(list)
.padding(Carousel.Padding.dp(20,0,20,0,20))
.addTo(this)

epoxyTitle {
id(it.name)
id(manga.name)
headerTitle("Chapters")
spanSizeOverride { totalSpanCount, _, _ -> totalSpanCount }
}

it.chapters.forEach {
manga.chapters.forEach {
epoxyMangaDetailChapter {
id(it.chapterUrl)
chapter(it)
mangaName(manga.name)
chapterClick(callback)
spanSizeOverride { totalSpanCount, _, _ -> totalSpanCount / 2}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.airbnb.epoxy.EpoxyModelClass
import divyansh.tech.animeclassroom.R
import divyansh.tech.animeclassroom.animeDetail.callbacks.EpisodeClickCallback
import divyansh.tech.animeclassroom.animeDetail.callbacks.FavoriteClickCallback
import divyansh.tech.animeclassroom.manga.screens.mangaDetail.callbacks.MangaDetailCallbacks
import divyansh.tech.animeclassroom.mangaModels.Chapters
import divyansh.tech.animeclassroom.mangaModels.MangaDetail
import divyansh.tech.animeclassroom.models.home.AnimeDetailModel
Expand Down Expand Up @@ -39,7 +40,15 @@ abstract class EpoxyMangaDetailChapterModel: DataBindingEpoxyModel() {
@EpoxyAttribute
lateinit var chapter: Chapters

@EpoxyAttribute
lateinit var mangaName: String

@EpoxyAttribute
lateinit var chapterClick: MangaDetailCallbacks

override fun setDataBindingVariables(binding: ViewDataBinding) {
binding.setVariable(BR.chapter, chapter)
binding.setVariable(BR.mangaName, mangaName)
binding.setVariable(BR.chapterClick, chapterClick)
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,77 @@
package divyansh.tech.animeclassroom.manga.screens.mangaPlayer

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.navigation.fragment.findNavController
import androidx.navigation.fragment.navArgs
import androidx.recyclerview.widget.LinearLayoutManager
import dagger.hilt.android.AndroidEntryPoint
import divyansh.tech.animeclassroom.EventObserver
import divyansh.tech.animeclassroom.databinding.FragmentMangaPlayerBinding
import divyansh.tech.animeclassroom.manga.screens.mangaPlayer.epoxy.EpoxyMangaPlayerController

@AndroidEntryPoint
class MangaPlayerFragment: Fragment() {

private lateinit var _binding: FragmentMangaPlayerBinding
val binding get() = _binding

private val viewModel by viewModels<MangaPlayerViewModel>()

private val args by navArgs<MangaPlayerFragmentArgs>()

private val controller by lazy {
EpoxyMangaPlayerController()
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentMangaPlayerBinding.inflate(inflater, container, false)
binding.mangaToolbar.title.text = args.mangaName + " - " + args.chapterName
binding.mangaToolbar.goBack.setOnClickListener { findNavController().popBackStack() }
return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupRecyclerView()
setupObservers()
}

private fun setupRecyclerView() {
binding.mangaPlayerRv.apply {
layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)
adapter = controller.adapter
}
}

private fun setupObservers() {

viewModel.mangaChapterItemLiveData.observe(
viewLifecycleOwner,
Observer {
controller.setData(it)
}
)

viewModel.navigation.observe(
viewLifecycleOwner,
EventObserver {
findNavController().navigate(it)
}
)
}

override fun onResume() {
super.onResume()
viewModel.getChapterItems(args.chapterUrl)
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,35 @@
package divyansh.tech.animeclassroom.manga.screens.mangaPlayer

import android.util.Log
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import divyansh.tech.animeclassroom.ResultWrapper
import divyansh.tech.animeclassroom.common.CommonViewModel
import divyansh.tech.animeclassroom.di.DispatcherModule
import divyansh.tech.animeclassroom.mangaPlayer.MangaPlayerDefaultRepo
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class MangaPlayerViewModel @Inject constructor(): CommonViewModel() {
class MangaPlayerViewModel @Inject constructor(
private val repo: MangaPlayerDefaultRepo,
@DispatcherModule.IODispatcher private val coroutineDispatcher: CoroutineDispatcher
): CommonViewModel() {

private val _mangaChapterItemsLiveData = MutableLiveData<ArrayList<String>>()
val mangaChapterItemLiveData get() = _mangaChapterItemsLiveData

fun getChapterItems(url: String) {
viewModelScope.launch(coroutineDispatcher) {
val response = repo.getMangaChapter(url)
response.collect {
if (it is ResultWrapper.Success)
_mangaChapterItemsLiveData.postValue(it.data as ArrayList<String>)
else Log.i("MANGA PLAYER -> ", it.message.toString())
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package divyansh.tech.animeclassroom.manga.screens.mangaPlayer.epoxy

import com.airbnb.epoxy.TypedEpoxyController

class EpoxyMangaPlayerController(): TypedEpoxyController<ArrayList<String>>() {
override fun buildModels(data: ArrayList<String>?) {
data?.let {
it.forEach {
epoxyMangaPlayer {
id(it)
imageUrl(it)
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package divyansh.tech.animeclassroom.manga.screens.mangaPlayer.epoxy

import androidx.databinding.ViewDataBinding
import com.airbnb.epoxy.DataBindingEpoxyModel
import com.airbnb.epoxy.EpoxyAttribute
import com.airbnb.epoxy.EpoxyModelClass
import com.airbnb.epoxy.databinding.BR
import divyansh.tech.animeclassroom.R

@EpoxyModelClass(layout = R.layout.recycler_manga_player_item)
abstract class EpoxyMangaPlayerModel: DataBindingEpoxyModel() {
@EpoxyAttribute
lateinit var imageUrl: String

override fun setDataBindingVariables(binding: ViewDataBinding) {
binding.setVariable(BR.imageUrl, imageUrl)
}
}
12 changes: 6 additions & 6 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/mainNavHost"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintBottom_toTopOf="@id/bottomNavigation"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
Expand All @@ -21,15 +21,15 @@

<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottomNavigation"
android:background="@drawable/bottom_nav_bg"
android:layout_marginBottom="20dp"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@+id/startGuideline"
app:layout_constraintEnd_toEndOf="@+id/endGuideline"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:menu="@menu/bottom_nav_menu"
app:itemIconTint="@color/app_background"
app:itemIconTint="@color/colorPrimary"
android:background="@color/app_background"
app:labelVisibilityMode="selected"
/>

<include
Expand Down
30 changes: 30 additions & 0 deletions app/src/main/res/layout/fragment_manga_player.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<data />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
>

<include
android:id="@+id/mangaToolbar"
layout="@layout/toolbar_layout_general"
/>

<androidx.recyclerview.widget.RecyclerView
android:layout_height="0dp"
android:layout_width="match_parent"
android:id="@+id/mangaPlayerRv"
app:layout_constraintTop_toBottomOf="@id/mangaToolbar"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="@+id/startGuideline"
app:layout_constraintEnd_toEndOf="@+id/endGuideline"
/>

<include
layout="@layout/guideline_views"
/>

</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
9 changes: 9 additions & 0 deletions app/src/main/res/layout/recycler_chapter_item.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,14 @@
name="chapter"
type="divyansh.tech.animeclassroom.mangaModels.Chapters"
/>
<variable
name="mangaName"
type="String"
/>
<variable
name="chapterClick"
type="divyansh.tech.animeclassroom.manga.screens.mangaDetail.callbacks.MangaDetailCallbacks"
/>
</data>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
Expand All @@ -19,6 +27,7 @@
android:foreground="?android:attr/selectableItemBackground"
android:focusable="true"
android:layout_margin="10dp"
android:onClick="@{() -> chapterClick.onChapterClick(chapter, mangaName)}"
>

<androidx.constraintlayout.widget.ConstraintLayout
Expand Down
15 changes: 15 additions & 0 deletions app/src/main/res/layout/recycler_manga_player_item.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="imageUrl"
type="String"
/>
</data>
<androidx.appcompat.widget.AppCompatImageView
android:layout_height="match_parent"
android:layout_width="match_parent"
android:scaleType="fitXY"
imageUrl="@{imageUrl}"
/>
</layout>
Loading

0 comments on commit fa6ce4a

Please sign in to comment.