diff --git a/ToyProject/.gitignore b/MovieApp/.gitignore similarity index 100% rename from ToyProject/.gitignore rename to MovieApp/.gitignore diff --git a/ToyProject/.idea/codeStyles/Project.xml b/MovieApp/.idea/codeStyles/Project.xml similarity index 100% rename from ToyProject/.idea/codeStyles/Project.xml rename to MovieApp/.idea/codeStyles/Project.xml diff --git a/ToyProject/.idea/externalDependencies.xml b/MovieApp/.idea/externalDependencies.xml similarity index 100% rename from ToyProject/.idea/externalDependencies.xml rename to MovieApp/.idea/externalDependencies.xml diff --git a/ToyProject/.idea/gradle.xml b/MovieApp/.idea/gradle.xml similarity index 100% rename from ToyProject/.idea/gradle.xml rename to MovieApp/.idea/gradle.xml diff --git a/ToyProject/.idea/misc.xml b/MovieApp/.idea/misc.xml similarity index 100% rename from ToyProject/.idea/misc.xml rename to MovieApp/.idea/misc.xml diff --git a/ToyProject/.idea/runConfigurations.xml b/MovieApp/.idea/runConfigurations.xml similarity index 100% rename from ToyProject/.idea/runConfigurations.xml rename to MovieApp/.idea/runConfigurations.xml diff --git a/ToyProject/.idea/vcs.xml b/MovieApp/.idea/vcs.xml similarity index 100% rename from ToyProject/.idea/vcs.xml rename to MovieApp/.idea/vcs.xml diff --git a/ToyProject/app/.gitignore b/MovieApp/app/.gitignore similarity index 100% rename from ToyProject/app/.gitignore rename to MovieApp/app/.gitignore diff --git a/MovieApp/app/build.gradle b/MovieApp/app/build.gradle new file mode 100644 index 0000000..8df3040 --- /dev/null +++ b/MovieApp/app/build.gradle @@ -0,0 +1,66 @@ +apply plugin: 'com.android.application' + +apply plugin: 'kotlin-android' + +apply plugin: 'kotlin-kapt' + +android { + compileSdkVersion 29 + buildToolsVersion "29.0.2" + defaultConfig { + applicationId "com.god.taeiim.movieapp" + minSdkVersion 21 + targetSdkVersion 29 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + + buildConfigField "String", "SECRET_KEY" , "\"d8cef1cded16cd9e5bae792da0d70ed7\"" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + dataBinding { + enabled = true + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation "androidx.appcompat:appcompat:$app_compat_version" + + //test + testImplementation "junit:junit:$junit_version" + androidTestImplementation "androidx.test:runner:$test_runner_version" + androidTestImplementation "androidx.test.espresso:espresso-core:$core_version" + + //google + implementation "com.google.android.material:material:$material_version" + implementation "androidx.constraintlayout:constraintlayout:$constraintlayout_version" + + //retrofit + implementation "com.squareup.retrofit2:retrofit:$retrofit_version" + implementation "com.squareup.retrofit2:converter-gson:$retrofit_version" + implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version" + + //glide + implementation "com.github.bumptech.glide:glide:$glide_version" + annotationProcessor "com.github.bumptech.glide:compiler:$glide_version" + + //ViewModel, LiveData + implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version" + implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version" + + //koin + implementation "org.koin:koin-core:$koin_version" + implementation "org.koin:koin-androidx-viewmodel:$koin_version" + + //coroutine + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutine_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutine_version" +} diff --git a/ToyProject/app/proguard-rules.pro b/MovieApp/app/proguard-rules.pro similarity index 100% rename from ToyProject/app/proguard-rules.pro rename to MovieApp/app/proguard-rules.pro diff --git a/ToyProject/app/src/androidTest/java/com/god/taeiim/toyproject/ExampleInstrumentedTest.kt b/MovieApp/app/src/androidTest/java/com/god/taeiim/movieapp/ExampleInstrumentedTest.kt similarity index 84% rename from ToyProject/app/src/androidTest/java/com/god/taeiim/toyproject/ExampleInstrumentedTest.kt rename to MovieApp/app/src/androidTest/java/com/god/taeiim/movieapp/ExampleInstrumentedTest.kt index 98f1593..371ca3a 100644 --- a/ToyProject/app/src/androidTest/java/com/god/taeiim/toyproject/ExampleInstrumentedTest.kt +++ b/MovieApp/app/src/androidTest/java/com/god/taeiim/movieapp/ExampleInstrumentedTest.kt @@ -1,4 +1,4 @@ -package com.god.taeiim.toyproject +package com.god.taeiim.movieapp import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -19,6 +19,6 @@ class ExampleInstrumentedTest { fun useAppContext() { // Context of the app under test. val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.god.taeiim.toyproject", appContext.packageName) + assertEquals("com.god.taeiim.movieapp", appContext.packageName) } } diff --git a/ToyProject/app/src/main/AndroidManifest.xml b/MovieApp/app/src/main/AndroidManifest.xml similarity index 68% rename from ToyProject/app/src/main/AndroidManifest.xml rename to MovieApp/app/src/main/AndroidManifest.xml index 6cdb4bf..d7156ec 100644 --- a/ToyProject/app/src/main/AndroidManifest.xml +++ b/MovieApp/app/src/main/AndroidManifest.xml @@ -1,15 +1,18 @@ + package="com.god.taeiim.movieapp"> + + - + android:theme="@style/Theme.AppCompat.Light.NoActionBar"> + diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/MovieAppApplication.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/MovieAppApplication.kt new file mode 100644 index 0000000..7e0d9e8 --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/MovieAppApplication.kt @@ -0,0 +1,16 @@ +package com.god.taeiim.movieapp + +import android.app.Application +import com.god.taeiim.movieapp.di.dataSourceModule +import com.god.taeiim.movieapp.di.networkModule +import com.god.taeiim.movieapp.di.viewModelModule +import com.god.taeiim.movieapp.ext.setupKoin + +class MovieAppApplication : Application() { + + override fun onCreate() { + super.onCreate() + setupKoin(this, viewModelModule, networkModule, dataSourceModule) + } + +} \ No newline at end of file diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseAction.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseAction.kt new file mode 100644 index 0000000..c2e00f7 --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseAction.kt @@ -0,0 +1,3 @@ +package com.god.taeiim.movieapp.base + +interface BaseAction \ No newline at end of file diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseActivity.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseActivity.kt new file mode 100644 index 0000000..e15eb01 --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseActivity.kt @@ -0,0 +1,20 @@ +package com.god.taeiim.movieapp.base + +import android.os.Bundle +import androidx.annotation.LayoutRes +import androidx.appcompat.app.AppCompatActivity +import androidx.databinding.DataBindingUtil +import androidx.databinding.ViewDataBinding + +abstract class BaseActivity( + @LayoutRes private val layoutResId: Int +) : AppCompatActivity() { + + protected lateinit var binding: B + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, layoutResId) + } + +} \ No newline at end of file diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseRecyclerAdapter.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseRecyclerAdapter.kt new file mode 100644 index 0000000..4b65dee --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseRecyclerAdapter.kt @@ -0,0 +1,48 @@ +package com.god.taeiim.movieapp.base + +import android.view.ViewGroup +import androidx.annotation.LayoutRes +import androidx.databinding.ViewDataBinding +import androidx.recyclerview.widget.RecyclerView + + +open class BaseRecyclerAdapter( + @LayoutRes val layoutResId: Int, + val bindingVariableId: Int? = null +) : RecyclerView.Adapter>() { + + private val items = mutableListOf() + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewHolder = + object : BaseRecyclerViewHolder( + layoutResId, + parent, + bindingVariableId + ) {} + + override fun getItemCount(): Int = items.size + + override fun onBindViewHolder(holder: BaseRecyclerViewHolder, position: Int) = + holder.onBindViewHolder(items[position]) + + protected fun getItem(position: Int): ITEM = + items.getOrNull(position) ?: throw ArrayIndexOutOfBoundsException() + + fun updateItems(items: List?) { + this.items.run { + clear() + items?.let { + addAll(it) + } + } + + notifyDataSetChanged() + } + + fun clearItems() { + val size = items.size + this.items.clear() + notifyItemRangeRemoved(0, size) + } + +} \ No newline at end of file diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseRecyclerViewHolder.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseRecyclerViewHolder.kt new file mode 100644 index 0000000..0bf2f91 --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseRecyclerViewHolder.kt @@ -0,0 +1,28 @@ +package com.god.taeiim.movieapp.base + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.annotation.LayoutRes +import androidx.databinding.DataBindingUtil +import androidx.databinding.ViewDataBinding +import androidx.recyclerview.widget.RecyclerView + +open class BaseRecyclerViewHolder( + @LayoutRes layoutRes: Int, + parent: ViewGroup, + private val bindingVariableId: Int? +) : RecyclerView.ViewHolder(LayoutInflater.from(parent.context).inflate(layoutRes, parent, false)) { + + private val binding: B = DataBindingUtil.bind(itemView)!! + + fun onBindViewHolder(item: Any?) { + if (bindingVariableId == null) + return + + binding.run { + setVariable(bindingVariableId, item) + executePendingBindings() + } + } + +} diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseViewModel.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseViewModel.kt new file mode 100644 index 0000000..dd7aca8 --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseViewModel.kt @@ -0,0 +1,30 @@ +package com.god.taeiim.movieapp.base + +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import com.god.taeiim.movieapp.ext.toLiveData +import kotlin.properties.Delegates + +abstract class BaseViewModel( + initialState: ViewState +) : ViewModel() { + + private val stateMutableLiveData = MutableLiveData() + val stateLiveData = stateMutableLiveData.toLiveData() + + protected var state by Delegates.observable(initialState) { _, old, new -> + stateMutableLiveData.value = new + } + + fun sendAction(viewAction: ViewAction) { + state = onReduceState(viewAction) + } + + fun loadData() { + onLoadData() + } + + protected open fun onLoadData() {} + + protected abstract fun onReduceState(viewAction: ViewAction): ViewState +} diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseViewState.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseViewState.kt new file mode 100644 index 0000000..1065ca3 --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/base/BaseViewState.kt @@ -0,0 +1,3 @@ +package com.god.taeiim.movieapp.base + +interface BaseViewState \ No newline at end of file diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/binding/ViewBinding.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/binding/ViewBinding.kt new file mode 100644 index 0000000..c884ae4 --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/binding/ViewBinding.kt @@ -0,0 +1,14 @@ +package com.god.taeiim.movieapp.binding + +import android.widget.ImageView +import androidx.databinding.BindingAdapter +import com.bumptech.glide.Glide +import com.bumptech.glide.load.resource.bitmap.RoundedCorners + +@BindingAdapter("loadPosterImg") +fun ImageView.loadPosterImg(url: String?) { + Glide.with(context) + .load("https://image.tmdb.org/t/p/w300$url") + .transform(RoundedCorners(8)) + .into(this) +} diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/model/MoviePopular.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/model/MoviePopular.kt new file mode 100644 index 0000000..55aeba8 --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/model/MoviePopular.kt @@ -0,0 +1,45 @@ +package com.god.taeiim.movieapp.data.model + +import com.google.gson.annotations.SerializedName + +data class MoviePopular( + @SerializedName("page") + val page: Int = 0, + @SerializedName("results") + val movies: List = listOf(), + @SerializedName("total_pages") + val totalPages: Int = 0, + @SerializedName("total_results") + val totalResults: Int = 0 +) + +data class Movie( + @SerializedName("adult") + val adult: Boolean = false, + @SerializedName("backdrop_path") + val backdropPath: String = "", + @SerializedName("genre_ids") + val genreIds: List = listOf(), + @SerializedName("id") + val id: Int = 0, + @SerializedName("original_language") + val originalLanguage: String = "", + @SerializedName("original_title") + val originalTitle: String = "", + @SerializedName("overview") + val overview: String = "", + @SerializedName("popularity") + val popularity: Double = 0.0, + @SerializedName("poster_path") + val posterPath: String = "", + @SerializedName("release_date") + val releaseDate: String = "", + @SerializedName("title") + val title: String = "", + @SerializedName("video") + val video: Boolean = false, + @SerializedName("vote_average") + val voteAverage: Double = 0.0, + @SerializedName("vote_count") + val voteCount: Int = 0 +) \ No newline at end of file diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/repository/MovieRepository.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/repository/MovieRepository.kt new file mode 100644 index 0000000..fea104e --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/repository/MovieRepository.kt @@ -0,0 +1,10 @@ +package com.god.taeiim.movieapp.data.repository + +import com.god.taeiim.movieapp.data.model.Movie + + +interface MovieRepository { + + suspend fun getPopularMovies(page: Int): List + +} \ No newline at end of file diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/repository/MovieRepositoryImpl.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/repository/MovieRepositoryImpl.kt new file mode 100644 index 0000000..a6b4d76 --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/repository/MovieRepositoryImpl.kt @@ -0,0 +1,15 @@ +package com.god.taeiim.movieapp.data.repository + +import com.god.taeiim.movieapp.data.model.Movie +import com.god.taeiim.movieapp.data.source.remote.MovieRemoteDataSource + + +class MovieRepositoryImpl( + private val movieRemoteDataSource: MovieRemoteDataSource +) : MovieRepository { + + override suspend fun getPopularMovies(page: Int): List { + return movieRemoteDataSource.getPopularMovies(page) + } + +} \ No newline at end of file diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/source/MovieApi.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/source/MovieApi.kt new file mode 100644 index 0000000..d4ca41a --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/source/MovieApi.kt @@ -0,0 +1,10 @@ +package com.god.taeiim.movieapp.data.source + +import com.god.taeiim.movieapp.data.model.MoviePopular +import retrofit2.http.GET +import retrofit2.http.Query + +interface MovieApi { + @GET("movie/popular") + suspend fun getMoviePopular(@Query("page") page: Int): MoviePopular +} \ No newline at end of file diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/source/remote/MovieRemoteDataSource.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/source/remote/MovieRemoteDataSource.kt new file mode 100644 index 0000000..a4bd091 --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/source/remote/MovieRemoteDataSource.kt @@ -0,0 +1,9 @@ +package com.god.taeiim.movieapp.data.source.remote + +import com.god.taeiim.movieapp.data.model.Movie + +interface MovieRemoteDataSource { + + suspend fun getPopularMovies(page: Int): List + +} \ No newline at end of file diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/source/remote/MovieRemoteDataSourceImpl.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/source/remote/MovieRemoteDataSourceImpl.kt new file mode 100644 index 0000000..b05a85a --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/data/source/remote/MovieRemoteDataSourceImpl.kt @@ -0,0 +1,18 @@ +package com.god.taeiim.movieapp.data.source.remote + +import com.god.taeiim.movieapp.data.model.Movie +import com.god.taeiim.movieapp.data.source.MovieApi +import retrofit2.HttpException + +class MovieRemoteDataSourceImpl(private val movieApi: MovieApi) : + MovieRemoteDataSource { + + override suspend fun getPopularMovies(page: Int): List { + return try { + movieApi.getMoviePopular(page).movies + } catch (e: HttpException) { + listOf() + } + } + +} \ No newline at end of file diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/di/DataSourceModule.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/di/DataSourceModule.kt new file mode 100644 index 0000000..adb2faf --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/di/DataSourceModule.kt @@ -0,0 +1,12 @@ +package com.god.taeiim.movieapp.di + +import com.god.taeiim.movieapp.data.repository.MovieRepository +import com.god.taeiim.movieapp.data.repository.MovieRepositoryImpl +import com.god.taeiim.movieapp.data.source.remote.MovieRemoteDataSource +import com.god.taeiim.movieapp.data.source.remote.MovieRemoteDataSourceImpl +import org.koin.dsl.module + +val dataSourceModule = module { + single { MovieRemoteDataSourceImpl(get()) } + single { MovieRepositoryImpl(get()) } +} diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/di/NetworkModule.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/di/NetworkModule.kt new file mode 100644 index 0000000..626d2b1 --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/di/NetworkModule.kt @@ -0,0 +1,56 @@ +package com.god.taeiim.movieapp.di + +import com.god.taeiim.movieapp.BuildConfig +import com.god.taeiim.movieapp.data.source.MovieApi +import okhttp3.Interceptor +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import org.koin.core.parameter.parametersOf +import org.koin.dsl.module +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +val networkModule = module { + + single { + HttpLoggingInterceptor().apply { + level = if (BuildConfig.DEBUG) { + HttpLoggingInterceptor.Level.BODY + } else { + HttpLoggingInterceptor.Level.NONE + } + } + } + + + factory { (chain: Interceptor.Chain) -> + var req = chain.request() + val url = req.url().newBuilder() + .addQueryParameter("api_key", BuildConfig.SECRET_KEY) + .addQueryParameter("language", "ko-KR") + .build() + req = req.newBuilder().url(url).build() + chain.proceed(req) + } + + factory { + OkHttpClient.Builder() + .addInterceptor { get { parametersOf(it) } } + .addInterceptor(get()) + .build() + } + + single { + Retrofit.Builder() + .baseUrl("https://api.themoviedb.org/3/") + .client(get()) + .addConverterFactory(GsonConverterFactory.create()) + .build() + + } + + single { + get().create(MovieApi::class.java) + } + +} diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/di/ViewModelModule.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/di/ViewModelModule.kt new file mode 100644 index 0000000..6f6220b --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/di/ViewModelModule.kt @@ -0,0 +1,9 @@ +package com.god.taeiim.movieapp.di + +import com.god.taeiim.movieapp.ui.main.MainViewModel +import org.koin.androidx.viewmodel.dsl.viewModel +import org.koin.dsl.module + +val viewModelModule = module { + viewModel { MainViewModel(get()) } +} \ No newline at end of file diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ext/KoinExt.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ext/KoinExt.kt new file mode 100644 index 0000000..e01da79 --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ext/KoinExt.kt @@ -0,0 +1,20 @@ +package com.god.taeiim.movieapp.ext + +import android.content.Context +import com.god.taeiim.movieapp.BuildConfig +import org.koin.android.ext.koin.androidContext +import org.koin.android.logger.AndroidLogger +import org.koin.core.context.startKoin +import org.koin.core.logger.EmptyLogger +import org.koin.core.module.Module + +fun setupKoin( + context: Context, + vararg module: Module +) { + startKoin { + logger(if (BuildConfig.DEBUG) AndroidLogger() else EmptyLogger()) + androidContext(context) + modules(*module) + } +} diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ext/LiveDataExtensions.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ext/LiveDataExtensions.kt new file mode 100644 index 0000000..7ffb2cd --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ext/LiveDataExtensions.kt @@ -0,0 +1,9 @@ +package com.god.taeiim.movieapp.ext + +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.LiveData +import androidx.lifecycle.Observer + +fun LifecycleOwner.observe(liveData: LiveData, observer: Observer) { + liveData.observe(this, observer) +} diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ext/MutableLiveDataExt.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ext/MutableLiveDataExt.kt new file mode 100644 index 0000000..aafd308 --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ext/MutableLiveDataExt.kt @@ -0,0 +1,6 @@ +package com.god.taeiim.movieapp.ext + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData + +fun MutableLiveData.toLiveData() = this as LiveData diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ui/MovieRecyclerAdapter.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ui/MovieRecyclerAdapter.kt new file mode 100644 index 0000000..b94abf6 --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ui/MovieRecyclerAdapter.kt @@ -0,0 +1,9 @@ +package com.god.taeiim.movieapp.ui + +import androidx.databinding.ViewDataBinding +import com.god.taeiim.movieapp.base.BaseRecyclerAdapter + +class MovieRecyclerAdapter( + layout: Int, + bindingVariableId: Int +) : BaseRecyclerAdapter(layout, bindingVariableId) \ No newline at end of file diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ui/main/MainActivity.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ui/main/MainActivity.kt new file mode 100644 index 0000000..ddb9c41 --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ui/main/MainActivity.kt @@ -0,0 +1,41 @@ +package com.god.taeiim.movieapp.ui.main + +import android.os.Bundle +import android.view.View +import androidx.lifecycle.Observer +import com.god.taeiim.movieapp.BR +import com.god.taeiim.movieapp.R +import com.god.taeiim.movieapp.base.BaseActivity +import com.god.taeiim.movieapp.data.model.Movie +import com.god.taeiim.movieapp.databinding.ActivityMainBinding +import com.god.taeiim.movieapp.databinding.ItemMoviePopularBinding +import com.god.taeiim.movieapp.ext.observe +import com.god.taeiim.movieapp.ui.MovieRecyclerAdapter +import org.koin.androidx.viewmodel.ext.android.viewModel + +class MainActivity : BaseActivity(R.layout.activity_main) { + + private val viewModel: MainViewModel by viewModel() + + private lateinit var movieAdapter: MovieRecyclerAdapter + + private val stateObserver = Observer { + movieAdapter.updateItems(it.movies) + binding.pbLoading.visibility = if (it.isLoading) View.VISIBLE else View.GONE + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + movieAdapter = MovieRecyclerAdapter(R.layout.item_movie_popular, BR.movie) + + binding.rvMovie.apply { + setHasFixedSize(true) + adapter = movieAdapter + } + + observe(viewModel.stateLiveData, stateObserver) + viewModel.loadData() + } + +} diff --git a/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ui/main/MainViewModel.kt b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ui/main/MainViewModel.kt new file mode 100644 index 0000000..687e0ed --- /dev/null +++ b/MovieApp/app/src/main/java/com/god/taeiim/movieapp/ui/main/MainViewModel.kt @@ -0,0 +1,59 @@ +package com.god.taeiim.movieapp.ui.main + +import androidx.lifecycle.viewModelScope +import com.god.taeiim.movieapp.base.BaseAction +import com.god.taeiim.movieapp.base.BaseViewModel +import com.god.taeiim.movieapp.base.BaseViewState +import com.god.taeiim.movieapp.data.model.Movie +import com.god.taeiim.movieapp.data.repository.MovieRepository +import com.god.taeiim.movieapp.ui.main.MainViewModel.Action +import com.god.taeiim.movieapp.ui.main.MainViewModel.Action.MovieListLoadingFailure +import com.god.taeiim.movieapp.ui.main.MainViewModel.Action.MovieListLoadingSuccess +import com.god.taeiim.movieapp.ui.main.MainViewModel.ViewState +import kotlinx.coroutines.launch + + +internal class MainViewModel(private val movieRepository: MovieRepository) : + BaseViewModel(ViewState()) { + + override fun onLoadData() { + getMovieList() + } + + private fun getMovieList() { + viewModelScope.launch { + movieRepository.getPopularMovies(1).also { + if (it.isNotEmpty()) { + sendAction(MovieListLoadingSuccess(it)) + } else { + sendAction(MovieListLoadingFailure) + } + } + } + } + + override fun onReduceState(viewAction: Action) = when (viewAction) { + is MovieListLoadingSuccess -> state.copy( + isLoading = false, + isError = false, + movies = viewAction.movies + ) + is MovieListLoadingFailure -> state.copy( + isLoading = false, + isError = true, + movies = listOf() + ) + } + + internal data class ViewState( + val isLoading: Boolean = true, + val isError: Boolean = false, + val movies: List = listOf() + ) : BaseViewState + + internal sealed class Action : BaseAction { + class MovieListLoadingSuccess(val movies: List) : Action() + object MovieListLoadingFailure : Action() + } + +} \ No newline at end of file diff --git a/ToyProject/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/MovieApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from ToyProject/app/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to MovieApp/app/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/ToyProject/app/src/main/res/drawable/ic_launcher_background.xml b/MovieApp/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from ToyProject/app/src/main/res/drawable/ic_launcher_background.xml rename to MovieApp/app/src/main/res/drawable/ic_launcher_background.xml diff --git a/MovieApp/app/src/main/res/layout/activity_main.xml b/MovieApp/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..f5945df --- /dev/null +++ b/MovieApp/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MovieApp/app/src/main/res/layout/item_movie_popular.xml b/MovieApp/app/src/main/res/layout/item_movie_popular.xml new file mode 100644 index 0000000..57c55db --- /dev/null +++ b/MovieApp/app/src/main/res/layout/item_movie_popular.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ToyProject/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/MovieApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml similarity index 100% rename from ToyProject/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml rename to MovieApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml diff --git a/ToyProject/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/MovieApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml similarity index 100% rename from ToyProject/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml rename to MovieApp/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml diff --git a/ToyProject/app/src/main/res/mipmap-hdpi/ic_launcher.png b/MovieApp/app/src/main/res/mipmap-hdpi/ic_launcher.png similarity index 100% rename from ToyProject/app/src/main/res/mipmap-hdpi/ic_launcher.png rename to MovieApp/app/src/main/res/mipmap-hdpi/ic_launcher.png diff --git a/ToyProject/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/MovieApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.png similarity index 100% rename from ToyProject/app/src/main/res/mipmap-hdpi/ic_launcher_round.png rename to MovieApp/app/src/main/res/mipmap-hdpi/ic_launcher_round.png diff --git a/ToyProject/app/src/main/res/mipmap-mdpi/ic_launcher.png b/MovieApp/app/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from ToyProject/app/src/main/res/mipmap-mdpi/ic_launcher.png rename to MovieApp/app/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/ToyProject/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/MovieApp/app/src/main/res/mipmap-mdpi/ic_launcher_round.png similarity index 100% rename from ToyProject/app/src/main/res/mipmap-mdpi/ic_launcher_round.png rename to MovieApp/app/src/main/res/mipmap-mdpi/ic_launcher_round.png diff --git a/ToyProject/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/MovieApp/app/src/main/res/mipmap-xhdpi/ic_launcher.png similarity index 100% rename from ToyProject/app/src/main/res/mipmap-xhdpi/ic_launcher.png rename to MovieApp/app/src/main/res/mipmap-xhdpi/ic_launcher.png diff --git a/ToyProject/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/MovieApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png similarity index 100% rename from ToyProject/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png rename to MovieApp/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png diff --git a/ToyProject/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/MovieApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.png similarity index 100% rename from ToyProject/app/src/main/res/mipmap-xxhdpi/ic_launcher.png rename to MovieApp/app/src/main/res/mipmap-xxhdpi/ic_launcher.png diff --git a/ToyProject/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/MovieApp/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png similarity index 100% rename from ToyProject/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png rename to MovieApp/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png diff --git a/ToyProject/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/MovieApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from ToyProject/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to MovieApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/ToyProject/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/MovieApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png similarity index 100% rename from ToyProject/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png rename to MovieApp/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png diff --git a/ToyProject/app/src/main/res/values/colors.xml b/MovieApp/app/src/main/res/values/colors.xml similarity index 81% rename from ToyProject/app/src/main/res/values/colors.xml rename to MovieApp/app/src/main/res/values/colors.xml index 69b2233..27a6a7a 100644 --- a/ToyProject/app/src/main/res/values/colors.xml +++ b/MovieApp/app/src/main/res/values/colors.xml @@ -3,4 +3,6 @@ #008577 #00574B #D81B60 + + #4c4c4c diff --git a/MovieApp/app/src/main/res/values/strings.xml b/MovieApp/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..c0f91ed --- /dev/null +++ b/MovieApp/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + MovieApp + diff --git a/ToyProject/app/src/main/res/values/styles.xml b/MovieApp/app/src/main/res/values/styles.xml similarity index 100% rename from ToyProject/app/src/main/res/values/styles.xml rename to MovieApp/app/src/main/res/values/styles.xml diff --git a/ToyProject/app/src/test/java/com/god/taeiim/toyproject/ExampleUnitTest.kt b/MovieApp/app/src/test/java/com/god/taeiim/movieapp/ExampleUnitTest.kt similarity index 90% rename from ToyProject/app/src/test/java/com/god/taeiim/toyproject/ExampleUnitTest.kt rename to MovieApp/app/src/test/java/com/god/taeiim/movieapp/ExampleUnitTest.kt index 676949d..ad02711 100644 --- a/ToyProject/app/src/test/java/com/god/taeiim/toyproject/ExampleUnitTest.kt +++ b/MovieApp/app/src/test/java/com/god/taeiim/movieapp/ExampleUnitTest.kt @@ -1,4 +1,4 @@ -package com.god.taeiim.toyproject +package com.god.taeiim.movieapp import org.junit.Test diff --git a/MovieApp/build.gradle b/MovieApp/build.gradle new file mode 100644 index 0000000..ee9922c --- /dev/null +++ b/MovieApp/build.gradle @@ -0,0 +1,60 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + ext{ + //kotlin + kotlin_version = '1.3.50' + + //androidx + app_compat_version = '1.0.2' + constraintlayout_version = '1.1.3' + recyclerview_version = '1.1.0-beta03' + + //test + test_runner_version = '1.2.0' + core_version = '3.2.0' + junit_version = '4.12' + + //google + material_version = '1.2.0-alpha03' + + //retrofit + retrofit_version = '2.6.2' + okhttp_version = '3.12.0' + + //glide + glide_version = '4.10.0' + + //LifeCycle (ViewModel) + lifecycle_version = '2.1.0' + + //koin + koin_version = '2.1.5' + + //coroutine + coroutine_version = '1.3.3' + } + repositories { + google() + jcenter() + + } + dependencies { + classpath 'com.android.tools.build:gradle:3.5.2' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + google() + jcenter() + + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/MovieApp/gitignore.txt b/MovieApp/gitignore.txt new file mode 100644 index 0000000..2f226b6 --- /dev/null +++ b/MovieApp/gitignore.txt @@ -0,0 +1,205 @@ + +# Created by https://www.gitignore.io/api/android,androidstudio +# Edit at https://www.gitignore.io/?templates=android,androidstudio + +### Android ### +# Built application files +*.apk +*.ap_ +*.aab + +# Files for the ART/Dalvik VM +*.dex + +# Java class files +*.class + +# Generated files +bin/ +gen/ +out/ +release/ + +# Gradle files +.gradle/ +build/ + +# Local configuration file (sdk path, etc) +local.properties + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# IntelliJ +*.iml +.idea/workspace.xml +.idea/tasks.xml +.idea/gradle.xml +.idea/assetWizardSettings.xml +.idea/dictionaries +.idea/libraries +# Android Studio 3 in .gitignore file. +.idea/caches +.idea/modules.xml +# Comment next line if keeping position of elements in Navigation Editor is relevant for you +.idea/navEditor.xml + +# Keystore files +# Uncomment the following lines if you do not want to check your keystore files in. +#*.jks +#*.keystore + +# External native build folder generated in Android Studio 2.2 and later +.externalNativeBuild + +# Google Services (e.g. APIs or Firebase) +# google-services.json + +# Freeline +freeline.py +freeline/ +freeline_project_description.json + +# fastlane +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots +fastlane/test_output +fastlane/readme.md + +# Version control +vcs.xml + +# lint +lint/intermediates/ +lint/generated/ +lint/outputs/ +lint/tmp/ +# lint/reports/ + +### Android Patch ### +gen-external-apklibs +output.json + +# Replacement of .externalNativeBuild directories introduced +# with Android Studio 3.5. +.cxx/ + +### AndroidStudio ### +# Covers files to be ignored for android development using Android Studio. + +# Built application files + +# Files for the ART/Dalvik VM + +# Java class files + +# Generated files + +# Gradle files +.gradle + +# Signing files +.signing/ + +# Local configuration file (sdk path, etc) + +# Proguard folder generated by Eclipse + +# Log Files + +# Android Studio +/*/build/ +/*/local.properties +/*/out +/*/*/build +/*/*/production +*.ipr +*~ +*.swp + +# Android Patch + +# External native build folder generated in Android Studio 2.2 and later + +# NDK +obj/ + +# IntelliJ IDEA +*.iws +/out/ + +# User-specific configurations +.idea/caches/ +.idea/libraries/ +.idea/shelf/ +.idea/.name +.idea/compiler.xml +.idea/copyright/profiles_settings.xml +.idea/encodings.xml +.idea/misc.xml +.idea/scopes/scope_settings.xml +.idea/vcs.xml +.idea/jsLibraryMappings.xml +.idea/datasources.xml +.idea/dataSources.ids +.idea/sqlDataSources.xml +.idea/dynamic.xml +.idea/uiDesigner.xml + +# OS-specific files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Legacy Eclipse project files +.classpath +.project +.cproject +.settings/ + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.war +*.ear + +# virtual machine crash logs (Reference: http://www.java.com/en/download/help/error_hotspot.xml) +hs_err_pid* + +## Plugin-specific files: + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Mongo Explorer plugin +.idea/mongoSettings.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +### AndroidStudio Patch ### + +!/gradle/wrapper/gradle-wrapper.jar + +# End of https://www.gitignore.io/api/android,androidstudio \ No newline at end of file diff --git a/ToyProject/gradle.properties b/MovieApp/gradle.properties similarity index 100% rename from ToyProject/gradle.properties rename to MovieApp/gradle.properties diff --git a/ToyProject/gradle/wrapper/gradle-wrapper.jar b/MovieApp/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from ToyProject/gradle/wrapper/gradle-wrapper.jar rename to MovieApp/gradle/wrapper/gradle-wrapper.jar diff --git a/ToyProject/gradle/wrapper/gradle-wrapper.properties b/MovieApp/gradle/wrapper/gradle-wrapper.properties similarity index 87% rename from ToyProject/gradle/wrapper/gradle-wrapper.properties rename to MovieApp/gradle/wrapper/gradle-wrapper.properties index c16bbad..b564847 100644 --- a/ToyProject/gradle/wrapper/gradle-wrapper.properties +++ b/MovieApp/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,4 @@ -#Fri Jan 31 22:58:05 KST 2020 +#Tue Feb 18 00:04:54 KST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/ToyProject/gradlew b/MovieApp/gradlew similarity index 100% rename from ToyProject/gradlew rename to MovieApp/gradlew diff --git a/ToyProject/gradlew.bat b/MovieApp/gradlew.bat similarity index 100% rename from ToyProject/gradlew.bat rename to MovieApp/gradlew.bat diff --git a/MovieApp/settings.gradle b/MovieApp/settings.gradle new file mode 100644 index 0000000..2389e6d --- /dev/null +++ b/MovieApp/settings.gradle @@ -0,0 +1,2 @@ +include ':app' +rootProject.name='MovieApp' diff --git a/ToyProject/app/build.gradle b/ToyProject/app/build.gradle deleted file mode 100644 index ca3868b..0000000 --- a/ToyProject/app/build.gradle +++ /dev/null @@ -1,35 +0,0 @@ -apply plugin: 'com.android.application' - -apply plugin: 'kotlin-android' - -apply plugin: 'kotlin-android-extensions' - -android { - compileSdkVersion 29 - buildToolsVersion "29.0.2" - defaultConfig { - applicationId "com.god.taeiim.toyproject" - minSdkVersion 21 - targetSdkVersion 29 - versionCode 1 - versionName "1.0" - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" - implementation 'androidx.appcompat:appcompat:1.0.2' - implementation 'androidx.core:core-ktx:1.1.0' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test.ext:junit:1.1.0' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} diff --git a/ToyProject/app/src/main/java/com/god/taeiim/toyproject/MainActivity.kt b/ToyProject/app/src/main/java/com/god/taeiim/toyproject/MainActivity.kt deleted file mode 100644 index 51e3832..0000000 --- a/ToyProject/app/src/main/java/com/god/taeiim/toyproject/MainActivity.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.god.taeiim.toyproject - -import androidx.appcompat.app.AppCompatActivity -import android.os.Bundle - -class MainActivity : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - } -} diff --git a/ToyProject/app/src/main/res/layout/activity_main.xml b/ToyProject/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index 4fc2444..0000000 --- a/ToyProject/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/ToyProject/app/src/main/res/values/strings.xml b/ToyProject/app/src/main/res/values/strings.xml deleted file mode 100644 index 5842ad4..0000000 --- a/ToyProject/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - ToyProject - diff --git a/ToyProject/build.gradle b/ToyProject/build.gradle deleted file mode 100644 index 186134a..0000000 --- a/ToyProject/build.gradle +++ /dev/null @@ -1,28 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - ext.kotlin_version = '1.3.50' - repositories { - google() - jcenter() - - } - dependencies { - classpath 'com.android.tools.build:gradle:3.5.2' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -allprojects { - repositories { - google() - jcenter() - - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/ToyProject/settings.gradle b/ToyProject/settings.gradle deleted file mode 100644 index 2f3525a..0000000 --- a/ToyProject/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -include ':app' -rootProject.name='ToyProject'