Skip to content

fix: support app start and value read until SDK 34 since SDK 28 despite no value update guarantee#426

Merged
kyujin-cho merged 8 commits into
kyujin-cho:mainfrom
yhkee0404:main
Feb 7, 2026
Merged

fix: support app start and value read until SDK 34 since SDK 28 despite no value update guarantee#426
kyujin-cho merged 8 commits into
kyujin-cho:mainfrom
yhkee0404:main

Conversation

@yhkee0404
Copy link
Copy Markdown
Contributor

@yhkee0404 yhkee0404 commented Dec 11, 2025

Fixes #401, closes #329, resolves #389, reactivating #231 which once fixed #225 by dealing with NoSuchMethodError thrown from getActiveSubscriptionInfoList but seems to have mistakenly been reverted since #387 which has started to throw the new NoSuchMethodException until SDK 34.
Supports another old getActiveSubscriptionInfoList function signature which had been used until SDK 29.

The as? and emptyList fix the following bug as SubscriptionManager has also prevented since SDK 35, saying, "Beginning with Android SDK 35, this method will never return null":

2025-12-11 15:02:16.122 24303-24303 AndroidRuntime          dev.bluehouse.enablevolte            E  FATAL EXCEPTION: main
Process: dev.bluehouse.enablevolte, PID: 24303
java.lang.NullPointerException: null cannot be cast to non-null type kotlin.collections.List<android.telephony.SubscriptionInfo>
	at dev.bluehouse.enablevolte.CarrierModer.getSubscriptions(Moder.kt:118)
	at dev.bluehouse.enablevolte.HomeActivityKt.PixelIMSApp$loadApplication(HomeActivity.kt:138)
	at dev.bluehouse.enablevolte.HomeActivityKt.PixelIMSApp$lambda$10$0(HomeActivity.kt:161)
	at dev.bluehouse.enablevolte.HomeActivityKt.$r8$lambda$zhbMr68U3UlSP60qr7a6FsMZemQ(Unknown Source:0)
	at dev.bluehouse.enablevolte.HomeActivityKt$$ExternalSyntheticLambda21.invoke(D8$$SyntheticClass:0)
	at dev.bluehouse.enablevolte.components.CommonKt.OnLifecycleEvent$lambda$0$0$0(Common.kt:27)
	at dev.bluehouse.enablevolte.components.CommonKt.$r8$lambda$vXeNtcL85q_1p4Nf-9xaXgM7pCw(Unknown Source:0)
	at dev.bluehouse.enablevolte.components.CommonKt$$ExternalSyntheticLambda4.onStateChanged(D8$$SyntheticClass:0)
	at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.jvm.kt:313)
	at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.jvm.kt:251)
	at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.jvm.kt:288)
	at androidx.lifecycle.LifecycleRegistry.addObserver(LifecycleRegistry.jvm.kt:198)
	at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:121)
	at androidx.compose.ui.platform.WrappedComposition$setContent$1.invoke(Wrapper.android.kt:114)
	at androidx.compose.ui.platform.AndroidComposeView.onAttachedToWindow(AndroidComposeView.android.kt:2077)
	at android.view.View.dispatchAttachedToWindow(View.java:18365)
	at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3477)
	at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3484)
	at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3484)
	at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3484)
	at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3484)
	at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1776)
	at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1475)
	at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7218)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1012)
	at android.view.Choreographer.doCallbacks(Choreographer.java:823)
	at android.view.Choreographer.doFrame(Choreographer.java:758)
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:998)
	at android.os.Handler.handleCallback(Handler.java:873)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loop(Looper.java:193)
	at android.app.ActivityThread.main(ActivityThread.java:6826)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Fixes #420 (comment), closes #398 (comment), resolves #423 (comment), only about NullPointerException thrown from getSubscriptionCarrierName which might return null in some cases according to its specification.

Fixes #273, closes #320 (comment), resolving NoClassDefFoundError thrown from TelephonyFrameworkInitializer added since SDK 30.
We can bypass its TelephonyServiceManager whose methods are just refactored results.

Supports old getActiveSubscriptionInfoForSimSlotIndex whose function signature had been different from that of today until SDK 29, catching NoSuchMethodError.

Supports deprecated getConfigForSubId on NoSuchMethodError in place of getConfigForSubIdWithFeature which had not been added until SDK 29

Fixes the following NullPointerException thrown from getConfigForSubIdWithFeature unlike its non-null implementation, by considering it nullable:

12-27 23:36:35.578  3936  3936 E AndroidRuntime: FATAL EXCEPTION: main
12-27 23:36:35.578  3936  3936 E AndroidRuntime: Process: dev.bluehouse.enablevolte, PID: 3936
12-27 23:36:35.578  3936  3936 E AndroidRuntime: java.lang.NullPointerException: getConfigForSubIdWithFeature(...) must not be null
12-27 23:36:35.578  3936  3936 E AndroidRuntime: 	at dev.bluehouse.enablevolte.SubscriptionModer.getConfigForSubId(Moder.kt:437)
12-27 23:36:35.578  3936  3936 E AndroidRuntime: 	at dev.bluehouse.enablevolte.SubscriptionModer.getBooleanValue(Moder.kt:356)
12-27 23:36:35.578  3936  3936 E AndroidRuntime: 	at dev.bluehouse.enablevolte.SubscriptionModer.isVoLteConfigEnabled(Moder.kt:456)
12-27 23:36:35.578  3936  3936 E AndroidRuntime: 	at dev.bluehouse.enablevolte.pages.ConfigKt.Config$loadFlags(Config.kt:95)
12-27 23:36:35.578  3936  3936 E AndroidRuntime: 	at dev.bluehouse.enablevolte.pages.ConfigKt.access$Config$loadFlags(Config.kt:1)
12-27 23:36:35.578  3936  3936 E AndroidRuntime: 	at dev.bluehouse.enablevolte.pages.ConfigKt$Config$1$1$1.invokeSuspend(Config.kt:123)
12-27 23:36:35.578  3936  3936 E AndroidRuntime: 	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
12-27 23:36:35.578  3936  3936 E AndroidRuntime: 	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
12-27 23:36:35.578  3936  3936 E AndroidRuntime: 	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586)
12-27 23:36:35.578  3936  3936 E AndroidRuntime: 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:829)
12-27 23:36:35.578  3936  3936 E AndroidRuntime: 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717)
12-27 23:36:35.578  3936  3936 E AndroidRuntime: 	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704)
12-27 23:36:35.578  3936  3936 E AndroidRuntime: 	Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [androidx.compose.ui.platform.MotionDurationScaleImpl@3e4e2a0, androidx.compose.runtime.BroadcastFrameClock@d416e59, StandaloneCoroutine{Cancelling}@6514a1e, AndroidUiDispatcher@665e2ff]

Supports another function signature of getConfigForSubId declared until SDK 28.

You can download and test the built apk here but need to uninstall the previous release if any: https://github.com/yhkee0404/pixel-volte-patch/releases/tag/1.3.1_PR_426_430_431_432

안녕하세요 ㅎㅎ 처음 뵙겠습니다!

@yhkee0404 yhkee0404 deleted the branch kyujin-cho:main December 12, 2025 17:05
@yhkee0404 yhkee0404 closed this Dec 12, 2025
@yhkee0404 yhkee0404 deleted the main branch December 12, 2025 17:05
@yhkee0404 yhkee0404 restored the main branch December 12, 2025 17:05
@yhkee0404 yhkee0404 reopened this Dec 12, 2025
@yhkee0404 yhkee0404 changed the title fix: reactivate fallbacks and ensure non-null for subscriptions fix: support app start and value read since SDK 28 despite no value update Dec 12, 2025
@yhkee0404 yhkee0404 changed the title fix: support app start and value read since SDK 28 despite no value update fix: support app start and value read since SDK 28 despite no value update guarantee Dec 12, 2025
@yhkee0404 yhkee0404 changed the title fix: support app start and value read since SDK 28 despite no value update guarantee fix: support app start and value read until SDK 34 since SDK 28 despite no value update guarantee Dec 14, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment