Reading Writing json and Notification




implementation ("com.google.code.gson:gson:2.8.8") 


package com.example.jsonparsing


import android.app.Notification
import android.os.Bundle
import android.provider.CalendarContract.Colors
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.annotation.RequiresApi
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
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.tooling.preview.Preview
import com.example.jsonparsing.ui.theme.JsonParsingTheme
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.os.Build
import android.util.Log
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue

import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.*
import androidx.compose.material3.OutlinedTextField
import androidx.compose.runtime.*
import androidx.compose.ui.unit.dp

import androidx.compose.ui.platform.LocalContext

import androidx.compose.ui.unit.dp
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.JsonObject
import com.google.gson.JsonParser
import com.google.gson.JsonSyntaxException
import com.google.gson.reflect.TypeToken
import java.io.File
import java.io.FileReader
import java.io.FileWriter
import java.io.IOException


class MainActivity : ComponentActivity() {
@RequiresApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyScreen(context = this)
}
}
}



@RequiresApi(Build.VERSION_CODES.O)
@Composable
fun MyButton(context:Context){
Button(onClick = {sendNotification(context)}) {
Text(text = "Click Me Bby")
}
}

@RequiresApi(Build.VERSION_CODES.O)
private fun sendNotification(context: Context) {
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager

// Create a notification channel
val channelId = "my_channel_id"
val channelName = "My Channel"
val importance = NotificationManager.IMPORTANCE_DEFAULT
val channel = NotificationChannel(channelId, channelName, importance)
notificationManager.createNotificationChannel(channel)

// Create a notification
val notification = Notification.Builder(context, channelId)
.setContentTitle("My Notification")
.setContentText("Hello! This is my notification.")
.setSmallIcon(android.R.drawable.ic_dialog_info)
.build()

// Send the notification
notificationManager.notify(1, notification)
}

@RequiresApi(Build.VERSION_CODES.O)
@Composable
fun MyScreen(context: Context) {
val customColor = Color(0xFFFFFFFF)
Column(
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier
.background(customColor)
.fillMaxSize()
) {
Column(
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.fillMaxWidth()
) {

MyForm()
Spacer(modifier = Modifier.height(16.dp))
DisplayDetailsFromJson()
// DisplayJsonEntries()
}
}
}




data class FormData(val name: String, val email: String)

@RequiresApi(Build.VERSION_CODES.O)
@Composable
fun MyForm() {
val context = LocalContext.current
var formData by remember { mutableStateOf(FormData("", "")) }

Column(
modifier = Modifier
.fillMaxSize()
) {
OutlinedTextField(
value = formData.name,
onValueChange = { formData = formData.copy(name = it) },
label = { Text("Name") },
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 8.dp)
)
OutlinedTextField(
value = formData.email,
onValueChange = { formData = formData.copy(email = it) },
label = { Text("Email") },
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 8.dp)
)

Button(
onClick = {
// Save form data as JSON to a file
saveJsonToFile(context, formData)
},
modifier = Modifier.padding(top = 16.dp)
) {
Text("Submit")
}
}
}

data class Entry(val email: String, val name: String)

@Composable
fun EntryText(entries: Map<String, Entry>) {
LazyColumn {
items(entries.entries.toList()) { (_, entry) ->
Column {
Text("Email: ${entry.email}")
Text("Name: ${entry.name}")
Spacer(modifier = Modifier.height(16.dp)) // Add spacing between entries
}
}
}
}


@Composable
fun DisplayJsonEntries() {
val gson = Gson()

// Replace "path/to/your/file.json" with the actual path to your JSON file
val jsonFile = File("/storage/emulated/0/Android/data/com.example.jsonparsing/files/form_data.json")
val jsonString = jsonFile.readText()

// Parse JSON string to a map where keys are entry IDs and values are Entry objects
val entries: Map<String, Entry> = gson.fromJson(jsonString, object : TypeToken<Map<String, Entry>>() {}.type)

// Display the content of each entry using EntryText composable
EntryText(entries = entries)
}


@RequiresApi(Build.VERSION_CODES.O)
fun saveJsonToFile(context: android.content.Context, formData: FormData) {
val gson = GsonBuilder().setPrettyPrinting().create()

try {
val fileName = "form_data.json"
val file = File(context.getExternalFilesDir(null), fileName)

// Read existing JSON data from the file
val existingData = if (file.exists()) {
val reader = FileReader(file)
gson.fromJson(reader, JsonObject::class.java)
} else {
JsonObject()
}

// Create JSON object for new form data
val formDataJson = gson.toJsonTree(formData).asJsonObject

// Add new form data to existing data
val newData = existingData.apply {
add("entry_${System.currentTimeMillis()}", formDataJson)
}

// Write the updated JSON to the file
val fileWriter = FileWriter(file)
gson.toJson(newData, fileWriter)
fileWriter.close()

Log.d("SaveJsonToFile", "JSON saved to file: $file")
} catch (e: Exception) {
Log.e("SaveJsonToFile", "Error saving JSON to file: ${e.message}")
}
}



@RequiresApi(Build.VERSION_CODES.O)
@Composable
fun DisplayDetailsFromJson() {
val context = LocalContext.current
var formData by remember { mutableStateOf(FormData("", "")) }

// Read JSON from file and deserialize it
LaunchedEffect(key1 = Unit) {
try {
val file = File(context.getExternalFilesDir(null), "form_data.json")
val json = file.readText()
val gson = Gson()
formData = gson.fromJson(json, FormData::class.java)
} catch (e: IOException) {
Log.e("DisplayDetailsFromJson", "Error reading JSON from file: ${e.message}")
} catch (e: JsonSyntaxException) {
Log.e("DisplayDetailsFromJson", "Error deserializing JSON: ${e.message}")
}
}

// Display details from form data
Surface(color = Color.White) {
Column(
modifier = Modifier
.fillMaxSize()
.background(Color.White)
) {
Text(text = "Name: ${formData.name}", modifier = Modifier.padding(16.dp))
Text(text = "Email: ${formData.email}", modifier = Modifier.padding(16.dp))
}
}
}

Comments