How To Initiate Connection From Outside The Main Thread (Needing only Application Context instead of Activity Context)
So far, the VPN connection works from the main thread (UI)
But I have been asked to add a functionality.
The app should actively listen for the connectivity status of the device.
It should then automatically trigger the VPN when it detects a wifi connection, even when the app is closed or swipped off.
I have been able to listen to these connections using a background plugin that runs on a separate thread.
But when I try to ininitaize the VPN, I get errors relating to activity context:
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): Failed to handle method call
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.app.Activity.getCacheDir()' on a null object reference
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at de.blinkt.openvpn.VPNHelper.<init>(VPNHelper.java:45)
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at id.laskarmedia.openvpn_flutter.OpenVPNFlutterPlugin.lambda$onAttachedToEngine$0$id-laskarmedia-openvpn_flutter-OpenVPNFlutterPlugin(OpenVPNFlutterPlugin.java:81)
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at id.laskarmedia.openvpn_flutter.OpenVPNFlutterPlugin$$ExternalSyntheticLambda0.onMethodCall(D8$$SyntheticClass:0)
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:267)
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:292)
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319)
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0)
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at android.os.Handler.handleCallback(Handler.java:995)
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at android.os.Handler.dispatchMessage(Handler.java:103)
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at android.os.Looper.loopOnce(Looper.java:248)
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at android.os.Looper.loop(Looper.java:338)
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at android.app.ActivityThread.main(ActivityThread.java:9067)
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at java.lang.reflect.Method.invoke(Native Method)
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593)
E/MethodChannel#id.laskarmedia.openvpn_flutter/vpncontrol( 5748): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932)
E/flutter ( 5748): [ERROR:flutter/runtime/dart_vm_initializer.cc(40)] Unhandled Exception: PlatformException(error, Attempt to invoke virtual method 'java.io.File android.app.Activity.getCacheDir()' on a null object reference, null, java.lang.NullPointerException: Attempt to invoke virtual method 'java.io.File android.app.Activity.getCacheDir()' on a null object reference
E/flutter ( 5748): at de.blinkt.openvpn.VPNHelper.<init>(VPNHelper.java:45)
E/flutter ( 5748): at id.laskarmedia.openvpn_flutter.OpenVPNFlutterPlugin.lambda$onAttachedToEngine$0$id-laskarmedia-openvpn_flutter-OpenVPNFlutterPlugin(OpenVPNFlutterPlugin.java:81)
E/flutter ( 5748): at id.laskarmedia.openvpn_flutter.OpenVPNFlutterPlugin$$ExternalSyntheticLambda0.onMethodCall(D8$$SyntheticClass:0)
E/flutter ( 5748): at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:267)
E/flutter ( 5748): at io.flutter.embedding.engine.dart.DartMessenger.invokeHandler(DartMessenger.java:292)
E/flutter ( 5748): at io.flutter.embedding.engine.dart.DartMessenger.lambda$dispatchMessageToQueue$0$io-flutter-embedding-engine-dart-DartMessenger(DartMessenger.java:319)
E/flutter ( 5748): at io.flutter.embedding.engine.dart.DartMessenger$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0)
E/flutter ( 5748): at android.os.Handler.handleCallback(Handler.java:995)
E/flutter ( 5748): at android.os.Handler.dispatchMessage(Handler.java:103)
E/flutter ( 5748): at android.os.Looper.loopOnce(Looper.java:248)
E/flutter ( 5748): at android.os.Looper.loop(Looper.java:338)
E/flutter ( 5748): at android.app.ActivityThread.main(ActivityThread.java:9067)
E/flutter ( 5748): at java.lang.reflect.Method.invoke(Native Method)
E/flutter ( 5748): at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593)
E/flutter ( 5748): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:932)
E/flutter ( 5748): )
E/flutter ( 5748): #0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:653:7)
E/flutter ( 5748): #1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:367:18)
E/flutter ( 5748): <asynchronous suspension>
E/flutter ( 5748): #2 OpenVPN.initialize.<anonymous closure> (package:openvpn_flutter/src/vpn_engine.dart:108:13)
E/flutter ( 5748): <asynchronous suspension>
How can I go about this?
I would sincerly appreciate anyone's response.
Anyone? 😢
@0ttik @codingbeast @nizwar
Would really appreciate your response @nizwar