Skip to content

Commit 08226c8

Browse files
committed
Do injection in base activity & fragment
1 parent 4687f05 commit 08226c8

File tree

11 files changed

+140
-25
lines changed

11 files changed

+140
-25
lines changed

app/src/main/java/cn/nekocode/gank/GankApplication.kt

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,8 @@
1717
package cn.nekocode.gank
1818

1919
import android.app.Application
20-
import android.util.Log
2120
import androidx.lifecycle.ViewModelProvider
2221
import cn.nekocode.gank.backend.di.module.ApiModule
23-
import cn.nekocode.gank.di.DaggerViewModelFactory
2422
import cn.nekocode.gank.di.component.AppComponent
2523
import cn.nekocode.gank.di.component.DaggerAppComponent
2624
import cn.nekocode.gank.di.module.AppModule
@@ -48,8 +46,6 @@ open class GankApplication : Application() {
4846

4947
if (BuildConfig.DEBUG) {
5048
Timber.plant(Timber.DebugTree())
51-
} else {
52-
Timber.plant(CrashReportingTree())
5349
}
5450
flipperClient.start()
5551
}
@@ -64,13 +60,4 @@ open class GankApplication : Application() {
6460
.apiModule(ApiModule(httpClientBuilder, gsonBuilder))
6561
.build()
6662
}
67-
68-
private class CrashReportingTree : Timber.Tree() {
69-
override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
70-
if (priority == Log.VERBOSE || priority == Log.DEBUG) {
71-
return
72-
}
73-
// Report
74-
}
75-
}
7663
}

app/src/main/java/cn/nekocode/gank/base/BaseActivity.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616

1717
package cn.nekocode.gank.base
1818

19-
import android.annotation.SuppressLint
2019
import android.os.Bundle
2120
import androidx.appcompat.app.AppCompatActivity
2221
import androidx.fragment.app.Fragment
2322
import androidx.fragment.app.FragmentActivity
2423
import androidx.lifecycle.ViewModel
2524
import androidx.lifecycle.ViewModelProviders
2625
import cn.nekocode.gank.GankApplication
26+
import cn.nekocode.gank.di.component.buildAndInject
2727
import com.evernote.android.state.StateSaver
2828
import com.uber.autodispose.*
2929
import com.uber.autodispose.android.lifecycle.AndroidLifecycleScopeProvider
@@ -34,11 +34,12 @@ import io.reactivex.parallel.ParallelFlowable
3434
/**
3535
* @author nekocode (nekocode.cn@gmail.com)
3636
*/
37-
@SuppressLint("Registered")
38-
open class BaseActivity : AppCompatActivity() {
37+
abstract class BaseActivity : AppCompatActivity() {
3938
private val scopeProvider by lazy { AndroidLifecycleScopeProvider.from(this) }
4039

4140
override fun onCreate(savedInstanceState: Bundle?) {
41+
(application as GankApplication).component
42+
.newActivityComponentBuilder().buildAndInject(this)
4243
super.onCreate(savedInstanceState)
4344
StateSaver.restoreInstanceState(this, savedInstanceState)
4445
}

app/src/main/java/cn/nekocode/gank/base/BaseFragment.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import androidx.fragment.app.FragmentActivity
2222
import androidx.lifecycle.ViewModel
2323
import androidx.lifecycle.ViewModelProviders
2424
import cn.nekocode.gank.GankApplication
25+
import cn.nekocode.gank.di.component.buildAndInject
2526
import com.evernote.android.state.StateSaver
2627
import com.uber.autodispose.*
2728
import com.uber.autodispose.android.lifecycle.AndroidLifecycleScopeProvider
@@ -32,10 +33,12 @@ import io.reactivex.parallel.ParallelFlowable
3233
/**
3334
* @author nekocode (nekocode.cn@gmail.com)
3435
*/
35-
open class BaseFragment : Fragment() {
36+
abstract class BaseFragment : Fragment() {
3637
private val scopeProvider by lazy { AndroidLifecycleScopeProvider.from(this) }
3738

3839
override fun onCreate(savedInstanceState: Bundle?) {
40+
(context?.applicationContext as GankApplication?)?.component
41+
?.newFragmentComponentBuilder()?.buildAndInject(this)
3942
super.onCreate(savedInstanceState)
4043
StateSaver.restoreInstanceState(this, savedInstanceState)
4144
}

app/src/main/java/cn/nekocode/gank/base/BaseViewModel.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,13 @@ import io.reactivex.*
2525
import io.reactivex.annotations.CheckReturnValue
2626
import io.reactivex.parallel.ParallelFlowable
2727
import io.reactivex.subjects.BehaviorSubject
28-
import timber.log.Timber
2928

3029
/**
3130
* Copied and modified from: https://github.com/uber/AutoDispose
3231
*
3332
* @author nekocode (nekocode.cn@gmail.com)
3433
*/
35-
open class BaseViewModel : ViewModel(), LifecycleScopeProvider<BaseViewModel.ViewModelEvent> {
34+
abstract class BaseViewModel : ViewModel(), LifecycleScopeProvider<BaseViewModel.ViewModelEvent> {
3635
private val lifecycleEventsDelegate = lazy { BehaviorSubject.createDefault(ViewModelEvent.CREATED) }
3736
private val lifecycleEvents by lifecycleEventsDelegate
3837

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* Copyright 2019. nekocode (nekocode.cn@gmail.com)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package cn.nekocode.gank.di
18+
19+
import javax.inject.Scope
20+
21+
/**
22+
* @author nekocode (nekocode.cn@gmail.com)
23+
*/
24+
@Scope
25+
@Retention(AnnotationRetention.RUNTIME)
26+
annotation class FragmentScope

app/src/main/java/cn/nekocode/gank/di/ViewModelDaggerHelper.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class DaggerViewModelFactory @Inject constructor(
3838
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
3939
val creator = providerMap[modelClass] ?: providerMap.entries.firstOrNull {
4040
modelClass.isAssignableFrom(it.key)
41-
}?.value ?: throw IllegalArgumentException("unknown model class $modelClass")
41+
}?.value ?: throw IllegalArgumentException("Unknown model class $modelClass")
4242
try {
4343
@Suppress("UNCHECKED_CAST")
4444
return creator.get() as T

app/src/main/java/cn/nekocode/gank/di/component/ActivityComponent.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package cn.nekocode.gank.di.component
1919
import android.app.Activity
2020
import cn.nekocode.gank.di.ActivityScope
2121
import cn.nekocode.gank.di.module.ActivityModule
22+
import cn.nekocode.gank.ui.MainActivity
2223
import dagger.Subcomponent
2324

2425
/**
@@ -32,11 +33,19 @@ import dagger.Subcomponent
3233
)
3334
interface ActivityComponent {
3435

35-
fun inject(activity: Activity)
36-
3736
@Subcomponent.Builder
3837
interface Builder {
3938
fun activityModule(module: ActivityModule): Builder
4039
fun build(): ActivityComponent
4140
}
41+
42+
fun inject(activity: MainActivity)
43+
}
44+
45+
fun ActivityComponent.Builder.buildAndInject(activity: Activity) {
46+
val component = activityModule(ActivityModule(activity)).build()
47+
48+
when (activity) {
49+
is MainActivity -> component.inject(activity)
50+
}
4251
}

app/src/main/java/cn/nekocode/gank/di/component/AppComponent.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package cn.nekocode.gank.di.component
1818

1919
import cn.nekocode.gank.GankApplication
2020
import cn.nekocode.gank.backend.di.module.ApiModule
21-
import cn.nekocode.gank.base.BaseActivity
2221
import cn.nekocode.gank.di.AppScope
2322
import cn.nekocode.gank.di.module.AppModule
2423
import cn.nekocode.gank.di.module.FlipperModule
@@ -43,5 +42,7 @@ interface AppComponent {
4342

4443
fun inject(app: GankApplication)
4544

46-
fun activityComponent(): ActivityComponent.Builder
45+
fun newActivityComponentBuilder(): ActivityComponent.Builder
46+
47+
fun newFragmentComponentBuilder(): FragmentComponent.Builder
4748
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
* Copyright 2019. nekocode (nekocode.cn@gmail.com)
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package cn.nekocode.gank.di.component
18+
19+
import androidx.fragment.app.Fragment
20+
import cn.nekocode.gank.di.FragmentScope
21+
import cn.nekocode.gank.di.module.FragmentModule
22+
import cn.nekocode.gank.ui.home.HomeFragment
23+
import cn.nekocode.gank.ui.pic.PicFragment
24+
import dagger.Subcomponent
25+
26+
/**
27+
* @author nekocode (nekocode.cn@gmail.com)
28+
*/
29+
@FragmentScope
30+
@Subcomponent(
31+
modules = [
32+
FragmentModule::class
33+
]
34+
)
35+
interface FragmentComponent {
36+
37+
@Subcomponent.Builder
38+
interface Builder {
39+
fun fragmentModule(module: FragmentModule): Builder
40+
fun build(): FragmentComponent
41+
}
42+
43+
fun inject(fragment: HomeFragment)
44+
fun inject(fragment: PicFragment)
45+
}
46+
47+
fun FragmentComponent.Builder.buildAndInject(fragment: Fragment) {
48+
val component = fragmentModule(FragmentModule(fragment)).build()
49+
50+
when (fragment) {
51+
is HomeFragment -> component.inject(fragment)
52+
is PicFragment -> component.inject(fragment)
53+
}
54+
}

app/src/main/java/cn/nekocode/gank/di/module/AppModule.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package cn.nekocode.gank.di.module
1919
import android.app.Application
2020
import cn.nekocode.gank.di.AppScope
2121
import cn.nekocode.gank.di.component.ActivityComponent
22+
import cn.nekocode.gank.di.component.FragmentComponent
2223
import dagger.Module
2324
import dagger.Provides
2425

@@ -27,7 +28,8 @@ import dagger.Provides
2728
*/
2829
@Module(
2930
subcomponents = [
30-
ActivityComponent::class
31+
ActivityComponent::class,
32+
FragmentComponent::class
3133
]
3234
)
3335
class AppModule(private val app: Application) {

0 commit comments

Comments
 (0)