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
12 changes: 12 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
plugins {
alias(libs.plugins.androidApplication)
alias(libs.plugins.kotlinAndroid)
alias(libs.plugins.kotlin.serialization)
id 'kotlin-parcelize'
id 'kotlin-kapt'
}

android {
Expand Down Expand Up @@ -29,6 +32,7 @@ android {
}
kotlinOptions {
jvmTarget = '17'
freeCompilerArgs = ['-XXLanguage:+PropertyParamAnnotationDefaultTargetMode']
}
buildFeatures {
viewBinding true
Expand All @@ -50,6 +54,14 @@ dependencies {
implementation libs.bundles.network
implementation libs.androidx.datastore
implementation libs.androidx.datastore.preferences
implementation libs.kotlin.serialization.json

implementation "com.google.dagger:dagger-android:2.50"
implementation "com.google.dagger:dagger-android-support:2.50"
kapt "com.google.dagger:dagger-android-processor:2.50"

implementation 'com.google.dagger:dagger:2.50'
kapt 'com.google.dagger:dagger-compiler:2.50'

testImplementation libs.junit
androidTestImplementation libs.androidx.test.ext.junit
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@
>

<application
android:name=".App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.CustomView">
<activity android:name=".MainActivity"
<activity android:name=".presentation.MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand Down
88 changes: 88 additions & 0 deletions app/src/main/assets/payload.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
{
"items": [
{
"id": 1,
"name": "Азбука Вкуса",
"amount": 1580,
"category": "Продукты",
"time": 1623318531
},
{
"id": 2,
"name": "Ригла",
"amount": 499,
"category": "Здоровье",
"time": 1623322251
},
{
"id": 3,
"name": "Пятерочка",
"amount": 129,
"category": "Продукты",
"time": 1623322371
},
{
"id": 4,
"name": "Truffo",
"amount": 4541,
"category": "Кафе и рестораны",
"time": 1623326031
},
{
"id": 5,
"name": "Simple Wine",
"amount": 1600,
"category": "Алкоголь",
"time": 1623329631
},
{
"id": 6,
"name": "Азбука Вкуса Экспресс",
"amount": 1841,
"category": "Доставка еды",
"time": 1623322371
},
{
"id": 7,
"name": "Uber",
"amount": 369,
"category": "Транспорт",
"time": 1623416031
},
{
"id": 8,
"name": "Метро",
"amount": 100,
"category": "Транспорт",
"time": 1623416211
},
{
"id": 9,
"name": "Стоматология",
"amount": 8000,
"category": "Здоровье",
"time": 1623419811
},
{
"id": 10,
"name": "Пятерочка",
"amount": 809,
"category": "Продукты",
"time": 1623419934
},
{
"id": 11,
"name": "Бассейн",
"amount": 1000,
"category": "Спорт",
"time": 1623419934
},
{
"id": 12,
"name": "Uber",
"amount": 389,
"category": "Транспорт",
"time": 1623419934
}
]
}
17 changes: 17 additions & 0 deletions app/src/main/java/otus/homework/customview/App.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package otus.homework.customview

import android.app.Application
import otus.homework.customview.di.AppComponent
import otus.homework.customview.di.DaggerAppComponent

class App: Application() {
lateinit var appComponent: AppComponent

override fun onCreate() {
super.onCreate()

appComponent = DaggerAppComponent.factory().newAppComponent(baseContext)
}
}

fun Application.getComponent() = (this as App).appComponent
11 changes: 0 additions & 11 deletions app/src/main/java/otus/homework/customview/MainActivity.kt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package otus.homework.customview.data

import otus.homework.customview.presentation.PieChartUiInfo
import javax.inject.Inject

class UiDataFakeRepoImpl @Inject constructor(
private val jsonParser: UiDataJsonParser,
private val mapper: UiDataMapper
) : UiDataRepo {
companion object {
private const val FILE_NAME = "payload.json"
}

override fun getUiData(): PieChartUiInfo = mapper.map(
data = jsonParser.parseFromAssets(
FILE_NAME
)
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package otus.homework.customview.data

import android.content.Context
import kotlinx.serialization.json.Json
import otus.homework.customview.models.PieChartData
import javax.inject.Inject

class UiDataJsonParser @Inject constructor(private val context: Context, private val json: Json) {

fun parseFromAssets(fileName: String): PieChartData {

val jsonString = context
.assets
.open(fileName)
.bufferedReader()
.use { it.readText() }

return json.decodeFromString<PieChartData>(jsonString)
}
}
43 changes: 43 additions & 0 deletions app/src/main/java/otus/homework/customview/data/UiDataMapper.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package otus.homework.customview.data

import android.graphics.Color
import otus.homework.customview.models.PieChartData
import otus.homework.customview.presentation.PieChartSpendingItem
import otus.homework.customview.presentation.PieChartUiInfo
import javax.inject.Inject

class UiDataMapper @Inject constructor() {
val colorsMap = mutableMapOf(
"Алкоголь" to Color.BLACK,
"Продукты" to Color.RED,
"Здоровье" to Color.BLUE,
"Кафе и рестораны" to Color.YELLOW,
"Доставка еды" to Color.GREEN,
"Транспорт" to Color.CYAN,
"Спорт" to Color.MAGENTA
)

fun map(data: PieChartData): PieChartUiInfo {
var allSum = 0
val generalCategorySumMap = mutableMapOf<String, Int>()

data.items.forEach { item ->
allSum += item.amount
var currentSum = generalCategorySumMap.getOrDefault(item.category, 0)
currentSum += item.amount
generalCategorySumMap.put(item.category, currentSum)
}

val uiItems = generalCategorySumMap.map { entry ->
PieChartSpendingItem(
color = colorsMap.getOrDefault(entry.key, Color.TRANSPARENT),
amount = generalCategorySumMap.getOrDefault(entry.key, 0),
total = allSum,
category = entry.key
)
}
return PieChartUiInfo(
spendingInfo = uiItems
)
}
}
7 changes: 7 additions & 0 deletions app/src/main/java/otus/homework/customview/data/UiDataRepo.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package otus.homework.customview.data

import otus.homework.customview.presentation.PieChartUiInfo

interface UiDataRepo{
fun getUiData(): PieChartUiInfo
}
17 changes: 17 additions & 0 deletions app/src/main/java/otus/homework/customview/di/AppComponent.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package otus.homework.customview.di

import android.content.Context
import dagger.BindsInstance
import dagger.Component
import otus.homework.customview.presentation.MainActivity

@Component(modules = [AppModule::class])
interface AppComponent {

fun inject(activity: MainActivity)

@Component.Factory
interface Factory{
fun newAppComponent(@BindsInstance context: Context): AppComponent
}
}
22 changes: 22 additions & 0 deletions app/src/main/java/otus/homework/customview/di/AppModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package otus.homework.customview.di

import dagger.Binds
import dagger.Module
import dagger.Provides
import kotlinx.serialization.json.Json
import otus.homework.customview.data.UiDataFakeRepoImpl
import otus.homework.customview.data.UiDataRepo

@Module
interface AppModule {

@Binds
fun bindFakeRepo(repo: UiDataFakeRepoImpl): UiDataRepo

companion object{

@Provides
fun providesJson(): Json = Json { ignoreUnknownKeys = true}

}
}
22 changes: 22 additions & 0 deletions app/src/main/java/otus/homework/customview/models/PieChartData.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package otus.homework.customview.models

import com.google.gson.annotations.SerializedName
import kotlinx.serialization.Serializable

@Serializable
data class PieChartData(
val items: List<Item>
){
@Serializable
data class Item(
@field:SerializedName("id")
val id: Int,
@field:SerializedName("amount")
val amount: Int,
@field:SerializedName("category")
val category: String,
@field:SerializedName("time")
val time: Long,
)
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package otus.homework.customview.presentation

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.google.android.material.snackbar.Snackbar
import otus.homework.customview.data.UiDataRepo
import otus.homework.customview.databinding.ActivityMainBinding
import otus.homework.customview.getComponent
import javax.inject.Inject

class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding

@Inject
lateinit var repo: UiDataRepo

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

application.getComponent().inject(this)

binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

binding.root.post {
binding.pieChart.setSegments(repo.getUiData())
binding.pieChart.setOnClickEvent { text ->

Snackbar.make(
this,
binding.root,
text,
1500
).show()

}
}
}
}
Loading