diff --git a/.idea/compiler.xml b/.idea/compiler.xml index b86273d..b589d56 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="CompilerConfiguration"> - <bytecodeTargetLevel target="21" /> + <bytecodeTargetLevel target="17" /> </component> </project> \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 7b3006b..0897082 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -4,7 +4,6 @@ <component name="GradleSettings"> <option name="linkedExternalProjectsSettings"> <GradleProjectSettings> - <option name="testRunner" value="CHOOSE_PER_TEST" /> <option name="externalProjectPath" value="$PROJECT_DIR$" /> <option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" /> <option name="modules"> diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..6806f5a --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,53 @@ +<component name="InspectionProjectProfileManager"> + <profile version="1.0"> + <option name="myName" value="Project Default" /> + <inspection_tool class="ComposePreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + <inspection_tool class="ComposePreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + <inspection_tool class="ComposePreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + <inspection_tool class="ComposePreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + <inspection_tool class="GlancePreviewDimensionRespectsLimit" enabled="true" level="WARNING" enabled_by_default="true"> + <option name="composableFile" value="true" /> + </inspection_tool> + <inspection_tool class="GlancePreviewMustBeTopLevelFunction" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + </inspection_tool> + <inspection_tool class="GlancePreviewNeedsComposableAnnotation" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + </inspection_tool> + <inspection_tool class="GlancePreviewNotSupportedInUnitTestFiles" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + </inspection_tool> + <inspection_tool class="PreviewAnnotationInFunctionWithParameters" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + <inspection_tool class="PreviewApiLevelMustBeValid" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + <inspection_tool class="PreviewFontScaleMustBeGreaterThanZero" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + <inspection_tool class="PreviewMultipleParameterProviders" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + <inspection_tool class="PreviewPickerAnnotation" enabled="true" level="ERROR" enabled_by_default="true"> + <option name="composableFile" value="true" /> + <option name="previewFile" value="true" /> + </inspection_tool> + </profile> +</component> \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index b2c751a..e485240 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?> <project version="4"> + <component name="EntryPointsManager"> + <list size="1"> + <item index="0" class="java.lang.String" itemvalue="androidx.compose.runtime.Composable" /> + </list> + </component> <component name="ExternalStorageConfigurationManager" enabled="true" /> - <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK"> + <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK"> <output url="file://$PROJECT_DIR$/build/classes" /> </component> <component name="ProjectType"> diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 8009364..c632581 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -40,7 +40,7 @@ android { } dependencies { - + // Core dependencies implementation(libs.androidx.core.ktx) implementation(libs.androidx.lifecycle.runtime.ktx) implementation(libs.androidx.activity.compose) @@ -53,11 +53,15 @@ dependencies { implementation(libs.material) implementation(libs.androidx.activity) implementation(libs.androidx.constraintlayout) + + // Test dependencies testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(platform(libs.androidx.compose.bom)) androidTestImplementation(libs.androidx.ui.test.junit4) + + // Debug dependencies debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) -} \ No newline at end of file +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index db228b1..2a368c1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,6 +12,9 @@ android:supportsRtl="true" android:theme="@style/Theme.SIAMobile" tools:targetApi="31"> + <activity + android:name=".Mhs202210715136" + android:exported="false" /> <activity android:name=".Mhs000000000000" android:exported="false" /> diff --git a/app/src/main/java/com/example/siamobile/KHSActivity.kt b/app/src/main/java/com/example/siamobile/KHSActivity.kt index 2fffd4c..fc67e11 100644 --- a/app/src/main/java/com/example/siamobile/KHSActivity.kt +++ b/app/src/main/java/com/example/siamobile/KHSActivity.kt @@ -105,7 +105,8 @@ fun KHSScreen() { fun KHSItem(mahasiswaName: String) { val context = LocalContext.current val mahasiswaActivityMap = mapOf( - "000000000000 EXAMPLE" to Mhs000000000000::class.java + "000000000000 EXAMPLE" to Mhs000000000000::class.java, + "202210715136 MUHAMAD RAJWA ATHORIQ" to Mhs202210715136::class.java //"202210715185 AHMAD DIMAS RAMADHAN" to Mhs202210715185::class.java, // silahkan ditambahkan di sini untuk NPM yang lain ) diff --git a/app/src/main/java/com/example/siamobile/Mhs000000000000.kt b/app/src/main/java/com/example/siamobile/Mhs000000000000.kt index bc1da88..ca6a960 100644 --- a/app/src/main/java/com/example/siamobile/Mhs000000000000.kt +++ b/app/src/main/java/com/example/siamobile/Mhs000000000000.kt @@ -3,20 +3,42 @@ package com.example.siamobile import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent -import androidx.compose.foundation.layout.* -import androidx.compose.material3.* +import androidx.compose.animation.animateContentSize +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import com.example.siamobile.ui.theme.SIAMobileTheme class Mhs000000000000 : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val mahasiswaName = intent.getStringExtra("mahasiswaName") ?: "NPM: xx Nama:Example" + val mahasiswaName = intent.getStringExtra("mahasiswaName") ?: "NPM: xx Nama: Example" setContent { SIAMobileTheme { DetailMahasiswaScreen(mahasiswaName) @@ -28,6 +50,24 @@ class Mhs000000000000 : ComponentActivity() { @Composable fun DetailMahasiswaScreen(mahasiswaName: String) { val context = LocalContext.current + val matakuliahList = listOf( + Triple(1, "Aljabar Linear", 1), + Triple(2, "Character Building", 1), + Triple(3, "Dasar Pemrograman", 1), + Triple(4, "Fisika", 1), + Triple(5, "Kalkulus 1", 1), + Triple(6, "Kewarganegaraan", 1), + Triple(7, "Pengantar Teknologi Informasi", 1), + Triple(8, "Struktur Data dan Algoritma", 1), + Triple(9, "Bahasa Indonesia", 2), + Triple(10, "Desain dan Analisis Algoritma", 2), + Triple(11, "Kalkulus II", 2), + Triple(12, "Logika Matematika", 2), + Triple(13, "Matematika Diskrit", 2), + Triple(14, "Pendidikan Agama", 2), + Triple(15, "Sistem Basis Data", 2), + Triple(16, "Analisa Numerik", 3) + ) Column( modifier = Modifier @@ -47,12 +87,103 @@ fun DetailMahasiswaScreen(mahasiswaName: String) { style = MaterialTheme.typography.bodyLarge, fontWeight = FontWeight.Medium ) + Spacer(modifier = Modifier.height(16.dp)) + + // Table Header + Row( + modifier = Modifier + .fillMaxWidth() + .background(MaterialTheme.colorScheme.primaryContainer, RoundedCornerShape(8.dp)) + .padding(vertical = 8.dp, horizontal = 16.dp), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "No", + style = MaterialTheme.typography.bodyMedium.copy( + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.onPrimaryContainer + ), + modifier = Modifier.weight(0.2f) + ) + Text( + text = "Mata Kuliah", + style = MaterialTheme.typography.bodyMedium.copy( + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.onPrimaryContainer + ), + modifier = Modifier.weight(0.6f) + ) + Text( + text = "Sem.", + style = MaterialTheme.typography.bodyMedium.copy( + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.onPrimaryContainer + ), + modifier = Modifier.weight(0.2f) + ) + } + Spacer(modifier = Modifier.height(8.dp)) + + // Table Rows + LazyColumn( + modifier = Modifier.fillMaxWidth() + ) { + items(matakuliahList) { (no, course, semester) -> + var isSelected by remember { mutableStateOf(false) } + + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 4.dp) + .clickable { + isSelected = !isSelected + } + .background( + if (isSelected) MaterialTheme.colorScheme.secondaryContainer + else Color.Transparent, + RoundedCornerShape(8.dp) + ) + .padding(vertical = 12.dp, horizontal = 16.dp) + .animateContentSize(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = no.toString(), + style = MaterialTheme.typography.bodyMedium, + fontSize = 16.sp, + modifier = Modifier.weight(0.2f) + ) + Text( + text = course, + style = MaterialTheme.typography.bodyMedium, + fontSize = 16.sp, + modifier = Modifier.weight(0.6f) + ) + Text( + text = semester.toString(), + style = MaterialTheme.typography.bodyMedium, + fontSize = 16.sp, + modifier = Modifier.weight(0.2f) + ) + } + } + } } + + // Interactive Back Button with visual feedback Button( onClick = { (context as? ComponentActivity)?.finish() }, - modifier = Modifier.align(Alignment.CenterHorizontally) + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(top = 16.dp), + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.primary, + contentColor = MaterialTheme.colorScheme.onPrimary + ) ) { Text(text = "Kembali") } } } + + diff --git a/app/src/main/java/com/example/siamobile/Mhs202210715136.kt b/app/src/main/java/com/example/siamobile/Mhs202210715136.kt new file mode 100644 index 0000000..d8094ce --- /dev/null +++ b/app/src/main/java/com/example/siamobile/Mhs202210715136.kt @@ -0,0 +1,189 @@ +package com.example.siamobile + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.animation.animateContentSize +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.example.siamobile.ui.theme.SIAMobileTheme + +class Mhs202210715136 : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val mahasiswaName = intent.getStringExtra("mahasiswaName") ?: "NPM: 202210715136 Nama: Muhamad Rajwa Athoriq" + setContent { + SIAMobileTheme { + DetailMahasiswaScreen(mahasiswaName) + } + } + } +} + +@Composable +fun DetailMahasiswaScreenOld(mahasiswaName: String) { + val context = LocalContext.current + val matakuliahList = listOf( + Triple(1, "Aljabar Linear", 1), + Triple(2, "Character Building", 1), + Triple(3, "Dasar Pemrograman", 1), + Triple(4, "Fisika", 1), + Triple(5, "Kalkulus 1", 1), + Triple(6, "Kewarganegaraan", 1), + Triple(7, "Pengantar Teknologi Informasi", 1), + Triple(8, "Struktur Data dan Algoritma", 1), + Triple(9, "Bahasa Indonesia", 2), + Triple(10, "Desain dan Analisis Algoritma", 2), + Triple(11, "Kalkulus II", 2), + Triple(12, "Logika Matematika", 2), + Triple(13, "Matematika Diskrit", 2), + Triple(14, "Pendidikan Agama", 2), + Triple(15, "Sistem Basis Data", 2), + Triple(16, "Analisa Numerik", 3) + ) + + Column( + modifier = Modifier + .fillMaxSize() + .padding(16.dp), + verticalArrangement = Arrangement.SpaceBetween + ) { + Column { + Text( + text = "KHS Mahasiswa", + style = MaterialTheme.typography.headlineMedium, + fontWeight = FontWeight.Bold + ) + Spacer(modifier = Modifier.height(8.dp)) + Text( + text = mahasiswaName, + style = MaterialTheme.typography.bodyLarge, + fontWeight = FontWeight.Medium + ) + Spacer(modifier = Modifier.height(16.dp)) + + // Table Header + Row( + modifier = Modifier + .fillMaxWidth() + .background(MaterialTheme.colorScheme.primaryContainer, RoundedCornerShape(8.dp)) + .padding(vertical = 8.dp, horizontal = 16.dp), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = "No", + style = MaterialTheme.typography.bodyMedium.copy( + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.onPrimaryContainer + ), + modifier = Modifier.weight(0.2f) + ) + Text( + text = "Mata Kuliah", + style = MaterialTheme.typography.bodyMedium.copy( + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.onPrimaryContainer + ), + modifier = Modifier.weight(0.6f) + ) + Text( + text = "Sem.", + style = MaterialTheme.typography.bodyMedium.copy( + fontWeight = FontWeight.Bold, + color = MaterialTheme.colorScheme.onPrimaryContainer + ), + modifier = Modifier.weight(0.2f) + ) + } + Spacer(modifier = Modifier.height(8.dp)) + + // Table Rows + LazyColumn( + modifier = Modifier.fillMaxWidth() + ) { + items(matakuliahList) { (no, course, semester) -> + var isSelected by remember { mutableStateOf(false) } + + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 4.dp) + .clickable { + isSelected = !isSelected + } + .background( + if (isSelected) MaterialTheme.colorScheme.secondaryContainer + else Color.Transparent, + RoundedCornerShape(8.dp) + ) + .padding(vertical = 12.dp, horizontal = 16.dp) + .animateContentSize(), + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = no.toString(), + style = MaterialTheme.typography.bodyMedium, + fontSize = 16.sp, + modifier = Modifier.weight(0.2f) + ) + Text( + text = course, + style = MaterialTheme.typography.bodyMedium, + fontSize = 16.sp, + modifier = Modifier.weight(0.6f) + ) + Text( + text = semester.toString(), + style = MaterialTheme.typography.bodyMedium, + fontSize = 16.sp, + modifier = Modifier.weight(0.2f) + ) + } + } + } + } + + // Interactive Back Button with visual feedback + Button( + onClick = { (context as? ComponentActivity)?.finish() }, + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding(top = 16.dp), + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.primary, + contentColor = MaterialTheme.colorScheme.onPrimary + ) + ) { + Text(text = "Kembali") + } + } +} + + diff --git a/app/src/main/res/layout/activity_mhs2.xml b/app/src/main/res/layout/activity_mhs2.xml new file mode 100644 index 0000000..6666858 --- /dev/null +++ b/app/src/main/res/layout/activity_mhs2.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/main" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".Mhs202210715136"> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_mhs202210715136.xml b/app/src/main/res/layout/activity_mhs202210715136.xml new file mode 100644 index 0000000..6666858 --- /dev/null +++ b/app/src/main/res/layout/activity_mhs202210715136.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="utf-8"?> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:id="@+id/main" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".Mhs202210715136"> + +</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bef26bf..fd33e04 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.7.2" +agp = "8.6.0" kotlin = "2.0.0" coreKtx = "1.15.0" junit = "4.13.2"