From 02f238a7b2c79b3a6c175cee6e063e9c32a237ba Mon Sep 17 00:00:00 2001 From: samuelp Date: Wed, 17 Feb 2021 13:54:48 +0100 Subject: [PATCH 1/4] Add option to start the app with predefined settings --- .../remote_capture/MainActivity.java | 88 ++++++++++++++----- 1 file changed, 67 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java b/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java index af33ce08..e9b1bf1b 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java @@ -27,6 +27,11 @@ import android.content.SharedPreferences; import android.graphics.drawable.Drawable; import android.net.Uri; import android.net.VpnService; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -43,12 +48,6 @@ import androidx.preference.PreferenceManager; import androidx.viewpager2.adapter.FragmentStateAdapter; import androidx.viewpager2.widget.ViewPager2; -import android.os.Bundle; -import android.util.Log; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; - import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayoutMediator; @@ -74,6 +73,7 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa TabLayout tabLayout; List mStateListeners; AppDescriptor mAndroidApp; + Intent mRestartWithIntent; private final static int POS_STATUS = 0; private final static int POS_CONNECTIONS = 1; private final static int TOTAL_COUNT = 2; @@ -142,7 +142,7 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa case POS_CONNECTIONS: tab.setText(R.string.connections_view); break; - } + } }).attach(); mPrefs = PreferenceManager.getDefaultSharedPreferences(this); @@ -165,7 +165,11 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa if (CaptureService.isServiceActive()) CaptureService.stopService(); - appStateReady(); + if(mRestartWithIntent != null) { + autoStartService(mRestartWithIntent); + mRestartWithIntent = null; + } else + appStateReady(); } } } @@ -180,8 +184,47 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa initAppState(); } + private void checkAutoStart(Intent intent) { + if ((intent == null) || !intent.hasExtra("autostart")) + return; + + if (CaptureService.isServiceActive()) { + mRestartWithIntent = intent; + toggleService(); + } else + autoStartService(intent); + } + + private void autoStartService(Intent intent) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + SharedPreferences.Editor editor = prefs.edit(); + if (intent.hasExtra("collectorIp")) { + editor.putString(Prefs.PREF_PCAP_DUMP_MODE, Prefs.DUMP_UDP_EXPORTER); + editor.putString(Prefs.PREF_COLLECTOR_IP_KEY, intent.getStringExtra("collectorIp")); + if (intent.hasExtra("collectorPort")) { + editor.putString(Prefs.PREF_COLLECTOR_PORT_KEY, intent.getStringExtra("collectorPort")); + } + } else if (intent.hasExtra("httpServerPort")) { + editor.putString(Prefs.PREF_PCAP_DUMP_MODE, Prefs.DUMP_HTTP_SERVER); + editor.putString(Prefs.PREF_HTTP_SERVER_PORT, intent.getStringExtra("httpServerPort")); + } + + if (intent.hasExtra("proxyIp")) { + editor.putBoolean(Prefs.PREF_TLS_DECRYPTION_ENABLED_KEY, true); + editor.putString(Prefs.PREF_TLS_PROXY_IP_KEY, intent.getStringExtra("proxyIp")); + if (intent.hasExtra("proxyPort")) { + editor.putString(Prefs.PREF_TLS_PROXY_PORT_KEY, intent.getStringExtra("proxyPort")); + } + } + editor.apply(); + if (intent.hasExtra("filterPackage")) { + mFilterApp = intent.getStringExtra("filterPackage"); + } + toggleService(); + } + private void notifyAppState() { - for(AppStateListener listener: mStateListeners) + for (AppStateListener listener : mStateListeners) listener.appStateChanged(mState); } @@ -276,7 +319,7 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); - if(id == R.id.action_start) { + if (id == R.id.action_start) { toggleService(); return true; } else if (id == R.id.action_settings) { @@ -314,7 +357,7 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_VPN) { - if(resultCode == RESULT_OK) { + if (resultCode == RESULT_OK) { Intent intent = new Intent(MainActivity.this, CaptureService.class); Bundle bundle = new Bundle(); @@ -367,10 +410,10 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa } AppDescriptor findAppByUid(int uid) { - if((mInstalledApps == null) || (uid == -1)) + if ((mInstalledApps == null) || (uid == -1)) return (null); - if(uid == 1000) // android system + if (uid == 1000) // android system return mAndroidApp; for (int i = 0; i < mInstalledApps.size(); i++) { @@ -406,6 +449,8 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa appStateReady(); else appStateRunning(); + + checkAutoStart(getIntent()); } private void startService() { @@ -423,11 +468,12 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa CaptureService.stopService(); appStateStopping(); } else { - if(Utils.hasVPNRunning(this)) { + if (Utils.hasVPNRunning(this)) { new AlertDialog.Builder(this) .setMessage(R.string.existing_vpn_confirm) .setPositiveButton(R.string.yes, (dialog, whichButton) -> startService()) - .setNegativeButton(R.string.no, (dialog, whichButton) -> {}) + .setNegativeButton(R.string.no, (dialog, whichButton) -> { + }) .show(); } else startService(); @@ -443,7 +489,7 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa } AppState getState() { - return(mState); + return (mState); } private void startLoadingApps() { @@ -452,7 +498,7 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa Log.d("startLoadingApps", "Loader? " + (loader != null)); - if(loader==null) + if (loader == null) loader = lm.initLoader(OPERATION_SEARCH_LOADER, null, this); else loader = lm.restartLoader(OPERATION_SEARCH_LOADER, null, this); @@ -467,7 +513,7 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa } private void openAppSelector() { - if(mInstalledApps == null) { + if (mInstalledApps == null) { /* The applications loader has not finished yet. */ mOpenAppsWhenDone = true; Utils.showToast(this, R.string.apps_loading_please_wait); @@ -477,10 +523,10 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa // Filter non-system apps List user_apps = new ArrayList<>(); - for(int i=0; i { - if(app.getUid() != -1) { + if (app.getUid() != -1) { // an app has been selected mFilterApp = app.getPackageName(); setSelectedAppIcon(app); From f1490a05ea1a0a9821dd9fe31e4640474d792d9c Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Sat, 20 Feb 2021 10:37:53 +0100 Subject: [PATCH 2/4] Revert "Add option to start the app with predefined settings" This reverts commit 02f238a7b2c79b3a6c175cee6e063e9c32a237ba. Check out https://github.com/emanuele-f/PCAPdroid/issues/33 for details. --- .../remote_capture/MainActivity.java | 88 +++++-------------- 1 file changed, 21 insertions(+), 67 deletions(-) diff --git a/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java b/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java index e9b1bf1b..af33ce08 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java @@ -27,11 +27,6 @@ import android.content.SharedPreferences; import android.graphics.drawable.Drawable; import android.net.Uri; import android.net.VpnService; -import android.os.Bundle; -import android.util.Log; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -48,6 +43,12 @@ import androidx.preference.PreferenceManager; import androidx.viewpager2.adapter.FragmentStateAdapter; import androidx.viewpager2.widget.ViewPager2; +import android.os.Bundle; +import android.util.Log; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; + import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayoutMediator; @@ -73,7 +74,6 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa TabLayout tabLayout; List mStateListeners; AppDescriptor mAndroidApp; - Intent mRestartWithIntent; private final static int POS_STATUS = 0; private final static int POS_CONNECTIONS = 1; private final static int TOTAL_COUNT = 2; @@ -142,7 +142,7 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa case POS_CONNECTIONS: tab.setText(R.string.connections_view); break; - } + } }).attach(); mPrefs = PreferenceManager.getDefaultSharedPreferences(this); @@ -165,11 +165,7 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa if (CaptureService.isServiceActive()) CaptureService.stopService(); - if(mRestartWithIntent != null) { - autoStartService(mRestartWithIntent); - mRestartWithIntent = null; - } else - appStateReady(); + appStateReady(); } } } @@ -184,47 +180,8 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa initAppState(); } - private void checkAutoStart(Intent intent) { - if ((intent == null) || !intent.hasExtra("autostart")) - return; - - if (CaptureService.isServiceActive()) { - mRestartWithIntent = intent; - toggleService(); - } else - autoStartService(intent); - } - - private void autoStartService(Intent intent) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - SharedPreferences.Editor editor = prefs.edit(); - if (intent.hasExtra("collectorIp")) { - editor.putString(Prefs.PREF_PCAP_DUMP_MODE, Prefs.DUMP_UDP_EXPORTER); - editor.putString(Prefs.PREF_COLLECTOR_IP_KEY, intent.getStringExtra("collectorIp")); - if (intent.hasExtra("collectorPort")) { - editor.putString(Prefs.PREF_COLLECTOR_PORT_KEY, intent.getStringExtra("collectorPort")); - } - } else if (intent.hasExtra("httpServerPort")) { - editor.putString(Prefs.PREF_PCAP_DUMP_MODE, Prefs.DUMP_HTTP_SERVER); - editor.putString(Prefs.PREF_HTTP_SERVER_PORT, intent.getStringExtra("httpServerPort")); - } - - if (intent.hasExtra("proxyIp")) { - editor.putBoolean(Prefs.PREF_TLS_DECRYPTION_ENABLED_KEY, true); - editor.putString(Prefs.PREF_TLS_PROXY_IP_KEY, intent.getStringExtra("proxyIp")); - if (intent.hasExtra("proxyPort")) { - editor.putString(Prefs.PREF_TLS_PROXY_PORT_KEY, intent.getStringExtra("proxyPort")); - } - } - editor.apply(); - if (intent.hasExtra("filterPackage")) { - mFilterApp = intent.getStringExtra("filterPackage"); - } - toggleService(); - } - private void notifyAppState() { - for (AppStateListener listener : mStateListeners) + for(AppStateListener listener: mStateListeners) listener.appStateChanged(mState); } @@ -319,7 +276,7 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); - if (id == R.id.action_start) { + if(id == R.id.action_start) { toggleService(); return true; } else if (id == R.id.action_settings) { @@ -357,7 +314,7 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_VPN) { - if (resultCode == RESULT_OK) { + if(resultCode == RESULT_OK) { Intent intent = new Intent(MainActivity.this, CaptureService.class); Bundle bundle = new Bundle(); @@ -410,10 +367,10 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa } AppDescriptor findAppByUid(int uid) { - if ((mInstalledApps == null) || (uid == -1)) + if((mInstalledApps == null) || (uid == -1)) return (null); - if (uid == 1000) // android system + if(uid == 1000) // android system return mAndroidApp; for (int i = 0; i < mInstalledApps.size(); i++) { @@ -449,8 +406,6 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa appStateReady(); else appStateRunning(); - - checkAutoStart(getIntent()); } private void startService() { @@ -468,12 +423,11 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa CaptureService.stopService(); appStateStopping(); } else { - if (Utils.hasVPNRunning(this)) { + if(Utils.hasVPNRunning(this)) { new AlertDialog.Builder(this) .setMessage(R.string.existing_vpn_confirm) .setPositiveButton(R.string.yes, (dialog, whichButton) -> startService()) - .setNegativeButton(R.string.no, (dialog, whichButton) -> { - }) + .setNegativeButton(R.string.no, (dialog, whichButton) -> {}) .show(); } else startService(); @@ -489,7 +443,7 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa } AppState getState() { - return (mState); + return(mState); } private void startLoadingApps() { @@ -498,7 +452,7 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa Log.d("startLoadingApps", "Loader? " + (loader != null)); - if (loader == null) + if(loader==null) loader = lm.initLoader(OPERATION_SEARCH_LOADER, null, this); else loader = lm.restartLoader(OPERATION_SEARCH_LOADER, null, this); @@ -513,7 +467,7 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa } private void openAppSelector() { - if (mInstalledApps == null) { + if(mInstalledApps == null) { /* The applications loader has not finished yet. */ mOpenAppsWhenDone = true; Utils.showToast(this, R.string.apps_loading_please_wait); @@ -523,10 +477,10 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa // Filter non-system apps List user_apps = new ArrayList<>(); - for (int i = 0; i < mInstalledApps.size(); i++) { + for(int i=0; i { - if (app.getUid() != -1) { + if(app.getUid() != -1) { // an app has been selected mFilterApp = app.getPackageName(); setSelectedAppIcon(app); From b1877ae02176459e0c0c7128f203fc7a63c1588e Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Sat, 20 Feb 2021 10:57:51 +0100 Subject: [PATCH 3/4] Bump version to 1.2.15 --- CHANGELOG.md | 4 ++++ app/build.gradle | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64ecc3d5..c8456fb6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ Releases available at https://github.com/emanuele-f/PCAPdroid/releases +## [1.2.14] - 2021-02-20 +- Improve connections stability +- Report fatal native errors to the user + ## [1.2.13] - 2021-02-14 - Fix DNS resolution not working when an IPv6 DNS server is configured diff --git a/app/build.gradle b/app/build.gradle index 130e8940..f8b12108 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId "com.emanuelef.remote_capture" minSdkVersion 21 targetSdkVersion 30 - versionCode 17 - versionName "1.2.14" + versionCode 18 + versionName "1.2.15" } buildTypes { From 673a70eed4732cb35275166b9b57a1dd7e5b585c Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Sat, 20 Feb 2021 21:34:58 +0100 Subject: [PATCH 4/4] Fix wrong app state on first app start On the first app start, when the VPN confirmation dialog was shown, the app state remained in the "ready" state rather than transitioning to to "running" state. The play button was not replaced with the stop button. --- .../java/com/emanuelef/remote_capture/MainActivity.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java b/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java index af33ce08..4565ec3d 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/MainActivity.java @@ -158,7 +158,7 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa String status = intent.getStringExtra(CaptureService.SERVICE_STATUS_KEY); if (status != null) { - if (status.equals(CaptureService.SERVICE_STATUS_STARTED) && (mState == AppState.starting)) { + if (status.equals(CaptureService.SERVICE_STATUS_STARTED)) { appStateRunning(); } else if (status.equals(CaptureService.SERVICE_STATUS_STOPPED)) { // The service may still be active (on premature native termination) @@ -409,19 +409,20 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa } private void startService() { + appStateStarting(); + Intent vpnPrepareIntent = VpnService.prepare(MainActivity.this); + if (vpnPrepareIntent != null) startActivityForResult(vpnPrepareIntent, REQUEST_CODE_VPN); else onActivityResult(REQUEST_CODE_VPN, RESULT_OK, null); - - appStateStarting(); } public void toggleService() { if (CaptureService.isServiceActive()) { - CaptureService.stopService(); appStateStopping(); + CaptureService.stopService(); } else { if(Utils.hasVPNRunning(this)) { new AlertDialog.Builder(this)