From 0c6833c3ac42a6d371129d74271902165104684f Mon Sep 17 00:00:00 2001 From: LeightonGinty Date: Sat, 16 Nov 2024 21:31:03 +0000 Subject: Drinking + get and post --- .../com/example/alcagotchi/DrinkingActivity.kt | 291 +++++++++++++++++++++ .../java/com/example/alcagotchi/MainActivity.kt | 35 ++- .../java/com/example/alcagotchi/RequestTest.kt | 64 +++++ 3 files changed, 383 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/example/alcagotchi/DrinkingActivity.kt create mode 100644 app/src/main/java/com/example/alcagotchi/RequestTest.kt (limited to 'app/src/main/java') diff --git a/app/src/main/java/com/example/alcagotchi/DrinkingActivity.kt b/app/src/main/java/com/example/alcagotchi/DrinkingActivity.kt new file mode 100644 index 0000000..4c5e3aa --- /dev/null +++ b/app/src/main/java/com/example/alcagotchi/DrinkingActivity.kt @@ -0,0 +1,291 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.example.alcagotchi + +//import kotlinx.coroutines.flow.internal.NoOpContinuation.context +//import kotlin.coroutines.jvm.internal.CompletedContinuation.context +import android.content.Intent +import android.os.Bundle +import android.util.Log +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Button +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.example.alcagotchi.ui.theme.AlcaGotchiTheme +import com.google.firebase.crashlytics.buildtools.reloc.org.apache.http.HttpRequest +import com.google.firebase.crashlytics.buildtools.reloc.org.apache.http.client.HttpClient +import com.google.gson.Gson +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import okhttp3.OkHttpClient +import java.io.BufferedReader +import java.io.IOException +import java.io.InputStreamReader +import java.net.HttpURLConnection +import java.net.URI +import java.net.URL +//import java.net.HttpURLConnection +//import java.net.URL +// + +//val myBuilder = CronetEngine.Builder(context) +//val cronetEngine: CronetEngine = myBuilder.build() +//var client: OkHttpClient? = OkHttpClient() + +fun PostHttpRequest(url_name: String = "http://httpbin.org/post", json_string: String = """{"name":"John Doe", "age": 30}"""){ + val url = URL(url_name) + val json = json_string + val connection = url.openConnection() as HttpURLConnection + connection.apply { + requestMethod = "POST" + doOutput = true + setRequestProperty("Content-Type", "application/json") + } + + val outputStream = connection.outputStream + outputStream.write(json.toByteArray()) + outputStream.flush() + outputStream.close() + + val response = connection.inputStream.use { it.reader().use { reader -> reader.readText() } } + println(response) + connection.disconnect() +} +fun asyncGetHttpRequest( + endpoint: String, + onSuccess: (ApiResponse) -> Unit, + onError: (Exception) -> Unit +) { + CoroutineScope(Dispatchers.IO).launch { + val url = URL(endpoint) + val openedConnection = url.openConnection() as HttpURLConnection + openedConnection.requestMethod = "GET" + + val responseCode = openedConnection.responseCode + try { + val reader = BufferedReader(InputStreamReader(openedConnection.inputStream)) + val response = reader.readText() + val apiResponse = ApiResponse( + responseCode, + parseJson(response) + ) + print(response) + reader.close() + // Call the success callback on the main thread + launch(Dispatchers.Main) { + onSuccess(apiResponse) + } + } catch (e: Exception) { + Log.d("Error", e.message.toString()) + // Handle error cases and call the error callback on the main thread + launch(Dispatchers.Main) { + onError(Exception("HTTP Request failed with response code $responseCode")) + } + } finally { + + } + } +} + + +//fun sendPost(urlString: String = "http://127.0.0.1:8080/test", +// bodyContent: String = "test") { +// +// val client = HttpClient.newBuilder().build(); +// val request = HttpRequest.newBuilder() +// .uri(URI.create(urlString)) +// //.header("Content-Type", "application/json") +// .POST(HttpRequest.BodyPublishers.ofString(bodyContent)) +// .build() +// val response = client.send(request, HttpResponse.BodyHandlers.ofString()) +// val answer = response.body() +// println(answer) +//} + +private inline fun parseJson(text: String): T = + Gson().fromJson(text, T::class.java) + +data class ApiResponse( + val responseCode: Int, + val response: T +) + +data class AmiiboResponse( + val amiibo: List +) + +data class AmiiboItem( + val amiiboSeries: String, + val character: String, + val gameSeries: String, + val head: String, + val image: String, + val name: String, + val tail: String, + val type: String +) +class DrinkingActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + AlcaGotchiTheme { + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + DrinkingGreeting( + stringResource(R.string.welcome_to_casino), + ) + } + } + } + } +} + + + +@Composable +fun DrinkingGreetingText(message: String, from: String, modifier: Modifier = Modifier) { + // Create a column so that texts don't overlap + Column( + verticalArrangement = Arrangement.Center, + modifier = modifier + ) { + Text( + text = message, + fontSize = 100.sp, + lineHeight = 116.sp, + textAlign = TextAlign.Center, + color = Color(0xFF00FF00), + modifier = Modifier.padding(top = 16.dp) + ) + Text( + text = from, + fontSize = 36.sp, + color = Color(0xFF00FF00), + modifier = Modifier + .padding(top = 16.dp) + .padding(end = 16.dp) + .align(alignment = Alignment.End) + + ) + } +} + +@Composable +fun DrinkingOptions(modifier: Modifier = Modifier) { + Column( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text( + text = "What would you like to drink?", + fontSize = 36.sp, + color = Color(0xFF00FF00), + modifier = Modifier + .padding(top = 16.dp) + .padding(end = 16.dp) + ) + Button(onClick = { + PostHttpRequest("http://192.168.4.1/drink") + }) + { + Text( + text = "Drink Beer" + ) + } + Button(onClick = { + PostHttpRequest("http://192.168.4.1/drink") + }) + { + Text( + text = "Drink Whisky" + ) + } + Button(onClick = { + PostHttpRequest("http://192.168.4.1/drink") + }) + { + Text( + text = "Drink Wine" + ) + } + Button(onClick = { + PostHttpRequest("http://192.168.4.1/drink") + }) + { + Text( + text = "Drink Lemonade" + ) + } + } +} + +@Composable +fun DrinkingGreeting(message: String, modifier: Modifier = Modifier) { + // Create a box to overlap image and texts + val context = LocalContext.current + + Box(modifier) { + Image( + painter = painterResource(id = R.drawable.spoons), + contentDescription = null, + contentScale = ContentScale.Crop, + alpha = 1F, + modifier = Modifier.fillMaxSize() + + + ) + Button(onClick = { + val intent = Intent(context, MainActivity::class.java) + context.startActivity(intent) + }) { + Text("Go back") + } + DrinkingOptions() + } +} + +@Preview(showBackground = false) +@Composable +private fun DrinkingPreview() { + AlcaGotchiTheme { + DrinkingGreeting( + stringResource(R.string.welcome_to_casino), + ) + } +} diff --git a/app/src/main/java/com/example/alcagotchi/MainActivity.kt b/app/src/main/java/com/example/alcagotchi/MainActivity.kt index 968b661..34afa63 100644 --- a/app/src/main/java/com/example/alcagotchi/MainActivity.kt +++ b/app/src/main/java/com/example/alcagotchi/MainActivity.kt @@ -19,31 +19,43 @@ import android.content.Intent import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.annotation.StringRes import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material3.Button +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold import androidx.compose.material3.Surface import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.core.content.ContextCompat.startActivity -import com.example.alcagotchi.ui.theme.AlcaGotchiTheme +import androidx.navigation.NavHostController +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.navigation.compose.rememberNavController import com.example.alcagotchi.ui.theme.AlcaGotchiTheme class MainActivity : ComponentActivity() { @@ -99,13 +111,22 @@ fun GreetingText(message: String, from: String, modifier: Modifier = Modifier) { }) { Text("Casino") } + Button(onClick = { + val intent = Intent(context, DrinkingActivity::class.java) + context.startActivity(intent) + }) { + Text("Drinking") + } } } - @Composable -fun GreetingImage(message: String, from: String, modifier: Modifier = Modifier) { +fun GreetingImage(message: String, from: String, modifier: Modifier = Modifier, + navController: NavHostController = rememberNavController(), +// viewModel: OrderViewModel = viewModel(), + +) { // Create a box to overlap image and texts - Box(modifier) { + Box { Image( painter = painterResource(id = R.drawable.alcogotchi), contentDescription = null, @@ -126,7 +147,7 @@ fun GreetingImage(message: String, from: String, modifier: Modifier = Modifier) } } -@Preview(showBackground = false) +@Preview @Composable private fun BirthdayCardPreview() { AlcaGotchiTheme { diff --git a/app/src/main/java/com/example/alcagotchi/RequestTest.kt b/app/src/main/java/com/example/alcagotchi/RequestTest.kt new file mode 100644 index 0000000..513bb69 --- /dev/null +++ b/app/src/main/java/com/example/alcagotchi/RequestTest.kt @@ -0,0 +1,64 @@ +package com.example.alcagotchi + +import android.os.Bundle +import android.util.Log +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import com.example.alcagotchi.ui.theme.AlcaGotchiTheme +import java.lang.reflect.Modifier +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Button +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember + +@Composable +fun GetAmiiboItems(modifier: Modifier) { + val amiiboList = remember { mutableStateOf>(listOf()) } + Column { + Button(onClick = { + asyncGetHttpRequest( + endpoint = "https://www.amiiboapi.com/api/amiibo/", + onSuccess = { + amiiboList.value = it.response.amiibo + Log.d("SUCCESS", amiiboList.toString()) + }, + onError = { + Log.d("ERROR", it.message.toString()) + } + ) + }) + { + Text( + text = "Get Amiibos" + ) + } + } + Column( +// modifier = Modifier.fillMaxSize(), +// contentPadding = PaddingValues(16.dp) + ) { + Text(text = amiiboList.value.toString()) + } +} +class RequestTest : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContent { + AlcaGotchiTheme { + // A surface container using the 'background' color from the theme + Surface( + color = MaterialTheme.colorScheme.background + ) { + // Let's create a composable function named GetAmiiboItems + GetAmiiboItems(modifier = Modifier()) + } + } + } + } +} \ No newline at end of file -- cgit v1.2.3-70-g09d2