Skip to content

Commit

Permalink
Add component activity support (#83)
Browse files Browse the repository at this point in the history
  • Loading branch information
helios66 committed Apr 13, 2023
1 parent 571c746 commit 2b84e51
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 22 deletions.
4 changes: 2 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,15 @@ androidGradle = "7.4.2"
androidxActivity = "1.5.0"
androidxAppCompat = "1.3.1"
androidxCompose = "1.2.0"
androidxComposeCompiler = "1.4.2"
androidxComposeCompiler = "1.4.4"
androidxCore = "1.7.0"
androidxFragment = "1.5.0"
androidxLifecycle = "2.5.0"
androidxWork = "2.7.0"
anvil = "2.4.4"
dagger = "2.45"
kotlin = "1.8.10"
kotlinxCoroutines = "1.6.0"
kotlinxCoroutines = "1.6.4"
mavenPublish = "0.22.0"
truth = "1.1.3"
autoService = "1.0.1"
Expand Down
1 change: 1 addition & 0 deletions sample/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
</intent-filter>
</activity>
<service android:name=".MainService" />
<activity android:name=".BasicActivity"/>
</application>

</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ package com.deliveryhero.whetstone.sample
import android.content.Intent
import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.appcompat.app.AppCompatActivity
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
Expand All @@ -17,7 +19,7 @@ import com.deliveryhero.whetstone.compose.injectedViewModel
import com.deliveryhero.whetstone.sample.databinding.ActivityMainBinding
import com.deliveryhero.whetstone.viewmodel.injectedViewModel

public class MainActivity : AppCompatActivity() {
class MainActivity : AppCompatActivity() {

private val viewModel by injectedViewModel<MainViewModel>()
private val serviceIntent by lazy { Intent(this, MainService::class.java) }
Expand All @@ -26,7 +28,13 @@ public class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.composeView.setContent { MainScreen() }
binding.composeView.setContent {
MainScreen(
onClick = {
startActivity(Intent(this, BasicActivity::class.java))
}
)
}

Toast.makeText(this, viewModel.getHelloWorld(), Toast.LENGTH_SHORT).show()
startService(serviceIntent)
Expand All @@ -42,13 +50,34 @@ public class MainActivity : AppCompatActivity() {
}

@Composable
fun MainScreen(viewModel: MainViewModel = injectedViewModel()) {
fun MainScreen(
viewModel: MainViewModel = injectedViewModel(),
onClick: (() -> Unit)? = null
) {
Column(
modifier = Modifier.fillMaxSize(),
modifier = Modifier
.fillMaxSize()
.clickable { onClick?.invoke() },
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
horizontalAlignment = Alignment.CenterHorizontally,
) {
Text("Compose")
Text(text = viewModel.getHelloWorld())
}
}


class BasicActivity: ComponentActivity() {

private val viewModel by injectedViewModel<MainViewModel>()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val message = "${viewModel.getHelloWorld()} from Basic activity"
Toast.makeText(
this,
message,
Toast.LENGTH_SHORT
).show()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ import com.deliveryhero.whetstone.viewmodel.ContributesViewModel
import javax.inject.Inject

@ContributesViewModel
public class MainViewModel @Inject constructor(
class MainViewModel @Inject constructor(
private val dependency: MainDependency
) : ViewModel() {
public fun getHelloWorld(): String = dependency.getMessage("Hello world")
fun getHelloWorld(): String = dependency.getMessage("Hello world")
}

public class MainDependency @Inject constructor() {
public fun getMessage(title: String): String = "$title message!"
class MainDependency @Inject constructor() {
fun getMessage(title: String): String = "$title message!"
}
2 changes: 1 addition & 1 deletion whetstone/api/whetstone.api
Original file line number Diff line number Diff line change
Expand Up @@ -109,10 +109,10 @@ public final class com/deliveryhero/whetstone/Whetstone {
public final fun fromActivity (Landroid/app/Activity;)Ljava/lang/Object;
public final fun fromApplication (Landroid/app/Application;)Ljava/lang/Object;
public final fun initialize (Lkotlin/jvm/functions/Function0;)V
public final fun inject (Landroid/app/Activity;)V
public final fun inject (Landroid/app/Application;)V
public final fun inject (Landroid/app/Service;)V
public final fun inject (Landroid/view/View;)V
public final fun inject (Landroidx/fragment/app/FragmentActivity;)V
}

public abstract interface class com/deliveryhero/whetstone/activity/ActivityComponent {
Expand Down
1 change: 0 additions & 1 deletion whetstone/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ dependencies {
implementation(libs.androidxLifecycleSavedState)

implementation(libs.androidxCore)
implementation(libs.androidxAppCompat)
implementation(libs.androidxActivity)
api(libs.androidxFragment)

Expand Down
16 changes: 7 additions & 9 deletions whetstone/src/main/java/com/deliveryhero/whetstone/Whetstone.kt
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,12 @@ public object Whetstone {
}

/**
* Injects dependencies into the fields and methods of the given [activity].
* Injects dependencies into the fields and methods of the given [Activity].
*
* For example:
* ```
* @ContributesActivityInjector
* class CustomActivity: AppCompatActivity() {
* class CustomActivity: Activity() {
*
* @Inject lateinit var someDep: SomeDep
*
Expand All @@ -104,21 +104,19 @@ public object Whetstone {
* and the activity itself must be annotated with `@ContributesActivityInjector`
* Otherwise, those fields will be ignored, which may lead to runtime exception.
* @see [ContributesActivityInjector]
*
* This method also installs Whetstone's [FragmentFactory] into the activity's fragment manager.
* As a result, such fragments can take advantage of Whetstone's Fragment injection feature.
* @see [ContributesFragment]
* @see [installFragmentFactory]
*/
public fun inject(activity: FragmentActivity) {
public fun inject(activity: Activity) {
GlobalAndroidComponentListener.componentInjectionListener
?.onInjectStart(InjectedComponent.Activity(activity))
installFragmentFactory(activity)
if (activity is FragmentActivity) {
installFragmentFactory(activity)
}

val injector = fromActivity<ActivityComponent>(activity)
.membersInjectorMap[activity.javaClass] as? MembersInjector<Activity>

injector?.injectMembers(activity)

GlobalAndroidComponentListener.componentInjectionListener
?.onInjectFinish(InjectedComponent.Activity(activity))
}
Expand Down

0 comments on commit 2b84e51

Please sign in to comment.