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'