HomeTab.kt (6700B) - raw
1 package me.rhunk.snapenhance.manager.ui.tab.impl 2 3 import android.content.pm.ApplicationInfo.FLAG_DEBUGGABLE 4 import android.content.pm.PackageInfo 5 import androidx.activity.ComponentActivity 6 import androidx.compose.foundation.clickable 7 import androidx.compose.foundation.layout.Arrangement 8 import androidx.compose.foundation.layout.Column 9 import androidx.compose.foundation.layout.Row 10 import androidx.compose.foundation.layout.fillMaxWidth 11 import androidx.compose.foundation.layout.padding 12 import androidx.compose.material.icons.Icons 13 import androidx.compose.material.icons.filled.Check 14 import androidx.compose.material.icons.filled.Close 15 import androidx.compose.material.icons.filled.Home 16 import androidx.compose.material.icons.filled.OpenInNew 17 import androidx.compose.material3.Card 18 import androidx.compose.material3.Icon 19 import androidx.compose.material3.MaterialTheme 20 import androidx.compose.material3.Text 21 import androidx.compose.runtime.* 22 import androidx.compose.ui.Alignment 23 import androidx.compose.ui.Modifier 24 import androidx.compose.ui.platform.LocalContext 25 import androidx.compose.ui.text.font.FontWeight 26 import androidx.compose.ui.unit.dp 27 import androidx.compose.ui.unit.sp 28 import kotlinx.coroutines.Dispatchers 29 import kotlinx.coroutines.launch 30 import me.rhunk.snapenhance.manager.patch.config.Constants 31 import me.rhunk.snapenhance.manager.ui.tab.Tab 32 import me.rhunk.snapenhance.manager.ui.tab.impl.download.SEDownloadTab 33 import me.rhunk.snapenhance.manager.ui.tab.impl.download.SnapchatPatchTab 34 35 class HomeTab : Tab("home", true, icon = Icons.Default.Home) { 36 override fun init(activity: ComponentActivity) { 37 super.init(activity) 38 registerNestedTab(SEDownloadTab::class) 39 registerNestedTab(SnapchatPatchTab::class) 40 } 41 42 @Composable 43 override fun Content() { 44 val context = LocalContext.current 45 val coroutineScope = rememberCoroutineScope() 46 var snapchatAppInfo by remember { mutableStateOf(null as PackageInfo?) } 47 var snapEnhanceInfo by remember { mutableStateOf(null as PackageInfo?) } 48 49 Column { 50 51 Card( 52 modifier = Modifier 53 .fillMaxWidth() 54 .padding(10.dp), 55 ) { 56 Row( 57 modifier = Modifier 58 .fillMaxWidth() 59 .clickable { 60 navigation.navigateTo(SEDownloadTab::class) 61 } 62 .padding(16.dp), 63 verticalAlignment = Alignment.CenterVertically 64 ) { 65 Column { 66 Text(text = "SnapEnhance", fontSize = 24.sp, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.Bold) 67 snapEnhanceInfo?.let { 68 Text(text = "${it.versionName} (${it.longVersionCode}) - ${if ((it.applicationInfo.flags and FLAG_DEBUGGABLE) != 0) "Debug" else "Release"}", fontSize = 12.sp, color = MaterialTheme.colorScheme.onSurfaceVariant) 69 Text(it.packageName, fontSize = 12.sp, color = MaterialTheme.colorScheme.onSurfaceVariant) 70 } 71 } 72 Row( 73 modifier = Modifier 74 .weight(1f), 75 horizontalArrangement = Arrangement.End, 76 verticalAlignment = Alignment.CenterVertically 77 ) { 78 snapEnhanceInfo?.let { 79 Text(text = "Installed", fontSize = 16.sp, color = MaterialTheme.colorScheme.onSurface) 80 } ?: run { 81 Text(text = "Not installed", fontSize = 16.sp, color = MaterialTheme.colorScheme.onSurface) 82 } 83 84 Icon(imageVector = Icons.Default.OpenInNew, contentDescription = null, Modifier.padding(10.dp)) 85 } 86 } 87 } 88 89 Card( 90 modifier = Modifier 91 .fillMaxWidth() 92 .padding(10.dp), 93 ) { 94 Row( 95 modifier = Modifier 96 .fillMaxWidth() 97 .clickable { 98 navigation.navigateTo(SnapchatPatchTab::class) 99 } 100 .padding(16.dp), 101 verticalAlignment = Alignment.CenterVertically 102 ) { 103 Column { 104 Text(text = "Snapchat", fontSize = 24.sp, color = MaterialTheme.colorScheme.onSurface, fontWeight = FontWeight.Bold) 105 snapchatAppInfo?.let { 106 Text(text = "${it.versionName} (${it.longVersionCode})", fontSize = 12.sp, color = MaterialTheme.colorScheme.onSurfaceVariant) 107 } 108 } 109 Row( 110 modifier = Modifier 111 .weight(1f), 112 horizontalArrangement = Arrangement.spacedBy(10.dp, Alignment.End), 113 verticalAlignment = Alignment.CenterVertically 114 ) { 115 snapchatAppInfo?.let { appInfo -> 116 val isLSPatched = appInfo.applicationInfo.appComponentFactory == Constants.PROXY_APP_COMPONENT_FACTORY 117 if (isLSPatched) { 118 Icon(imageVector = Icons.Default.Check, contentDescription = null) 119 Text(text = "Patched", fontSize = 16.sp) 120 } else { 121 Icon(imageVector = Icons.Default.Close, contentDescription = null) 122 Text(text = "Not patched", fontSize = 16.sp, color = MaterialTheme.colorScheme.onSurface) 123 } 124 } ?: run { 125 Text(text = "Not installed", fontSize = 16.sp, color = MaterialTheme.colorScheme.onSurface) 126 } 127 128 } 129 } 130 131 } 132 } 133 134 SideEffect { 135 coroutineScope.launch(Dispatchers.IO) { 136 runCatching { 137 snapchatAppInfo = runCatching { 138 context.packageManager.getPackageInfo(sharedConfig.snapchatPackageName, 0) 139 }.getOrNull() 140 snapEnhanceInfo = runCatching { 141 context.packageManager.getPackageInfo(sharedConfig.snapEnhancePackageName, 0) 142 }.getOrNull() 143 } 144 } 145 } 146 } 147 }