The forced EdgeToEdge changes don't work well with
PreferenceFragmentCompat, because it's basically abandoned by androidx,
so apply the insets manually ourselves.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Due to buggy changes in Android 14, we now need to bother the user about
enabling "draw over other apps" for the quick settings toggle to work
when the app isn't already running.
Link: https://issuetracker.google.com/issues/305035828
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
I wanted to stay on 8.1 in hopes of landing on a stable channel, but
Google won't backport the RB fix, so we have to bump to 8.2 alphas.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Otherwise the pop() from the producer might causes an OOB read in the
consumer:
Exception java.lang.ArrayIndexOutOfBoundsException:
at androidx.collection.CircularArray.get (CircularArray.java)
at com.wireguard.android.activity.LogViewerActivity.rawLogBytes (LogViewerActivity.java)
at com.wireguard.android.activity.LogViewerActivity.onCreate$lambda$3 (LogViewerActivity.java:133)
at android.view.View.performClick (View.java:6935)
at android.view.View$PerformClick.run (View.java:26214)
at android.os.Handler.handleCallback (Handler.java:790)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:164)
at android.app.ActivityThread.main (ActivityThread.java:7000)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:441)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1408)
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Rather than using the NDK compiler for the host arch and hoping it picks
up on system library locations, just use `cc` and rely on the
traditional symlink to resolve that to the default host compiler.
This should address build errors seen on macOS.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Doing so causes the process to restart when the activity is cleared,
even when no tunnel is running. I fear this might also lead to the
current flurry of DeadSystemExceptions.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Hopefully will fix, "Only the original thread that creted a view
hierarchy can touch its views."
Reported-by: Damir <2k1dmg@gmail.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
These changes can happen at the wrong time, so we need to be able to
walk them back. Fixes:
Exception java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at androidx.fragment.app.FragmentManager.checkStateLoss (FragmentManager.java:1610)
at androidx.fragment.app.FragmentManager.enqueueAction (FragmentManager.java:1650)
at androidx.fragment.app.BackStackRecord.commitInternal (BackStackRecord.java:341)
at androidx.fragment.app.BackStackRecord.commit (BackStackRecord.java:306)
at androidx.fragment.app.FragmentManagerKt.commit$default (FragmentManager.kt:35)
at com.wireguard.android.activity.MainActivity.onSelectedTunnelChanged (MainActivity.kt:113)
at com.wireguard.android.activity.BaseActivity.setSelectedTunnel (BaseActivity.kt:25)
at com.wireguard.android.activity.BaseActivity$onCreate$1.invokeSuspend (BaseActivity.kt:44)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (ContinuationImpl.kt:33)
at kotlinx.coroutines.internal.DispatchedContinuation.resumeUndispatchedWith (DispatchedContinuation.java:256)
at kotlinx.coroutines.DispatchedTaskKt.resume (DispatchedTask.kt:177)
at kotlinx.coroutines.CancellableContinuationImpl.parentCancelled$kotlinx_coroutines_core (CancellableContinuationImpl.kt:190)
at kotlinx.coroutines.DispatchedTaskKt.resumeUnconfined (DispatchedTask.kt:190)
at kotlinx.coroutines.DispatchedTaskKt.dispatch (DispatchedTask.kt:161)
at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume (CancellableContinuationImpl.kt:397)
at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl (CancellableContinuationImpl.kt:431)
at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default (CancellableContinuationImpl.kt:420)
at kotlinx.coroutines.CancellableContinuationImpl.resumeWith (CancellableContinuationImpl.kt:328)
at kotlinx.coroutines.ResumeAwaitOnCompletion.invoke (JobSupport.kt:1413)
at kotlinx.coroutines.JobSupport.notifyHandlers (JobSupport.kt:368)
at kotlinx.coroutines.JobSupport.notifyCompletion (JobSupport.kt:362)
at kotlinx.coroutines.JobSupport.completeStateFinalization (JobSupport.kt:323)
at kotlinx.coroutines.JobSupport.finalizeFinishingState (JobSupport.kt:240)
at kotlinx.coroutines.JobSupport.tryMakeCompletingSlowPath (JobSupport.kt:906)
at kotlinx.coroutines.JobSupport.tryMakeCompleting (JobSupport.kt:863)
at kotlinx.coroutines.JobSupport.makeCompleting$kotlinx_coroutines_core (JobSupport.kt:806)
at kotlinx.coroutines.CompletableDeferredImpl.complete (CompletableDeferredImpl.java:92)
at com.wireguard.android.model.TunnelManager$onTunnelsLoaded$1.invokeSuspend (TunnelManager.kt:120)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run (DispatchedTask.kt:106)
at android.os.Handler.handleCallback (Handler.java:938)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loop (Looper.java:237)
at android.app.ActivityThread.main (ActivityThread.java:8163)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:656)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:967)
Exception java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at androidx.fragment.app.FragmentManager.checkStateLoss (FragmentManager.java:1610)
at androidx.fragment.app.FragmentManager.enqueueAction (FragmentManager.java:1650)
at androidx.fragment.app.BackStackRecord.commitInternal (BackStackRecord.java:341)
at androidx.fragment.app.BackStackRecord.commit (BackStackRecord.java:306)
at androidx.fragment.app.FragmentManagerKt.commit$default (FragmentManager.kt:35)
at com.wireguard.android.activity.MainActivity.onSelectedTunnelChanged (MainActivity.kt:113)
at com.wireguard.android.activity.BaseActivity.setSelectedTunnel (BaseActivity.kt:25)
at com.wireguard.android.activity.BaseActivity$onCreate$1.invokeSuspend (BaseActivity.kt:44)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (ContinuationImpl.kt:33)
at kotlinx.coroutines.internal.DispatchedContinuation.resumeUndispatchedWith (DispatchedContinuation.java:256)
at kotlinx.coroutines.DispatchedTaskKt.resume (DispatchedTask.kt:177)
at kotlinx.coroutines.CancellableContinuationImpl.parentCancelled$kotlinx_coroutines_core (CancellableContinuationImpl.kt:190)
at kotlinx.coroutines.DispatchedTaskKt.resumeUnconfined (DispatchedTask.kt:190)
at kotlinx.coroutines.DispatchedTaskKt.dispatch (DispatchedTask.kt:161)
at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume (CancellableContinuationImpl.kt:397)
at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl (CancellableContinuationImpl.kt:431)
at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default (CancellableContinuationImpl.kt:420)
at kotlinx.coroutines.CancellableContinuationImpl.resumeWith (CancellableContinuationImpl.kt:328)
at kotlinx.coroutines.ResumeAwaitOnCompletion.invoke (JobSupport.kt:1413)
at kotlinx.coroutines.JobSupport.notifyHandlers (JobSupport.kt:368)
at kotlinx.coroutines.JobSupport.notifyCompletion (JobSupport.kt:362)
at kotlinx.coroutines.JobSupport.completeStateFinalization (JobSupport.kt:323)
at kotlinx.coroutines.JobSupport.finalizeFinishingState (JobSupport.kt:240)
at kotlinx.coroutines.JobSupport.tryMakeCompletingSlowPath (JobSupport.kt:906)
at kotlinx.coroutines.JobSupport.tryMakeCompleting (JobSupport.kt:863)
at kotlinx.coroutines.JobSupport.makeCompleting$kotlinx_coroutines_core (JobSupport.kt:806)
at kotlinx.coroutines.CompletableDeferredImpl.complete (CompletableDeferredImpl.java:92)
at com.wireguard.android.model.TunnelManager$onTunnelsLoaded$1.invokeSuspend (TunnelManager.kt:120)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run (DispatchedTask.kt:106)
at android.os.Handler.handleCallback (Handler.java:938)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loopOnce (Looper.java:210)
at android.os.Looper.loop (Looper.java:299)
at android.app.ActivityThread.main (ActivityThread.java:8302)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:556)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1037)
Exception java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at androidx.fragment.app.FragmentManager.checkStateLoss (FragmentManager.java:1610)
at androidx.fragment.app.FragmentManager.ensureExecReady (FragmentManager.java:1711)
at androidx.fragment.app.FragmentManager.execPendingActions (FragmentManager.java:1754)
at androidx.fragment.app.FragmentManager.popBackStackImmediate (FragmentManager.java:854)
at androidx.fragment.app.FragmentManager.popBackStackImmediate (FragmentManager.java:778)
at com.wireguard.android.activity.MainActivity.onSelectedTunnelChanged (MainActivity.kt:110)
at com.wireguard.android.activity.BaseActivity.setSelectedTunnel (BaseActivity.kt:25)
at com.wireguard.android.activity.BaseActivity$onCreate$1.invokeSuspend (BaseActivity.kt:44)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run (DispatchedTask.kt:106)
at kotlinx.coroutines.EventLoop.processUnconfinedEvent (EventLoop.common.kt:69)
at kotlinx.coroutines.DispatchedTaskKt.runUnconfinedEventLoop (DispatchedTask.kt:204)
at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith (DispatchedContinuation.kt:282)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable (Cancellable.kt:30)
at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default (Cancellable.kt:25)
at kotlinx.coroutines.CoroutineStart.invoke (CoroutineStart.java:110)
at kotlinx.coroutines.AbstractCoroutine.start (AbstractCoroutine.kt:126)
at kotlinx.coroutines.BuildersKt.launch$default (Builders.kt)
at com.wireguard.android.model.TunnelManager.onTunnelsLoaded (TunnelManager.java:114)
at com.wireguard.android.model.TunnelManager.access$onTunnelsLoaded (TunnelManager.java:40)
at com.wireguard.android.model.TunnelManager$onCreate$1.invokeSuspend (TunnelManager.kt:104)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run (DispatchedTask.kt:106)
at android.os.Handler.handleCallback (Handler.java:942)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loopOnce (Looper.java:226)
at android.os.Looper.loop (Looper.java:313)
at android.app.ActivityThread.main (ActivityThread.java:8757)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:571)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1067)
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
The primary color changes in night theme, and since there's no proper
mode for the status icons on those APIs, it looks bad.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Since version 1.1.0, setDefaultNightMode now takes care of that. Also,
set the initial mode in a blocking fashion to prevent flashing white.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>