Skip to content

Commit

Permalink
Support for stubbing (implements #1) (#8)
Browse files Browse the repository at this point in the history
* Stop trying to outsmart Android - use standard Intent package name args

* Mega refactor and support for stubs (fixes #1)

* Fix some bugs from refactor & add dynamic feature module to prove stubs
  • Loading branch information
cedrickcooke committed Mar 28, 2020
1 parent 690b7fd commit f57d9bb
Show file tree
Hide file tree
Showing 48 changed files with 803 additions and 495 deletions.
44 changes: 1 addition & 43 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,6 @@ allprojects {
}
// In your application build.gradle
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
// Replace "com.example.app" with the package declared at the top
// of your generated BuildConfig file.
arguments = [ "exercise.buildConfigPackage": "com.example.app" ]
}
}
}
}
dependencies {
implementation "com.github.juullabs-oss.android-exercise:annotations:$version"
kapt "com.github.juullabs-oss.android-exercise:compile:$version"
Expand All @@ -52,40 +40,10 @@ class FromActivity : AppCompatActivity() {
// ...

fun navigate() {
startActivity(YourActivityIntent(someNumber = 25))
startActivity(YourActivityIntent(this, someNumber = 25))
}
}
```
## Under the Hood

Sometimes, the easiest way to learn is to know what's happening behind the scenes.
Exercise works just like vanilla Android, using `Intent` passing and `Bundle`s.

```kotlin
class YourActivityIntent(
someNumber: Int
) : Intent() {
init {
component = ComponentName(
"com.juullabs.exercise",
"com.juullabs.exercise.activities.YourActivity"
)
replaceExtras(bundleOf(
"com.juullabs.exercise.someNumber" to someNumber
))
}
}

internal class YourActivityExtras(
private val instance: YourActivity
) {
val someNumber: Int
get() = instance.intent?.extras?.get("com.juullabs.exercise.someNumber") as Int
}

internal val YourActivity.extras: YourActivityExtras
get() = YourActivityExtras(this)
```

# License

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.juullabs.exercise.annotations

@MustBeDocumented
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
annotation class AsStub(val packageName: String, val className: String)
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ package com.juullabs.exercise.annotations

@MustBeDocumented
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
@Retention(AnnotationRetention.BINARY)
annotation class Exercise(vararg val params: ExerciseParameter)
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import kotlin.reflect.KClass
/** Actual type used by [Exercise]. Usually, use [Extra] or [Argument] aliases instead. */
@Target
@MustBeDocumented
@Retention(AnnotationRetention.SOURCE)
@Retention(AnnotationRetention.BINARY)
annotation class ExerciseParameter(
val name: String,
val type: KClass<*>,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.juullabs.exercise.annotations

import kotlin.reflect.KClass

@MustBeDocumented
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
annotation class FromStub(val source: KClass<*>)

Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ package com.juullabs.exercise.annotations

@MustBeDocumented
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
@Retention(AnnotationRetention.BINARY)
annotation class ResultContract(vararg val kinds: ResultKind)
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ package com.juullabs.exercise.annotations

@MustBeDocumented
@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
@Retention(AnnotationRetention.BINARY)
annotation class ResultKind(val name: String, vararg val params: ExerciseParameter)
14 changes: 8 additions & 6 deletions application/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -43,17 +43,19 @@ android {
kotlinOptions {
jvmTarget = "1.8"
}
dynamicFeatures = [':feature']
}

dependencies {
implementation project(":annotations")
api project(":annotations")
api "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
api 'androidx.core:core-ktx:1.2.0'
api 'androidx.appcompat:appcompat:1.1.0'
api 'androidx.activity:activity-ktx:1.2.0-alpha02'
api 'androidx.fragment:fragment-ktx:1.3.0-alpha02'
kapt project(":compile")
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
implementation 'androidx.core:core-ktx:1.2.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.activity:activity-ktx:1.2.0-alpha02'
implementation 'androidx.fragment:fragment-ktx:1.3.0-alpha02'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.annotation:annotation:1.1.0'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

Expand Down
1 change: 0 additions & 1 deletion application/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@

<activity android:name=".FragmentContainerActivity" />

<activity android:name=".activities.CalculatorChildActivity" />
<activity android:name=".activities.CalculatorParentActivity" />
<activity android:name=".activities.ListActivity" />
<activity android:name=".activities.NoExtrasActivity" />
Expand Down
16 changes: 9 additions & 7 deletions application/src/main/java/com/juullabs/exercise/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.juullabs.exercise

import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.juullabs.exercise.activities.CalculatorParentActivityIntent
Expand All @@ -23,33 +24,34 @@ class MainActivity : AppCompatActivity() {
setContentView(R.layout.activity_main)

toFragmentContainer.setOnClickListener {
startActivity(FragmentContainerActivityIntent())
startActivity(FragmentContainerActivityIntent(this))
}
toCalculatorParentActivity.setOnClickListener {
startActivity(CalculatorParentActivityIntent())
startActivity(CalculatorParentActivityIntent(this))
}
toListActivity.setOnClickListener {
val data = listOf(Datum("First"), Datum("Second"), Datum("Third"))
startActivity(ListActivityIntent(data))
startActivity(ListActivityIntent(this, data))
}
toNoExtrasActivity.setOnClickListener {
startActivity(NoExtrasActivityIntent())
startActivity(NoExtrasActivityIntent(this))
}
toOptionalActivity.setOnClickListener {
// Optionals have a default value of null.
val intent = if (Random.nextBoolean()) {
OptionalActivityIntent("Passed a value")
OptionalActivityIntent(this, "Passed a value")
} else {
OptionalActivityIntent()
OptionalActivityIntent(this)
}
startActivity(intent)
}
toStandardActivity.setOnClickListener {
startActivity(StandardActivityIntent(50))
startActivity(StandardActivityIntent(this, 50))
}
toSubclassActivity.setOnClickListener {
startActivity(
SubclassActivityIntent(
this,
superclassString = "super",
subclassString = "sub"
)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.juullabs.exercise.activities

import com.juullabs.exercise.annotations.AsStub
import com.juullabs.exercise.annotations.Exercise
import com.juullabs.exercise.annotations.Extra
import com.juullabs.exercise.annotations.ResultContract
import com.juullabs.exercise.annotations.ResultKind

@Exercise(Extra("input", Int::class))
@ResultContract(ResultKind("Ok", Extra("output", Int::class)))
@AsStub("com.juullabs.dynamicfeature", "CalculatorChildActivity")
class CalculatorChildActivityStub
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ package com.juullabs.exercise.activities

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.juullabs.dynamicfeature.CalculatorChildActivityContract
import com.juullabs.dynamicfeature.CalculatorChildActivityIntent
import com.juullabs.dynamicfeature.CalculatorChildActivityResult
import com.juullabs.exercise.R
import com.juullabs.exercise.annotations.Exercise
import kotlinx.android.synthetic.main.activity_calc_parent.initialValue11
Expand All @@ -13,7 +16,7 @@ import kotlinx.android.synthetic.main.activity_calc_parent.resultTextView
@Exercise
class CalculatorParentActivity : AppCompatActivity() {

private val calculator = prepareCall(CalculatorChildActivityContract()) { result ->
private val calculator = prepareCall(CalculatorChildActivityContract(this)) { result ->
resultTextView.text = when (result) {
null -> "Implicitly canceled"
is CalculatorChildActivityResult.Canceled -> "Explicitly canceled"
Expand All @@ -24,10 +27,9 @@ class CalculatorParentActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_calc_parent)
initialValue3.setOnClickListener { calculator.launch(CalculatorChildActivityIntent(3)) }
initialValue5.setOnClickListener { calculator.launch(CalculatorChildActivityIntent(5)) }
initialValue7.setOnClickListener { calculator.launch(CalculatorChildActivityIntent(7)) }
initialValue11.setOnClickListener { calculator.launch(CalculatorChildActivityIntent(11)) }
initialValue3.setOnClickListener { calculator.launch(CalculatorChildActivityIntent(this, 3)) }
initialValue5.setOnClickListener { calculator.launch(CalculatorChildActivityIntent(this, 5)) }
initialValue7.setOnClickListener { calculator.launch(CalculatorChildActivityIntent(this, 7)) }
initialValue11.setOnClickListener { calculator.launch(CalculatorChildActivityIntent(this, 11)) }
}

}
1 change: 1 addition & 0 deletions application/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
<resources>
<string name="app_name">Exercise Demo</string>
<string name="title_dynamic_feature">Dynamic Feature</string>
</resources>
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ allprojects {
subprojects {
// group = 'com.juullabs.exercise'
group = 'com.github.juullabs-oss.android-exercise'
version = '0.5.0'
version = '0.6.0'
}

task clean(type: Delete) {
Expand Down
1 change: 1 addition & 0 deletions compile/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ targetCompatibility = "1.8"
compileKotlin {
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs = [ "-Xopt-in=kotlin.RequiresOptIn" ]
}
}

Expand Down
Loading

0 comments on commit f57d9bb

Please sign in to comment.