Skip to content

Instantly share code, notes, and snippets.

Avatar
❤️‍🔥

Ji Sungbin jisungbin

❤️‍🔥
View GitHub Profile
View SnapshotMutablePairImpl-full.kt
fun <A, B> mutableStatePairOf(first: A, second: B): SnapshotMutablePair<A, B> {
return SnapshotMutablePairImpl(first, second)
}
fun <A, B> mutableStatePairOf(value: Pair<A, B>): SnapshotMutablePair<A, B> {
return SnapshotMutablePairImpl(value.first, value.second)
}
@Stable
interface SnapshotMutablePair<A, B> {
View constraintslayout-비권장.md
View sungbinland-study.md

안녕하세요! 성빈랜드 스터디 공지 드립니다. 성빈랜드 메인 프로젝트 개발을 시작하기 전에 한 달간 코루틴과 안드로이드 프레임워크 내부 딥다이브 스터디를 진행하려고 합니다. 평소 혼자 공부하는 편이지만 워낙 어렵고 좋은 주제인 만큼 함께 공부해 보면 좋을 거 같아 스터디원을 모집하게 됐습니다.

최신 내용은 성빈랜드 공지를 통해 확인해 주세요!

목적

이 스터디의 첫 번째 목적은 엔지니어적 관점에서 역량을 키우기 위함입니다. 또한 내부를 알고 설계하는 것과 내부를 모르고 설계하는 것에서 분명한 차이가 있음을 제가 컴포즈 내부 공부를 통해 느꼈으므로 더 좋은 안드로이드 개발을 위한 목적도 있습니다.

제가 컴포즈 내부를 공부하면서 느낀 점이 혼자서 이 많은 내용을 이해하기가 너무 어렵다는 거였습니다. 초반엔 어느 흐름을 봐야 할 지도 모르겠어서 방황하는 시간이 너무 많았습니다. 이를 극복하기 위해 제가 시도했던 일들은 제가 참고한 컴포즈 내부 레퍼런스의 작성자분과 외국 안드로이드 GDE 이신 분들, StackOverflow, kotlinlang 슬랙, 그리고 구글 컴포즈 팀에 계신 분들에게 여러 번 질문을 통해 6개월간 씨름 끝에 드디어 방향을 잡고 이해할 수 있었고, 성빈랜드에 컴포즈 내부 글을 작성할 수 있었습니다.

View dispatcher-flow.kt
open class PeopleWrapper(open val name: String, open val age: Int) {
override fun toString() = "name: $name, age: $age"
}
class MutablePeopleWrapper(name: String, age: Int) : PeopleWrapper(name, age) {
private val _name = MutableStateFlow(name)
override var name
get() = _name.value
set(value) {
_name.value = value
View Jetpack Compose A to Z table-v2.md

1. Compose 소개

  • 기존 UI 개발의 문제점

    왜 컴포즈를 써야 할까?

    • RoundImageView 만들기 위한 과정
    • 리사이클러뷰를 만들기 위한 과정
    • 상태 관리
  • 결론: UI 를 만들기 위한 모든 과정을 명시해야 해서 생산성이 저하된다.

View lookahead.kt
@file:OptIn(ExperimentalComposeUiApi::class)
@file:Suppress("unused")
@file:NoLiveLiterals
package land.sungbin.androidplayground.extension
import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.AnimationSpec
import androidx.compose.animation.core.AnimationVector2D
import androidx.compose.animation.core.Spring
View expendable-fab.kt
@file:OptIn(
ExperimentalComposeUiApi::class,
ExperimentalMaterialApi::class
)
package land.sungbin.androidplayground.snippet.animation
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.navigationBarsPadding
View coroutines
# Coroutines:
How do Kotlin coroutines work internally?
- https://medium.com/@elizarov/blocking-threads-suspending-coroutines-d33e11bf4761,
- https://medium.com/androiddevelopers/coroutines-on-android-part-i-getting-the-background-3e0e54d20bb,
- https://medium.com/androiddevelopers/coroutines-on-android-part-ii-getting-started-3bff117176dd,
- https://medium.com/androiddevelopers/coroutines-on-android-part-iii-real-work-2ba8a2ec2f45,
- https://medium.com/@patson.luk/learning-kotlin-coroutines-as-a-java-dev-part-i-a04029b6214b,
- https://medium.com/@patson.luk/learning-kotlin-coroutines-as-a-java-dev-part-ii-dfe0d468b65e,
- https://medium.com/@esocogmbh/coroutines-in-pure-java-65661a379c85.
@jisungbin
jisungbin / Jetpack-Compose-Fading-Edge.kt
Last active Mar 26, 2022
A very simple Fading Edge implementation in Jetpack Compose.
View Jetpack-Compose-Fading-Edge.kt
import android.graphics.drawable.GradientDrawable
import android.view.View
import android.view.ViewGroup.LayoutParams
import androidx.annotation.Size
import androidx.compose.foundation.gestures.FlingBehavior
import androidx.compose.foundation.gestures.ScrollableDefaults
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListScope
@jisungbin
jisungbin / README.md
Created Feb 6, 2022 — forked from Farbklex/README.md
Android: Create a signed universal APK with all dynamic feature modules included with gradle wrapper via commandline
View README.md

Android Studio doesn't automatically include dynamic feature modules when building signed release APKs. But universal APKs can be created via the bundletool and signed later.

The gradle wrapper has a task for this already. This makes creating universal APKs easier since APK creation and signing are executed with one command and no separate download of bundletool is required.

You can use packageReleaseUniversalApk with the name of your base application module (e.g.: app) to create a universal APK:

./gradlew :app:packageReleaseUniversalApk

This will however only create an unsigned APK unless you specify the signing informations in your gradle file or pass the information through the command line as shown below.