2828import android .os .Bundle ;
2929import android .os .Handler ;
3030import android .os .Handler .Callback ;
31+ import android .os .HandlerThread ;
3132import android .os .IBinder ;
3233import android .os .Message ;
3334import android .os .ParcelFileDescriptor ;
@@ -141,6 +142,8 @@ public void challengeResponse(String repsonse) throws RemoteException {
141142 private Toast mlastToast ;
142143 private Runnable mOpenVPNThread ;
143144 private ProxyInfo mProxyInfo ;
145+ private HandlerThread mCommandHandlerThread ;
146+ private Handler mCommandHandler ;
144147
145148 // From: http://stackoverflow.com/questions/3758606/how-to-convert-byte-size-into-human-readable-format-in-java
146149 public static String humanReadableByteCount (long bytes , boolean speed , Resources res ) {
@@ -423,18 +426,18 @@ PendingIntent getGraphPendingIntent() {
423426
424427 }
425428
426- synchronized void registerDeviceStateReceiver () {
429+ synchronized void registerDeviceStateReceiver (DeviceStateReceiver newDeviceStateReceiver ) {
427430 // Registers BroadcastReceiver to track network connection changes.
428431 IntentFilter filter = new IntentFilter ();
429432 filter .addAction (ConnectivityManager .CONNECTIVITY_ACTION );
430433 filter .addAction (Intent .ACTION_SCREEN_OFF );
431434 filter .addAction (Intent .ACTION_SCREEN_ON );
432435
433436 // Fetch initial network state
434- mDeviceStateReceiver .networkStateChange (this );
437+ newDeviceStateReceiver .networkStateChange (this );
435438
436- registerReceiver (mDeviceStateReceiver , filter );
437- VpnStatus .addByteCountListener (mDeviceStateReceiver );
439+ registerReceiver (newDeviceStateReceiver , filter );
440+ VpnStatus .addByteCountListener (newDeviceStateReceiver );
438441 }
439442
440443 synchronized void unregisterDeviceStateReceiver (DeviceStateReceiver deviceStateReceiver ) {
@@ -465,16 +468,12 @@ public boolean stopVPN(boolean replaceConnection) throws RemoteException {
465468
466469 @ Override
467470 public int onStartCommand (Intent intent , int flags , int startId ) {
468-
469471 if (intent != null && intent .getBooleanExtra (ALWAYS_SHOW_NOTIFICATION , false ))
470472 mNotificationAlwaysVisible = true ;
471473
472474 VpnStatus .addStateListener (this );
473475 VpnStatus .addByteCountListener (this );
474476
475- guiHandler = new Handler (getMainLooper ());
476-
477-
478477 if (intent != null && PAUSE_VPN .equals (intent .getAction ())) {
479478 if (mDeviceStateReceiver != null )
480479 mDeviceStateReceiver .userPause (true );
@@ -502,7 +501,7 @@ public int onStartCommand(Intent intent, int flags, int startId) {
502501
503502
504503 /* start the OpenVPN process itself in a background thread */
505- new Thread (() -> startOpenVPN (intent , startId )). start ( );
504+ mCommandHandler . post (() -> startOpenVPN (intent , startId ));
506505
507506 return START_STICKY ;
508507 }
@@ -609,9 +608,8 @@ private void startOpenVPN(Intent intent, int startId) {
609608 processThread = new OpenVPNThread (this , argv , nativeLibraryDirectory , tmpDir );
610609 }
611610
612- mProcessThread = new Thread (processThread , "OpenVPNProcessThread" );
613-
614611 synchronized (mProcessLock ) {
612+ mProcessThread = new Thread (processThread , "OpenVPNProcessThread" );
615613 mProcessThread .start ();
616614 }
617615
@@ -625,15 +623,15 @@ private void startOpenVPN(Intent intent, int startId) {
625623 }
626624 }
627625
628- DeviceStateReceiver oldDeviceStateReceiver = mDeviceStateReceiver ;
629- mDeviceStateReceiver = new DeviceStateReceiver (mManagement );
630-
626+ final DeviceStateReceiver oldDeviceStateReceiver = mDeviceStateReceiver ;
627+ final DeviceStateReceiver newDeviceStateReceiver = new DeviceStateReceiver (mManagement );
631628
632- new Handler ( getMainLooper ()) .post (() -> {
629+ guiHandler .post (() -> {
633630 if (oldDeviceStateReceiver != null )
634631 unregisterDeviceStateReceiver (oldDeviceStateReceiver );
635632
636- registerDeviceStateReceiver ();
633+ registerDeviceStateReceiver (newDeviceStateReceiver );
634+ mDeviceStateReceiver = newDeviceStateReceiver ;
637635 });
638636 }
639637
@@ -688,6 +686,10 @@ public IBinder asBinder() {
688686 @ Override
689687 public void onCreate () {
690688 super .onCreate ();
689+ guiHandler = new Handler (getMainLooper ());
690+ mCommandHandlerThread = new HandlerThread ("OpenVPNServiceCommandThread" );
691+ mCommandHandlerThread .start ();
692+ mCommandHandler = new Handler (mCommandHandlerThread .getLooper ());
691693 }
692694
693695 @ Override
0 commit comments