package
com.example.newcanaryproject
import
android.content.Context
import
android.content.Intent
import
android.net.Uri
import
android.os.Bundle
import
android.widget.Toast
import
androidx.activity.ComponentActivity
import
androidx.activity.compose.setContent
import
androidx.compose.foundation.Image
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.graphics.*
import
androidx.compose.ui.platform.LocalContext
import
androidx.compose.ui.res.colorResource
import
androidx.compose.ui.text.font.FontFamily
import
androidx.compose.ui.text.font.FontWeight
import
androidx.compose.ui.text.style.TextAlign
import
androidx.compose.ui.unit.*
import
coil.compose.rememberAsyncImagePainter
import
com.example.newcanaryproject.ui.theme.*
import
retrofit2.Call
import
retrofit2.Callback
import
retrofit2.Response
import
retrofit2.Retrofit
import
retrofit2.converter.gson.GsonConverterFactory
class
MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super
.onCreate(savedInstanceState)
setContent {
NewCanaryProjectTheme {
Surface(
modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background
) {
Scaffold(
topBar = {
TopAppBar(backgroundColor = greenColor,
title = {
Text(
text =
"JSON Parsing in Android"
,
modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center,
color = Color.White
)
})
}) {
volleyJSONParsing()
}
}
}
}
}
}
@Composable
fun volleyJSONParsing() {
val ctx = LocalContext.current
val courseName = remember {
mutableStateOf(
""
)
}
val courseRequisites = remember {
mutableStateOf(
""
)
}
val courseImg = remember {
mutableStateOf(
""
)
}
val courseDesc = remember {
mutableStateOf(
""
)
}
val courseLink = remember {
mutableStateOf(
""
)
}
val progress = remember {
mutableStateOf(
true
)
}
jsonParsing(ctx, courseName, courseRequisites, courseImg, courseDesc, courseLink, progress)
Column(
modifier = Modifier
.fillMaxSize()
.padding(horizontal =
20
.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Top
) {
if
(progress.value) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(horizontal =
20
.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
CircularProgressIndicator(
modifier = Modifier.padding(
16
.dp),
color = colorResource(id = R.color.purple_200),
strokeWidth = Dp(value = 4F)
)
}
}
Spacer(modifier = Modifier.height(
4
.dp))
Image(
painter = rememberAsyncImagePainter(courseImg.value),
contentDescription =
"gfg image"
,
modifier = Modifier
.wrapContentSize()
.wrapContentHeight()
.fillMaxWidth()
.padding(
4
.dp),
alignment = Alignment.Center
)
Spacer(modifier = Modifier.height(
10
.dp))
Text(
text = courseName.value,
modifier = Modifier.fillMaxWidth(),
color = Color.Black,
fontSize =
20
.sp,
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Bold, textAlign = TextAlign.Center
)
Spacer(modifier = Modifier.height(
20
.dp))
Text(
text = courseRequisites.value,
modifier = Modifier.fillMaxWidth(),
color = Color.Black,
fontSize =
16
.sp,
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Normal, textAlign = TextAlign.Center
)
Spacer(modifier = Modifier.height(
30
.dp))
Text(
text = courseDesc.value,
modifier = Modifier.fillMaxWidth(),
color = Color.Black,
fontSize =
15
.sp,
fontFamily = FontFamily.Default,
fontWeight = FontWeight.Normal, textAlign = TextAlign.Start
)
Column(
modifier = Modifier
.fillMaxSize(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Bottom
) {
Button(
onClick = {
val i = Intent(Intent.ACTION_VIEW)
i.setData(Uri.parse(courseLink.value))
ctx.startActivity(i)
},
modifier = Modifier
.fillMaxWidth()
.padding(
3
.dp)
.align(Alignment.CenterHorizontally)
.fillMaxWidth()
) {
Text(text =
"Visit Course"
, color = Color.White)
}
}
}
}
fun jsonParsing(
ctx: Context,
name: MutableState<String>,
requisites: MutableState<String>,
Img: MutableState<String>,
Desc: MutableState<String>,
Link: MutableState<String>,
progress: MutableState<Boolean>,
) {
val retrofit = Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.build()
val retrofitAPI = retrofit.create(RetrofitAPI::
class
.java)
val call: Call<CourseDataModal?>? = retrofitAPI.getCourse()
call!!.enqueue(object : Callback<CourseDataModal?> {
override fun onResponse(
call: Call<CourseDataModal?>?,
response: Response<CourseDataModal?>
) {
if
(response.isSuccessful()) {
val courseName: String = response.body()!!.courseName
val courseLink: String = response.body()!!.courseLink
val courseImg: String = response.body()!!.courseimg
val courseDesc: String = response.body()!!.courseDesc
val coursePreq: String = response.body()!!.Prerequisites
progress.value = !progress.value
name.value = courseName
Link.value = courseLink
Img.value = courseImg
Desc.value = courseDesc
requisites.value = coursePreq
}
}
override fun onFailure(call: Call<CourseDataModal?>?, t: Throwable?) {
Toast.makeText(ctx,
"Fail to get the data.."
, Toast.LENGTH_SHORT)
.show()
}
})
}