Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
c616b61
fix revenue typ int
NadaFeteiha Nov 25, 2022
52e3eb0
Update project configuration and dependencies
FaresM0hamed Sep 9, 2025
cc9c98c
Remove package declaration from AndroidManifest
FaresM0hamed Sep 9, 2025
f7910e7
Update Gradle plugin versions and add clean task
FaresM0hamed Sep 9, 2025
a287f87
Merge pull request #3 from Samrraa/chore/update-dependencies
FaresM0hamed Sep 9, 2025
0ff868d
feat: colors in project
BassantM Sep 9, 2025
033eb13
feat: colors in project
BassantM Sep 9, 2025
3b12c96
refactor: cast item UI and update styles
marwanqashwa Sep 9, 2025
0a2a6ef
hotfix: refactor naming
BassantM Sep 9, 2025
4b49232
Merge pull request #4 from Samrraa/feat/add-colors-in-system
BassantM Sep 9, 2025
750911c
Merge remote-tracking branch 'origin/develop' into feat/cast-section
marwanqashwa Sep 9, 2025
1048023
refactor: solve conflict color names and values
marwanqashwa Sep 9, 2025
7bc9c2f
feat: add font into dimens
BassantM Sep 9, 2025
1409769
feat: add font into dimens
BassantM Sep 9, 2025
52b780b
feat: add font into dimens and themes
BassantM Sep 9, 2025
0f0a873
add collections section to home screen
mohannadahmed00 Sep 9, 2025
9066d13
add the strings to the list collection layout
mohannadahmed00 Sep 10, 2025
7e45252
Merge pull request #6 from Samrraa/feat/add-fonts
FaresM0hamed Sep 16, 2025
ba77c86
feat: Add media list component
FaresM0hamed Sep 16, 2025
bed4956
Merge pull request #7 from Samrraa/refactor/collection-section
mohannadahmed00 Sep 16, 2025
bacc5f5
Merge branch 'develop' into feature/add-media-list-component
mohannadahmed00 Sep 16, 2025
3ab0049
Merge pull request #8 from Samrraa/feature/add-media-list-component
mohannadahmed00 Sep 16, 2025
e473894
feat: animate the popular slider card in home
Abdulrahman-Ragab-01 Sep 16, 2025
0e6271c
Merge remote-tracking branch 'origin/develop' into refactor/home-popu…
Abdulrahman-Ragab-01 Sep 16, 2025
fe14fc5
Merge remote-tracking branch 'origin/develop' into feat/cast-section
marwanqashwa Sep 16, 2025
7c78cde
refactor: update layout margins and remove unnecessary attributes
marwanqashwa Sep 16, 2025
d8bdfae
Merge pull request #5 from Samrraa/feat/cast-section
marwanqashwa Sep 16, 2025
bc294e1
Refactor: Update MediaUiState to MediaUi and simplify home screen sec…
mohannadahmed00 Sep 16, 2025
024a3d8
Merge remote-tracking branch 'origin/develop' into refactor/home-popu…
Abdulrahman-Ragab-01 Sep 16, 2025
2b60d07
fix: add corner radius for rating
Abdulrahman-Ragab-01 Sep 16, 2025
92d2a24
Merge pull request #9 from Samrraa/refactor/home-popular-slider
mohannadahmed00 Sep 17, 2025
b72c223
Merge remote-tracking branch 'origin/develop' into refactor/home-screen
mohannadahmed00 Sep 17, 2025
d56bb7a
feat: Add "What Should I Watch" suggestion card
Mostafa-alsaygh Sep 20, 2025
a6b9b07
feat: add item_featured_collection layout
Mostafa-alsaygh Sep 24, 2025
0d035c8
feat: Add "Need More to Watch" section to home screen
Mostafa-alsaygh Sep 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 46 additions & 39 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,21 @@ plugins {
id "kotlin-kapt"
id 'dagger.hilt.android.plugin'
id 'androidx.navigation.safeargs'
id 'com.google.gms.google-services'
id 'com.google.firebase.crashlytics'
id 'com.google.firebase.firebase-perf'
}

def localProperties = new Properties()
localProperties.load(new FileInputStream(rootProject.file("local.properties")))

android {
compileSdk 32
namespace "com.karrar.movieapp"
compileSdk 36

defaultConfig {
applicationId "com.karrar.movieapp"
minSdk 21
minSdk 23
targetSdk 32
versionCode 1
versionName "1.0"
Expand All @@ -37,13 +41,14 @@ android {
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '1.8'
jvmTarget = '17'
}
buildFeatures {
buildConfig true
dataBinding true
viewBinding true
}
Expand All @@ -52,69 +57,71 @@ android {

dependencies {

implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.5.1'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'androidx.core:core-ktx:1.17.0'
implementation 'androidx.appcompat:appcompat:1.7.1'
implementation 'com.google.android.material:material:1.13.0'
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation 'androidx.test.ext:junit:1.3.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.7.0'

//Test
testImplementation "org.junit.jupiter:junit-jupiter-api:5.8.2"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.8.2"
testImplementation "org.junit.jupiter:junit-jupiter-params:5.8.2"
testImplementation "org.junit.jupiter:junit-jupiter-api:5.13.4"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.13.4"
testImplementation "org.junit.jupiter:junit-jupiter-params:5.13.4"

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.squareup.retrofit2:retrofit:3.0.0'
implementation 'com.squareup.retrofit2:converter-gson:3.0.0'

implementation "com.squareup.okhttp3:okhttp:4.9.1"
implementation "com.squareup.okhttp3:okhttp:5.1.0"

//viewModel
implementation 'androidx.fragment:fragment-ktx:1.5.2'
implementation 'androidx.activity:activity-ktx:1.5.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.5.1'
implementation 'androidx.fragment:fragment-ktx:1.8.9'
implementation 'androidx.activity:activity-ktx:1.10.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.9.3'
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
implementation 'androidx.navigation:navigation-fragment-ktx:2.5.2'
implementation 'androidx.navigation:navigation-ui-ktx:2.5.2'
implementation 'androidx.navigation:navigation-fragment-ktx:2.9.3'
implementation 'androidx.navigation:navigation-ui-ktx:2.9.3'

implementation "androidx.recyclerview:recyclerview:1.2.0"
implementation "androidx.recyclerview:recyclerview:1.4.0"

//picasso
implementation 'com.squareup.picasso:picasso:2.71828'

// room dependency
def room_version = "2.4.3"
def room_version = "2.7.2"
implementation("androidx.room:room-runtime:$room_version")
kapt("androidx.room:room-compiler:$room_version")
implementation("androidx.room:room-ktx:$room_version")

implementation "com.google.dagger:hilt-android:2.42"
kapt "com.google.dagger:hilt-compiler:2.42"
implementation "com.google.dagger:hilt-android:2.57.1"
kapt "com.google.dagger:hilt-compiler:2.57.1"

implementation "androidx.compose.material3:material3:1.0.0-alpha14"
implementation "androidx.compose.material3:material3-window-size-class:1.0.0-alpha14"
implementation "androidx.compose.material3:material3:1.3.2"
implementation "androidx.compose.material3:material3-window-size-class:1.3.2"
//data store preferences
implementation "androidx.datastore:datastore-preferences:1.0.0"
implementation "androidx.datastore:datastore-preferences:1.1.7"


implementation 'androidx.core:core-splashscreen:1.0.0'

implementation 'androidx.appcompat:appcompat:1.0.0-alpha1'
implementation 'com.google.android.material:material:1.0.0-alpha1'
implementation 'androidx.core:core-splashscreen:1.0.1'

// Lottie
implementation 'com.airbnb.android:lottie:5.2.0'
implementation 'com.airbnb.android:lottie:6.6.7'

//Coil
implementation 'io.coil-kt:coil:2.2.2'
implementation 'io.coil-kt:coil:2.7.0'

implementation 'io.github.glailton.expandabletextview:expandabletextview:1.0.2'
implementation 'io.github.glailton.expandabletextview:expandabletextview:1.0.4'

implementation 'com.pierfrancescosoffritti.androidyoutubeplayer:core:11.1.0'
implementation 'com.pierfrancescosoffritti.androidyoutubeplayer:core:12.1.2'

// paging
implementation "androidx.paging:paging-runtime:3.1.1"
implementation "androidx.paging:paging-runtime-ktx:3.1.1"
implementation "androidx.paging:paging-runtime-ktx:3.3.6"

// firebase
implementation platform('com.google.firebase:firebase-bom:34.2.0')
implementation 'com.google.firebase:firebase-analytics'

implementation 'com.google.firebase:firebase-crashlytics'
implementation 'com.google.firebase:firebase-perf'
}
3 changes: 1 addition & 2 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.karrar.movieapp">
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.INTERNET" />

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ import com.karrar.movieapp.data.local.database.entity.series.*
ActorEntity::class, TrendingMovieEntity::class, NowStreamingMovieEntity::class,UpcomingMovieEntity::class,
MysteryMovieEntity::class,AdventureMovieEntity::class, AiringTodaySeriesEntity::class,
OnTheAirSeriesEntity::class,TopRatedSeriesEntity::class],
version = 1
version = 1,
exportSchema = false
)
@TypeConverters(Converters::class)
abstract class MovieDataBase : RoomDatabase() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ data class MovieDetailsDto(
@SerializedName("release_date")
val releaseDate: Date? = null,
@SerializedName("revenue")
val revenue: Int? = null,
val revenue: Long? = null,
@SerializedName("runtime")
val runtime: Int? = null,
@SerializedName("spoken_languages")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.karrar.movieapp.ui.adapters

import com.karrar.movieapp.R
import com.karrar.movieapp.ui.base.BaseAdapter
import com.karrar.movieapp.ui.base.BaseInteractionListener
import com.karrar.movieapp.ui.models.CollectionUiState

class CollectionAdapter(
items: List<CollectionUiState>,
val listener: CollectionInteractionListener
) :
BaseAdapter<CollectionUiState>(items, listener) {
override val layoutID: Int = R.layout.item_collection
}

interface CollectionInteractionListener : BaseInteractionListener {
fun onCollectionClick(collectionId: Int)
fun onClickSeeAllCollection()
}

Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package com.karrar.movieapp.ui.adapters

import com.karrar.movieapp.domain.models.Media
import com.karrar.movieapp.R
import com.karrar.movieapp.ui.base.BaseAdapter
import com.karrar.movieapp.ui.base.BaseInteractionListener
import com.karrar.movieapp.ui.models.MediaUiState
import com.karrar.movieapp.ui.models.MediaUi

class MediaAdapter(items: List<MediaUiState>, layout: Int, listener: MediaInteractionListener) :
BaseAdapter<MediaUiState>(items, listener) {
override val layoutID: Int = layout
class MediaAdapter(items: List<MediaUi>, listener: MediaInteractionListener,val title:String) :
BaseAdapter<MediaUi>(items, listener) {
override val layoutID: Int = R.layout.item_media_card
}

interface MediaInteractionListener : BaseInteractionListener {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,16 @@ package com.karrar.movieapp.ui.adapters

import com.karrar.movieapp.R
import com.karrar.movieapp.domain.enums.HomeItemsType
import com.karrar.movieapp.domain.models.Media
import com.karrar.movieapp.ui.base.BaseAdapter
import com.karrar.movieapp.ui.base.BaseInteractionListener
import com.karrar.movieapp.ui.models.MediaUiState
import com.karrar.movieapp.ui.models.MediaUi

class MovieAdapter(items: List<MediaUiState>,val listener: MovieInteractionListener) :
BaseAdapter<MediaUiState>(items, listener) {
class MovieAdapter(items: List<MediaUi>, val listener: MovieInteractionListener) :
BaseAdapter<MediaUi>(items, listener) {
override val layoutID: Int = R.layout.item_movie
}

interface MovieInteractionListener : BaseInteractionListener {
fun onClickMovie(movieId: Int)
fun onClickSeeAllMovie(homeItemsType: HomeItemsType)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,18 @@ import androidx.recyclerview.widget.DiffUtil
import com.karrar.movieapp.R
import com.karrar.movieapp.ui.adapters.MediaInteractionListener
import com.karrar.movieapp.ui.base.BasePagingAdapter
import com.karrar.movieapp.ui.models.MediaUiState
import com.karrar.movieapp.ui.models.MediaUi

open class AllMediaAdapter(listener: MediaInteractionListener) :
BasePagingAdapter<MediaUiState>(MediaComparator, listener) {
BasePagingAdapter<MediaUi>(MediaComparator, listener) {
override val layoutID: Int = R.layout.item_media

object MediaComparator : DiffUtil.ItemCallback<MediaUiState>() {
override fun areItemsTheSame(oldItem: MediaUiState, newItem: MediaUiState) =
object MediaComparator : DiffUtil.ItemCallback<MediaUi>() {
override fun areItemsTheSame(oldItem: MediaUi, newItem: MediaUi) =
oldItem.id == newItem.id

override fun areContentsTheSame(oldItem: MediaUiState, newItem: MediaUiState) =
override fun areContentsTheSame(oldItem: MediaUi, newItem: MediaUi) =
oldItem == newItem
}

}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.karrar.movieapp.ui.allMedia

import androidx.paging.PagingData
import com.karrar.movieapp.ui.models.MediaUiState
import com.karrar.movieapp.ui.models.MediaUi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.emptyFlow

data class AllMediaUiState(
val allMedia : Flow<PagingData<MediaUiState>> = emptyFlow(),
val allMedia : Flow<PagingData<MediaUi>> = emptyFlow(),
val isLoading : Boolean = false,
val error : List<Error> = emptyList(),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import com.karrar.movieapp.databinding.FragmentAllMovieBinding
import com.karrar.movieapp.domain.enums.AllMediaType
import com.karrar.movieapp.ui.adapters.LoadUIStateAdapter
import com.karrar.movieapp.ui.base.BaseFragment
import com.karrar.movieapp.ui.models.MediaUiState
import com.karrar.movieapp.ui.models.MediaUi
import com.karrar.movieapp.utilities.collect
import com.karrar.movieapp.utilities.collectLast
import com.karrar.movieapp.utilities.setSpanSize
Expand Down Expand Up @@ -46,7 +46,7 @@ class AllMovieFragment : BaseFragment<FragmentAllMovieBinding>() {
}


private suspend fun setAllMedia(itemsPagingData: PagingData<MediaUiState>) {
private suspend fun setAllMedia(itemsPagingData: PagingData<MediaUi>) {
allMediaAdapter.submitData(itemsPagingData)
}

Expand Down
24 changes: 16 additions & 8 deletions app/src/main/java/com/karrar/movieapp/ui/home/HomeFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,14 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
homeAdapter.setItems(
mutableListOf(
it.popularMovies,
it.tvShowsSeries,
it.onTheAiringSeries,
it.airingTodaySeries,
it.recentlyReleased,
it.whatShouldIWatch,
it.upcomingMovies,
it.nowStreamingMovies,
it.mysteryMovies,
it.adventureMovies,
it.trendingMovies,
it.actors,
it.matchesYourVibe,
it.topRatedTVShows,
it.recentlyViewed,
it.collections,
it.needMoreWatch,
)
)
}
Expand All @@ -68,30 +67,39 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
event.actorID
)
}

is HomeUIEvent.ClickMovieEvent -> {
HomeFragmentDirections.actionHomeFragmentToMovieDetailFragment(
event.movieID
)
}

HomeUIEvent.ClickSeeAllActorEvent -> {
HomeFragmentDirections.actionHomeFragmentToActorsFragment()
}

is HomeUIEvent.ClickSeeAllMovieEvent -> {
HomeFragmentDirections.actionHomeFragmentToAllMovieFragment(
-1, event.mediaType
)
}

is HomeUIEvent.ClickSeeAllTVShowsEvent -> {
HomeFragmentDirections.actionHomeFragmentToAllMovieFragment(
-1,
event.mediaType
)
}

is HomeUIEvent.ClickSeriesEvent -> {
HomeFragmentDirections.actionHomeFragmentToTvShowDetailsFragment(
event.seriesID
)
}

HomeUIEvent.ClickWhatShouldIWatchEvent -> TODO()

HomeUIEvent.ClickNeedMoreToWatchEvent -> TODO()
}
findNavController().navigate(action)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ import com.karrar.movieapp.ui.base.BaseInteractionListener

interface HomeInteractionListener : BaseInteractionListener {
fun onClickSeeAllActors()
fun onClickWhatShouldIWatch()
}
Loading