From 39fc1dcdf4522390ce826907272e82641241de9a Mon Sep 17 00:00:00 2001 From: JothishKamal Date: Sun, 10 Aug 2025 19:30:02 +0530 Subject: [PATCH 1/4] feat: reorder filter options and adjust no friends messages in ConnectTabContent --- .../connect/components/ConnectScreenComponents.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/dscvit/vitty/ui/connect/components/ConnectScreenComponents.kt b/app/src/main/java/com/dscvit/vitty/ui/connect/components/ConnectScreenComponents.kt index 4b3fb91..084fce3 100644 --- a/app/src/main/java/com/dscvit/vitty/ui/connect/components/ConnectScreenComponents.kt +++ b/app/src/main/java/com/dscvit/vitty/ui/connect/components/ConnectScreenComponents.kt @@ -221,7 +221,7 @@ fun ConnectHeader( horizontalArrangement = Arrangement.SpaceBetween, ) { Row { - val options = listOf("Available", "View All") + val options = listOf("All", "Available") options.forEachIndexed { index, label -> FilterChip( label = label, @@ -384,8 +384,8 @@ fun ConnectTabContent( val matchesFilter = when (friendsFilter) { - 0 -> friend.current_status?.status?.lowercase(Locale.ROOT) == "free" - else -> true + 0 -> true + else -> friend.current_status?.status?.lowercase(Locale.ROOT) == "free" } matchesSearch && matchesFilter @@ -433,9 +433,9 @@ fun ConnectTabContent( "No friends found" } else { if (friendsFilter == 0) { - "No friends available" - } else { "No friends added" + } else { + "No friends available" } }, subtitle = @@ -443,9 +443,9 @@ fun ConnectTabContent( "Try a different search term" } else { if (friendsFilter == 0) { - "Your friends are currently in class" - } else { "Start connecting with your classmates" + } else { + "Your friends are currently in class" } }, icon = R.drawable.ic_community_outline, From f7920ee4b6ecd38dcf32f4d66285cd18f9071eec Mon Sep 17 00:00:00 2001 From: JothishKamal Date: Sun, 10 Aug 2025 19:30:02 +0530 Subject: [PATCH 2/4] feat: reorder filter options and adjust no friends messages in ConnectTabContent --- .../connect/components/ConnectScreenComponents.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/dscvit/vitty/ui/connect/components/ConnectScreenComponents.kt b/app/src/main/java/com/dscvit/vitty/ui/connect/components/ConnectScreenComponents.kt index 4b3fb91..084fce3 100644 --- a/app/src/main/java/com/dscvit/vitty/ui/connect/components/ConnectScreenComponents.kt +++ b/app/src/main/java/com/dscvit/vitty/ui/connect/components/ConnectScreenComponents.kt @@ -221,7 +221,7 @@ fun ConnectHeader( horizontalArrangement = Arrangement.SpaceBetween, ) { Row { - val options = listOf("Available", "View All") + val options = listOf("All", "Available") options.forEachIndexed { index, label -> FilterChip( label = label, @@ -384,8 +384,8 @@ fun ConnectTabContent( val matchesFilter = when (friendsFilter) { - 0 -> friend.current_status?.status?.lowercase(Locale.ROOT) == "free" - else -> true + 0 -> true + else -> friend.current_status?.status?.lowercase(Locale.ROOT) == "free" } matchesSearch && matchesFilter @@ -433,9 +433,9 @@ fun ConnectTabContent( "No friends found" } else { if (friendsFilter == 0) { - "No friends available" - } else { "No friends added" + } else { + "No friends available" } }, subtitle = @@ -443,9 +443,9 @@ fun ConnectTabContent( "Try a different search term" } else { if (friendsFilter == 0) { - "Your friends are currently in class" - } else { "Start connecting with your classmates" + } else { + "Your friends are currently in class" } }, icon = R.drawable.ic_community_outline, From 8b6634c122edd0421fa2555474a9127e1f38527f Mon Sep 17 00:00:00 2001 From: JothishKamal Date: Mon, 11 Aug 2025 00:15:41 +0530 Subject: [PATCH 3/4] fix: friends not showing up in vitty connect and fatal exception on lazycolumn builder --- .../vitty/ui/connect/ConnectViewModel.kt | 5 - .../ui/connect/FriendDetailScreenContent.kt | 13 +- .../dscvit/vitty/ui/main/MainComposeApp.kt | 206 +++++++++--------- .../ui/schedule/ScheduleScreenContent.kt | 2 +- .../java/com/dscvit/vitty/util/Constants.kt | 3 - .../com/dscvit/vitty/util/LogoutHelper.kt | 2 - .../com/dscvit/vitty/util/WebConstants.kt | 2 +- 7 files changed, 105 insertions(+), 128 deletions(-) diff --git a/app/src/main/java/com/dscvit/vitty/ui/connect/ConnectViewModel.kt b/app/src/main/java/com/dscvit/vitty/ui/connect/ConnectViewModel.kt index 935d129..d0260ef 100644 --- a/app/src/main/java/com/dscvit/vitty/ui/connect/ConnectViewModel.kt +++ b/app/src/main/java/com/dscvit/vitty/ui/connect/ConnectViewModel.kt @@ -700,11 +700,6 @@ class ConnectViewModel : ViewModel() { ) { val list = response?.data ?: emptyList() _activeFriends.postValue(list) - - prefs.edit { - putBoolean(Constants.ACTIVE_FRIENDS_FETCHED, true) - .putString(Constants.ACTIVE_FRIENDS_LIST, Gson().toJson(list)) - } } override fun onError( diff --git a/app/src/main/java/com/dscvit/vitty/ui/connect/FriendDetailScreenContent.kt b/app/src/main/java/com/dscvit/vitty/ui/connect/FriendDetailScreenContent.kt index e363d8f..a2b4f2c 100644 --- a/app/src/main/java/com/dscvit/vitty/ui/connect/FriendDetailScreenContent.kt +++ b/app/src/main/java/com/dscvit/vitty/ui/connect/FriendDetailScreenContent.kt @@ -130,12 +130,8 @@ fun FriendDetailScreenContent( if (ghostModeResponse != null && isTogglingGhostMode) { isTogglingGhostMode = false - val sharedPreferences = - context.getSharedPreferences(Constants.USER_INFO, Context.MODE_PRIVATE) - if (ghostModeResponse!!.success) { - val currentActiveFriends = activeFriends?.toMutableList() ?: mutableListOf() - val gson = Gson() + val currentActiveFriends = activeFriends?.toMutableList() ?: mutableListOf() val existingFriendIndex = currentActiveFriends.indexOfFirst { it.friend_username == friend.username } @@ -146,11 +142,6 @@ fun FriendDetailScreenContent( currentActiveFriends.add(ActiveFriendItem(friend_username = friend.username, hide = isFriendGhosted)) } - val activeFriendsJson = gson.toJson(currentActiveFriends) - sharedPreferences.edit { - putString(Constants.ACTIVE_FRIENDS_LIST, activeFriendsJson) - } - Toast .makeText( context, @@ -781,7 +772,7 @@ private fun DayScheduleContent( ) { items( items = periods, - key = { period -> "${period.courseCode}_${period.slot}" }, + key = { period -> "${periods.indexOf(period)}${period.startTime}_${period.courseCode}_${period.slot}_${period.endTime}" }, ) { period -> FriendPeriodCard( period = period, diff --git a/app/src/main/java/com/dscvit/vitty/ui/main/MainComposeApp.kt b/app/src/main/java/com/dscvit/vitty/ui/main/MainComposeApp.kt index a072f9f..e7b301a 100644 --- a/app/src/main/java/com/dscvit/vitty/ui/main/MainComposeApp.kt +++ b/app/src/main/java/com/dscvit/vitty/ui/main/MainComposeApp.kt @@ -34,6 +34,9 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults import androidx.compose.material3.DrawerValue @@ -44,12 +47,9 @@ import androidx.compose.material3.ModalDrawerSheet import androidx.compose.material3.ModalNavigationDrawer import androidx.compose.material3.NavigationDrawerItem import androidx.compose.material3.NavigationDrawerItemDefaults +import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Text import androidx.compose.material3.rememberDrawerState -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.OutlinedButton import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect @@ -200,25 +200,9 @@ fun MainComposeApp() { } LaunchedEffect(Unit) { - val activeFriendsFetched = prefs.getBoolean(Constants.ACTIVE_FRIENDS_FETCHED, false) - val activeFriendsList = prefs.getString(Constants.ACTIVE_FRIENDS_LIST, "") - val listType = object : TypeToken>() {}.type - val cachedList: List = - try { - Gson().fromJson(activeFriendsList, listType) ?: emptyList() - } catch (e: Exception) { - emptyList() - } - - if (!activeFriendsFetched) { - val token = prefs.getString(Constants.COMMUNITY_TOKEN, null) - if (!token.isNullOrEmpty()) { - connectViewModel.fetchActiveFriends(token, prefs) - } - } - - if (activeFriendsFetched) { - connectViewModel.updateActiveFriendsList(cachedList) + val token = prefs.getString(Constants.COMMUNITY_TOKEN, null) + if (!token.isNullOrEmpty()) { + connectViewModel.fetchActiveFriends(token, prefs) } } @@ -1225,7 +1209,7 @@ fun DrawerContent( }, label = { Column( - modifier = Modifier.padding(start = 24.dp) + modifier = Modifier.padding(start = 24.dp), ) { Text( text = "Find Empty Classroom", @@ -1237,20 +1221,21 @@ fun DrawerContent( ) Spacer(modifier = Modifier.height(4.dp)) Box( - modifier = Modifier - .background( - Accent, - RoundedCornerShape(6.dp) - ) - .padding(horizontal = 6.dp, vertical = 2.dp) + modifier = + Modifier + .background( + Accent, + RoundedCornerShape(6.dp), + ).padding(horizontal = 6.dp, vertical = 2.dp), ) { Text( text = "BETA", color = Background, - style = MaterialTheme.typography.labelSmall.copy( - fontWeight = FontWeight.ExtraBold - ), - fontSize = 10.sp + style = + MaterialTheme.typography.labelSmall.copy( + fontWeight = FontWeight.ExtraBold, + ), + fontSize = 10.sp, ) } } @@ -1421,13 +1406,13 @@ fun DrawerContent( ) } } - + // Support Dialog if (showSupportDialog) { SupportDialog( context = context, prefs = prefs, - onDismiss = { showSupportDialog = false } + onDismiss = { showSupportDialog = false }, ) } } @@ -1492,29 +1477,31 @@ private fun extractCoursesFromTimetable(userResponse: UserResponse): List Unit + onDismiss: () -> Unit, ) { val username = prefs.getString(Constants.COMMUNITY_USERNAME, "") ?: "" val name = prefs.getString(Constants.COMMUNITY_NAME, "") ?: "" val campus = prefs.getString(Constants.COMMUNITY_CAMPUS, "") ?: "Unknown" - - val deviceInfo = remember { - """ - **Device Information:** - - Device: ${Build.MODEL} - - Manufacturer: ${Build.MANUFACTURER} - - OS: Android ${Build.VERSION.RELEASE} (API ${Build.VERSION.SDK_INT}) - - App Version: ${context.packageManager.getPackageInfo(context.packageName, 0).versionName} - - **User Information:** - - Username: $username - - Name: $name - - Campus: $campus - """.trimIndent() - } - + + val deviceInfo = + remember { + """ + **Device Information:** + - Device: ${Build.MODEL} + - Manufacturer: ${Build.MANUFACTURER} + - OS: Android ${Build.VERSION.RELEASE} (API ${Build.VERSION.SDK_INT}) + - App Version: ${context.packageManager.getPackageInfo(context.packageName, 0).versionName} + + **User Information:** + - Username: $username + - Name: $name + - Campus: $campus + """.trimIndent() + } + fun openEmailSupport() { - val emailTemplate = """ + val emailTemplate = + """ Dear VITTY Support Team, I am experiencing an issue with the VITTY Android app and would like to report it. @@ -1545,29 +1532,34 @@ Thank you for your time and assistance! Best regards, $name VITTY Android App User - """.trimIndent() + """.trimIndent() + + val emailIntent = + Intent(Intent.ACTION_SEND).apply { + type = "text/plain" + putExtra(Intent.EXTRA_EMAIL, arrayOf("dscvit.vitty@gmail.com")) + putExtra( + Intent.EXTRA_SUBJECT, + "Bug Report - VITTY Android v${context.packageManager.getPackageInfo(context.packageName, 0).versionName}", + ) + putExtra(Intent.EXTRA_TEXT, emailTemplate) + } - val emailIntent = Intent(Intent.ACTION_SEND).apply { - type = "text/plain" - putExtra(Intent.EXTRA_EMAIL, arrayOf("dscvit.vitty@gmail.com")) - putExtra(Intent.EXTRA_SUBJECT, "Bug Report - VITTY Android v${context.packageManager.getPackageInfo(context.packageName, 0).versionName}") - putExtra(Intent.EXTRA_TEXT, emailTemplate) - } - try { context.startActivity(Intent.createChooser(emailIntent, "Send Bug Report")) onDismiss() } catch (e: Exception) { // Fallback if no email client available - val fallbackIntent = Intent(Intent.ACTION_SEND).apply { - type = "text/plain" - putExtra(Intent.EXTRA_TEXT, emailTemplate) - } + val fallbackIntent = + Intent(Intent.ACTION_SEND).apply { + type = "text/plain" + putExtra(Intent.EXTRA_TEXT, emailTemplate) + } context.startActivity(Intent.createChooser(fallbackIntent, "Share Bug Report")) onDismiss() } } - + fun openGitHub() { UtilFunctions.openLink(context, "https://github.com/GDGVIT/vitty-app/issues") onDismiss() @@ -1580,7 +1572,7 @@ VITTY Android App User painter = painterResource(R.drawable.ic_support), contentDescription = null, tint = Accent, - modifier = Modifier.size(32.dp) + modifier = Modifier.size(32.dp), ) }, title = { @@ -1589,86 +1581,89 @@ VITTY Android App User style = MaterialTheme.typography.headlineSmall, color = TextColor, fontWeight = FontWeight.Bold, - textAlign = TextAlign.Center + textAlign = TextAlign.Center, ) }, text = { Column( - modifier = Modifier.fillMaxWidth() + modifier = Modifier.fillMaxWidth(), ) { Text( text = "Troubleshooting Steps:", style = MaterialTheme.typography.titleMedium, color = TextColor, - fontWeight = FontWeight.Bold + fontWeight = FontWeight.Bold, ) - + Spacer(modifier = Modifier.height(12.dp)) - - val troubleshootingSteps = listOf( - "1. Update the app from Play Store", - "2. Log out and log back in", - "3. Clear app cache (Settings > Apps > Vitty > Storage)" - ) - + + val troubleshootingSteps = + listOf( + "1. Update the app from Play Store", + "2. Log out and log back in", + "3. Clear app cache (Settings > Apps > Vitty > Storage)", + ) + troubleshootingSteps.forEach { step -> Text( text = step, style = MaterialTheme.typography.bodyMedium, color = TextColor.copy(alpha = 0.9f), fontSize = 15.sp, - lineHeight = 20.sp + lineHeight = 20.sp, ) Spacer(modifier = Modifier.height(8.dp)) } - + Spacer(modifier = Modifier.height(20.dp)) - + Text( text = "Still need help?", style = MaterialTheme.typography.titleSmall, color = Accent, - fontWeight = FontWeight.SemiBold + fontWeight = FontWeight.SemiBold, ) - + Spacer(modifier = Modifier.height(16.dp)) - + // Email Support Button Button( onClick = { openEmailSupport() }, modifier = Modifier.fillMaxWidth(), - colors = ButtonDefaults.buttonColors( - containerColor = Accent, - contentColor = Background - ), + colors = + ButtonDefaults.buttonColors( + containerColor = Accent, + contentColor = Background, + ), shape = RoundedCornerShape(12.dp), - elevation = ButtonDefaults.buttonElevation(defaultElevation = 2.dp) + elevation = ButtonDefaults.buttonElevation(defaultElevation = 2.dp), ) { Text( text = "Email Support", fontWeight = FontWeight.SemiBold, fontSize = 16.sp, - modifier = Modifier.padding(vertical = 4.dp) + modifier = Modifier.padding(vertical = 4.dp), ) } - + Spacer(modifier = Modifier.height(12.dp)) - + // GitHub Issues Button OutlinedButton( onClick = { openGitHub() }, modifier = Modifier.fillMaxWidth(), - colors = ButtonDefaults.outlinedButtonColors( - contentColor = Accent - ), + colors = + ButtonDefaults.outlinedButtonColors( + contentColor = Accent, + ), border = BorderStroke(2.dp, Accent), - shape = RoundedCornerShape(12.dp) + shape = RoundedCornerShape(12.dp), ) { Text( text = "GitHub Issues", fontWeight = FontWeight.SemiBold, fontSize = 16.sp, - modifier = Modifier.padding(vertical = 4.dp) + modifier = Modifier.padding(vertical = 4.dp), ) } } @@ -1677,22 +1672,23 @@ VITTY Android App User dismissButton = { Button( onClick = onDismiss, - colors = ButtonDefaults.buttonColors( - containerColor = Secondary, - contentColor = TextColor - ), + colors = + ButtonDefaults.buttonColors( + containerColor = Secondary, + contentColor = TextColor, + ), shape = RoundedCornerShape(12.dp), - border = BorderStroke(1.dp, TextColor.copy(alpha = 0.2f)) + border = BorderStroke(1.dp, TextColor.copy(alpha = 0.2f)), ) { Text( text = "Close", fontWeight = FontWeight.SemiBold, - fontSize = 16.sp + fontSize = 16.sp, ) } }, containerColor = Secondary, titleContentColor = TextColor, - textContentColor = Accent + textContentColor = Accent, ) } diff --git a/app/src/main/java/com/dscvit/vitty/ui/schedule/ScheduleScreenContent.kt b/app/src/main/java/com/dscvit/vitty/ui/schedule/ScheduleScreenContent.kt index 93d5d26..e68cfc1 100644 --- a/app/src/main/java/com/dscvit/vitty/ui/schedule/ScheduleScreenContent.kt +++ b/app/src/main/java/com/dscvit/vitty/ui/schedule/ScheduleScreenContent.kt @@ -410,7 +410,7 @@ private fun DayContent( ) { items( items = periods, - key = { period -> "${period.startTime}_${period.courseCode}_${period.slot}_${period.endTime}" }, + key = { period -> "${periods.indexOf(period)}${period.startTime}_${period.courseCode}_${period.slot}_${period.endTime}" }, ) { period -> PeriodCard( period = period, diff --git a/app/src/main/java/com/dscvit/vitty/util/Constants.kt b/app/src/main/java/com/dscvit/vitty/util/Constants.kt index e5e2bbd..559acae 100755 --- a/app/src/main/java/com/dscvit/vitty/util/Constants.kt +++ b/app/src/main/java/com/dscvit/vitty/util/Constants.kt @@ -66,9 +66,6 @@ object Constants { const val REMINDER_CHANNEL_DESC = "Notifications for course reminders" const val PREF_LAST_REVIEW_REQUEST = "last_review_request" - - const val ACTIVE_FRIENDS_FETCHED = "active_friends_fetched" - const val ACTIVE_FRIENDS_LIST = "active_friends_list" } fun String.urlDecode(): String = diff --git a/app/src/main/java/com/dscvit/vitty/util/LogoutHelper.kt b/app/src/main/java/com/dscvit/vitty/util/LogoutHelper.kt index d25b03d..cb0ee40 100755 --- a/app/src/main/java/com/dscvit/vitty/util/LogoutHelper.kt +++ b/app/src/main/java/com/dscvit/vitty/util/LogoutHelper.kt @@ -58,8 +58,6 @@ object LogoutHelper { putString(Constants.COMMUNITY_CAMPUS, null) putBoolean(Constants.COMMUNITY_TIMETABLE_AVAILABLE, false) putString(Constants.CACHE_COMMUNITY_TIMETABLE, null) - putBoolean(Constants.ACTIVE_FRIENDS_FETCHED, false) - putString(Constants.ACTIVE_FRIENDS_FETCHED, null) putString(Constants.COMMUNITY_PINNED_FRIEND_1, null) putString(Constants.COMMUNITY_PINNED_FRIEND_2, null) putString(Constants.COMMUNITY_PINNED_FRIEND_3, null) diff --git a/app/src/main/java/com/dscvit/vitty/util/WebConstants.kt b/app/src/main/java/com/dscvit/vitty/util/WebConstants.kt index 6897fae..dedffab 100644 --- a/app/src/main/java/com/dscvit/vitty/util/WebConstants.kt +++ b/app/src/main/java/com/dscvit/vitty/util/WebConstants.kt @@ -1,6 +1,6 @@ package com.dscvit.vitty.util object WebConstants { - const val COMMUNITY_BASE_URL = "https://api-vitty.dscvit.com" + const val COMMUNITY_BASE_URL = "https://visiting-eba-vitty-d61856bb.koyeb.app" const val TIMEOUT = 10 } From 564d780c3e334d436ed0362e238856aaa2c1d468 Mon Sep 17 00:00:00 2001 From: JothishKamal Date: Mon, 11 Aug 2025 00:22:15 +0530 Subject: [PATCH 4/4] chore: update base url --- app/src/main/java/com/dscvit/vitty/util/WebConstants.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/dscvit/vitty/util/WebConstants.kt b/app/src/main/java/com/dscvit/vitty/util/WebConstants.kt index dedffab..6897fae 100644 --- a/app/src/main/java/com/dscvit/vitty/util/WebConstants.kt +++ b/app/src/main/java/com/dscvit/vitty/util/WebConstants.kt @@ -1,6 +1,6 @@ package com.dscvit.vitty.util object WebConstants { - const val COMMUNITY_BASE_URL = "https://visiting-eba-vitty-d61856bb.koyeb.app" + const val COMMUNITY_BASE_URL = "https://api-vitty.dscvit.com" const val TIMEOUT = 10 }