From 022456ace3df26f77b33192b09f32cbfacde78fa Mon Sep 17 00:00:00 2001 From: James Ward Date: Fri, 20 Nov 2020 14:38:10 -0700 Subject: [PATCH 1/9] to compose --- examples/android/build.gradle.kts | 28 +++++- .../grpc/examples/helloworld/MainActivity.kt | 94 +++++++++++++------ .../src/main/res/layout/activity_main.xml | 36 ------- .../android/src/main/res/values/strings.xml | 4 +- 4 files changed, 96 insertions(+), 66 deletions(-) delete mode 100644 examples/android/src/main/res/layout/activity_main.xml diff --git a/examples/android/build.gradle.kts b/examples/android/build.gradle.kts index 07b9fc5a..77a69b0c 100644 --- a/examples/android/build.gradle.kts +++ b/examples/android/build.gradle.kts @@ -3,15 +3,25 @@ plugins { kotlin("android") } +val composeVersion = "1.0.0-alpha03" + dependencies { implementation(project(":stub-android")) + implementation(kotlin("stdlib")) implementation("androidx.appcompat:appcompat:1.3.1") + implementation("androidx.compose.foundation:foundation-layout:$composeVersion") + implementation("androidx.compose.material:material:$composeVersion") + implementation("androidx.compose.runtime:runtime:$composeVersion") + implementation("androidx.compose.ui:ui:$composeVersion") + + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:${rootProject.ext["coroutinesVersion"]}") + runtimeOnly("io.grpc:grpc-okhttp:${rootProject.ext["grpcVersion"]}") } android { compileSdkVersion(30) - buildToolsVersion = "30.0.2" + buildToolsVersion = "30.0.3" defaultConfig { applicationId = "io.grpc.examples.hello" @@ -34,4 +44,20 @@ android { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } + + buildFeatures { + compose = true + } + + composeOptions { + kotlinCompilerVersion = org.jetbrains.kotlin.config.KotlinCompilerVersion.VERSION.toString() + kotlinCompilerExtensionVersion = composeVersion + } +} + +tasks.withType { + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + freeCompilerArgs = listOf("-Xallow-jvm-ir-dependencies", "-Xskip-prerelease-check") + } } diff --git a/examples/android/src/main/kotlin/io/grpc/examples/helloworld/MainActivity.kt b/examples/android/src/main/kotlin/io/grpc/examples/helloworld/MainActivity.kt index ea9a35e6..eb651361 100644 --- a/examples/android/src/main/kotlin/io/grpc/examples/helloworld/MainActivity.kt +++ b/examples/android/src/main/kotlin/io/grpc/examples/helloworld/MainActivity.kt @@ -1,30 +1,51 @@ package io.grpc.examples.helloworld import android.os.Bundle -import android.text.Editable -import android.text.TextWatcher -import android.view.KeyEvent -import android.widget.Button -import android.widget.EditText -import android.widget.TextView import androidx.appcompat.app.AppCompatActivity -import io.grpc.ManagedChannel +import androidx.compose.foundation.Text +import androidx.compose.foundation.layout.* +import androidx.compose.material.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.ContextAmbient +import androidx.compose.ui.platform.setContent +import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.unit.dp import io.grpc.ManagedChannelBuilder +<<<<<<< HEAD import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.asExecutor import kotlinx.coroutines.runBlocking import java.net.URL import java.util.logging.Logger +======= +import kotlinx.coroutines.* +import java.net.URL +>>>>>>> c586a91 (to compose) -// todo: suspend funs class MainActivity : AppCompatActivity() { - private val logger = Logger.getLogger(this.javaClass.name) - private fun channel(): ManagedChannel { - val url = URL(resources.getString(R.string.server_url)) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + setContent { + Surface(color = MaterialTheme.colors.background) { + Greeter() + } + } + } +} + +@Composable +fun Greeter() { + val context = ContextAmbient.current + + val channel = remember { + val url = URL(context.getString(R.string.server_url)) val port = if (url.port == -1) url.defaultPort else url.port - logger.info("Connecting to ${url.host}:$port") + println("Connecting to ${url.host}:$port") val builder = ManagedChannelBuilder.forAddress(url.host, port) if (url.protocol == "https") { @@ -33,18 +54,16 @@ class MainActivity : AppCompatActivity() { builder.usePlaintext() } - return builder.executor(Dispatchers.Default.asExecutor()).build() + builder.executor(Dispatchers.Default.asExecutor()).build() } - // lazy otherwise resources is null - private val greeter by lazy { GreeterGrpcKt.GreeterCoroutineStub(channel()) } + val greeter = GreeterGrpcKt.GreeterCoroutineStub(channel) - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) + val nameState = remember { mutableStateOf(TextFieldValue()) } - val button = findViewById