diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 62eae448..fd79b140 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -76,8 +76,8 @@ android { applicationId = "chat.revolt" minSdk = 24 targetSdk = 35 - versionCode = Integer.parseInt("001_003_000".replace("_", ""), 10) - versionName = "1.3.0" + versionCode = Integer.parseInt("001_003_001".replace("_", ""), 10) + versionName = "1.3.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 87d4d177..980cdb06 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,7 +81,7 @@ android:name=".activities.InviteActivity" android:theme="@style/Theme.Revolt" android:exported="true"> - + @@ -91,11 +91,10 @@ - - + @@ -105,6 +104,12 @@ + + + + diff --git a/app/src/main/java/chat/revolt/internals/Changelogs.kt b/app/src/main/java/chat/revolt/internals/Changelogs.kt index 2f1d0c91..1841e0ba 100644 --- a/app/src/main/java/chat/revolt/internals/Changelogs.kt +++ b/app/src/main/java/chat/revolt/internals/Changelogs.kt @@ -1,7 +1,6 @@ package chat.revolt.internals import android.content.Context -import chat.revolt.BuildConfig import chat.revolt.api.REVOLT_KJBOOK import chat.revolt.api.RevoltHttp import chat.revolt.api.RevoltJson @@ -107,17 +106,14 @@ class Changelogs(val context: Context, val kvStorage: KVStorage? = null) { } val latest = getLatestChangelog().version.code - val appVersion = BuildConfig.VERSION_CODE + val lastRead = kvStorage.get("latestChangelogRead") - val appIsNewerThanLatestServerChangelog = appVersion > latest - - // If the app is newer than the latest server changelog - if (appIsNewerThanLatestServerChangelog) { - return true + if (lastRead == null) { + return false } - // Otherwise, check if the latest changelog has been read - return kvStorage.get("latestChangelogRead") == latest.toString() + // If the last read changelog is >= the latest, it has been read + return lastRead.toLong() >= latest } suspend fun markAsSeen() { diff --git a/app/src/main/java/chat/revolt/internals/CryptographicAgeVerification.kt b/app/src/main/java/chat/revolt/internals/CryptographicAgeVerification.kt deleted file mode 100644 index 7cee54ff..00000000 --- a/app/src/main/java/chat/revolt/internals/CryptographicAgeVerification.kt +++ /dev/null @@ -1,41 +0,0 @@ -package chat.revolt.internals - -import java.security.MessageDigest - -class CryptographicAgeVerification { - fun getProofHash( - seed: String, - userAge: Int, - minAllowedAge: Int - ): Pair { - var proof = MessageDigest.getInstance("SHA-256").digest(seed.toByteArray()) - - for (i in 1 until userAge - minAllowedAge) { - proof = MessageDigest.getInstance("SHA-256").digest(proof) - } - - var ageHash = - MessageDigest.getInstance("SHA-256").digest(seed.toByteArray()) - - for (i in 1 until userAge - 1) { - ageHash = MessageDigest.getInstance("SHA-256").digest(ageHash) - } - - return ageHash to proof - } - - fun proveAge( - minAllowedAge: Int, - proofHash: ByteArray, - ageHash: ByteArray, - ): Boolean { - var verifyHash = - MessageDigest.getInstance("SHA-256").digest(proofHash.toString().toByteArray()) - - for (i in 1 until minAllowedAge - 1) { - verifyHash = MessageDigest.getInstance("SHA-256").digest(verifyHash) - } - - return verifyHash.contentEquals(ageHash) - } -} \ No newline at end of file diff --git a/app/src/main/java/chat/revolt/screens/labs/LabsHomeScreen.kt b/app/src/main/java/chat/revolt/screens/labs/LabsHomeScreen.kt index eeefa702..414ed204 100644 --- a/app/src/main/java/chat/revolt/screens/labs/LabsHomeScreen.kt +++ b/app/src/main/java/chat/revolt/screens/labs/LabsHomeScreen.kt @@ -157,15 +157,6 @@ fun LabsHomeScreen(navController: NavController) { Column( modifier = Modifier.verticalScroll(rememberScrollState()) ) { - ListItem( - headlineContent = { - Text("Cryptographic Age Verification") - }, - modifier = Modifier.clickable { - navController.navigate("sandboxes/cryptoageverif") - } - ) - HorizontalDivider() ListItem( headlineContent = { Text("Settings DSL") diff --git a/app/src/main/java/chat/revolt/screens/labs/LabsRootScreen.kt b/app/src/main/java/chat/revolt/screens/labs/LabsRootScreen.kt index de11ca70..497fe782 100644 --- a/app/src/main/java/chat/revolt/screens/labs/LabsRootScreen.kt +++ b/app/src/main/java/chat/revolt/screens/labs/LabsRootScreen.kt @@ -14,7 +14,6 @@ import androidx.navigation.compose.rememberNavController import chat.revolt.api.settings.FeatureFlags import chat.revolt.screens.labs.ui.mockups.CallScreenMockup import chat.revolt.screens.labs.ui.mockups.NewLoginExperienceMockup -import chat.revolt.screens.labs.ui.sandbox.CryptographicAgeVerificationSandbox import chat.revolt.screens.labs.ui.sandbox.JBMSandbox import chat.revolt.screens.labs.ui.sandbox.SettingsDslSandbox @@ -70,9 +69,6 @@ fun LabsRootScreen(topNav: NavController) { NewLoginExperienceMockup(labsNav) } - composable("sandboxes/cryptoageverif") { - CryptographicAgeVerificationSandbox(labsNav) - } composable("sandboxes/settingsdsl") { SettingsDslSandbox(labsNav) } diff --git a/app/src/main/java/chat/revolt/screens/labs/ui/sandbox/CryptographicAgeVerificationSandbox.kt b/app/src/main/java/chat/revolt/screens/labs/ui/sandbox/CryptographicAgeVerificationSandbox.kt deleted file mode 100644 index 244c6394..00000000 --- a/app/src/main/java/chat/revolt/screens/labs/ui/sandbox/CryptographicAgeVerificationSandbox.kt +++ /dev/null @@ -1,78 +0,0 @@ -package chat.revolt.screens.labs.ui.sandbox - -import android.util.Log -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.ArrowBack -import androidx.compose.material3.Button -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.style.TextOverflow -import androidx.navigation.NavController -import chat.revolt.api.REVOLT_KJBOOK -import chat.revolt.internals.CryptographicAgeVerification - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun CryptographicAgeVerificationSandbox(navController: NavController) { - Scaffold( - topBar = { - TopAppBar( - title = { - Text( - "Crypto Age Verify Sandbox", - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - }, - navigationIcon = { - IconButton(onClick = { navController.popBackStack() }) { - Icon(Icons.AutoMirrored.Default.ArrowBack, "Back") - } - } - ) - } - ) { pv -> - Column( - Modifier - .padding(pv) - .fillMaxSize() - ) { - Button(onClick = { - val cav = CryptographicAgeVerification() - val (ageHash, verifyHash) = cav.getProofHash( - seed = REVOLT_KJBOOK, - userAge = 21, - minAllowedAge = 18 - ) - - Log.d( - "CryptographicAgeVerificationSandbox", - "ageHash: ${ageHash.contentToString()}" - ) - Log.d( - "CryptographicAgeVerificationSandbox", - "verifyHash: ${verifyHash.contentToString()}" - ) - - val verification = cav.proveAge( - minAllowedAge = 18, - proofHash = verifyHash, - ageHash = ageHash - ) - - Log.d("CryptographicAgeVerificationSandbox", "Verification result: $verification") - }) { - Text("Run Cryptographic Age Verification") - } - } - } -} \ No newline at end of file