From 38faedb4b51ac620bfb5819ce13c6da5041c0abb Mon Sep 17 00:00:00 2001 From: Finnley Somdahl <87634197+rebelonion@users.noreply.github.com> Date: Wed, 22 Nov 2023 23:38:22 -0600 Subject: [PATCH] rpc fix and api 34 fix --- app/src/main/AndroidManifest.xml | 3 +- .../dantotsu/connections/discord/Discord.kt | 2 +- .../ani/dantotsu/connections/discord/Login.kt | 46 +++++++++++++------ .../ani/dantotsu/connections/discord/RPC.kt | 16 +++---- .../download/manga/MangaDownloaderService.kt | 10 +++- .../dantotsu/media/manga/MangaReadFragment.kt | 2 +- .../java/ani/dantotsu/others/AppUpdater.kt | 2 +- .../PackageInstallerInstallerAnime.kt | 11 ++++- .../util/AnimeExtensionInstallReceiver.kt | 2 +- .../util/AnimeExtensionInstallService.kt | 8 +++- .../PackageInstallerInstallerManga.kt | 11 ++++- .../util/MangaExtensionInstallReceiver.kt | 2 +- .../util/MangaExtensionInstallService.kt | 10 +++- app/src/main/res/values/strings.xml | 1 + 14 files changed, 89 insertions(+), 37 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b3e07cea..84d17a8f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,7 +9,6 @@ android:name="android.hardware.touchscreen" android:required="false" /> - @@ -23,6 +22,8 @@ + + diff --git a/app/src/main/java/ani/dantotsu/connections/discord/Discord.kt b/app/src/main/java/ani/dantotsu/connections/discord/Discord.kt index 00c9c31e..f718677f 100644 --- a/app/src/main/java/ani/dantotsu/connections/discord/Discord.kt +++ b/app/src/main/java/ani/dantotsu/connections/discord/Discord.kt @@ -103,7 +103,7 @@ object Discord { applicationId = "1163925779692912771" smallImage = RPC.Link( "Dantotsu", - "mp:attachments/1163940221063278672/1163940262423298141/bitmap1024.png" + "mp:attachments/1167176318266380288/1176997397797277856/logo-best_of_both.png" ) buttons.add(RPC.Link("Stream on Dantotsu", "https://github.com/rebelonion/Dantotsu/")) } diff --git a/app/src/main/java/ani/dantotsu/connections/discord/Login.kt b/app/src/main/java/ani/dantotsu/connections/discord/Login.kt index 8f43718a..6554f20b 100644 --- a/app/src/main/java/ani/dantotsu/connections/discord/Login.kt +++ b/app/src/main/java/ani/dantotsu/connections/discord/Login.kt @@ -4,15 +4,18 @@ import android.annotation.SuppressLint import android.app.Application.getProcessName import android.os.Build import android.os.Bundle +import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import ani.dantotsu.R import ani.dantotsu.connections.discord.Discord.saveToken +import ani.dantotsu.logger import ani.dantotsu.startMainActivity import ani.dantotsu.themes.ThemeManager import ani.dantotsu.others.LangSet +import ani.dantotsu.snackString class Login : AppCompatActivity() { @@ -20,7 +23,7 @@ class Login : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) LangSet.setLocale(this) -ThemeManager(this).applyTheme() + ThemeManager(this).applyTheme() if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { val process = getProcessName() if (packageName != process) WebView.setDataDirectorySuffix(process) @@ -34,28 +37,41 @@ ThemeManager(this).applyTheme() settings.databaseEnabled = true settings.domStorageEnabled = true } - + WebView.setWebContentsDebuggingEnabled(true) webView.webViewClient = object : WebViewClient() { - override fun onPageFinished(view: WebView?, url: String?) { - if (url != null && url.endsWith("/app")) { - webView.stopLoading() - webView.evaluateJavascript(""" - (function() { - const wreq = webpackChunkdiscord_app.push([[Symbol()], {}, w => w]) - webpackChunkdiscord_app.pop() - const token = Object.values(wreq.c).find(m => m.exports?.Z?.getToken).exports.Z.getToken(); - return token; - })() - """.trimIndent()){ - login(it.trim('"')) - } + override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { + // Check if the URL is the one expected after a successful login + if (request?.url.toString() != "https://discord.com/login") { + // Delay the script execution to ensure the page is fully loaded + view?.postDelayed({ + view.evaluateJavascript(""" + (function() { + const wreq = (webpackChunkdiscord_app.push([[''],{},e=>{m=[];for(let c in e.c)m.push(e.c[c])}]),m).find(m=>m?.exports?.default?.getToken!==void 0).exports.default.getToken(); + return wreq; + })() + """.trimIndent()) { result -> + login(result.trim('"')) + } + }, 2000) } + return super.shouldOverrideUrlLoading(view, request) + } + + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) } } + webView.loadUrl("https://discord.com/login") } private fun login(token: String) { + if (token.isEmpty() || token == "null"){ + snackString("Failed to retrieve token") + finish() + return + } + snackString("Logged in successfully") finish() saveToken(this, token) startMainActivity(this@Login) diff --git a/app/src/main/java/ani/dantotsu/connections/discord/RPC.kt b/app/src/main/java/ani/dantotsu/connections/discord/RPC.kt index 5c3c720d..90468921 100644 --- a/app/src/main/java/ani/dantotsu/connections/discord/RPC.kt +++ b/app/src/main/java/ani/dantotsu/connections/discord/RPC.kt @@ -3,10 +3,12 @@ package ani.dantotsu.connections.discord import ani.dantotsu.connections.discord.serializers.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Deferred +import kotlinx.coroutines.Job import kotlinx.coroutines.cancel import kotlinx.coroutines.delay import kotlinx.coroutines.isActive import kotlinx.coroutines.launch +import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.serialization.Serializable import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json @@ -154,17 +156,15 @@ open class RPC(val token: String, val coroutineContext: CoroutineContext) { webSocket.close(4000, "Interrupt") } - //I hate this, but couldn't find any better way to solve it - suspend fun getUserData(): User { - var user : User? = null + //I kinda hate this + suspend fun getUserData(): User = suspendCancellableCoroutine { continuation -> whenStarted = { - user = it + continuation.resume(it, onCancellation = null) whenStarted = null } - while (user == null) { - delay(100) + continuation.invokeOnCancellation { + whenStarted = null } - return user!! } var onReceiveUserData: ((User) -> Deferred)? = null @@ -185,7 +185,7 @@ open class RPC(val token: String, val coroutineContext: CoroutineContext) { } override fun onMessage(webSocket: WebSocket, text: String) { - println("Message : $text") + println("Discord Message : $text") val map = json.decodeFromString(text) seq = map.s diff --git a/app/src/main/java/ani/dantotsu/download/manga/MangaDownloaderService.kt b/app/src/main/java/ani/dantotsu/download/manga/MangaDownloaderService.kt index 60148260..cdcf6b4c 100644 --- a/app/src/main/java/ani/dantotsu/download/manga/MangaDownloaderService.kt +++ b/app/src/main/java/ani/dantotsu/download/manga/MangaDownloaderService.kt @@ -7,6 +7,7 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.content.pm.PackageManager +import android.content.pm.ServiceInfo import android.graphics.Bitmap import android.net.Uri import android.os.Build @@ -43,6 +44,7 @@ import ani.dantotsu.snackString import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.gson.GsonBuilder import com.google.gson.InstanceCreator +import eu.kanade.tachiyomi.data.notification.Notifications import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SChapterImpl import kotlinx.coroutines.CoroutineScope @@ -79,8 +81,12 @@ class MangaDownloaderService : Service() { setOnlyAlertOnce(true) setProgress(0, 0, false) } - startForeground(NOTIFICATION_ID, builder.build()) - ContextCompat.registerReceiver(this, cancelReceiver, IntentFilter(ACTION_CANCEL_DOWNLOAD), ContextCompat.RECEIVER_NOT_EXPORTED) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + startForeground(NOTIFICATION_ID, builder.build(), ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC) + }else{ + startForeground(NOTIFICATION_ID, builder.build()) + } + ContextCompat.registerReceiver(this, cancelReceiver, IntentFilter(ACTION_CANCEL_DOWNLOAD), ContextCompat.RECEIVER_EXPORTED) } override fun onDestroy() { diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt index 0a7d8503..4adc7f0a 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt @@ -105,7 +105,7 @@ open class MangaReadFragment : Fragment(), ScanlatorSelectionListener { addAction(ACTION_DOWNLOAD_PROGRESS) } - ContextCompat.registerReceiver(requireContext(), downloadStatusReceiver, intentFilter, ContextCompat.RECEIVER_NOT_EXPORTED) + ContextCompat.registerReceiver(requireContext(), downloadStatusReceiver, intentFilter, ContextCompat.RECEIVER_EXPORTED) binding.animeSourceRecycler.updatePadding(bottom = binding.animeSourceRecycler.paddingBottom + navBarHeight) screenWidth = resources.displayMetrics.widthPixels.dp diff --git a/app/src/main/java/ani/dantotsu/others/AppUpdater.kt b/app/src/main/java/ani/dantotsu/others/AppUpdater.kt index 989ec5c5..e6a39fb0 100644 --- a/app/src/main/java/ani/dantotsu/others/AppUpdater.kt +++ b/app/src/main/java/ani/dantotsu/others/AppUpdater.kt @@ -174,7 +174,7 @@ object AppUpdater { } } }, IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE), - ContextCompat.RECEIVER_NOT_EXPORTED + ContextCompat.RECEIVER_EXPORTED ) return true } diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/installer/PackageInstallerInstallerAnime.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/installer/PackageInstallerInstallerAnime.kt index a3ae1054..b1fd050b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/installer/PackageInstallerInstallerAnime.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/installer/PackageInstallerInstallerAnime.kt @@ -9,6 +9,7 @@ import android.content.IntentFilter import android.content.pm.PackageInstaller import android.os.Build import androidx.core.content.ContextCompat +import ani.dantotsu.snackString import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.util.lang.use import eu.kanade.tachiyomi.util.system.getParcelableExtraCompat @@ -72,12 +73,18 @@ class PackageInstallerInstallerAnime(private val service: Service) : InstallerAn service, activeSession!!.second, Intent(INSTALL_ACTION), - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) PendingIntent.FLAG_MUTABLE else 0, + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_ALLOW_UNSAFE_IMPLICIT_INTENT + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + PendingIntent.FLAG_MUTABLE + } else 0 ).intentSender session.commit(intentSender) } } catch (e: Exception) { logcat(LogPriority.ERROR, e) { "Failed to install extension ${entry.downloadId} ${entry.uri}" } + logcat(LogPriority.ERROR) { "Exception: $e" } + snackString("Failed to install extension ${entry.downloadId} ${entry.uri}") activeSession?.let { (_, sessionId) -> packageInstaller.abandonSession(sessionId) } @@ -101,7 +108,7 @@ class PackageInstallerInstallerAnime(private val service: Service) : InstallerAn } init { - ContextCompat.registerReceiver(service, packageActionReceiver, IntentFilter(INSTALL_ACTION), ContextCompat.RECEIVER_NOT_EXPORTED) + ContextCompat.registerReceiver(service, packageActionReceiver, IntentFilter(INSTALL_ACTION), ContextCompat.RECEIVER_EXPORTED) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallReceiver.kt index c4a6de74..ed1f4e60 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallReceiver.kt @@ -28,7 +28,7 @@ internal class AnimeExtensionInstallReceiver(private val listener: Listener) : * Registers this broadcast receiver */ fun register(context: Context) { - ContextCompat.registerReceiver(context, this, filter, ContextCompat.RECEIVER_NOT_EXPORTED) + ContextCompat.registerReceiver(context, this, filter, ContextCompat.RECEIVER_EXPORTED) } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallService.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallService.kt index 62ad05c4..fd5353f0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/anime/util/AnimeExtensionInstallService.kt @@ -3,7 +3,9 @@ package eu.kanade.tachiyomi.extension.anime.util import android.app.Service import android.content.Context import android.content.Intent +import android.content.pm.ServiceInfo import android.net.Uri +import android.os.Build import android.os.IBinder import eu.kanade.domain.base.BasePreferences import ani.dantotsu.R @@ -29,7 +31,11 @@ class AnimeExtensionInstallService : Service() { setContentTitle("Installing Anime Extension...") setProgress(100, 100, true) }.build() - startForeground(Notifications.ID_EXTENSION_INSTALLER, notification) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + startForeground(Notifications.ID_EXTENSION_INSTALLER, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC) + }else{ + startForeground(Notifications.ID_EXTENSION_INSTALLER, notification) + } } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/PackageInstallerInstallerManga.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/PackageInstallerInstallerManga.kt index c303b49c..78686e82 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/PackageInstallerInstallerManga.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/installer/PackageInstallerInstallerManga.kt @@ -9,6 +9,7 @@ import android.content.IntentFilter import android.content.pm.PackageInstaller import android.os.Build import androidx.core.content.ContextCompat +import ani.dantotsu.snackString import eu.kanade.tachiyomi.extension.InstallStep import eu.kanade.tachiyomi.util.lang.use import eu.kanade.tachiyomi.util.system.getParcelableExtraCompat @@ -72,12 +73,18 @@ class PackageInstallerInstallerManga(private val service: Service) : InstallerMa service, activeSession!!.second, Intent(INSTALL_ACTION), - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) PendingIntent.FLAG_MUTABLE else 0, + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + PendingIntent.FLAG_MUTABLE or PendingIntent.FLAG_ALLOW_UNSAFE_IMPLICIT_INTENT + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + PendingIntent.FLAG_MUTABLE + } else 0 ).intentSender session.commit(intentSender) } } catch (e: Exception) { logcat(LogPriority.ERROR) { "Failed to install extension ${entry.downloadId} ${entry.uri}" } + logcat(LogPriority.ERROR) { "Exception: $e" } + snackString("Failed to install extension ${entry.downloadId} ${entry.uri}") activeSession?.let { (_, sessionId) -> packageInstaller.abandonSession(sessionId) } @@ -101,7 +108,7 @@ class PackageInstallerInstallerManga(private val service: Service) : InstallerMa } init { - ContextCompat.registerReceiver(service, packageActionReceiver, IntentFilter(INSTALL_ACTION), ContextCompat.RECEIVER_NOT_EXPORTED) + ContextCompat.registerReceiver(service, packageActionReceiver, IntentFilter(INSTALL_ACTION), ContextCompat.RECEIVER_EXPORTED) } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallReceiver.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallReceiver.kt index 3eb90508..b8688007 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallReceiver.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallReceiver.kt @@ -28,7 +28,7 @@ internal class MangaExtensionInstallReceiver(private val listener: Listener) : * Registers this broadcast receiver */ fun register(context: Context) { - ContextCompat.registerReceiver(context, this, filter, ContextCompat.RECEIVER_NOT_EXPORTED) + ContextCompat.registerReceiver(context, this, filter, ContextCompat.RECEIVER_EXPORTED) } /** diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallService.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallService.kt index e4f01c2b..61e5bb74 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallService.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/manga/util/MangaExtensionInstallService.kt @@ -3,7 +3,11 @@ package eu.kanade.tachiyomi.extension.manga.util import android.app.Service import android.content.Context import android.content.Intent +import android.content.pm.PackageManager +import android.content.pm.ServiceInfo +import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC import android.net.Uri +import android.os.Build import android.os.IBinder import ani.dantotsu.R import eu.kanade.domain.base.BasePreferences @@ -29,7 +33,11 @@ class MangaExtensionInstallService : Service() { setContentTitle("Installing manga extension...") setProgress(100, 100, true) }.build() - startForeground(Notifications.ID_EXTENSION_INSTALLER, notification) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + startForeground(Notifications.ID_EXTENSION_INSTALLER, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC) + }else{ + startForeground(Notifications.ID_EXTENSION_INSTALLER, notification) + } } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 463dcf78..a3d620d6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -631,5 +631,6 @@ Use Material You Extension-specific DNS Theme: + User Agent