Random UA: fix NullPointerException (#17131)

Random UA: remove dependency on uninitialized properties
This commit is contained in:
AwkwardPeak7 2023-07-16 19:25:49 +05:00 committed by GitHub
parent 5cdb939669
commit be155c280f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 86 additions and 97 deletions

View File

@ -7,77 +7,64 @@ import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import okhttp3.Headers import okhttp3.Headers
class RandomUserAgentPreference(
private val preferences: SharedPreferences,
) {
/** /**
* Helper function to return UserAgentType based on SharedPreference value * Helper function to return UserAgentType based on SharedPreference value
*/ */
fun getPrefUAType(): UserAgentType { fun SharedPreferences.getPrefUAType(): UserAgentType {
return when (preferences.getString(PREF_KEY_RANDOM_UA, "off")) { return when (getString(PREF_KEY_RANDOM_UA, "off")) {
"mobile" -> UserAgentType.MOBILE "mobile" -> UserAgentType.MOBILE
"desktop" -> UserAgentType.DESKTOP "desktop" -> UserAgentType.DESKTOP
else -> UserAgentType.OFF else -> UserAgentType.OFF
}
}
/**
* Helper function to return custom UserAgent from SharedPreference
*/
fun getPrefCustomUA(): String? {
return preferences.getString(PREF_KEY_CUSTOM_UA, null)
}
/**
* Helper function to add Random User-Agent settings to SharedPreference
*
* @param screen, PreferenceScreen from `setupPreferenceScreen`
*/
fun addPreferenceToScreen(
screen: PreferenceScreen,
) {
val customUA = EditTextPreference(screen.context).apply {
key = PREF_KEY_CUSTOM_UA
title = TITLE_CUSTOM_UA
summary = CUSTOM_UA_SUMMARY
setVisible(getPrefUAType() == UserAgentType.OFF)
setOnPreferenceChangeListener { _, newValue ->
try {
Headers.Builder().add("User-Agent", newValue as String).build()
true
} catch (e: IllegalArgumentException) {
Toast.makeText(screen.context, "User Agent invalid${e.message}", Toast.LENGTH_LONG).show()
false
}
}
}
val randomUA = ListPreference(screen.context).apply {
key = PREF_KEY_RANDOM_UA
title = TITLE_RANDOM_UA
entries = RANDOM_UA_ENTRIES
entryValues = RANDOM_UA_VALUES
summary = "%s"
setDefaultValue("off")
setOnPreferenceChangeListener { _, newVal ->
val showCustomUAPref = newVal as String == "off"
customUA.setVisible(showCustomUAPref)
true
}
}
screen.addPreference(randomUA)
screen.addPreference(customUA)
}
companion object {
const val TITLE_RANDOM_UA = "Random User-Agent (Requires Restart)"
const val PREF_KEY_RANDOM_UA = "pref_key_random_ua_"
val RANDOM_UA_ENTRIES = arrayOf("OFF", "Desktop", "Mobile")
val RANDOM_UA_VALUES = arrayOf("off", "desktop", "mobile")
const val TITLE_CUSTOM_UA = "Custom User-Agent"
const val PREF_KEY_CUSTOM_UA = "pref_key_custom_ua_"
const val CUSTOM_UA_SUMMARY = "Leave blank to use application default user-agent. (Requires Restart)"
} }
} }
/**
* Helper function to return custom UserAgent from SharedPreference
*/
fun SharedPreferences.getPrefCustomUA(): String? {
return getString(PREF_KEY_CUSTOM_UA, null)
}
/**
* Helper function to add Random User-Agent settings to SharedPreference
*
* @param screen, PreferenceScreen from `setupPreferenceScreen`
*/
fun addRandomUAPreferenceToScreen(
screen: PreferenceScreen,
) {
ListPreference(screen.context).apply {
key = PREF_KEY_RANDOM_UA
title = TITLE_RANDOM_UA
entries = RANDOM_UA_ENTRIES
entryValues = RANDOM_UA_VALUES
summary = "%s"
setDefaultValue("off")
}.also(screen::addPreference)
EditTextPreference(screen.context).apply {
key = PREF_KEY_CUSTOM_UA
title = TITLE_CUSTOM_UA
summary = CUSTOM_UA_SUMMARY
setOnPreferenceChangeListener { _, newValue ->
try {
Headers.Builder().add("User-Agent", newValue as String).build()
true
} catch (e: IllegalArgumentException) {
Toast.makeText(screen.context, "User Agent invalid${e.message}", Toast.LENGTH_LONG).show()
false
}
}
}.also(screen::addPreference)
}
const val TITLE_RANDOM_UA = "Random User-Agent (Requires Restart)"
const val PREF_KEY_RANDOM_UA = "pref_key_random_ua_"
val RANDOM_UA_ENTRIES = arrayOf("OFF", "Desktop", "Mobile")
val RANDOM_UA_VALUES = arrayOf("off", "desktop", "mobile")
const val TITLE_CUSTOM_UA = "Custom User-Agent (Requires Restart)"
const val PREF_KEY_CUSTOM_UA = "pref_key_custom_ua_"
const val CUSTOM_UA_SUMMARY = "Leave blank to use application default user-agent (IGNORED if Random User-Agent is enabled)"

View File

@ -5,7 +5,9 @@ import android.content.SharedPreferences
import android.util.Base64 import android.util.Base64
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.lib.cryptoaes.CryptoAES import eu.kanade.tachiyomi.lib.cryptoaes.CryptoAES
import eu.kanade.tachiyomi.lib.randomua.RandomUserAgentPreference import eu.kanade.tachiyomi.lib.randomua.addRandomUAPreferenceToScreen
import eu.kanade.tachiyomi.lib.randomua.getPrefCustomUA
import eu.kanade.tachiyomi.lib.randomua.getPrefUAType
import eu.kanade.tachiyomi.lib.randomua.setRandomUserAgent import eu.kanade.tachiyomi.lib.randomua.setRandomUserAgent
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.POST
@ -26,6 +28,7 @@ import kotlinx.serialization.json.jsonPrimitive
import okhttp3.CacheControl import okhttp3.CacheControl
import okhttp3.FormBody import okhttp3.FormBody
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -51,20 +54,18 @@ abstract class Madara(
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000) Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
} }
private val randomUAPrefHelper: RandomUserAgentPreference by lazy {
RandomUserAgentPreference(preferences)
}
override val supportsLatest = true override val supportsLatest = true
override val client = network.cloudflareClient.newBuilder() override val client: OkHttpClient by lazy {
.setRandomUserAgent( network.cloudflareClient.newBuilder()
randomUAPrefHelper.getPrefUAType(), .setRandomUserAgent(
randomUAPrefHelper.getPrefCustomUA(), preferences.getPrefUAType(),
) preferences.getPrefCustomUA(),
.connectTimeout(10, TimeUnit.SECONDS) )
.readTimeout(30, TimeUnit.SECONDS) .connectTimeout(10, TimeUnit.SECONDS)
.build() .readTimeout(30, TimeUnit.SECONDS)
.build()
}
override fun headersBuilder() = super.headersBuilder() override fun headersBuilder() = super.headersBuilder()
.add("Referer", "$baseUrl/") .add("Referer", "$baseUrl/")
@ -950,7 +951,7 @@ abstract class Madara(
} }
override fun setupPreferenceScreen(screen: PreferenceScreen) { override fun setupPreferenceScreen(screen: PreferenceScreen) {
randomUAPrefHelper.addPreferenceToScreen(screen) addRandomUAPreferenceToScreen(screen)
} }
companion object { companion object {

View File

@ -3,7 +3,9 @@ package eu.kanade.tachiyomi.multisrc.mangathemesia
import android.app.Application import android.app.Application
import android.content.SharedPreferences import android.content.SharedPreferences
import androidx.preference.PreferenceScreen import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.lib.randomua.RandomUserAgentPreference import eu.kanade.tachiyomi.lib.randomua.addRandomUAPreferenceToScreen
import eu.kanade.tachiyomi.lib.randomua.getPrefCustomUA
import eu.kanade.tachiyomi.lib.randomua.getPrefUAType
import eu.kanade.tachiyomi.lib.randomua.setRandomUserAgent import eu.kanade.tachiyomi.lib.randomua.setRandomUserAgent
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.network.POST
@ -23,6 +25,7 @@ import okhttp3.FormBody
import okhttp3.HttpUrl import okhttp3.HttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -50,22 +53,20 @@ abstract class MangaThemesia(
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000) Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
} }
private val randomUAPrefHelper: RandomUserAgentPreference by lazy {
RandomUserAgentPreference(preferences)
}
protected open val json: Json by injectLazy() protected open val json: Json by injectLazy()
override val supportsLatest = true override val supportsLatest = true
override val client = network.cloudflareClient.newBuilder() override val client: OkHttpClient by lazy {
.setRandomUserAgent( network.cloudflareClient.newBuilder()
randomUAPrefHelper.getPrefUAType(), .setRandomUserAgent(
randomUAPrefHelper.getPrefCustomUA(), preferences.getPrefUAType(),
) preferences.getPrefCustomUA(),
.connectTimeout(10, TimeUnit.SECONDS) )
.readTimeout(30, TimeUnit.SECONDS) .connectTimeout(10, TimeUnit.SECONDS)
.build() .readTimeout(30, TimeUnit.SECONDS)
.build()
}
open val projectPageString = "/project" open val projectPageString = "/project"
@ -499,7 +500,7 @@ abstract class MangaThemesia(
override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not Used") override fun imageUrlParse(document: Document): String = throw UnsupportedOperationException("Not Used")
override fun setupPreferenceScreen(screen: PreferenceScreen) { override fun setupPreferenceScreen(screen: PreferenceScreen) {
randomUAPrefHelper.addPreferenceToScreen(screen) addRandomUAPreferenceToScreen(screen)
} }
companion object { companion object {