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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import org.jetbrains.kotlin.utils.addToStdlib.safeAs

plugins {
id(BuildPlugins.androidApplication)
id(BuildPlugins.kotlinAndroid)
Expand Down Expand Up @@ -43,14 +41,23 @@ android {
viewBinding {
isEnabled = true
}

}

dependencies {
implementation(Support.supportLegacy)
testImplementation(Testing.junit)
testImplementation(Testing.supportTestRule)
testImplementation(Testing.supportTestRunner)
testImplementation(Testing.robolectric)
testImplementation(Testing.mockitoKotlin2)
testImplementation(Testing.truth)
testImplementation(Testing.coroutinesTest)
testImplementation(Testing.archCoreTesting)
androidTestImplementation(Testing.supportJunitExt)
androidTestImplementation(Testing.espressoCore)


implementation(Kotlin.kotlinStd7)
implementation(Support.compat)
implementation(AndroidKts.coreKts)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package com.worldsnas.starplayer

import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4

import org.junit.Test
import org.junit.runner.RunWith

import org.junit.Assert.*

/**
* Instrumented test, which will execute on an Android device.
Expand All @@ -18,7 +16,5 @@ class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.worldsnas.starplayer", appContext.packageName)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class MusicResponse(
@Json(name = "id") val id: Long,
@Json(name = "page") val page: Long,
@Json(name = "page") val page: Long?,
@Json(name = "musicLink") val musicLink: String,
@Json(name = "artist") val artist: String,
@Json(name = "cover") val cover: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ package com.worldsnas.starplayer.di.components

import android.app.Application
import com.worldsnas.starplayer.api.WebServiceApi
import com.worldsnas.starplayer.di.modules.DispatcherModule
import com.worldsnas.starplayer.di.modules.EndPointModule
import com.worldsnas.starplayer.di.modules.NetworkModule
import dagger.BindsInstance
import dagger.Component
import kotlinx.coroutines.Dispatchers
import javax.inject.Singleton

@Component(modules = [NetworkModule::class, EndPointModule::class])
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.worldsnas.starplayer.di.components

import com.worldsnas.starplayer.di.FragmentScope
import com.worldsnas.starplayer.di.modules.DispatcherModule
import com.worldsnas.starplayer.di.modules.MusicProviderModule
import com.worldsnas.starplayer.di.modules.ViewModelModule
import com.worldsnas.starplayer.view.music_list.MusicListFragment
Expand All @@ -10,7 +11,7 @@ import dagger.Component
@FragmentScope
@Component(
dependencies = [AppComponent::class],
modules = [ViewModelModule::class, MusicProviderModule::class]
modules = [ViewModelModule::class, MusicProviderModule::class, DispatcherModule::class]
)
interface MusicListComponent {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.worldsnas.starplayer.di.modules

import com.worldsnas.starplayer.di.qualifier.DefaultDispatcher
import com.worldsnas.starplayer.di.qualifier.IoDispatcher
import com.worldsnas.starplayer.di.qualifier.MainDispatcher
import dagger.Module
import dagger.Provides
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers

@Module
object DispatcherModule {


@DefaultDispatcher
@JvmStatic
@Provides
fun providesDefaultDispatcher(): CoroutineDispatcher = Dispatchers.Default

@IoDispatcher
@JvmStatic
@Provides
fun providesIoDispatcher(): CoroutineDispatcher = Dispatchers.IO

@MainDispatcher
@JvmStatic
@Provides
fun providesMainDispatcher(): CoroutineDispatcher = Dispatchers.Main
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@ package com.worldsnas.starplayer.di.modules

import android.app.Application
import com.worldsnas.starplayer.api.WebServiceApi
import com.worldsnas.starplayer.di.qualifier.IoDispatcher
import com.worldsnas.starplayer.model.LocalMusicProvider
import com.worldsnas.starplayer.model.LocalMusicProviderImpl
import com.worldsnas.starplayer.model.MusicRepository
import com.worldsnas.starplayer.model.MusicRepositoryImpl
import dagger.Module
import dagger.Provides
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers

@Module
object MusicProviderModule {
Expand All @@ -22,7 +25,8 @@ object MusicProviderModule {
@Provides
fun provideMusicRepository(
webServiceApi: WebServiceApi,
localMusicProvider: LocalMusicProvider
localMusicProvider: LocalMusicProvider,
@IoDispatcher dispatcher: CoroutineDispatcher
): MusicRepository {
return MusicRepositoryImpl(localMusicProvider, webServiceApi)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,6 @@ abstract class ViewModelModule {
@IntoMap
@ViewModelKey(MusicListViewModel::class)
abstract fun bindMusicListViewModel(viewModel : MusicListViewModel) : ViewModel


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.worldsnas.starplayer.di.qualifier

import javax.inject.Qualifier

@Retention(AnnotationRetention.BINARY)
@Qualifier
annotation class DefaultDispatcher
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.worldsnas.starplayer.di.qualifier

import javax.inject.Qualifier

@Retention(AnnotationRetention.BINARY)
@Qualifier
annotation class IoDispatcher
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.worldsnas.starplayer.di.qualifier

import javax.inject.Qualifier

@Retention(AnnotationRetention.BINARY)
@Qualifier
annotation class MainDispatcher
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.withContext
import javax.inject.Inject

class LocalMusicProviderImpl @Inject
open class LocalMusicProviderImpl @Inject
constructor(private val contentResolver: ContentResolver) : LocalMusicProvider {


Expand All @@ -23,8 +23,8 @@ constructor(private val contentResolver: ContentResolver) : LocalMusicProvider {
private val selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"


override suspend fun getAllMusic(): List<MusicRepoModel> =
withContext(IO) {
override suspend fun getAllMusic(): List<MusicRepoModel>
{

val cursor = contentResolver.query(uri, projection, selection, null, null, null)
val musicRepoModels: ArrayList<MusicRepoModel> = ArrayList()
Expand Down Expand Up @@ -66,7 +66,7 @@ constructor(private val contentResolver: ContentResolver) : LocalMusicProvider {
} while (cursor.moveToNext())

}
musicRepoModels
return musicRepoModels
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.worldsnas.starplayer.model

import com.worldsnas.starplayer.utils.Resource

interface MusicRepository {

suspend fun getApiData(page: Int, count: Int): List<MusicRepoModel>
suspend fun getLocalData(): List<MusicRepoModel>
suspend fun getApiData(page: Int, count: Int): Resource<List<MusicRepoModel>>
suspend fun getLocalData(): Resource<List<MusicRepoModel>>

}
Original file line number Diff line number Diff line change
@@ -1,38 +1,41 @@
package com.worldsnas.starplayer.model

import com.worldsnas.starplayer.api.WebServiceApi
import com.worldsnas.starplayer.mockGetMusicsApi
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import com.worldsnas.starplayer.utils.NetworkMusicMapper
import com.worldsnas.starplayer.utils.Resource
import kotlinx.coroutines.delay
import javax.inject.Inject

class MusicRepositoryImpl @Inject constructor(
private val localMusicProvider: LocalMusicProvider,
private val webServiceApi: WebServiceApi
private val localMusicProvider: LocalMusicProvider,
private val webServiceApi: WebServiceApi
) : MusicRepository {

override suspend fun getApiData(page: Int, count: Int): List<MusicRepoModel> =
withContext(Dispatchers.IO) {
override suspend fun getApiData(page: Int, count: Int): Resource<List<MusicRepoModel>> {
return try {
val result = webServiceApi.getMusics(page, count)
if (result.isSuccessful) {
result.body()?.let {
Resource.success(NetworkMusicMapper.mapToLocalList(it))
} ?: Resource.error("unknown error", null)
} else Resource.error("unknown error", null)

val apiMusicList = mockGetMusicsApi()
// val apiMusicList = webServiceApi.getMusics(page, count)
} catch (e: Exception) {
Resource.error("unknown error", null)
}

apiMusicList.map {
}

MusicRepoModel(
it.id.toInt(),
it.name,
it.artist,
"album",
"genre",
it.musicLink
)
}!!
}

override suspend fun getLocalData(): Resource<List<MusicRepoModel>> {
return try {
Resource.success(localMusicProvider.getAllMusic())
} catch (e: Exception) {
Resource.error("unknown error", null)
}


}


override suspend fun getLocalData(): List<MusicRepoModel> =
withContext(Dispatchers.IO) {
localMusicProvider.getAllMusic()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.worldsnas.starplayer.utils

interface DataMapper<T, L> {

fun mapToLocal(data: T): L

fun mapFromLocal(data: L): T
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.worldsnas.starplayer.utils

import android.widget.Toast
import androidx.fragment.app.Fragment

fun Fragment.showToast(message: String?, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(context, message, duration).show()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.worldsnas.starplayer.utils

import com.worldsnas.starplayer.api.MusicResponse
import com.worldsnas.starplayer.model.MusicRepoModel

/**
* This class is used for converting network music response to local one
*/
object NetworkMusicMapper : DataMapper<MusicResponse, MusicRepoModel> {


override fun mapToLocal(data: MusicResponse): MusicRepoModel {
return MusicRepoModel(
data.id.toInt(),
data.name,
data.artist,
"album",
"genre",
data.musicLink
)
}

override fun mapFromLocal(data: MusicRepoModel): MusicResponse {
return MusicResponse(
data.id.toLong(),
null,
data.address,
data.artist,
data.genre,
data.title
)
}

fun mapToLocalList(list: List<MusicResponse>): List<MusicRepoModel> {
return list.map {
mapToLocal(it)
}
}
}
27 changes: 27 additions & 0 deletions app/src/main/java/com/worldsnas/starplayer/utils/Resource.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.worldsnas.starplayer.utils

data class Resource<out T>(val data: T?, val message: String?, val status: Status) {


companion object {

fun <T> success(data: T?): Resource<T> {
return Resource(data, null, Status.SUCCESS)
}

fun <T> loading(data:T?): Resource<T> {
return Resource(null, null, Status.LOADING)
}

fun <T> error(message: String?,data:T?): Resource<T> {
return Resource(null, message, Status.ERROR)
}
}


enum class Status {
SUCCESS,
ERROR,
LOADING
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.worldsnas.starplayer

import com.worldsnas.starplayer.api.MusicResponse

fun mockGetMusicsApi(): List<MusicResponse> {
fun fakeGetMusicsApi(): List<MusicResponse> {
val musics = ArrayList<MusicResponse>()
for (i: Int in 1 until 11) {
musics.add(MusicResponse(i.toLong(), i.toLong(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.worldsnas.starplayer.view

import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import kotlinx.coroutines.CoroutineDispatcher
import javax.inject.Inject
import javax.inject.Provider

Expand Down
Loading