Skip to content

Commit

Permalink
Merge pull request #156 from icerockdev/develop
Browse files Browse the repository at this point in the history
Release 0.1.0-dev-14
  • Loading branch information
Alex009 authored Feb 26, 2020
2 parents 8291a63 + 90fe6c0 commit 6f34bc0
Show file tree
Hide file tree
Showing 15 changed files with 356 additions and 35 deletions.
7 changes: 4 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ This is a Kotlin MultiPlatform library that provides declarative UI and applicat
in common code. You can implement full application for Android and iOS only from common code with it.

## Current status
Current version - `0.1.0-dev-13`. Dev version is not tested in production tasks yet, API can be changed and
Current version - `0.1.0-dev-14`. Dev version is not tested in production tasks yet, API can be changed and
bugs may be found. But dev version is chance to test limits of API and concepts to feedback and improve lib.
We open for any feedback and ideas (go to issues or #moko at [kotlinlang.slack.com](https://kotlinlang.slack.com))!

Expand Down Expand Up @@ -220,6 +220,7 @@ val loginScreen = Theme(baseTheme) {
- 0.1.0-dev-11
- 0.1.0-dev-12
- 0.1.0-dev-13
- 0.1.0-dev-14

## Installation
root build.gradle
Expand All @@ -234,7 +235,7 @@ allprojects {
project build.gradle
```groovy
dependencies {
commonMainApi("dev.icerock.moko:widgets:0.1.0-dev-13")
commonMainApi("dev.icerock.moko:widgets:0.1.0-dev-14")
}
```

Expand All @@ -252,7 +253,7 @@ buildscript {
}
dependencies {
classpath "dev.icerock.moko.widgets:gradle-plugin:0.1.0-dev-13"
classpath "dev.icerock.moko.widgets:gradle-plugin:0.1.0-dev-14"
}
}
Expand Down
2 changes: 1 addition & 1 deletion buildSrc/src/main/kotlin/Versions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ object Versions {
}

const val kotlin = "1.3.61"
private const val mokoWidgets = "0.1.0-dev-13"
private const val mokoWidgets = "0.1.0-dev-14"
private const val mokoResources = "0.8.0"

object Plugins {
Expand Down
19 changes: 19 additions & 0 deletions sample/mpp-library/src/commonMain/kotlin/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import dev.icerock.moko.widgets.sample.InputWidgetGalleryScreen
import dev.icerock.moko.widgets.sample.ProductsSearchScreen
import dev.icerock.moko.widgets.sample.ScrollContentScreen
import dev.icerock.moko.widgets.sample.SelectGalleryScreen
import dev.icerock.moko.widgets.sample.TabsSampleScreen
import dev.icerock.moko.widgets.screen.Args
import dev.icerock.moko.widgets.screen.BaseApplication
import dev.icerock.moko.widgets.screen.Screen
Expand Down Expand Up @@ -106,6 +107,7 @@ class App() : BaseApplication() {
routes = listOf(
buildInputGalleryRouteInfo(theme, router),
buildSearchRouteInfo(theme, router),
buildTabsRouteInfo(theme, router),
SelectGalleryScreen.RouteInfo(
name = "Old Demo".desc(),
route = router.createPushRoute(oldDemo(router))
Expand Down Expand Up @@ -158,6 +160,23 @@ class App() : BaseApplication() {
)
}

private fun buildTabsRouteInfo(
theme: Theme,
router: NavigationScreen.Router
): SelectGalleryScreen.RouteInfo {
val tabsTheme = Theme(theme) {
TabsSampleScreen.configureDefaultTheme(this)
}
val tabsScreen = registerScreen(TabsSampleScreen::class) {
TabsSampleScreen(tabsTheme)
}

return SelectGalleryScreen.RouteInfo(
name = "Tabs".desc(),
route = router.createPushRoute(tabsScreen)
)
}

private fun oldDemo(
router: NavigationScreen.Router
): TypedScreenDesc<Args.Empty, LoginScreen> {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
/*
* Copyright 2020 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.moko.widgets.sample

import com.icerockdev.library.units.UserUnitWidget
import dev.icerock.moko.graphics.Color
import dev.icerock.moko.resources.desc.desc
import dev.icerock.moko.units.TableUnitItem
import dev.icerock.moko.widgets.ContainerWidget
import dev.icerock.moko.widgets.ListWidget
import dev.icerock.moko.widgets.TabsWidget
import dev.icerock.moko.widgets.constraint
import dev.icerock.moko.widgets.container
import dev.icerock.moko.widgets.core.Theme
import dev.icerock.moko.widgets.core.Widget
import dev.icerock.moko.widgets.factory.ContainerViewFactory
import dev.icerock.moko.widgets.factory.SystemTabsViewFactory
import dev.icerock.moko.widgets.linear
import dev.icerock.moko.widgets.list
import dev.icerock.moko.widgets.screen.Args
import dev.icerock.moko.widgets.screen.WidgetScreen
import dev.icerock.moko.widgets.screen.navigation.NavigationBar
import dev.icerock.moko.widgets.screen.navigation.NavigationItem
import dev.icerock.moko.widgets.style.background.Background
import dev.icerock.moko.widgets.style.background.Direction
import dev.icerock.moko.widgets.style.background.Fill
import dev.icerock.moko.widgets.style.state.SelectableState
import dev.icerock.moko.widgets.style.view.Colors
import dev.icerock.moko.widgets.style.view.PaddingValues
import dev.icerock.moko.widgets.style.view.SizeSpec
import dev.icerock.moko.widgets.style.view.TextStyle
import dev.icerock.moko.widgets.style.view.WidgetSize
import dev.icerock.moko.widgets.tabs
import dev.icerock.moko.widgets.utils.platformSpecific

class TabsSampleScreen(
private val theme: Theme
) : WidgetScreen<Args.Empty>(), NavigationItem {

override val navigationBar: NavigationBar = NavigationBar.Normal(
title = "Tabs sample".desc(),
styles = NavigationBar.Styles(
backgroundColor = backgroundColor,
tintColor = tintColor,
textStyle = TextStyle(
color = textColor
),
isShadowEnabled = false
)
)

override fun createContentWidget(): Widget<WidgetSize.Const<SizeSpec.AsParent, SizeSpec.AsParent>> {
return with(theme) {
constraint(size = WidgetSize.AsParent) {
val tabs = +tabs(size = WidgetSize.Const(SizeSpec.MatchConstraint, SizeSpec.MatchConstraint)) {
tab(
title = const("Active".desc()),
body = buildContent()
)

tab(
title = const("Done".desc()),
body = buildContent()
)
}

constraints {
tabs topToTop root.safeArea
tabs leftRightToLeftRight root
tabs bottomToBottom root.safeArea
}
}
}
}

private fun Theme.buildContent() = {
val items = List(20) {
UserUnitWidget.TableUnitItem(
theme = this@buildContent,
itemId = it.toLong(),
data = UserUnitWidget.Data(
name = "item $it",
avatarUrl = "https://i.imgur.com/cVDadwb.png",
onClick = {}
)
) as TableUnitItem
}

linear(size = WidgetSize.AsParent) {
+container(
size = WidgetSize.Const(
width = SizeSpec.AsParent,
height = SizeSpec.Exact(platformSpecific(android = 4f, ios = 2f))
)
) {}

+list(
size = WidgetSize.AsParent,
id = Ids.List,
items = const(items)
)
}
}()

object Ids {
object List : ListWidget.Id
}

companion object {
val tintColor = Color(0xD20C0AFF)
val backgroundColor = Color(0xFFFFFFFF)
val textColor = Color(0x151515FF)

fun configureDefaultTheme(theme: Theme.Builder) = with(theme) {
factory[TabsWidget.DefaultCategory] = SystemTabsViewFactory(
tabsTintColor = tintColor,
tabsBackground = Background(
fill = Fill.Solid(backgroundColor)
),
tabsPadding = platformSpecific(
android = null,
ios = PaddingValues(start = 16f, end = 16f, bottom = 16f)
),
titleColor = SelectableState(
selected = platformSpecific(android = null, ios = Colors.white),
unselected = null
)
)
factory[ContainerWidget.DefaultCategory] = ContainerViewFactory(
background = Background(
fill = Fill.Gradient(
colors = listOf(Color(0x00000000), Color(0x00000010)),
direction = Direction.BOTTOM_TOP
)
)
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
/*
* Copyright 2020 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.moko.widgets.screen

import android.content.Intent
import android.net.Uri

actual fun Screen<*>.dialPhone(phone: String) {
val context = context ?: return

val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:$phone"))
if (intent.resolveActivity(context.packageManager) == null) {
println("activity for $intent not found")
return
}

startActivity(intent)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/*
* Copyright 2020 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.moko.widgets.screen

import android.content.Intent
import android.net.Uri

actual fun Screen<*>.sendEmail(
email: String,
subject: String,
body: String
) {
val context = context ?: return

val intent = Intent(
Intent.ACTION_SENDTO,
Uri.fromParts(
"mailto",
email,
null
)
)
intent.putExtra(Intent.EXTRA_SUBJECT, subject)
intent.putExtra(Intent.EXTRA_TEXT, body)
if (intent.resolveActivity(context.packageManager) == null) {
println("email clients not found")
return
}

startActivity(Intent.createChooser(intent, email))
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@ import android.view.View
import androidx.appcompat.widget.Toolbar
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.view.ViewCompat
import androidx.fragment.app.FragmentManager
import dev.icerock.moko.widgets.screen.navigation.NavigationBar
import dev.icerock.moko.widgets.style.view.FontStyle
import dev.icerock.moko.widgets.utils.ThemeAttrs
import dev.icerock.moko.widgets.utils.dp
import dev.icerock.moko.widgets.utils.sp


Expand All @@ -29,6 +31,8 @@ fun NavigationBar.Normal.apply(
) {
toolbar.visibility = View.VISIBLE

styles?.apply(toolbar, context)

val title = title.toString(context)
toolbar.title = SpannableString(title).apply {
val size = styles?.textStyle?.size?.toFloat()?.sp(context)
Expand All @@ -48,21 +52,9 @@ fun NavigationBar.Normal.apply(
}
}

val bgColor = styles?.backgroundColor?.argb?.toInt()
?: ThemeAttrs.getPrimaryColor(context)

toolbar.setBackgroundColor(bgColor)

val fallbackTintColor = ThemeAttrs.getControlNormalColor(context)

val tintColor = styles?.tintColor?.argb?.toInt() ?: fallbackTintColor

toolbar.setTitleTextColor(tintColor)
toolbar.overflowIcon?.also { DrawableCompat.setTint(it, tintColor) }

val textColor = styles?.textStyle?.color?.argb?.toInt() ?: fallbackTintColor
toolbar.setTitleTextColor(textColor)

val backBtn = backButton
if (backBtn != null) {
toolbar.navigationIcon = ContextCompat.getDrawable(context, backBtn.icon.drawableResId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ fun NavigationBar.Search.apply(
) {
toolbar.visibility = View.VISIBLE

styles?.apply(toolbar, context)

val title = title.toString(context)
toolbar.title = SpannableString(title).apply {
val size = styles?.textStyle?.size?.toFloat()?.sp(context)
Expand All @@ -52,21 +54,9 @@ fun NavigationBar.Search.apply(
}
}

val bgColor = styles?.backgroundColor?.argb?.toInt()
?: ThemeAttrs.getPrimaryColor(context)

toolbar.setBackgroundColor(bgColor)

val fallbackTintColor = ThemeAttrs.getControlNormalColor(context)

val tintColor = styles?.tintColor?.argb?.toInt() ?: fallbackTintColor

toolbar.setTitleTextColor(tintColor)
toolbar.overflowIcon?.also { DrawableCompat.setTint(it, tintColor) }

val textColor = styles?.textStyle?.color?.argb?.toInt() ?: fallbackTintColor
toolbar.setTitleTextColor(textColor)

val backBtn = backButton
if (backBtn != null) {
toolbar.navigationIcon = ContextCompat.getDrawable(context, backBtn.icon.drawableResId)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/*
* Copyright 2020 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.moko.widgets.style

import android.content.Context
import androidx.appcompat.widget.Toolbar
import androidx.core.graphics.drawable.DrawableCompat
import androidx.core.view.ViewCompat
import dev.icerock.moko.widgets.screen.navigation.NavigationBar
import dev.icerock.moko.widgets.utils.ThemeAttrs
import dev.icerock.moko.widgets.utils.dp


fun NavigationBar.Styles.apply(
toolbar: Toolbar,
context: Context
) {
val bgColor = backgroundColor?.argb?.toInt()
?: ThemeAttrs.getPrimaryColor(context)

toolbar.setBackgroundColor(bgColor)

val fallbackTintColor = ThemeAttrs.getControlNormalColor(context)

val tintColor = tintColor?.argb?.toInt() ?: fallbackTintColor

toolbar.setTitleTextColor(tintColor)
toolbar.overflowIcon?.also { DrawableCompat.setTint(it, tintColor) }

val textColor = textStyle?.color?.argb?.toInt() ?: fallbackTintColor
toolbar.setTitleTextColor(textColor)

if (isShadowEnabled == false) {
ViewCompat.setElevation(toolbar, 0f)
} else {
// 4 points https://material.io/design/environment/elevation.html#elevation-shadows-elevation-android
ViewCompat.setElevation(toolbar, 4f.dp(context))
}
}
Loading

0 comments on commit 6f34bc0

Please sign in to comment.