From f8e323e9ea1fcae1c08d9d117b9ba4375994503e Mon Sep 17 00:00:00 2001 From: rahul bhat Date: Tue, 11 Apr 2023 13:57:57 +0530 Subject: [PATCH] APP-1424 | Playground Support (#3) --- app/build.gradle | 5 +- .../main/java/com/navi/uitron/MainActivity.kt | 23 ---- .../main/java/com/uitron/demo/MainActivity.kt | 113 ++++++++++++++++++ .../uitron => uitron/demo}/MainApplication.kt | 3 +- .../demo}/UiTronDependencyProvider.kt | 11 +- .../com/{navi/uitron => uitron/demo}/Utils.kt | 23 +++- .../demo/navigation/UiTronDemoNavGraph.kt | 23 ++++ .../com/uitron/demo/playground/Playground.kt | 73 +++++++++++ .../main/java/com/uitron/demo/theme/Color.kt | 22 ++++ .../main/java/com/uitron/demo/theme/Shape.kt | 11 ++ .../main/java/com/uitron/demo/theme/Theme.kt | 45 +++++++ .../main/java/com/uitron/demo/theme/Type.kt | 16 +++ app/src/main/res/drawable/ultron.png | Bin 0 -> 12703 bytes build.gradle | 6 +- 14 files changed, 340 insertions(+), 34 deletions(-) delete mode 100644 app/src/main/java/com/navi/uitron/MainActivity.kt create mode 100644 app/src/main/java/com/uitron/demo/MainActivity.kt rename app/src/main/java/com/{navi/uitron => uitron/demo}/MainApplication.kt (75%) rename app/src/main/java/com/{navi/uitron => uitron/demo}/UiTronDependencyProvider.kt (97%) rename app/src/main/java/com/{navi/uitron => uitron/demo}/Utils.kt (63%) create mode 100644 app/src/main/java/com/uitron/demo/navigation/UiTronDemoNavGraph.kt create mode 100644 app/src/main/java/com/uitron/demo/playground/Playground.kt create mode 100644 app/src/main/java/com/uitron/demo/theme/Color.kt create mode 100644 app/src/main/java/com/uitron/demo/theme/Shape.kt create mode 100644 app/src/main/java/com/uitron/demo/theme/Theme.kt create mode 100644 app/src/main/java/com/uitron/demo/theme/Type.kt create mode 100644 app/src/main/res/drawable/ultron.png diff --git a/app/build.gradle b/app/build.gradle index 4f55a2e..759b83c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,11 +4,11 @@ plugins { } android { - namespace 'com.navi' + namespace 'com.uitron.demo' compileSdk 32 defaultConfig { - applicationId "com.navi" + applicationId "com.uitron.demo" minSdk 21 targetSdk 32 versionCode 1 @@ -63,4 +63,5 @@ dependencies { testImplementation "junit:junit:4.13.2" androidTestImplementation "androidx.test.ext:junit:1.1.4" androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + implementation "androidx.navigation:navigation-compose:$nav_version" } \ No newline at end of file diff --git a/app/src/main/java/com/navi/uitron/MainActivity.kt b/app/src/main/java/com/navi/uitron/MainActivity.kt deleted file mode 100644 index 98a0b99..0000000 --- a/app/src/main/java/com/navi/uitron/MainActivity.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.navi.uitron - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import com.google.gson.reflect.TypeToken -import com.navi.uitron.model.UiTronResponse -import com.navi.uitron.render.UiTronRenderer -import com.navi.uitron.viewmodel.UiTronViewModel - -class MainActivity : ComponentActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - val type = object : TypeToken() {}.type - val response = mockApiResponse(this, type, "mock") - setContent { - UiTronRenderer( - response.data, - UiTronViewModel() - ).Render(composeViews = response.parentComposeView!!) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/uitron/demo/MainActivity.kt b/app/src/main/java/com/uitron/demo/MainActivity.kt new file mode 100644 index 0000000..afbd132 --- /dev/null +++ b/app/src/main/java/com/uitron/demo/MainActivity.kt @@ -0,0 +1,113 @@ +package com.uitron.demo + +import UiTronDemoNavGraph +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.animation.Animatable +import androidx.compose.animation.core.tween +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.navigation.NavHostController +import androidx.navigation.compose.rememberNavController +import com.demo.uitron.theme.PurpleDCD1F4 +import com.uitron.demo.theme.UiTronTheme + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + UiTronTheme { + val navController = rememberNavController() + UiTronDemoNavGraph(navController = navController) + } + } + } +} + +@Composable +fun HomeScreen(navHostController: NavHostController) { + Column(modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(top = 42.dp), + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically + ) { + Image( + painter = painterResource(id = R.drawable.ultron), + contentDescription = null, + modifier = Modifier + .height(40.dp) + .width(40.dp), + colorFilter = ColorFilter.tint(color = Color.DarkGray) + ) + Spacer(modifier = Modifier.width(10.dp)) + Text( + text = "UiTron", + fontWeight = FontWeight(800), + fontStyle = FontStyle.Italic, + fontSize = 32.sp + ) + } + Text( + text = "I had hard-codings, but now I'm free. \nThere are no hard-codings on me...", + fontWeight = FontWeight(600), + fontStyle = FontStyle.Italic, + modifier = Modifier.padding(20.dp) + ) + LazyVerticalGrid(columns = GridCells.Fixed(2), modifier = Modifier.padding(20.dp)) { + items(count = 1) { + PlaygroundBubble(navHostController) + } + } + } +} + +@Composable +fun PlaygroundBubble(navHostController: NavHostController) { + val color = remember { Animatable(PurpleDCD1F4) } + LaunchedEffect(Unit) { + color.animateTo(Color.White, animationSpec = tween(1000)) + color.animateTo(PurpleDCD1F4, animationSpec = tween(1000)) + } + Box( + modifier = Modifier + .width(60.dp) + .height(400.dp) + .background(color.value, shape = RoundedCornerShape(16.dp)) + .clickable { + navHostController.navigate("playground") + }, contentAlignment = Alignment.Center + ) { + Text(text = "Playground", fontSize = 22.sp, fontWeight = FontWeight(800)) + } +} + +@Preview(showBackground = true) +@Composable +fun DefaultPreview() { + UiTronTheme { + HomeScreen(rememberNavController()) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navi/uitron/MainApplication.kt b/app/src/main/java/com/uitron/demo/MainApplication.kt similarity index 75% rename from app/src/main/java/com/navi/uitron/MainApplication.kt rename to app/src/main/java/com/uitron/demo/MainApplication.kt index 94627b0..bb7c677 100644 --- a/app/src/main/java/com/navi/uitron/MainApplication.kt +++ b/app/src/main/java/com/uitron/demo/MainApplication.kt @@ -1,6 +1,7 @@ -package com.navi.uitron +package com.uitron.demo import android.app.Application +import com.navi.uitron.UiTronSdkManager class MainApplication: Application() { diff --git a/app/src/main/java/com/navi/uitron/UiTronDependencyProvider.kt b/app/src/main/java/com/uitron/demo/UiTronDependencyProvider.kt similarity index 97% rename from app/src/main/java/com/navi/uitron/UiTronDependencyProvider.kt rename to app/src/main/java/com/uitron/demo/UiTronDependencyProvider.kt index e64afde..1d56b52 100644 --- a/app/src/main/java/com/navi/uitron/UiTronDependencyProvider.kt +++ b/app/src/main/java/com/uitron/demo/UiTronDependencyProvider.kt @@ -1,8 +1,9 @@ -package com.navi.uitron +package com.uitron.demo import androidx.compose.ui.text.font.Font import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight +import com.navi.uitron.IUiTronDependencyProvider import com.navi.uitron.utils.EMPTY import com.navi.uitron.utils.SPACE @@ -50,13 +51,13 @@ class UiTronDependencyProvider : IUiTronDependencyProvider { IUiTronDependencyProvider.FontWeightEnum.ROBOTO_BOLD.name, - IUiTronDependencyProvider.FontWeightEnum.TT_MEDIUM.name -> com.navi.R.font.tt_medium + IUiTronDependencyProvider.FontWeightEnum.TT_MEDIUM.name -> R.font.tt_medium - IUiTronDependencyProvider.FontWeightEnum.TT_BOLD.name -> com.navi.R.font.tt_bold + IUiTronDependencyProvider.FontWeightEnum.TT_BOLD.name -> R.font.tt_bold - IUiTronDependencyProvider.FontWeightEnum.TT_SEMI_BOLD.name -> com.navi.R.font.tt_semi_bold + IUiTronDependencyProvider.FontWeightEnum.TT_SEMI_BOLD.name -> R.font.tt_semi_bold - else -> com.navi.R.font.tt_regular + else -> R.font.tt_regular } override fun getFontWeight(fontWeight: String?): FontWeight { diff --git a/app/src/main/java/com/navi/uitron/Utils.kt b/app/src/main/java/com/uitron/demo/Utils.kt similarity index 63% rename from app/src/main/java/com/navi/uitron/Utils.kt rename to app/src/main/java/com/uitron/demo/Utils.kt index 32f5eff..cb12ddc 100644 --- a/app/src/main/java/com/navi/uitron/Utils.kt +++ b/app/src/main/java/com/uitron/demo/Utils.kt @@ -1,13 +1,15 @@ -package com.navi.uitron +package com.uitron.demo import android.content.Context import com.google.gson.GsonBuilder import com.google.gson.JsonObject import com.google.gson.JsonParser +import com.google.gson.reflect.TypeToken import com.navi.uitron.deserializer.ComposePropertyDeserializer import com.navi.uitron.deserializer.UiTronApiDeserializer import com.navi.uitron.deserializer.UiTronDataDeserializer import com.navi.uitron.deserializer.UiTronValidationDeserializer +import com.navi.uitron.model.UiTronResponse import com.navi.uitron.model.action.MakeApiAction import com.navi.uitron.model.data.UiTronData import com.navi.uitron.model.ui.BaseProperty @@ -16,7 +18,7 @@ import java.lang.reflect.Type import java.nio.charset.StandardCharsets fun mockApiResponse(context: Context, type: Type, jsonKey: String): T { - val inputStream = context.resources.openRawResource(com.navi.R.raw.mock) + val inputStream = context.resources.openRawResource(R.raw.mock) val dataString = String(inputStream.readBytes(), StandardCharsets.UTF_8) val jsonElement = (JsonParser.parseString(dataString) as? JsonObject)?.get(jsonKey) val customGson = @@ -28,3 +30,20 @@ fun mockApiResponse(context: Context, type: Type, jsonKey: String): T { .create() return customGson.fromJson(jsonElement, type) } + +fun stringToUiTronResponse(rawString: String): UiTronResponse { + val jsonElement = (JsonParser.parseString(rawString) as? JsonObject) + val type = object : TypeToken() {}.type + val customGson = GsonBuilder().registerTypeAdapter( + UiTronData::class.java, + UiTronDataDeserializer() + ).registerTypeAdapter( + BaseProperty::class.java, + ComposePropertyDeserializer() + ) + .registerTypeAdapter( + MakeApiAction::class.java, + UiTronApiDeserializer() + ).create() + return customGson.fromJson(jsonElement, type) +} diff --git a/app/src/main/java/com/uitron/demo/navigation/UiTronDemoNavGraph.kt b/app/src/main/java/com/uitron/demo/navigation/UiTronDemoNavGraph.kt new file mode 100644 index 0000000..40b88ca --- /dev/null +++ b/app/src/main/java/com/uitron/demo/navigation/UiTronDemoNavGraph.kt @@ -0,0 +1,23 @@ +import androidx.compose.runtime.Composable +import androidx.navigation.NavHostController +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import com.uitron.demo.HomeScreen +import com.uitron.demo.playground.PlayGroundScreen + +@Composable +fun UiTronDemoNavGraph(navController: NavHostController) { + NavHost( + navController = navController, + startDestination = "home" + ) { + composable(route = "home") { + HomeScreen(navController) + } + + composable(route = "playground") { + PlayGroundScreen() + } + } +} + diff --git a/app/src/main/java/com/uitron/demo/playground/Playground.kt b/app/src/main/java/com/uitron/demo/playground/Playground.kt new file mode 100644 index 0000000..0666903 --- /dev/null +++ b/app/src/main/java/com/uitron/demo/playground/Playground.kt @@ -0,0 +1,73 @@ +package com.uitron.demo.playground + +import androidx.compose.foundation.layout.* +import androidx.compose.material.OutlinedTextField +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import com.navi.uitron.model.UiTronResponse +import com.navi.uitron.render.UiTronRenderer +import com.uitron.demo.stringToUiTronResponse +import com.uitron.demo.theme.UiTronTheme +import com.navi.uitron.viewmodel.UiTronViewModel +import java.lang.Exception + +/** + * Copyright © 2021 by Navi Technologies Private Limited + * All rights reserved. Strictly confidential + */ +@Composable +fun PlayGroundScreen() { + val fieldValue = remember { + mutableStateOf( + "" + ) + } + Column( + modifier = Modifier + .fillMaxSize() + .padding(20.dp) + ) { + OutlinedTextField( + value = fieldValue.value, onValueChange = { newValue -> + fieldValue.value = newValue + }, modifier = Modifier + .fillMaxWidth() + .height(200.dp) + ) + Spacer(modifier = Modifier.height(20.dp)) + Column( + modifier = Modifier + .fillMaxWidth() + .fillMaxSize() + ) { + if (fieldValue.value.isEmpty().not()) { + val uiTronResponse: UiTronResponse? = try { + stringToUiTronResponse(rawString = fieldValue.value) + } catch (e: Exception) { + null + } + uiTronResponse?.let { + UiTronRenderer(uiTronResponse.data, uiTronViewModel = UiTronViewModel()) + .Render(composeViews = uiTronResponse.parentComposeView.orEmpty()) + } ?: kotlin.run { + Text(text = "Error In Config", color = Color.Red) + } + } + } + } + +} + +@Preview(showBackground = true) +@Composable +fun DefaultPreview() { + UiTronTheme { + PlayGroundScreen() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/uitron/demo/theme/Color.kt b/app/src/main/java/com/uitron/demo/theme/Color.kt new file mode 100644 index 0000000..f391da6 --- /dev/null +++ b/app/src/main/java/com/uitron/demo/theme/Color.kt @@ -0,0 +1,22 @@ +package com.demo.uitron.theme + +import androidx.compose.ui.graphics.Color + +val Purple200 = Color(0xFFBB86FC) +val Purple500 = Color(0xFF6200EE) +val Purple700 = Color(0xFF3700B3) +val Teal200 = Color(0xFF03DAC5) +val NaviRed = Color(0xFFFF5732) +val DividerGray = Color(0x1A000000) +val NaviBlack = Color(0xFF1A1A1A) +val NaviGray = Color(0xFFA3A3AB) +val Purple4B4968 = Color(0xFF4B4968) +val Green14BC51 = Color(0xFF14BC51) +val Blue22223D = Color(0xFF22223D) +val Black191919 = Color(0xFF191919) +val GrayE3E5E5 = Color(0xFFE3E5E5) +val RedEF0000 = Color(0xFFEF0000) +val WhiteF8F8F8 = Color(0xFFF8F8F8) +val Black444444 = Color(0xFF444444) +val PurpleDCD1F4 = Color(0xFFDCD1F4) + diff --git a/app/src/main/java/com/uitron/demo/theme/Shape.kt b/app/src/main/java/com/uitron/demo/theme/Shape.kt new file mode 100644 index 0000000..b0ff35d --- /dev/null +++ b/app/src/main/java/com/uitron/demo/theme/Shape.kt @@ -0,0 +1,11 @@ +package com.uitron.demo.theme + +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Shapes +import androidx.compose.ui.unit.dp + +val Shapes = Shapes( + small = RoundedCornerShape(4.dp), + medium = RoundedCornerShape(4.dp), + large = RoundedCornerShape(0.dp) +) \ No newline at end of file diff --git a/app/src/main/java/com/uitron/demo/theme/Theme.kt b/app/src/main/java/com/uitron/demo/theme/Theme.kt new file mode 100644 index 0000000..7dccbb4 --- /dev/null +++ b/app/src/main/java/com/uitron/demo/theme/Theme.kt @@ -0,0 +1,45 @@ +package com.uitron.demo.theme + +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material.MaterialTheme +import androidx.compose.material.darkColors +import androidx.compose.material.lightColors +import androidx.compose.runtime.Composable +import com.demo.uitron.theme.* + +private val DarkColorPalette = darkColors( + primary = Purple200, + primaryVariant = Purple700, + secondary = Teal200 +) + +private val LightColorPalette = lightColors( + primary = Purple500, + primaryVariant = Purple700, + secondary = Teal200 + + /* Other default colors to override + background = Color.White, + surface = Color.White, + onPrimary = Color.White, + onSecondary = Color.Black, + onBackground = Color.Black, + onSurface = Color.Black, + */ +) + +@Composable +fun UiTronTheme(darkTheme: Boolean = isSystemInDarkTheme(), content: @Composable () -> Unit) { + val colors = if (darkTheme) { + DarkColorPalette + } else { + LightColorPalette + } + + MaterialTheme( + colors = colors, + typography = Typography, + shapes = Shapes, + content = content + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/uitron/demo/theme/Type.kt b/app/src/main/java/com/uitron/demo/theme/Type.kt new file mode 100644 index 0000000..f1fe758 --- /dev/null +++ b/app/src/main/java/com/uitron/demo/theme/Type.kt @@ -0,0 +1,16 @@ +package com.uitron.demo.theme + +import androidx.compose.material.Typography +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.sp + +// Set of Material typography styles to start with +val Typography = Typography( + body1 = TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp + ) +) \ No newline at end of file diff --git a/app/src/main/res/drawable/ultron.png b/app/src/main/res/drawable/ultron.png new file mode 100644 index 0000000000000000000000000000000000000000..4c015fe22e1ccae020ae1bddfcd00de9b0ad234a GIT binary patch literal 12703 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 Z{{dt?*8`gKNzVWP002ovPDHLkV1fsAAV>fJ literal 0 HcmV?d00001 diff --git a/build.gradle b/build.gradle index 7da7c42..ab69106 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,9 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. - +buildscript { + ext { + nav_version = "2.5.3" + } +} plugins { id 'com.android.application' version '7.3.1' apply false id 'com.android.library' version '7.3.1' apply false