diff --git a/.travis.yml b/.travis.yml index b31175c1..52c7ec63 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,7 @@ env: - secure: "em+bEb3nWLV7f+Dt4y9/OH2Lpf6mscT9E52kXhSEm/PiFpTtzlx7BgHGlpsYVwsMf0e7x2AdF/yzq4c7ugoMqWmFXMthgFUKcLTXqW/IeARGz3smMXnyScRoaFElDm0Q33fxiqDlU7UVA4j1FysR5GqTU10MasJgGpoyTthRQvra0LU8zwI4IMiASfa8Tij5LclsbaTpcgB4TdXtBmbpKQAUzjvV/ZfLsYQ950C0rbVKk9T1xtc8d5BTbggwHWbMMqGn6RFvSCQioeI/Q6Daak6zDglUY+JE/1BnzlGzoba9C7TLZV4+TQkmB5kc6FtKqSXycjwJSKm3wQFYOzJrLMPqMtlmaAeTEs5yBIYtIIAiID+hbeUKvWTpoUxwUYz7s7XLikJRdxe7iBlhdy3qv+FdGOJjV9g/xeSVXISvXzcKp2sNdU+FABBBDAA2CKWrZOXuzPAh8iYxLnt649hQFAw99ylkn75+LpJgq7gRUO87Fde0Zw3vYhLIS8UH3OBtggV1yrYHuKXWUyfkiA/xcm+NSFgIXJzGvYlOZWS+uZvXeh7wJz5CF0t3m6emBoqX6JAXQ/t9SgwGX8lwbLPK3HiYBnTMEDxb6qpIiYa8E8tfudA1YNyeszG8mZtiErJf9YleagACuASwPFsLb8Bg9BNJX5X89+VrbzPbncZD9Tc=" before_install: + - yes | sdkmanager "platforms;android-27" - echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca- addons: diff --git a/app/build.gradle b/app/build.gradle index c938acf5..e83fc8b0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -17,20 +17,19 @@ sonarqube { android { compileSdkVersion 27 buildToolsVersion '27.0.2' - useLibrary 'org.apache.http.legacy' defaultConfig { minSdkVersion 14 targetSdkVersion 27 - versionCode 53 - versionName "2.2.4" + versionCode 54 + versionName "2.2.6" applicationId "com.aaronjwood.portauthority" setProperty("archivesBaseName", "PortAuthority-$versionName") } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } buildTypes { @@ -68,6 +67,7 @@ android { dependencies { compile 'com.android.support:support-v4:27.0.2' compile 'com.android.support:appcompat-v7:27.0.2' + compile 'com.squareup.okhttp3:okhttp:3.9.1' compile 'jcifs:jcifs:1.3.17' compile 'dnsjava:dnsjava:2.1.7' //This does absolutely nothing diff --git a/app/proguard.pro b/app/proguard.pro index 34183354..26ef9e2c 100644 --- a/app/proguard.pro +++ b/app/proguard.pro @@ -2,4 +2,10 @@ -dontwarn org.xbill.DNS.spi.DNSJavaNameServiceDescriptor -keep class org.xbill.** { *; } -keepattributes EnclosingMethod --keepattributes InnerClasses \ No newline at end of file +-keepattributes InnerClasses + +-dontwarn okhttp3.** +-dontwarn okio.** +-dontwarn javax.annotation.** +# A resource is loaded with a relative path so the package of this class must be preserved. +-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index c4afc32f..6f79851c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -8,6 +8,7 @@ hosts = Collections.synchronizedList(new ArrayList()); @@ -85,6 +83,25 @@ public final class MainActivity extends AppCompatActivity implements MainAsyncRe private DownloadAsyncTask portTask; private boolean sortAscending; + private BroadcastReceiver receiver = new BroadcastReceiver() { + + /** + * Detect if a network connection has been lost or established + * @param context + * @param intent + */ + @Override + public void onReceive(Context context, Intent intent) { + NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); + if (info == null) { + return; + } + + getNetworkInfo(info); + } + + }; + /** * Activity created * @@ -94,10 +111,6 @@ public final class MainActivity extends AppCompatActivity implements MainAsyncRe protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (BuildConfig.DEBUG) { - LeakCanary.install(getApplication()); - } - setContentView(R.layout.activity_main); internalIp = findViewById(R.id.internalIpAddress); @@ -117,8 +130,9 @@ protected void onCreate(Bundle savedInstanceState) { setupHostsAdapter(); setupDrawer(); - setupReceivers(); setupHostDiscovery(); + + intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); } /** @@ -214,18 +228,20 @@ private void setupHostDiscovery() { */ @Override public void onClick(View v) { + Resources resources = getResources(); + Context context = getApplicationContext(); try { if (!wifi.isEnabled()) { - Errors.showError(getApplicationContext(), getResources().getString(R.string.wifiDisabled)); + Errors.showError(context, resources.getString(R.string.wifiDisabled)); return; } if (!wifi.isConnectedWifi()) { - Errors.showError(getApplicationContext(), getResources().getString(R.string.notConnectedWifi)); + Errors.showError(context, resources.getString(R.string.notConnectedWifi)); return; } } catch (Wireless.NoWifiManagerException | Wireless.NoConnectivityManagerException e) { - Errors.showError(getApplicationContext(), getResources().getString(R.string.failedWifiManager)); + Errors.showError(context, resources.getString(R.string.failedWifiManager)); return; } @@ -233,7 +249,7 @@ public void onClick(View v) { try { numSubnetHosts = wifi.getNumberOfHostsInWifiSubnet(); } catch (Wireless.NoWifiManagerException e) { - Errors.showError(getApplicationContext(), getResources().getString(R.string.failedSubnetHosts)); + Errors.showError(context, resources.getString(R.string.failedSubnetHosts)); return; } @@ -245,8 +261,8 @@ public void onClick(View v) { scanProgressDialog = new ProgressDialog(MainActivity.this, R.style.DialogTheme); scanProgressDialog.setCancelable(false); - scanProgressDialog.setTitle(getResources().getString(R.string.hostScan)); - scanProgressDialog.setMessage(String.format(getResources().getString(R.string.subnetHosts), numSubnetHosts)); + scanProgressDialog.setTitle(resources.getString(R.string.hostScan)); + scanProgressDialog.setMessage(String.format(resources.getString(R.string.subnetHosts), numSubnetHosts)); scanProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); scanProgressDialog.setProgress(0); scanProgressDialog.setMax(numSubnetHosts); @@ -254,11 +270,11 @@ public void onClick(View v) { try { Integer ip = wifi.getInternalWifiIpAddress(Integer.class); - new ScanHostsAsyncTask(MainActivity.this, db).execute(ip, wifi.getInternalWifiSubnet(), UserPreference.getHostSocketTimeout(getApplicationContext())); + new ScanHostsAsyncTask(MainActivity.this, db).execute(ip, wifi.getInternalWifiSubnet(), UserPreference.getHostSocketTimeout(context)); discoverHostsBtn.setAlpha(.3f); discoverHostsBtn.setEnabled(false); } catch (UnknownHostException | Wireless.NoWifiManagerException e) { - Errors.showError(getApplicationContext(), getResources().getString(R.string.notConnectedWifi)); + Errors.showError(context, resources.getString(R.string.notConnectedWifi)); } } }); @@ -384,33 +400,6 @@ private void setClip(CharSequence label, String text) { } } - /** - * Sets up and registers receivers - */ - private void setupReceivers() { - receiver = new BroadcastReceiver() { - - /** - * Detect if a network connection has been lost or established - * @param context - * @param intent - */ - @Override - public void onReceive(Context context, Intent intent) { - NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); - if (info == null) { - return; - } - - getNetworkInfo(info); - } - - }; - - intentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); - registerReceiver(receiver, intentFilter); - } - /** * Gets network information about the device and updates various UI elements */ @@ -418,6 +407,8 @@ private void getNetworkInfo(NetworkInfo info) { setupMac(); getExternalIp(); + final Resources resources = getResources(); + final Context context = getApplicationContext(); try { boolean enabled = wifi.isEnabled(); if (!info.isConnected() || !enabled) { @@ -433,7 +424,7 @@ private void getNetworkInfo(NetworkInfo info) { return; } } catch (Wireless.NoWifiManagerException e) { - Errors.showError(getApplicationContext(), getResources().getString(R.string.failedWifiManager)); + Errors.showError(context, resources.getString(R.string.failedWifiManager)); } if (!info.isConnected()) { @@ -452,17 +443,17 @@ public void run() { try { speed = wifi.getLinkSpeed(); } catch (Wireless.NoWifiManagerException e) { - Errors.showError(getApplicationContext(), getResources().getString(R.string.failedLinkSpeed)); + Errors.showError(context, resources.getString(R.string.failedLinkSpeed)); return; } try { signal = wifi.getSignalStrength(); } catch (Wireless.NoWifiManagerException e) { - Errors.showError(getApplicationContext(), getResources().getString(R.string.failedSignal)); + Errors.showError(context, resources.getString(R.string.failedSignal)); return; } - signalStrength.setText(String.format(getResources().getString(R.string.signalLink), signal, speed)); + signalStrength.setText(String.format(resources.getString(R.string.signalLink), signal, speed)); signalHandler.postDelayed(this, TIMER_INTERVAL); } }, 0); @@ -474,13 +465,13 @@ public void run() { try { wifiSsid = wifi.getSSID(); } catch (Wireless.NoWifiManagerException e) { - Errors.showError(getApplicationContext(), getResources().getString(R.string.failedSsid)); + Errors.showError(context, resources.getString(R.string.failedSsid)); return; } try { wifiBssid = wifi.getBSSID(); } catch (Wireless.NoWifiManagerException e) { - Errors.showError(getApplicationContext(), getResources().getString(R.string.failedBssid)); + Errors.showError(context, resources.getString(R.string.failedBssid)); return; } @@ -604,6 +595,9 @@ private void getExternalIp() { public void onPause() { super.onPause(); + unregisterReceiver(receiver); + signalHandler.removeCallbacksAndMessages(null); + if (scanProgressDialog != null) { scanProgressDialog.dismiss(); } @@ -622,25 +616,11 @@ public void onPause() { } /** - * Activity destroyed - */ - @Override - public void onDestroy() { - super.onDestroy(); - - signalHandler.removeCallbacksAndMessages(null); - - if (receiver != null) { - unregisterReceiver(receiver); - } - } - - /** - * Activity restarted + * Activity resumed. */ @Override - public void onRestart() { - super.onRestart(); + public void onResume() { + super.onResume(); registerReceiver(receiver, intentFilter); } @@ -700,8 +680,8 @@ public void run() { @Override public int compare(Host lhs, Host rhs) { try { - int leftIp = new BigInteger(InetAddress.getByName(lhs.getIp()).getAddress()).intValue(); - int rightIp = new BigInteger(InetAddress.getByName(rhs.getIp()).getAddress()).intValue(); + int leftIp = ByteBuffer.wrap(InetAddress.getByName(lhs.getIp()).getAddress()).getInt(); + int rightIp = ByteBuffer.wrap(InetAddress.getByName(rhs.getIp()).getAddress()).getInt(); return leftIp - rightIp; } catch (UnknownHostException ignored) { diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/WanIpAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/WanIpAsyncTask.java index 4cbe571f..123002b9 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/WanIpAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/WanIpAsyncTask.java @@ -1,20 +1,17 @@ package com.aaronjwood.portauthority.async; +import android.annotation.SuppressLint; import android.os.AsyncTask; import com.aaronjwood.portauthority.response.MainAsyncResponse; -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.util.EntityUtils; - import java.io.IOException; import java.lang.ref.WeakReference; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + public class WanIpAsyncTask extends AsyncTask { // IP service is 100% open source https://github.com/aaronjwood/public-ip-api @@ -37,20 +34,18 @@ public WanIpAsyncTask(MainAsyncResponse delegate) { * @return External IP address */ @Override + @SuppressLint("NewApi") protected String doInBackground(Void... params) { String error = "Couldn't get your external IP"; - HttpClient httpclient = new DefaultHttpClient(); - HttpGet httpget = new HttpGet(EXTERNAL_IP_SERVICE); + OkHttpClient httpClient = new OkHttpClient(); + Request request = new Request.Builder().url(EXTERNAL_IP_SERVICE).build(); - try { - HttpResponse response = httpclient.execute(httpget); - if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { + try (Response response = httpClient.newCall(request).execute()) { + if (!response.isSuccessful()) { return error; } - return EntityUtils.toString(response.getEntity()).trim(); - } catch (ClientProtocolException e) { - return error; + return response.body().string().trim(); } catch (IOException e) { return error; }