diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
new file mode 100644
index 00000000..632b2e0e
--- /dev/null
+++ b/.idea/codeStyles/Project.xml
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ xmlns:android
+
+ ^$
+
+
+
+
+
+
+
+
+ xmlns:.*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:id
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:name
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ name
+
+ ^$
+
+
+
+
+
+
+
+
+ style
+
+ ^$
+
+
+
+
+
+
+
+
+ .*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+
+ http://schemas.android.com/apk/res/android
+
+
+ ANDROID_ATTRIBUTE_ORDER
+
+
+
+
+
+
+ .*
+
+ .*
+
+
+ BY_NAME
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/blessedDeps.gradle b/blessedDeps.gradle
index a0b9f292..a8eac793 100644
--- a/blessedDeps.gradle
+++ b/blessedDeps.gradle
@@ -19,6 +19,7 @@ rootProject.ext {
MOCKITO_VERSION = '2.23.0'
ROBOLECTRIC_VERSION = '3.8'
TESTING_COMPILE_VERSION = '0.15'
+ MATERIAL_VERSION = '1.1.0-rc01'
deps = [
// Keep these alphabetized
@@ -32,6 +33,7 @@ rootProject.ext {
kotlinReflect : "org.jetbrains.kotlin:kotlin-reflect:$KOTLIN_VERSION",
kotlinPoet : "com.squareup:kotlinpoet:$KOTLINPOET_VERSION",
kotlinTest : "io.kotlintest:kotlintest:$KOTLIN_TEST_VERSION",
+ material : "com.google.android.material:material:$MATERIAL_VERSION",
mockitoCore : "org.mockito:mockito-core:$MOCKITO_VERSION",
mockitoAndroid : "org.mockito:mockito-android:$MOCKITO_VERSION",
robolectric : "org.robolectric:robolectric:$ROBOLECTRIC_VERSION",
diff --git a/paris-material/.gitignore b/paris-material/.gitignore
new file mode 100644
index 00000000..796b96d1
--- /dev/null
+++ b/paris-material/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/paris-material/build.gradle b/paris-material/build.gradle
new file mode 100644
index 00000000..f7931e6e
--- /dev/null
+++ b/paris-material/build.gradle
@@ -0,0 +1,53 @@
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-kapt'
+apply plugin: 'com.jakewharton.butterknife'
+
+android {
+ compileSdkVersion rootProject.COMPILE_SDK_VERSION
+
+
+ defaultConfig {
+ minSdkVersion rootProject.MIN_SDK_VERSION
+ targetSdkVersion rootProject.TARGET_SDK_VERSION
+ multiDexEnabled true
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ testOptions {
+ unitTests {
+ includeAndroidResources = true
+ }
+ }
+
+ lintOptions {
+ warningsAsErrors true
+ }
+
+}
+
+dependencies {
+ implementation deps.appcompat
+
+ api project(':paris-annotations')
+ implementation project(':paris')
+ implementation deps.material
+
+ // We use "api" here instead of "implementation" to avoid app module warnings like:
+ // "Warning: unknown enum constant AnnotationTarget.FIELD"
+ api deps.kotlin
+
+ kapt project(':paris-processor')
+
+ testImplementation deps.junit
+ testImplementation deps.kotlinTest
+ testImplementation deps.mockitoCore
+ testImplementation deps.robolectric
+
+ kaptTest project(':paris-processor')
+
+ androidTestImplementation deps.mockitoAndroid
+ androidTestImplementation deps.espresso
+}
+
+//apply from: rootProject.file('gradle/gradle-maven-push.gradle')
diff --git a/paris-material/consumer-rules.pro b/paris-material/consumer-rules.pro
new file mode 100644
index 00000000..e69de29b
diff --git a/paris-material/proguard-rules.pro b/paris-material/proguard-rules.pro
new file mode 100644
index 00000000..f1b42451
--- /dev/null
+++ b/paris-material/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/paris-material/src/androidTest/java/com/airbnb/paris/material/ExampleInstrumentedTest.kt b/paris-material/src/androidTest/java/com/airbnb/paris/material/ExampleInstrumentedTest.kt
new file mode 100644
index 00000000..38b40b94
--- /dev/null
+++ b/paris-material/src/androidTest/java/com/airbnb/paris/material/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.airbnb.paris.material
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.airbnb.paris.material.test", appContext.packageName)
+ }
+}
diff --git a/paris-material/src/main/AndroidManifest.xml b/paris-material/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..ee44507a
--- /dev/null
+++ b/paris-material/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
diff --git a/paris-material/src/main/java/com/airbnb/paris/material/proxies/MaterialButtonProxy.kt b/paris-material/src/main/java/com/airbnb/paris/material/proxies/MaterialButtonProxy.kt
new file mode 100644
index 00000000..6c96cbed
--- /dev/null
+++ b/paris-material/src/main/java/com/airbnb/paris/material/proxies/MaterialButtonProxy.kt
@@ -0,0 +1,161 @@
+package com.airbnb.paris.material.proxies
+
+import android.content.res.ColorStateList
+import android.graphics.PorterDuff
+import android.graphics.drawable.Drawable
+import android.util.Log
+import android.util.TypedValue
+import androidx.annotation.Px
+import androidx.annotation.StyleRes
+import com.airbnb.paris.annotations.AfterStyle
+import com.airbnb.paris.annotations.Attr
+import com.airbnb.paris.annotations.Styleable
+import com.airbnb.paris.material.R
+import com.airbnb.paris.material.R2
+import com.airbnb.paris.material.utils.ViewUtils
+import com.airbnb.paris.proxies.BaseProxy
+import com.airbnb.paris.styles.Style
+import com.google.android.material.button.MaterialButton
+
+@Styleable("Paris_MaterialButton")
+class MaterialButtonProxy(view: MaterialButton) : BaseProxy(view) {
+
+ private var mColors: ColorStateList? = null
+ private val defaultTextAppearance:Int = 16974317 //todo this might not be the default for every android version or phone
+ private var mTextAppearance = defaultTextAppearance
+
+ companion object{
+
+ @com.airbnb.paris.annotations.Style
+ val RED_STYLE = R.style.Widget_MaterialComponents_Button_OutlinedButton
+ }
+
+ @Attr(R2.styleable.Paris_MaterialButton_android_textColor)
+ fun setTextColor(colors: ColorStateList?) {
+ this.mColors = colors
+ }
+
+ @Attr(R2.styleable.Paris_MaterialButton_android_textAppearance)
+ fun setTextAppearance(@StyleRes textAppearance: Int) {
+ mTextAppearance = textAppearance
+ }
+
+
+ @Attr(R2.styleable.Paris_MaterialButton_backgroundTint)
+ fun setBackgroundTintList(tintList:ColorStateList?){
+ view.backgroundTintList = tintList
+
+ Log.d("MaterialProxy", "tintList: $tintList")
+
+ }
+
+ @Attr(R2.styleable.Paris_MaterialButton_backgroundTintMode)
+ fun setBackgroundTintMode(mode: Int){
+ val tintMode = ViewUtils.parseTintMode(mode, PorterDuff.Mode.SRC_IN)
+ view.backgroundTintMode = tintMode
+ }
+
+ @Attr(R2.styleable.Paris_MaterialButton_cornerRadius)
+ fun setCornerRadius(@Px cornerRadius: Int) {
+ view.cornerRadius = cornerRadius
+ }
+
+ @Attr(R2.styleable.Paris_MaterialButton_elevation)
+ fun setElevation(@Px elevation: Int){
+ view.elevation = elevation.toFloat()
+ }
+
+ @Attr(R2.styleable.Paris_MaterialButton_icon)
+ fun setIcon(icon: Drawable){
+ view.icon = icon
+ }
+
+ @Attr(R2.styleable.Paris_MaterialButton_iconSize)
+ fun setIconSize(@Px size: Int){
+ view.iconSize = size
+ }
+
+ @Attr(R2.styleable.Paris_MaterialButton_iconGravity)
+ fun setIconGravity(gravity: Int){
+ view.iconGravity = gravity
+ }
+
+ @Attr(R2.styleable.Paris_MaterialButton_iconPadding)
+ fun setIconPadding(@Px padding: Int){
+ view.iconPadding = padding
+ }
+
+ @Attr(R2.styleable.Paris_MaterialButton_iconTint)
+ fun setIconTintList(tintList:ColorStateList?){
+ view.iconTint = tintList
+ }
+
+ @Attr(R2.styleable.Paris_MaterialButton_iconTintMode)
+ fun setIconTintModeMode(mode: Int){
+ val tintMode = ViewUtils.parseTintMode(mode, PorterDuff.Mode.SRC_IN)
+ view.iconTintMode = tintMode
+ }
+
+ @Attr(R2.styleable.Paris_MaterialButton_rippleColor)
+ fun setRippleColor(ripple:ColorStateList?){
+ view.rippleColor = ripple
+
+ Log.d("MaterialProxy", "ripple: $ripple")
+
+ }
+
+ //todo add shapeAppearance & shapeAppearanceOverlay
+
+ @Attr(R2.styleable.Paris_MaterialButton_strokeColor)
+ fun setStrokeColor(strokeColor: ColorStateList?){
+ view.strokeColor = strokeColor
+
+ Log.d("MaterialProxy", "strokeColor: $strokeColor")
+ }
+
+ @Attr(R2.styleable.Paris_MaterialButton_strokeWidth)
+ fun setStrokeWidth(@Px width: Int){
+ view.strokeWidth = width
+
+ Log.d("MaterialProxy", "strokeWidth: $width")
+ }
+
+ @AfterStyle
+ fun afterStyle(@Suppress("UNUSED_PARAMETER") style: Style?) {
+ /*
+ * Material component has default textAppearance.
+ * But if we do not pass any textAppearance then
+ * android default textAppearance is set. To keep the
+ * material theme textAppearance I have checked
+ * whether it is the default android textAppearance.
+ * If it's default android textAppearance then I have
+ * assumed that user did not set the textAppearance
+ * */
+ if(mTextAppearance == defaultTextAppearance){
+
+ if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
+ view.setTextAppearance(R.style.TextAppearance_MaterialComponents_Button)
+ } else{
+ view.setTextAppearance(view.context, R.style.TextAppearance_MaterialComponents_Button)
+ }
+
+ } else{
+
+ if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
+ view.setTextAppearance(mTextAppearance)
+ } else{
+ view.setTextAppearance(view.context, mTextAppearance)
+ }
+
+ }
+
+ if(mColors == null){
+ val typedValue = TypedValue()
+ view.context.theme.resolveAttribute(R.attr.colorOnPrimary, typedValue, true)
+ view.setTextColor(typedValue.data)
+ } else{
+ view.setTextColor(mColors)
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/paris-material/src/main/java/com/airbnb/paris/material/utils/ViewUtils.kt b/paris-material/src/main/java/com/airbnb/paris/material/utils/ViewUtils.kt
new file mode 100644
index 00000000..f45154f9
--- /dev/null
+++ b/paris-material/src/main/java/com/airbnb/paris/material/utils/ViewUtils.kt
@@ -0,0 +1,18 @@
+package com.airbnb.paris.material.utils
+
+import android.graphics.PorterDuff
+
+object ViewUtils {
+
+ fun parseTintMode(value: Int, defaultMode: PorterDuff.Mode): PorterDuff.Mode {
+ return when (value) {
+ 3 -> PorterDuff.Mode.SRC_OVER
+ 5 -> PorterDuff.Mode.SRC_IN
+ 9 -> PorterDuff.Mode.SRC_ATOP
+ 14 -> PorterDuff.Mode.MULTIPLY
+ 15 -> PorterDuff.Mode.SCREEN
+ 16 -> PorterDuff.Mode.ADD
+ else -> defaultMode
+ }
+ }
+}
\ No newline at end of file
diff --git a/paris-material/src/main/res/values/attrs.xml b/paris-material/src/main/res/values/attrs.xml
new file mode 100644
index 00000000..bbca24ac
--- /dev/null
+++ b/paris-material/src/main/res/values/attrs.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/paris-material/src/main/res/values/strings.xml b/paris-material/src/main/res/values/strings.xml
new file mode 100644
index 00000000..cba67039
--- /dev/null
+++ b/paris-material/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ Paris-Material
+
diff --git a/paris-material/src/test/java/com/airbnb/paris/material/ExampleUnitTest.kt b/paris-material/src/test/java/com/airbnb/paris/material/ExampleUnitTest.kt
new file mode 100644
index 00000000..0a6369e1
--- /dev/null
+++ b/paris-material/src/test/java/com/airbnb/paris/material/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.airbnb.paris.material
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
diff --git a/sample-material/.gitignore b/sample-material/.gitignore
new file mode 100644
index 00000000..796b96d1
--- /dev/null
+++ b/sample-material/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/sample-material/build.gradle b/sample-material/build.gradle
new file mode 100644
index 00000000..3b67b0fe
--- /dev/null
+++ b/sample-material/build.gradle
@@ -0,0 +1,25 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-kapt'
+
+android {
+ compileSdkVersion rootProject.COMPILE_SDK_VERSION
+
+ defaultConfig {
+ applicationId "com.airbnb.paris.sample.material"
+ minSdkVersion rootProject.SAMPLE_MIN_SDK_VERSION
+ targetSdkVersion rootProject.TARGET_SDK_VERSION
+ }
+}
+
+dependencies {
+ implementation project(':paris')
+ implementation project(':paris-material')
+
+ implementation deps.appcompat
+ implementation deps.constraintLayout
+ implementation deps.kotlin
+ implementation deps.material
+
+ kapt project(':paris-processor')
+}
diff --git a/sample-material/proguard-rules.pro b/sample-material/proguard-rules.pro
new file mode 100644
index 00000000..f1b42451
--- /dev/null
+++ b/sample-material/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/sample-material/src/androidTest/java/com/airbnb/paris/material/sample/ExampleInstrumentedTest.kt b/sample-material/src/androidTest/java/com/airbnb/paris/material/sample/ExampleInstrumentedTest.kt
new file mode 100644
index 00000000..eef100f5
--- /dev/null
+++ b/sample-material/src/androidTest/java/com/airbnb/paris/material/sample/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package com.airbnb.paris.material.sample
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.airbnb.paris.material.sample", appContext.packageName)
+ }
+}
diff --git a/sample-material/src/main/AndroidManifest.xml b/sample-material/src/main/AndroidManifest.xml
new file mode 100644
index 00000000..8ddb7ce8
--- /dev/null
+++ b/sample-material/src/main/AndroidManifest.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sample-material/src/main/java/com/airbnb/paris/material/sample/MainActivity.kt b/sample-material/src/main/java/com/airbnb/paris/material/sample/MainActivity.kt
new file mode 100644
index 00000000..f13ee616
--- /dev/null
+++ b/sample-material/src/main/java/com/airbnb/paris/material/sample/MainActivity.kt
@@ -0,0 +1,60 @@
+package com.airbnb.paris.material.sample
+
+import android.graphics.Color
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import androidx.core.content.ContextCompat
+import androidx.core.content.res.ResourcesCompat
+import com.airbnb.paris.extensions.*
+import com.google.android.material.button.MaterialButton
+
+class MainActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_main)
+
+ val button = findViewById(R.id.parisButton)
+
+ /*
+ * After setting style from the resources file
+ * I can't add text directly to the button
+ * However I can add text using the style builder
+ * method
+ * I don't know why this happen
+ * */
+
+ /*
+ * Setting style using the style resource does not work correctly
+ * I can see the value in the corresponding methods but just
+ * don't work
+ * */
+
+ //button.style(R.style.Widget_MaterialComponents_Button_OutlinedButton)
+
+ //button.style { addRed() }
+
+ button.style {
+ text("Button")
+
+ backgroundTintRes(R.color.white)
+ backgroundTintMode(9)
+ cornerRadius(50)
+ elevationDp(0)
+ iconRes(R.drawable.app)
+ iconSizeDp(14)
+ iconGravity(MaterialButton.ICON_GRAVITY_END)
+ iconPaddingDp(23)
+ iconTintRes(R.color.colorPrimary)
+ iconTintMode(9)
+ rippleColorRes(R.color.colorPrimary)
+ strokeColorRes(R.color.colorPrimary)
+ strokeWidthDp(1)
+ textColorRes(R.color.colorPrimary)
+ //textAppearanceRes(R.style.TextAppearance_MaterialComponents_Headline1)
+ }
+
+
+ //button.text = "Kotlin"
+ }
+}
diff --git a/sample-material/src/main/res/drawable-v24/ic_launcher_foreground.xml b/sample-material/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 00000000..1f6bb290
--- /dev/null
+++ b/sample-material/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sample-material/src/main/res/drawable/app.xml b/sample-material/src/main/res/drawable/app.xml
new file mode 100644
index 00000000..076847a8
--- /dev/null
+++ b/sample-material/src/main/res/drawable/app.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sample-material/src/main/res/drawable/ic_launcher_background.xml b/sample-material/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 00000000..0d025f9b
--- /dev/null
+++ b/sample-material/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sample-material/src/main/res/layout/activity_main.xml b/sample-material/src/main/res/layout/activity_main.xml
new file mode 100644
index 00000000..c2e89590
--- /dev/null
+++ b/sample-material/src/main/res/layout/activity_main.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sample-material/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/sample-material/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 00000000..eca70cfe
--- /dev/null
+++ b/sample-material/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/sample-material/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/sample-material/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 00000000..eca70cfe
--- /dev/null
+++ b/sample-material/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/sample-material/src/main/res/mipmap-hdpi/ic_launcher.png b/sample-material/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 00000000..898f3ed5
Binary files /dev/null and b/sample-material/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/sample-material/src/main/res/mipmap-hdpi/ic_launcher_round.png b/sample-material/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 00000000..dffca360
Binary files /dev/null and b/sample-material/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/sample-material/src/main/res/mipmap-mdpi/ic_launcher.png b/sample-material/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 00000000..64ba76f7
Binary files /dev/null and b/sample-material/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/sample-material/src/main/res/mipmap-mdpi/ic_launcher_round.png b/sample-material/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 00000000..dae5e082
Binary files /dev/null and b/sample-material/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/sample-material/src/main/res/mipmap-xhdpi/ic_launcher.png b/sample-material/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 00000000..e5ed4659
Binary files /dev/null and b/sample-material/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/sample-material/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/sample-material/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 00000000..14ed0af3
Binary files /dev/null and b/sample-material/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/sample-material/src/main/res/mipmap-xxhdpi/ic_launcher.png b/sample-material/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 00000000..b0907cac
Binary files /dev/null and b/sample-material/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/sample-material/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/sample-material/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 00000000..d8ae0315
Binary files /dev/null and b/sample-material/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/sample-material/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/sample-material/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 00000000..2c18de9e
Binary files /dev/null and b/sample-material/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/sample-material/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/sample-material/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 00000000..beed3cdd
Binary files /dev/null and b/sample-material/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/sample-material/src/main/res/values/colors.xml b/sample-material/src/main/res/values/colors.xml
new file mode 100644
index 00000000..6e2581e1
--- /dev/null
+++ b/sample-material/src/main/res/values/colors.xml
@@ -0,0 +1,8 @@
+
+
+ #008577
+ #00574B
+ #D81B60
+ #fff
+ #14008577
+
diff --git a/sample-material/src/main/res/values/strings.xml b/sample-material/src/main/res/values/strings.xml
new file mode 100644
index 00000000..68ec36a7
--- /dev/null
+++ b/sample-material/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ Sample Material
+
diff --git a/sample-material/src/main/res/values/styles.xml b/sample-material/src/main/res/values/styles.xml
new file mode 100644
index 00000000..bdfe33e1
--- /dev/null
+++ b/sample-material/src/main/res/values/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/sample-material/src/test/java/com/airbnb/paris/material/sample/ExampleUnitTest.kt b/sample-material/src/test/java/com/airbnb/paris/material/sample/ExampleUnitTest.kt
new file mode 100644
index 00000000..d98acca1
--- /dev/null
+++ b/sample-material/src/test/java/com/airbnb/paris/material/sample/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package com.airbnb.paris.material.sample
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
diff --git a/settings.gradle b/settings.gradle
index 1a00c4f1..eb2eece6 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1 @@
-include ':sample', ':paris-annotations', ':paris-processor', ':paris', ':paris-test'
+include ':sample', ':paris-annotations', ':paris-processor', ':paris', ':paris-test', ':paris-material', ':sample-material'