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