Skip to content

Instantly share code, notes, and snippets.

View diousk's full-sized avatar

David diousk

  • Taipei
View GitHub Profile
@diousk
diousk / StoreLruFileSystem.java
Created November 8, 2018 14:40 — forked from saket/StoreLruFileSystem.java
A FileSystem for NYT-Store that uses DiskLruCache
import com.jakewharton.disklrucache.DiskLruCache;
import com.nytimes.android.external.fs3.filesystem.FileSystem;
import com.nytimes.android.external.store3.base.RecordState;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Collection;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nonnull;
@diousk
diousk / MainActivity
Created December 30, 2019 10:35
performance comparion of moshi, gson, jackson, fastjson
package com.diousk.serializationsample
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.lifecycle.lifecycleScope
import com.diousk.serializationsample.model.MockData
import com.diousk.serializationsample.model.mockDataList
import com.diousk.serializationsample.model.mockJsonString
import com.diousk.serializationsample.parser.GsonParser
class DummyFragment @Inject constructor(
private val repo: AppRepo
) : DaggerFragment() {
@Inject
lateinit var vmFactory: ViewModelProvider.Factory
private val viewModel by viewModels<DummyViewModel> { vmFactory }
// ...
}
@diousk
diousk / MainActivity.kt
Last active February 1, 2020 09:12
launch fragment with fragment factory
class MainActivity: FragmentInjectActivity() {
@Inject lateinit var fragmentFactory: FragmentFactory
override fun onCreate(savedInstanceState: Bundle?) {
supportFragmentManager.fragmentFactory = fragmentFactory
super.onCreate(savedInstanceState)
// launch fragment and add to fragmen container view
supportFragmentManager.beginTransaction()
.add<DummyFragment>(R.id.fragmentContainer)
.commit()
class DaggerFragmentFactory @Inject constructor(
private val providers: @JvmSuppressWildcards Map<Class<out Fragment>, Provider<Fragment>>
) : FragmentFactory() {
override fun instantiate(classLoader: ClassLoader, className: String): Fragment {
val fragmentClass = loadFragmentClass(classLoader, className)
val provider = providers[fragmentClass]
return provider?.get() ?: super.instantiate(classLoader, className)
}
}
@Target(
AnnotationTarget.FUNCTION,
AnnotationTarget.PROPERTY_GETTER,
AnnotationTarget.PROPERTY_SETTER
)
@Retention(AnnotationRetention.RUNTIME)
@MapKey
annotation class FragmentKey(val value: KClass<out Fragment>)
@Module
abstract class FragmentBuilder {
@Binds
abstract fun bindFragmentFactory(
factory: DaggerFragmentFactory
): FragmentFactory
}
@Module
abstract class MainBuilder {
@ContributesAndroidInjector(modules = [
ViewModelBuilder::class,
FragmentBuilder::class, // <- for injection of fragment factory
MainModule::class,
DummyBuilder::class // <- our fragment
])
abstract fun bindMainActivity(): MainActivity
}
@Module
abstract class DummyBuilder {
@ContributesAndroidInjector(modules = [DummyModule::class])
abstract fun bindDummygFragment(): DummyFragment
// put binding of fragment at this layer(not DummyModule) for parent to inject
@Binds
@IntoMap
@FragmentKey(DummyFragment::class)
abstract fun bindDummyFragment(fragment: DummyFragment): Fragment
class MainActivity : DaggerAppCompatActivity() {
@Inject lateinit var fragmentFactory: FragmentFactory
override fun onCreate(savedInstanceState: Bundle?) {
supportFragmentManager.fragmentFactory = fragmentFactory
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}