diff --git a/app/build.gradle b/app/build.gradle index 67f8662..83a6699 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,6 +66,7 @@ dependencies { implementation 'me.relex:circleindicator:2.1.6' implementation 'org.imaginativeworld.whynotimagecarousel:whynotimagecarousel:2.1.0' implementation 'nl.joery.animatedbottombar:library:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.0' implementation 'com.google.android.exoplayer:exoplayer:2.14.2' implementation 'com.google.android.exoplayer:exoplayer-core:2.14.2' implementation 'com.google.android.exoplayer:exoplayer-dash:2.14.2' diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json new file mode 100644 index 0000000..b93a8b9 --- /dev/null +++ b/app/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "id.blossom", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 1, + "versionName": "1.0", + "outputFile": "app-release.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6dd3116..6479095 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,22 +3,24 @@ xmlns:tools="http://schemas.android.com/tools"> - - - - + + diff --git a/app/src/main/java/id/blossom/data/api/NetworkService.kt b/app/src/main/java/id/blossom/data/api/NetworkService.kt index fc13696..e833192 100644 --- a/app/src/main/java/id/blossom/data/api/NetworkService.kt +++ b/app/src/main/java/id/blossom/data/api/NetworkService.kt @@ -61,6 +61,7 @@ interface NetworkService { @GET("luckyanime/properties/genre/{genreId}") suspend fun getPropertiesGenreAnime( @Path("genreId") genreId: String, + @Query("page") page: Int, ) : PropertyGenresAnimeResponse // streaming diff --git a/app/src/main/java/id/blossom/data/repository/anime/AnimeRepository.kt b/app/src/main/java/id/blossom/data/repository/anime/AnimeRepository.kt index 91a3bb9..bb0392e 100644 --- a/app/src/main/java/id/blossom/data/repository/anime/AnimeRepository.kt +++ b/app/src/main/java/id/blossom/data/repository/anime/AnimeRepository.kt @@ -67,9 +67,9 @@ class AnimeRepository @Inject constructor(private val networkService: NetworkSer } } - fun getResultGenresAnime(genres: String): Flow> { + fun getResultGenresAnime(genres: String, page: Int): Flow> { return flow { - emit(networkService.getPropertiesGenreAnime(genres)) + emit(networkService.getPropertiesGenreAnime(genres, page)) }.map { it.data!! } diff --git a/app/src/main/java/id/blossom/ui/activity/about/AboutActivity.kt b/app/src/main/java/id/blossom/ui/activity/about/AboutActivity.kt new file mode 100644 index 0000000..5f12a50 --- /dev/null +++ b/app/src/main/java/id/blossom/ui/activity/about/AboutActivity.kt @@ -0,0 +1,70 @@ +package id.blossom.ui.activity.about + +import android.content.Context +import android.content.Intent +import android.net.Uri +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import androidx.browser.customtabs.CustomTabsIntent +import id.blossom.BuildConfig +import id.blossom.databinding.ActivityAboutBinding +import id.blossom.utils.Utils + +class AboutActivity : AppCompatActivity() { + + lateinit var binding: ActivityAboutBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityAboutBinding.inflate(layoutInflater) + setContentView(binding.root) + Utils().setFullScreenFlag(window) + val customBrowser = CustomTabsIntent.Builder().build() + + binding.tvVersion.text = "Version ${BuildConfig.VERSION_NAME}" + binding.llGithub.setOnClickListener { + customBrowser.launchUrl(this, Uri.parse("https://github.com/evnx32")) + } + + binding.llApi.setOnClickListener { + customBrowser.launchUrl( + this, + Uri.parse("https://github.com/LuckyIndraEfendi/AnimeIndo-Rest-API") + ) + } + + binding.llLicense.setOnClickListener { + customBrowser.launchUrl( + this, + Uri.parse("https://www.apache.org/licenses/LICENSE-2.0")) + } + + binding.llInstagram.setOnClickListener { + customBrowser.launchUrl( + this, + Uri.parse("https://www.instagram.com/dword_ptr/") + ) + } + + binding.llFacebook.setOnClickListener { + customBrowser.launchUrl( + this, + Uri.parse("https://www.facebook.com/KanMaruKun") + ) + } + + binding.llEmail.setOnClickListener { + val intent = Intent(Intent.ACTION_SENDTO) + intent.data = Uri.parse("mailto:evnx32@gmail.com") + startActivity(intent) + } + + } + + companion object { + fun start(context: Context) { + val intent = Intent(context, AboutActivity::class.java) + context.startActivity(intent) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/id/blossom/ui/activity/faq/FaqActivity.kt b/app/src/main/java/id/blossom/ui/activity/faq/FaqActivity.kt new file mode 100644 index 0000000..c93b7a5 --- /dev/null +++ b/app/src/main/java/id/blossom/ui/activity/faq/FaqActivity.kt @@ -0,0 +1,29 @@ +package id.blossom.ui.activity.faq + +import android.content.Context +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import id.blossom.databinding.ActivityFaqBinding +import id.blossom.utils.Utils + +class FaqActivity : AppCompatActivity() { + + lateinit var binding: ActivityFaqBinding + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityFaqBinding.inflate(layoutInflater) + setContentView(binding.root) + Utils().setFullScreenFlag(window) + + } + + + companion object { + fun start(context: Context) { + val intent = Intent(context, FaqActivity::class.java) + context.startActivity(intent) + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/id/blossom/ui/activity/genres/GenresResultActivity.kt b/app/src/main/java/id/blossom/ui/activity/genres/GenresResultActivity.kt index 88713b3..a9908ab 100644 --- a/app/src/main/java/id/blossom/ui/activity/genres/GenresResultActivity.kt +++ b/app/src/main/java/id/blossom/ui/activity/genres/GenresResultActivity.kt @@ -54,7 +54,7 @@ class GenresResultActivity : AppCompatActivity() { binding.tvSelectedGenre.text = "Hasil Pencarian Genre $genreName" if (genreId != null) { - genresResultViewModel.fetchGenresResultAnime(genreId) + genresResultViewModel.fetchGenresResultAnime(genreId, page) } else { Toast.makeText(this, "Genre Id is null", Toast.LENGTH_LONG).show() } @@ -65,42 +65,38 @@ class GenresResultActivity : AppCompatActivity() { binding.animeResultGenreRv.setLoadingListener(object : XRecyclerView.LoadingListener { override fun onRefresh() { page = 1 - //genresResultViewModel.fetchGenresResultAnime(genreId.toString()) + genresResultViewModel.fetchGenresResultAnime(genreId.toString(), page) } override fun onLoadMore() { page++ - //scheduleViewModel.fetchScheduleAnime(page, queryDays.toString()) + genresResultViewModel.fetchGenresResultAnime(genreId.toString(), page) } }) } private fun setupObserver() { - lifecycleScope.launch { - repeatOnLifecycle(Lifecycle.State.STARTED) { - genresResultViewModel.uiStateGenresResultAnime.collect { - when (it) { - is UiState.Success -> { - binding.progressPropertiesGenre.visibility = View.GONE - renderPropertiesGenre(it.data) - } - is UiState.Loading -> { - binding.progressPropertiesGenre.visibility = View.VISIBLE - } - is UiState.Error -> { - //Handle Error - Toast.makeText(this@GenresResultActivity, it.message, Toast.LENGTH_LONG) - .show() - } - } + + genresResultViewModel.uiStateGenresResultAnime.observe(this) { + when (it) { + is UiState.Success -> { + binding.progressPropertiesGenre.visibility = View.GONE + renderPropertiesGenre(it.data) + } + is UiState.Loading -> { + binding.progressPropertiesGenre.visibility = View.VISIBLE + } + is UiState.Error -> { + //Handle Error + Toast.makeText(this@GenresResultActivity, it.message, Toast.LENGTH_LONG) + .show() } } } } private fun renderPropertiesGenre(data: List) { - genresResultAdapter.clearData() genresResultAdapter.addData(data) genresResultAdapter.notifyDataSetChanged() } @@ -116,7 +112,7 @@ class GenresResultActivity : AppCompatActivity() { companion object { - fun start(context : Context, genreId : String, genreName : String ){ + fun start(context: Context, genreId: String, genreName: String) { val intent = Intent(context, GenresResultActivity::class.java) intent.putExtra("genreId", genreId) intent.putExtra("genreName", genreName) diff --git a/app/src/main/java/id/blossom/ui/activity/genres/GenresResultViewModel.kt b/app/src/main/java/id/blossom/ui/activity/genres/GenresResultViewModel.kt index d6bef5c..b6fa0e7 100644 --- a/app/src/main/java/id/blossom/ui/activity/genres/GenresResultViewModel.kt +++ b/app/src/main/java/id/blossom/ui/activity/genres/GenresResultViewModel.kt @@ -1,5 +1,7 @@ package id.blossom.ui.activity.genres +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import id.blossom.data.model.anime.genres.result.PropertyGenresAnimeDataItem @@ -13,17 +15,17 @@ import kotlinx.coroutines.launch class GenresResultViewModel (private val animeRepository: AnimeRepository) : ViewModel() { private val _uiStateGenresResultAnime = - MutableStateFlow>>(UiState.Loading) - val uiStateGenresResultAnime: StateFlow>> = _uiStateGenresResultAnime + MutableLiveData>>(UiState.Loading) + val uiStateGenresResultAnime: LiveData>> = _uiStateGenresResultAnime init { } - fun fetchGenresResultAnime(genres : String) { + fun fetchGenresResultAnime(genres : String, page : Int) { viewModelScope.launch { - animeRepository.getResultGenresAnime(genres) + animeRepository.getResultGenresAnime(genres,page) .catch { e -> _uiStateGenresResultAnime.value = UiState.Error(e.toString()) } diff --git a/app/src/main/java/id/blossom/ui/activity/showall/adapter/ShowAllOngoingAnimeAdapter.kt b/app/src/main/java/id/blossom/ui/activity/showall/adapter/ShowAllOngoingAnimeAdapter.kt index 495046b..1e0eaa5 100644 --- a/app/src/main/java/id/blossom/ui/activity/showall/adapter/ShowAllOngoingAnimeAdapter.kt +++ b/app/src/main/java/id/blossom/ui/activity/showall/adapter/ShowAllOngoingAnimeAdapter.kt @@ -21,7 +21,8 @@ class ShowAllOngoingAnimeAdapter ( RecyclerView.ViewHolder(binding.root) { fun bind(value: OngoingAnimeDataItem) { binding.animeTitle.text = value.title.toString() - binding.llAnimeRate.visibility = View.GONE + binding.animeRateDetail.text = value.episode.toString() + binding.animeRateIcon.visibility = View.GONE Glide.with(binding.animeImageView.context).load(value.image) .diskCacheStrategy(DiskCacheStrategy.ALL).into(binding.animeImageView) itemView.setOnClickListener { diff --git a/app/src/main/java/id/blossom/ui/activity/stream/StreamAnimeActivity.kt b/app/src/main/java/id/blossom/ui/activity/stream/StreamAnimeActivity.kt index 519d8d7..ac2cb0d 100644 --- a/app/src/main/java/id/blossom/ui/activity/stream/StreamAnimeActivity.kt +++ b/app/src/main/java/id/blossom/ui/activity/stream/StreamAnimeActivity.kt @@ -54,13 +54,13 @@ class StreamAnimeActivity : AppCompatActivity() { lateinit var binding: ActivityStreamBinding private var exoPlayer: SimpleExoPlayer? = null - lateinit var videoSettingBinding : VideoSettingBinding - lateinit var videoSettingDialogBinding : PopupVideoSettingCfgBinding - lateinit var itemVideoSettingBinding : ItemVideoSettingCfgBinding - private var userSettings : UserSettingsEntity? = null - private var settingsBottomSheet : BottomSheetDialog? = null - - private var listVidQuality : List = listOf() + lateinit var videoSettingBinding: VideoSettingBinding + lateinit var videoSettingDialogBinding: PopupVideoSettingCfgBinding + lateinit var itemVideoSettingBinding: ItemVideoSettingCfgBinding + private var userSettings: UserSettingsEntity? = null + private var settingsBottomSheet: BottomSheetDialog? = null + private var savedDurationState = 0L + private var listVidQuality: List = listOf() // ExoPlayer Components private lateinit var fwdBtn: ImageView @@ -80,6 +80,7 @@ class StreamAnimeActivity : AppCompatActivity() { private var _selectedVidQuality = "" private var _selectedVidSpeed = "" + @Inject lateinit var streamAnimeViewModel: StreamAnimeViewModel @@ -137,12 +138,12 @@ class StreamAnimeActivity : AppCompatActivity() { streamAnimeViewModel.savedStateDuration = exoPlayer!!.currentPosition val orientation: Int = this@StreamAnimeActivity.resources.configuration.orientation if (orientation == Configuration.ORIENTATION_PORTRAIT) { - fillScreen.visibility = View.VISIBLE + //fillScreen.visibility = View.VISIBLE requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE binding.playerView.resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT binding.playerView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN } else { - fillScreen.visibility = View.GONE + //fillScreen.visibility = View.GONE requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED binding.playerView.resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT binding.playerView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN @@ -171,7 +172,7 @@ class StreamAnimeActivity : AppCompatActivity() { } } - streamAnimeViewModel.uiStateUserSetting.observe(this@StreamAnimeActivity){ + streamAnimeViewModel.uiStateUserSetting.observe(this@StreamAnimeActivity) { if (it != null) { userSettings = it } else { @@ -188,8 +189,8 @@ class StreamAnimeActivity : AppCompatActivity() { } - private fun renderEpisodeUrlList(list: List, quality : String) { - val selectedResolution = if (quality != ""){ + private fun renderEpisodeUrlList(list: List, quality: String) { + val selectedResolution = if (quality != "") { quality } else { userSettings!!.vidQuality @@ -203,7 +204,9 @@ class StreamAnimeActivity : AppCompatActivity() { list.map { if (it.size == selectedResolution) { setupPlayer(it.episode!!) + return@map } + setupPlayer(list[0].episode!!) } } } @@ -231,6 +234,8 @@ class StreamAnimeActivity : AppCompatActivity() { exoPlayer?.playWhenReady = true exoTitle.text = animeTitle + + streamAnimeViewModel.uiStateCurrentWatch.observe(this) { data -> if (data == null) { streamAnimeViewModel.setSavedStateDuration( @@ -248,18 +253,35 @@ class StreamAnimeActivity : AppCompatActivity() { } } + if (savedDurationState != 0L) { + exoPlayer!!.seekTo(savedDurationState) + } exoPlayer?.addListener(object : Player.EventListener { override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { if (playbackState == Player.STATE_ENDED) { Toast.makeText( this@StreamAnimeActivity, - "Video has ended", + "Video berakhir", Toast.LENGTH_LONG ).show() + + if (exoPlayer != null) { + val duration = exoPlayer!!.duration + val currentPosition = exoPlayer!!.currentPosition + lifecycleScope.launch { + if (currentPosition > 0) { + streamAnimeViewModel.updateSavedStateDuration( + true, + duration, + currentPosition, + episodeId + ) + } + } + } } } }) - handler.post(updateRunnable) } } @@ -298,14 +320,35 @@ class StreamAnimeActivity : AppCompatActivity() { override fun onBackPressed() { - super.onBackPressed() if (exoPlayer != null) { - if (exoPlayer!!.isPlaying) { streamAnimeViewModel.savedStateDuration = exoPlayer!!.currentPosition exoPlayer?.playWhenReady = false } } + + val orientation = resources.configuration.orientation + + if (orientation == Configuration.ORIENTATION_PORTRAIT) { + val duration = exoPlayer!!.duration + val currentPosition = exoPlayer!!.currentPosition + lifecycleScope.launch { + if (currentPosition > 0) { + streamAnimeViewModel.updateSavedStateDuration( + true, + duration, + currentPosition, + episodeId + ) + } + } + super.onBackPressed() + + } else { + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED + binding.playerView.resizeMode = AspectRatioFrameLayout.RESIZE_MODE_FIT + binding.playerView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN + } } override fun onPause() { @@ -377,20 +420,19 @@ class StreamAnimeActivity : AppCompatActivity() { } - - private fun showSettingVideo(){ + private fun showSettingVideo() { settingsBottomSheet = BottomSheetDialog(this) videoSettingBinding = VideoSettingBinding.inflate(layoutInflater) settingsBottomSheet!!.setContentView(videoSettingBinding.root) - if (_selectedVidQuality != ""){ + if (_selectedVidQuality != "") { videoSettingBinding.tvVideoQuality.text = _selectedVidQuality } else { videoSettingBinding.tvVideoQuality.text = userSettings!!.vidQuality } - if (_selectedVidSpeed != ""){ + if (_selectedVidSpeed != "") { videoSettingBinding.tvVideoSpeed.text = _selectedVidSpeed } else { videoSettingBinding.tvVideoSpeed.text = "1.0x" @@ -411,6 +453,7 @@ class StreamAnimeActivity : AppCompatActivity() { settingsBottomSheet!!.show() } + private fun showConfig(cfg: Int) { val popupDialog = Dialog(this) @@ -432,10 +475,15 @@ class StreamAnimeActivity : AppCompatActivity() { _selectedVidQuality = quality.size.toString() videoSettingBinding.tvVideoQuality.text = quality.size settingsBottomSheet!!.dismiss() + saveStateDuration = exoPlayer!!.currentPosition exoPlayer?.release() renderEpisodeUrlList(listVidQuality, quality.size.toString()) - Toast.makeText(this@StreamAnimeActivity, "Video Quality ${quality.size}", Toast.LENGTH_SHORT).show() + Toast.makeText( + this@StreamAnimeActivity, + "Video Quality ${quality.size}", + Toast.LENGTH_SHORT + ).show() } videoSettingDialogBinding.llItemVideoSettingCfg.addView(itemBinding.root) @@ -452,8 +500,13 @@ class StreamAnimeActivity : AppCompatActivity() { popupDialog.dismiss() _selectedVidSpeed = speed.toString() settingsBottomSheet!!.dismiss() - changeVideoSpeed(speed) - Toast.makeText(this@StreamAnimeActivity, "Video Speed $speed", Toast.LENGTH_SHORT).show() + exoPlayer?.playbackParameters = PlaybackParameters(speed) + + Toast.makeText( + this@StreamAnimeActivity, + "Video Speed $speed", + Toast.LENGTH_SHORT + ).show() } videoSettingDialogBinding.llItemVideoSettingCfg.addView(itemBinding.root) @@ -462,11 +515,4 @@ class StreamAnimeActivity : AppCompatActivity() { } popupDialog.show() } - - - fun changeVideoSpeed(speed: Float) { - exoPlayer?.playbackParameters = PlaybackParameters(speed) - } - - } \ No newline at end of file diff --git a/app/src/main/java/id/blossom/ui/fragment/home/HomeFragment.kt b/app/src/main/java/id/blossom/ui/fragment/home/HomeFragment.kt index 46f58d3..a9a71bc 100644 --- a/app/src/main/java/id/blossom/ui/fragment/home/HomeFragment.kt +++ b/app/src/main/java/id/blossom/ui/fragment/home/HomeFragment.kt @@ -18,6 +18,8 @@ import id.blossom.databinding.FragmentHomeBinding import id.blossom.di.component.DaggerActivityComponent import id.blossom.di.module.ActivityModule import id.blossom.ui.MainActivity +import id.blossom.ui.activity.about.AboutActivity +import id.blossom.ui.activity.faq.FaqActivity import id.blossom.ui.activity.showall.ShowAllAnimeActivity import id.blossom.ui.base.UiState import id.blossom.ui.fragment.home.adapter.GenresAnimeAdapter @@ -88,6 +90,14 @@ class HomeFragment : Fragment() { ShowAllAnimeActivity.start(requireContext(), "recent") } + binding.clBannerPengumuman.setOnClickListener { + AboutActivity.start(requireContext()) + } + + binding.clBannerFaq.setOnClickListener { + FaqActivity.start(requireContext()) + } + binding.tvLihatSemuaOngoingAnime.setOnClickListener { ShowAllAnimeActivity.start(requireContext(), "ongoing") } diff --git a/app/src/main/res/drawable/banner_2.png b/app/src/main/res/drawable/banner_2.png new file mode 100644 index 0000000..27514e4 Binary files /dev/null and b/app/src/main/res/drawable/banner_2.png differ diff --git a/app/src/main/res/drawable/fluent_pause_28_regular.xml b/app/src/main/res/drawable/fluent_pause_28_regular.xml index 9dbd5b3..f680507 100644 --- a/app/src/main/res/drawable/fluent_pause_28_regular.xml +++ b/app/src/main/res/drawable/fluent_pause_28_regular.xml @@ -1,6 +1,6 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_faq.xml b/app/src/main/res/layout/activity_faq.xml new file mode 100644 index 0000000..4a7213b --- /dev/null +++ b/app/src/main/res/layout/activity_faq.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_genres_result.xml b/app/src/main/res/layout/activity_genres_result.xml index 4960597..cc9b1ee 100644 --- a/app/src/main/res/layout/activity_genres_result.xml +++ b/app/src/main/res/layout/activity_genres_result.xml @@ -1,82 +1,87 @@ - - - + + - + android:layout_height="70dp" + app:mwhCloseColor="@color/colorPrimary" + app:mwhStartColor="@color/white" /> - + - + + - - + - + + + - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_show_all_anime.xml b/app/src/main/res/layout/activity_show_all_anime.xml index b917ab1..a65a19d 100644 --- a/app/src/main/res/layout/activity_show_all_anime.xml +++ b/app/src/main/res/layout/activity_show_all_anime.xml @@ -57,7 +57,16 @@ - + + app:layout_constraintTop_toBottomOf="@+id/divider" /> + app:layout_constraintTop_toBottomOf="@+id/all_anime_rv" /> \ 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 076d401..499f202 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -4,246 +4,399 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> - + + + android:layout_height="wrap_content" + android:orientation="vertical" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + - - - - - /> - - - - - - - + /> + - - + + + + + + + + + android:orientation="horizontal"> - + - - - + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/search_anime" /> + + + + + + - - - + android:layout_gravity="center" + android:layout_marginEnd="10dp" + android:layout_marginBottom="10dp" + android:text="Lihat Semua" + android:textColor="@color/colorPrimary" + android:textSize="15sp" + android:textStyle="bold" /> - + android:layout_gravity="center" /> - - - - - - - - + - + - + + android:orientation="horizontal"> - - - - - - - + + + android:layout_gravity="center" + android:layout_marginEnd="10dp" + android:layout_marginBottom="10dp" + android:text="Lihat Semua" + android:textColor="@color/colorPrimary" + android:textSize="15sp" + android:textStyle="bold" /> + + + - + - - + + diff --git a/app/src/main/res/layout/item_anime_holder_full.xml b/app/src/main/res/layout/item_anime_holder_full.xml index 4370e8d..69948f3 100644 --- a/app/src/main/res/layout/item_anime_holder_full.xml +++ b/app/src/main/res/layout/item_anime_holder_full.xml @@ -57,6 +57,7 @@ android:textColor="@color/white" /> + + + + + + + + + diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index ca82bfb..f35c3a0 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -13,6 +13,7 @@ ?attr/colorPrimaryVariant @style/CustomBottomSheetDialog + @style/CustomBottomSheet @font/uni_neue_bold_full