Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# https://editorconfig.org
root = true

[*]
indent_style = space
indent_size = 2
max_line_length = 120
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.{kt,kts}]
indent_size = 4
ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL
ij_kotlin_continuation_indent_in_if_conditions = false
ktlint_function_naming_ignore_when_annotated_with = Composable

# Don't allow any wildcard imports
ij_kotlin_packages_to_use_import_on_demand = unset

# Prevent wildcard imports
ij_kotlin_name_count_to_use_star_import = 99
ij_kotlin_name_count_to_use_star_import_for_members = 99

[*.md]
trim_trailing_whitespace = false
max_line_length = unset

[*.yml]
ij_yaml_spaces_within_brackets = false
17 changes: 8 additions & 9 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ android {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
"proguard-rules.pro",
)
}
}
Expand All @@ -42,18 +42,17 @@ android {
}

dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.lifecycle.runtime.ktx)
implementation(libs.androidx.activity.compose)
implementation(platform(libs.androidx.compose.bom))
implementation(libs.androidx.ui)
implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.ui.tooling.preview)
implementation(libs.androidx.material3)
implementation(libs.bundles.layer.presentation)

ksp(libs.com.google.dagger.hilt.android.compiler)
ksp(libs.com.google.dagger.hilt.compiler)

implementation(project(":core:api"))
implementation(project(":core:database"))
implementation(project(":core:presentation"))
implementation(project(":data"))
implementation(project(":domain"))
implementation(project(":presentation:feature"))
implementation(project(":core:ui"))
}
}
46 changes: 23 additions & 23 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
xmlns:tools="http://schemas.android.com/tools">

<application
android:name=".application.BaseProjectApplication"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.BaseProject"
tools:targetApi="31">
<activity
android:name=".application.MainActivity"
android:exported="true"
android:theme="@style/Theme.BaseProject">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<application
android:name=".application.BaseProjectApplication"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.BaseProject"
tools:targetApi="31">
<activity
android:name=".view.MainActivity"
android:exported="true"
android:theme="@style/Theme.BaseProject">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@ import android.app.Application
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class BaseProjectApplication : Application()
class BaseProjectApplication : Application()
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import androidx.compose.runtime.Composable
import androidx.navigation.compose.rememberNavController

@Composable
fun BaseProjectApp() {
fun BaseProjectApplication() {
val navController = rememberNavController()

BaseProjectApplicationNavHost(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,30 +1,33 @@
package com.example.baseproject.navigation

import android.annotation.SuppressLint
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.navigation
import com.example.feature.screen.FeatureScreen
import com.example.baseproject.navigation.viewmodel.NavigationViewModel
import com.example.core.presentation.navigation.BaseProjectNavRoutes

@SuppressLint("UnusedMaterial3ScaffoldPaddingParameter")
@Composable
fun BaseProjectApplicationNavHost(
modifier: Modifier = Modifier,
navController: NavHostController,
viewModel: NavigationViewModel = hiltViewModel(),
) {
NavHost(
modifier = modifier,
navController = navController,
startDestination = NavigationRoutes.MainGraph,
startDestination = BaseProjectNavRoutes.MainGraph,
) {
navigation<NavigationRoutes.MainGraph>(
startDestination = NavigationRoutes.Feature,
navigation<BaseProjectNavRoutes.MainGraph>(
startDestination = BaseProjectNavRoutes.Feature,
) {
composable<NavigationRoutes.Feature> {
FeatureScreen()
viewModel.subNavigation.forEach { subNavigation ->
subNavigation.registerNavGraph(
navGraphBuilder = this,
navController = navController,
)
}
}
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.baseproject.navigation.di

import com.example.core.presentation.navigation.FeatureNavigation
import com.example.feature.navigation.FeatureNavigationImpl
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import dagger.multibindings.IntoSet

@Module
@InstallIn(SingletonComponent::class)
object NavigationModule {
@Provides
@IntoSet
fun provideFeatureNavigation(): FeatureNavigation = FeatureNavigationImpl()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example.baseproject.navigation.viewmodel

import androidx.lifecycle.ViewModel
import com.example.core.presentation.navigation.FeatureNavigation
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject

@HiltViewModel
class NavigationViewModel
@Inject
constructor(
private val featureNavigation: Set<@JvmSuppressWildcards FeatureNavigation>,
) : ViewModel() {
val subNavigation: Set<FeatureNavigation>
get() = featureNavigation
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package com.example.baseproject.application
package com.example.baseproject.view

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import com.example.baseproject.navigation.BaseProjectApp
import com.example.core.ui.theme.BaseProjectTheme
import com.example.baseproject.navigation.BaseProjectApplication
import com.example.core.presentation.ui.theme.BaseProjectTheme
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
Expand All @@ -15,7 +15,7 @@ class MainActivity : ComponentActivity() {
enableEdgeToEdge()
setContent {
BaseProjectTheme {
BaseProjectApp()
BaseProjectApplication()
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion buildSrc/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ repositories {
}
}
mavenCentral()
}
}
15 changes: 10 additions & 5 deletions core/api/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
plugins {
alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.com.google.devtools.ksp)
alias(libs.plugins.com.google.dagger.hilt.android)
}

android {
Expand All @@ -17,7 +19,7 @@ android {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
"proguard-rules.pro",
)
}
}
Expand All @@ -31,10 +33,13 @@ android {
}

dependencies {
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
implementation(libs.bundles.layer.data)
implementation(libs.arrow.core.retrofit)
implementation(libs.retrofit)
implementation(libs.retrofit.gson)
implementation(libs.okhttp)

ksp(libs.com.google.dagger.hilt.compiler)

testImplementation(libs.bundles.test.unit)
}
}
29 changes: 29 additions & 0 deletions core/api/src/main/kotlin/com/example/core/api/di/ApiModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.example.core.api.di

import arrow.retrofit.adapter.either.EitherCallAdapterFactory
import com.example.core.api.service.MovieApi
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object ApiModule {
@Provides
@Singleton
fun provideRetrofit(): Retrofit =
Retrofit
.Builder()
.baseUrl(MovieApi.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(EitherCallAdapterFactory.create())
.build()

@Provides
@Singleton
fun provideMovieApi(retrofit: Retrofit): MovieApi = retrofit.create(MovieApi::class.java)
}
11 changes: 11 additions & 0 deletions core/api/src/main/kotlin/com/example/core/api/model/MovieDto.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.example.core.api.model

import com.google.gson.annotations.SerializedName

data class MovieDto(
@SerializedName("Title") val title: String,
@SerializedName("Year") val year: String,
@SerializedName("imdbID") val imdbId: String,
@SerializedName("Type") val type: String,
@SerializedName("Poster") val poster: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.example.core.api.model

import com.google.gson.annotations.SerializedName

data class SearchResponseDto(
@SerializedName("Search") val results: List<MovieDto>,
@SerializedName("totalResults") val totalResults: String,
@SerializedName("Response") val response: String,
)
23 changes: 23 additions & 0 deletions core/api/src/main/kotlin/com/example/core/api/service/MovieApi.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.example.core.api.service

import arrow.core.Either
import arrow.retrofit.adapter.either.networkhandling.CallError
import com.example.core.api.model.SearchResponseDto
import retrofit2.http.GET
import retrofit2.http.Query

interface MovieApi {
@GET
fun searchMovies(
@Query("s") query: String,
@Query("page") page: Int,
@Query("pageSize") pageSize: Int = PAGE_SIZE,
@Query("apikey") apikey: String = API_KEY,
): Either<CallError, SearchResponseDto>

companion object {
const val PAGE_SIZE = 10
const val BASE_URL = "https://www.omdbapi.com/"
const val API_KEY = "1a64ba7b"
}
}
Loading