From a68c52cde1e155a3a36abfea11cabb9dbe8f590b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B9=20=D0=94=D0=B0?= =?UTF-8?q?=D0=B2=D1=8B=D0=B4=D0=B5=D0=BD=D0=BA=D0=BE?= Date: Wed, 11 May 2022 20:10:00 +0300 Subject: [PATCH 1/3] add layout --- .idea/.name | 1 + .idea/compiler.xml | 6 +++ .idea/gradle.xml | 19 ++++++++ .idea/misc.xml | 34 ++++++++++++++ .idea/vcs.xml | 6 +++ app/build.gradle | 20 ++++++++- .../com/github/krottv/tmstemp/HostFragment.kt | 22 +++++++++ .../krottv/tmstemp/ITunesMusicFragment.kt | 6 +++ .../krottv/tmstemp/LibraryMusicFragment.kt | 6 +++ app/src/main/res/layout/activity_main.xml | 19 ++++---- app/src/main/res/layout/host_fragment.xml | 45 +++++++++++++++++++ app/src/main/res/layout/item_album.xml | 23 ++++++++++ app/src/main/res/layout/item_track.xml | 31 +++++++++++++ .../main/res/layout/itunes_music_fragment.xml | 24 ++++++++++ .../res/layout/library_music_fragment.xml | 22 +++++++++ app/src/main/res/navigation/nav_graph.xml | 6 +++ build.gradle | 10 +++++ 17 files changed, 291 insertions(+), 9 deletions(-) create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 app/src/main/java/com/github/krottv/tmstemp/HostFragment.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/ITunesMusicFragment.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/LibraryMusicFragment.kt create mode 100644 app/src/main/res/layout/host_fragment.xml create mode 100644 app/src/main/res/layout/item_album.xml create mode 100644 app/src/main/res/layout/item_track.xml create mode 100644 app/src/main/res/layout/itunes_music_fragment.xml create mode 100644 app/src/main/res/layout/library_music_fragment.xml create mode 100644 app/src/main/res/navigation/nav_graph.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..0f301f5 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +TmsTemp \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..4e3844e --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..630c8e1 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,34 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 93d31ce..d0d11e8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,7 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' + id 'androidx.navigation.safeargs.kotlin' } android { @@ -29,13 +30,30 @@ android { kotlinOptions { jvmTarget = '1.8' } + viewBinding { + enabled = true + } } dependencies { + implementation "androidx.navigation:navigation-fragment-ktx:2.4.2" + implementation "androidx.navigation:navigation-ui-ktx:2.4.2" + + implementation "androidx.fragment:fragment-ktx:1.4.1" + implementation "androidx.activity:activity-ktx:1.4.0" + + implementation "androidx.recyclerview:recyclerview:1.2.1" + + implementation "io.coil-kt:coil:2.0.0-rc03" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1" + implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.1' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1' + implementation 'androidx.core:core-ktx:1.7.0' implementation 'androidx.appcompat:appcompat:1.4.1' - implementation 'com.google.android.material:material:1.5.0' + implementation 'com.google.android.material:material:1.6.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' diff --git a/app/src/main/java/com/github/krottv/tmstemp/HostFragment.kt b/app/src/main/java/com/github/krottv/tmstemp/HostFragment.kt new file mode 100644 index 0000000..f52c676 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/HostFragment.kt @@ -0,0 +1,22 @@ +package com.github.krottv.tmstemp + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment + +class HostFragment : Fragment() { + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + return super.onCreateView(inflater, container, savedInstanceState) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/ITunesMusicFragment.kt b/app/src/main/java/com/github/krottv/tmstemp/ITunesMusicFragment.kt new file mode 100644 index 0000000..0d8b621 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/ITunesMusicFragment.kt @@ -0,0 +1,6 @@ +package com.github.krottv.tmstemp + +import androidx.fragment.app.Fragment + +class ITunesMusicFragment : Fragment() { +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/LibraryMusicFragment.kt b/app/src/main/java/com/github/krottv/tmstemp/LibraryMusicFragment.kt new file mode 100644 index 0000000..bea9e10 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/LibraryMusicFragment.kt @@ -0,0 +1,6 @@ +package com.github.krottv.tmstemp + +import androidx.fragment.app.Fragment + +class LibraryMusicFragment : Fragment() { +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 4fc2444..fb3f6bc 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -6,13 +6,16 @@ android:layout_height="match_parent" tools:context=".MainActivity"> - + \ No newline at end of file diff --git a/app/src/main/res/layout/host_fragment.xml b/app/src/main/res/layout/host_fragment.xml new file mode 100644 index 0000000..535d1c3 --- /dev/null +++ b/app/src/main/res/layout/host_fragment.xml @@ -0,0 +1,45 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_album.xml b/app/src/main/res/layout/item_album.xml new file mode 100644 index 0000000..e7b6fc3 --- /dev/null +++ b/app/src/main/res/layout/item_album.xml @@ -0,0 +1,23 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_track.xml b/app/src/main/res/layout/item_track.xml new file mode 100644 index 0000000..d2b3b76 --- /dev/null +++ b/app/src/main/res/layout/item_track.xml @@ -0,0 +1,31 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/itunes_music_fragment.xml b/app/src/main/res/layout/itunes_music_fragment.xml new file mode 100644 index 0000000..feab479 --- /dev/null +++ b/app/src/main/res/layout/itunes_music_fragment.xml @@ -0,0 +1,24 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/library_music_fragment.xml b/app/src/main/res/layout/library_music_fragment.xml new file mode 100644 index 0000000..b6046aa --- /dev/null +++ b/app/src/main/res/layout/library_music_fragment.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml new file mode 100644 index 0000000..8e0008b --- /dev/null +++ b/app/src/main/res/navigation/nav_graph.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 0ccd671..7466c0a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,14 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + google() + } + dependencies { + def nav_version = "2.4.2" + classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version" + } +} + plugins { id 'com.android.application' version '7.1.2' apply false id 'com.android.library' version '7.1.2' apply false From 2f19630d6488a13ade2899f30bf997f891debbb6 Mon Sep 17 00:00:00 2001 From: Nikolay Davydenko Date: Thu, 12 May 2022 17:10:43 +0300 Subject: [PATCH 2/3] logic done --- .idea/.gitignore | 3 + .idea/gradle.xml | 2 +- .idea/misc.xml | 37 ++++------ .idea/vcs.xml | 2 +- app/build.gradle | 15 ++++ app/src/main/AndroidManifest.xml | 3 +- .../krottv/tmstemp/ITunesMusicFragment.kt | 6 -- .../krottv/tmstemp/LibraryMusicFragment.kt | 6 -- .../com/github/krottv/tmstemp/MainActivity.kt | 11 --- .../krottv/tmstemp/data/DataSourceFake.kt | 20 ++++++ .../krottv/tmstemp/data/ITunesMusicApi.kt | 15 ++++ .../data/ITunesRemoteDataSourceRetrofit.kt | 35 +++++++++ .../krottv/tmstemp/data/LibraryMusicApi.kt | 14 ++++ .../data/LibraryRemoteDataSourceRetrofit.kt | 34 +++++++++ .../com/github/krottv/tmstemp/domain/Album.kt | 11 +++ .../krottv/tmstemp/domain/AlbumModel.kt | 13 ++++ .../github/krottv/tmstemp/domain/Tracks.kt | 11 +++ .../krottv/tmstemp/domain/TracksModel.kt | 9 +++ .../tmstemp/presentation/AlbumsViewModel.kt | 24 +++++++ .../presentation/LibraryAlbumsViewModel.kt | 23 ++++++ .../presentation/TracksITunesViewModel.kt | 23 ++++++ .../presentation/TracksLibraryViewModel.kt | 23 ++++++ .../krottv/tmstemp/view/AlbumsAdapter.kt | 36 ++++++++++ .../krottv/tmstemp/view/AlbumsViewHolder.kt | 13 ++++ .../krottv/tmstemp/{ => view}/HostFragment.kt | 8 ++- .../krottv/tmstemp/view/HostFragmentBinder.kt | 21 ++++++ .../tmstemp/view/ITunesMusicFragment.kt | 72 +++++++++++++++++++ .../tmstemp/view/ITunesMusicFragmentBinder.kt | 55 ++++++++++++++ .../tmstemp/view/LibraryMusicFragment.kt | 69 ++++++++++++++++++ .../view/LibraryMusicFragmentBinder.kt | 53 ++++++++++++++ .../krottv/tmstemp/view/MainActivity.kt | 18 +++++ .../krottv/tmstemp/view/TracksAdapter.kt | 36 ++++++++++ .../krottv/tmstemp/view/TracksViewHolder.kt | 13 ++++ app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/layout/host_fragment.xml | 8 ++- app/src/main/res/layout/item_album.xml | 2 +- app/src/main/res/layout/item_track.xml | 2 +- .../main/res/layout/itunes_music_fragment.xml | 8 ++- .../res/layout/library_music_fragment.xml | 6 +- .../res/navigation/itunes_library_graph.xml | 23 ++++++ app/src/main/res/navigation/nav_graph.xml | 7 +- build.gradle | 5 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 43 files changed, 731 insertions(+), 68 deletions(-) create mode 100644 .idea/.gitignore delete mode 100644 app/src/main/java/com/github/krottv/tmstemp/ITunesMusicFragment.kt delete mode 100644 app/src/main/java/com/github/krottv/tmstemp/LibraryMusicFragment.kt delete mode 100644 app/src/main/java/com/github/krottv/tmstemp/MainActivity.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/data/DataSourceFake.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/data/ITunesMusicApi.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/data/ITunesRemoteDataSourceRetrofit.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/data/LibraryMusicApi.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/data/LibraryRemoteDataSourceRetrofit.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/domain/Album.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/domain/AlbumModel.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/domain/Tracks.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/domain/TracksModel.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/presentation/AlbumsViewModel.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/presentation/LibraryAlbumsViewModel.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/presentation/TracksITunesViewModel.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/presentation/TracksLibraryViewModel.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/view/AlbumsAdapter.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/view/AlbumsViewHolder.kt rename app/src/main/java/com/github/krottv/tmstemp/{ => view}/HostFragment.kt (69%) create mode 100644 app/src/main/java/com/github/krottv/tmstemp/view/HostFragmentBinder.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/view/ITunesMusicFragment.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/view/ITunesMusicFragmentBinder.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/view/LibraryMusicFragment.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/view/LibraryMusicFragmentBinder.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/view/MainActivity.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/view/TracksAdapter.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/view/TracksViewHolder.kt create mode 100644 app/src/main/res/navigation/itunes_library_graph.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 4e3844e..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -1,5 +1,6 @@ + diff --git a/.idea/misc.xml b/.idea/misc.xml index 630c8e1..509af26 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,32 +3,19 @@ - - + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7..35eb1dd 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index d0d11e8..aa3a092 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,6 +2,7 @@ plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'androidx.navigation.safeargs.kotlin' + id 'kotlinx-serialization' } android { @@ -36,6 +37,20 @@ android { } dependencies { + def koin_version= "3.1.6" +// Koin Core features + implementation "io.insert-koin:koin-android:$koin_version" + implementation "io.insert-koin:koin-core:$koin_version" +// Navigation Graph + implementation "io.insert-koin:koin-androidx-navigation:$koin_version" +// Koin Test features + testImplementation "io.insert-koin:koin-test:$koin_version" + + implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0" + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation "com.squareup.okhttp3:okhttp:4.9.3" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1" implementation "androidx.navigation:navigation-fragment-ktx:2.4.2" implementation "androidx.navigation:navigation-ui-ktx:2.4.2" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a551aff..2814a91 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,7 @@ + diff --git a/app/src/main/java/com/github/krottv/tmstemp/ITunesMusicFragment.kt b/app/src/main/java/com/github/krottv/tmstemp/ITunesMusicFragment.kt deleted file mode 100644 index 0d8b621..0000000 --- a/app/src/main/java/com/github/krottv/tmstemp/ITunesMusicFragment.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.github.krottv.tmstemp - -import androidx.fragment.app.Fragment - -class ITunesMusicFragment : Fragment() { -} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/LibraryMusicFragment.kt b/app/src/main/java/com/github/krottv/tmstemp/LibraryMusicFragment.kt deleted file mode 100644 index bea9e10..0000000 --- a/app/src/main/java/com/github/krottv/tmstemp/LibraryMusicFragment.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.github.krottv.tmstemp - -import androidx.fragment.app.Fragment - -class LibraryMusicFragment : Fragment() { -} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/MainActivity.kt b/app/src/main/java/com/github/krottv/tmstemp/MainActivity.kt deleted file mode 100644 index 8952f64..0000000 --- a/app/src/main/java/com/github/krottv/tmstemp/MainActivity.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.github.krottv.tmstemp - -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) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/data/DataSourceFake.kt b/app/src/main/java/com/github/krottv/tmstemp/data/DataSourceFake.kt new file mode 100644 index 0000000..ebbbd0d --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/data/DataSourceFake.kt @@ -0,0 +1,20 @@ +package com.github.krottv.tmstemp.data + +import com.github.krottv.tmstemp.domain.AlbumModel + +class DataSourceFake { + + fun getITunesAlbums(): List{ + val model = AlbumModel(0, + "https://inspiry-2ee60.web.app/music/images/itunes/hip_hop.jpg", + "Some Text", + 10) + + val mutableListOf = ArrayList(10) + for (i in 0..10){ + mutableListOf.add(model.copy(name = "Some Text $i")) + } + + return mutableListOf + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/data/ITunesMusicApi.kt b/app/src/main/java/com/github/krottv/tmstemp/data/ITunesMusicApi.kt new file mode 100644 index 0000000..c410da3 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/data/ITunesMusicApi.kt @@ -0,0 +1,15 @@ +package com.github.krottv.tmstemp.data + +import com.github.krottv.tmstemp.domain.AlbumModel +import com.github.krottv.tmstemp.domain.Tracks +import com.github.krottv.tmstemp.domain.TracksModel +import retrofit2.http.GET +import retrofit2.http.Query + +interface ITunesMusicApi { + @GET("getITunesAlbums") + suspend fun getITunesAlbums(): List + + @GET("getITunesTrack") + suspend fun getITunesTracks(@Query("album_id") albumId: Long): TracksModel +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/data/ITunesRemoteDataSourceRetrofit.kt b/app/src/main/java/com/github/krottv/tmstemp/data/ITunesRemoteDataSourceRetrofit.kt new file mode 100644 index 0000000..de0e247 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/data/ITunesRemoteDataSourceRetrofit.kt @@ -0,0 +1,35 @@ +package com.github.krottv.tmstemp.data + +import android.util.Log +import com.github.krottv.tmstemp.domain.AlbumModel +import com.github.krottv.tmstemp.domain.Tracks +import com.github.krottv.tmstemp.domain.TracksModel +import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory +import kotlinx.serialization.json.Json +import okhttp3.MediaType.Companion.toMediaType +import retrofit2.Retrofit +import retrofit2.create + +class ITunesRemoteDataSourceRetrofit : ITunesMusicApi { + + override suspend fun getITunesAlbums(): List { + val retrofit = Retrofit.Builder() + .baseUrl("https://us-central1-inspiry-2ee60.cloudfunctions.net/getItunesAlbums/") + .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) + .build() + + val musicApi: ITunesMusicApi = retrofit.create() + return musicApi.getITunesAlbums() + } + + override suspend fun getITunesTracks(albumId: Long): TracksModel { + val retrofit = Retrofit.Builder() + .baseUrl("https://us-central1-inspiry-2ee60.cloudfunctions.net/getItunesTracks/") + .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) + .build() + + val musicApi: ITunesMusicApi = retrofit.create() + + return musicApi.getITunesTracks(1) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/data/LibraryMusicApi.kt b/app/src/main/java/com/github/krottv/tmstemp/data/LibraryMusicApi.kt new file mode 100644 index 0000000..234d5c2 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/data/LibraryMusicApi.kt @@ -0,0 +1,14 @@ +package com.github.krottv.tmstemp.data + +import com.github.krottv.tmstemp.domain.AlbumModel +import com.github.krottv.tmstemp.domain.TracksModel +import retrofit2.http.GET +import retrofit2.http.Query + +interface LibraryMusicApi { + @GET("getLibraryAlbums") + suspend fun getLibraryAlbums(): List + + @GET("getLibraryTrack") + suspend fun getLibraryTracks(@Query("album_id") albumId: Long): TracksModel +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/data/LibraryRemoteDataSourceRetrofit.kt b/app/src/main/java/com/github/krottv/tmstemp/data/LibraryRemoteDataSourceRetrofit.kt new file mode 100644 index 0000000..245f59f --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/data/LibraryRemoteDataSourceRetrofit.kt @@ -0,0 +1,34 @@ +package com.github.krottv.tmstemp.data + +import com.github.krottv.tmstemp.domain.AlbumModel +import com.github.krottv.tmstemp.domain.TracksModel +import com.jakewharton.retrofit2.converter.kotlinx.serialization.asConverterFactory +import kotlinx.serialization.json.Json +import okhttp3.MediaType.Companion.toMediaType +import retrofit2.Retrofit +import retrofit2.create + +class LibraryRemoteDataSourceRetrofit : LibraryMusicApi { + + override suspend fun getLibraryAlbums(): List { + val retrofit = Retrofit.Builder() + .baseUrl("https://us-central1-inspiry-2ee60.cloudfunctions.net/getLibraryAlbums/") + .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) + .build() + + val musicApi: LibraryMusicApi = retrofit.create() + + return musicApi.getLibraryAlbums() + } + + override suspend fun getLibraryTracks(albumId: Long): TracksModel { + val retrofit = Retrofit.Builder() + .baseUrl("https://us-central1-inspiry-2ee60.cloudfunctions.net/getLibraryTracks/") + .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) + .build() + + val musicApi: LibraryMusicApi = retrofit.create() + + return musicApi.getLibraryTracks(1) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/domain/Album.kt b/app/src/main/java/com/github/krottv/tmstemp/domain/Album.kt new file mode 100644 index 0000000..a054ef1 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/domain/Album.kt @@ -0,0 +1,11 @@ +package com.github.krottv.tmstemp.domain + +import kotlinx.serialization.Serializable + +@Serializable +data class Album( + var id: Int, + var image: String, + var name: String, + var trackCount: Int +) diff --git a/app/src/main/java/com/github/krottv/tmstemp/domain/AlbumModel.kt b/app/src/main/java/com/github/krottv/tmstemp/domain/AlbumModel.kt new file mode 100644 index 0000000..4c5e726 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/domain/AlbumModel.kt @@ -0,0 +1,13 @@ +package com.github.krottv.tmstemp.domain + +import android.media.Image +import kotlinx.serialization.Serializable + +@Serializable +data class AlbumModel( + val id: Long, + val image: String, + val name: String, + val trackCount: Int) { + +} diff --git a/app/src/main/java/com/github/krottv/tmstemp/domain/Tracks.kt b/app/src/main/java/com/github/krottv/tmstemp/domain/Tracks.kt new file mode 100644 index 0000000..9db0d25 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/domain/Tracks.kt @@ -0,0 +1,11 @@ +package com.github.krottv.tmstemp.domain + +import kotlinx.serialization.Serializable + +@Serializable +data class Tracks( + var artist: String, + var image: String, + var title: String, + var url: String +) diff --git a/app/src/main/java/com/github/krottv/tmstemp/domain/TracksModel.kt b/app/src/main/java/com/github/krottv/tmstemp/domain/TracksModel.kt new file mode 100644 index 0000000..ad98d78 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/domain/TracksModel.kt @@ -0,0 +1,9 @@ +package com.github.krottv.tmstemp.domain + +import kotlinx.serialization.Serializable + +@Serializable +data class TracksModel( + var album: Album , + var tracks: ArrayList +) diff --git a/app/src/main/java/com/github/krottv/tmstemp/presentation/AlbumsViewModel.kt b/app/src/main/java/com/github/krottv/tmstemp/presentation/AlbumsViewModel.kt new file mode 100644 index 0000000..989c107 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/presentation/AlbumsViewModel.kt @@ -0,0 +1,24 @@ +package com.github.krottv.tmstemp.presentation + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.github.krottv.tmstemp.data.ITunesRemoteDataSourceRetrofit +import com.github.krottv.tmstemp.domain.AlbumModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch + +class AlbumsViewModel(val iTunesMusicApi: ITunesRemoteDataSourceRetrofit): ViewModel(){ + + private val _stateITunes = MutableStateFlow?>(null) + val stateITunes: StateFlow?> = _stateITunes + + fun loadDataITunes() { + viewModelScope.launch(Dispatchers.IO) { + _stateITunes.emit(iTunesMusicApi.getITunesAlbums()) + } + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/presentation/LibraryAlbumsViewModel.kt b/app/src/main/java/com/github/krottv/tmstemp/presentation/LibraryAlbumsViewModel.kt new file mode 100644 index 0000000..87b9f81 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/presentation/LibraryAlbumsViewModel.kt @@ -0,0 +1,23 @@ +package com.github.krottv.tmstemp.presentation + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.github.krottv.tmstemp.data.ITunesRemoteDataSourceRetrofit +import com.github.krottv.tmstemp.data.LibraryMusicApi +import com.github.krottv.tmstemp.domain.AlbumModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch + +class LibraryAlbumsViewModel(val libraryMusicApi: LibraryMusicApi) : ViewModel() { + + private val _stateITunes = MutableStateFlow?>(null) + val stateITunes: StateFlow?> = _stateITunes + + fun loadDataLibrary() { + viewModelScope.launch(Dispatchers.IO) { + _stateITunes.emit(libraryMusicApi.getLibraryAlbums()) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/presentation/TracksITunesViewModel.kt b/app/src/main/java/com/github/krottv/tmstemp/presentation/TracksITunesViewModel.kt new file mode 100644 index 0000000..f0655c9 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/presentation/TracksITunesViewModel.kt @@ -0,0 +1,23 @@ +package com.github.krottv.tmstemp.presentation + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.github.krottv.tmstemp.data.ITunesRemoteDataSourceRetrofit +import com.github.krottv.tmstemp.domain.AlbumModel +import com.github.krottv.tmstemp.domain.Tracks +import com.github.krottv.tmstemp.domain.TracksModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch + +class TracksITunesViewModel(val iTunesMusicApi: ITunesRemoteDataSourceRetrofit): ViewModel() { + private val _stateITunes = MutableStateFlow(null) + val stateITunes: StateFlow = _stateITunes + + fun loadTracksITunes() { + viewModelScope.launch(Dispatchers.IO) { + _stateITunes.emit(iTunesMusicApi.getITunesTracks(1)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/presentation/TracksLibraryViewModel.kt b/app/src/main/java/com/github/krottv/tmstemp/presentation/TracksLibraryViewModel.kt new file mode 100644 index 0000000..407065e --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/presentation/TracksLibraryViewModel.kt @@ -0,0 +1,23 @@ +package com.github.krottv.tmstemp.presentation + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.github.krottv.tmstemp.data.ITunesRemoteDataSourceRetrofit +import com.github.krottv.tmstemp.data.LibraryMusicApi +import com.github.krottv.tmstemp.data.LibraryRemoteDataSourceRetrofit +import com.github.krottv.tmstemp.domain.TracksModel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch + +class TracksLibraryViewModel(val libraryMusicApi: LibraryMusicApi): ViewModel() { + private val _stateITunes = MutableStateFlow(null) + val stateITunes: StateFlow = _stateITunes + + fun loadTracksLibrary() { + viewModelScope.launch(Dispatchers.IO) { + _stateITunes.emit(libraryMusicApi.getLibraryTracks(1)) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/view/AlbumsAdapter.kt b/app/src/main/java/com/github/krottv/tmstemp/view/AlbumsAdapter.kt new file mode 100644 index 0000000..7734f49 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/view/AlbumsAdapter.kt @@ -0,0 +1,36 @@ +package com.github.krottv.tmstemp.view + +import android.util.Log +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import coil.load +import com.github.krottv.tmstemp.R +import com.github.krottv.tmstemp.domain.AlbumModel +import com.github.krottv.tmstemp.domain.Tracks + +class AlbumsAdapter(data: List): RecyclerView.Adapter() { + + var data: List = data + set(value) { + field = value + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AlbumsViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_album, parent, false) + + return AlbumsViewHolder(view) + } + + override fun onBindViewHolder(holder: AlbumsViewHolder, position: Int) { + val item = data[position] + holder.imageAlbum.load(item.image) + holder.textAlbum.text = item.name + } + + override fun getItemCount(): Int { + return data.size + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/view/AlbumsViewHolder.kt b/app/src/main/java/com/github/krottv/tmstemp/view/AlbumsViewHolder.kt new file mode 100644 index 0000000..a2518e0 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/view/AlbumsViewHolder.kt @@ -0,0 +1,13 @@ +package com.github.krottv.tmstemp.view + +import android.media.Image +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.github.krottv.tmstemp.R + +class AlbumsViewHolder(view: View): RecyclerView.ViewHolder(view){ + val imageAlbum = view.findViewById(R.id.imageAlbum) + val textAlbum = view.findViewById(R.id.albumText) +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/HostFragment.kt b/app/src/main/java/com/github/krottv/tmstemp/view/HostFragment.kt similarity index 69% rename from app/src/main/java/com/github/krottv/tmstemp/HostFragment.kt rename to app/src/main/java/com/github/krottv/tmstemp/view/HostFragment.kt index f52c676..adcd278 100644 --- a/app/src/main/java/com/github/krottv/tmstemp/HostFragment.kt +++ b/app/src/main/java/com/github/krottv/tmstemp/view/HostFragment.kt @@ -1,4 +1,4 @@ -package com.github.krottv.tmstemp +package com.github.krottv.tmstemp.view import android.os.Bundle import android.view.LayoutInflater @@ -8,12 +8,16 @@ import androidx.fragment.app.Fragment class HostFragment : Fragment() { + lateinit var viewBinder: HostFragmentBinder + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { - return super.onCreateView(inflater, container, savedInstanceState) + viewBinder = HostFragmentBinder(this) + + return viewBinder.onCreateView(inflater, container, savedInstanceState) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/app/src/main/java/com/github/krottv/tmstemp/view/HostFragmentBinder.kt b/app/src/main/java/com/github/krottv/tmstemp/view/HostFragmentBinder.kt new file mode 100644 index 0000000..2307581 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/view/HostFragmentBinder.kt @@ -0,0 +1,21 @@ +package com.github.krottv.tmstemp.view + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.github.krottv.tmstemp.databinding.HostFragmentBinding + +class HostFragmentBinder(val fragment: HostFragment) { + + lateinit var binding: HostFragmentBinding + + fun onCreateView(inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = HostFragmentBinding.inflate(inflater, container, false) + + return binding.root + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/view/ITunesMusicFragment.kt b/app/src/main/java/com/github/krottv/tmstemp/view/ITunesMusicFragment.kt new file mode 100644 index 0000000..24e5749 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/view/ITunesMusicFragment.kt @@ -0,0 +1,72 @@ +package com.github.krottv.tmstemp.view + +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.navigation.fragment.NavHostFragment +import androidx.navigation.fragment.findNavController +import com.github.krottv.tmstemp.R +import com.github.krottv.tmstemp.data.ITunesRemoteDataSourceRetrofit +import com.github.krottv.tmstemp.presentation.AlbumsViewModel +import com.github.krottv.tmstemp.presentation.TracksITunesViewModel +import kotlinx.coroutines.launch + +class ITunesMusicFragment : Fragment() { + lateinit var viewBinder: ITunesMusicFragmentBinder + var viewModel: AlbumsViewModel = AlbumsViewModel(ITunesRemoteDataSourceRetrofit()) + var tracksITunesViewModel: TracksITunesViewModel = TracksITunesViewModel( + ITunesRemoteDataSourceRetrofit() + ) + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + viewBinder = ITunesMusicFragmentBinder(this) + val currentView: View = viewBinder.onCreateView(inflater, container, savedInstanceState) + + return currentView + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + + (parentFragment as NavHostFragment).parentFragment?.view?.findViewById(R.id.library) + ?.setOnClickListener { + val navController = findNavController() + + val action = + ITunesMusicFragmentDirections.actionITunesMusicFragmentToLibraryMusicFragment() + navController.navigate(action) + } + + viewModel.loadDataITunes() + + lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.stateITunes.collect { + viewBinder.onDataLoaded(it) + } + } + } + + tracksITunesViewModel.loadTracksITunes() + + lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + tracksITunesViewModel.stateITunes.collect { + + viewBinder.tracksLoaded(it) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/view/ITunesMusicFragmentBinder.kt b/app/src/main/java/com/github/krottv/tmstemp/view/ITunesMusicFragmentBinder.kt new file mode 100644 index 0000000..94905e2 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/view/ITunesMusicFragmentBinder.kt @@ -0,0 +1,55 @@ +package com.github.krottv.tmstemp.view + +import android.os.Bundle +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import com.github.krottv.tmstemp.databinding.ItunesMusicFragmentBinding +import com.github.krottv.tmstemp.domain.AlbumModel +import com.github.krottv.tmstemp.domain.Tracks +import com.github.krottv.tmstemp.domain.TracksModel + +class ITunesMusicFragmentBinder(val fragment: ITunesMusicFragment) { + + lateinit var binding: ItunesMusicFragmentBinding + + fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = ItunesMusicFragmentBinding.inflate(inflater, container, false) + + var layoutManager = + LinearLayoutManager(fragment.requireActivity(), LinearLayoutManager.HORIZONTAL, false) + + binding.albumsRecyclerITunes.layoutManager = layoutManager + + layoutManager = + LinearLayoutManager(fragment.requireActivity()) + + binding.tracksRecyclerITunes.layoutManager = layoutManager + + return binding.root + } + + fun onDataLoaded(list: List?) { + if (list != null) + if (binding.albumsRecyclerITunes.adapter == null) + binding.albumsRecyclerITunes.adapter = AlbumsAdapter(list) + else + (binding.albumsRecyclerITunes.adapter as AlbumsAdapter).data = list + } + + fun tracksLoaded(list: TracksModel?) { + + if (list != null) { + if (binding.tracksRecyclerITunes.adapter == null) + binding.tracksRecyclerITunes.adapter = TracksAdapter(list.tracks) + else + (binding.tracksRecyclerITunes.adapter as TracksAdapter).data = list.tracks + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/view/LibraryMusicFragment.kt b/app/src/main/java/com/github/krottv/tmstemp/view/LibraryMusicFragment.kt new file mode 100644 index 0000000..1d4af43 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/view/LibraryMusicFragment.kt @@ -0,0 +1,69 @@ +package com.github.krottv.tmstemp.view + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.navigation.fragment.NavHostFragment +import androidx.navigation.fragment.findNavController +import com.github.krottv.tmstemp.R +import com.github.krottv.tmstemp.data.LibraryMusicApi +import com.github.krottv.tmstemp.data.LibraryRemoteDataSourceRetrofit +import com.github.krottv.tmstemp.domain.TracksModel +import com.github.krottv.tmstemp.presentation.AlbumsViewModel +import com.github.krottv.tmstemp.presentation.LibraryAlbumsViewModel +import com.github.krottv.tmstemp.presentation.TracksITunesViewModel +import com.github.krottv.tmstemp.presentation.TracksLibraryViewModel +import kotlinx.coroutines.launch + +class LibraryMusicFragment : Fragment() { + lateinit var viewBinder: LibraryMusicFragmentBinder + var viewModel: LibraryAlbumsViewModel = LibraryAlbumsViewModel(LibraryRemoteDataSourceRetrofit()) + var tracksLibraryViewModel: TracksLibraryViewModel = TracksLibraryViewModel(LibraryRemoteDataSourceRetrofit()) + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + viewBinder = LibraryMusicFragmentBinder(this) + + return viewBinder.onCreateView(inflater, container, savedInstanceState) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + (parentFragment as NavHostFragment).parentFragment?.view?.findViewById(R.id.iTunes)?.setOnClickListener{ + val navController = findNavController() + + val action = LibraryMusicFragmentDirections.actionLibraryMusicFragmentToITunesMusicFragment() + navController.navigate(action) + } + + viewModel.loadDataLibrary() + + lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.stateITunes.collect { + viewBinder.onDataLoaded(it) + } + } + } + + tracksLibraryViewModel.loadTracksLibrary() + + lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + tracksLibraryViewModel.stateITunes.collect { + viewBinder.tracksLoaded(it) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/view/LibraryMusicFragmentBinder.kt b/app/src/main/java/com/github/krottv/tmstemp/view/LibraryMusicFragmentBinder.kt new file mode 100644 index 0000000..abd6018 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/view/LibraryMusicFragmentBinder.kt @@ -0,0 +1,53 @@ +package com.github.krottv.tmstemp.view + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import com.github.krottv.tmstemp.databinding.LibraryMusicFragmentBinding +import com.github.krottv.tmstemp.domain.AlbumModel +import com.github.krottv.tmstemp.domain.TracksModel + +class LibraryMusicFragmentBinder (val fragment: LibraryMusicFragment) { + + lateinit var binding: LibraryMusicFragmentBinding + + fun onCreateView(inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + binding = LibraryMusicFragmentBinding.inflate(inflater, container, false) + + var layoutManager = + LinearLayoutManager(fragment.requireActivity(), LinearLayoutManager.HORIZONTAL, false) + + binding.albumsRecyclerLibrary.layoutManager = layoutManager + + layoutManager = + LinearLayoutManager(fragment.requireActivity()) + + binding.tracksRecyclerAlbum.layoutManager = layoutManager + + return binding.root + } + + fun onDataLoaded(list: List?) { + + if (list != null) + if (binding.albumsRecyclerLibrary.adapter == null) + binding.albumsRecyclerLibrary.adapter = AlbumsAdapter(list) + else + (binding.albumsRecyclerLibrary.adapter as AlbumsAdapter).data = list + } + + fun tracksLoaded(list: TracksModel?) { + + if (list != null) { + if (binding.tracksRecyclerAlbum.adapter == null) + binding.tracksRecyclerAlbum.adapter = TracksAdapter(list.tracks) + else + (binding.tracksRecyclerAlbum.adapter as TracksAdapter).data = list.tracks + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/view/MainActivity.kt b/app/src/main/java/com/github/krottv/tmstemp/view/MainActivity.kt new file mode 100644 index 0000000..b87627c --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/view/MainActivity.kt @@ -0,0 +1,18 @@ +package com.github.krottv.tmstemp.view + +import android.os.Bundle +import android.view.LayoutInflater +import androidx.appcompat.app.AppCompatActivity +import com.github.krottv.tmstemp.databinding.ActivityMainBinding + +class MainActivity : AppCompatActivity() { + + lateinit var binding: ActivityMainBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = ActivityMainBinding.inflate(LayoutInflater.from(this)) + setContentView(binding.root) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/view/TracksAdapter.kt b/app/src/main/java/com/github/krottv/tmstemp/view/TracksAdapter.kt new file mode 100644 index 0000000..c24cdba --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/view/TracksAdapter.kt @@ -0,0 +1,36 @@ +package com.github.krottv.tmstemp.view + +import android.util.Log +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import coil.load +import com.github.krottv.tmstemp.R +import com.github.krottv.tmstemp.domain.AlbumModel +import com.github.krottv.tmstemp.domain.Tracks + +class TracksAdapter(data: List) : RecyclerView.Adapter() { + + var data: List = data + set(value) { + field = value + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TracksViewHolder { + val view = LayoutInflater.from(parent.context).inflate(R.layout.item_track, parent, false) + + return TracksViewHolder(view) + } + + override fun onBindViewHolder(holder: TracksViewHolder, position: Int) { + val item = data[position] + holder.imageTrack.load(item.image) + holder.titleTrack.text = item.title + holder.textTrack.text = item.artist + } + + override fun getItemCount(): Int { + return data.size + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/view/TracksViewHolder.kt b/app/src/main/java/com/github/krottv/tmstemp/view/TracksViewHolder.kt new file mode 100644 index 0000000..020c074 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/view/TracksViewHolder.kt @@ -0,0 +1,13 @@ +package com.github.krottv.tmstemp.view + +import android.view.View +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.github.krottv.tmstemp.R + +class TracksViewHolder(view: View): RecyclerView.ViewHolder(view){ + val imageTrack = view.findViewById(R.id.imageTrack) + val titleTrack = view.findViewById(R.id.titleTrack) + val textTrack = view.findViewById(R.id.textTrack) +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index fb3f6bc..6f1d206 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context=".MainActivity"> + tools:context=".view.MainActivity"> + android:layout_height="match_parent" + tools:context=".view.MainActivity"> + app:navGraph="@navigation/itunes_library_graph" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/item_album.xml b/app/src/main/res/layout/item_album.xml index e7b6fc3..d549d2e 100644 --- a/app/src/main/res/layout/item_album.xml +++ b/app/src/main/res/layout/item_album.xml @@ -2,7 +2,7 @@ + android:layout_height="50dp"> + \ No newline at end of file diff --git a/app/src/main/res/layout/library_music_fragment.xml b/app/src/main/res/layout/library_music_fragment.xml index b6046aa..b8d448f 100644 --- a/app/src/main/res/layout/library_music_fragment.xml +++ b/app/src/main/res/layout/library_music_fragment.xml @@ -1,5 +1,6 @@ @@ -12,11 +13,12 @@ app:layout_constraintTop_toTopOf="parent" /> + \ No newline at end of file diff --git a/app/src/main/res/navigation/itunes_library_graph.xml b/app/src/main/res/navigation/itunes_library_graph.xml new file mode 100644 index 0000000..bff66a4 --- /dev/null +++ b/app/src/main/res/navigation/itunes_library_graph.xml @@ -0,0 +1,23 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index 8e0008b..2ffd182 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -1,6 +1,11 @@ + android:id="@+id/nav_graph" + app:startDestination="@id/hostFragment2"> + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 7466c0a..efc82e0 100644 --- a/build.gradle +++ b/build.gradle @@ -5,13 +5,14 @@ buildscript { } dependencies { def nav_version = "2.4.2" + classpath "org.jetbrains.kotlin:kotlin-serialization:1.6.20" classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version" } } plugins { - id 'com.android.application' version '7.1.2' apply false - id 'com.android.library' version '7.1.2' apply false + id 'com.android.application' version '7.2.0' apply false + id 'com.android.library' version '7.2.0' apply false id 'org.jetbrains.kotlin.android' version '1.6.10' apply false } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 82d65f7..5b73861 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Mar 29 11:29:37 MSK 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME From 8e99a4873edfb7b3f4ace9c8a95172d4adadf601 Mon Sep 17 00:00:00 2001 From: Nikolay Davydenko Date: Mon, 16 May 2022 01:47:49 +0300 Subject: [PATCH 3/3] 26-27 lessons homework --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 1 + .../java/com/github/krottv/tmstemp/MyApp.kt | 39 +++++++++++++++++++ .../krottv/tmstemp/data/ITunesMusicApi.kt | 15 ------- .../data/ITunesRemoteDataSourceRetrofit.kt | 14 +++---- .../krottv/tmstemp/data/LibraryMusicApi.kt | 14 ------- .../data/LibraryRemoteDataSourceRetrofit.kt | 14 +++---- .../github/krottv/tmstemp/data/MusicApi.kt | 14 +++++++ .../tmstemp/presentation/AlbumsViewModel.kt | 7 ++-- .../presentation/LibraryAlbumsViewModel.kt | 23 ----------- .../presentation/TracksLibraryViewModel.kt | 23 ----------- ...sITunesViewModel.kt => TracksViewModel.kt} | 7 ++-- .../krottv/tmstemp/view/AlbumsAdapter.kt | 10 +++++ .../tmstemp/view/ITunesMusicFragment.kt | 20 +++++----- .../tmstemp/view/LibraryMusicFragment.kt | 16 +++----- .../krottv/tmstemp/view/TracksAdapter.kt | 12 +++++- app/src/main/res/layout/activity_main.xml | 1 + app/src/main/res/layout/host_fragment.xml | 11 ++++-- app/src/main/res/layout/item_album.xml | 10 ++++- app/src/main/res/layout/item_track.xml | 15 +++++-- app/src/main/res/values-night/themes.xml | 6 +-- app/src/main/res/values/colors.xml | 3 +- app/src/main/res/values/themes.xml | 8 ++-- 23 files changed, 151 insertions(+), 134 deletions(-) create mode 100644 app/src/main/java/com/github/krottv/tmstemp/MyApp.kt delete mode 100644 app/src/main/java/com/github/krottv/tmstemp/data/ITunesMusicApi.kt delete mode 100644 app/src/main/java/com/github/krottv/tmstemp/data/LibraryMusicApi.kt create mode 100644 app/src/main/java/com/github/krottv/tmstemp/data/MusicApi.kt delete mode 100644 app/src/main/java/com/github/krottv/tmstemp/presentation/LibraryAlbumsViewModel.kt delete mode 100644 app/src/main/java/com/github/krottv/tmstemp/presentation/TracksLibraryViewModel.kt rename app/src/main/java/com/github/krottv/tmstemp/presentation/{TracksITunesViewModel.kt => TracksViewModel.kt} (78%) diff --git a/app/build.gradle b/app/build.gradle index aa3a092..4c257f0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,7 +37,7 @@ android { } dependencies { - def koin_version= "3.1.6" + def koin_version= "3.2.0" // Koin Core features implementation "io.insert-koin:koin-android:$koin_version" implementation "io.insert-koin:koin-core:$koin_version" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2814a91..00adc67 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ { ITunesRemoteDataSourceRetrofit() } + } + private val libraryModule: Module + get() = module { + factory { LibraryRemoteDataSourceRetrofit() } + } + private val viewModelModule: Module + get() = module { + viewModel { AlbumsViewModel(get()) } + viewModel { TracksViewModel(get()) } + } + + override fun onCreate() { + super.onCreate() + startKoin { + androidContext(this@MyApp) + modules(libraryModule, itunesModule, viewModelModule) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/data/ITunesMusicApi.kt b/app/src/main/java/com/github/krottv/tmstemp/data/ITunesMusicApi.kt deleted file mode 100644 index c410da3..0000000 --- a/app/src/main/java/com/github/krottv/tmstemp/data/ITunesMusicApi.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.github.krottv.tmstemp.data - -import com.github.krottv.tmstemp.domain.AlbumModel -import com.github.krottv.tmstemp.domain.Tracks -import com.github.krottv.tmstemp.domain.TracksModel -import retrofit2.http.GET -import retrofit2.http.Query - -interface ITunesMusicApi { - @GET("getITunesAlbums") - suspend fun getITunesAlbums(): List - - @GET("getITunesTrack") - suspend fun getITunesTracks(@Query("album_id") albumId: Long): TracksModel -} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/data/ITunesRemoteDataSourceRetrofit.kt b/app/src/main/java/com/github/krottv/tmstemp/data/ITunesRemoteDataSourceRetrofit.kt index de0e247..f019a0b 100644 --- a/app/src/main/java/com/github/krottv/tmstemp/data/ITunesRemoteDataSourceRetrofit.kt +++ b/app/src/main/java/com/github/krottv/tmstemp/data/ITunesRemoteDataSourceRetrofit.kt @@ -10,26 +10,26 @@ import okhttp3.MediaType.Companion.toMediaType import retrofit2.Retrofit import retrofit2.create -class ITunesRemoteDataSourceRetrofit : ITunesMusicApi { +class ITunesRemoteDataSourceRetrofit : MusicApi { - override suspend fun getITunesAlbums(): List { + override suspend fun getAlbums(): List { val retrofit = Retrofit.Builder() .baseUrl("https://us-central1-inspiry-2ee60.cloudfunctions.net/getItunesAlbums/") .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) .build() - val musicApi: ITunesMusicApi = retrofit.create() - return musicApi.getITunesAlbums() + val musicApi: MusicApi = retrofit.create() + return musicApi.getAlbums() } - override suspend fun getITunesTracks(albumId: Long): TracksModel { + override suspend fun getTracks(albumId: Long): TracksModel { val retrofit = Retrofit.Builder() .baseUrl("https://us-central1-inspiry-2ee60.cloudfunctions.net/getItunesTracks/") .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) .build() - val musicApi: ITunesMusicApi = retrofit.create() + val musicApi: MusicApi = retrofit.create() - return musicApi.getITunesTracks(1) + return musicApi.getTracks(1) } } \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/data/LibraryMusicApi.kt b/app/src/main/java/com/github/krottv/tmstemp/data/LibraryMusicApi.kt deleted file mode 100644 index 234d5c2..0000000 --- a/app/src/main/java/com/github/krottv/tmstemp/data/LibraryMusicApi.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.github.krottv.tmstemp.data - -import com.github.krottv.tmstemp.domain.AlbumModel -import com.github.krottv.tmstemp.domain.TracksModel -import retrofit2.http.GET -import retrofit2.http.Query - -interface LibraryMusicApi { - @GET("getLibraryAlbums") - suspend fun getLibraryAlbums(): List - - @GET("getLibraryTrack") - suspend fun getLibraryTracks(@Query("album_id") albumId: Long): TracksModel -} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/data/LibraryRemoteDataSourceRetrofit.kt b/app/src/main/java/com/github/krottv/tmstemp/data/LibraryRemoteDataSourceRetrofit.kt index 245f59f..ebe48e9 100644 --- a/app/src/main/java/com/github/krottv/tmstemp/data/LibraryRemoteDataSourceRetrofit.kt +++ b/app/src/main/java/com/github/krottv/tmstemp/data/LibraryRemoteDataSourceRetrofit.kt @@ -8,27 +8,27 @@ import okhttp3.MediaType.Companion.toMediaType import retrofit2.Retrofit import retrofit2.create -class LibraryRemoteDataSourceRetrofit : LibraryMusicApi { +class LibraryRemoteDataSourceRetrofit : MusicApi { - override suspend fun getLibraryAlbums(): List { + override suspend fun getAlbums(): List { val retrofit = Retrofit.Builder() .baseUrl("https://us-central1-inspiry-2ee60.cloudfunctions.net/getLibraryAlbums/") .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) .build() - val musicApi: LibraryMusicApi = retrofit.create() + val musicApi: MusicApi = retrofit.create() - return musicApi.getLibraryAlbums() + return musicApi.getAlbums() } - override suspend fun getLibraryTracks(albumId: Long): TracksModel { + override suspend fun getTracks(albumId: Long): TracksModel { val retrofit = Retrofit.Builder() .baseUrl("https://us-central1-inspiry-2ee60.cloudfunctions.net/getLibraryTracks/") .addConverterFactory(Json.asConverterFactory("application/json".toMediaType())) .build() - val musicApi: LibraryMusicApi = retrofit.create() + val musicApi: MusicApi = retrofit.create() - return musicApi.getLibraryTracks(1) + return musicApi.getTracks(1) } } \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/data/MusicApi.kt b/app/src/main/java/com/github/krottv/tmstemp/data/MusicApi.kt new file mode 100644 index 0000000..374da12 --- /dev/null +++ b/app/src/main/java/com/github/krottv/tmstemp/data/MusicApi.kt @@ -0,0 +1,14 @@ +package com.github.krottv.tmstemp.data + +import com.github.krottv.tmstemp.domain.AlbumModel +import com.github.krottv.tmstemp.domain.TracksModel +import retrofit2.http.GET +import retrofit2.http.Query + +interface MusicApi { + @GET("getAlbums") + suspend fun getAlbums(): List + + @GET("getTrack") + suspend fun getTracks(@Query("albumId") albumId: Long): TracksModel +} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/presentation/AlbumsViewModel.kt b/app/src/main/java/com/github/krottv/tmstemp/presentation/AlbumsViewModel.kt index 989c107..b996866 100644 --- a/app/src/main/java/com/github/krottv/tmstemp/presentation/AlbumsViewModel.kt +++ b/app/src/main/java/com/github/krottv/tmstemp/presentation/AlbumsViewModel.kt @@ -3,20 +3,21 @@ package com.github.krottv.tmstemp.presentation import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.github.krottv.tmstemp.data.ITunesRemoteDataSourceRetrofit +import com.github.krottv.tmstemp.data.MusicApi import com.github.krottv.tmstemp.domain.AlbumModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch -class AlbumsViewModel(val iTunesMusicApi: ITunesRemoteDataSourceRetrofit): ViewModel(){ +class AlbumsViewModel(val musicApi: MusicApi): ViewModel(){ private val _stateITunes = MutableStateFlow?>(null) val stateITunes: StateFlow?> = _stateITunes - fun loadDataITunes() { + fun loadData() { viewModelScope.launch(Dispatchers.IO) { - _stateITunes.emit(iTunesMusicApi.getITunesAlbums()) + _stateITunes.emit(musicApi.getAlbums()) } } diff --git a/app/src/main/java/com/github/krottv/tmstemp/presentation/LibraryAlbumsViewModel.kt b/app/src/main/java/com/github/krottv/tmstemp/presentation/LibraryAlbumsViewModel.kt deleted file mode 100644 index 87b9f81..0000000 --- a/app/src/main/java/com/github/krottv/tmstemp/presentation/LibraryAlbumsViewModel.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.github.krottv.tmstemp.presentation - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.github.krottv.tmstemp.data.ITunesRemoteDataSourceRetrofit -import com.github.krottv.tmstemp.data.LibraryMusicApi -import com.github.krottv.tmstemp.domain.AlbumModel -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.launch - -class LibraryAlbumsViewModel(val libraryMusicApi: LibraryMusicApi) : ViewModel() { - - private val _stateITunes = MutableStateFlow?>(null) - val stateITunes: StateFlow?> = _stateITunes - - fun loadDataLibrary() { - viewModelScope.launch(Dispatchers.IO) { - _stateITunes.emit(libraryMusicApi.getLibraryAlbums()) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/presentation/TracksLibraryViewModel.kt b/app/src/main/java/com/github/krottv/tmstemp/presentation/TracksLibraryViewModel.kt deleted file mode 100644 index 407065e..0000000 --- a/app/src/main/java/com/github/krottv/tmstemp/presentation/TracksLibraryViewModel.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.github.krottv.tmstemp.presentation - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import com.github.krottv.tmstemp.data.ITunesRemoteDataSourceRetrofit -import com.github.krottv.tmstemp.data.LibraryMusicApi -import com.github.krottv.tmstemp.data.LibraryRemoteDataSourceRetrofit -import com.github.krottv.tmstemp.domain.TracksModel -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.launch - -class TracksLibraryViewModel(val libraryMusicApi: LibraryMusicApi): ViewModel() { - private val _stateITunes = MutableStateFlow(null) - val stateITunes: StateFlow = _stateITunes - - fun loadTracksLibrary() { - viewModelScope.launch(Dispatchers.IO) { - _stateITunes.emit(libraryMusicApi.getLibraryTracks(1)) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/presentation/TracksITunesViewModel.kt b/app/src/main/java/com/github/krottv/tmstemp/presentation/TracksViewModel.kt similarity index 78% rename from app/src/main/java/com/github/krottv/tmstemp/presentation/TracksITunesViewModel.kt rename to app/src/main/java/com/github/krottv/tmstemp/presentation/TracksViewModel.kt index f0655c9..600d4be 100644 --- a/app/src/main/java/com/github/krottv/tmstemp/presentation/TracksITunesViewModel.kt +++ b/app/src/main/java/com/github/krottv/tmstemp/presentation/TracksViewModel.kt @@ -3,6 +3,7 @@ package com.github.krottv.tmstemp.presentation import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.github.krottv.tmstemp.data.ITunesRemoteDataSourceRetrofit +import com.github.krottv.tmstemp.data.MusicApi import com.github.krottv.tmstemp.domain.AlbumModel import com.github.krottv.tmstemp.domain.Tracks import com.github.krottv.tmstemp.domain.TracksModel @@ -11,13 +12,13 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch -class TracksITunesViewModel(val iTunesMusicApi: ITunesRemoteDataSourceRetrofit): ViewModel() { +class TracksViewModel(val musicApi: MusicApi): ViewModel() { private val _stateITunes = MutableStateFlow(null) val stateITunes: StateFlow = _stateITunes - fun loadTracksITunes() { + fun loadTracks() { viewModelScope.launch(Dispatchers.IO) { - _stateITunes.emit(iTunesMusicApi.getITunesTracks(1)) + _stateITunes.emit(musicApi.getTracks(1)) } } } \ No newline at end of file diff --git a/app/src/main/java/com/github/krottv/tmstemp/view/AlbumsAdapter.kt b/app/src/main/java/com/github/krottv/tmstemp/view/AlbumsAdapter.kt index 7734f49..5fc0164 100644 --- a/app/src/main/java/com/github/krottv/tmstemp/view/AlbumsAdapter.kt +++ b/app/src/main/java/com/github/krottv/tmstemp/view/AlbumsAdapter.kt @@ -1,8 +1,11 @@ package com.github.krottv.tmstemp.view +import android.graphics.Outline import android.util.Log import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup +import android.view.ViewOutlineProvider import androidx.recyclerview.widget.RecyclerView import coil.load import com.github.krottv.tmstemp.R @@ -26,6 +29,13 @@ class AlbumsAdapter(data: List): RecyclerView.Adapter) : RecyclerView.Adapter override fun onBindViewHolder(holder: TracksViewHolder, position: Int) { val item = data[position] - holder.imageTrack.load(item.image) + holder.imageTrack.load(item.image.replace("{w}", "200").replace("{h}", "200")) holder.titleTrack.text = item.title holder.textTrack.text = item.artist + + holder.imageTrack.clipToOutline = true + holder.imageTrack.outlineProvider = object: ViewOutlineProvider() { + override fun getOutline(p0: View, p1: Outline) { + p1.setRoundRect(0, 0, p0.width, p0.height, 8.0F) + } + } } override fun getItemCount(): Int { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 6f1d206..851bb24 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -13,6 +13,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" + android:background="@color/black" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/host_fragment.xml b/app/src/main/res/layout/host_fragment.xml index e613b86..8d4f6b0 100644 --- a/app/src/main/res/layout/host_fragment.xml +++ b/app/src/main/res/layout/host_fragment.xml @@ -11,7 +11,9 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="114dp" - android:layout_marginTop="39dp" + android:layout_marginTop="24dp" + android:textSize="16sp" + android:textColor="@color/grey" android:text="ITunes" app:layout_constraintEnd_toStartOf="@+id/library" app:layout_constraintHorizontal_bias="0.5" @@ -23,9 +25,11 @@ android:id="@+id/library" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="39dp" + android:layout_marginTop="24dp" android:layout_marginEnd="114dp" + android:textSize="16sp" android:text="Library" + android:textColor="@color/grey" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toEndOf="@+id/iTunes" @@ -36,8 +40,9 @@ android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="0dp" android:layout_height="0dp" - android:layout_marginTop="24dp" + android:layout_marginStart="23dp" + android:layout_marginTop="34dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/item_album.xml b/app/src/main/res/layout/item_album.xml index d549d2e..497d15f 100644 --- a/app/src/main/res/layout/item_album.xml +++ b/app/src/main/res/layout/item_album.xml @@ -2,14 +2,17 @@ @@ -18,6 +21,9 @@ android:id="@+id/albumText" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginTop="9dp" + android:textColor="@color/grey" + android:textSize="12sp" app:layout_constraintStart_toStartOf="@+id/imageAlbum" app:layout_constraintTop_toBottomOf="@+id/imageAlbum" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_track.xml b/app/src/main/res/layout/item_track.xml index 669228c..f3e65fd 100644 --- a/app/src/main/res/layout/item_track.xml +++ b/app/src/main/res/layout/item_track.xml @@ -3,12 +3,15 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="50dp"> + android:layout_height="wrap_content"> @@ -17,7 +20,10 @@ android:id="@+id/titleTrack" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="TextView" + android:layout_marginStart="14dp" + android:layout_marginTop="19dp" + android:textColor="@color/grey" + android:textSize="14sp" app:layout_constraintStart_toEndOf="@+id/imageTrack" app:layout_constraintTop_toTopOf="parent" /> @@ -25,7 +31,10 @@ android:id="@+id/textTrack" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:text="TextView" + android:layout_marginStart="14dp" + android:layout_marginTop="2dp" + android:textColor="@color/grey" + android:textSize="10sp" app:layout_constraintStart_toEndOf="@+id/imageTrack" app:layout_constraintTop_toBottomOf="@+id/titleTrack" /> \ No newline at end of file diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml index 48853ef..2e9bfbf 100644 --- a/app/src/main/res/values-night/themes.xml +++ b/app/src/main/res/values-night/themes.xml @@ -1,9 +1,9 @@ -