Friday, 4 October 2024

Navigation controller in kotlin jetpack compose example

 To navigate one screen to another screen we can use navigation like below

1. MainActivity:-


@Composable
fun AppRoute() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "MainMenu") {
composable(route = "MainMenu") {
MainMenuScreen(navController)
}
composable (route = AppConstant.POST) {
PostListScreen()
}
composable(route = AppConstant.ALBUM) {
AlbumScreen()
}
composable(route = AppConstant.COMMENT) {
CommentScreen()
}
composable(route = AppConstant.PHOTOS) {
PhotoScreen()
}
}
}


2. MainMenuScreen class

@Composable
fun MainMenuScreen(navController: NavController) {
val mainMenuViewModel: MainMenuViewModel = hiltViewModel()
LazyVerticalGrid(
columns = GridCells.Fixed(2),
contentPadding = PaddingValues(8.dp),
verticalArrangement = Arrangement.SpaceAround,
)
{
items(mainMenuViewModel.getMainMenuData()) {
MainMenuItem(menuName = it.menuName, navController)
}

}
}


@Composable
fun MainMenuItem(menuName: String, navController: NavController) {
Box(
modifier = Modifier
.padding(10.dp)
.
size(140.dp)
.
clip(RoundedCornerShape(8.dp))
.
paint(painter = painterResource(id = R.drawable.bg1))
.
border(1.dp, Color.LightGray)
.clickable {
navController.navigate(menuName)
},

contentAlignment = Alignment.BottomCenter
) {
Text(
text = menuName,
fontSize = 18.sp,
color = Color.Black,
modifier = Modifier.padding(0.dp, 20.dp),
style = MaterialTheme.typography.bodyMedium
)

}
}

3. AppConstant
package com.example.jetpackcompose2.util

object AppConstant {
const val POST="Post"
const val COMMENT="comments"
const val ALBUM="albums"
const val PHOTOS="photos"
}

4. inside hilt module

@Module
@InstallIn(SingletonComponent::class)
class MainMenuModule {
@Singleton
@Provides
fun provideMenu(): List<MainMenuData> {
return listOf(
MainMenuData(AppConstant.POST),
MainMenuData(AppConstant.PHOTOS),
MainMenuData(AppConstant.ALBUM),
MainMenuData(AppConstant.COMMENT)
)

}
}



Thursday, 3 October 2024

Hilt | KSP | viewModel Jetpack Compose | Compose Dependencies

 1. libs.versions.toml

#retrofit
androidx-retrofit2 = { group = "com.squareup.retrofit2", name = "retrofit", version = "2.9.0" }
androidx-retrofit2-converter-gson = { group = "com.squareup.retrofit2", name = "converter-gson", version = "2.9.0" }
androidx-okhttp3-logging-interceptor = { group = "com.squareup.okhttp3", name = "logging-interceptor", version = "4.12.0" }
#Coroutine
androidx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version="1.8.1" }
androidx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version="1.8.1" }
#hilt
androidx-dagger-hilt-android = { group = "com.google.dagger", name = "hilt-android", version = "2.51.1" }
[plugins]
dagger-hilt-android = { id = "com.google.dagger.hilt.android", version = "2.51.1" }
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }

[versions]
agp = "8.5.2"
kotlin = "2.0.20"
coreKtx = "1.13.1"
junit = "4.13.2"
junitVersion = "1.2.1"
espressoCore = "3.6.1"
lifecycleRuntimeKtx = "2.8.6"
activityCompose = "1.9.2"
composeBom = "2024.09.03"
2.build.gradle.kts
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.jetbrains.kotlin.android)
id("com.google.devtools.ksp")
alias(libs.plugins.compose.compiler)
alias(libs.plugins.dagger.hilt.android)

}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17.toString()
}

dependencies {
//coroutines
implementation(libs.androidx.coroutines.core)
implementation(libs.androidx.coroutines.android)
// Retrofit
implementation(libs.androidx.retrofit2.converter.gson)
implementation(libs.androidx.retrofit2)
implementation(libs.androidx.okhttp3.logging.interceptor)

//view model for compose
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.8.5")

//navigation
implementation("androidx.hilt:hilt-navigation-compose:1.2.0")
val nav_version = "2.8.1"
implementation("androidx.navigation:navigation-compose:$nav_version")


//hilt
implementation(libs.androidx.dagger.hilt.android)
ksp("com.google.dagger:hilt-android-compiler:2.51.1")


3.build.gradle.kts(Project level)
plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.jetbrains.kotlin.android) apply false
alias(libs.plugins.dagger.hilt.android) apply false
alias(libs.plugins.compose.compiler) apply false
id("com.google.devtools.ksp") version "2.0.20-1.0.24" apply false
}
}

Kapt to ksp migration

 ksp:-

build.gradle.kts(Module:app)

plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.jetbrains.kotlin.android)

id("com.google.devtools.ksp") //add this
}
dependencies{
ksp("com.google.dagger:hilt-android-compiler:2.51.1")
}

build.gradle.kts(Project:)
plugins {

id("com.google.devtools.ksp") version "1.9.0-1.0.13" apply false
}

kapt:-
build.gradle.kts(Module:app)
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.jetbrains.kotlin.android)
id("kotlin-kapt")
id("com.google.dagger.hilt.android")

}
dependencies{
kapt("com.google.dagger:hilt-android-compiler:2.51.1")
}

Display static data into Recycler or ListView form using Jectpack Compose.

 


@Preview
@Composable
fun prevItem() {
LazyColumn(content = {
items(addItemToList()){
ListItem(img = it.img, name = it.name, loc =it.loc )
}
})
}

@Composable
fun ListItem(img: Int, name: String, loc: String) {
Card(
elevation = CardDefaults.cardElevation(),
modifier = Modifier
.fillMaxWidth()
.padding(4.dp)
) {
Row {
Image(
painter = painterResource(id = img),
contentDescription = "",
contentScale = ContentScale.Crop,
modifier = Modifier
.padding(8.dp)
.size(60.dp)
.border(2.dp, Color.LightGray, CircleShape)
.clip(CircleShape)
.weight(.2f)

)
ItemDescriprion(name, loc, modifier = Modifier.weight(.8f))
}

}
}

@Composable
fun ItemDescriprion(name: String, loc: String, modifier: Modifier) {
Column(horizontalAlignment = Alignment.Start, modifier = modifier) {
Text(
text = name,
style = MaterialTheme.typography.headlineMedium
)
Text(
text = loc,
style = MaterialTheme.typography.bodyMedium,
fontWeight = FontWeight.Thin
)
}

}
data class DataList(val img: Int,val name: String,val loc: String)
fun addItemToList(): MutableList<DataList> {
var item= mutableListOf<DataList>()
item.add(DataList(R.drawable.img3,"Vedik Aryan","Saharsa"))
item.add(DataList(R.drawable.image,"Saurabh Aryan","Madhya Pradesh"))
item.add(DataList(R.drawable.img3,"Supriya Aryan","Ranchi"))
item.add(DataList(R.drawable.image,"Ankit","Kashmir"))
item.add(DataList(R.drawable.img3,"Manju","Saharsa"))
item.add(DataList(R.drawable.image,"Praduman","gujrat"))
item.add(DataList(R.drawable.img3,"Vedik Aryan","Saharsa"))
item.add(DataList(R.drawable.image,"Saurabh Aryan","Madhya Pradesh"))
item.add(DataList(R.drawable.img3,"Supriya Aryan","Ranchi"))
item.add(DataList(R.drawable.image,"Ankit","Kashmir"))
item.add(DataList(R.drawable.img3,"Manju","Saharsa"))
item.add(DataList(R.drawable.image,"Praduman","gujrat"))
item.add(DataList(R.drawable.img3,"Vedik Aryan","Saharsa"))
item.add(DataList(R.drawable.image,"Saurabh Aryan","Madhya Pradesh"))
item.add(DataList(R.drawable.img3,"Supriya Aryan","Ranchi"))
item.add(DataList(R.drawable.image,"Ankit","Kashmir"))
item.add(DataList(R.drawable.img3,"Manju","Saharsa"))
item.add(DataList(R.drawable.image,"Praduman","gujrat"))
item.add(DataList(R.drawable.img3,"Vedik Aryan","Saharsa"))
item.add(DataList(R.drawable.image,"Saurabh Aryan","Madhya Pradesh"))
item.add(DataList(R.drawable.img3,"Supriya Aryan","Ranchi"))
item.add(DataList(R.drawable.image,"Ankit","Kashmir"))
item.add(DataList(R.drawable.img3,"Manju","Saharsa"))
item.add(DataList(R.drawable.image,"Praduman","gujrat"))
return item
}



Android JetpackCompose UI Design Part-1

 


@Composable
fun Greeting() {
Box {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier
.fillMaxSize()
.padding(12.dp)
) {

Button(
onClick = { },
colors = ButtonDefaults
.buttonColors(
containerColor = Color.Green
)
) {
Text(text = "OK", color = Color.Blue)
}
val state = remember {
mutableStateOf("")
}
TextField(value = state.value, onValueChange = {
state.value = it
}, label = { Text(text = "Enter Name") })
circularImage()
ListViewItem(R.drawable.image, "supriya", "Android Developer")
ListViewItem(R.drawable.image, "supriya", "Android Developer")
ListViewItem(R.drawable.image, "supriya", "Android Developer")
ListViewItem(R.drawable.image, "supriya", "Android Developer")
ListViewItem(R.drawable.image, "supriya", "Android Developer")
Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
addItemToList().map {
ListItem(img = it.img, name = it.name, loc =it.loc)

}
}
}

}

}

@Composable
fun ListViewItem(imageId: Int, name: String, occupation: String) {
Card(modifier = Modifier.padding(12.dp)) {
Row(modifier = Modifier.fillMaxWidth()) {
Image(
painter = painterResource(
id = imageId
), modifier = Modifier.size(60.dp),
contentDescription = ""
)
Column(modifier = Modifier.padding(start = 10.dp)) {
Text(
text = name,
fontSize = 16.sp
)
Text(
text = occupation,
fontSize = 12.sp,
fontWeight = FontWeight.Thin
)
}
}
}

}
@Composable
fun circularImage(){
Image(painter = painterResource(id = R.drawable.img3),
contentDescription ="",
contentScale = ContentScale.Crop,
modifier = Modifier
.padding(8.dp)
.size(80.dp)
.clip(CircleShape)
.border(2.dp, Color.LightGray, CircleShape))
}


how to change status bar color in jectpack compose.

 Step1: Go to MainActivity and do following: enableEdgeToEdge ( statusBarStyle = SystemBarStyle .light( Color . Green .h...