diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java index 83a3ca130..5debdd649 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/GmsCoreSupport.java @@ -20,9 +20,7 @@ import androidx.annotation.RequiresApi; import java.net.MalformedURLException; import java.net.URL; -/** - * @noinspection unused - */ +@SuppressWarnings("unused") public class GmsCoreSupport { private static final String PACKAGE_NAME_YOUTUBE = "com.google.android.youtube"; private static final String PACKAGE_NAME_YOUTUBE_MUSIC = "com.google.android.apps.youtube.music"; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AccountCredentialsInvalidTextPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AccountCredentialsInvalidTextPatch.java new file mode 100644 index 000000000..4620f0e50 --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AccountCredentialsInvalidTextPatch.java @@ -0,0 +1,28 @@ +package app.revanced.extension.youtube.patches; + +import static app.revanced.extension.shared.StringRef.sf; + +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.Utils; + +@SuppressWarnings("unused") +public class AccountCredentialsInvalidTextPatch { + + /** + * Injection point. + */ + public static String getOfflineNetworkErrorString(String original) { + try { + if (Utils.isNetworkConnected()) { + Logger.printDebug(() -> "Network appears to be online, but app is showing offline error"); + return '\n' + sf("microg_offline_account_login_error").toString(); + } + + Logger.printDebug(() -> "Network is offline"); + } catch (Exception ex) { + Logger.printException(() -> "getOfflineNetworkErrorString failure", ex); + } + + return original; + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt new file mode 100644 index 000000000..673fa240a --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt @@ -0,0 +1,83 @@ +package app.revanced.patches.youtube.misc.gms + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.patch.resourcePatch +import app.revanced.patches.all.misc.resources.addResources +import app.revanced.patches.all.misc.resources.addResourcesPatch +import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.resourceMappings +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.indexOfFirstLiteralInstructionOrThrow +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/AccountCredentialsInvalidTextPatch;" + +internal var ic_offline_no_content_upside_down = -1L + private set +internal var offline_no_content_body_text_not_offline_eligible = -1L + private set + +private val accountCredentialsInvalidTextResourcePatch = resourcePatch { + execute { + ic_offline_no_content_upside_down = resourceMappings[ + "drawable", + "ic_offline_no_content_upside_down" + ] + + offline_no_content_body_text_not_offline_eligible = resourceMappings[ + "string", + "offline_no_content_body_text_not_offline_eligible" + ] + } +} + +internal val accountCredentialsInvalidTextPatch = bytecodePatch { + dependsOn( + sharedExtensionPatch, + accountCredentialsInvalidTextResourcePatch, + addResourcesPatch + ) + + execute { + addResources("youtube", "misc.gms.accountCredentialsInvalidTextPatch") + + // If the user recently changed their account password, + // the app can show "You're offline. Check your internet connection." + // even when the internet is available. For this situation + // YouTube + MicroG shows an offline error message. + // + // Change the error text to inform the user to uninstall and reinstall MicroG. + // The user can also fix this by deleting the MicroG account but + // MicroG accounts look almost identical to Google device accounts + // and it's more foolproof to instead uninstall/reinstall. + arrayOf( + specificNetworkErrorViewControllerFingerprint, + loadingFrameLayoutControllerFingerprint + ).forEach { fingerprint -> + fingerprint.method.apply { + val resourceIndex = indexOfFirstLiteralInstructionOrThrow( + offline_no_content_body_text_not_offline_eligible + ) + val getStringIndex = indexOfFirstInstructionOrThrow(resourceIndex) { + val reference = getReference() + reference?.name == "getString" + } + val register = getInstruction(getStringIndex + 1).registerA + + addInstructions( + getStringIndex + 2, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getOfflineNetworkErrorString(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$register + """ + ) + } + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt new file mode 100644 index 000000000..3f4a521df --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt @@ -0,0 +1,27 @@ +package app.revanced.patches.youtube.misc.gms + +import app.revanced.patcher.fingerprint +import app.revanced.util.containsLiteralInstruction +import com.android.tools.smali.dexlib2.AccessFlags + +internal val specificNetworkErrorViewControllerFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("V") + parameters() + custom { method, _ -> + method.containsLiteralInstruction(ic_offline_no_content_upside_down) + && method.containsLiteralInstruction(offline_no_content_body_text_not_offline_eligible) + } +} + +// It's not clear if this second class is ever used and it may be dead code, +// but it the layout image/text is identical to the network error fingerprint above. +internal val loadingFrameLayoutControllerFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("V") + parameters("L") + custom { method, _ -> + method.containsLiteralInstruction(ic_offline_no_content_upside_down) + && method.containsLiteralInstruction(offline_no_content_body_text_not_offline_eligible) + } +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt index 1c2246077..72dd910c2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt @@ -68,5 +68,5 @@ private fun gmsCoreSupportResourcePatch( ) }, ) { - dependsOn(settingsPatch, addResourcesPatch) + dependsOn(settingsPatch, addResourcesPatch, accountCredentialsInvalidTextPatch) } diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index f99437d31..98ce9cb16 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -1379,6 +1379,9 @@ Enabling this can unlock higher video qualities" GmsCore Settings Settings for GmsCore + + If you recently changed your account login details, then uninstall and reinstall MicroG. + Bypass URL redirects URL redirects are bypassed