Skip to content

Instantly share code, notes, and snippets.

View chao2zhang's full-sized avatar
:octocat:

Chao Zhang chao2zhang

:octocat:
View GitHub Profile
@chao2zhang
chao2zhang / LoggingLiveDataMethodVisitor.kt
Created April 8, 2021 07:07
LoggingLiveDataMethodVisitor
class LoggingLiveDataMethodVisitor(
private val methodVisitor: MethodVisitor
) : MethodVisitor(ASM9, methodVisitor) {
override fun visitMethodInsn(
opcode: Int,
owner: String?,
name: String?,
descriptor: String?,
isInterface: Boolean
@chao2zhang
chao2zhang / LoggingLiveDataClassVisitor.kt
Created April 8, 2021 06:46
LoggingLiveDataClassVisitor
class LoggingLiveDataClassVisitor(
private val classVisitor: ClassVisitor
) : ClassVisitor(ASM9, classVisitor) {
override fun visitMethod(
access: Int,
name: String?,
descriptor: String?,
signature: String?,
exceptions: Array<out String>?
@chao2zhang
chao2zhang / LoggingLiveDataTransform.kt
Created April 8, 2021 06:30
LoggingLiveDataTransform - ASM Wiring
val classReader = ClassReader(inputBytes)
val classWriter = ClassWriter(classReader, 0)
val classVisitor = LoggingLiveDataClassVisitor(classWriter)
classReader.accept(classVisitor, 0)
outputBytes = classWriter.toByteArray()
@chao2zhang
chao2zhang / LoggingLiveDataTransform.kt
Created April 8, 2021 01:06
LoggingLiveDataTransform.kt
class LoggingLiveDataTransform(private val logger: Logger) : Transform() {
override fun getName(): String = javaClass.simpleName
override fun applyToVariant(variant: VariantInfo) = variant.isDebuggable
override fun getInputTypes(): Set<QualifiedContent.ContentType> =
setOf(QualifiedContent.DefaultContentType.CLASSES)
override fun getScopes(): MutableSet<in QualifiedContent.Scope> =
@chao2zhang
chao2zhang / LoggingLiveDataPlugin.kt
Last active April 7, 2021 23:50
LoggingLiveDataPlugin
project.plugins.withType(AppPlugin::class.java) { plugin ->
project.extensions.configure(AppExtension::class.java) { appExtension ->
appExtension.registerTransform(LoggingLiveDataTransform(project.logger))
}
}
@chao2zhang
chao2zhang / MyActivity.kt
Created April 7, 2021 18:12
LoggingViewModel
viewModel.currentTime.observe(this) {
Log.d("LiveDataDebug", "observer called")
binding.time.text = it.toString()
}
@chao2zhang
chao2zhang / HomeViewModel.kt
Created April 3, 2021 00:52
Flow to LiveData - ViewModelScope
@HiltViewModel
class HomeViewModel @Inject constructor(
private val redditRepository: RedditRepository
) : ViewModel() {
private val _reddits: MutableLiveData<RedditListing> = MutableLiveData()
val reddits: LiveData<RedditListing> = _reddits
init {
viewModelScope.launch {
@chao2zhang
chao2zhang / HomeFragment.kt
Created April 2, 2021 23:26
Flow to LiveData - HomeFragment
@AndroidEntryPoint
class HomeFragment : Fragment() {
private val homeViewModel by viewModels<HomeViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.i(Constants.FLOW_TAG, "Fragment onCreate...")
}
@chao2zhang
chao2zhang / HomeViewModel.kt
Last active April 3, 2021 00:31
Flow to LiveData - HomeViewModel
@HiltViewModel
class HomeViewModel @Inject constructor(
private val redditRepository: RedditRepository
) : ViewModel() {
val reddits: LiveData<RedditListing>
get() = redditRepository.topReddits.asLiveData(context = Dispatchers.IO)
}
@chao2zhang
chao2zhang / RedditRepository.kt
Created April 2, 2021 23:23
LiveData to Flow
class RedditRepository @Inject constructor(private val redditService: RedditService) {
val topReddits: Flow<RedditListing> = flow {
Log.i(FLOW_TAG, "flow running...")
emit(redditService.top())
}
}