fix: some error checking

This commit is contained in:
rebelonion 2024-05-18 11:43:30 -05:00
parent df2867c7db
commit 949bcc418a
3 changed files with 62 additions and 16 deletions

View file

@ -21,6 +21,20 @@ import eu.kanade.tachiyomi.util.system.getApplicationIcon
class AddonLoader { class AddonLoader {
companion object { companion object {
/**
* Load an extension from a package name with a specific class name
* @param context the context
* @param packageName the package name of the extension
* @param type the type of extension
* @return the loaded extension
* @throws IllegalStateException if the extension is not of the correct type
* @throws ClassNotFoundException if the extension class is not found
* @throws NoClassDefFoundError if the extension class is not found
* @throws Exception if any other error occurs
* @throws PackageManager.NameNotFoundException if the package is not found
* @throws IllegalStateException if the extension is not found
*/
fun loadExtension( fun loadExtension(
context: Context, context: Context,
packageName: String, packageName: String,
@ -70,11 +84,11 @@ class AddonLoader {
val loadedClass = try { val loadedClass = try {
Class.forName(className, false, classLoader) Class.forName(className, false, classLoader)
} catch (e: ClassNotFoundException) { } catch (e: ClassNotFoundException) {
Logger.log("Extension load error: $extName ($className)") Logger.log("ClassNotFoundException load error: $extName ($className)")
Logger.log(e) Logger.log(e)
throw e throw e
} catch (e: NoClassDefFoundError) { } catch (e: NoClassDefFoundError) {
Logger.log("Extension load error: $extName ($className)") Logger.log("NoClassDefFoundError load error: $extName ($className)")
Logger.log(e) Logger.log(e)
throw e throw e
} catch (e: Exception) { } catch (e: Exception) {
@ -117,8 +131,16 @@ class AddonLoader {
} }
} }
/**
* Load an extension from a package name (class is determined by type)
* @param context the context
* @param packageName the package name of the extension
* @param type the type of extension
* @return the loaded extension
*/
fun loadFromPkgName(context: Context, packageName: String, type: AddonType): LoadResult? { fun loadFromPkgName(context: Context, packageName: String, type: AddonType): LoadResult? {
return when (type) { return try {
when (type) {
AddonType.TORRENT -> loadExtension( AddonType.TORRENT -> loadExtension(
context, context,
packageName, packageName,
@ -133,8 +155,19 @@ class AddonLoader {
type type
) )
} }
} catch (e: Exception) {
Logger.log("Error loading extension from package name: $packageName")
Logger.log(e)
null
}
} }
/**
* Check if a package is an extension by comparing the package name
* @param type the type of extension
* @param pkgInfo the package info
* @return true if the package is an extension
*/
private fun isPackageAnExtension(type: String, pkgInfo: PackageInfo): Boolean { private fun isPackageAnExtension(type: String, pkgInfo: PackageInfo): Boolean {
return pkgInfo.packageName.equals(type) return pkgInfo.packageName.equals(type)
} }

View file

@ -1,6 +1,7 @@
package eu.kanade.tachiyomi.extension.util package eu.kanade.tachiyomi.extension.util
import android.app.DownloadManager import android.app.DownloadManager
import android.app.ForegroundServiceStartNotAllowedException
import android.content.BroadcastReceiver import android.content.BroadcastReceiver
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
@ -11,9 +12,11 @@ import android.os.Environment
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import androidx.core.net.toUri import androidx.core.net.toUri
import ani.dantotsu.R
import ani.dantotsu.media.AddonType import ani.dantotsu.media.AddonType
import ani.dantotsu.media.MediaType import ani.dantotsu.media.MediaType
import ani.dantotsu.media.Type import ani.dantotsu.media.Type
import ani.dantotsu.toast
import ani.dantotsu.util.Logger import ani.dantotsu.util.Logger
import com.jakewharton.rxrelay.PublishRelay import com.jakewharton.rxrelay.PublishRelay
import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.base.BasePreferences
@ -160,7 +163,16 @@ class ExtensionInstaller(private val context: Context) {
else -> { else -> {
val intent = val intent =
ExtensionInstallService.getIntent(context, type, downloadId, uri, installer) ExtensionInstallService.getIntent(context, type, downloadId, uri, installer)
try {
ContextCompat.startForegroundService(context, intent) ContextCompat.startForegroundService(context, intent)
} catch (e: RuntimeException) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && e is ForegroundServiceStartNotAllowedException) {
toast(context.getString(R.string.error_msg, context.getString(R.string.foreground_service_not_allowed)))
} else {
toast(context.getString(R.string.error_msg, e.message))
}
Logger.log(e)
}
} }
} }
} }

View file

@ -995,4 +995,5 @@ Non quae tempore quo provident laudantium qui illo dolor vel quia dolor et exerc
<string name="view_subscriptions_desc">View and edit all your subscriptions</string> <string name="view_subscriptions_desc">View and edit all your subscriptions</string>
<string name="subscriptions">Subscriptions</string> <string name="subscriptions">Subscriptions</string>
<string name="subscription_deleted">Subscription Deleted</string> <string name="subscription_deleted">Subscription Deleted</string>
<string name="foreground_service_not_allowed">Cannot install when app is in background</string>
</resources> </resources>