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 }