diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..9d9024d96 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,11 @@ +### Description + +_A brief, high-level summary of the changes in this pull request._ + +--- + +### Screenshots or Screen Recordings + +_If applicable, add screenshots or screen recordings to help visualize the changes._ + +--- diff --git a/.github/workflows/android-ci.yml b/.github/workflows/android-ci.yml new file mode 100644 index 000000000..d5dc1d67b --- /dev/null +++ b/.github/workflows/android-ci.yml @@ -0,0 +1,33 @@ +name: Android CI + +on: + pull_request: + branches: + - main + - develop + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout source code + uses: actions/checkout@v3 + + - name: Setup JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + + - name: Setup Gradle + uses: gradle/gradle-build-action@v2 + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Create google-services.json from secret + run: echo '${{ secrets.GOOGLE_SERVICES_JSON }}' > app/google-services.json + + - name: Build (skip tests & lint) + run: ./gradlew assembleDebug -x test -x lint diff --git a/app/build.gradle b/app/build.gradle index 7a354453f..273c5bdbf 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,31 +1,42 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' - id "kotlin-kapt" + id 'kotlin-kapt' id 'dagger.hilt.android.plugin' - id 'androidx.navigation.safeargs' + id 'androidx.navigation.safeargs.kotlin' id 'com.google.gms.google-services' id 'com.google.firebase.crashlytics' id 'com.google.firebase.firebase-perf' } +// Load local properties at the project level def localProperties = new Properties() -localProperties.load(new FileInputStream(rootProject.file("local.properties"))) +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} android { - compileSdk 32 + namespace 'com.karrar.movieapp' + compileSdk 34 defaultConfig { applicationId "com.karrar.movieapp" minSdk 21 - targetSdk 32 + targetSdk 34 versionCode 1 versionName "1.0" - buildConfigField "String", "API_KEY", localProperties['apiKey'] + + // Build config fields with safe property access + buildConfigField "String", "API_KEY", "\"${localProperties.getProperty('apiKey', '')}\"" buildConfigField "String", "BASE_URL", "\"https://api.themoviedb.org/3/\"" buildConfigField "String", "IMAGE_BASE_PATH", "\"https://image.tmdb.org/t/p/w500\"" buildConfigField "String", "TMDB_SIGNUP_URL", "\"https://www.themoviedb.org/signup\"" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + testInstrumentationRunnerArgument "runnerBuilder", "de.mannodermaus.junit5.AndroidJUnitPlatformBuilder" } buildTypes { @@ -33,100 +44,114 @@ android { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } - } - testOptions { - unitTests.all { - useJUnitPlatform() + debug { + // Add debug-specific configurations if needed } } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 + // For newer AGP versions, consider using VERSION_11 + // sourceCompatibility JavaVersion.VERSION_11 + // targetCompatibility JavaVersion.VERSION_11 } + kotlinOptions { jvmTarget = '1.8' + // For newer Kotlin versions, consider using '11' + // jvmTarget = '11' } + buildFeatures { + buildConfig true dataBinding true viewBinding true } + testOptions { + unitTests.all { + useJUnitPlatform() + } + unitTests.returnDefaultValues = true + } } 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' + // Core Android + implementation 'androidx.core:core-ktx:1.13.1' + implementation 'androidx.appcompat:appcompat:1.7.0' + implementation 'com.google.android.material:material:1.12.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.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" - - implementation 'com.squareup.retrofit2:retrofit:2.9.0' - implementation 'com.squareup.retrofit2:converter-gson:2.9.0' - implementation "com.squareup.okhttp3:okhttp:4.9.1" + // Architecture Components + implementation 'androidx.fragment:fragment-ktx:1.8.2' + implementation 'androidx.activity:activity-ktx:1.9.1' + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.8.4' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.8.4' - //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.lifecycle:lifecycle-extensions:2.2.0" - implementation 'androidx.navigation:navigation-fragment-ktx:2.5.2' - implementation 'androidx.navigation:navigation-ui-ktx:2.5.2' + // Navigation + implementation 'androidx.navigation:navigation-fragment-ktx:2.7.7' + implementation 'androidx.navigation:navigation-ui-ktx:2.7.7' - implementation "androidx.recyclerview:recyclerview:1.2.0" + // RecyclerView + implementation "androidx.recyclerview:recyclerview:1.3.2" - //picasso - implementation 'com.squareup.picasso:picasso:2.71828' + // Networking + implementation 'com.squareup.retrofit2:retrofit:2.11.0' + implementation 'com.squareup.retrofit2:converter-gson:2.11.0' + implementation "com.squareup.okhttp3:okhttp:4.12.0" + implementation "com.squareup.okhttp3:logging-interceptor:4.12.0" - // room dependency - def room_version = "2.4.3" - implementation("androidx.room:room-runtime:$room_version") - kapt("androidx.room:room-compiler:$room_version") - implementation("androidx.room:room-ktx:$room_version") + // Image Loading + implementation 'io.coil-kt:coil:2.7.0' - implementation "com.google.dagger:hilt-android:2.42" - kapt "com.google.dagger:hilt-compiler:2.42" + // Room Database + def room_version = "2.6.1" + implementation "androidx.room:room-runtime:$room_version" + implementation "androidx.room:room-ktx:$room_version" + implementation "androidx.room:room-paging:$room_version" + kapt "androidx.room:room-compiler:$room_version" - implementation "androidx.compose.material3:material3:1.0.0-alpha14" - implementation "androidx.compose.material3:material3-window-size-class:1.0.0-alpha14" - //data store preferences - implementation "androidx.datastore:datastore-preferences:1.0.0" + // Hilt (Dependency Injection) + implementation "com.google.dagger:hilt-android:2.52" + kapt "com.google.dagger:hilt-compiler:2.52" + // Paging + implementation "androidx.paging:paging-runtime-ktx:3.3.2" - implementation 'androidx.core:core-splashscreen:1.0.0' + // DataStore + implementation "androidx.datastore:datastore-preferences:1.1.1" - implementation 'androidx.appcompat:appcompat:1.0.0-alpha1' - implementation 'com.google.android.material:material:1.0.0-alpha1' + // Splash Screen + implementation 'androidx.core:core-splashscreen:1.0.1' - // Lottie - implementation 'com.airbnb.android:lottie:5.2.0' + // ViewPager2 for OnBoarding + implementation 'androidx.viewpager2:viewpager2:1.0.0' - //Coil - implementation 'io.coil-kt:coil:2.2.2' + // Lottie Animations + implementation 'com.airbnb.android:lottie:6.4.1' - implementation 'io.github.glailton.expandabletextview:expandabletextview:1.0.2' + // YouTube Player + implementation 'com.pierfrancescosoffritti.androidyoutubeplayer:core:12.1.0' - implementation 'com.pierfrancescosoffritti.androidyoutubeplayer:core:11.1.0' - - // paging - implementation "androidx.paging:paging-runtime:3.1.1" - implementation "androidx.paging:paging-runtime-ktx:3.1.1" - - // firebase - implementation platform('com.google.firebase:firebase-bom:31.1.0') + // Firebase + implementation platform('com.google.firebase:firebase-bom:33.1.2') implementation 'com.google.firebase:firebase-analytics-ktx' - implementation 'com.google.firebase:firebase-crashlytics-ktx' implementation 'com.google.firebase:firebase-perf-ktx' - - + // Testing + testImplementation 'junit:junit:4.13.2' + testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.2" + testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.2" + testImplementation "org.junit.jupiter:junit-jupiter-params:5.10.2" + testImplementation "io.mockk:mockk:1.13.10" + testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.0" + + // Android Testing + androidTestImplementation 'androidx.test.ext:junit:1.2.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' + androidTestImplementation "io.mockk:mockk-android:1.13.10" } \ No newline at end of file diff --git a/app/secret.properties b/app/secret.properties new file mode 100644 index 000000000..20570e81d --- /dev/null +++ b/app/secret.properties @@ -0,0 +1,2 @@ +API_KEY="b77ea619291736aea2b7740de4f6bfdc" +BASE_URL="api.themoviedb.org" \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 84503d082..dc976d8ea 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ + xmlns:tools="http://schemas.android.com/tools"> @@ -19,18 +18,25 @@ tools:targetApi="31"> + android:theme="@style/Theme.MovieApp"> - + + + { + AllMediaType.AIRING_TODAY, -> { wrapper(seriesRepository::getAiringTodayTvShowPager, tvShowMapper::map) } AllMediaType.ON_THE_AIR -> { @@ -43,7 +42,7 @@ class GetMediaByTypeUseCase @Inject constructor( AllMediaType.TRENDING -> { wrapper(movieRepository::getTrendingMoviesPager, movieMapper::map) } - AllMediaType.NOW_STREAMING -> { + AllMediaType.RECENTLY_RELEASED -> { wrapper(movieRepository::getNowPlayingMoviesPager, movieMapper::map) } AllMediaType.UPCOMING -> { diff --git a/app/src/main/java/com/karrar/movieapp/domain/usecases/home/HomeUseCasesContainer.kt b/app/src/main/java/com/karrar/movieapp/domain/usecases/home/HomeUseCasesContainer.kt index 739b3244c..3a1a2326f 100644 --- a/app/src/main/java/com/karrar/movieapp/domain/usecases/home/HomeUseCasesContainer.kt +++ b/app/src/main/java/com/karrar/movieapp/domain/usecases/home/HomeUseCasesContainer.kt @@ -5,6 +5,10 @@ import com.karrar.movieapp.domain.usecase.home.getData.series.GetAiringTodaySeri import com.karrar.movieapp.domain.usecase.home.getData.series.GetOnTheAirSeriesUseCase import com.karrar.movieapp.domain.usecase.home.getData.series.GetTopRatedTvShowSeriesUseCase import com.karrar.movieapp.domain.usecase.home.getData.movie.* +import com.karrar.movieapp.domain.usecases.CheckIfLoggedInUseCase +import com.karrar.movieapp.domain.usecases.GetAccountDetailsUseCase +import com.karrar.movieapp.domain.usecases.GetWatchHistoryUseCase +import com.karrar.movieapp.domain.usecases.mylist.GetMyListUseCase import javax.inject.Inject @@ -19,4 +23,8 @@ class HomeUseCasesContainer @Inject constructor( val getAdventureMoviesUseCase: GetAdventureMoviesUseCase, val getNowStreamingMoviesUseCase: GetNowStreamingMoviesUseCase, val getTrendingActorsUseCase: GetTrendingActorsUseCase, + val getWatchHistoryUseCase: GetWatchHistoryUseCase, + val getMyListUseCase: GetMyListUseCase, + val getAccountDetailsUseCase: GetAccountDetailsUseCase, + val checkIfLoggedInUseCase: CheckIfLoggedInUseCase ) \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/actors/ActorsAdapter.kt b/app/src/main/java/com/karrar/movieapp/ui/actors/ActorsAdapter.kt index 58a40af93..2f598dd98 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/actors/ActorsAdapter.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/actors/ActorsAdapter.kt @@ -6,10 +6,9 @@ import com.karrar.movieapp.ui.adapters.ActorsInteractionListener import com.karrar.movieapp.ui.base.BasePagingAdapter import com.karrar.movieapp.ui.models.ActorUiState -class ActorsAdapter(listener: ActorsInteractionListener) : +class ActorsAdapter(listener: ActorsInteractionListener, override val layoutID: Int) : BasePagingAdapter(ActorComparator, listener) { - override val layoutID: Int = R.layout.item_actor_see_all object ActorComparator : DiffUtil.ItemCallback() { override fun areItemsTheSame(oldItem: ActorUiState, newItem: ActorUiState) = diff --git a/app/src/main/java/com/karrar/movieapp/ui/actors/ActorsFragment.kt b/app/src/main/java/com/karrar/movieapp/ui/actors/ActorsFragment.kt index d91192f07..9ffaa5f91 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/actors/ActorsFragment.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/actors/ActorsFragment.kt @@ -20,7 +20,10 @@ import dagger.hilt.android.AndroidEntryPoint class ActorsFragment : BaseFragment() { override val layoutIdFragment = R.layout.fragment_actors override val viewModel: ActorsViewModel by viewModels() - private val actorsAdapter by lazy { ActorsAdapter(viewModel) } + private val actorsAdapter by lazy { ActorsAdapter( + viewModel, + layoutID = R.layout.item_actor + ) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) diff --git a/app/src/main/java/com/karrar/movieapp/ui/allMedia/AllMovieFragment.kt b/app/src/main/java/com/karrar/movieapp/ui/allMedia/AllMovieFragment.kt index ac5a3db7e..a5679e329 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/allMedia/AllMovieFragment.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/allMedia/AllMovieFragment.kt @@ -87,13 +87,13 @@ class AllMovieFragment : BaseFragment() { private fun getTitle(type: AllMediaType): String { return when (type) { - AllMediaType.ON_THE_AIR -> resources.getString(R.string.title_on_air) + AllMediaType.ON_THE_AIR -> resources.getString(R.string.title_top_rated_tv_show) AllMediaType.AIRING_TODAY -> resources.getString(R.string.title_airing_today) AllMediaType.LATEST -> resources.getString(R.string.latest) AllMediaType.POPULAR -> resources.getString(R.string.popular) AllMediaType.TOP_RATED -> resources.getString(R.string.title_top_rated_tv_show) AllMediaType.TRENDING -> resources.getString(R.string.title_trending) - AllMediaType.NOW_STREAMING -> resources.getString(R.string.title_streaming) + AllMediaType.RECENTLY_RELEASED -> resources.getString(R.string.title_streaming) AllMediaType.UPCOMING -> resources.getString(R.string.title_upcoming) AllMediaType.MYSTERY -> resources.getString(R.string.title_mystery) AllMediaType.ADVENTURE -> resources.getString(R.string.title_adventure) diff --git a/app/src/main/java/com/karrar/movieapp/ui/category/uiState/MediaUIState.kt b/app/src/main/java/com/karrar/movieapp/ui/category/uiState/MediaUIState.kt index 2d0bcaffa..5410978b1 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/category/uiState/MediaUIState.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/category/uiState/MediaUIState.kt @@ -3,5 +3,5 @@ package com.karrar.movieapp.ui.category.uiState data class MediaUIState( val mediaID: Int, val mediaImage: String, - val mediaType: String + val mediaType: String, ) diff --git a/app/src/main/java/com/karrar/movieapp/ui/components/header/SectionHeaderView.kt b/app/src/main/java/com/karrar/movieapp/ui/components/header/SectionHeaderView.kt new file mode 100644 index 000000000..8445c9fed --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/components/header/SectionHeaderView.kt @@ -0,0 +1,52 @@ +package com.karrar.movieapp.ui.components.header + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.view.isVisible +import com.karrar.movieapp.R +import com.karrar.movieapp.databinding.ListHeaderSectionBinding + +class SectionHeaderView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr) { + + private val binding: ListHeaderSectionBinding = ListHeaderSectionBinding.inflate( + LayoutInflater.from(context), this, true + ) + + init { + attrs?.let { attributeSet -> + context.theme.obtainStyledAttributes( + attributeSet, + R.styleable.SectionHeaderView, + 0, 0 + ).apply { + try { + val titleText = getString(R.styleable.SectionHeaderView_text) + val showSeeAll = getBoolean(R.styleable.SectionHeaderView_showSeeAll, true) + + titleText?.let { setTitle(it) } + setShowSeeAll(showSeeAll) + } finally { + recycle() + } + } + } + } + + fun setTitle(title: String) { + binding.textTitle.text = title + } + + fun setShowSeeAll(show: Boolean) { + binding.textSeeAll.isVisible = show + } + + fun setSeeAllClickListener(listener: () -> Unit) { + binding.textSeeAll.setOnClickListener { listener() } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/components/indicator/MovieCircularProgressBar.kt b/app/src/main/java/com/karrar/movieapp/ui/components/indicator/MovieCircularProgressBar.kt new file mode 100644 index 000000000..0de346a07 --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/components/indicator/MovieCircularProgressBar.kt @@ -0,0 +1,92 @@ +package com.karrar.movieapp.ui.components.indicator + +import android.content.Context +import android.graphics.* +import android.util.AttributeSet +import android.view.View +import android.animation.ValueAnimator +import androidx.core.content.ContextCompat +import androidx.core.content.withStyledAttributes +import com.karrar.movieapp.R +import kotlin.math.cos +import kotlin.math.min +import kotlin.math.sin + +class MovieCircularProgressBar @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0 +) : View(context, attrs, defStyle) { + + private var strokeWidth: Float = 10f + private var gradientColors: IntArray + private var rotationAngle = 0f + + private val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply { + style = Paint.Style.STROKE + strokeCap = Paint.Cap.BUTT + } + + init { + val primaryColor = ContextCompat.getColor(context, R.color.brand_primary) + val tertiaryColor = ContextCompat.getColor(context, R.color.brand_tertiary) + gradientColors = intArrayOf(primaryColor, tertiaryColor) + + context.withStyledAttributes(attrs, R.styleable.MovieCircularProgressBar) { + strokeWidth = getDimension(R.styleable.MovieCircularProgressBar_strokeWidth, 10f) + } + + startAnimation() + } + + private fun startAnimation() { + val animator = ValueAnimator.ofFloat(0f, 360f).apply { + duration = 1000 + repeatCount = ValueAnimator.INFINITE + repeatMode = ValueAnimator.RESTART + addUpdateListener { + rotationAngle = it.animatedValue as Float + invalidate() + } + } + animator.start() + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + + val cx = width / 2f + val cy = height / 2f + val radius = (min(width, height) - strokeWidth) / 2f + + val sweepGradient = SweepGradient(cx, cy, gradientColors, null) + paint.shader = sweepGradient + paint.strokeWidth = strokeWidth + + canvas.save() + canvas.rotate(rotationAngle, cx, cy) + + // Draw circle arc + canvas.drawArc( + cx - radius, + cy - radius, + cx + radius, + cy + radius, + 0f, + 360f, + false, + paint + ) + + // Draw moving dot + val angleRad = Math.toRadians(0.0) + val dotX = cx + radius * cos(angleRad).toFloat() + val dotY = cy + radius * sin(angleRad).toFloat() + val dotPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { + color = gradientColors[0] + } + canvas.drawCircle(dotX, dotY, strokeWidth / 2, dotPaint) + + canvas.restore() + } +} diff --git a/app/src/main/java/com/karrar/movieapp/ui/components/ratingBar/StarRatingView.kt b/app/src/main/java/com/karrar/movieapp/ui/components/ratingBar/StarRatingView.kt new file mode 100644 index 000000000..374767282 --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/components/ratingBar/StarRatingView.kt @@ -0,0 +1,60 @@ +package com.karrar.movieapp.ui.components.ratingBar + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.core.content.ContextCompat +import com.karrar.movieapp.R +import androidx.core.content.withStyledAttributes + + +class StarRatingView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0 +) : LinearLayout(context, attrs, defStyle) { + + private val stars = mutableListOf() + + init { + orientation = HORIZONTAL + LayoutInflater.from(context).inflate(R.layout.rating_stars, this, true) + + stars.add(findViewById(R.id.star1)) + stars.add(findViewById(R.id.star2)) + stars.add(findViewById(R.id.star3)) + stars.add(findViewById(R.id.star4)) + stars.add(findViewById(R.id.star5)) + + if (attrs != null) { + context.withStyledAttributes(attrs, R.styleable.StarRatingView) { + val rating = getFloat(R.styleable.StarRatingView_rating, 0f) + setRating(rating) + } + } + } + + fun setRating(rating: Float) { + val fullStars = rating.toInt() + val hasHalfStar = rating - fullStars >= 0.5 + + stars.forEachIndexed { index, imageView -> + when { + index < fullStars -> { + imageView.setImageResource(R.drawable.ic_star_bold) + imageView.setColorFilter(ContextCompat.getColor(context, R.color.additional_primary_yellow)) + } +// index == fullStars && hasHalfStar -> { +// imageView.setImageResource(R.drawable.ic_star_half) +// imageView.setColorFilter(ContextCompat.getColor(context, R.color.additional_primary_yellow)) +// } + else -> { + imageView.setImageResource(R.drawable.ic_star_outlined) + imageView.setColorFilter(ContextCompat.getColor(context, R.color.shade_tertiary)) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/explore/ExploringFragment.kt b/app/src/main/java/com/karrar/movieapp/ui/explore/ExploringFragment.kt index 82aa82369..d695da172 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/explore/ExploringFragment.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/explore/ExploringFragment.kt @@ -13,6 +13,7 @@ import com.karrar.movieapp.ui.base.BaseFragment import com.karrar.movieapp.ui.explore.exploreUIState.ExploringUIEvent import com.karrar.movieapp.ui.explore.exploreUIState.TrendyMediaUIState import com.karrar.movieapp.utilities.Constants +import com.google.android.material.tabs.TabLayout import com.karrar.movieapp.utilities.collectLast import dagger.hilt.android.AndroidEntryPoint @@ -33,6 +34,27 @@ class ExploringFragment : BaseFragment() { setTitle(true, resources.getString(R.string.explore_label)) collectEvent() binding.recyclerTrend.adapter = TrendAdapter(mutableListOf(), viewModel) + + // Add your tabs + binding.includeTabs.layout.apply { + addTab(newTab().setText("Movies")) + addTab(newTab().setText("TV Shows")) + addTab(newTab().setText("Actors")) + } + + // Listen for tab selection + binding.includeTabs.layout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { + override fun onTabSelected(tab: TabLayout.Tab?) { + when (tab?.position) { + 0 -> viewModel.onClickMovies() + 1 -> viewModel.onClickTVShow() + 2 -> viewModel.onClickActors() + } + } + + override fun onTabUnselected(tab: TabLayout.Tab?) {} + override fun onTabReselected(tab: TabLayout.Tab?) {} + }) } private fun collectEvent() { diff --git a/app/src/main/java/com/karrar/movieapp/ui/explore/exploreUIState/ViewToggle.kt b/app/src/main/java/com/karrar/movieapp/ui/explore/exploreUIState/ViewToggle.kt new file mode 100644 index 000000000..09d860011 --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/explore/exploreUIState/ViewToggle.kt @@ -0,0 +1,5 @@ +package com.karrar.movieapp.ui.explore.exploreUIState + +enum class ViewToggle { + GRID, LIST +} \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/home/HomeFragment.kt b/app/src/main/java/com/karrar/movieapp/ui/home/HomeFragment.kt index 6718f35f4..f4b6b5292 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/home/HomeFragment.kt @@ -29,29 +29,33 @@ class HomeFragment : BaseFragment() { collectHomeData() } + override fun onResume() { + super.onResume() + viewModel.getData() + } + private fun collectHomeData() { viewLifecycleOwner.lifecycleScope.launch { - viewModel.homeUiState.collect { + viewModel.homeUiState.collect { uiState -> homeAdapter.setItems( mutableListOf( - it.popularMovies, - it.tvShowsSeries, - it.onTheAiringSeries, - it.airingTodaySeries, - it.upcomingMovies, - it.nowStreamingMovies, - it.mysteryMovies, - it.adventureMovies, - it.trendingMovies, - it.actors, + uiState.popularMovies, + uiState.onTheAiringSeries, + uiState.upcomingMovies, + uiState.recentlyReleasedMovies, + uiState.browseEverything, + uiState.letUsChooseForYou, + uiState.recentlyViewed, + uiState.collections ) ) } } } + private fun setAdapter() { - homeAdapter = HomeAdapter(mutableListOf(), viewModel) + homeAdapter = HomeAdapter(mutableListOf(), viewModel, viewLifecycleOwner.lifecycleScope) binding.recyclerView.adapter = homeAdapter } @@ -63,19 +67,11 @@ class HomeFragment : BaseFragment() { private fun onEvent(event: HomeUIEvent) { val action = when (event) { - is HomeUIEvent.ClickActorEvent -> { - HomeFragmentDirections.actionHomeFragmentToActorDetailsFragment( - event.actorID - ) - } is HomeUIEvent.ClickMovieEvent -> { HomeFragmentDirections.actionHomeFragmentToMovieDetailFragment( event.movieID ) } - HomeUIEvent.ClickSeeAllActorEvent -> { - HomeFragmentDirections.actionHomeFragmentToActorsFragment() - } is HomeUIEvent.ClickSeeAllMovieEvent -> { HomeFragmentDirections.actionHomeFragmentToAllMovieFragment( -1, event.mediaType @@ -92,8 +88,30 @@ class HomeFragment : BaseFragment() { event.seriesID ) } + is HomeUIEvent.ClickBrowseEverythingEvent -> { + HomeFragmentDirections.actionHomeFragmentToExploringFragment() + } + + is HomeUIEvent.ClickSeeAllRecentlyViewedEvent -> { + HomeFragmentDirections.actionHomeFragmentToWatchHistoryFragment() + } + + is HomeUIEvent.ClickLetUsChooseForYouEvent -> { + HomeFragmentDirections.actionHomeFragmentToMyListFragment() + } + + is HomeUIEvent.ClickCollectionList -> { + HomeFragmentDirections.actionHomeFragmentToListDetailsFragment( + event.list.listID, + event.list.name + ) + } + + HomeUIEvent.ClickSeeAllCollectionsEvent -> { + HomeFragmentDirections.actionHomeFragmentToMyListFragment() + } } findNavController().navigate(action) } -} \ No newline at end of file +} diff --git a/app/src/main/java/com/karrar/movieapp/ui/home/HomeInteractionListener.kt b/app/src/main/java/com/karrar/movieapp/ui/home/HomeInteractionListener.kt index 0e95f5d1c..62d955ae1 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/home/HomeInteractionListener.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/home/HomeInteractionListener.kt @@ -3,5 +3,6 @@ package com.karrar.movieapp.ui.home import com.karrar.movieapp.ui.base.BaseInteractionListener interface HomeInteractionListener : BaseInteractionListener { - fun onClickSeeAllActors() + fun onClickBrowseEverything() + fun onClickLetUsChooseForYou() } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/home/HomeItem.kt b/app/src/main/java/com/karrar/movieapp/ui/home/HomeItem.kt index c0d424f23..41b0c834e 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/home/HomeItem.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/home/HomeItem.kt @@ -1,30 +1,42 @@ package com.karrar.movieapp.ui.home import com.karrar.movieapp.domain.enums.HomeItemsType -import com.karrar.movieapp.ui.models.ActorUiState import com.karrar.movieapp.ui.home.homeUiState.PopularUiState import com.karrar.movieapp.ui.models.MediaUiState +import com.karrar.movieapp.ui.myList.myCollectionUIState.CreatedCollectionUIState +import com.karrar.movieapp.ui.profile.watchhistory.MediaHistoryUiState sealed class HomeItem(val priority: Int) { data class Slider(val items: List) : HomeItem(0) - data class TvShows(val items: List) : HomeItem(1) + data class RecentlyReleased( + val items: List, + val type: HomeItemsType = HomeItemsType.RECENTLY_RELEASED + ) : HomeItem(1) - data class OnTheAiring(val items: List, val type: HomeItemsType = HomeItemsType.ON_THE_AIR) : HomeItem(2) + data class LetUsChooseForYou(val ctaNumber: Int = 12) : HomeItem(2) - data class Trending(val items: List, val type: HomeItemsType = HomeItemsType.TRENDING) : HomeItem(3) + data class Upcoming( + val items: List, + val type: HomeItemsType = HomeItemsType.UPCOMING + ) : HomeItem(3) - data class AiringToday(val items: List) : HomeItem(4) + data class OnTheAiring( + val items: List, + val type: HomeItemsType = HomeItemsType.TOP_RATED_TV_SHOWS + ) : HomeItem(6) - data class NowStreaming(val items: List, val type: HomeItemsType = HomeItemsType.NOW_STREAMING) : HomeItem(5) + data class RecentlyViewed( + val items: List, + val type: HomeItemsType = HomeItemsType.RECENTLY_VIEWED + ) : HomeItem(7) - data class Upcoming(val items: List, val type: HomeItemsType = HomeItemsType.UPCOMING) : HomeItem(6) + data class CollectionsList( + val items: List, + val type: HomeItemsType = HomeItemsType.YOUR_COLLECTIONS + ) : HomeItem(8) - data class Mystery(val items: List, val type: HomeItemsType = HomeItemsType.MYSTERY) : HomeItem(7) - - data class Adventure(val items: List, val type: HomeItemsType = HomeItemsType.ADVENTURE) : HomeItem(8) - - data class Actor(val items: List) : HomeItem(9) + data class BrowseEverything(val ctaNumber: Int = 9) : HomeItem(ctaNumber) } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/home/HomeViewModel.kt b/app/src/main/java/com/karrar/movieapp/ui/home/HomeViewModel.kt index be2da0910..5c7c8d92a 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/home/HomeViewModel.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/home/HomeViewModel.kt @@ -1,20 +1,23 @@ package com.karrar.movieapp.ui.home -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope -import com.karrar.movieapp.domain.RequestStatus import com.karrar.movieapp.domain.enums.AllMediaType import com.karrar.movieapp.domain.enums.HomeItemsType +import com.karrar.movieapp.domain.mappers.WatchHistoryMapper import com.karrar.movieapp.domain.usecase.home.HomeUseCasesContainer -import com.karrar.movieapp.ui.adapters.ActorsInteractionListener import com.karrar.movieapp.ui.adapters.MediaInteractionListener import com.karrar.movieapp.ui.adapters.MovieInteractionListener import com.karrar.movieapp.ui.base.BaseViewModel +import com.karrar.movieapp.ui.home.adapter.RecentlyViewedInteractionListener import com.karrar.movieapp.ui.home.adapter.TVShowInteractionListener +import com.karrar.movieapp.ui.home.adapter.YourCollectionsInteractionListener import com.karrar.movieapp.ui.home.homeUiState.HomeUIEvent import com.karrar.movieapp.ui.home.homeUiState.HomeUiState -import com.karrar.movieapp.ui.mappers.ActorUiMapper import com.karrar.movieapp.ui.mappers.MediaUiMapper +import com.karrar.movieapp.ui.myList.CreatedCollectionUIMapper +import com.karrar.movieapp.ui.myList.myCollectionUIState.CreatedCollectionUIState +import com.karrar.movieapp.ui.profile.watchhistory.MediaHistoryUiState +import com.karrar.movieapp.utilities.Constants import com.karrar.movieapp.utilities.Event import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -27,10 +30,12 @@ import javax.inject.Inject class HomeViewModel @Inject constructor( private val homeUseCasesContainer: HomeUseCasesContainer, private val mediaUiMapper: MediaUiMapper, - private val actorUiMapper: ActorUiMapper, private val popularUiMapper: PopularUiMapper, -) : BaseViewModel(), HomeInteractionListener, ActorsInteractionListener, MovieInteractionListener, - MediaInteractionListener, TVShowInteractionListener { + private val watchHistoryMapper: WatchHistoryMapper, + private val createdCollectionUIMapper: CreatedCollectionUIMapper, +) : BaseViewModel(), HomeInteractionListener, MovieInteractionListener, + MediaInteractionListener, TVShowInteractionListener, RecentlyViewedInteractionListener, + YourCollectionsInteractionListener { private val _homeUiState = MutableStateFlow(HomeUiState()) val homeUiState = _homeUiState.asStateFlow() @@ -42,152 +47,91 @@ class HomeViewModel @Inject constructor( getHomeData() } - private fun getHomeData() { _homeUiState.update { it.copy(isLoading = true) } - getTrending() - getNowStreaming() + getRecentlyReleased() getUpcoming() - getTopRatedTvShow() getOnTheAir() - getAiringToday() getPopularMovies() - getMystery() - getAdventure() - getActors() - } - - override fun getData() { - getHomeData() - _homeUiState.update { it.copy(error = emptyList()) } + getRecentlyViewed() + getUserName() + getMyCollections() } - - private fun getPopularMovies() { + private fun getMyCollections() { viewModelScope.launch { try { - homeUseCasesContainer.getPopularMoviesUseCase().collect { list -> - if (list.isNotEmpty()) { - val items = list.map(popularUiMapper::map) - _homeUiState.update { - it.copy(popularMovies = HomeItem.Slider(items), - isLoading = false) - } - } + val items = homeUseCasesContainer.getMyListUseCase().map { createdCollectionUIMapper.map(it) } + _homeUiState.update { + it.copy(isLoading = false, collections = HomeItem.CollectionsList(items)) } } catch (th: Throwable) { onError(th.message.toString()) } } } - - private fun onError(message: String) { - val errors = _homeUiState.value.error.toMutableList() - errors.add(message) - _homeUiState.update { it.copy(error = errors, isLoading = false) } - } - - private fun getTrending() { + private fun getRecentlyViewed() { viewModelScope.launch { try { - homeUseCasesContainer.getTrendingMoviesUseCase().collect { list -> - if (list.isNotEmpty()) { - val items = list.map(mediaUiMapper::map) + homeUseCasesContainer.getWatchHistoryUseCase().collect { list -> + if(list.isNotEmpty()){ + val items = list.map(watchHistoryMapper::map) _homeUiState.update { - it.copy(trendingMovies = HomeItem.Trending(items), - isLoading = false) + it.copy( + recentlyViewed = HomeItem.RecentlyViewed(items), + isLoading = false + ) } } } } catch (th: Throwable) { onError(th.message.toString()) } - } - - } - private fun getActors() { - viewModelScope.launch { - try { - homeUseCasesContainer.getTrendingActorsUseCase().collect { list -> - if (list.isNotEmpty()) { - val items = list.map(actorUiMapper::map) - _homeUiState.update { - it.copy(actors = HomeItem.Actor(items), - isLoading = false) - } - } - } - } catch (th: Throwable) { - onError(th.message.toString()) - } } - } - - private fun getUpcoming() { + private fun getUserName() { viewModelScope.launch { try { - homeUseCasesContainer.getUpcomingMoviesUseCase().collect { list -> - if (list.isNotEmpty()) { - val items = list.map(mediaUiMapper::map) - _homeUiState.update { - it.copy(upcomingMovies = HomeItem.Upcoming(items), - isLoading = false) - } + val isLoggedIn = homeUseCasesContainer.checkIfLoggedInUseCase() + if (isLoggedIn) { + val accountDetails = homeUseCasesContainer.getAccountDetailsUseCase() + _homeUiState.update { + it.copy( + username = accountDetails.username, + isLoggedIn = true, + isLoading = false + ) } - } - } catch (th: Throwable) { - onError(th.message.toString()) - } - } - - - } - - private fun getNowStreaming() { - viewModelScope.launch { - try { - homeUseCasesContainer.getNowStreamingMoviesUseCase().collect { list -> - if (list.isNotEmpty()) { - val items = list.map(mediaUiMapper::map) - _homeUiState.update { - it.copy(nowStreamingMovies = HomeItem.NowStreaming(items), - isLoading = false) - } + } else { + _homeUiState.update { + it.copy( + username = "", + isLoggedIn = false, + isLoading = false + ) } } } catch (th: Throwable) { onError(th.message.toString()) } } - } - private fun getTopRatedTvShow() { - viewModelScope.launch { - try { - homeUseCasesContainer.getTopRatedTvShowUseCase().collect { list -> - if (list.isNotEmpty()) { - val items = list.map(mediaUiMapper::map) - _homeUiState.update { - it.copy(tvShowsSeries = HomeItem.TvShows(items), - isLoading = false) - } - } - } - }catch (t:Throwable){} - } + override fun getData() { + getHomeData() + _homeUiState.update { it.copy(error = emptyList()) } } - private fun getOnTheAir() { + + private fun getPopularMovies() { viewModelScope.launch { try { - homeUseCasesContainer.getOnTheAirUseCase().collect { list -> + homeUseCasesContainer.getPopularMoviesUseCase().collect { list -> if (list.isNotEmpty()) { - val items = list.map(mediaUiMapper::map) + val items = list.map(popularUiMapper::map) _homeUiState.update { - it.copy(onTheAiringSeries = HomeItem.OnTheAiring(items), + it.copy(popularMovies = HomeItem.Slider(items), isLoading = false) } } @@ -196,17 +140,22 @@ class HomeViewModel @Inject constructor( onError(th.message.toString()) } } + } + private fun onError(message: String) { + val errors = _homeUiState.value.error.toMutableList() + errors.add(message) + _homeUiState.update { it.copy(error = errors, isLoading = false) } } - private fun getAiringToday() { + private fun getUpcoming() { viewModelScope.launch { try { - homeUseCasesContainer.getAiringTodayUseCase().collect { list -> + homeUseCasesContainer.getUpcomingMoviesUseCase().collect { list -> if (list.isNotEmpty()) { val items = list.map(mediaUiMapper::map) _homeUiState.update { - it.copy(airingTodaySeries = HomeItem.AiringToday(items), + it.copy(upcomingMovies = HomeItem.Upcoming(items), isLoading = false) } } @@ -219,14 +168,14 @@ class HomeViewModel @Inject constructor( } - private fun getMystery() { + private fun getRecentlyReleased() { viewModelScope.launch { try { - homeUseCasesContainer.getMysteryMoviesUseCase().collect { list -> + homeUseCasesContainer.getNowStreamingMoviesUseCase().collect { list -> if (list.isNotEmpty()) { val items = list.map(mediaUiMapper::map) _homeUiState.update { - it.copy(mysteryMovies = HomeItem.Mystery(items), + it.copy(recentlyReleasedMovies = HomeItem.RecentlyReleased(items), isLoading = false) } } @@ -237,15 +186,14 @@ class HomeViewModel @Inject constructor( } } - - private fun getAdventure() { + private fun getOnTheAir() { viewModelScope.launch { try { - homeUseCasesContainer.getAdventureMoviesUseCase().collect { list -> + homeUseCasesContainer.getOnTheAirUseCase().collect { list -> if (list.isNotEmpty()) { val items = list.map(mediaUiMapper::map) _homeUiState.update { - it.copy(adventureMovies = HomeItem.Adventure(items), + it.copy(onTheAiringSeries = HomeItem.OnTheAiring(items), isLoading = false) } } @@ -261,26 +209,24 @@ class HomeViewModel @Inject constructor( _homeUIEvent.update { Event(HomeUIEvent.ClickMovieEvent(movieId)) } } - override fun onClickActor(actorID: Int) { - _homeUIEvent.update { Event(HomeUIEvent.ClickActorEvent(actorID)) } - } - override fun onClickSeeAllMovie(homeItemsType: HomeItemsType) { val type = when (homeItemsType) { - HomeItemsType.ON_THE_AIR -> AllMediaType.ON_THE_AIR - HomeItemsType.TRENDING -> AllMediaType.TRENDING - HomeItemsType.NOW_STREAMING -> AllMediaType.NOW_STREAMING + HomeItemsType.TOP_RATED_TV_SHOWS -> AllMediaType.TOP_RATED + HomeItemsType.RECENTLY_RELEASED -> AllMediaType.RECENTLY_RELEASED HomeItemsType.UPCOMING -> AllMediaType.UPCOMING - HomeItemsType.MYSTERY -> AllMediaType.MYSTERY - HomeItemsType.ADVENTURE -> AllMediaType.ADVENTURE HomeItemsType.NON -> AllMediaType.ACTOR_MOVIES + HomeItemsType.RECENTLY_VIEWED -> TODO("There is no need to add new attribute to AllMediaType") + HomeItemsType.YOUR_COLLECTIONS -> TODO("There is no need to add new attribute to AllMediaType") } _homeUIEvent.update { Event(HomeUIEvent.ClickSeeAllMovieEvent(type)) } } - override fun onClickSeeAllActors() { - _homeUIEvent.update { Event(HomeUIEvent.ClickSeeAllActorEvent) } + override fun onClickBrowseEverything() { + _homeUIEvent.update { Event(HomeUIEvent.ClickBrowseEverythingEvent) } + } + override fun onClickLetUsChooseForYou() { + _homeUIEvent.update { Event(HomeUIEvent.ClickLetUsChooseForYouEvent) } } override fun onClickMedia(mediaId: Int) { @@ -295,5 +241,23 @@ class HomeViewModel @Inject constructor( _homeUIEvent.update { Event(HomeUIEvent.ClickSeeAllTVShowsEvent(type)) } } + override fun onClickMovie(item: MediaHistoryUiState) { + if (item.mediaType.equals(Constants.MOVIE, true)) { + _homeUIEvent.update { Event(HomeUIEvent.ClickMovieEvent(item.id)) } + } else { + _homeUIEvent.update { Event(HomeUIEvent.ClickSeriesEvent(item.id)) } + } + } + + override fun onClickSeeAllRecentlyViewed() { + _homeUIEvent.update { Event(HomeUIEvent.ClickSeeAllRecentlyViewedEvent) } + } + override fun onClickCollection(collection: CreatedCollectionUIState) { + _homeUIEvent.update { Event(HomeUIEvent.ClickCollectionList(collection)) } + } + + override fun onClickSeeAllCollections() { + _homeUIEvent.update { Event(HomeUIEvent.ClickSeeAllCollectionsEvent) } + } } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/home/adapter/HomeAdapter.kt b/app/src/main/java/com/karrar/movieapp/ui/home/adapter/HomeAdapter.kt index bcf42dd00..17c6c5eaa 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/home/adapter/HomeAdapter.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/home/adapter/HomeAdapter.kt @@ -1,22 +1,31 @@ package com.karrar.movieapp.ui.home.adapter import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.LinearSmoothScroller +import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager2.widget.ViewPager2 import com.karrar.movieapp.BR import com.karrar.movieapp.R import com.karrar.movieapp.domain.enums.HomeItemsType -import com.karrar.movieapp.ui.adapters.* +import com.karrar.movieapp.ui.adapters.MovieAdapter +import com.karrar.movieapp.ui.adapters.MovieInteractionListener import com.karrar.movieapp.ui.base.BaseAdapter import com.karrar.movieapp.ui.base.BaseInteractionListener import com.karrar.movieapp.ui.home.HomeInteractionListener import com.karrar.movieapp.ui.home.HomeItem import com.karrar.movieapp.ui.models.MediaUiState -import com.karrar.movieapp.utilities.Constants +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import kotlin.math.abs class HomeAdapter( private var homeItems: MutableList, private val listener: BaseInteractionListener, + private val scope: CoroutineScope ) : BaseAdapter(homeItems, listener) { override val layoutID: Int = 0 @@ -45,79 +54,58 @@ class HomeAdapter( if (position != -1) when (val currentItem = homeItems[position]) { is HomeItem.Slider -> { - holder.binding.setVariable( - BR.adapterRecycler, - PopularMovieAdapter(currentItem.items, listener as HomeInteractionListener) - ) - } - - is HomeItem.TvShows -> { - holder.binding.run { - if (currentItem.items.isNotEmpty()) { - setVariable(BR.topRated, currentItem.items.first()) - setVariable(BR.popular, currentItem.items[1]) - setVariable(BR.latest, currentItem.items.last()) - setVariable(BR.listener, listener as TVShowInteractionListener) - } - } + val adapter = PopularMovieAdapter(currentItem.items, listener as HomeInteractionListener) + holder.binding.setVariable(BR.adapterRecycler, adapter) + + val viewPager = holder.binding.root.findViewById(R.id.viewpager_popular_movie) + viewPager?.adapter = adapter + viewPager?.offscreenPageLimit = 3 + attachCarouselTransformer(viewPager) + startAutoScroll(viewPager, currentItem.items.size) } - is HomeItem.Actor -> { - holder.binding.run { - setVariable( - BR.adapterRecycler, ActorAdapter( - currentItem.items, - R.layout.item_actor_home, - listener as ActorsInteractionListener - ) - ) - setVariable(BR.listener, listener as HomeInteractionListener) - } - + is HomeItem.RecentlyReleased -> { + bindMovie(holder, currentItem.items, currentItem.type) } - is HomeItem.AiringToday -> { + is HomeItem.OnTheAiring -> { holder.binding.run { setVariable( BR.adapterRecycler, - MediaAdapter( - currentItem.items.take(Constants.MAX_NUMBER_AIRING_TODAY), - R.layout.item_airing_today, - listener as MediaInteractionListener - ) + TVShowAdapter(currentItem.items, listener as TVShowInteractionListener) ) - setVariable(BR.count, currentItem.items.size) + setVariable(BR.movieType, currentItem.type) } } - is HomeItem.Adventure -> { + is HomeItem.Upcoming -> { bindMovie(holder, currentItem.items, currentItem.type) } - is HomeItem.Mystery -> { - bindMovie(holder, currentItem.items, currentItem.type) + is HomeItem.BrowseEverything -> { + holder.binding.run { + setVariable(BR.listener, listener as HomeInteractionListener) + } } - is HomeItem.NowStreaming -> { - bindMovie(holder, currentItem.items, currentItem.type) + is HomeItem.RecentlyViewed -> { + holder.binding.setVariable( + BR.adapterRecycler, + RecentlyViewedAdapter(currentItem.items, listener as RecentlyViewedInteractionListener) + ) } - is HomeItem.OnTheAiring -> { + is HomeItem.LetUsChooseForYou -> { holder.binding.run { - setVariable( - BR.adapterRecycler, - TVShowAdapter(currentItem.items, listener as TVShowInteractionListener) - ) - setVariable(BR.movieType, currentItem.type) + setVariable(BR.listener, listener as HomeInteractionListener) } } - is HomeItem.Trending -> { - bindMovie(holder, currentItem.items, currentItem.type) - } - - is HomeItem.Upcoming -> { - bindMovie(holder, currentItem.items, currentItem.type) + is HomeItem.CollectionsList -> { + holder.binding.setVariable( + BR.adapterRecycler, + YourCollectionsAdapter(currentItem.items, listener as YourCollectionsInteractionListener) + ) } } } @@ -151,20 +139,62 @@ class HomeAdapter( override fun getItemViewType(position: Int): Int { if (homeItems.isNotEmpty()) { return when (homeItems[position]) { - is HomeItem.Actor -> R.layout.list_actor - is HomeItem.TvShows -> R.layout.list_tv_shows + is HomeItem.BrowseEverything -> R.layout.item_browser_everything_cta is HomeItem.Slider -> R.layout.list_popular - is HomeItem.AiringToday -> R.layout.list_airing_today is HomeItem.OnTheAiring -> R.layout.list_tvshow - is HomeItem.Adventure, - is HomeItem.Mystery, - is HomeItem.NowStreaming, - is HomeItem.Trending, - is HomeItem.Upcoming, - -> R.layout.list_movie + is HomeItem.RecentlyReleased -> R.layout.list_movie + is HomeItem.Upcoming, -> R.layout.list_movie + is HomeItem.RecentlyViewed -> R.layout.list_recently_viewed + is HomeItem.LetUsChooseForYou -> R.layout.item_let_us_choose_cta + is HomeItem.CollectionsList -> R.layout.list_your_collections } } return -1 } -} \ No newline at end of file + private fun attachCarouselTransformer(viewPager: ViewPager2) { + val displayMetrics = viewPager.resources.displayMetrics + val screenWidth = displayMetrics.widthPixels + + val minSidePeek = viewPager.context.resources.getDimensionPixelOffset(R.dimen.spacing_extra_large) + val sidePeek = maxOf(screenWidth * 0.05f, minSidePeek.toFloat()) + + val extraLift = viewPager.context.resources.getDimensionPixelOffset(R.dimen.spacing_extra_extra_large) + + viewPager.setPageTransformer { page, position -> + val offset = position * -sidePeek + page.translationX = if (viewPager.layoutDirection == View.LAYOUT_DIRECTION_RTL) -offset else offset + page.scaleX = 1f + page.scaleY = 1f + page.alpha = 0.8f + (1 - abs(position)) * 0.2f + page.translationY = if (position == 0f) -extraLift.toFloat() else 0f + page.translationZ = if (position == 0f) 1f else 0f + } + } + + fun startAutoScroll(viewPager: ViewPager2, itemCount: Int) { + if (itemCount == 0) return + + val recyclerView = viewPager.getChildAt(0) as? RecyclerView ?: return + + scope.launch { + var position = 0 + while (true) { + delay(2000) + position = (position + 1) % itemCount + + val smoothScroller = object : LinearSmoothScroller(viewPager.context) { + override fun getHorizontalSnapPreference(): Int = SNAP_TO_START + override fun calculateTimeForScrolling(dx: Int): Int { + return 400.coerceAtMost(super.calculateTimeForScrolling(dx)) + } + } + + smoothScroller.targetPosition = position + recyclerView.layoutManager?.startSmoothScroll(smoothScroller) + } + } + } + + +} diff --git a/app/src/main/java/com/karrar/movieapp/ui/home/adapter/RecentlyViewedAdapter.kt b/app/src/main/java/com/karrar/movieapp/ui/home/adapter/RecentlyViewedAdapter.kt new file mode 100644 index 000000000..434cb6ec2 --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/home/adapter/RecentlyViewedAdapter.kt @@ -0,0 +1,23 @@ +package com.karrar.movieapp.ui.home.adapter + +import com.karrar.movieapp.R +import com.karrar.movieapp.domain.enums.AllMediaType +import com.karrar.movieapp.ui.base.BaseAdapter +import com.karrar.movieapp.ui.base.BaseInteractionListener +import com.karrar.movieapp.ui.home.homeUiState.PopularUiState +import com.karrar.movieapp.ui.models.MediaUiState +import com.karrar.movieapp.ui.profile.watchhistory.MediaHistoryUiState +import com.karrar.movieapp.ui.profile.watchhistory.WatchHistoryInteractionListener + +class RecentlyViewedAdapter( + items: List, + val listener: RecentlyViewedInteractionListener +) : + BaseAdapter(items, listener) { + override val layoutID: Int = R.layout.item_recently_viewed +} + +interface RecentlyViewedInteractionListener : BaseInteractionListener { + fun onClickMovie(item: MediaHistoryUiState) + fun onClickSeeAllRecentlyViewed() +} \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/home/adapter/TVShowAdapter.kt b/app/src/main/java/com/karrar/movieapp/ui/home/adapter/TVShowAdapter.kt index b38722519..d683ce3cf 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/home/adapter/TVShowAdapter.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/home/adapter/TVShowAdapter.kt @@ -2,7 +2,6 @@ package com.karrar.movieapp.ui.home.adapter import com.karrar.movieapp.R import com.karrar.movieapp.domain.enums.AllMediaType -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 diff --git a/app/src/main/java/com/karrar/movieapp/ui/home/adapter/YourCollectionsAdapter.kt b/app/src/main/java/com/karrar/movieapp/ui/home/adapter/YourCollectionsAdapter.kt new file mode 100644 index 000000000..629581cca --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/home/adapter/YourCollectionsAdapter.kt @@ -0,0 +1,19 @@ +package com.karrar.movieapp.ui.home.adapter + +import com.karrar.movieapp.R +import com.karrar.movieapp.ui.base.BaseAdapter +import com.karrar.movieapp.ui.base.BaseInteractionListener +import com.karrar.movieapp.ui.myList.myCollectionUIState.CreatedCollectionUIState + +class YourCollectionsAdapter( + items: List, + val listener: YourCollectionsInteractionListener +) : + BaseAdapter(items, listener) { + override val layoutID: Int = R.layout.item_my_collection +} + +interface YourCollectionsInteractionListener : BaseInteractionListener { + fun onClickCollection(collection: CreatedCollectionUIState) + fun onClickSeeAllCollections() +} \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/home/homeUiState/HomeUIEvent.kt b/app/src/main/java/com/karrar/movieapp/ui/home/homeUiState/HomeUIEvent.kt index 13fd1005e..e9f155f6b 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/home/homeUiState/HomeUIEvent.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/home/homeUiState/HomeUIEvent.kt @@ -1,12 +1,16 @@ package com.karrar.movieapp.ui.home.homeUiState import com.karrar.movieapp.domain.enums.AllMediaType +import com.karrar.movieapp.ui.myList.myCollectionUIState.CreatedCollectionUIState sealed interface HomeUIEvent { - object ClickSeeAllActorEvent : HomeUIEvent data class ClickMovieEvent(val movieID: Int) : HomeUIEvent - data class ClickActorEvent(val actorID: Int) : HomeUIEvent data class ClickSeriesEvent(val seriesID: Int) : HomeUIEvent data class ClickSeeAllMovieEvent(val mediaType: AllMediaType) : HomeUIEvent data class ClickSeeAllTVShowsEvent(val mediaType: AllMediaType) : HomeUIEvent + object ClickSeeAllRecentlyViewedEvent: HomeUIEvent + object ClickBrowseEverythingEvent : HomeUIEvent + object ClickLetUsChooseForYouEvent : HomeUIEvent + data class ClickCollectionList(val list: CreatedCollectionUIState): HomeUIEvent + object ClickSeeAllCollectionsEvent: HomeUIEvent } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/home/homeUiState/HomeUiState.kt b/app/src/main/java/com/karrar/movieapp/ui/home/homeUiState/HomeUiState.kt index f86783407..889489787 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/home/homeUiState/HomeUiState.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/home/homeUiState/HomeUiState.kt @@ -4,15 +4,15 @@ import com.karrar.movieapp.ui.home.HomeItem data class HomeUiState ( val popularMovies: HomeItem = HomeItem.Slider(emptyList()), - val trendingMovies: HomeItem = HomeItem.Trending(emptyList()), - val nowStreamingMovies: HomeItem = HomeItem.NowStreaming(emptyList()), - val adventureMovies: HomeItem = HomeItem.Adventure(emptyList()), - val mysteryMovies: HomeItem = HomeItem.Mystery(emptyList()), + val recentlyReleasedMovies: HomeItem = HomeItem.RecentlyReleased(emptyList()), val upcomingMovies: HomeItem = HomeItem.Upcoming(emptyList()), val onTheAiringSeries: HomeItem = HomeItem.OnTheAiring(emptyList()), - val airingTodaySeries: HomeItem = HomeItem.AiringToday(emptyList()), - val tvShowsSeries: HomeItem = HomeItem.TvShows(emptyList()), - val actors: HomeItem = HomeItem.Actor(emptyList()), + val browseEverything: HomeItem = HomeItem.BrowseEverything(), + val letUsChooseForYou: HomeItem = HomeItem.LetUsChooseForYou(), + val recentlyViewed: HomeItem = HomeItem.RecentlyViewed(emptyList()), + val collections: HomeItem = HomeItem.CollectionsList(emptyList()), val isLoading:Boolean = false, val error : List = emptyList(), + val username: String? = null, + val isLoggedIn: Boolean = false ) \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/main/MainActivity.kt b/app/src/main/java/com/karrar/movieapp/ui/main/MainActivity.kt index 5d6a07f18..000db6294 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/main/MainActivity.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/main/MainActivity.kt @@ -2,24 +2,42 @@ package com.karrar.movieapp.ui.main import android.os.Bundle import android.view.Window +import android.widget.ImageView +import android.widget.LinearLayout +import android.widget.TextView import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.ContextCompat import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen -import androidx.core.view.isVisible import androidx.databinding.DataBindingUtil import androidx.navigation.NavController import androidx.navigation.findNavController import androidx.navigation.ui.AppBarConfiguration -import androidx.navigation.ui.NavigationUI -import androidx.navigation.ui.setupActionBarWithNavController -import androidx.navigation.ui.setupWithNavController import com.karrar.movieapp.R import com.karrar.movieapp.databinding.ActivityMainBinding import dagger.hilt.android.AndroidEntryPoint +import androidx.core.widget.TextViewCompat @AndroidEntryPoint class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding + private lateinit var navController: NavController + private lateinit var navHome: LinearLayout + private lateinit var navExplore: LinearLayout + private lateinit var navMatch: LinearLayout + private lateinit var navMe: LinearLayout + + private lateinit var iconHome: ImageView + private lateinit var iconExplore: ImageView + private lateinit var iconMatch: ImageView + private lateinit var iconMe: ImageView + + private lateinit var labelHome: TextView + private lateinit var labelExplore: TextView + private lateinit var labelMatch: TextView + private lateinit var labelMe: TextView + + private var currentTab = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -29,6 +47,8 @@ class MainActivity : AppCompatActivity() { installSplashScreen() supportActionBar?.setDisplayHomeAsUpEnabled(true) + + initializeCustomNavigation() } override fun onResume() { @@ -41,29 +61,113 @@ class MainActivity : AppCompatActivity() { R.id.profileFragment, ) ) - val navController = findNavController(R.id.nav_host_fragment) - binding.bottomNavigation.setupWithNavController(navController) - setupActionBarWithNavController(navController, appBarConfiguration) + navController = findNavController(R.id.nav_host_fragment) + + setupCustomBottomNavigation() + } + + private fun initializeCustomNavigation() { + // Initialize custom bottom navigation views + navHome = binding.navHome + navExplore = binding.navExplore + navMatch = binding.navMatch + navMe = binding.navMe + + iconHome = binding.iconHome + iconExplore = binding.iconExplore + iconMatch = binding.iconMatch + iconMe = binding.iconMe - setBottomNavigationVisibility(navController) - setNavigationController(navController) + labelHome = binding.labelHome + labelExplore = binding.labelExplore + labelMatch = binding.labelMatch + labelMe = binding.labelMe } - private fun setBottomNavigationVisibility(navController: NavController) { + private fun setupCustomBottomNavigation() { + navHome.setOnClickListener { + navigateToDestination(R.id.homeFragment, 0) + } + navExplore.setOnClickListener { + navigateToDestination(R.id.exploringFragment, 1) + } + navMatch.setOnClickListener { + navigateToDestination(R.id.myListFragment, 2) + } + navMe.setOnClickListener { + navigateToDestination(R.id.profileFragment, 3) + } + navController.addOnDestinationChangedListener { _, destination, _ -> - binding.bottomNavigation.isVisible = destination.id != R.id.loginFragment + updateTabSelection(destination.id) + } + + updateTabSelection(R.id.homeFragment) + } + + private fun navigateToDestination(destinationId: Int, tabIndex: Int) { + if (currentTab == tabIndex) return + + currentTab = tabIndex + + try { + navController.navigate(destinationId) + } catch (e: IllegalArgumentException) { + // Handle case where destination might not be accessible from current location + navController.popBackStack(destinationId, false) + ?: navController.navigate(destinationId) } } - private fun setNavigationController(navController: NavController) { - binding.bottomNavigation.setOnItemSelectedListener { item -> - NavigationUI.onNavDestinationSelected(item, navController) - navController.popBackStack(item.itemId, inclusive = false) - true + private fun updateTabSelection(destinationId: Int) { + resetAllTabs() + + when (destinationId) { + R.id.homeFragment -> { + currentTab = 0 + setTabSelected(iconHome, labelHome, R.drawable.ic_home_duetone) + } + + R.id.exploringFragment -> { + currentTab = 1 + setTabSelected(iconExplore, labelExplore, R.drawable.ic_search_duetone) + } + + R.id.myListFragment -> { + currentTab = 2 + setTabSelected(iconMatch, labelMatch, R.drawable.ic_magic_stick_duetone) + } + + R.id.profileFragment -> { + currentTab = 3 + setTabSelected(iconMe, labelMe, R.drawable.ic_user_square_duetone) + } } } + private fun resetAllTabs() { + setTabUnselected(iconHome, labelHome, R.drawable.ic_home) + setTabUnselected(iconExplore, labelExplore, R.drawable.ic_search) + setTabUnselected(iconMatch, labelMatch, R.drawable.ic_magic_stick) + setTabUnselected(iconMe, labelMe, R.drawable.ic_user_square) + } + + private fun setTabSelected(icon: ImageView, label: TextView, selectedIconRes: Int) { + icon.setImageResource(selectedIconRes) + icon.setColorFilter(ContextCompat.getColor(this, R.color.brand_primary)) + label.setTextColor(ContextCompat.getColor(this, R.color.brand_primary)) + TextViewCompat.setTextAppearance(label, R.style.Typography_label_md_semi_bold) + } + + private fun setTabUnselected(icon: ImageView, label: TextView, unSelectedIconRes: Int) { + icon.setImageResource(unSelectedIconRes) + icon.setColorFilter(ContextCompat.getColor(this, R.color.shade_tertiary)) + label.setTextColor(ContextCompat.getColor(this, R.color.shade_tertiary)) + TextViewCompat.setTextAppearance(label, R.style.Typography_label_md_regular) + } + + override fun onSupportNavigateUp(): Boolean { - return findNavController(R.id.nav_host_fragment).navigateUp() || super.onSupportNavigateUp() + return navController.navigateUp() || super.onSupportNavigateUp() } } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/mappers/MediaUiMapper.kt b/app/src/main/java/com/karrar/movieapp/ui/mappers/MediaUiMapper.kt index 44bbba3d4..21ee7fa81 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/mappers/MediaUiMapper.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/mappers/MediaUiMapper.kt @@ -11,6 +11,8 @@ class MediaUiMapper @Inject constructor() : Mapper { return MediaUiState( input.mediaID, input.mediaImage, + input.mediaName, + input.mediaRate.toString() ) } } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/models/MediaUi.kt b/app/src/main/java/com/karrar/movieapp/ui/models/MediaUi.kt index c40d8d08f..1700bd727 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/models/MediaUi.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/models/MediaUi.kt @@ -2,5 +2,7 @@ package com.karrar.movieapp.ui.models data class MediaUiState( val id: Int = 0, - val imageUrl: String = "" + val imageUrl: String = "", + val title: String = "", + val rate: String = "" ) diff --git a/app/src/main/java/com/karrar/movieapp/ui/movieDetails/DetailAdapter.kt b/app/src/main/java/com/karrar/movieapp/ui/movieDetails/DetailAdapter.kt index db0db2144..f539fe0fd 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/movieDetails/DetailAdapter.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/movieDetails/DetailAdapter.kt @@ -5,7 +5,10 @@ import android.view.ViewGroup import androidx.databinding.DataBindingUtil import com.karrar.movieapp.BR import com.karrar.movieapp.R -import com.karrar.movieapp.ui.adapters.* +import com.karrar.movieapp.ui.adapters.ActorAdapter +import com.karrar.movieapp.ui.adapters.ActorsInteractionListener +import com.karrar.movieapp.ui.adapters.MovieAdapter +import com.karrar.movieapp.ui.adapters.MovieInteractionListener import com.karrar.movieapp.ui.base.BaseAdapter import com.karrar.movieapp.ui.base.BaseInteractionListener import com.karrar.movieapp.ui.movieDetails.movieDetailsUIState.DetailItemUIState @@ -36,6 +39,7 @@ class DetailAdapter( setVariable(BR.listener, listener as DetailInteractionListener) } } + is DetailItemUIState.Cast -> { holder.binding.run { setVariable( @@ -48,6 +52,7 @@ class DetailAdapter( ) } } + is DetailItemUIState.SimilarMovies -> { holder.binding.run { setVariable( @@ -56,23 +61,23 @@ class DetailAdapter( ) } } + is DetailItemUIState.Rating -> { holder.binding.run { setVariable(BR.viewModel, currentItem.viewModel) } } + is DetailItemUIState.Comment -> { holder.binding.run { setVariable(BR.item, currentItem.data) setVariable(BR.listener, listener) } } - is DetailItemUIState.ReviewText -> {} - DetailItemUIState.SeeAllReviewsButton -> { - holder.binding.run { - setVariable(BR.listener, listener as DetailInteractionListener) - } - } + + is DetailItemUIState.BehindTheScenesText -> {} + DetailItemUIState.ReviewText -> {} + } } @@ -92,11 +97,11 @@ class DetailAdapter( is DetailItemUIState.SimilarMovies -> R.layout.list_similar_movie is DetailItemUIState.Rating -> R.layout.item_rating is DetailItemUIState.Comment -> R.layout.item_movie_review - is DetailItemUIState.ReviewText -> R.layout.item_review_text - DetailItemUIState.SeeAllReviewsButton -> R.layout.item_see_all_reviews + is DetailItemUIState.BehindTheScenesText -> R.layout.item_movie_behindthescene + DetailItemUIState.ReviewText -> R.layout.item_review_text + } } - } diff --git a/app/src/main/java/com/karrar/movieapp/ui/movieDetails/MovieDetailsViewModel.kt b/app/src/main/java/com/karrar/movieapp/ui/movieDetails/MovieDetailsViewModel.kt index 1b8230357..c58db12f8 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/movieDetails/MovieDetailsViewModel.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/movieDetails/MovieDetailsViewModel.kt @@ -181,9 +181,9 @@ class MovieDetailsViewModel @Inject constructor( onAddMovieDetailsItemOfNestedView(DetailItemUIState.Comment(it)) } onAddMovieDetailsItemOfNestedView(DetailItemUIState.ReviewText) - if (showSeeAll) { - onAddMovieDetailsItemOfNestedView(DetailItemUIState.SeeAllReviewsButton) - } +// if (showSeeAll) { +// onAddMovieDetailsItemOfNestedView(DetailItemUIState.SeeAllReviewsButton) +// } } private fun onAddMovieDetailsItemOfNestedView(item: DetailItemUIState) { diff --git a/app/src/main/java/com/karrar/movieapp/ui/movieDetails/movieDetailsUIState/DetailItemUIState.kt b/app/src/main/java/com/karrar/movieapp/ui/movieDetails/movieDetailsUIState/DetailItemUIState.kt index 4b508e627..6b2fce5fa 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/movieDetails/movieDetailsUIState/DetailItemUIState.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/movieDetails/movieDetailsUIState/DetailItemUIState.kt @@ -18,6 +18,6 @@ sealed class DetailItemUIState(val priority: Int) { object ReviewText : DetailItemUIState(5) - object SeeAllReviewsButton : DetailItemUIState(7) + object BehindTheScenesText : DetailItemUIState(3) } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/CreateListDialog.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/CreateCollectionDialog.kt similarity index 73% rename from app/src/main/java/com/karrar/movieapp/ui/myList/CreateListDialog.kt rename to app/src/main/java/com/karrar/movieapp/ui/myList/CreateCollectionDialog.kt index 3572146a3..5d4d95fa8 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/myList/CreateListDialog.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/myList/CreateCollectionDialog.kt @@ -6,21 +6,21 @@ import androidx.fragment.app.activityViewModels import com.karrar.movieapp.R import com.karrar.movieapp.databinding.FragmentCreateListDialogBinding import com.karrar.movieapp.ui.base.BaseDialogFragment -import com.karrar.movieapp.ui.myList.myListUIState.MyListUIEvent +import com.karrar.movieapp.ui.myList.myCollectionUIState.MyCollectionUIEvent import com.karrar.movieapp.utilities.collectLast import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class CreateListDialog : BaseDialogFragment() { +class CreateCollectionDialog : BaseDialogFragment() { override val layoutIdFragment = R.layout.fragment_create_list_dialog - override val viewModel: MyListsViewModel by activityViewModels() + override val viewModel: MyCollectionViewModel by activityViewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) collectLast(viewModel.myListUIEvent) { it.peekContent()?.let { - if (it is MyListUIEvent.CLickAddEvent) { + if (it is MyCollectionUIEvent.CLickAddEvent) { dismissDialog() } } diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/CreatedListAdapter.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/CreatedCollectionAdapter.kt similarity index 50% rename from app/src/main/java/com/karrar/movieapp/ui/myList/CreatedListAdapter.kt rename to app/src/main/java/com/karrar/movieapp/ui/myList/CreatedCollectionAdapter.kt index 38d264684..8302644dc 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/myList/CreatedListAdapter.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/myList/CreatedCollectionAdapter.kt @@ -3,13 +3,13 @@ package com.karrar.movieapp.ui.myList import com.karrar.movieapp.R import com.karrar.movieapp.ui.base.BaseAdapter import com.karrar.movieapp.ui.base.BaseInteractionListener -import com.karrar.movieapp.ui.myList.myListUIState.CreatedListUIState +import com.karrar.movieapp.ui.myList.myCollectionUIState.CreatedCollectionUIState -class CreatedListAdapter(items: List, listener: CreatedListInteractionListener) : - BaseAdapter(items, listener) { +class CreatedListAdapter(items: List, listener: CreatedListInteractionListener) : + BaseAdapter(items, listener) { override val layoutID: Int = R.layout.item_saved_list } interface CreatedListInteractionListener : BaseInteractionListener { - fun onListClick(item: CreatedListUIState) + fun onListClick(item: CreatedCollectionUIState) } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/CreatedCollectionUIMapper.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/CreatedCollectionUIMapper.kt new file mode 100644 index 000000000..f4acdb012 --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/myList/CreatedCollectionUIMapper.kt @@ -0,0 +1,19 @@ +package com.karrar.movieapp.ui.myList + +import com.karrar.movieapp.domain.mappers.Mapper +import com.karrar.movieapp.domain.models.CreatedList +import com.karrar.movieapp.ui.myList.myCollectionUIState.CreatedCollectionUIState +import javax.inject.Inject + +class CreatedCollectionUIMapper @Inject constructor() : Mapper { + + override fun map(input: CreatedList): CreatedCollectionUIState { + return CreatedCollectionUIState( + listID = input.id, + name = input.name, + mediaCounts = input.itemCount + ) + } +} + + diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/CreatedListUIMapper.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/CreatedListUIMapper.kt deleted file mode 100644 index 230ff7973..000000000 --- a/app/src/main/java/com/karrar/movieapp/ui/myList/CreatedListUIMapper.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.karrar.movieapp.ui.myList - -import com.karrar.movieapp.domain.mappers.Mapper -import com.karrar.movieapp.domain.models.CreatedList -import com.karrar.movieapp.ui.myList.myListUIState.CreatedListUIState -import javax.inject.Inject - -class CreatedListUIMapper @Inject constructor() : Mapper { - - override fun map(input: CreatedList): CreatedListUIState { - return CreatedListUIState( - listID = input.id, - name = input.name, - mediaCounts = input.itemCount - ) - } -} - - diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/MyListsFragment.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/MyCollectionFragment.kt similarity index 66% rename from app/src/main/java/com/karrar/movieapp/ui/myList/MyListsFragment.kt rename to app/src/main/java/com/karrar/movieapp/ui/myList/MyCollectionFragment.kt index 464064f06..960ef7691 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/myList/MyListsFragment.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/myList/MyCollectionFragment.kt @@ -1,7 +1,6 @@ package com.karrar.movieapp.ui.myList import android.os.Bundle -import android.util.Log import android.view.View import android.widget.Toast import androidx.fragment.app.activityViewModels @@ -10,16 +9,16 @@ import androidx.navigation.fragment.findNavController import com.karrar.movieapp.R import com.karrar.movieapp.databinding.FragmentMyListsBinding import com.karrar.movieapp.ui.base.BaseFragment -import com.karrar.movieapp.ui.myList.myListUIState.MyListUIEvent +import com.karrar.movieapp.ui.myList.myCollectionUIState.MyCollectionUIEvent import com.karrar.movieapp.utilities.collectLast import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class MyListsFragment : BaseFragment() { +class MyCollectionFragment : BaseFragment() { override val layoutIdFragment: Int = R.layout.fragment_my_lists - override val viewModel: MyListsViewModel by activityViewModels() + override val viewModel: MyCollectionViewModel by activityViewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -34,19 +33,19 @@ class MyListsFragment : BaseFragment() { } } - private fun onEvent(event: MyListUIEvent) { + private fun onEvent(event: MyCollectionUIEvent) { var action: NavDirections? = null when (event) { - MyListUIEvent.CreateButtonClicked -> { - action = MyListsFragmentDirections.actionMyListFragmentToCreateSavedList() + MyCollectionUIEvent.CreateButtonClicked -> { + action = MyCollectionFragmentDirections.actionMyListFragmentToCreateSavedList() } - is MyListUIEvent.DisplayError -> { + is MyCollectionUIEvent.DisplayError -> { Toast.makeText(requireContext(), event.errorMessage, Toast.LENGTH_LONG).show() } - is MyListUIEvent.OnSelectItem -> { - action = MyListsFragmentDirections.actionMyListFragmentToSavedListFragment( - event.createdListUIState.listID, - event.createdListUIState.name + is MyCollectionUIEvent.OnSelectItem -> { + action = MyCollectionFragmentDirections.actionMyListFragmentToSavedListFragment( + event.createdCollectionUIState.listID, + event.createdCollectionUIState.name ) } else -> { diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/MyListsViewModel.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/MyCollectionViewModel.kt similarity index 59% rename from app/src/main/java/com/karrar/movieapp/ui/myList/MyListsViewModel.kt rename to app/src/main/java/com/karrar/movieapp/ui/myList/MyCollectionViewModel.kt index 769f718c6..9ca1eba24 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/myList/MyListsViewModel.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/myList/MyCollectionViewModel.kt @@ -5,10 +5,10 @@ import com.karrar.movieapp.domain.usecases.mylist.CreateMovieListUseCase import com.karrar.movieapp.domain.usecases.mylist.GetMyListUseCase import com.karrar.movieapp.ui.base.BaseViewModel import com.karrar.movieapp.ui.category.uiState.ErrorUIState -import com.karrar.movieapp.ui.myList.myListUIState.CreateListDialogUIState -import com.karrar.movieapp.ui.myList.myListUIState.CreatedListUIState -import com.karrar.movieapp.ui.myList.myListUIState.MyListUIEvent -import com.karrar.movieapp.ui.myList.myListUIState.MyListUIState +import com.karrar.movieapp.ui.myList.myCollectionUIState.CreateCollectionDialogUIState +import com.karrar.movieapp.ui.myList.myCollectionUIState.CreatedCollectionUIState +import com.karrar.movieapp.ui.myList.myCollectionUIState.MyCollectionUIEvent +import com.karrar.movieapp.ui.myList.myCollectionUIState.MyCollectionUIState import com.karrar.movieapp.utilities.ErrorUI.INTERNET_CONNECTION import com.karrar.movieapp.utilities.ErrorUI.NEED_LOGIN import com.karrar.movieapp.utilities.ErrorUI.NO_LOGIN @@ -22,20 +22,20 @@ import javax.inject.Inject @HiltViewModel -class MyListsViewModel @Inject constructor( +class MyCollectionViewModel @Inject constructor( private val createMovieListUseCase: CreateMovieListUseCase, private val getMyListUseCase: GetMyListUseCase, - private val createdListUIMapper: CreatedListUIMapper, + private val createdCollectionUIMapper: CreatedCollectionUIMapper, ) : BaseViewModel(), CreatedListInteractionListener { - private val _createdListUIState = MutableStateFlow(MyListUIState()) + private val _createdListUIState = MutableStateFlow(MyCollectionUIState()) val createdListUIState = _createdListUIState.asStateFlow() - private val _createListDialogUIState = MutableStateFlow(CreateListDialogUIState()) - val createListDialogUIState = _createListDialogUIState.asStateFlow() + private val _createCollectionDialogUIState = MutableStateFlow(CreateCollectionDialogUIState()) + val createListDialogUIState = _createCollectionDialogUIState.asStateFlow() - private val _myListUIEvent: MutableStateFlow> = MutableStateFlow(Event(null)) - val myListUIEvent = _myListUIEvent.asStateFlow() + private val _myCollectionUIEvent: MutableStateFlow> = MutableStateFlow(Event(null)) + val myListUIEvent = _myCollectionUIEvent.asStateFlow() override fun getData() { _createdListUIState.update { @@ -47,7 +47,7 @@ class MyListsViewModel @Inject constructor( } viewModelScope.launch { try { - val list = getMyListUseCase().map { createdListUIMapper.map(it) } + val list = getMyListUseCase().map { createdCollectionUIMapper.map(it) } _createdListUIState.update { it.copy(isLoading = false, isEmpty = list.isEmpty(), createdList = list) } @@ -58,11 +58,11 @@ class MyListsViewModel @Inject constructor( } fun onListNameInputChange(listName: CharSequence) { - _createListDialogUIState.update { it.copy(mediaListName = listName.toString()) } + _createCollectionDialogUIState.update { it.copy(mediaListName = listName.toString()) } } fun onCreateList() { - _myListUIEvent.update { Event(MyListUIEvent.CreateButtonClicked) } + _myCollectionUIEvent.update { Event(MyCollectionUIEvent.CreateButtonClicked) } } fun onClickAddList() { @@ -71,22 +71,22 @@ class MyListsViewModel @Inject constructor( _createdListUIState.update { it.copy( isLoading = false, - createdList = createMovieListUseCase(_createListDialogUIState.value.mediaListName) - .map { createdListUIMapper.map(it) }, + createdList = createMovieListUseCase(_createCollectionDialogUIState.value.mediaListName) + .map { createdCollectionUIMapper.map(it) }, error = emptyList(), isEmpty = false, ) } } catch (t: Throwable) { - _myListUIEvent.update { Event(MyListUIEvent.DisplayError(t.message.toString())) } + _myCollectionUIEvent.update { Event(MyCollectionUIEvent.DisplayError(t.message.toString())) } } - _createListDialogUIState.update { it.copy(mediaListName = "") } - _myListUIEvent.emit(Event(MyListUIEvent.CLickAddEvent)) + _createCollectionDialogUIState.update { it.copy(mediaListName = "") } + _myCollectionUIEvent.emit(Event(MyCollectionUIEvent.CLickAddEvent)) } } - override fun onListClick(item: CreatedListUIState) { - _myListUIEvent.update { Event(MyListUIEvent.OnSelectItem(item)) } + override fun onListClick(item: CreatedCollectionUIState) { + _myCollectionUIEvent.update { Event(MyCollectionUIEvent.OnSelectItem(item)) } } private fun setError(t: Throwable) { diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/ListDetailsFragment.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/CollectionDetailsFragment.kt similarity index 68% rename from app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/ListDetailsFragment.kt rename to app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/CollectionDetailsFragment.kt index 4cfa55a64..09492a108 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/ListDetailsFragment.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/CollectionDetailsFragment.kt @@ -1,4 +1,4 @@ -package com.karrar.movieapp.ui.myList.listDetails +package com.karrar.movieapp.ui.myList.collectionDetails import android.os.Bundle import android.view.View @@ -7,15 +7,15 @@ import androidx.navigation.fragment.findNavController import com.karrar.movieapp.R import com.karrar.movieapp.databinding.FragmentListDetailsBinding import com.karrar.movieapp.ui.base.BaseFragment -import com.karrar.movieapp.ui.myList.listDetails.listDetailsUIState.ListDetailsUIEvent +import com.karrar.movieapp.ui.myList.collectionDetails.collectionDetailsUIState.CollectionDetailsUIEvent import com.karrar.movieapp.utilities.Constants import com.karrar.movieapp.utilities.collectLast import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint -class ListDetailsFragment : BaseFragment() { +class CollectionDetailsFragment : BaseFragment() { override val layoutIdFragment = R.layout.fragment_list_details - override val viewModel: ListDetailsViewModel by viewModels() + override val viewModel: CollectionDetailsViewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -26,8 +26,8 @@ class ListDetailsFragment : BaseFragment() { } } - private fun onEvent(event: ListDetailsUIEvent) { - if (event is ListDetailsUIEvent.OnItemSelected) { + private fun onEvent(event: CollectionDetailsUIEvent) { + if (event is CollectionDetailsUIEvent.OnItemSelected) { if (event.savedMediaUIState.mediaType == Constants.MOVIE) { navigateToMovieDetails(event.savedMediaUIState.mediaID) } else { @@ -38,13 +38,13 @@ class ListDetailsFragment : BaseFragment() { private fun navigateToMovieDetails(id: Int) { findNavController().navigate( - ListDetailsFragmentDirections.actionSavedListFragmentToMovieDetailFragment(id) + CollectionDetailsFragmentDirections.actionSavedListFragmentToMovieDetailFragment(id) ) } private fun navigateToTvShowDetails(id: Int) { findNavController().navigate( - ListDetailsFragmentDirections.actionListDetailsFragmentToTvShowDetailsFragment(id) + CollectionDetailsFragmentDirections.actionListDetailsFragmentToTvShowDetailsFragment(id) ) } diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/ListDetailsViewModel.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/CollectionDetailsViewModel.kt similarity index 60% rename from app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/ListDetailsViewModel.kt rename to app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/CollectionDetailsViewModel.kt index a681152af..44a16815e 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/ListDetailsViewModel.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/CollectionDetailsViewModel.kt @@ -1,13 +1,13 @@ -package com.karrar.movieapp.ui.myList.listDetails +package com.karrar.movieapp.ui.myList.collectionDetails import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope import com.karrar.movieapp.domain.usecases.mylist.GetMyMediaListDetailsUseCase import com.karrar.movieapp.ui.base.BaseViewModel import com.karrar.movieapp.ui.category.uiState.ErrorUIState -import com.karrar.movieapp.ui.myList.listDetails.listDetailsUIState.ListDetailsUIEvent -import com.karrar.movieapp.ui.myList.listDetails.listDetailsUIState.ListDetailsUIState -import com.karrar.movieapp.ui.myList.listDetails.listDetailsUIState.SavedMediaUIState +import com.karrar.movieapp.ui.myList.collectionDetails.collectionDetailsUIState.CollectionDetailsUIEvent +import com.karrar.movieapp.ui.myList.collectionDetails.collectionDetailsUIState.CollectionDetailsUIState +import com.karrar.movieapp.ui.myList.collectionDetails.collectionDetailsUIState.SavedMediaUIState import com.karrar.movieapp.utilities.Event import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -18,33 +18,33 @@ import javax.inject.Inject @HiltViewModel -class ListDetailsViewModel @Inject constructor( +class CollectionDetailsViewModel @Inject constructor( private val getMyMediaListDetailsUseCase: GetMyMediaListDetailsUseCase, private val mediaUIStateMapper: MediaUIStateMapper, saveStateHandle: SavedStateHandle ) : BaseViewModel(), ListDetailsInteractionListener { - val args = ListDetailsFragmentArgs.fromSavedStateHandle(saveStateHandle) + val args = CollectionDetailsFragmentArgs.fromSavedStateHandle(saveStateHandle) - private val _listDetailsUIState = MutableStateFlow(ListDetailsUIState()) - val listDetailsUIState = _listDetailsUIState.asStateFlow() + private val _collectionDetailsUIState = MutableStateFlow(CollectionDetailsUIState()) + val listDetailsUIState = _collectionDetailsUIState.asStateFlow() - private val _listDetailsUIEvent = MutableStateFlow>(Event(null)) - val listDetailsUIEvent = _listDetailsUIEvent.asStateFlow() + private val _collectionDetailsUIEvent = MutableStateFlow>(Event(null)) + val listDetailsUIEvent = _collectionDetailsUIEvent.asStateFlow() init { getData() } override fun getData() { - _listDetailsUIState.update { + _collectionDetailsUIState.update { it.copy(isLoading = true, isEmpty = false, error = emptyList()) } viewModelScope.launch { try { val result = getMyMediaListDetailsUseCase(args.id).map { mediaUIStateMapper.map(it) } - _listDetailsUIState.update { + _collectionDetailsUIState.update { it.copy( isLoading = false, isEmpty = result.isEmpty(), @@ -53,7 +53,7 @@ class ListDetailsViewModel @Inject constructor( } } catch (t: Throwable) { - _listDetailsUIState.update { + _collectionDetailsUIState.update { it.copy( isLoading = false, error = listOf( ErrorUIState(0, t.message.toString()) @@ -65,7 +65,7 @@ class ListDetailsViewModel @Inject constructor( } override fun onItemClick(item: SavedMediaUIState) { - _listDetailsUIEvent.update { Event(ListDetailsUIEvent.OnItemSelected(item)) } + _collectionDetailsUIEvent.update { Event(CollectionDetailsUIEvent.OnItemSelected(item)) } } } diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/MediaUIStateMapper.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/MediaUIStateMapper.kt similarity index 79% rename from app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/MediaUIStateMapper.kt rename to app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/MediaUIStateMapper.kt index 26151d217..19f7877ef 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/MediaUIStateMapper.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/MediaUIStateMapper.kt @@ -1,8 +1,8 @@ -package com.karrar.movieapp.ui.myList.listDetails +package com.karrar.movieapp.ui.myList.collectionDetails import com.karrar.movieapp.domain.mappers.Mapper import com.karrar.movieapp.domain.models.SaveListDetails -import com.karrar.movieapp.ui.myList.listDetails.listDetailsUIState.SavedMediaUIState +import com.karrar.movieapp.ui.myList.collectionDetails.collectionDetailsUIState.SavedMediaUIState import javax.inject.Inject class MediaUIStateMapper @Inject constructor() : Mapper { diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/ListDetailsAdapter.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/collectionDetailsAdapter.kt similarity index 65% rename from app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/ListDetailsAdapter.kt rename to app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/collectionDetailsAdapter.kt index 6441e20fc..d15f02fce 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/ListDetailsAdapter.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/collectionDetailsAdapter.kt @@ -1,11 +1,9 @@ -package com.karrar.movieapp.ui.myList.listDetails +package com.karrar.movieapp.ui.myList.collectionDetails import com.karrar.movieapp.R -import com.karrar.movieapp.domain.models.SaveListDetails import com.karrar.movieapp.ui.base.BaseAdapter import com.karrar.movieapp.ui.base.BaseInteractionListener -import com.karrar.movieapp.ui.category.uiState.MediaUIState -import com.karrar.movieapp.ui.myList.listDetails.listDetailsUIState.SavedMediaUIState +import com.karrar.movieapp.ui.myList.collectionDetails.collectionDetailsUIState.SavedMediaUIState class ListDetailsAdapter( lists: List, diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/collectionDetailsUIState/CollectionDetailsUIEvent.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/collectionDetailsUIState/CollectionDetailsUIEvent.kt new file mode 100644 index 000000000..2657b4f5a --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/collectionDetailsUIState/CollectionDetailsUIEvent.kt @@ -0,0 +1,5 @@ +package com.karrar.movieapp.ui.myList.collectionDetails.collectionDetailsUIState + +sealed interface CollectionDetailsUIEvent { + data class OnItemSelected(val savedMediaUIState: SavedMediaUIState) : CollectionDetailsUIEvent +} \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/listDetailsUIState/ListDetailsUIState.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/collectionDetailsUIState/CollectionDetailsUIState.kt similarity index 67% rename from app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/listDetailsUIState/ListDetailsUIState.kt rename to app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/collectionDetailsUIState/CollectionDetailsUIState.kt index 8863d210d..b6d8975cf 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/listDetailsUIState/ListDetailsUIState.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/collectionDetailsUIState/CollectionDetailsUIState.kt @@ -1,9 +1,9 @@ -package com.karrar.movieapp.ui.myList.listDetails.listDetailsUIState +package com.karrar.movieapp.ui.myList.collectionDetails.collectionDetailsUIState import com.karrar.movieapp.ui.category.uiState.ErrorUIState -data class ListDetailsUIState( +data class CollectionDetailsUIState( val savedMedia: List = emptyList(), val isLoading: Boolean = false, val isEmpty: Boolean = false, diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/listDetailsUIState/SavedMediaUIState.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/collectionDetailsUIState/SavedMediaUIState.kt similarity index 77% rename from app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/listDetailsUIState/SavedMediaUIState.kt rename to app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/collectionDetailsUIState/SavedMediaUIState.kt index df13af70a..72e774438 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/listDetailsUIState/SavedMediaUIState.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/myList/collectionDetails/collectionDetailsUIState/SavedMediaUIState.kt @@ -1,4 +1,4 @@ -package com.karrar.movieapp.ui.myList.listDetails.listDetailsUIState +package com.karrar.movieapp.ui.myList.collectionDetails.collectionDetailsUIState import com.karrar.movieapp.utilities.Constants diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/listDetailsUIState/ListDetailsUIEvent.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/listDetailsUIState/ListDetailsUIEvent.kt deleted file mode 100644 index f036cf631..000000000 --- a/app/src/main/java/com/karrar/movieapp/ui/myList/listDetails/listDetailsUIState/ListDetailsUIEvent.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.karrar.movieapp.ui.myList.listDetails.listDetailsUIState - -sealed interface ListDetailsUIEvent { - data class OnItemSelected(val savedMediaUIState: SavedMediaUIState) : ListDetailsUIEvent -} \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/myListUIState/CreateListDialogUIState.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/myCollectionUIState/CreateCollectionDialogUIState.kt similarity index 59% rename from app/src/main/java/com/karrar/movieapp/ui/myList/myListUIState/CreateListDialogUIState.kt rename to app/src/main/java/com/karrar/movieapp/ui/myList/myCollectionUIState/CreateCollectionDialogUIState.kt index f59756a75..5c2ea9d17 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/myList/myListUIState/CreateListDialogUIState.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/myList/myCollectionUIState/CreateCollectionDialogUIState.kt @@ -1,8 +1,8 @@ -package com.karrar.movieapp.ui.myList.myListUIState +package com.karrar.movieapp.ui.myList.myCollectionUIState import com.karrar.movieapp.ui.category.uiState.ErrorUIState -data class CreateListDialogUIState( +data class CreateCollectionDialogUIState( val mediaListName: String = "", val error: List = emptyList() ) \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/myCollectionUIState/CreatedCollectionUIState.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/myCollectionUIState/CreatedCollectionUIState.kt new file mode 100644 index 000000000..bf0066b33 --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/myList/myCollectionUIState/CreatedCollectionUIState.kt @@ -0,0 +1,7 @@ +package com.karrar.movieapp.ui.myList.myCollectionUIState + +data class CreatedCollectionUIState( + val listID: Int = 0, + val name: String = "", + val mediaCounts: Int = 0 +) diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/myCollectionUIState/MyCollectionUIEvent.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/myCollectionUIState/MyCollectionUIEvent.kt new file mode 100644 index 000000000..a1307aa03 --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/myList/myCollectionUIState/MyCollectionUIEvent.kt @@ -0,0 +1,8 @@ +package com.karrar.movieapp.ui.myList.myCollectionUIState + +sealed interface MyCollectionUIEvent { + object CreateButtonClicked : MyCollectionUIEvent + object CLickAddEvent : MyCollectionUIEvent + data class OnSelectItem(val createdCollectionUIState: CreatedCollectionUIState) : MyCollectionUIEvent + data class DisplayError(val errorMessage: String) : MyCollectionUIEvent +} \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/myListUIState/MyListUIState.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/myCollectionUIState/MyCollectionUIState.kt similarity index 53% rename from app/src/main/java/com/karrar/movieapp/ui/myList/myListUIState/MyListUIState.kt rename to app/src/main/java/com/karrar/movieapp/ui/myList/myCollectionUIState/MyCollectionUIState.kt index 9a96b6b64..9309a046c 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/myList/myListUIState/MyListUIState.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/myList/myCollectionUIState/MyCollectionUIState.kt @@ -1,9 +1,9 @@ -package com.karrar.movieapp.ui.myList.myListUIState +package com.karrar.movieapp.ui.myList.myCollectionUIState import com.karrar.movieapp.ui.category.uiState.ErrorUIState -data class MyListUIState( - val createdList: List = emptyList(), +data class MyCollectionUIState( + val createdList: List = emptyList(), val isLoading: Boolean = false, val isEmpty: Boolean = false, val error: List = emptyList() diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/myListUIState/CreatedListUIState.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/myListUIState/CreatedListUIState.kt deleted file mode 100644 index 2753da288..000000000 --- a/app/src/main/java/com/karrar/movieapp/ui/myList/myListUIState/CreatedListUIState.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.karrar.movieapp.ui.myList.myListUIState - -data class CreatedListUIState( - val listID: Int = 0, - val name: String = "", - val mediaCounts: Int = 0 -) diff --git a/app/src/main/java/com/karrar/movieapp/ui/myList/myListUIState/MyListUIEvent.kt b/app/src/main/java/com/karrar/movieapp/ui/myList/myListUIState/MyListUIEvent.kt deleted file mode 100644 index 88f400882..000000000 --- a/app/src/main/java/com/karrar/movieapp/ui/myList/myListUIState/MyListUIEvent.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.karrar.movieapp.ui.myList.myListUIState - -sealed interface MyListUIEvent { - object CreateButtonClicked : MyListUIEvent - object CLickAddEvent : MyListUIEvent - data class OnSelectItem(val createdListUIState: CreatedListUIState) : MyListUIEvent - data class DisplayError(val errorMessage: String) : MyListUIEvent -} \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingActivity.kt b/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingActivity.kt new file mode 100644 index 000000000..b7dddb94b --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingActivity.kt @@ -0,0 +1,123 @@ +package com.karrar.movieapp.ui.onboarding + +import android.content.Intent +import android.os.Bundle +import android.view.View +import androidx.activity.viewModels +import androidx.lifecycle.lifecycleScope +import androidx.viewpager2.widget.ViewPager2 +import com.karrar.movieapp.R +import com.karrar.movieapp.databinding.ActivityOnBoardingBinding +import com.karrar.movieapp.ui.base.BaseActivity +import com.karrar.movieapp.ui.main.MainActivity +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch + +@AndroidEntryPoint +class OnBoardingActivity : BaseActivity() { + + override val layoutIdActivity: Int = R.layout.activity_on_boarding + override val viewModel: OnBoardingViewModel by viewModels() + + private lateinit var pagerAdapter: OnBoardingPagerAdapter + private lateinit var pageTransformer: OnBoardingPageTransformer + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + val sharedPrefs = getSharedPreferences(ON_BOARDING_PREFS, MODE_PRIVATE) + val isOnboardingCompleted = sharedPrefs.getBoolean(ON_BOARDING_COMPLETED, false) + if (isOnboardingCompleted) { + navigateToMain() + return + } + + setupViewPager() + setupObservers() + setupClickListeners() + } + + private fun setupViewPager() { + pagerAdapter = OnBoardingPagerAdapter(emptyList(), viewModel) + pageTransformer = OnBoardingPageTransformer() + + binding.viewPager.adapter = pagerAdapter + binding.viewPager.isUserInputEnabled = true + binding.viewPager.setPageTransformer(pageTransformer) + binding.viewPager.offscreenPageLimit = 1 + + binding.viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + super.onPageSelected(position) + viewModel.onPageChanged(position) + } + }) + } + + private fun setupObservers() { + lifecycleScope.launch { + viewModel.uiState.collect { state -> + updateUI(state) + } + } + + lifecycleScope.launch { + viewModel.uiEffect.collect { event -> + when (event) { + is OnBoardingScreenEvents.NavigateToLoginScreen -> { + navigateToMain() + } + } + } + } + } + + private fun updateUI(state: OnBoardingState) { + pagerAdapter.updatePages(state.pages) + if (binding.viewPager.currentItem != state.currentPage) { + binding.viewPager.setCurrentItem(state.currentPage, true) + } + if (state.pages.isNotEmpty() && state.currentPage < state.pages.size) { + val currentPage = state.pages[state.currentPage] + binding.titleText.text = currentPage.title.asString(this) + binding.descriptionText.text = currentPage.description.asString(this) + } + binding.previousButton.visibility = + if (state.currentPage == 0) View.INVISIBLE else View.VISIBLE + + if (state.currentPage == state.pages.lastIndex) { + binding.nextButton.visibility = View.GONE + binding.getStartedButton.visibility = View.VISIBLE + } else { + binding.nextButton.visibility = View.VISIBLE + binding.getStartedButton.visibility = View.GONE + } + } + + private fun setupClickListeners() { + binding.previousButton.setOnClickListener { + viewModel.onClickPreviousButton() + } + + binding.nextButton.setOnClickListener { + viewModel.onClickNextButton() + } + + binding.getStartedButton.setOnClickListener { + viewModel.onClickGetStartedButton() + } + } + + private fun navigateToMain() { + val intent = Intent(this, MainActivity::class.java) + startActivity(intent) + finish() + } + + companion object{ + const val ON_BOARDING_COMPLETED = "onboarding_completed" + const val ON_BOARDING_PREFS = "onboarding_prefs" + } + +} + diff --git a/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingInteractionListener.kt b/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingInteractionListener.kt new file mode 100644 index 000000000..2c8ac969d --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingInteractionListener.kt @@ -0,0 +1,10 @@ +package com.karrar.movieapp.ui.onboarding + +import com.karrar.movieapp.ui.base.BaseInteractionListener + +interface OnBoardingInteractionListener : BaseInteractionListener { + fun onPageChanged(pageIndex: Int) + fun onClickPreviousButton() + fun onClickNextButton() + fun onClickGetStartedButton() +} \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingPageTransformer.kt b/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingPageTransformer.kt new file mode 100644 index 000000000..3ac628675 --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingPageTransformer.kt @@ -0,0 +1,17 @@ +package com.karrar.movieapp.ui.onboarding + +import android.view.View +import androidx.viewpager2.widget.ViewPager2 +import kotlin.math.abs + +class OnBoardingPageTransformer : ViewPager2.PageTransformer { + + override fun transformPage(page: View, position: Float) { + val rotationDegrees = if (position != 0f) position * 18f else 0f + page.rotation = rotationDegrees + + val scaleFactor = 1f - (abs(position)) + page.scaleX = scaleFactor.coerceAtLeast(0.9f) + page.scaleY = scaleFactor.coerceAtLeast(0.9f) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingPagerAdapter.kt b/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingPagerAdapter.kt new file mode 100644 index 000000000..bf6055427 --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingPagerAdapter.kt @@ -0,0 +1,15 @@ +package com.karrar.movieapp.ui.onboarding + +import com.karrar.movieapp.R +import com.karrar.movieapp.ui.base.BaseAdapter + +class OnBoardingPagerAdapter( + pages: List, + listener: OnBoardingInteractionListener +) : BaseAdapter(pages, listener) { + + override val layoutID: Int = R.layout.item_onboarding_page + fun updatePages(newPages: List) { + setItems(newPages) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingScreenEvents.kt b/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingScreenEvents.kt new file mode 100644 index 000000000..434ef163f --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingScreenEvents.kt @@ -0,0 +1,5 @@ +package com.karrar.movieapp.ui.onboarding + +sealed class OnBoardingScreenEvents { + data object NavigateToLoginScreen : OnBoardingScreenEvents() +} \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingState.kt b/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingState.kt new file mode 100644 index 000000000..2328e6040 --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingState.kt @@ -0,0 +1,14 @@ +package com.karrar.movieapp.ui.onboarding + +import com.karrar.movieapp.utilities.StringValue + +data class OnBoardingState( + val currentPage: Int = 0, + val pages: List = emptyList(), +) + +data class PageUiState( + val imageResId: Int, + val title: StringValue, + val description: StringValue +) \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingViewModel.kt b/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingViewModel.kt new file mode 100644 index 000000000..ed6899e68 --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/onboarding/OnBoardingViewModel.kt @@ -0,0 +1,98 @@ +package com.karrar.movieapp.ui.onboarding + +import android.content.Context +import android.content.SharedPreferences +import androidx.lifecycle.viewModelScope +import com.karrar.movieapp.R +import com.karrar.movieapp.ui.base.BaseViewModel +import com.karrar.movieapp.utilities.StringValue +import dagger.hilt.android.lifecycle.HiltViewModel +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.receiveAsFlow +import kotlinx.coroutines.flow.update +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class OnBoardingViewModel @Inject constructor( + @ApplicationContext private val context: Context +) : BaseViewModel(), OnBoardingInteractionListener { + + private val _uiState = MutableStateFlow(OnBoardingState()) + val uiState: StateFlow = _uiState.asStateFlow() + + private val _uiEffect = Channel() + val uiEffect = _uiEffect.receiveAsFlow() + + private val sharedPrefs: SharedPreferences = + context.getSharedPreferences("onboarding_prefs", Context.MODE_PRIVATE) + + init { + getData() + } + + override fun getData() { + getPages() + } + + private fun getPages() { + updateState { + it.copy( + pages = listOf( + PageUiState( + imageResId = R.drawable.on_boarding_1, + title = StringValue.StringResource(R.string.welcome_to_your_movie_universe), + description = StringValue.StringResource(R.string.discover_track_and_rate_your_favorite_movies_series) + ), + PageUiState( + imageResId = R.drawable.on_boarding_2, + title = StringValue.StringResource(R.string.track_everything), + description = StringValue.StringResource(R.string.your_watchlist_your_ratings_all_in_one_place) + ), + PageUiState( + imageResId = R.drawable.on_boarding_3, + title = StringValue.StringResource(R.string.personalized_recommendations), + description = StringValue.StringResource(R.string.answer_fun_questions_to_get_handpicked_recommendations) + ) + ) + ) + } + } + + private fun updateState(transform: (OnBoardingState) -> OnBoardingState) { + _uiState.update { transform(it) } + } + + private fun sendEvent(event: OnBoardingScreenEvents) { + viewModelScope.launch { + _uiEffect.send(event) + } + } + + override fun onPageChanged(pageIndex: Int) { + updateState { it.copy(currentPage = pageIndex) } + } + + override fun onClickPreviousButton() { + val prev = uiState.value.currentPage - 1 + if (prev >= 0) { + updateState { it.copy(currentPage = prev) } + } + } + + override fun onClickNextButton() { + val next = uiState.value.currentPage + 1 + if (next < uiState.value.pages.size) { + updateState { it.copy(currentPage = next) } + } + } + + override fun onClickGetStartedButton() { + sharedPrefs.edit().putBoolean("onboarding_completed", true).apply() + sendEvent(OnBoardingScreenEvents.NavigateToLoginScreen) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/profile/ProfileFragment.kt b/app/src/main/java/com/karrar/movieapp/ui/profile/ProfileFragment.kt index 5615982f7..890895596 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/profile/ProfileFragment.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/profile/ProfileFragment.kt @@ -39,6 +39,9 @@ class ProfileFragment : BaseFragment() { ProfileUIEvent.WatchHistoryEvent -> { ProfileFragmentDirections.actionProfileFragmentToWatchHistoryFragment() } + ProfileUIEvent.MyCollectionEvent -> { + ProfileFragmentDirections.actionProfileFragmentToMyCollectionFragment() + } } findNavController().navigate(action) } diff --git a/app/src/main/java/com/karrar/movieapp/ui/profile/ProfileUIEvent.kt b/app/src/main/java/com/karrar/movieapp/ui/profile/ProfileUIEvent.kt index b3cac730c..dcd6bc2ad 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/profile/ProfileUIEvent.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/profile/ProfileUIEvent.kt @@ -5,4 +5,5 @@ sealed interface ProfileUIEvent { object RatedMoviesEvent : ProfileUIEvent object DialogLogoutEvent : ProfileUIEvent object WatchHistoryEvent : ProfileUIEvent + object MyCollectionEvent : ProfileUIEvent } diff --git a/app/src/main/java/com/karrar/movieapp/ui/profile/ProfileViewModel.kt b/app/src/main/java/com/karrar/movieapp/ui/profile/ProfileViewModel.kt index 758ee7603..3fec96c71 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/profile/ProfileViewModel.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/profile/ProfileViewModel.kt @@ -67,6 +67,10 @@ class ProfileViewModel @Inject constructor( _profileUIEvent.update { Event(ProfileUIEvent.RatedMoviesEvent) } } + fun onClickMyCollection() { + _profileUIEvent.update { Event(ProfileUIEvent.MyCollectionEvent) } + } + fun onClickLogout() { _profileUIEvent.update { Event(ProfileUIEvent.DialogLogoutEvent) } } diff --git a/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryFragment.kt b/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryFragment.kt index fa334ca20..3e2e5757b 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryFragment.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/profile/watchhistory/WatchHistoryFragment.kt @@ -17,7 +17,7 @@ class WatchHistoryFragment : BaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - setTitle(true, getString(R.string.watch_history)) + setTitle(true, getString(R.string.history)) binding.recyclerViewWatchHistory.adapter = WatchHistoryAdapter(emptyList(), viewModel) collectEvent() } diff --git a/app/src/main/java/com/karrar/movieapp/ui/search/SearchFragment.kt b/app/src/main/java/com/karrar/movieapp/ui/search/SearchFragment.kt index 9f5b2e94a..3495253f2 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/search/SearchFragment.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/search/SearchFragment.kt @@ -128,7 +128,7 @@ class SearchFragment : BaseFragment() { val footerAdapter = LoadUIStateAdapter(mediaSearchAdapter::retry) binding.recyclerMedia.adapter = mediaSearchAdapter.withLoadStateFooter(footerAdapter) binding.recyclerMedia.layoutManager = - LinearLayoutManager(this@SearchFragment.context, RecyclerView.VERTICAL, false) + GridLayoutManager(this@SearchFragment.context, 2) collect(flow = mediaSearchAdapter.loadStateFlow, action = { viewModel.setErrorUiState(it, mediaSearchAdapter.itemCount) }) diff --git a/app/src/main/java/com/karrar/movieapp/ui/search/adapters/ActorSearchAdapter.kt b/app/src/main/java/com/karrar/movieapp/ui/search/adapters/ActorSearchAdapter.kt index 6f463892b..f785b3277 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/search/adapters/ActorSearchAdapter.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/search/adapters/ActorSearchAdapter.kt @@ -8,7 +8,7 @@ import com.karrar.movieapp.ui.search.mediaSearchUIState.MediaUIState class ActorSearchAdapter(listener: ActorSearchInteractionListener) : BasePagingAdapter(ActorSearchComparator, listener){ - override val layoutID: Int = R.layout.item_actor_search + override val layoutID: Int = R.layout.item_actor object ActorSearchComparator : DiffUtil.ItemCallback(){ override fun areItemsTheSame(oldItem: MediaUIState, newItem: MediaUIState) = diff --git a/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/DetailUIStateAdapter.kt b/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/DetailUIStateAdapter.kt index 9f5c41b63..8372131d6 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/DetailUIStateAdapter.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/DetailUIStateAdapter.kt @@ -71,12 +71,12 @@ class DetailUIStateAdapter( setVariable(BR.listener, listener) } } - is DetailItemUIState.ReviewText -> {} - DetailItemUIState.SeeAllReviewsButton -> { - holder.binding.run { - setVariable(BR.listener, listener as DetailInteractionListener) - } - } + DetailItemUIState.ReviewText -> {} +// DetailItemUIState.SeeAllReviewsButton -> { +// holder.binding.run { +// setVariable(BR.listener, listener as DetailInteractionListener) +// } +// } } } @@ -92,12 +92,12 @@ class DetailUIStateAdapter( override fun getItemViewType(position: Int): Int { return when (items[position]) { is DetailItemUIState.Header -> R.layout.item_tv_show_details_header - is DetailItemUIState.Cast -> R.layout.list_cast is DetailItemUIState.Seasons -> R.layout.list_season + is DetailItemUIState.Cast -> R.layout.list_cast is DetailItemUIState.Rating -> R.layout.item_tvshow_rating is DetailItemUIState.Comment -> R.layout.item_tvshow_review - is DetailItemUIState.ReviewText -> R.layout.item_review_text - DetailItemUIState.SeeAllReviewsButton -> R.layout.item_see_all_reviews + DetailItemUIState.ReviewText -> R.layout.item_review_text +// DetailItemUIState.SeeAllReviewsButton -> R.layout.item_see_all_reviews } } } diff --git a/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/TvShowDetailsFragment.kt b/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/TvShowDetailsFragment.kt index 75fa4dab2..8366d855f 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/TvShowDetailsFragment.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/TvShowDetailsFragment.kt @@ -79,6 +79,10 @@ class TvShowDetailsFragment : BaseFragment() { TvShowDetailsUIEvent.MessageAppear -> { Toast.makeText(context, getString(R.string.submit_toast), Toast.LENGTH_SHORT).show() } + + is TvShowDetailsUIEvent.ClickShowMoreSeasons ->{ + action = TvShowDetailsFragmentDirections.actionTvShowDetailsFragmentToSeasonFragment(args.tvShowId) + } } action?.let { findNavController().navigate(it) } } diff --git a/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/TvShowDetailsUIEvent.kt b/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/TvShowDetailsUIEvent.kt index 161b6faf6..5deb41ed5 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/TvShowDetailsUIEvent.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/TvShowDetailsUIEvent.kt @@ -9,4 +9,6 @@ sealed interface TvShowDetailsUIEvent { data class ClickSeasonEvent(val seasonId: Int) : TvShowDetailsUIEvent data class ClickCastEvent(val castID: Int) : TvShowDetailsUIEvent + data class ClickShowMoreSeasons(val tvShowId: Int) : TvShowDetailsUIEvent + } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/TvShowDetailsViewModel.kt b/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/TvShowDetailsViewModel.kt index 86dacd0a8..4c86a1400 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/TvShowDetailsViewModel.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/TvShowDetailsViewModel.kt @@ -181,9 +181,9 @@ class TvShowDetailsViewModel @Inject constructor( .forEach { updateDetailItems(DetailItemUIState.Comment(it)) } updateDetailItems(DetailItemUIState.ReviewText) - if (showSeeAll) { - updateDetailItems(DetailItemUIState.SeeAllReviewsButton) - } +// if (showSeeAll) { +// updateDetailItems(DetailItemUIState.SeeAllReviewsButton) +// } } private fun updateDetailItems(item: DetailItemUIState) { diff --git a/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/season/SeasonFragment.kt b/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/season/SeasonFragment.kt new file mode 100644 index 000000000..abae0fda5 --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/season/SeasonFragment.kt @@ -0,0 +1,35 @@ +package com.karrar.movieapp.ui.tvShowDetails.season + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope +import com.karrar.movieapp.R +import com.karrar.movieapp.databinding.FragmentSeasonBinding +import com.karrar.movieapp.ui.base.BaseFragment +import com.karrar.movieapp.ui.tvShowDetails.SeasonAdapterUIState +import com.karrar.movieapp.ui.tvShowDetails.TvShowDetailsViewModel +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch + +@AndroidEntryPoint +class SeasonFragment: BaseFragment() { + + override val layoutIdFragment = R.layout.fragment_season + override val viewModel: TvShowDetailsViewModel by viewModels({ requireParentFragment() }) + private val adapter by lazy { SeasonAdapterUIState(emptyList(), viewModel) } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.seasonList.adapter = adapter + + lifecycleScope.launch { + viewModel.stateFlow.collectLatest { state -> + adapter.setItems(state.seriesSeasonsResult) + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/tvShowUIState/DetailItemUIState.kt b/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/tvShowUIState/DetailItemUIState.kt index 205f40bfc..f65ddba8c 100644 --- a/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/tvShowUIState/DetailItemUIState.kt +++ b/app/src/main/java/com/karrar/movieapp/ui/tvShowDetails/tvShowUIState/DetailItemUIState.kt @@ -7,9 +7,9 @@ sealed class DetailItemUIState(val priority: Int) { class Header(val data: TvShowDetailsResultUIState) : DetailItemUIState(0) - class Cast(val data: List) : DetailItemUIState(1) + class Cast(val data: List) : DetailItemUIState(2) - class Seasons(val data: List) : DetailItemUIState(2) + class Seasons(val data: List) : DetailItemUIState(1) class Rating(val viewModel: ViewModel) : DetailItemUIState(3) @@ -17,5 +17,5 @@ sealed class DetailItemUIState(val priority: Int) { class Comment(val data: ReviewUIState) : DetailItemUIState(5) - object SeeAllReviewsButton : DetailItemUIState(6) +// object SeeAllReviewsButton : DetailItemUIState(6) } diff --git a/app/src/main/java/com/karrar/movieapp/utilities/BindingAdapter.kt b/app/src/main/java/com/karrar/movieapp/utilities/BindingAdapter.kt index 719485748..c04bcec98 100644 --- a/app/src/main/java/com/karrar/movieapp/utilities/BindingAdapter.kt +++ b/app/src/main/java/com/karrar/movieapp/utilities/BindingAdapter.kt @@ -1,7 +1,9 @@ package com.karrar.movieapp.utilities import android.view.View +import android.view.ViewGroup import android.widget.ImageView +import android.widget.LinearLayout import android.widget.RatingBar import android.widget.TextView import androidx.core.view.isVisible @@ -15,6 +17,7 @@ import com.karrar.movieapp.domain.enums.MediaType import com.karrar.movieapp.ui.base.BaseAdapter import com.karrar.movieapp.ui.category.uiState.ErrorUIState import com.karrar.movieapp.ui.category.uiState.GenreUIState +import com.karrar.movieapp.ui.components.header.SectionHeaderView import com.karrar.movieapp.utilities.Constants.FIRST_CATEGORY_ID import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.YouTubePlayer import com.pierfrancescosoffritti.androidyoutubeplayer.core.player.listeners.AbstractYouTubePlayerListener @@ -257,4 +260,56 @@ fun setRating(view: RatingBar?, rating: Float) { @BindingAdapter("showWhenTextNotEmpty") fun showWhenTextNotEmpty(view: View,text:String){ view.isVisible = text.isNotEmpty() +} + +@BindingAdapter("horizontalPosterImageUrl") +fun ImageView.loadHorizontalPoster(url: String?) { + this.load(url) { + crossfade(true) + placeholder(R.drawable.horizonatal_poster_image_placeholder) + error(R.drawable.horizonatal_poster_image_placeholder) + } +} +@BindingAdapter("app:highlightEmojiByRating") +fun highlightEmojiByRating(container: ViewGroup, ratingValue: Float?) { + val selectedIndex: Int = ((ratingValue ?: 0f).toInt() - 1).coerceIn(-1, 4) + + val normalScale = 1f + val selectedScale = 1.5f + val dimAlpha = 0.4f + + val childCount = container.childCount + for (childPosition in 0 until childCount) { + val childView: ImageView = container.getChildAt(childPosition) as ImageView + val isSelected = childPosition == selectedIndex + + childView.animate() + .scaleX(if (isSelected) selectedScale else normalScale) + .scaleY(if (isSelected) selectedScale else normalScale) + .alpha(if (isSelected) 1f else dimAlpha) + .setDuration(200) + .start() + } +} +@BindingAdapter("app:starsDrawableByRating") +fun starsDrawableByRating(container: LinearLayout, ratingValue: Float?) { + val ratingInt: Int = (ratingValue ?: 0f).toInt().coerceIn(0, 5) + val childCount = container.childCount + + for (index in 0 until childCount) { + val starView = container.getChildAt(index) as? ImageView ?: continue + val isFilled = index < ratingInt + starView.setImageResource(if (isFilled) R.drawable.star_fill_new else R.drawable.star_outline_new) + } +} + + +@BindingAdapter("sectionTitle") +fun SectionHeaderView.setSectionTitle(title: String?) { + title?.let { setTitle(it) } +} + +@BindingAdapter("onSeeAllClick") +fun SectionHeaderView.setOnSeeAllClick(listener: (() -> Unit)?) { + listener?.let { setSeeAllClickListener(it) } } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/utilities/Event.kt b/app/src/main/java/com/karrar/movieapp/utilities/Event.kt index 81163d780..d717e879f 100644 --- a/app/src/main/java/com/karrar/movieapp/utilities/Event.kt +++ b/app/src/main/java/com/karrar/movieapp/utilities/Event.kt @@ -17,13 +17,4 @@ open class Event(private val content: T) { } fun peekContent(): T = content -} - -class EventObserve(private val onEventUnhandledContent:(T) ->Unit) - : Observer> { - override fun onChanged(event: Event?) { - event?.getContentIfNotHandled()?.let { - onEventUnhandledContent(it) - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/utilities/StringValue.kt b/app/src/main/java/com/karrar/movieapp/utilities/StringValue.kt new file mode 100644 index 000000000..c97451da2 --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/utilities/StringValue.kt @@ -0,0 +1,16 @@ +package com.karrar.movieapp.utilities + +import android.content.Context +import androidx.annotation.StringRes + +sealed class StringValue { + data class DynamicString(val value: String) : StringValue() + class StringResource(@StringRes val resId: Int, vararg val args: Any) : StringValue() + + fun asString(context: Context): String { + return when (this) { + is DynamicString -> value + is StringResource -> context.getString(resId, *args) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/karrar/movieapp/utilities/ViewPagerAdapter.kt b/app/src/main/java/com/karrar/movieapp/utilities/ViewPagerAdapter.kt new file mode 100644 index 000000000..b9a29d698 --- /dev/null +++ b/app/src/main/java/com/karrar/movieapp/utilities/ViewPagerAdapter.kt @@ -0,0 +1,20 @@ +package com.karrar.movieapp.utilities + +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentActivity +import androidx.viewpager2.adapter.FragmentStateAdapter + +data class TabItem( + val title: String, + val fragment: Fragment +) + +class ViewPagerAdapter ( + fragmentActivity: FragmentActivity, + private val tabs: List +): FragmentStateAdapter(fragmentActivity) { + + override fun getItemCount(): Int = tabs.size + + override fun createFragment(position: Int): Fragment = tabs[position].fragment +} \ No newline at end of file diff --git a/app/src/main/res/color/selector_chip_background.xml b/app/src/main/res/color/selector_chip_background.xml index 18cbe39a0..4c3efe0d8 100644 --- a/app/src/main/res/color/selector_chip_background.xml +++ b/app/src/main/res/color/selector_chip_background.xml @@ -1,8 +1,8 @@ - - - - + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_chip_stroke.xml b/app/src/main/res/color/selector_chip_stroke.xml index dca57aa17..549c33f63 100644 --- a/app/src/main/res/color/selector_chip_stroke.xml +++ b/app/src/main/res/color/selector_chip_stroke.xml @@ -1,8 +1,8 @@ - - - - + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_chip_text.xml b/app/src/main/res/color/selector_chip_text.xml index 1d08b9ad6..995177dd0 100644 --- a/app/src/main/res/color/selector_chip_text.xml +++ b/app/src/main/res/color/selector_chip_text.xml @@ -1,8 +1,8 @@ - - - - + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/star_fill.png b/app/src/main/res/drawable-hdpi/star_fill.png new file mode 100644 index 000000000..455645d44 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/star_fill.png differ diff --git a/app/src/main/res/drawable-hdpi/star_outline.png b/app/src/main/res/drawable-hdpi/star_outline.png new file mode 100644 index 000000000..21106ab8c Binary files /dev/null and b/app/src/main/res/drawable-hdpi/star_outline.png differ diff --git a/app/src/main/res/drawable-mdpi/star_fill.png b/app/src/main/res/drawable-mdpi/star_fill.png new file mode 100644 index 000000000..a6555a611 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/star_fill.png differ diff --git a/app/src/main/res/drawable-mdpi/star_outline.png b/app/src/main/res/drawable-mdpi/star_outline.png new file mode 100644 index 000000000..30c11d6a3 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/star_outline.png differ diff --git a/app/src/main/res/drawable-v24/star_fill.png b/app/src/main/res/drawable-v24/star_fill.png deleted file mode 100644 index f96a39194..000000000 Binary files a/app/src/main/res/drawable-v24/star_fill.png and /dev/null differ diff --git a/app/src/main/res/drawable-v24/star_outline.png b/app/src/main/res/drawable-v24/star_outline.png deleted file mode 100644 index 1f99a4b97..000000000 Binary files a/app/src/main/res/drawable-v24/star_outline.png and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/star_fill.png b/app/src/main/res/drawable-xhdpi/star_fill.png new file mode 100644 index 000000000..e15c2fdee Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/star_fill.png differ diff --git a/app/src/main/res/drawable-xhdpi/star_outline.png b/app/src/main/res/drawable-xhdpi/star_outline.png new file mode 100644 index 000000000..0c12a2dcf Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/star_outline.png differ diff --git a/app/src/main/res/drawable-xxhdpi/star_fill.png b/app/src/main/res/drawable-xxhdpi/star_fill.png new file mode 100644 index 000000000..b436e51a9 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/star_fill.png differ diff --git a/app/src/main/res/drawable-xxhdpi/star_outline.png b/app/src/main/res/drawable-xxhdpi/star_outline.png new file mode 100644 index 000000000..56079fef4 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/star_outline.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/star_fill.png b/app/src/main/res/drawable-xxxhdpi/star_fill.png new file mode 100644 index 000000000..31b125a57 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/star_fill.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/star_outline.png b/app/src/main/res/drawable-xxxhdpi/star_outline.png new file mode 100644 index 000000000..f398fd9e9 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/star_outline.png differ diff --git a/app/src/main/res/drawable/_collection_item_placeholder.jpg b/app/src/main/res/drawable/_collection_item_placeholder.jpg new file mode 100644 index 000000000..2613f1345 Binary files /dev/null and b/app/src/main/res/drawable/_collection_item_placeholder.jpg differ diff --git a/app/src/main/res/drawable/actor_cricle_background.xml b/app/src/main/res/drawable/actor_cricle_background.xml new file mode 100644 index 000000000..542b29071 --- /dev/null +++ b/app/src/main/res/drawable/actor_cricle_background.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/actor_img_raduis.xml b/app/src/main/res/drawable/actor_img_raduis.xml new file mode 100644 index 000000000..2708208d3 --- /dev/null +++ b/app/src/main/res/drawable/actor_img_raduis.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/add_icon.xml b/app/src/main/res/drawable/add_icon.xml new file mode 100644 index 000000000..e2a619305 --- /dev/null +++ b/app/src/main/res/drawable/add_icon.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/attrs.xml b/app/src/main/res/drawable/attrs.xml new file mode 100644 index 000000000..72b29109d --- /dev/null +++ b/app/src/main/res/drawable/attrs.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/back_icon_cta.xml b/app/src/main/res/drawable/back_icon_cta.xml new file mode 100644 index 000000000..a271daea5 --- /dev/null +++ b/app/src/main/res/drawable/back_icon_cta.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bottom_line.xml b/app/src/main/res/drawable/bottom_line.xml index 20ac4082f..79af1e197 100644 --- a/app/src/main/res/drawable/bottom_line.xml +++ b/app/src/main/res/drawable/bottom_line.xml @@ -2,13 +2,13 @@ - + - + - \ No newline at end of file + diff --git a/app/src/main/res/drawable/bottom_rounded_corners.xml b/app/src/main/res/drawable/bottom_rounded_corners.xml new file mode 100644 index 000000000..09d0979e1 --- /dev/null +++ b/app/src/main/res/drawable/bottom_rounded_corners.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/drawable/bottom_sheet_corners.xml b/app/src/main/res/drawable/bottom_sheet_corners.xml index c11787a0f..5da5b2059 100644 --- a/app/src/main/res/drawable/bottom_sheet_corners.xml +++ b/app/src/main/res/drawable/bottom_sheet_corners.xml @@ -1,8 +1,8 @@ - - - + android:topRightRadius="20dp" + android:topLeftRadius="20dp" + android:bottomLeftRadius="0dp" + android:bottomRightRadius="0dp" /> + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_primary_background.xml b/app/src/main/res/drawable/button_primary_background.xml new file mode 100644 index 000000000..0ca103677 --- /dev/null +++ b/app/src/main/res/drawable/button_primary_background.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_secondary_background.xml b/app/src/main/res/drawable/button_secondary_background.xml new file mode 100644 index 000000000..d57fde866 --- /dev/null +++ b/app/src/main/res/drawable/button_secondary_background.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/src/main/res/drawable/card_background.xml b/app/src/main/res/drawable/card_background.xml new file mode 100644 index 000000000..d36ce9520 --- /dev/null +++ b/app/src/main/res/drawable/card_background.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/card_bg.xml b/app/src/main/res/drawable/card_bg.xml new file mode 100644 index 000000000..da16e37a5 --- /dev/null +++ b/app/src/main/res/drawable/card_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/cast_card.xml b/app/src/main/res/drawable/cast_card.xml new file mode 100644 index 000000000..d75de4435 --- /dev/null +++ b/app/src/main/res/drawable/cast_card.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/chip.xml b/app/src/main/res/drawable/chip.xml new file mode 100644 index 000000000..7b7876480 --- /dev/null +++ b/app/src/main/res/drawable/chip.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/circle_shape.xml b/app/src/main/res/drawable/circle_shape.xml new file mode 100644 index 000000000..99f8aea9f --- /dev/null +++ b/app/src/main/res/drawable/circle_shape.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/collection_item.xml b/app/src/main/res/drawable/collection_item.xml new file mode 100644 index 000000000..7ce3513fd --- /dev/null +++ b/app/src/main/res/drawable/collection_item.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + background_card + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/collection_item_bottom.xml b/app/src/main/res/drawable/collection_item_bottom.xml new file mode 100644 index 000000000..f443649a0 --- /dev/null +++ b/app/src/main/res/drawable/collection_item_bottom.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/collection_item_mid.xml b/app/src/main/res/drawable/collection_item_mid.xml new file mode 100644 index 000000000..a097ed4b4 --- /dev/null +++ b/app/src/main/res/drawable/collection_item_mid.xml @@ -0,0 +1,11 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/colored_confused_face.png b/app/src/main/res/drawable/colored_confused_face.png new file mode 100644 index 000000000..cb8e79a0d Binary files /dev/null and b/app/src/main/res/drawable/colored_confused_face.png differ diff --git a/app/src/main/res/drawable/colored_frowning_face.png b/app/src/main/res/drawable/colored_frowning_face.png new file mode 100644 index 000000000..4f0cd75a9 Binary files /dev/null and b/app/src/main/res/drawable/colored_frowning_face.png differ diff --git a/app/src/main/res/drawable/colored_neutral_face.png b/app/src/main/res/drawable/colored_neutral_face.png new file mode 100644 index 000000000..e5a86ddf2 Binary files /dev/null and b/app/src/main/res/drawable/colored_neutral_face.png differ diff --git a/app/src/main/res/drawable/colored_smiling_face_with_smiling_eyes.png b/app/src/main/res/drawable/colored_smiling_face_with_smiling_eyes.png new file mode 100644 index 000000000..17ab489e8 Binary files /dev/null and b/app/src/main/res/drawable/colored_smiling_face_with_smiling_eyes.png differ diff --git a/app/src/main/res/drawable/colored_star_struck.png b/app/src/main/res/drawable/colored_star_struck.png new file mode 100644 index 000000000..1c9a1eb19 Binary files /dev/null and b/app/src/main/res/drawable/colored_star_struck.png differ diff --git a/app/src/main/res/drawable/cursor_blink.xml b/app/src/main/res/drawable/cursor_blink.xml new file mode 100644 index 000000000..87614ef8d --- /dev/null +++ b/app/src/main/res/drawable/cursor_blink.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/due_tone_star.xml b/app/src/main/res/drawable/due_tone_star.xml new file mode 100644 index 000000000..0ab8a2164 --- /dev/null +++ b/app/src/main/res/drawable/due_tone_star.xml @@ -0,0 +1,13 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/fragment_login.xml b/app/src/main/res/drawable/fragment_login.xml new file mode 100644 index 000000000..a8b409b1d --- /dev/null +++ b/app/src/main/res/drawable/fragment_login.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/gallery_background.xml b/app/src/main/res/drawable/gallery_background.xml new file mode 100644 index 000000000..ccd95d96d --- /dev/null +++ b/app/src/main/res/drawable/gallery_background.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/horizonatal_poster_image_placeholder.png b/app/src/main/res/drawable/horizonatal_poster_image_placeholder.png new file mode 100644 index 000000000..3c2773fbd Binary files /dev/null and b/app/src/main/res/drawable/horizonatal_poster_image_placeholder.png differ diff --git a/app/src/main/res/drawable/horizontal_poster_background.xml b/app/src/main/res/drawable/horizontal_poster_background.xml new file mode 100644 index 000000000..e31378269 --- /dev/null +++ b/app/src/main/res/drawable/horizontal_poster_background.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_account_circle_64dp.xml b/app/src/main/res/drawable/ic_account_circle_64dp.xml new file mode 100644 index 000000000..f418a39a0 --- /dev/null +++ b/app/src/main/res/drawable/ic_account_circle_64dp.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_add.xml b/app/src/main/res/drawable/ic_add.xml new file mode 100644 index 000000000..b04037fc5 --- /dev/null +++ b/app/src/main/res/drawable/ic_add.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_add_duetone.xml b/app/src/main/res/drawable/ic_add_duetone.xml new file mode 100644 index 000000000..55113d2bd --- /dev/null +++ b/app/src/main/res/drawable/ic_add_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_alt_arrow_left.xml b/app/src/main/res/drawable/ic_alt_arrow_left.xml new file mode 100644 index 000000000..44de3f142 --- /dev/null +++ b/app/src/main/res/drawable/ic_alt_arrow_left.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_alt_arrow_right.xml b/app/src/main/res/drawable/ic_alt_arrow_right.xml new file mode 100644 index 000000000..10c5795aa --- /dev/null +++ b/app/src/main/res/drawable/ic_alt_arrow_right.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_arrow_left.xml b/app/src/main/res/drawable/ic_arrow_left.xml index dbbaffd77..fb2381f4d 100644 --- a/app/src/main/res/drawable/ic_arrow_left.xml +++ b/app/src/main/res/drawable/ic_arrow_left.xml @@ -1,22 +1,9 @@ - + android:pathData="M9.04,5.4C9.333,5.107 9.808,5.107 10.101,5.4C10.393,5.693 10.393,6.167 10.101,6.46L5.311,11.25H20.5L20.577,11.254C20.955,11.293 21.25,11.612 21.25,12C21.25,12.388 20.955,12.708 20.577,12.746L20.5,12.75H5.311L10.101,17.539L10.151,17.597C10.392,17.892 10.375,18.325 10.101,18.6C9.826,18.875 9.391,18.892 9.097,18.652L9.04,18.6L2.97,12.531C2.829,12.39 2.75,12.199 2.75,12C2.75,11.802 2.829,11.611 2.97,11.47L9.04,5.4Z" + android:fillColor="@color/shade_primary"/> diff --git a/app/src/main/res/drawable/ic_arrow_right.xml b/app/src/main/res/drawable/ic_arrow_right.xml index 42012be15..c2ce98d82 100644 --- a/app/src/main/res/drawable/ic_arrow_right.xml +++ b/app/src/main/res/drawable/ic_arrow_right.xml @@ -2,7 +2,8 @@ android:width="20dp" android:height="20dp" android:viewportWidth="20" - android:viewportHeight="20"> + android:viewportHeight="20" + android:autoMirrored="true"> diff --git a/app/src/main/res/drawable/ic_arrow_right_up.xml b/app/src/main/res/drawable/ic_arrow_right_up.xml new file mode 100644 index 000000000..862adad80 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_right_up.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_cake.xml b/app/src/main/res/drawable/ic_cake.xml new file mode 100644 index 000000000..f0c4df7b5 --- /dev/null +++ b/app/src/main/res/drawable/ic_cake.xml @@ -0,0 +1,27 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_calendar.xml b/app/src/main/res/drawable/ic_calendar.xml new file mode 100644 index 000000000..708b6fb66 --- /dev/null +++ b/app/src/main/res/drawable/ic_calendar.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_calendar_duetone.xml b/app/src/main/res/drawable/ic_calendar_duetone.xml new file mode 100644 index 000000000..1b2f24430 --- /dev/null +++ b/app/src/main/res/drawable/ic_calendar_duetone.xml @@ -0,0 +1,23 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_cineverse_logo.xml b/app/src/main/res/drawable/ic_cineverse_logo.xml new file mode 100644 index 000000000..1e44cef19 --- /dev/null +++ b/app/src/main/res/drawable/ic_cineverse_logo.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_cineverse_logo_bold.xml b/app/src/main/res/drawable/ic_cineverse_logo_bold.xml new file mode 100644 index 000000000..9e463ec89 --- /dev/null +++ b/app/src/main/res/drawable/ic_cineverse_logo_bold.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml new file mode 100644 index 000000000..cb5efb66d --- /dev/null +++ b/app/src/main/res/drawable/ic_clock.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_clock_duetone.xml b/app/src/main/res/drawable/ic_clock_duetone.xml new file mode 100644 index 000000000..1577809d6 --- /dev/null +++ b/app/src/main/res/drawable/ic_clock_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_color_swatch_duetone.xml b/app/src/main/res/drawable/ic_color_swatch_duetone.xml new file mode 100644 index 000000000..da59b318f --- /dev/null +++ b/app/src/main/res/drawable/ic_color_swatch_duetone.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_danger_triangle.xml b/app/src/main/res/drawable/ic_danger_triangle.xml new file mode 100644 index 000000000..7399e54b1 --- /dev/null +++ b/app/src/main/res/drawable/ic_danger_triangle.xml @@ -0,0 +1,16 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_eye_closed.xml b/app/src/main/res/drawable/ic_eye_closed.xml new file mode 100644 index 000000000..014e89e95 --- /dev/null +++ b/app/src/main/res/drawable/ic_eye_closed.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_eye_duetone.xml b/app/src/main/res/drawable/ic_eye_duetone.xml new file mode 100644 index 000000000..6db50b1f0 --- /dev/null +++ b/app/src/main/res/drawable/ic_eye_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_eye_opened.xml b/app/src/main/res/drawable/ic_eye_opened.xml new file mode 100644 index 000000000..d6725561d --- /dev/null +++ b/app/src/main/res/drawable/ic_eye_opened.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_eye_slash.xml b/app/src/main/res/drawable/ic_eye_slash.xml new file mode 100644 index 000000000..3313baa20 --- /dev/null +++ b/app/src/main/res/drawable/ic_eye_slash.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/ic_eye_slash_duetone.xml b/app/src/main/res/drawable/ic_eye_slash_duetone.xml new file mode 100644 index 000000000..6510ccc6c --- /dev/null +++ b/app/src/main/res/drawable/ic_eye_slash_duetone.xml @@ -0,0 +1,25 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_facebook.xml b/app/src/main/res/drawable/ic_facebook.xml new file mode 100644 index 000000000..bdf3fc853 --- /dev/null +++ b/app/src/main/res/drawable/ic_facebook.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_flame_duetone.xml b/app/src/main/res/drawable/ic_flame_duetone.xml new file mode 100644 index 000000000..ec797aa5e --- /dev/null +++ b/app/src/main/res/drawable/ic_flame_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_folder.xml b/app/src/main/res/drawable/ic_folder.xml new file mode 100644 index 000000000..f85462569 --- /dev/null +++ b/app/src/main/res/drawable/ic_folder.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_folder_duetone.xml b/app/src/main/res/drawable/ic_folder_duetone.xml new file mode 100644 index 000000000..3265afe26 --- /dev/null +++ b/app/src/main/res/drawable/ic_folder_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_grid.xml b/app/src/main/res/drawable/ic_grid.xml new file mode 100644 index 000000000..2201ddb64 --- /dev/null +++ b/app/src/main/res/drawable/ic_grid.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_grid_duetone.xml b/app/src/main/res/drawable/ic_grid_duetone.xml new file mode 100644 index 000000000..6aa89c504 --- /dev/null +++ b/app/src/main/res/drawable/ic_grid_duetone.xml @@ -0,0 +1,22 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_grid_list.xml b/app/src/main/res/drawable/ic_grid_list.xml new file mode 100644 index 000000000..3826a4648 --- /dev/null +++ b/app/src/main/res/drawable/ic_grid_list.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_grid_list_duetone.xml b/app/src/main/res/drawable/ic_grid_list_duetone.xml new file mode 100644 index 000000000..f9f3a4bd2 --- /dev/null +++ b/app/src/main/res/drawable/ic_grid_list_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_headphone_duetone.xml b/app/src/main/res/drawable/ic_headphone_duetone.xml new file mode 100644 index 000000000..f356b09a1 --- /dev/null +++ b/app/src/main/res/drawable/ic_headphone_duetone.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_heart_duetone.xml b/app/src/main/res/drawable/ic_heart_duetone.xml new file mode 100644 index 000000000..2863f4c48 --- /dev/null +++ b/app/src/main/res/drawable/ic_heart_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_history.xml b/app/src/main/res/drawable/ic_history.xml index 7d0b2a01b..39d562444 100644 --- a/app/src/main/res/drawable/ic_history.xml +++ b/app/src/main/res/drawable/ic_history.xml @@ -1,39 +1,10 @@ - - - + android:pathData="M5.079,5.069C8.874,1.279 15.044,1.319 18.862,5.138C22.683,8.958 22.721,15.131 18.926,18.926C15.131,22.721 8.958,22.683 5.138,18.862C2.874,16.598 1.939,13.51 2.341,10.581C2.397,10.171 2.775,9.884 3.185,9.94C3.596,9.996 3.883,10.375 3.827,10.785C3.487,13.265 4.278,15.881 6.199,17.802C9.443,21.046 14.667,21.065 17.866,17.866C21.065,14.667 21.046,9.443 17.802,6.199C14.559,2.956 9.339,2.935 6.139,6.13L6.887,6.133C7.301,6.135 7.635,6.473 7.633,6.887C7.631,7.301 7.294,7.635 6.88,7.633L4.334,7.621C3.923,7.619 3.59,7.286 3.588,6.874L3.575,4.329C3.573,3.915 3.907,3.577 4.321,3.575C4.735,3.573 5.073,3.907 5.075,4.321L5.079,5.069ZM12,7.25C12.414,7.25 12.75,7.586 12.75,8V11.689L15.03,13.97C15.323,14.263 15.323,14.737 15.03,15.03C14.737,15.323 14.263,15.323 13.97,15.03L11.25,12.311V8C11.25,7.586 11.586,7.25 12,7.25Z" + android:fillColor="#313131" + android:fillType="evenOdd"/> diff --git a/app/src/main/res/drawable/ic_history_duetone.xml b/app/src/main/res/drawable/ic_history_duetone.xml new file mode 100644 index 000000000..ba36acbc7 --- /dev/null +++ b/app/src/main/res/drawable/ic_history_duetone.xml @@ -0,0 +1,15 @@ + + + + diff --git a/app/src/main/res/drawable/ic_home.xml b/app/src/main/res/drawable/ic_home.xml index 39503aa2f..4c20e7d0e 100644 --- a/app/src/main/res/drawable/ic_home.xml +++ b/app/src/main/res/drawable/ic_home.xml @@ -1,4 +1,12 @@ - - + + + diff --git a/app/src/main/res/drawable/ic_home_duetone.xml b/app/src/main/res/drawable/ic_home_duetone.xml new file mode 100644 index 000000000..ab55e916e --- /dev/null +++ b/app/src/main/res/drawable/ic_home_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_image_duetone.xml b/app/src/main/res/drawable/ic_image_duetone.xml new file mode 100644 index 000000000..2dfdcce75 --- /dev/null +++ b/app/src/main/res/drawable/ic_image_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_info_circle_duetone.xml b/app/src/main/res/drawable/ic_info_circle_duetone.xml new file mode 100644 index 000000000..df8877130 --- /dev/null +++ b/app/src/main/res/drawable/ic_info_circle_duetone.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_instagram.xml b/app/src/main/res/drawable/ic_instagram.xml new file mode 100644 index 000000000..fa74e5bcf --- /dev/null +++ b/app/src/main/res/drawable/ic_instagram.xml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_iraq_flag.xml b/app/src/main/res/drawable/ic_iraq_flag.xml new file mode 100644 index 000000000..25d1f614c --- /dev/null +++ b/app/src/main/res/drawable/ic_iraq_flag.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_language_duetone.xml b/app/src/main/res/drawable/ic_language_duetone.xml new file mode 100644 index 000000000..43929949c --- /dev/null +++ b/app/src/main/res/drawable/ic_language_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 3b309288c..b66ff0ef8 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -5,7 +5,7 @@ android:viewportWidth="108" android:viewportHeight="108"> diff --git a/app/src/main/res/drawable/ic_left_arrow.xml b/app/src/main/res/drawable/ic_left_arrow.xml new file mode 100644 index 000000000..42d70d6ec --- /dev/null +++ b/app/src/main/res/drawable/ic_left_arrow.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_link_minimalistic_duetone.xml b/app/src/main/res/drawable/ic_link_minimalistic_duetone.xml new file mode 100644 index 000000000..3d73e6dee --- /dev/null +++ b/app/src/main/res/drawable/ic_link_minimalistic_duetone.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_location.xml b/app/src/main/res/drawable/ic_location.xml new file mode 100644 index 000000000..5f78ee86e --- /dev/null +++ b/app/src/main/res/drawable/ic_location.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_lock.xml b/app/src/main/res/drawable/ic_lock.xml index 655b30291..f0248ff00 100644 --- a/app/src/main/res/drawable/ic_lock.xml +++ b/app/src/main/res/drawable/ic_lock.xml @@ -4,19 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> - + android:pathData="M21.25,15C21.25,12.995 20.981,12.042 20.47,11.53C19.958,11.019 19.005,10.75 17,10.75H7C4.995,10.75 4.042,11.019 3.53,11.53C3.019,12.042 2.75,12.995 2.75,15V17C2.75,19.005 3.019,19.958 3.53,20.47C4.042,20.981 4.995,21.25 7,21.25H17C19.005,21.25 19.958,20.981 20.47,20.47C20.981,19.958 21.25,19.005 21.25,17V15ZM13.75,16C13.75,15.033 12.967,14.25 12,14.25C11.033,14.25 10.25,15.033 10.25,16C10.25,16.966 11.033,17.75 12,17.75C12.967,17.75 13.75,16.966 13.75,16ZM15.25,16C15.25,17.795 13.795,19.25 12,19.25C10.205,19.25 8.75,17.795 8.75,16C8.75,14.205 10.205,12.75 12,12.75C13.795,12.75 15.25,14.205 15.25,16ZM17.25,8C17.25,6.39 17,5.109 16.291,4.229C15.611,3.385 14.372,2.75 12,2.75C9.628,2.75 8.39,3.385 7.709,4.229C7,5.109 6.75,6.39 6.75,8V9.254C6.833,9.253 6.916,9.25 7,9.25H17C17.084,9.25 17.167,9.253 17.25,9.254V8ZM18.75,9.335C19.915,9.471 20.854,9.793 21.53,10.47C22.519,11.458 22.75,13.005 22.75,15V17C22.75,18.995 22.519,20.542 21.53,21.53C20.542,22.519 18.995,22.75 17,22.75H7C5.005,22.75 3.458,22.519 2.47,21.53C1.481,20.542 1.25,18.995 1.25,17V15C1.25,13.005 1.481,11.458 2.47,10.47C3.147,9.793 4.085,9.471 5.25,9.335V8C5.25,6.3 5.5,4.581 6.541,3.288C7.61,1.961 9.372,1.25 12,1.25C14.628,1.25 16.389,1.961 17.459,3.288C18.5,4.581 18.75,6.3 18.75,8V9.335Z" + android:fillColor="#313131"/> diff --git a/app/src/main/res/drawable/ic_login_duetone.xml b/app/src/main/res/drawable/ic_login_duetone.xml new file mode 100644 index 000000000..1dd0acdfd --- /dev/null +++ b/app/src/main/res/drawable/ic_login_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_logout_1_duetone.xml b/app/src/main/res/drawable/ic_logout_1_duetone.xml new file mode 100644 index 000000000..af93134d8 --- /dev/null +++ b/app/src/main/res/drawable/ic_logout_1_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_logout_duetone.xml b/app/src/main/res/drawable/ic_logout_duetone.xml new file mode 100644 index 000000000..af93134d8 --- /dev/null +++ b/app/src/main/res/drawable/ic_logout_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_magic_stick.xml b/app/src/main/res/drawable/ic_magic_stick.xml new file mode 100644 index 000000000..922826dc4 --- /dev/null +++ b/app/src/main/res/drawable/ic_magic_stick.xml @@ -0,0 +1,22 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_magic_stick_duetone.xml b/app/src/main/res/drawable/ic_magic_stick_duetone.xml new file mode 100644 index 000000000..17b100891 --- /dev/null +++ b/app/src/main/res/drawable/ic_magic_stick_duetone.xml @@ -0,0 +1,29 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_microphone.xml b/app/src/main/res/drawable/ic_microphone.xml new file mode 100644 index 000000000..f4818d82c --- /dev/null +++ b/app/src/main/res/drawable/ic_microphone.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_moon_duetone.xml b/app/src/main/res/drawable/ic_moon_duetone.xml new file mode 100644 index 000000000..ffbe7c670 --- /dev/null +++ b/app/src/main/res/drawable/ic_moon_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_no_actor_img.xml b/app/src/main/res/drawable/ic_no_actor_img.xml new file mode 100644 index 000000000..b6301f564 --- /dev/null +++ b/app/src/main/res/drawable/ic_no_actor_img.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_play_duetone.xml b/app/src/main/res/drawable/ic_play_duetone.xml new file mode 100644 index 000000000..6deb804d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_play_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_play_filled.xml b/app/src/main/res/drawable/ic_play_filled.xml index 0088b9c9f..ee0621ef7 100644 --- a/app/src/main/res/drawable/ic_play_filled.xml +++ b/app/src/main/res/drawable/ic_play_filled.xml @@ -1,9 +1,14 @@ + android:width="20dp" + android:height="20dp" + android:viewportWidth="20" + android:viewportHeight="20"> + android:pathData="M15.583,7.484L3.45,14.759C3.375,14.484 3.333,14.192 3.333,13.892V6.109C3.333,3.542 6.108,1.942 8.333,3.225L11.7,5.167L15.075,7.117C15.258,7.225 15.433,7.342 15.583,7.484Z" + android:fillColor="#24263B"/> + diff --git a/app/src/main/res/drawable/ic_plus.xml b/app/src/main/res/drawable/ic_plus.xml new file mode 100644 index 000000000..7ed450a09 --- /dev/null +++ b/app/src/main/res/drawable/ic_plus.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_profile_duetone.xml b/app/src/main/res/drawable/ic_profile_duetone.xml new file mode 100644 index 000000000..1027d1947 --- /dev/null +++ b/app/src/main/res/drawable/ic_profile_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_progress.xml b/app/src/main/res/drawable/ic_progress.xml new file mode 100644 index 000000000..10ac066dd --- /dev/null +++ b/app/src/main/res/drawable/ic_progress.xml @@ -0,0 +1,13 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_right_arrow.xml b/app/src/main/res/drawable/ic_right_arrow.xml new file mode 100644 index 000000000..b477ccdff --- /dev/null +++ b/app/src/main/res/drawable/ic_right_arrow.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_row_vertical.xml b/app/src/main/res/drawable/ic_row_vertical.xml new file mode 100644 index 000000000..4d91030e8 --- /dev/null +++ b/app/src/main/res/drawable/ic_row_vertical.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_row_vertical_duetone.xml b/app/src/main/res/drawable/ic_row_vertical_duetone.xml new file mode 100644 index 000000000..e984a09c7 --- /dev/null +++ b/app/src/main/res/drawable/ic_row_vertical_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_search.xml b/app/src/main/res/drawable/ic_search.xml index 75cd3403b..ab620c3df 100644 --- a/app/src/main/res/drawable/ic_search.xml +++ b/app/src/main/res/drawable/ic_search.xml @@ -1,11 +1,12 @@ - - - + + + diff --git a/app/src/main/res/drawable/ic_search_duetone.xml b/app/src/main/res/drawable/ic_search_duetone.xml new file mode 100644 index 000000000..14e2f5b00 --- /dev/null +++ b/app/src/main/res/drawable/ic_search_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_slash_duetone.xml b/app/src/main/res/drawable/ic_slash_duetone.xml new file mode 100644 index 000000000..e18cc2664 --- /dev/null +++ b/app/src/main/res/drawable/ic_slash_duetone.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_star.xml b/app/src/main/res/drawable/ic_star.xml new file mode 100644 index 000000000..c674e04c5 --- /dev/null +++ b/app/src/main/res/drawable/ic_star.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_star_bold.xml b/app/src/main/res/drawable/ic_star_bold.xml new file mode 100644 index 000000000..11e844cd5 --- /dev/null +++ b/app/src/main/res/drawable/ic_star_bold.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_star_duetone.xml b/app/src/main/res/drawable/ic_star_duetone.xml new file mode 100644 index 000000000..6bb542272 --- /dev/null +++ b/app/src/main/res/drawable/ic_star_duetone.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_star_filled.xml b/app/src/main/res/drawable/ic_star_filled.xml index c0202a057..56c56b223 100644 --- a/app/src/main/res/drawable/ic_star_filled.xml +++ b/app/src/main/res/drawable/ic_star_filled.xml @@ -1,4 +1,14 @@ - - + + + diff --git a/app/src/main/res/drawable/ic_station_duetone.xml b/app/src/main/res/drawable/ic_station_duetone.xml new file mode 100644 index 000000000..be045e2e7 --- /dev/null +++ b/app/src/main/res/drawable/ic_station_duetone.xml @@ -0,0 +1,30 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_tiktok.xml b/app/src/main/res/drawable/ic_tiktok.xml new file mode 100644 index 000000000..89bceeb02 --- /dev/null +++ b/app/src/main/res/drawable/ic_tiktok.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_time_long_duetone.xml b/app/src/main/res/drawable/ic_time_long_duetone.xml new file mode 100644 index 000000000..5fd921c71 --- /dev/null +++ b/app/src/main/res/drawable/ic_time_long_duetone.xml @@ -0,0 +1,21 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_time_medium_duetone.xml b/app/src/main/res/drawable/ic_time_medium_duetone.xml new file mode 100644 index 000000000..b3c95bbc9 --- /dev/null +++ b/app/src/main/res/drawable/ic_time_medium_duetone.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_time_short_duetone.xml b/app/src/main/res/drawable/ic_time_short_duetone.xml new file mode 100644 index 000000000..24f2040b7 --- /dev/null +++ b/app/src/main/res/drawable/ic_time_short_duetone.xml @@ -0,0 +1,20 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_trash_duetone.xml b/app/src/main/res/drawable/ic_trash_duetone.xml new file mode 100644 index 000000000..606079654 --- /dev/null +++ b/app/src/main/res/drawable/ic_trash_duetone.xml @@ -0,0 +1,22 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_uk_flag.xml b/app/src/main/res/drawable/ic_uk_flag.xml new file mode 100644 index 000000000..1824a6dbd --- /dev/null +++ b/app/src/main/res/drawable/ic_uk_flag.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_uk_flag_1.xml b/app/src/main/res/drawable/ic_uk_flag_1.xml new file mode 100644 index 000000000..405885de1 --- /dev/null +++ b/app/src/main/res/drawable/ic_uk_flag_1.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_unread.xml b/app/src/main/res/drawable/ic_unread.xml new file mode 100644 index 000000000..c09b266ac --- /dev/null +++ b/app/src/main/res/drawable/ic_unread.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_user.xml b/app/src/main/res/drawable/ic_user.xml new file mode 100644 index 000000000..e106b68c0 --- /dev/null +++ b/app/src/main/res/drawable/ic_user.xml @@ -0,0 +1,14 @@ + + + + diff --git a/app/src/main/res/drawable/ic_user_square.xml b/app/src/main/res/drawable/ic_user_square.xml new file mode 100644 index 000000000..63c10c7e8 --- /dev/null +++ b/app/src/main/res/drawable/ic_user_square.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_user_square_duetone.xml b/app/src/main/res/drawable/ic_user_square_duetone.xml new file mode 100644 index 000000000..22dcc7ffc --- /dev/null +++ b/app/src/main/res/drawable/ic_user_square_duetone.xml @@ -0,0 +1,17 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_video_library_duetone.xml b/app/src/main/res/drawable/ic_video_library_duetone.xml new file mode 100644 index 000000000..953d3d5e2 --- /dev/null +++ b/app/src/main/res/drawable/ic_video_library_duetone.xml @@ -0,0 +1,20 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_x.xml b/app/src/main/res/drawable/ic_x.xml new file mode 100644 index 000000000..176e5aa6f --- /dev/null +++ b/app/src/main/res/drawable/ic_x.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_x_colored.xml b/app/src/main/res/drawable/ic_x_colored.xml new file mode 100644 index 000000000..8027bf953 --- /dev/null +++ b/app/src/main/res/drawable/ic_x_colored.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_youtube.xml b/app/src/main/res/drawable/ic_youtube.xml new file mode 100644 index 000000000..444c77913 --- /dev/null +++ b/app/src/main/res/drawable/ic_youtube.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/imge_circle_shape.xml b/app/src/main/res/drawable/imge_circle_shape.xml new file mode 100644 index 000000000..63d79edaa --- /dev/null +++ b/app/src/main/res/drawable/imge_circle_shape.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/info_card_background.xml b/app/src/main/res/drawable/info_card_background.xml new file mode 100644 index 000000000..36b89ba7c --- /dev/null +++ b/app/src/main/res/drawable/info_card_background.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/large_enabled_button.xml b/app/src/main/res/drawable/large_enabled_button.xml new file mode 100644 index 000000000..6d41c235c --- /dev/null +++ b/app/src/main/res/drawable/large_enabled_button.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/left_on_boarding_back_btn.xml b/app/src/main/res/drawable/left_on_boarding_back_btn.xml new file mode 100644 index 000000000..a143a542b --- /dev/null +++ b/app/src/main/res/drawable/left_on_boarding_back_btn.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/login_movie.png b/app/src/main/res/drawable/login_movie.png deleted file mode 100644 index f98f76636..000000000 Binary files a/app/src/main/res/drawable/login_movie.png and /dev/null differ diff --git a/app/src/main/res/drawable/login_movie.xml b/app/src/main/res/drawable/login_movie.xml new file mode 100644 index 000000000..a8b409b1d --- /dev/null +++ b/app/src/main/res/drawable/login_movie.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/logo.png b/app/src/main/res/drawable/logo.png new file mode 100644 index 000000000..f055dde5c Binary files /dev/null and b/app/src/main/res/drawable/logo.png differ diff --git a/app/src/main/res/drawable/media_rate_background.xml b/app/src/main/res/drawable/media_rate_background.xml new file mode 100644 index 000000000..d65f97aca --- /dev/null +++ b/app/src/main/res/drawable/media_rate_background.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/message_info_box_logout_background.xml b/app/src/main/res/drawable/message_info_box_logout_background.xml new file mode 100644 index 000000000..b149048f0 --- /dev/null +++ b/app/src/main/res/drawable/message_info_box_logout_background.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/on_boarding_1.png b/app/src/main/res/drawable/on_boarding_1.png new file mode 100644 index 000000000..9c97db614 Binary files /dev/null and b/app/src/main/res/drawable/on_boarding_1.png differ diff --git a/app/src/main/res/drawable/on_boarding_2.png b/app/src/main/res/drawable/on_boarding_2.png new file mode 100644 index 000000000..45c8f080d Binary files /dev/null and b/app/src/main/res/drawable/on_boarding_2.png differ diff --git a/app/src/main/res/drawable/on_boarding_3.png b/app/src/main/res/drawable/on_boarding_3.png new file mode 100644 index 000000000..046353662 Binary files /dev/null and b/app/src/main/res/drawable/on_boarding_3.png differ diff --git a/app/src/main/res/drawable/outline_alt_arrow_right.xml b/app/src/main/res/drawable/outline_alt_arrow_right.xml new file mode 100644 index 000000000..de36c4763 --- /dev/null +++ b/app/src/main/res/drawable/outline_alt_arrow_right.xml @@ -0,0 +1,11 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/play_button_bg.xml b/app/src/main/res/drawable/play_button_bg.xml new file mode 100644 index 000000000..39b035069 --- /dev/null +++ b/app/src/main/res/drawable/play_button_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/rating_card.xml b/app/src/main/res/drawable/rating_card.xml new file mode 100644 index 000000000..3094ced04 --- /dev/null +++ b/app/src/main/res/drawable/rating_card.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/rating_container.xml b/app/src/main/res/drawable/rating_container.xml new file mode 100644 index 000000000..67a576628 --- /dev/null +++ b/app/src/main/res/drawable/rating_container.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/rating_custom.xml b/app/src/main/res/drawable/rating_custom.xml index 181bb0fb5..df1db7f86 100644 --- a/app/src/main/res/drawable/rating_custom.xml +++ b/app/src/main/res/drawable/rating_custom.xml @@ -1,12 +1,14 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/rectangle_button.xml b/app/src/main/res/drawable/rectangle_button.xml new file mode 100644 index 000000000..bd7afdad3 --- /dev/null +++ b/app/src/main/res/drawable/rectangle_button.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/right_on_boarding_forward_btn.xml b/app/src/main/res/drawable/right_on_boarding_forward_btn.xml new file mode 100644 index 000000000..c53d1c904 --- /dev/null +++ b/app/src/main/res/drawable/right_on_boarding_forward_btn.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/rounded_corners.xml b/app/src/main/res/drawable/rounded_corners.xml index 5c531c62e..85a72a6a3 100644 --- a/app/src/main/res/drawable/rounded_corners.xml +++ b/app/src/main/res/drawable/rounded_corners.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/save_button_bg.xml b/app/src/main/res/drawable/save_button_bg.xml new file mode 100644 index 000000000..558be61c1 --- /dev/null +++ b/app/src/main/res/drawable/save_button_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selected_view_toggle_background.xml b/app/src/main/res/drawable/selected_view_toggle_background.xml new file mode 100644 index 000000000..9d0c89dd7 --- /dev/null +++ b/app/src/main/res/drawable/selected_view_toggle_background.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/social_media_button_background.xml b/app/src/main/res/drawable/social_media_button_background.xml new file mode 100644 index 000000000..3eb5cc2bb --- /dev/null +++ b/app/src/main/res/drawable/social_media_button_background.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/splash_icon.xml b/app/src/main/res/drawable/splash_icon.xml new file mode 100644 index 000000000..5eb1f198a --- /dev/null +++ b/app/src/main/res/drawable/splash_icon.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/star.xml b/app/src/main/res/drawable/star.xml new file mode 100644 index 000000000..3c4d3b7bd --- /dev/null +++ b/app/src/main/res/drawable/star.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/star_fill_new.png b/app/src/main/res/drawable/star_fill_new.png new file mode 100644 index 000000000..5f3ae7791 Binary files /dev/null and b/app/src/main/res/drawable/star_fill_new.png differ diff --git a/app/src/main/res/drawable/star_outline_new.png b/app/src/main/res/drawable/star_outline_new.png new file mode 100644 index 000000000..6436ec344 Binary files /dev/null and b/app/src/main/res/drawable/star_outline_new.png differ diff --git a/app/src/main/res/drawable/switch_thumb_gray.xml b/app/src/main/res/drawable/switch_thumb_gray.xml new file mode 100644 index 000000000..443d98f22 --- /dev/null +++ b/app/src/main/res/drawable/switch_thumb_gray.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_thumb_white.xml b/app/src/main/res/drawable/switch_thumb_white.xml new file mode 100644 index 000000000..240018fa4 --- /dev/null +++ b/app/src/main/res/drawable/switch_thumb_white.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_track_off.xml b/app/src/main/res/drawable/switch_track_off.xml new file mode 100644 index 000000000..f7b0d06a4 --- /dev/null +++ b/app/src/main/res/drawable/switch_track_off.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/switch_track_on.xml b/app/src/main/res/drawable/switch_track_on.xml new file mode 100644 index 000000000..f921ef058 --- /dev/null +++ b/app/src/main/res/drawable/switch_track_on.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_indicator.xml b/app/src/main/res/drawable/tab_indicator.xml new file mode 100644 index 000000000..102d0bbc3 --- /dev/null +++ b/app/src/main/res/drawable/tab_indicator.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/test_1.png b/app/src/main/res/drawable/test_1.png deleted file mode 100644 index 477c0a47d..000000000 Binary files a/app/src/main/res/drawable/test_1.png and /dev/null differ diff --git a/app/src/main/res/drawable/test_2.png b/app/src/main/res/drawable/test_2.png deleted file mode 100644 index 6252fd906..000000000 Binary files a/app/src/main/res/drawable/test_2.png and /dev/null differ diff --git a/app/src/main/res/drawable/test_3.png b/app/src/main/res/drawable/test_3.png deleted file mode 100644 index 419fbbdcc..000000000 Binary files a/app/src/main/res/drawable/test_3.png and /dev/null differ diff --git a/app/src/main/res/drawable/unselected_view_toggle_background.xml b/app/src/main/res/drawable/unselected_view_toggle_background.xml new file mode 100644 index 000000000..92e5de169 --- /dev/null +++ b/app/src/main/res/drawable/unselected_view_toggle_background.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/view_toggle_background.xml b/app/src/main/res/drawable/view_toggle_background.xml new file mode 100644 index 000000000..13ad31c0d --- /dev/null +++ b/app/src/main/res/drawable/view_toggle_background.xml @@ -0,0 +1,12 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/font/manrope_bold.ttf b/app/src/main/res/font/manrope_bold.ttf new file mode 100644 index 000000000..62a618393 Binary files /dev/null and b/app/src/main/res/font/manrope_bold.ttf differ diff --git a/app/src/main/res/font/manrope_extra_bold.ttf b/app/src/main/res/font/manrope_extra_bold.ttf new file mode 100644 index 000000000..2fa671c21 Binary files /dev/null and b/app/src/main/res/font/manrope_extra_bold.ttf differ diff --git a/app/src/main/res/font/manrope_extra_light.ttf b/app/src/main/res/font/manrope_extra_light.ttf new file mode 100644 index 000000000..c55745a49 Binary files /dev/null and b/app/src/main/res/font/manrope_extra_light.ttf differ diff --git a/app/src/main/res/font/manrope_light.ttf b/app/src/main/res/font/manrope_light.ttf new file mode 100644 index 000000000..8a771c26e Binary files /dev/null and b/app/src/main/res/font/manrope_light.ttf differ diff --git a/app/src/main/res/font/manrope_medium.ttf b/app/src/main/res/font/manrope_medium.ttf new file mode 100644 index 000000000..c6d28def6 Binary files /dev/null and b/app/src/main/res/font/manrope_medium.ttf differ diff --git a/app/src/main/res/font/manrope_regular.ttf b/app/src/main/res/font/manrope_regular.ttf new file mode 100644 index 000000000..9a108f1ce Binary files /dev/null and b/app/src/main/res/font/manrope_regular.ttf differ diff --git a/app/src/main/res/font/manrope_semi_bold.ttf b/app/src/main/res/font/manrope_semi_bold.ttf new file mode 100644 index 000000000..46a13d619 Binary files /dev/null and b/app/src/main/res/font/manrope_semi_bold.ttf differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 517a80c55..2ba003638 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,14 +3,12 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> - - - + @@ -20,25 +18,171 @@ android:layout_width="match_parent" android:layout_height="0dp" app:defaultNavHost="true" - app:layout_constraintBottom_toTopOf="@+id/bottom_navigation" + app:layout_constraintBottom_toTopOf="@+id/custom_bottom_navigation" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:navGraph="@navigation/movie_navigation" /> - - + + app:layout_constraintEnd_toEndOf="parent" + android:orientation="vertical" + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_on_boarding.xml b/app/src/main/res/layout/activity_on_boarding.xml new file mode 100644 index 000000000..c0fd40522 --- /dev/null +++ b/app/src/main/res/layout/activity_on_boarding.xml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/actor_header.xml b/app/src/main/res/layout/actor_header.xml new file mode 100644 index 000000000..da428806d --- /dev/null +++ b/app/src/main/res/layout/actor_header.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/advertisement_section.xml b/app/src/main/res/layout/advertisement_section.xml new file mode 100644 index 000000000..d65d23e09 --- /dev/null +++ b/app/src/main/res/layout/advertisement_section.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + diff --git a/app/src/main/res/layout/appbar.xml b/app/src/main/res/layout/appbar.xml new file mode 100644 index 000000000..b63caa792 --- /dev/null +++ b/app/src/main/res/layout/appbar.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/bottom_navigation_dark.xml b/app/src/main/res/layout/bottom_navigation_dark.xml new file mode 100644 index 000000000..2dd894a77 --- /dev/null +++ b/app/src/main/res/layout/bottom_navigation_dark.xml @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/bottom_sheet.xml b/app/src/main/res/layout/bottom_sheet.xml new file mode 100644 index 000000000..ecf6d50b2 --- /dev/null +++ b/app/src/main/res/layout/bottom_sheet.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/building_block.xml b/app/src/main/res/layout/building_block.xml new file mode 100644 index 000000000..aab0c84c5 --- /dev/null +++ b/app/src/main/res/layout/building_block.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/building_block_clicked.xml b/app/src/main/res/layout/building_block_clicked.xml new file mode 100644 index 000000000..41608cfaa --- /dev/null +++ b/app/src/main/res/layout/building_block_clicked.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/buttom.xml b/app/src/main/res/layout/buttom.xml new file mode 100644 index 000000000..4427ae63b --- /dev/null +++ b/app/src/main/res/layout/buttom.xml @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/chip_item_category.xml b/app/src/main/res/layout/chip_item_category.xml index 954072a48..d9dbb3950 100644 --- a/app/src/main/res/layout/chip_item_category.xml +++ b/app/src/main/res/layout/chip_item_category.xml @@ -18,12 +18,11 @@ style="@style/Colors_Widget.MaterialComponents.Chip.Choice" android:layout_width="wrap_content" android:layout_height="@dimen/chip_height" - android:fontFamily="@font/plus_jakarta_sans_regular" android:onClick="@{() -> listener.onClickCategory(item.genreID)}" android:text="@{item.genreName}" android:textSize="@dimen/text_small" app:chipMinTouchTargetSize="0dp" - tools:backgroundTint="@color/background_color" + tools:backgroundTint="@color/background_card" tools:text="Movie Category" /> \ No newline at end of file diff --git a/app/src/main/res/layout/collection_item.xml b/app/src/main/res/layout/collection_item.xml new file mode 100644 index 000000000..f8367d0e0 --- /dev/null +++ b/app/src/main/res/layout/collection_item.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/cta_card.xml b/app/src/main/res/layout/cta_card.xml new file mode 100644 index 000000000..3af513daf --- /dev/null +++ b/app/src/main/res/layout/cta_card.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/cursor.xml b/app/src/main/res/layout/cursor.xml new file mode 100644 index 000000000..0c01cef0c --- /dev/null +++ b/app/src/main/res/layout/cursor.xml @@ -0,0 +1,24 @@ + + + + + + diff --git a/app/src/main/res/layout/dialog_logout.xml b/app/src/main/res/layout/dialog_logout.xml index f252f0b62..f6ee89f17 100644 --- a/app/src/main/res/layout/dialog_logout.xml +++ b/app/src/main/res/layout/dialog_logout.xml @@ -52,7 +52,7 @@ android:onClick="@{() -> viewModel.onLogout()}" android:paddingHorizontal="@dimen/spacing_small" android:paddingVertical="@dimen/spacing_small" - android:text="@string/logout" + android:text="@string/signout" android:textColor="@color/brand_color" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" diff --git a/app/src/main/res/layout/error2.xml b/app/src/main/res/layout/error2.xml index 222ccd606..5ef9d895b 100644 --- a/app/src/main/res/layout/error2.xml +++ b/app/src/main/res/layout/error2.xml @@ -15,63 +15,96 @@ + android:layout_height="match_parent" + > - - - - - + > -