yuuuzzzin / OffOff_Android

๐Ÿ‘ฉโ€โš•๏ธ ๊ฐ„ํ˜ธ์‚ฌ, ๊ฐ„ํ˜ธ์ „๊ณตํ•™์ƒ๋“ค์„ ์œ„ํ•œ ๊ทผ๋ฌด๊ด€๋ฆฌ + ์ปค๋ฎค๋‹ˆํ‹ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๐Ÿ‘จโ€โš•๏ธ

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

OffOff_Android

๐Ÿ‘ฉโ€โš•๏ธ ๊ฐ„ํ˜ธ์‚ฌ, ๊ฐ„ํ˜ธ์ „๊ณตํ•™์ƒ๋“ค์„ ์œ„ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๐Ÿ‘จโ€โš•๏ธ

๐Ÿ”Ž Function

[Android] ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ๋Šฅ ๋ฐ ๋‚ด๋ถ€ํ…Œ์ŠคํŠธ v1.0.1-beta๊นŒ์ง€ ๊ตฌํ˜„ํ•œ ๋‚ด์šฉ

๋กœ๊ทธ์ธ ๋ฐ ํšŒ์›๊ฐ€์ž…

๋กœ๊ทธ์ธ ์ž๋™ ๋กœ๊ทธ์ธ ํšŒ์›๊ฐ€์ž…
-์Šคํ”Œ๋ž˜์‹œ๋ฐ๋กœ๊ทธ์ธ ์ž๋™๋กœ๊ทธ์ธ ํšŒ์›๊ฐ€์ž…
  • Retorofit2๋ฅผ ์ด์šฉํ•œ ์„œ๋ฒ„ ํ†ต์‹ ์œผ๋กœ ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ ๊ตฌํ˜„
  • Coroutine, LiveData, Flow๋ฅผ ์ด์šฉํ•œ ๋ฐ˜์‘ํ˜• UI
  • Shared Preferences๋กœ ํ‚ค-๊ฐ’ ํ˜•ํƒœ๋กœ Bearer token์„ ์ €์žฅํ•ด ์ž๋™ ๋กœ๊ทธ์ธ

4๊ฐœ์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ํƒญ

  • Navigation์„ ํ†ตํ•ด ๋ฐ”ํ…€ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ทฐ๋ฅผ ์ด์šฉํ•œ ํ”„๋ž˜๊ทธ๋จผํŠธ ์ „ํ™˜ ๊ฐ€๋Šฅ
  • ๋ฉ”์ธ ํ™”๋ฉด๊ณผ ์บ˜๋ฆฐ๋” ํ™”๋ฉด์€ ๊ธฐ๋Šฅ๊ณผ ๋””์ž์ธ์„ ๋ณด์™„ํ•ด ์ถ”ํ›„ ์—…๋ฐ์ดํŠธ ์˜ˆ์ •
  • ํ™˜๊ฒฝ์„ค์ • ํƒญ๋„ ๋กœ๊ทธ์•„์›ƒ ์™ธ์˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด ์—…๋ฐ์ดํŠธ ์˜ˆ์ •

๊ฒŒ์‹œํŒ ๋ฐ ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ / ์‚ญ์ œ ๋“ฑ์˜ ํ™œ๋™

๊ฒŒ์‹œํŒ ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ
๊ฒŒ์‹œ๊ธ€๋ฆฌ์ŠคํŠธ ๊ธ€์“ฐ๊ธฐ ๋‚ด๊ฒŒ์‹œ๊ธ€๊ฒฝ์šฐ
  • SwipeRefreshLayout์„ ํ†ตํ•ด swipe์‹œ ์„œ๋ฒ„์—์„œ ์ตœ์‹  ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒˆ๋กœ ๋ถˆ๋Ÿฌ์™€ ์ถœ๋ ฅ
  • ๋ฌดํ•œ ์Šคํฌ๋กค -> ์Šคํฌ๋กค์ด ์ตœํ•˜๋‹จ์— ๋„๋‹ฌํ•˜๋ฉด ๋ถˆ๋Ÿฌ์˜จ ๋งˆ์ง€๋ง‰ ๊ฒŒ์‹œ๊ธ€ ์•„์ด๋””๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ทธ ์ดํ›„์˜ ๊ฒŒ์‹œ๊ธ€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€๋กœ ๋ถˆ๋Ÿฌ์˜ด
  • ์„œ๋ฒ„์™€์˜ ํ†ต์‹  ์„ฑ๊ณต ์‘๋‹ต์„ ๋ฐ›๊ธฐ ์ „๊นŒ์ง€ ProgressBar๋ฅผ ํฌํ•จํ•œ ๋ ˆ์ด์•„์›ƒ์„ includeํ•˜๊ฑฐ๋‚˜ ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ๋„์›Œ ๋กœ๋”ฉ ํ™”๋ฉด ๊ตฌํ˜„

๊ฒŒ์‹œ๊ธ€ ๊ณต๊ฐ / ์Šคํฌ๋žฉ / ์‹ ๊ณ  ๋ฐ ๋Œ“๊ธ€

๊ฒŒ์‹œํŒ ์ข‹์•„์š” / ์Šคํฌ๋žฉ / ์‹ ๊ณ  ๋Œ“๊ธ€ ์ž‘์„ฑ ๋ฐ ์‚ญ์ œ / ์ข‹์•„์š”
๊ฒŒ์‹œ๊ธ€๊ณต๊ฐ์Šคํฌ๋žฉ์‹ ๊ณ  ๋Œ“๊ธ€์Šคํฌ๋กค๋ฐ์ข‹์•„์š”์‹ ๊ณ 
  • ๊ฒŒ์‹œ๊ธ€ ๋˜๋Š” ๋Œ“๊ธ€ ์ข‹์•„์š” ์‹œ ํ™”๋ฉด ๋‚ด ์ข‹์•„์š” ์ˆซ์ž + 1
  • ํ™”๋ฉด ์Šคํฌ๋กค ์กฐ์ž‘
object ScrollViewUtils {

    // ํ•ด๋‹น ๋ทฐ๊นŒ์ง€ ์Šคํฌ๋กค์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ด๋™
    fun NestedScrollView.smoothScrollToView(view: View, marginTop: Int = 0) {
        val y = calculateDistance(view) - marginTop
        ObjectAnimator.ofInt(this, "scrollY", y).apply {
            duration = 1000L
        }.start()
    }

    // ์Šคํฌ๋กค๋ทฐ์™€ ํ•ด๋‹น ๋ทฐ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ
    private fun NestedScrollView.calculateDistance(view: View): Int {
        return kotlin.math.abs(
            calculateView(this).top - (this.scrollY + calculateView(
                view
            ).top)
        )
    }

    // ์Šคํฌ๋ฆฐ ๋‚ด์˜ ๋ทฐ ์ ˆ๋Œ€ ์ขŒํ‘œ ๊ณ„์‚ฐ
    private fun calculateView(view: View): Rect {
        val location = IntArray(2)
        view.getLocationOnScreen(location)
        return Rect(
            location[0],
            location[1],
            location[0] + view.measuredWidth,
            location[1] + view.measuredHeight
        )
    }
}
  • ์Šคํฌ๋กค ์ด๋™ ์‹œ์—๋Š” ๋ณด์ด๊ฒŒ ํ•˜๊ณ  ์‹ถ์€ ๋Œ“๊ธ€ ๋ทฐ ์œ„์น˜๋ฅผ ๊ณ„์‚ฐํ•ด ์ ์ ˆํ•œ ์œ„์น˜๋กœ 1์ดˆ ๋™์•ˆ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ด๋™
    • ์ƒˆ๋กœ์šด ๋Œ“๊ธ€ ์ž‘์„ฑ ์‹œ ํ™”๋ฉด ๋งจ ํ•˜๋‹จ์œผ๋กœ ์Šคํฌ๋กค ์ด๋™
    • ๋Œ€๋Œ“๊ธ€์„ ๋‹ฌ๊ธฐ ์œ„ํ•œ ๋Œ“๊ธ€ ์„ ํƒ ์‹œ ์„ ํƒํ•œ ๋Œ“๊ธ€์ด ํ‚ค๋ณด๋“œ ์œ„๋กœ ๋ณด์ด๋„๋ก ์Šคํฌ๋กค ์ด๋™
    • ์ƒˆ๋กœ์šด ๋Œ€๋Œ“๊ธ€ ์ž‘์„ฑ ์‹œ ํ•ด๋‹น ๋Œ€๋Œ“๊ธ€์ด ํ™”๋ฉด์— ๋ณด์ด๋„๋ก ์Šคํฌ๋กค ์ด๋™

๊ฒŒ์‹œ๊ธ€ ๊ฒ€์ƒ‰ ๋ฐ ์ด๋ฏธ์ง€ ์›๋ณธ ๋ณด๊ธฐ

๊ฒŒ์‹œ๊ธ€ ๊ฒ€์ƒ‰ ์ด๋ฏธ์ง€ ์›๋ณธ ๋ณด๊ธฐ
๊ฒŒ์‹œ๊ธ€ ๊ฒ€์ƒ‰ ์ด๋ฏธ์ง€ ์›๋ณธ ๋ณด๊ธฐ
  • Coroutine๊ณผ Job์„ ์ด์šฉํ•ด EditTex์˜ ์‹ค์‹œ๊ฐ„ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•˜๋Š” Instant Search ๊ตฌํ˜„
    • ๋ชจ๋“  ์ฟผ๋ฆฌ์˜ ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•ด call์„ ๋ณด๋‚ด๊ณ  return์„ ๋ฐ›์œผ๋ฉด ๋™์ž‘์ด ๋ฌด๊ฑฐ์›Œ์ง€๊ณ  ์ •ํ™•ํ•œ ์ฟผ๋ฆฌ ๊ฒ€์ƒ‰์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์„ ์ˆ˜ ์žˆ์–ด์„œ rxJava์˜ debounce์™€ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋„๋ก 0.5์ดˆ ๋”œ๋ ˆ์ด๋ฅผ ์ฃผ์–ด ๋™์ž‘ ์ˆ˜ํ–‰
  • ViewPager2๋ฅผ ์ด์šฉํ•ด ๊ฒŒ์‹œ๊ธ€ ์ด๋ฏธ์ง€์˜ ์›๋ณธ ์ด๋ฏธ์ง€๋ฅผ ์Šฌ๋ผ์ด๋“œ ํ˜•ํƒœ๋กœ ์กฐํšŒ ๊ตฌํ˜„

์‚ฌ์šฉ์ž ๊ฒŒ์‹œ๊ธ€ ํ™œ๋™

  • ๋‚ด๊ฐ€ ์“ด ๊ธ€ / ๋Œ“๊ธ€ ๋‚จ๊ธด ๊ธ€ / ์Šคํฌ๋žฉํ•œ ๊ธ€ ํ™•์ธ ๊ฐ€๋Šฅ

ํ™˜๊ฒฝ์„ค์ • - ๋กœ๊ทธ์•„์›ƒ

  • ํ™˜๊ฒฝ์„ค์ • ๋‹ค๋ฅธ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๊ตฌํ˜„ ์˜ˆ์ •

+) ์บ˜๋ฆฐ๋” (๋””์ž์ธ ์ˆ˜์ • ํ•„์š”)

์Šค์ผ€์ค„ ์กฐํšŒ ๊ทผ๋ฌด ํƒ€์ž… ์ถ”๊ฐ€ ์Šค์ผ€์ค„ ํŽธ์ง‘ ๋ชจ๋“œ
์บ˜๋ฆฐ๋” ์กฐํšŒ ๊ทผ๋ฌด ํƒ€์ž… ์ถ”๊ฐ€ ์Šค์ผ€์ค„ ํŽธ์ง‘ ๋ชจ๋“œ
  • Realm์„ ์‚ฌ์šฉํ•ด ๋กœ์ปฌ DB ๊ตฌ์„ฑ
  • CalendarViewPager๋กœ ์บ˜๋ฆฐ๋” ํ™”๋ฉด ๊ตฌ์„ฑ
  • ๊ทผ๋ฌด ํƒ€์ž… ์ถ”๊ฐ€ ์‹œ, ๊ทผ๋ฌด ํƒ€์ž… ํƒ€์ดํ‹€๊ณผ ์‹œ๊ฐ„์„ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•˜๋ฉด DB์— Shift๊ฐ€ ์ €์žฅ๋˜๊ณ  ๋ฐ”๋กœ ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ ๋ทฐ์— ๋ฐ˜์˜
  • ์Šค์ผ€์ค„ ํŽธ์ง‘ ๋ชจ๋“œ์—์„œ๋Š” ํ•˜๋‹จ ๊ทผ๋ฌด ํŽธ์ง‘ ๋‹ค์ด์–ผ๋กœ๊ทธ๋ฅผ ํ†ตํ•ด ์—ฐ์†์œผ๋กœ ์Šค์ผ€์ค„ ์ถ”๊ฐ€๊ฐ€ ๊ฐ€๋Šฅ

๐Ÿ”ง App Version

targetSdkVersion 30 / minSdkVersion 21

๐Ÿ›ถ Tech Stack

๐Ÿ›๏ธ Architecture

  • MVVM

๐Ÿ“š Libraries

About

๐Ÿ‘ฉโ€โš•๏ธ ๊ฐ„ํ˜ธ์‚ฌ, ๊ฐ„ํ˜ธ์ „๊ณตํ•™์ƒ๋“ค์„ ์œ„ํ•œ ๊ทผ๋ฌด๊ด€๋ฆฌ + ์ปค๋ฎค๋‹ˆํ‹ฐ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๐Ÿ‘จโ€โš•๏ธ


Languages

Language:Kotlin 100.0%