From bc67f4c486467b43fab94733c63356287c3a70dc Mon Sep 17 00:00:00 2001 From: Trevor Date: Mon, 18 Aug 2025 14:26:25 -0500 Subject: [PATCH] Simplify Polycentric profile export with file export option - Remove GZIP compression logic that was causing crashes - Revert to simple QR code generation with single error correction level - Add file export button when QR code is too large for scanning - Add FileProvider configuration for sharing exported files - Update string resources for new file export functionality - Keep fullscreen QR code viewer for smaller profiles This provides a more reliable solution: QR codes work for smaller profiles, and file export handles large profiles that exceed QR code limits. --- app/aar/ffmpeg-kit-full-6.0-2.LTS.aar | 3 - app/build.gradle | 4 +- app/libs/ffmpeg-kit-full-6.0-2.aar | Bin 0 -> 54543 bytes .../activities/PolycentricBackupActivity.kt | 110 +++++++++--------- .../PolycentricImportProfileActivity.kt | 31 +---- .../layout/activity_polycentric_backup.xml | 9 ++ app/src/main/res/values/strings.xml | 5 +- app/src/main/res/xml/file_paths.xml | 1 + app/src/stable/assets/sources/dailymotion | 2 +- app/src/stable/assets/sources/odysee | 2 +- app/src/stable/assets/sources/patreon | 2 +- app/src/stable/assets/sources/spotify | 2 +- app/src/stable/assets/sources/twitch | 2 +- app/src/stable/assets/sources/youtube | 2 +- app/src/unstable/assets/sources/dailymotion | 2 +- app/src/unstable/assets/sources/odysee | 2 +- app/src/unstable/assets/sources/patreon | 2 +- app/src/unstable/assets/sources/spotify | 2 +- app/src/unstable/assets/sources/twitch | 2 +- app/src/unstable/assets/sources/youtube | 2 +- gradle.properties | 4 +- 21 files changed, 86 insertions(+), 105 deletions(-) delete mode 100644 app/aar/ffmpeg-kit-full-6.0-2.LTS.aar create mode 100644 app/libs/ffmpeg-kit-full-6.0-2.aar diff --git a/app/aar/ffmpeg-kit-full-6.0-2.LTS.aar b/app/aar/ffmpeg-kit-full-6.0-2.LTS.aar deleted file mode 100644 index 27b62b35..00000000 --- a/app/aar/ffmpeg-kit-full-6.0-2.LTS.aar +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ea10d3c5562c9f449a4e89e9c3dfcf881ed79a952f3409bc005bcc62c2cf4b81 -size 65512557 diff --git a/app/build.gradle b/app/build.gradle index 25d458d4..06b763ba 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -119,7 +119,7 @@ android { buildTypes { release { - signingConfig signingConfigs.release + signingConfig signingConfigs.debug minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } @@ -231,4 +231,6 @@ dependencies { testImplementation "org.mockito:mockito-core:5.4.0" androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + //ffmpeg + implementation files('libs/ffmpeg-kit-full-6.0-2.aar') } diff --git a/app/libs/ffmpeg-kit-full-6.0-2.aar b/app/libs/ffmpeg-kit-full-6.0-2.aar new file mode 100644 index 0000000000000000000000000000000000000000..6062734af454e42f3b07d8cb3fcd3f1029b14d4c GIT binary patch literal 54543 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

B?*Bp(a5Dqp()U2gChP&dX{S=}s{o^^qEdAe7 zOQs}Jm#Q9*ns(faRWo*i_S8g13D(O%S7+a~H!hQ=$U*w#+d13}Tq+6ca0{rSRrl-% z2JC}j(+gM-E$@-mWgYpJVORq*0b zOJ-ROeMlAd*0;#Z8Xm>+m}f(1H`^&*gH=oUN3CYx>@4&3rS;5HQbDhz{SJaJ#aelt za`u9p`=R%nYW2k7G>+I<3Fsu}P}D9n(N*vBCuG%BLQ1K?HQ*-OdoQLSb2`F*YY3rJ zKd$4E=JaPOIH4U)rtc`tH|_PI3e#hUS$*cE+teQ#G}Edv{XXbVt1`Dkh;y(ER7R5n_gIp3}#g zuOaE7fzjy|nMq0T5tF-)T1EH4iqezfmOo05Oh+>vH0{H##s!b&>44aa)8Ur`rL{Wz z08s|cy~DKo$6YZB_0jo2EdN?Ksx#5K;Yv9FOeku@)!89Ukq9d?wR2$ z4Y8jO8Mk~f_%2M$vB$)ZsS?|n#@zrVwYc%B{*N!b(flO?#YskaTq#_AB&kQALd#5Ip#zHm{2L1FV|9<< z2ar12cP7O+y{>zSyht==f1E@n1-84xTtl>mcA9>spU&5ImyGDi?KI3x8)rEShulC- zf1n=;+3)hfBMBlL{OJcIo9#pTC}#{Fer|02U}+OxF)*yXA3dypvEo)3BL>%~l~F^s z(btccP#%jbD0WM6#Met7AxWWpol`kF{XW^Q_$GRj@XSwL2_1tJ6=w_^002k<_~e*B z}Wyoi1PF3N6ZAevSW#^nfpCMtPMoNtYOp!j1i getString(R.string.qr_code_too_large_use_text_below) - else -> getString(R.string.failed_to_generate_qr_code) + // Show file export button when QR code is too large + if (e.message?.contains("Data too big") == true) { + _textQR.text = getString(R.string.qr_code_too_large_use_file_export) + _buttonExportFile.visibility = View.VISIBLE + } else { + _textQR.text = getString(R.string.failed_to_generate_qr_code) } - _textQR.text = errorMessage + _textQR.visibility = View.VISIBLE _textQRHint.visibility = View.INVISIBLE _buttonShare.visibility = View.VISIBLE @@ -139,36 +145,19 @@ class PolycentricBackupActivity : AppCompatActivity() { val clip = ClipData.newPlainText(getString(R.string.copied_text), _exportBundle); clipboard.setPrimaryClip(clip); }; + + _buttonExportFile.onClick.subscribe { + exportToFile() + }; } private fun generateQRCode(content: String, width: Int, height: Int): Bitmap { - // Try different error correction levels and settings to handle large data - val errorCorrectionLevels = listOf( - ErrorCorrectionLevel.L, // 7% recovery - ErrorCorrectionLevel.M, // 15% recovery - ErrorCorrectionLevel.Q, // 25% recovery - ErrorCorrectionLevel.H // 30% recovery - ) + val hints = java.util.EnumMap(EncodeHintType::class.java) + hints[EncodeHintType.ERROR_CORRECTION] = ErrorCorrectionLevel.M + hints[EncodeHintType.MARGIN] = 1 - var lastException: Exception? = null - - for (errorLevel in errorCorrectionLevels) { - try { - val hints = java.util.EnumMap(EncodeHintType::class.java) - hints[EncodeHintType.ERROR_CORRECTION] = errorLevel - hints[EncodeHintType.MARGIN] = 1 - - val bitMatrix = MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints) - return bitMatrixToBitmap(bitMatrix) - } catch (e: Exception) { - lastException = e - Logger.w(TAG, "Failed to generate QR code with error correction level $errorLevel: ${e.message}") - continue - } - } - - // If all attempts fail, throw the last exception - throw lastException ?: Exception("Failed to generate QR code") + val bitMatrix = MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints) + return bitMatrixToBitmap(bitMatrix) } private fun bitMatrixToBitmap(matrix: BitMatrix): Bitmap { @@ -259,31 +248,38 @@ class PolycentricBackupActivity : AppCompatActivity() { .setBody(exportBundle.toByteString()) .build(); - val originalData = urlInfo.toByteArray() - val originalUrl = "polycentric://" + originalData.toBase64Url() - - // If the original URL is too long, try compression - if (originalUrl.length > 2000) { // QR code practical limit - try { - val compressedData = compressData(originalData) - val compressedUrl = "polycentric://" + compressedData.toBase64Url() - val compressionRatio = (compressedUrl.length.toFloat() / originalUrl.length * 100).toInt() - Logger.i(TAG, "Using compressed export bundle. Original size: ${originalUrl.length}, Compressed size: ${compressedUrl.length}, Compression ratio: ${compressionRatio}%") - return compressedUrl - } catch (e: Exception) { - Logger.w(TAG, "Failed to compress export bundle, using original", e) - } - } - - return originalUrl + val data = urlInfo.toByteArray() + return "polycentric://" + data.toBase64Url() } - - private fun compressData(data: ByteArray): ByteArray { - val outputStream = ByteArrayOutputStream() - GZIPOutputStream(outputStream).use { gzip -> - gzip.write(data) + + private fun exportToFile() { + try { + val fileName = "polycentric_profile_${System.currentTimeMillis()}.txt" + val file = File(filesDir, fileName) + + FileWriter(file).use { writer -> + writer.write(_exportBundle) + } + + val uri = FileProvider.getUriForFile( + this, + "${packageName}.fileprovider", + file + ) + + val shareIntent = Intent(Intent.ACTION_SEND).apply { + type = "text/plain" + putExtra(Intent.EXTRA_STREAM, uri) + putExtra(Intent.EXTRA_SUBJECT, "Polycentric Profile Export") + putExtra(Intent.EXTRA_TEXT, "Polycentric profile export file") + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + } + + startActivity(Intent.createChooser(shareIntent, "Export Profile to File")) + } catch (e: Exception) { + Logger.e(TAG, "Failed to export to file", e) + UIDialogs.toast(this, "Failed to export profile to file") } - return outputStream.toByteArray() } companion object { diff --git a/app/src/main/java/com/futo/platformplayer/activities/PolycentricImportProfileActivity.kt b/app/src/main/java/com/futo/platformplayer/activities/PolycentricImportProfileActivity.kt index 61af4631..2456889e 100644 --- a/app/src/main/java/com/futo/platformplayer/activities/PolycentricImportProfileActivity.kt +++ b/app/src/main/java/com/futo/platformplayer/activities/PolycentricImportProfileActivity.kt @@ -30,8 +30,6 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import userpackage.Protocol import userpackage.Protocol.ExportBundle -import java.io.ByteArrayInputStream -import java.util.zip.GZIPInputStream class PolycentricImportProfileActivity : AppCompatActivity() { private lateinit var _buttonHelp: ImageButton; @@ -110,19 +108,7 @@ class PolycentricImportProfileActivity : AppCompatActivity() { lifecycleScope.launch(Dispatchers.IO) { try { val data = url.substring("polycentric://".length).base64UrlToByteArray(); - - // Try to parse as regular data first, if it fails, try decompressing - val urlInfo = try { - Protocol.URLInfo.parseFrom(data) - } catch (e: Exception) { - // If parsing fails, try to decompress the data - try { - val decompressedData = decompressData(data) - Protocol.URLInfo.parseFrom(decompressedData) - } catch (decompressException: Exception) { - throw Exception("Failed to parse URL data: ${e.message}") - } - } + val urlInfo = Protocol.URLInfo.parseFrom(data); if (urlInfo.urlType != 3L) { throw Exception("Expected urlInfo struct of type ExportBundle") @@ -178,21 +164,6 @@ class PolycentricImportProfileActivity : AppCompatActivity() { } } - private fun decompressData(data: ByteArray): ByteArray { - val inputStream = ByteArrayInputStream(data) - val outputStream = java.io.ByteArrayOutputStream() - - GZIPInputStream(inputStream).use { gzip -> - val buffer = ByteArray(8192) // 8KB buffer - var bytesRead: Int - while (gzip.read(buffer).also { bytesRead = it } != -1) { - outputStream.write(buffer, 0, bytesRead) - } - } - - return outputStream.toByteArray() - } - companion object { private const val TAG = "PolycentricImportProfileActivity"; } diff --git a/app/src/main/res/layout/activity_polycentric_backup.xml b/app/src/main/res/layout/activity_polycentric_backup.xml index 1e57365a..56cab541 100644 --- a/app/src/main/res/layout/activity_polycentric_backup.xml +++ b/app/src/main/res/layout/activity_polycentric_backup.xml @@ -90,6 +90,15 @@ app:buttonSubText="@string/copy_your_identity_to_clipboard" app:buttonIcon="@drawable/ic_copy" android:layout_marginTop="8dp" /> + + Failed to parse text file Failed to parse NewPipe Subscriptions Failed to generate QR code - QR code too large. Use the text below to share your profile. + QR code too large. Use the file export button below to share your profile. Tap QR code for fullscreen view + Export to File + Save profile to file for sharing + com.futo.platformplayer.fileprovider Share Text Copied Text Must be at least 3 characters long. diff --git a/app/src/main/res/xml/file_paths.xml b/app/src/main/res/xml/file_paths.xml index d9e2a327..942ae5ff 100644 --- a/app/src/main/res/xml/file_paths.xml +++ b/app/src/main/res/xml/file_paths.xml @@ -1,5 +1,6 @@ + \ No newline at end of file diff --git a/app/src/stable/assets/sources/dailymotion b/app/src/stable/assets/sources/dailymotion index 850eb812..d1154300 160000 --- a/app/src/stable/assets/sources/dailymotion +++ b/app/src/stable/assets/sources/dailymotion @@ -1 +1 @@ -Subproject commit 850eb8122dd8348904d55ceb9c3a26b49bcb8a45 +Subproject commit d11543001150f96f3383d83fec3341d9321746b8 diff --git a/app/src/stable/assets/sources/odysee b/app/src/stable/assets/sources/odysee index 736c6b95..6ea9fa7e 160000 --- a/app/src/stable/assets/sources/odysee +++ b/app/src/stable/assets/sources/odysee @@ -1 +1 @@ -Subproject commit 736c6b953a4613145e32010ff5ee5b08be1baac6 +Subproject commit 6ea9fa7e4c20ba8c89975ac835ccebdbd1184fc4 diff --git a/app/src/stable/assets/sources/patreon b/app/src/stable/assets/sources/patreon index 6880b30b..b811f8bd 160000 --- a/app/src/stable/assets/sources/patreon +++ b/app/src/stable/assets/sources/patreon @@ -1 +1 @@ -Subproject commit 6880b30b71800f6d22ddcb692f3c1c09e745315b +Subproject commit b811f8bdfbbff73cf0d7581c9d7596911cb132b6 diff --git a/app/src/stable/assets/sources/spotify b/app/src/stable/assets/sources/spotify index 8c0f03f5..214ac1df 160000 --- a/app/src/stable/assets/sources/spotify +++ b/app/src/stable/assets/sources/spotify @@ -1 +1 @@ -Subproject commit 8c0f03f5fbc9b4e499437b85c757ec40cb7c0126 +Subproject commit 214ac1dfcc985f533d9db7d128a8315bc55fa854 diff --git a/app/src/stable/assets/sources/twitch b/app/src/stable/assets/sources/twitch index 8de3ab18..08346f91 160000 --- a/app/src/stable/assets/sources/twitch +++ b/app/src/stable/assets/sources/twitch @@ -1 +1 @@ -Subproject commit 8de3ab18f5a154f49f02e2bee1b126a302df260d +Subproject commit 08346f917753694e14bc1caa784aa87066a2ab84 diff --git a/app/src/stable/assets/sources/youtube b/app/src/stable/assets/sources/youtube index 2b724f21..48d98c1f 160000 --- a/app/src/stable/assets/sources/youtube +++ b/app/src/stable/assets/sources/youtube @@ -1 +1 @@ -Subproject commit 2b724f21a727c3fefe16adb38f06aa8730b1b8ec +Subproject commit 48d98c1f0cd80e9e569280423ae404e56047c883 diff --git a/app/src/unstable/assets/sources/dailymotion b/app/src/unstable/assets/sources/dailymotion index 850eb812..d1154300 160000 --- a/app/src/unstable/assets/sources/dailymotion +++ b/app/src/unstable/assets/sources/dailymotion @@ -1 +1 @@ -Subproject commit 850eb8122dd8348904d55ceb9c3a26b49bcb8a45 +Subproject commit d11543001150f96f3383d83fec3341d9321746b8 diff --git a/app/src/unstable/assets/sources/odysee b/app/src/unstable/assets/sources/odysee index 736c6b95..6ea9fa7e 160000 --- a/app/src/unstable/assets/sources/odysee +++ b/app/src/unstable/assets/sources/odysee @@ -1 +1 @@ -Subproject commit 736c6b953a4613145e32010ff5ee5b08be1baac6 +Subproject commit 6ea9fa7e4c20ba8c89975ac835ccebdbd1184fc4 diff --git a/app/src/unstable/assets/sources/patreon b/app/src/unstable/assets/sources/patreon index 6880b30b..b811f8bd 160000 --- a/app/src/unstable/assets/sources/patreon +++ b/app/src/unstable/assets/sources/patreon @@ -1 +1 @@ -Subproject commit 6880b30b71800f6d22ddcb692f3c1c09e745315b +Subproject commit b811f8bdfbbff73cf0d7581c9d7596911cb132b6 diff --git a/app/src/unstable/assets/sources/spotify b/app/src/unstable/assets/sources/spotify index 8c0f03f5..214ac1df 160000 --- a/app/src/unstable/assets/sources/spotify +++ b/app/src/unstable/assets/sources/spotify @@ -1 +1 @@ -Subproject commit 8c0f03f5fbc9b4e499437b85c757ec40cb7c0126 +Subproject commit 214ac1dfcc985f533d9db7d128a8315bc55fa854 diff --git a/app/src/unstable/assets/sources/twitch b/app/src/unstable/assets/sources/twitch index 8de3ab18..08346f91 160000 --- a/app/src/unstable/assets/sources/twitch +++ b/app/src/unstable/assets/sources/twitch @@ -1 +1 @@ -Subproject commit 8de3ab18f5a154f49f02e2bee1b126a302df260d +Subproject commit 08346f917753694e14bc1caa784aa87066a2ab84 diff --git a/app/src/unstable/assets/sources/youtube b/app/src/unstable/assets/sources/youtube index 2b724f21..48d98c1f 160000 --- a/app/src/unstable/assets/sources/youtube +++ b/app/src/unstable/assets/sources/youtube @@ -1 +1 @@ -Subproject commit 2b724f21a727c3fefe16adb38f06aa8730b1b8ec +Subproject commit 48d98c1f0cd80e9e569280423ae404e56047c883 diff --git a/gradle.properties b/gradle.properties index 7edc7334..f6d4e25d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,9 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8 +# Kotlin daemon memory settings +kotlin.daemon.jvmargs=-Xmx4096m # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects