From c1d6d7a36cf14d0a5b696be2e2438f248ef7a69f Mon Sep 17 00:00:00 2001 From: aevw <69059460+aevw@users.noreply.github.com> Date: Mon, 7 Sep 2020 17:45:04 -0300 Subject: [PATCH 01/52] Create strings.xml pt_BR to dev branch --- app/src/main/res/values-pt-rBR/strings.xml | 59 ++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 app/src/main/res/values-pt-rBR/strings.xml diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml new file mode 100644 index 00000000..51690320 --- /dev/null +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -0,0 +1,59 @@ + + + + Port Authority + Configurações + MAC + Fabricante + IP do LAN + IP do WAN + Extraindo… + Sinal/Velocidade + Descubra os servidores + SSID + BSSID + Examinar as Portas Conhecidas + Examinar Intervalo das Portas + Reiniciar Intervalo das Portas + As Portas Abertas + Iniciar a Porta + Parar a Porta + WiFi desativado + Sem conexão WiFi + URL/IP + ATENÇÃO + Nome do domínio + Consulta o DNS + Ativação + Ativando %1$s… + Endereço do IP + Extraindo registros do DNS … + Digite um domínio e selecione um tipo de registro + Você não está conectado à rede local + Você não está conectado à rede WiFi + %1$ddBm/%2$dMbps + Procurando os servidores + %1$d hosts na sua sub-rede + Ordenar + Por nome do servidor + Pelo fabricante + Copiar nome do servidor + Copiar o IP + Copiar o MAC + Falha ao obter o fabricante do MAC + Falha ao abrir a base de dados + Baixando base de dados + Falha ao obter o número dos servidores na sub-rede + Falha ao obter a força do sinal + Falha ao obter a velocidade do link + Falha ao obter o SSID + Falha ao obter o BSSID + Falha ao obter Gerenciador do Wifi para este dispositivo + Nenhuma interface do WiFi encontrada + + Por favor, esteja ciente de que executar examinador das portas contra servidores públicos é normalmente considerado malicioso. + Além disso, a execução destes tipos de exames na rede da sua operadora em vez da sua própria conexão WiFi (ou LAN) será mais lenta e às vezes produzirá resultados imprecisos devido à modelagem do tráfego. + Sua operadora também pode considerar o tráfego gerado por este tipo de examinação como sendo malicioso. + + + From 63428a31f3ed447018c72901a7c3282f81754506 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 14 Sep 2020 00:22:00 -0700 Subject: [PATCH 02/52] Remove check for impossible case --- .../java/com/aaronjwood/portauthority/network/Wireless.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java b/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java index ef4850df..8b4caf95 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java +++ b/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java @@ -150,10 +150,6 @@ public T getInternalWifiIpAddress(Class type) throws UnknownHostException */ public int getInternalWifiSubnet() throws NoWifiManagerException { WifiManager wifiManager = getWifiManager(); - if (wifiManager == null) { - return 0; - } - DhcpInfo dhcpInfo = wifiManager.getDhcpInfo(); if (dhcpInfo == null) { return 0; From a8b9d6f46258a93f302b48e0bb7ef5069b0a7360 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 14 Sep 2020 00:22:31 -0700 Subject: [PATCH 03/52] Use primitive and remove unnecessary cast --- .../java/com/aaronjwood/portauthority/network/Wireless.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java b/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java index 8b4caf95..893ef3f3 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java +++ b/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java @@ -189,7 +189,7 @@ public int getInternalWifiSubnet() throws NoWifiManagerException { * @return Number of hosts as an integer. */ public int getNumberOfHostsInWifiSubnet() throws NoWifiManagerException { - Double subnet = (double) getInternalWifiSubnet(); + double subnet = getInternalWifiSubnet(); double hosts; double bitsLeft = 32.0d - subnet; hosts = Math.pow(2.0d, bitsLeft) - 2.0d; From 1bcc274923417bd69c9cf8b93a9319f072d95475 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 14 Sep 2020 03:31:02 -0700 Subject: [PATCH 04/52] Display real progress when downloading databases --- .../async/DownloadAsyncTask.java | 50 +++++++++++++------ .../async/DownloadOuisAsyncTask.java | 4 +- 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java index 1b2da869..6eafde3d 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java @@ -14,13 +14,21 @@ import java.io.InputStreamReader; import java.lang.ref.WeakReference; import java.net.URL; -import java.nio.charset.StandardCharsets; import java.util.zip.GZIPInputStream; import javax.net.ssl.HttpsURLConnection; -public abstract class DownloadAsyncTask extends AsyncTask { +class DownloadProgress { + public String message; + public int progress; + @Override + public String toString() { + return message; + } +} + +public abstract class DownloadAsyncTask extends AsyncTask { private ProgressDialog dialog; protected Database db; @@ -40,7 +48,10 @@ protected void onPreExecute() { Context ctx = (Context) activity; dialog = new ProgressDialog(ctx, R.style.DialogTheme); + dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); dialog.setMessage(ctx.getResources().getString(R.string.downloadingData)); + dialog.setIndeterminate(false); + dialog.setMax(100); dialog.setCanceledOnTouchOutside(false); dialog.setOnCancelListener(dialogInterface -> { dialogInterface.cancel(); @@ -59,39 +70,51 @@ final void doInBackground(String service, Parser parser) { BufferedReader in = null; HttpsURLConnection connection = null; db.beginTransaction(); + DownloadProgress downProg = new DownloadProgress(); try { URL url = new URL(service); connection = (HttpsURLConnection) url.openConnection(); connection.setRequestProperty("Accept-Encoding", "gzip"); connection.connect(); if (connection.getResponseCode() != HttpsURLConnection.HTTP_OK) { - publishProgress(connection.getResponseCode() + " " + connection.getResponseMessage()); + downProg.message = connection.getResponseCode() + " " + connection.getResponseMessage(); + publishProgress(downProg); return; } + // Get the content length ourselves since connection.getContentLengthLong() requires a minimum API of 24+. + // The same is true for connection.getHeaderFieldLong(). + String contentLen = connection.getHeaderField("Content-Length"); + long len = Long.parseLong(contentLen); in = new BufferedReader(new InputStreamReader(new GZIPInputStream(connection.getInputStream()), "UTF-8")); String line; - + long total = 0; while ((line = in.readLine()) != null) { if (isCancelled()) { return; } + total += line.length(); // Lean on the fact that we're working with UTF-8 here. + downProg.progress = (int) (total * 100 / len); + publishProgress(downProg); String[] data = parser.parseLine(line); if (data == null) { continue; } if (parser.saveLine(db, data) == -1) { - publishProgress("Failed to insert data into the database. Please run this operation again"); + downProg.message = "Failed to insert data into the database. Please run this operation again"; + publishProgress(downProg); return; } } + db.setTransactionSuccessful(); } catch (Exception e) { - publishProgress(e.toString()); + downProg.message = e.toString(); + publishProgress(downProg); } finally { db.endTransaction(); try { @@ -107,17 +130,16 @@ final void doInBackground(String service, Parser parser) { } } - /** - * Handles errors. - * - * @param progress - */ @Override - protected void onProgressUpdate(String... progress) { + protected void onProgressUpdate(DownloadProgress... progress) { + DownloadProgress currProg = progress[0]; MainAsyncResponse activity = delegate.get(); - if (activity != null) { - activity.processFinish(new Exception(progress[0])); + if (currProg.message != null && activity != null) { + activity.processFinish(new Exception(currProg.message)); + return; } + + dialog.setProgress(currProg.progress); } /** diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadOuisAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadOuisAsyncTask.java index 96d091bb..7db44806 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadOuisAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadOuisAsyncTask.java @@ -9,7 +9,9 @@ public class DownloadOuisAsyncTask extends DownloadAsyncTask { - private static final String SERVICE = "https://code.wireshark.org/review/gitweb?p=wireshark.git;a=blob_plain;f=manuf"; + // The official source on gitlab.com doesn't provide a content length header which ruins our ability to report progress! + // Use the mirror from github.com instead. + private static final String SERVICE = "https://raw.githubusercontent.com/wireshark/wireshark/master/manuf"; /** * Creates a new asynchronous task to handle downloading OUI data. From f9d2453715a36b5a2efbe39c3d15b275e084002f Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 14 Sep 2020 11:28:31 -0700 Subject: [PATCH 05/52] Allow sorting of discovered hosts by IP --- .../portauthority/activity/MainActivity.java | 29 +++++++++++++------ .../async/ScanHostsAsyncTask.java | 10 ++++++- .../portauthority/network/Host.java | 15 +++++++++- app/src/main/res/menu/host_menu.xml | 3 ++ app/src/main/res/values/strings.xml | 1 + 5 files changed, 47 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java index e7b25c0d..39db7822 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java +++ b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java @@ -58,7 +58,6 @@ import com.aaronjwood.portauthority.utils.UserPreference; import java.io.IOException; -import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import java.nio.ByteBuffer; @@ -385,6 +384,23 @@ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMen public boolean onContextItemSelected(MenuItem item) { AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()) { + case R.id.sortIp: + sortAscending = !sortAscending; + if (sortAscending) { + hostAdapter.sort((lhs, rhs) -> { + int leftIp = ByteBuffer.wrap(lhs.getAddress()).getInt(); + int rightIp = ByteBuffer.wrap(rhs.getAddress()).getInt(); + return rightIp - leftIp; + }); + } else { + hostAdapter.sort((lhs, rhs) -> { + int leftIp = ByteBuffer.wrap(lhs.getAddress()).getInt(); + int rightIp = ByteBuffer.wrap(rhs.getAddress()).getInt(); + return leftIp - rightIp; + }); + } + + return true; case R.id.sortHostname: if (sortAscending) { hostAdapter.sort((lhs, rhs) -> rhs.getHostname().toLowerCase().compareTo(lhs.getHostname().toLowerCase())); @@ -745,14 +761,9 @@ public void processFinish(final Host h, final AtomicInteger i) { scanHandler.post(() -> { hosts.add(h); hostAdapter.sort((lhs, rhs) -> { - try { - 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) { - return 0; - } + int leftIp = ByteBuffer.wrap(lhs.getAddress()).getInt(); + int rightIp = ByteBuffer.wrap(rhs.getAddress()).getInt(); + return leftIp - rightIp; }); discoverHostsBtn.setText(discoverHostsStr + " (" + hosts.size() + ")"); diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/ScanHostsAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/ScanHostsAsyncTask.java index 499a394d..4fb07333 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/ScanHostsAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/ScanHostsAsyncTask.java @@ -199,7 +199,15 @@ protected final void onProgressUpdate(Void... params) { try { host = new Host(ip, macAddress, db); } catch (IOException e) { - host = new Host(ip, macAddress); + try { + host = new Host(ip, macAddress); + } catch (UnknownHostException ex) { + if (activity != null) { + activity.processFinish(e); + } + + return; + } } MainAsyncResponse activity1 = delegate.get(); diff --git a/app/src/main/java/com/aaronjwood/portauthority/network/Host.java b/app/src/main/java/com/aaronjwood/portauthority/network/Host.java index fdd59922..fec98553 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/network/Host.java +++ b/app/src/main/java/com/aaronjwood/portauthority/network/Host.java @@ -9,11 +9,14 @@ import java.io.IOException; import java.io.Serializable; +import java.net.InetAddress; +import java.net.UnknownHostException; public class Host implements Serializable { private String hostname; private String ip; + private byte[] address; private String mac; private String vendor; @@ -28,8 +31,9 @@ public Host(String ip, String mac, Database db) throws IOException { * @param ip * @param mac */ - public Host(String ip, String mac) { + public Host(String ip, String mac) throws UnknownHostException { this.ip = ip; + this.address = InetAddress.getByName(ip).getAddress(); this.mac = mac; } @@ -78,6 +82,15 @@ public String getIp() { return ip; } + /** + * Returns this host's address in byte representation. + * + * @return + */ + public byte[] getAddress() { + return this.address; + } + /** * Returns this host's MAC address * diff --git a/app/src/main/res/menu/host_menu.xml b/app/src/main/res/menu/host_menu.xml index 4495f927..0f9dbf31 100644 --- a/app/src/main/res/menu/host_menu.xml +++ b/app/src/main/res/menu/host_menu.xml @@ -5,6 +5,9 @@ android:id="@+id/sorting" android:title="@string/sort"> + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9eed9bdc..049f1f68 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -35,6 +35,7 @@ Scanning For Hosts %1$d hosts in your subnet Sort + By IP By hostname By vendor Copy hostname From 4e0b6ac3b0f47d770fb9105568c5c1a87a4073b2 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 14 Sep 2020 11:32:33 -0700 Subject: [PATCH 06/52] Clean up interface --- .../com/aaronjwood/portauthority/async/DownloadAsyncTask.java | 2 +- .../java/com/aaronjwood/portauthority/parser/OuiParser.java | 4 ++-- .../main/java/com/aaronjwood/portauthority/parser/Parser.java | 4 ++-- .../java/com/aaronjwood/portauthority/parser/PortParser.java | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java index 6eafde3d..938b544b 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java @@ -103,7 +103,7 @@ final void doInBackground(String service, Parser parser) { continue; } - if (parser.saveLine(db, data) == -1) { + if (parser.exportLine(db, data) == -1) { downProg.message = "Failed to insert data into the database. Please run this operation again"; publishProgress(downProg); diff --git a/app/src/main/java/com/aaronjwood/portauthority/parser/OuiParser.java b/app/src/main/java/com/aaronjwood/portauthority/parser/OuiParser.java index d88cda07..58de8332 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/parser/OuiParser.java +++ b/app/src/main/java/com/aaronjwood/portauthority/parser/OuiParser.java @@ -30,14 +30,14 @@ public String[] parseLine(String line) { } /** - * Saves the parsed line of OUI data to the database. + * Exports the parsed line of OUI data to the database. * * @param db * @param line * @return */ @Override - public long saveLine(Database db, String[] line) { + public long exportLine(Database db, String[] line) { return db.insertOui(line[0], line[1]); } diff --git a/app/src/main/java/com/aaronjwood/portauthority/parser/Parser.java b/app/src/main/java/com/aaronjwood/portauthority/parser/Parser.java index ca8da18b..ce82c318 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/parser/Parser.java +++ b/app/src/main/java/com/aaronjwood/portauthority/parser/Parser.java @@ -13,12 +13,12 @@ public interface Parser { String[] parseLine(String line); /** - * Saves a parsed line of data to the database. + * Exports a parsed line of data to the database. * * @param db * @param data * @return */ - long saveLine(Database db, String[] data); + long exportLine(Database db, String[] data); } diff --git a/app/src/main/java/com/aaronjwood/portauthority/parser/PortParser.java b/app/src/main/java/com/aaronjwood/portauthority/parser/PortParser.java index 4bd7b6a7..674d7600 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/parser/PortParser.java +++ b/app/src/main/java/com/aaronjwood/portauthority/parser/PortParser.java @@ -29,14 +29,14 @@ public String[] parseLine(String line) { } /** - * Saves the parsed line to the database. + * Exports the parsed line to the database. * * @param db * @param data * @return */ @Override - public long saveLine(Database db, String[] data) { + public long exportLine(Database db, String[] data) { return db.insertPort(data[0], data[1]); } } From 88e89fde5a6f636e5267979f652328c87499f494 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 14 Sep 2020 12:11:32 -0700 Subject: [PATCH 07/52] More accurate progress reporting when downloading databases --- .../aaronjwood/portauthority/async/DownloadAsyncTask.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java index 938b544b..7e20cf18 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java @@ -95,7 +95,9 @@ final void doInBackground(String service, Parser parser) { return; } - total += line.length(); // Lean on the fact that we're working with UTF-8 here. + // Lean on the fact that we're working with UTF-8 here. + // Also, make a rough estimation of how much we need to reduce this to account for the compressed data we've received. + total += line.length() / 3; downProg.progress = (int) (total * 100 / len); publishProgress(downProg); String[] data = parser.parseLine(line); @@ -106,7 +108,6 @@ final void doInBackground(String service, Parser parser) { if (parser.exportLine(db, data) == -1) { downProg.message = "Failed to insert data into the database. Please run this operation again"; publishProgress(downProg); - return; } } From 3ca24ddb9a50fd6c5f7097ab709709f749d76152 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 14 Sep 2020 12:14:37 -0700 Subject: [PATCH 08/52] Detect private and multicast MAC addresses --- .../aaronjwood/portauthority/db/Database.java | 8 +++---- .../portauthority/network/Host.java | 22 +++++++++++++++---- .../portauthority/parser/OuiParser.java | 1 - 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/db/Database.java b/app/src/main/java/com/aaronjwood/portauthority/db/Database.java index bc62c2ba..e7c4fec6 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/db/Database.java +++ b/app/src/main/java/com/aaronjwood/portauthority/db/Database.java @@ -170,14 +170,12 @@ public Database clearPorts() { public String selectVendor(String mac) { Cursor cursor = db.rawQuery("SELECT " + VENDOR_FIELD + " FROM " + OUI_TABLE + " WHERE " + MAC_FIELD + " = ?", new String[]{mac}); String vendor; - if (cursor.moveToFirst()) { - vendor = cursor.getString(cursor.getColumnIndex("vendor")); - } else { - vendor = "Vendor not in database"; + if (!cursor.moveToFirst()) { + return null; } + vendor = cursor.getString(cursor.getColumnIndex("vendor")); cursor.close(); - return vendor; } diff --git a/app/src/main/java/com/aaronjwood/portauthority/network/Host.java b/app/src/main/java/com/aaronjwood/portauthority/network/Host.java index fec98553..e2eacfc3 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/network/Host.java +++ b/app/src/main/java/com/aaronjwood/portauthority/network/Host.java @@ -58,7 +58,7 @@ public Host setHostname(String hostname) { return this; } - private Host setVendor(Database db) throws IOException { + private Host setVendor(Database db) { vendor = findMacVendor(mac, db); return this; @@ -126,9 +126,23 @@ public static void scanPorts(String ip, int startPort, int stopPort, int timeout * @throws IOException * @throws SQLiteException */ - public static String findMacVendor(String mac, Database db) throws IOException, SQLiteException { + public static String findMacVendor(String mac, Database db) throws SQLiteException { String prefix = mac.substring(0, 8); - return db.selectVendor(prefix); + String vendor = db.selectVendor(prefix); + if (vendor != null) { + return vendor; + } + + String notInDb = "Vendor not in database"; + char identifier = mac.charAt(1); + if ("26ae".indexOf(identifier) != -1) { + return notInDb + " (private address)"; + } + + if ("13579bdf".indexOf(identifier) != -1) { + return notInDb + " (multicast address)"; + } + + return notInDb; } - } diff --git a/app/src/main/java/com/aaronjwood/portauthority/parser/OuiParser.java b/app/src/main/java/com/aaronjwood/portauthority/parser/OuiParser.java index 58de8332..e6f673a9 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/parser/OuiParser.java +++ b/app/src/main/java/com/aaronjwood/portauthority/parser/OuiParser.java @@ -26,7 +26,6 @@ public String[] parseLine(String line) { } return new String[]{mac, vendor}; - } /** From 024e3ac2b8f515fa736b69093d048954b05f2891 Mon Sep 17 00:00:00 2001 From: Dante <7214961+dantecpu@users.noreply.github.com> Date: Tue, 15 Sep 2020 14:09:54 +0200 Subject: [PATCH 09/52] Create strings.xml --- app/src/main/res/values-it/strings.xml | 1 + 1 file changed, 1 insertion(+) create mode 100644 app/src/main/res/values-it/strings.xml diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml new file mode 100644 index 00000000..792d6005 --- /dev/null +++ b/app/src/main/res/values-it/strings.xml @@ -0,0 +1 @@ +# From 8865502f7598877b7bbe58ddf3a1a4a5c87af856 Mon Sep 17 00:00:00 2001 From: Dante <7214961+dantecpu@users.noreply.github.com> Date: Tue, 15 Sep 2020 14:38:22 +0200 Subject: [PATCH 10/52] Initial translation --- app/src/main/res/values-it/strings.xml | 59 +++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 792d6005..d6153692 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1 +1,58 @@ -# + + + + Port Authority + Impostazioni + MAC + Produttore + LAN IP + WAN IP + Recupero… + Segnale/Velocità + Scopri gli host + SSID + BSSID + Scansiona porte conosciute + Scansiona intervallo di porte + Reset intervallo di porte + Porte Aperte + Porta Iniziale + Porta Finale + Il WiFi non è abilitato + Nessuna connessione WiFi + URL/IP + ATTENZIONE + Nome del dominio + DNS Lookup + Sveglia + Risveglio %1$s… + Indirizzo IP + Recupero dei record DNS... + Inserisci un dominio e seleziona un tipo di record + Non sei connesso alla rete locale + Non sei connesso alla rete WiFi! + %1$ddBm/%2$dMbps + Scansione per hosts + %1$d hosts nella tua sottorete + Ordina + Per IP + Per nome host + Per produttore + Copia il nome host + Copia IP + Copia MAC + Impossibile ottenere l'indirizzo MAC del produttore + Impossibile aprire il database + Download dei dati + Impossibile ottenere il numero di hosts nella sottorete + Impossibile ottenere la potenza del segnale + Impossibile ottenere la velocità del collegamento + Impossibile ottenere SSID + Impossibile ottenere BSSID + Impossibile ottenere WifiManager per questo dispositivo + Nessuna interfaccia WiFi trovata + Tieni presente che l\'esecuzione di scansioni delle porte su server pubblici è normalmente considerata dannosa. + Inoltre, l\'esecuzione di questo tipo di scansioni sulla rete del tuo operatore invece che sulla tua connessione WiFi sarà più lenta e produrrà risultati imprecisi a causa del traffic shaping. + Il tuo operatore può anche considerare dannoso il traffico generato da questa scansione. + + From 9686e212cbb94bedd84e010bfe6edda0155d30c3 Mon Sep 17 00:00:00 2001 From: Dante <7214961+dantecpu@users.noreply.github.com> Date: Tue, 15 Sep 2020 14:49:55 +0200 Subject: [PATCH 11/52] Update strings.xml --- app/src/main/res/values-it/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index d6153692..82094692 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -49,7 +49,7 @@ Impossibile ottenere la velocità del collegamento Impossibile ottenere SSID Impossibile ottenere BSSID - Impossibile ottenere WifiManager per questo dispositivo + Impossibile ottenere i permessi per WifiManager su questo dispositivo Nessuna interfaccia WiFi trovata Tieni presente che l\'esecuzione di scansioni delle porte su server pubblici è normalmente considerata dannosa. Inoltre, l\'esecuzione di questo tipo di scansioni sulla rete del tuo operatore invece che sulla tua connessione WiFi sarà più lenta e produrrà risultati imprecisi a causa del traffic shaping. From 508e95bce53704bb96329bc43ec0145df4e34734 Mon Sep 17 00:00:00 2001 From: Dante <7214961+dantecpu@users.noreply.github.com> Date: Tue, 15 Sep 2020 14:52:39 +0200 Subject: [PATCH 12/52] Update strings.xml --- app/src/main/res/values-it/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 82094692..81ca4890 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -41,7 +41,7 @@ Copia il nome host Copia IP Copia MAC - Impossibile ottenere l'indirizzo MAC del produttore + Impossibile ottenere l\'indirizzo MAC del produttore Impossibile aprire il database Download dei dati Impossibile ottenere il numero di hosts nella sottorete From ddf28e48b091964c4ef366cba5f9740a96d76a0e Mon Sep 17 00:00:00 2001 From: Dante <7214961+dantecpu@users.noreply.github.com> Date: Tue, 15 Sep 2020 14:58:34 +0200 Subject: [PATCH 13/52] Update strings.xml --- app/src/main/res/values-it/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 81ca4890..aa2a6eac 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -10,8 +10,8 @@ Recupero… Segnale/Velocità Scopri gli host - SSID - BSSID + Nome della rete (SSID) + Indirizzo MAC (BSSID) Scansiona porte conosciute Scansiona intervallo di porte Reset intervallo di porte @@ -47,7 +47,7 @@ Impossibile ottenere il numero di hosts nella sottorete Impossibile ottenere la potenza del segnale Impossibile ottenere la velocità del collegamento - Impossibile ottenere SSID + Impossibile ottenere il nome della rete (SSID) Impossibile ottenere BSSID Impossibile ottenere i permessi per WifiManager su questo dispositivo Nessuna interfaccia WiFi trovata From 869b3fb32003c7e5cc3174a9676acbf897d01438 Mon Sep 17 00:00:00 2001 From: Dante <7214961+dantecpu@users.noreply.github.com> Date: Tue, 15 Sep 2020 14:59:45 +0200 Subject: [PATCH 14/52] Update strings.xml --- app/src/main/res/values-it/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index aa2a6eac..a704cf23 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -48,8 +48,8 @@ Impossibile ottenere la potenza del segnale Impossibile ottenere la velocità del collegamento Impossibile ottenere il nome della rete (SSID) - Impossibile ottenere BSSID - Impossibile ottenere i permessi per WifiManager su questo dispositivo + Impossibile ottenere l'indirizzo MAC (BSSID) + Impossibile ottenere i permessi per eseguire WifiManager su questo dispositivo Nessuna interfaccia WiFi trovata Tieni presente che l\'esecuzione di scansioni delle porte su server pubblici è normalmente considerata dannosa. Inoltre, l\'esecuzione di questo tipo di scansioni sulla rete del tuo operatore invece che sulla tua connessione WiFi sarà più lenta e produrrà risultati imprecisi a causa del traffic shaping. From 467e04527f39eb137a21d89f5c583ea88d6c690b Mon Sep 17 00:00:00 2001 From: Dante <7214961+dantecpu@users.noreply.github.com> Date: Tue, 15 Sep 2020 15:04:22 +0200 Subject: [PATCH 15/52] Update strings.xml --- app/src/main/res/values-it/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a704cf23..476d5824 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -48,7 +48,7 @@ Impossibile ottenere la potenza del segnale Impossibile ottenere la velocità del collegamento Impossibile ottenere il nome della rete (SSID) - Impossibile ottenere l'indirizzo MAC (BSSID) + Impossibile ottenere l\'indirizzo MAC (BSSID) Impossibile ottenere i permessi per eseguire WifiManager su questo dispositivo Nessuna interfaccia WiFi trovata Tieni presente che l\'esecuzione di scansioni delle porte su server pubblici è normalmente considerata dannosa. From 92dadf2c5ddb62413507560eb8007650026b1c7d Mon Sep 17 00:00:00 2001 From: Dante <7214961+dantecpu@users.noreply.github.com> Date: Tue, 15 Sep 2020 15:13:34 +0200 Subject: [PATCH 16/52] Update strings.xml --- app/src/main/res/values-it/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 476d5824..a8dabed7 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -3,15 +3,15 @@ Port Authority Impostazioni - MAC + Indirizzo MAC Dispositivo Produttore LAN IP WAN IP Recupero… Segnale/Velocità - Scopri gli host + Scopri gli hosts Nome della rete (SSID) - Indirizzo MAC (BSSID) + Indirizzo MAC WiFi (BSSID) Scansiona porte conosciute Scansiona intervallo di porte Reset intervallo di porte From 8c6d4d92992fbb861b5e12a9ae0c45792d28058c Mon Sep 17 00:00:00 2001 From: Dante <7214961+dantecpu@users.noreply.github.com> Date: Tue, 15 Sep 2020 15:16:27 +0200 Subject: [PATCH 17/52] Update strings.xml --- app/src/main/res/values-it/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a8dabed7..61350132 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -3,15 +3,15 @@ Port Authority Impostazioni - Indirizzo MAC Dispositivo + Indirizzo MAC del Dispositivo Produttore LAN IP WAN IP Recupero… Segnale/Velocità Scopri gli hosts - Nome della rete (SSID) - Indirizzo MAC WiFi (BSSID) + Nome access-point (SSID) + MAC access-point (BSSID) Scansiona porte conosciute Scansiona intervallo di porte Reset intervallo di porte From fed68f6a89fe91b6d496a86ae3346720f7f37ecb Mon Sep 17 00:00:00 2001 From: Dante <7214961+dantecpu@users.noreply.github.com> Date: Tue, 15 Sep 2020 15:24:53 +0200 Subject: [PATCH 18/52] Update strings.xml --- app/src/main/res/values-it/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 61350132..f43effb0 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -3,15 +3,15 @@ Port Authority Impostazioni - Indirizzo MAC del Dispositivo + MAC di questo dispositivo Produttore LAN IP WAN IP Recupero… Segnale/Velocità Scopri gli hosts - Nome access-point (SSID) - MAC access-point (BSSID) + Nome della rete (SSID) + MAC della rete (BSSID) Scansiona porte conosciute Scansiona intervallo di porte Reset intervallo di porte From 311b47265b1e690320f78406a0e9b2f5b024f37c Mon Sep 17 00:00:00 2001 From: Dante <7214961+dantecpu@users.noreply.github.com> Date: Tue, 15 Sep 2020 16:36:28 +0200 Subject: [PATCH 19/52] Create array.xml --- app/src/main/res/values-it/array.xml | 1 + 1 file changed, 1 insertion(+) create mode 100644 app/src/main/res/values-it/array.xml diff --git a/app/src/main/res/values-it/array.xml b/app/src/main/res/values-it/array.xml new file mode 100644 index 00000000..792d6005 --- /dev/null +++ b/app/src/main/res/values-it/array.xml @@ -0,0 +1 @@ +# From a27d7c913bd3e3a2bd84c529adbffab6e2024777 Mon Sep 17 00:00:00 2001 From: Dante <7214961+dantecpu@users.noreply.github.com> Date: Tue, 15 Sep 2020 16:39:34 +0200 Subject: [PATCH 20/52] Update array.xml --- app/src/main/res/values-it/array.xml | 72 +++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/array.xml b/app/src/main/res/values-it/array.xml index 792d6005..a9c23f2e 100644 --- a/app/src/main/res/values-it/array.xml +++ b/app/src/main/res/values-it/array.xml @@ -1 +1,71 @@ -# + + + + 500 + 450 + 400 + 350 + 300 + 250 + 200 + 150 + 100 + 50 + 25 + 10 + + + \u2601 Scan WAN Host + \u263c Wake Up Host + \u2194 DNS Lookup + + + \u2195 Update OUI Database + \u2195 Update Port Database + \u2699 Settings + + + Record Type + A + AAAA + AFSDB + APL + CAA + CDNSKEY + CDS + CERT + CNAME + CSYNC + DHCID + DLV + DNAME + DNSKEY + DS + HINFO + HIP + IPSECKEY + KEY + KX + LOC + MX + NAPTR + NS + NSEC + NSEC3 + NSEC3PARAM + OPENPGPKEY + PTR + RRSIG + RP + SIG + SOA + SRV + SSHFP + TA + TKEY + TLSA + TSIG + TXT + URI + + From d2f8d6e1e3e0883c3ce7c5beb17977cbc05c0dbf Mon Sep 17 00:00:00 2001 From: Dante <7214961+dantecpu@users.noreply.github.com> Date: Tue, 15 Sep 2020 16:52:14 +0200 Subject: [PATCH 21/52] Update array.xml --- app/src/main/res/values-it/array.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/res/values-it/array.xml b/app/src/main/res/values-it/array.xml index a9c23f2e..f06f354b 100644 --- a/app/src/main/res/values-it/array.xml +++ b/app/src/main/res/values-it/array.xml @@ -15,17 +15,17 @@ 10 - \u2601 Scan WAN Host - \u263c Wake Up Host + \u2601 Scansiona Host WAN + \u263c Sveglia Host \u2194 DNS Lookup - \u2195 Update OUI Database - \u2195 Update Port Database - \u2699 Settings + \u2195 Aggiorna il Database OUI + \u2195 Aggiorna il database delle Porte + \u2699 Impostazioni - Record Type + Tipologia di record A AAAA AFSDB From e09e6fcbb3000f6c53bc41da1396810d0f3252b8 Mon Sep 17 00:00:00 2001 From: Dante <7214961+dantecpu@users.noreply.github.com> Date: Tue, 15 Sep 2020 17:11:26 +0200 Subject: [PATCH 22/52] Update strings.xml --- app/src/main/res/values-it/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index f43effb0..489b9f0d 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -12,7 +12,7 @@ Scopri gli hosts Nome della rete (SSID) MAC della rete (BSSID) - Scansiona porte conosciute + Scansiona porte comuni Scansiona intervallo di porte Reset intervallo di porte Porte Aperte From 37e1381b1fc207d82c0a75b25792be4942fb685e Mon Sep 17 00:00:00 2001 From: Dante <7214961+dantecpu@users.noreply.github.com> Date: Tue, 15 Sep 2020 17:22:06 +0200 Subject: [PATCH 23/52] Update strings.xml --- app/src/main/res/values-it/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 489b9f0d..9d4da7ed 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -3,13 +3,13 @@ Port Authority Impostazioni - MAC di questo dispositivo + MAC Produttore LAN IP WAN IP Recupero… Segnale/Velocità - Scopri gli hosts + Scopri gli host Nome della rete (SSID) MAC della rete (BSSID) Scansiona porte comuni @@ -32,7 +32,7 @@ Non sei connesso alla rete locale Non sei connesso alla rete WiFi! %1$ddBm/%2$dMbps - Scansione per hosts + Scansione per host %1$d hosts nella tua sottorete Ordina Per IP From 8ede40c987a6627bdba04b3e29342a27ea74da09 Mon Sep 17 00:00:00 2001 From: Dante <7214961+dantecpu@users.noreply.github.com> Date: Tue, 15 Sep 2020 17:26:41 +0200 Subject: [PATCH 24/52] Update strings.xml --- app/src/main/res/values-it/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 9d4da7ed..4e4c86b9 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -50,9 +50,9 @@ Impossibile ottenere il nome della rete (SSID) Impossibile ottenere l\'indirizzo MAC (BSSID) Impossibile ottenere i permessi per eseguire WifiManager su questo dispositivo - Nessuna interfaccia WiFi trovata + Nessuna interfaccia di rete WiFi trovata Tieni presente che l\'esecuzione di scansioni delle porte su server pubblici è normalmente considerata dannosa. - Inoltre, l\'esecuzione di questo tipo di scansioni sulla rete del tuo operatore invece che sulla tua connessione WiFi sarà più lenta e produrrà risultati imprecisi a causa del traffic shaping. + Inoltre, l\'esecuzione di questo tipo di scansioni sulla rete mobile del tuo operatore invece che sulla tua connessione WiFi sarà più lenta e produrrà risultati imprecisi a causa del traffic shaping. Il tuo operatore può anche considerare dannoso il traffico generato da questa scansione. From a49eaeef4db68f3e0b249d9f02a4f9c39b7b00ce Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Thu, 1 Oct 2020 21:54:58 -0700 Subject: [PATCH 25/52] Update sonar config --- app/build.gradle | 1 + build.gradle | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 24c9b554..65dcaf69 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,6 +5,7 @@ sonarqube { properties { property "sonar.projectName", "Port Authority" property "sonar.projectKey", "portauthority" + property "sonar.host.url", "http://192.168.1.2:9000" property "sonar.projectVersion", "1.0" property "sonar.sourceEncoding", "UTF-8" property "sonar.sources", "." diff --git a/build.gradle b/build.gradle index a5edd8da..5381f7e8 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:4.0.1' - classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.4' + classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.0" } } From bf4676947740f357996e77754087d298d800f306 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Thu, 1 Oct 2020 21:59:12 -0700 Subject: [PATCH 26/52] Remove unreachable catch type --- .../com/aaronjwood/portauthority/activity/MainActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java index 39db7822..7e742f60 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java +++ b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java @@ -262,7 +262,7 @@ public void setupMac() { } catch (UnknownHostException | SocketException | Wireless.NoWifiManagerException e) { macAddress.setText(R.string.noWifiConnection); macVendor.setText(R.string.noWifiConnection); - } catch (IOException | SQLiteException | UnsupportedOperationException e) { + } catch (SQLiteException | UnsupportedOperationException e) { macVendor.setText(R.string.getMacVendorFailed); } catch (Wireless.NoWifiInterface e) { macAddress.setText(R.string.noWifiInterface); From 98718c50735237fa7e1fe3c8a745cf97d3cce90b Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Thu, 1 Oct 2020 22:38:16 -0700 Subject: [PATCH 27/52] Cleanup some sonar properties --- app/build.gradle | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 65dcaf69..d64b86c1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,12 +6,10 @@ sonarqube { property "sonar.projectName", "Port Authority" property "sonar.projectKey", "portauthority" property "sonar.host.url", "http://192.168.1.2:9000" - property "sonar.projectVersion", "1.0" property "sonar.sourceEncoding", "UTF-8" - property "sonar.sources", "." property "sonar.exclusions", "build/**,**/*.png,**/*.psd" property "sonar.import_unknown_files", true - property "sonar.android.lint.report", "./build/outputs/lint-results.xml" + property "sonar.android.lint.report", "./build/reports/lint-results.xml" } } From beee14101abcf196ba0b6b789d442770c7787121 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Fri, 20 Nov 2020 08:55:40 -0800 Subject: [PATCH 28/52] Bump gradle --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 5381f7e8..4ebf4c96 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:4.0.1' + classpath 'com.android.tools.build:gradle:4.1.0' classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.0" } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8ef3d3f6..fbf0068e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Jul 05 09:51:31 PDT 2020 +#Sat Nov 07 11:31:16 PST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip From b2ff00164c1987dd9af50faec792ddb403db518d Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Sun, 22 Nov 2020 18:00:15 -0800 Subject: [PATCH 29/52] Migrate to androidx --- app/build.gradle | 6 +++--- .../portauthority/activity/DnsActivity.java | 5 +++-- .../portauthority/activity/HostActivity.java | 3 ++- .../portauthority/activity/MainActivity.java | 12 ++++++------ .../portauthority/adapter/HostAdapter.java | 2 +- .../portauthority/utils/UserPreference.java | 6 +++--- app/src/main/res/layout-land/activity_main.xml | 4 ++-- app/src/main/res/layout/activity_main.xml | 4 ++-- app/src/main/res/layout/checkbox.xml | 2 +- build.gradle | 2 +- gradle.properties | 2 ++ 11 files changed, 26 insertions(+), 22 deletions(-) create mode 100644 gradle.properties diff --git a/app/build.gradle b/app/build.gradle index d64b86c1..23d18e42 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,12 +66,12 @@ android { } dependencies { - implementation 'com.android.support:support-v4:28.0.0' - implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'com.squareup.okhttp3:okhttp:3.12.9' // Anything past 3.12.x will break our Android 4 support! implementation 'jcifs:jcifs:1.3.17' implementation 'org.minidns:minidns-hla:0.3.2' debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.2' - testImplementation 'junit:junit:4.12' + testImplementation 'junit:junit:4.13' testImplementation 'org.mockito:mockito-core:1.10.19' } diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/DnsActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/DnsActivity.java index 8e9c649e..8640a12e 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/activity/DnsActivity.java +++ b/app/src/main/java/com/aaronjwood/portauthority/activity/DnsActivity.java @@ -1,8 +1,6 @@ package com.aaronjwood.portauthority.activity; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; @@ -10,6 +8,9 @@ import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; + import com.aaronjwood.portauthority.R; import com.aaronjwood.portauthority.async.DnsLookupAsyncTask; import com.aaronjwood.portauthority.response.DnsAsyncResponse; diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/HostActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/HostActivity.java index 784c3ddd..bb0e776d 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/activity/HostActivity.java +++ b/app/src/main/java/com/aaronjwood/portauthority/activity/HostActivity.java @@ -8,7 +8,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; -import android.support.v7.app.AppCompatActivity; import android.util.SparseArray; import android.view.View; import android.view.animation.AnimationUtils; @@ -20,6 +19,8 @@ import android.widget.NumberPicker; import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; + import com.aaronjwood.portauthority.R; import com.aaronjwood.portauthority.db.Database; import com.aaronjwood.portauthority.listener.ScanPortsListener; diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java index 7e742f60..628dfa9f 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java +++ b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java @@ -20,11 +20,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.Looper; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.support.v4.view.GravityCompat; -import android.support.v4.widget.DrawerLayout; -import android.support.v7.app.AppCompatActivity; import android.view.ContextMenu; import android.view.MenuInflater; import android.view.MenuItem; @@ -41,6 +36,12 @@ import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.core.view.GravityCompat; +import androidx.drawerlayout.widget.DrawerLayout; + import com.aaronjwood.portauthority.R; import com.aaronjwood.portauthority.adapter.HostAdapter; import com.aaronjwood.portauthority.async.DownloadAsyncTask; @@ -57,7 +58,6 @@ import com.aaronjwood.portauthority.utils.Errors; import com.aaronjwood.portauthority.utils.UserPreference; -import java.io.IOException; import java.net.SocketException; import java.net.UnknownHostException; import java.nio.ByteBuffer; diff --git a/app/src/main/java/com/aaronjwood/portauthority/adapter/HostAdapter.java b/app/src/main/java/com/aaronjwood/portauthority/adapter/HostAdapter.java index a0d48a20..ecf4e715 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/adapter/HostAdapter.java +++ b/app/src/main/java/com/aaronjwood/portauthority/adapter/HostAdapter.java @@ -1,7 +1,7 @@ package com.aaronjwood.portauthority.adapter; import android.content.Context; -import android.support.annotation.NonNull; +import androidx.annotation.NonNull; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; diff --git a/app/src/main/java/com/aaronjwood/portauthority/utils/UserPreference.java b/app/src/main/java/com/aaronjwood/portauthority/utils/UserPreference.java index b2fbca77..11bb890a 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/utils/UserPreference.java +++ b/app/src/main/java/com/aaronjwood/portauthority/utils/UserPreference.java @@ -3,9 +3,9 @@ import android.content.Context; import android.content.SharedPreferences; import android.preference.PreferenceManager; -import android.support.annotation.IntRange; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; +import androidx.annotation.IntRange; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; /** * Utility Class for getting certain user preferences diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml index 58463495..747cd512 100644 --- a/app/src/main/res/layout-land/activity_main.xml +++ b/app/src/main/res/layout-land/activity_main.xml @@ -1,4 +1,4 @@ - @@ -305,4 +305,4 @@ android:entries="@array/lowerDrawer" /> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index c83b7c13..6983e0c5 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,4 +1,4 @@ - @@ -227,4 +227,4 @@ - + diff --git a/app/src/main/res/layout/checkbox.xml b/app/src/main/res/layout/checkbox.xml index f7019caa..e4a2c9dd 100644 --- a/app/src/main/res/layout/checkbox.xml +++ b/app/src/main/res/layout/checkbox.xml @@ -1,6 +1,6 @@ - Date: Sun, 22 Nov 2020 18:00:45 -0800 Subject: [PATCH 30/52] Bump target SDK version --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 23d18e42..12a83dd2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,7 +20,7 @@ android { defaultConfig { minSdkVersion 14 - targetSdkVersion 29 + targetSdkVersion 30 versionCode 61 versionName "2.3.3" applicationId "com.aaronjwood.portauthority" From 5e0cb09bbcab43acc818592f789293fe40ac1e98 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Sun, 22 Nov 2020 18:09:30 -0800 Subject: [PATCH 31/52] Separate DB generation steps --- .../portauthority/activity/MainActivity.java | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java index 628dfa9f..5e96ad54 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java +++ b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java @@ -204,18 +204,35 @@ public void checkDatabase() { } final MainActivity activity = this; - new AlertDialog.Builder(activity, R.style.DialogTheme).setTitle("Generate Database") - .setMessage("Do you want to create the OUI and port databases? " + - "This will download the official OUI list from Wireshark and port list from IANA. " + - "Note that you won't be able to resolve any MAC vendors or identify services without this data. " + + new AlertDialog.Builder(activity, R.style.DialogTheme) + .setTitle("Generate OUI Database") + .setMessage("Do you want to create the OUI database? " + + "This will download the official OUI list from Wireshark. " + + "Note that you won't be able to resolve any MAC vendors without this data. " + "You can always perform this from the menu later.") .setPositiveButton(android.R.string.yes, (dialogInterface, i) -> { dialogInterface.dismiss(); ouiTask = new DownloadOuisAsyncTask(db, new OuiParser(), activity); - portTask = new DownloadPortDataAsyncTask(db, new PortParser(), activity); ouiTask.execute(); + }) + .setNegativeButton(android.R.string.no, (dialogInterface, i) -> dialogInterface.cancel()) + .setIcon(android.R.drawable.ic_dialog_alert).show() + .setCanceledOnTouchOutside(false); + + new AlertDialog.Builder(activity, R.style.DialogTheme) + .setTitle("Generate Port Database") + .setMessage("Do you want to create the port database? " + + "This will download the official port list from IANA. " + + "Note that you won't be able to identify services without this data. " + + "You can always perform this from the menu later.") + .setPositiveButton(android.R.string.yes, (dialogInterface, i) -> { + dialogInterface.dismiss(); + portTask = new DownloadPortDataAsyncTask(db, new PortParser(), activity); portTask.execute(); - }).setNegativeButton(android.R.string.no, (dialogInterface, i) -> dialogInterface.cancel()).setIcon(android.R.drawable.ic_dialog_alert).show().setCanceledOnTouchOutside(false); + }) + .setNegativeButton(android.R.string.no, (dialogInterface, i) -> dialogInterface.cancel()) + .setIcon(android.R.drawable.ic_dialog_alert).show() + .setCanceledOnTouchOutside(false); } /** From 53d4a459d399019746199c6298a3a3b650e3b7d2 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Sun, 22 Nov 2020 19:08:48 -0800 Subject: [PATCH 32/52] Use our HTTP lib for fetching DB data --- .../async/DownloadAsyncTask.java | 77 +++++++++---------- 1 file changed, 36 insertions(+), 41 deletions(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java index 7e20cf18..3cf9e9ec 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java @@ -13,10 +13,11 @@ import java.io.IOException; import java.io.InputStreamReader; import java.lang.ref.WeakReference; -import java.net.URL; import java.util.zip.GZIPInputStream; -import javax.net.ssl.HttpsURLConnection; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; class DownloadProgress { public String message; @@ -68,51 +69,49 @@ protected void onPreExecute() { */ final void doInBackground(String service, Parser parser) { BufferedReader in = null; - HttpsURLConnection connection = null; db.beginTransaction(); DownloadProgress downProg = new DownloadProgress(); try { - URL url = new URL(service); - connection = (HttpsURLConnection) url.openConnection(); - connection.setRequestProperty("Accept-Encoding", "gzip"); - connection.connect(); - if (connection.getResponseCode() != HttpsURLConnection.HTTP_OK) { - downProg.message = connection.getResponseCode() + " " + connection.getResponseMessage(); - publishProgress(downProg); - - return; - } + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder() + .url(service) + .addHeader("Accept-Encoding", "gzip") + .build(); + try (Response response = client.newCall(request).execute()) { + if (!response.isSuccessful()) { + downProg.message = response.code() + " " + response.body().string(); + publishProgress(downProg); - // Get the content length ourselves since connection.getContentLengthLong() requires a minimum API of 24+. - // The same is true for connection.getHeaderFieldLong(). - String contentLen = connection.getHeaderField("Content-Length"); - long len = Long.parseLong(contentLen); - in = new BufferedReader(new InputStreamReader(new GZIPInputStream(connection.getInputStream()), "UTF-8")); - String line; - long total = 0; - while ((line = in.readLine()) != null) { - if (isCancelled()) { return; } - // Lean on the fact that we're working with UTF-8 here. - // Also, make a rough estimation of how much we need to reduce this to account for the compressed data we've received. - total += line.length() / 3; - downProg.progress = (int) (total * 100 / len); - publishProgress(downProg); - String[] data = parser.parseLine(line); - if (data == null) { - continue; - } - - if (parser.exportLine(db, data) == -1) { - downProg.message = "Failed to insert data into the database. Please run this operation again"; + in = new BufferedReader(new InputStreamReader(new GZIPInputStream(response.body().byteStream()), "UTF-8")); + String line; + long total = 0; + while ((line = in.readLine()) != null) { + if (isCancelled()) { + return; + } + + // Lean on the fact that we're working with UTF-8 here. + // Also, make a rough estimation of how much we need to reduce this to account for the compressed data we've received. + total += line.length() / 3; + downProg.progress = (int) (total * 100 / response.body().contentLength()); publishProgress(downProg); - return; + String[] data = parser.parseLine(line); + if (data == null) { + continue; + } + + if (parser.exportLine(db, data) == -1) { + downProg.message = "Failed to insert data into the database. Please run this operation again"; + publishProgress(downProg); + return; + } } - } - db.setTransactionSuccessful(); + db.setTransactionSuccessful(); + } } catch (Exception e) { downProg.message = e.toString(); publishProgress(downProg); @@ -124,10 +123,6 @@ final void doInBackground(String service, Parser parser) { } } catch (IOException ignored) { } - - if (connection != null) { - connection.disconnect(); - } } } From 8b929f750c84a42aca36a24f50ac2556ad6a6dcd Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Sun, 22 Nov 2020 19:11:04 -0800 Subject: [PATCH 33/52] Bump compile SDK version --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 12a83dd2..ac2be059 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,7 +15,7 @@ sonarqube { android { viewBinding.enabled = true - compileSdkVersion 29 + compileSdkVersion 30 buildToolsVersion '28.0.3' defaultConfig { From aeb24f573d43ab0db60d83c5585c72bf9361e9f5 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Sun, 22 Nov 2020 21:08:53 -0800 Subject: [PATCH 34/52] Code cleanup --- .../portauthority/activity/HostActivity.java | 8 ---- .../portauthority/activity/MainActivity.java | 44 +++++++++---------- .../activity/WanHostActivity.java | 9 ---- .../async/DownloadOuisAsyncTask.java | 8 ---- .../async/DownloadPortDataAsyncTask.java | 8 ---- .../async/ScanHostsAsyncTask.java | 2 +- .../aaronjwood/portauthority/db/Database.java | 22 +++------- .../listener/ScanPortsListener.java | 4 +- .../portauthority/network/Host.java | 13 +++--- .../portauthority/network/Wireless.java | 2 +- .../runnable/ScanHostsRunnable.java | 15 +++---- .../runnable/ScanPortsRunnable.java | 8 ++-- 12 files changed, 44 insertions(+), 99 deletions(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/HostActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/HostActivity.java index bb0e776d..c37192ea 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/activity/HostActivity.java +++ b/app/src/main/java/com/aaronjwood/portauthority/activity/HostActivity.java @@ -97,14 +97,6 @@ public void onPause() { portRangeDialog = null; } - /** - * Clean up - */ - @Override - protected void onDestroy() { - super.onDestroy(); - } - /** * Save the state of the activity * diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java index 5e96ad54..e8cbf6e7 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java +++ b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java @@ -83,9 +83,9 @@ public final class MainActivity extends AppCompatActivity implements MainAsyncRe private Button discoverHostsBtn; private String discoverHostsStr; // Cache this so it's not looked up every time a host is found. private ProgressDialog scanProgressDialog; - private Handler signalHandler = new Handler(); + private final Handler signalHandler = new Handler(); private Handler scanHandler; - private IntentFilter intentFilter = new IntentFilter(); + private final IntentFilter intentFilter = new IntentFilter(); private HostAdapter hostAdapter; private List hosts = Collections.synchronizedList(new ArrayList<>()); private Database db; @@ -93,7 +93,7 @@ public final class MainActivity extends AppCompatActivity implements MainAsyncRe private DownloadAsyncTask portTask; private boolean sortAscending; - private BroadcastReceiver receiver = new BroadcastReceiver() { + private final BroadcastReceiver receiver = new BroadcastReceiver() { /** * Detect if a network connection has been lost or established @@ -589,31 +589,27 @@ public void onItemClick(AdapterView parent, View view, int position, long id) wolDialog.setContentView(R.layout.wake_on_lan); wolDialog.show(); Button wakeUp = wolDialog.findViewById(R.id.wolWake); - wakeUp.setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View v) { - try { - if (!wifi.isConnectedWifi()) { - Errors.showError(getApplicationContext(), getResources().getString(R.string.notConnectedLan)); - return; - } - } catch (Wireless.NoConnectivityManagerException e) { - Errors.showError(getApplicationContext(), getResources().getString(R.string.failedWifiManager)); - return; - } - - EditText ip = wolDialog.findViewById(R.id.wolIp); - EditText mac = wolDialog.findViewById(R.id.wolMac); - String ipVal = ip.getText().toString(); - String macVal = mac.getText().toString(); - if (ipVal.isEmpty() || macVal.isEmpty()) { + wakeUp.setOnClickListener(v -> { + try { + if (!wifi.isConnectedWifi()) { + Errors.showError(getApplicationContext(), getResources().getString(R.string.notConnectedLan)); return; } + } catch (Wireless.NoConnectivityManagerException e) { + Errors.showError(getApplicationContext(), getResources().getString(R.string.failedWifiManager)); + return; + } - new WolAsyncTask().execute(macVal, ipVal); - Toast.makeText(getApplicationContext(), String.format(getResources().getString(R.string.waking), ipVal), Toast.LENGTH_SHORT).show(); + EditText ip = wolDialog.findViewById(R.id.wolIp); + EditText mac = wolDialog.findViewById(R.id.wolMac); + String ipVal = ip.getText().toString(); + String macVal = mac.getText().toString(); + if (ipVal.isEmpty() || macVal.isEmpty()) { + return; } + + new WolAsyncTask().execute(macVal, ipVal); + Toast.makeText(getApplicationContext(), String.format(getResources().getString(R.string.waking), ipVal), Toast.LENGTH_SHORT).show(); }); break; case 2: diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/WanHostActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/WanHostActivity.java index 087756f9..a7257426 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/activity/WanHostActivity.java +++ b/app/src/main/java/com/aaronjwood/portauthority/activity/WanHostActivity.java @@ -35,15 +35,6 @@ protected void onCreate(Bundle savedInstanceState) { this.setupPortScan(); } - /** - * Clean up - */ - @Override - protected void onDestroy() { - super.onDestroy(); - UserPreference.saveLastUsedHostAddress(this, this.wanHost.getText().toString()); - } - /** * Event handler for when the well known port scan is initiated */ diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadOuisAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadOuisAsyncTask.java index 7db44806..11341067 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadOuisAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadOuisAsyncTask.java @@ -26,14 +26,6 @@ public DownloadOuisAsyncTask(Database database, Parser parser, MainAsyncResponse this.parser = parser; } - /** - * Sets up and displays the dialog. - */ - @Override - protected void onPreExecute() { - super.onPreExecute(); - } - /** * Downloads new OUI data. * diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadPortDataAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadPortDataAsyncTask.java index afe1fc36..1e0845c1 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadPortDataAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadPortDataAsyncTask.java @@ -23,14 +23,6 @@ public DownloadPortDataAsyncTask(Database database, Parser parser, MainAsyncResp this.parser = parser; } - /** - * Displays the progress dialog. - */ - @Override - protected void onPreExecute() { - super.onPreExecute(); - } - /** * Downloads new port data. * diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/ScanHostsAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/ScanHostsAsyncTask.java index 4fb07333..ddc38e71 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/ScanHostsAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/ScanHostsAsyncTask.java @@ -29,7 +29,7 @@ public class ScanHostsAsyncTask extends AsyncTask { private final WeakReference delegate; - private Database db; + private final Database db; private static final String ARP_TABLE = "/proc/net/arp"; private static final String IP_CMD = "ip neighbor"; private static final String NEIGHBOR_INCOMPLETE = "INCOMPLETE"; diff --git a/app/src/main/java/com/aaronjwood/portauthority/db/Database.java b/app/src/main/java/com/aaronjwood/portauthority/db/Database.java index e7c4fec6..93f8f29a 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/db/Database.java +++ b/app/src/main/java/com/aaronjwood/portauthority/db/Database.java @@ -22,7 +22,7 @@ public class Database extends SQLiteOpenHelper { private static final String CREATE_MAC_INDEX = "CREATE INDEX IF NOT EXISTS idx_ouis_mac ON " + OUI_TABLE + " (" + MAC_FIELD + ");"; private static Database singleton; - private SQLiteDatabase db; + private final SQLiteDatabase db; /** * Returns the single instance of this class or creates one if it doesn't already exist. @@ -51,31 +51,25 @@ private Database(Context context) { /** * Starts a transaction that allows for multiple readers and one writer. * - * @return */ - public Database beginTransaction() { + public void beginTransaction() { db.beginTransactionNonExclusive(); - return this; } /** * Finishes the transaction. * - * @return */ - public Database endTransaction() { + public void endTransaction() { db.endTransaction(); - return this; } /** * Marks the transaction as successful and commits the transaction. * - * @return */ - public Database setTransactionSuccessful() { + public void setTransactionSuccessful() { db.setTransactionSuccessful(); - return this; } /** @@ -142,23 +136,19 @@ public long insertPort(String port, String description) { /** * Wipes out all of the OUIs that are currently in the database. * - * @return */ - public Database clearOuis() { + public void clearOuis() { db.execSQL("DELETE FROM " + OUI_TABLE); db.execSQL("VACUUM"); - return this; } /** * Wipes out all of the ports that are currently in the database. * - * @return */ - public Database clearPorts() { + public void clearPorts() { db.execSQL("DELETE FROM " + PORT_TABLE); db.execSQL("VACUUM"); - return this; } /** diff --git a/app/src/main/java/com/aaronjwood/portauthority/listener/ScanPortsListener.java b/app/src/main/java/com/aaronjwood/portauthority/listener/ScanPortsListener.java index fd122a7c..fc3e261c 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/listener/ScanPortsListener.java +++ b/app/src/main/java/com/aaronjwood/portauthority/listener/ScanPortsListener.java @@ -7,8 +7,8 @@ public class ScanPortsListener implements View.OnClickListener { - private List ports; - private ArrayAdapter adapter; + private final List ports; + private final ArrayAdapter adapter; /** * New click listener for scanning ports diff --git a/app/src/main/java/com/aaronjwood/portauthority/network/Host.java b/app/src/main/java/com/aaronjwood/portauthority/network/Host.java index e2eacfc3..2cab22c2 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/network/Host.java +++ b/app/src/main/java/com/aaronjwood/portauthority/network/Host.java @@ -15,9 +15,9 @@ public class Host implements Serializable { private String hostname; - private String ip; - private byte[] address; - private String mac; + private final String ip; + private final byte[] address; + private final String mac; private String vendor; public Host(String ip, String mac, Database db) throws IOException { @@ -50,18 +50,15 @@ public String getHostname() { * Sets this host's hostname to the given value * * @param hostname Hostname for this host - * @return */ - public Host setHostname(String hostname) { + public void setHostname(String hostname) { this.hostname = hostname; - return this; } - private Host setVendor(Database db) { + private void setVendor(Database db) { vendor = findMacVendor(mac, db); - return this; } /** diff --git a/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java b/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java index 893ef3f3..d9da3fb6 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java +++ b/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java @@ -22,7 +22,7 @@ public class Wireless { - private Context context; + private final Context context; public static class NoWifiManagerException extends Exception { } diff --git a/app/src/main/java/com/aaronjwood/portauthority/runnable/ScanHostsRunnable.java b/app/src/main/java/com/aaronjwood/portauthority/runnable/ScanHostsRunnable.java index 6805dccc..20731905 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/runnable/ScanHostsRunnable.java +++ b/app/src/main/java/com/aaronjwood/portauthority/runnable/ScanHostsRunnable.java @@ -10,9 +10,9 @@ import java.net.Socket; public class ScanHostsRunnable implements Runnable { - private int start; - private int stop; - private int timeout; + private final int start; + private final int stop; + private final int timeout; private final WeakReference delegate; /** @@ -36,8 +36,7 @@ public ScanHostsRunnable(int start, int stop, int timeout, WeakReference delegate; /** From 8184c2a3772857bcf54e08374b44d8f41e39a231 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Sun, 22 Nov 2020 21:46:37 -0800 Subject: [PATCH 35/52] Cleanup --- .../portauthority/async/DnsLookupAsyncTask.java | 2 +- .../portauthority/async/DownloadAsyncTask.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/DnsLookupAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/DnsLookupAsyncTask.java index cde4d9c5..7d34b339 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/DnsLookupAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/DnsLookupAsyncTask.java @@ -59,7 +59,7 @@ protected String doInBackground(String... params) { StringBuilder out = new StringBuilder(); for (Data answer : answers) { - out.append(answer.toString()).append("\n\n"); + out.append(answer).append("\n\n"); } return out.toString(); diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java index 3cf9e9ec..d826e4ae 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java @@ -71,12 +71,12 @@ final void doInBackground(String service, Parser parser) { BufferedReader in = null; db.beginTransaction(); DownloadProgress downProg = new DownloadProgress(); + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder() + .url(service) + .addHeader("Accept-Encoding", "gzip") + .build(); try { - OkHttpClient client = new OkHttpClient(); - Request request = new Request.Builder() - .url(service) - .addHeader("Accept-Encoding", "gzip") - .build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) { downProg.message = response.code() + " " + response.body().string(); From 94cbd12aced901ed66f67df4e24635c193758231 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Sun, 22 Nov 2020 22:03:03 -0800 Subject: [PATCH 36/52] Bump build tools --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index ac2be059..551c4ba0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,7 +16,7 @@ sonarqube { android { viewBinding.enabled = true compileSdkVersion 30 - buildToolsVersion '28.0.3' + buildToolsVersion '29.0.3' defaultConfig { minSdkVersion 14 From 3a1329297881aff069cdbc80c92de386ac952d77 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 23 Nov 2020 10:27:16 -0800 Subject: [PATCH 37/52] Fix resource leak --- app/src/main/java/com/aaronjwood/portauthority/db/Database.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/aaronjwood/portauthority/db/Database.java b/app/src/main/java/com/aaronjwood/portauthority/db/Database.java index 93f8f29a..f9e56e3c 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/db/Database.java +++ b/app/src/main/java/com/aaronjwood/portauthority/db/Database.java @@ -161,6 +161,7 @@ public String selectVendor(String mac) { Cursor cursor = db.rawQuery("SELECT " + VENDOR_FIELD + " FROM " + OUI_TABLE + " WHERE " + MAC_FIELD + " = ?", new String[]{mac}); String vendor; if (!cursor.moveToFirst()) { + cursor.close(); return null; } From 27ab08edde06c81389112a602c48b841d6e8e57d Mon Sep 17 00:00:00 2001 From: Steve <51911097+uDEV2019@users.noreply.github.com> Date: Thu, 24 Dec 2020 17:21:13 +0100 Subject: [PATCH 38/52] Create array.xml german strings --- app/src/main/res/values-de/array.xml | 71 ++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 app/src/main/res/values-de/array.xml diff --git a/app/src/main/res/values-de/array.xml b/app/src/main/res/values-de/array.xml new file mode 100644 index 00000000..e0b7aff2 --- /dev/null +++ b/app/src/main/res/values-de/array.xml @@ -0,0 +1,71 @@ + + + + 500 + 450 + 400 + 350 + 300 + 250 + 200 + 150 + 100 + 50 + 25 + 10 + + + \u2601 WAN Host prüfen + \u263c Host aufwecken + \u2194 DNS-Suche + + + \u2195 OUI-Datenbank aktualisieren + \u2195 Port-Datenbank aktualisieren + \u2699 Einstellungen + + + Eintragstyp + A + AAAA + AFSDB + APL + CAA + CDNSKEY + CDS + CERT + CNAME + CSYNC + DHCID + DLV + DNAME + DNSKEY + DS + HINFO + HIP + IPSECKEY + KEY + KX + LOC + MX + NAPTR + NS + NSEC + NSEC3 + NSEC3PARAM + OPENPGPKEY + PTR + RRSIG + RP + SIG + SOA + SRV + SSHFP + TA + TKEY + TLSA + TSIG + TXT + URI + + From b090c3176ac3459c2557618e9f67e391aa5070ee Mon Sep 17 00:00:00 2001 From: Steve <51911097+uDEV2019@users.noreply.github.com> Date: Thu, 24 Dec 2020 17:35:16 +0100 Subject: [PATCH 39/52] Create strings.xxml german strings --- app/src/main/res/values-de/strings.xxml | 60 +++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 app/src/main/res/values-de/strings.xxml diff --git a/app/src/main/res/values-de/strings.xxml b/app/src/main/res/values-de/strings.xxml new file mode 100644 index 00000000..6fe1bf48 --- /dev/null +++ b/app/src/main/res/values-de/strings.xxml @@ -0,0 +1,60 @@ + + + + Port Authority + Einstellungen + MAC + Hersteller + LAN IP + WAN IP + Abrufen… + Signal/Geschwindigkeit + Hosts finden + SSID + BSSID + Bekannte Ports prüfen + Portbereich prüfen + Portbereich zurücksetzen + Offene Ports + Beginn-Port + Ende-Port + WiFi nicht aktiviert + Keine WiFi-Verbindung + URL/IP + WARNUNG + Domänename + DNS-Suche + Aufwecken + Wecke %1$s auf… + IP-Adresse + DNS-Einträge werden abgerufen… + Domäne eingeben und die Eintragstyp auswählen + Sie sind nicht mit dem lokalen Netzwerk verbunden! + Sie sind zu keinem WiFi-Netzwerk verbunden! + %1$ddBm/%2$dMbps + Auf Hosts prüfen + %1$d Hosts im Subnetz + Sortieren + nach IP + nach Hostname + nach Hersteller + Hostname kopieren + IP kopieren + MAC kopieren + Hersteller der MAC konnte nicht ermittelt werden + Datenbank konnte nicht geöffnet werden + Daten werden heruntergeladen + Anzahl der Host im Subnetz konnte nicht ermittelt werden + Signalstärke konnte nicht ermittelt werden + Verbindungsgeschwindigkeit konnte nicht ermittelt werden + SSID konnte nicht ermittelt werden + BSSID konnte nicht ermittelt werden + WifiManager konnte für dieses Gerät nicht ermittelt werden + Keine WiFi-Schnittstelle gefunden + + Bitte nehmen Sie zur Kenntnis, dass Portscans gegen öffentliche Server normalerweise als bösartig angesehen wird. + Weiterhin können Scans dieser Art über das Netzwerk Ihres Mobilfunkanbieters langsamer sein als mit Ihrer eigenen WiFi-Verbindung und manchmal kann es auf Grund Ausprägung des Datenverkehrs zu unplausiblen Ergebnissen kommen. + Ihr Mobilfunkanbieter kann den Datenverkehr der durch diesen Scan verursacht wird, ebenfalls als bösartig einstufen. + + + From 5613d0d2d6aa140aca55ae8933be14ecc91bc2d7 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Thu, 24 Dec 2020 15:59:43 -0800 Subject: [PATCH 40/52] Fix filename --- app/src/main/res/values-de/{strings.xxml => strings.xml} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/src/main/res/values-de/{strings.xxml => strings.xml} (100%) diff --git a/app/src/main/res/values-de/strings.xxml b/app/src/main/res/values-de/strings.xml similarity index 100% rename from app/src/main/res/values-de/strings.xxml rename to app/src/main/res/values-de/strings.xml From 3e85e3e294d8c8c5b6474536ca3e68fb76a3b1f2 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 4 Jan 2021 21:38:07 -0800 Subject: [PATCH 41/52] Update tooling --- .travis.yml | 7 ++----- app/build.gradle | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0ac44119..8e37b63d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,17 +3,14 @@ jdk: - oraclejdk8 android: components: - - tools - - build-tools-28.0.3 - - android-29 - - extra-android-m2repository + - build-tools-30.0.3 + - android-30 env: global: - 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 551c4ba0..3a271738 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -16,7 +16,7 @@ sonarqube { android { viewBinding.enabled = true compileSdkVersion 30 - buildToolsVersion '29.0.3' + buildToolsVersion '30.0.3' defaultConfig { minSdkVersion 14 From c36d24ec7b054688043ab749754dbc156427f027 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 4 Jan 2021 21:46:54 -0800 Subject: [PATCH 42/52] Add missing license acceptance --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 8e37b63d..4be7cf06 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,6 +11,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-30" - 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: From e183a41fe285174a6b4c64c693c066638e39497c Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 4 Jan 2021 22:07:16 -0800 Subject: [PATCH 43/52] Allow for more localization --- .../portauthority/activity/MainActivity.java | 33 ++++++++----------- app/src/main/res/values/strings.xml | 8 ++++- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java index e8cbf6e7..c3704e28 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java +++ b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java @@ -36,6 +36,7 @@ import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; @@ -161,15 +162,13 @@ private void ssidAccess(Context context) { } Activity activity = this; - String title = "Android 8-9 SSID Access"; - String message = "Android 8-9 requires coarse location permissions to read the SSID. " + - "If this is not something you're comfortable with just deny the request and go without the functionality."; + String version = "8-9"; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - title = "Android 10+ SSID Access"; - message = "Android 10+ requires fine location permissions to read the SSID. " + - "If this is not something you're comfortable with just deny the request and go without the functionality."; + version = "10+"; } + String title = getResources().getString(R.string.ssidAccessTitle, version); + String message = getResources().getString(R.string.ssidAccessTitle, version); new AlertDialog.Builder(activity, R.style.DialogTheme).setTitle(title) .setMessage(message) .setPositiveButton(android.R.string.ok, (dialogInterface, i) -> { @@ -205,11 +204,8 @@ public void checkDatabase() { final MainActivity activity = this; new AlertDialog.Builder(activity, R.style.DialogTheme) - .setTitle("Generate OUI Database") - .setMessage("Do you want to create the OUI database? " + - "This will download the official OUI list from Wireshark. " + - "Note that you won't be able to resolve any MAC vendors without this data. " + - "You can always perform this from the menu later.") + .setTitle(R.string.ouiDbTitle) + .setMessage(R.string.ouiDbMsg) .setPositiveButton(android.R.string.yes, (dialogInterface, i) -> { dialogInterface.dismiss(); ouiTask = new DownloadOuisAsyncTask(db, new OuiParser(), activity); @@ -220,11 +216,8 @@ public void checkDatabase() { .setCanceledOnTouchOutside(false); new AlertDialog.Builder(activity, R.style.DialogTheme) - .setTitle("Generate Port Database") - .setMessage("Do you want to create the port database? " + - "This will download the official port list from IANA. " + - "Note that you won't be able to identify services without this data. " + - "You can always perform this from the menu later.") + .setTitle(R.string.portDbTitle) + .setMessage(R.string.portDbMsg) .setPositiveButton(android.R.string.yes, (dialogInterface, i) -> { dialogInterface.dismiss(); portTask = new DownloadPortDataAsyncTask(db, new PortParser(), activity); @@ -252,7 +245,8 @@ private void setupHostsAdapter() { hostList.setAdapter(hostAdapter); if (!hosts.isEmpty()) { - discoverHostsBtn.setText(discoverHostsStr + " (" + hosts.size() + ")"); + discoverHostsBtn.setText(discoverHostsStr); + discoverHostsBtn.append(" (" + hosts.size() + ")"); } } @@ -729,7 +723,7 @@ public void onResume() { * @param savedState Data to save */ @Override - public void onSaveInstanceState(Bundle savedState) { + public void onSaveInstanceState(@NonNull Bundle savedState) { super.onSaveInstanceState(savedState); ListAdapter adapter = hostList.getAdapter(); @@ -779,7 +773,8 @@ public void processFinish(final Host h, final AtomicInteger i) { return leftIp - rightIp; }); - discoverHostsBtn.setText(discoverHostsStr + " (" + hosts.size() + ")"); + discoverHostsBtn.setText(discoverHostsStr); + discoverHostsBtn.append(" (" + hosts.size() + ")"); if (i.decrementAndGet() == 0) { discoverHostsBtn.setAlpha(1); discoverHostsBtn.setEnabled(true); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 049f1f68..01389880 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -56,5 +56,11 @@ Additionally, running these kinds of scans over your carrier\'s network instead of your own WiFi connection will be slower and will sometimes produce inaccurate results due to traffic shaping. Your carrier can also consider traffic generated by this scan to be malicious. - + Android %1$s SSID Access + Android %1$s requires coarse location permissions to read the SSID. If this is not something you\'re comfortable with just deny the request and go without the functionality. + Android %1$s requires coarse location permissions to read the SSID. If this is not something you\'re comfortable with just deny the request and go without the functionality. + Generate OUI Database + Do you want to create the OUI database? This will download the official OUI list from Wireshark. Note that you won\'t be able to resolve any MAC vendors without this data. You can always perform this from the menu later. + Generate Port Database + "Do you want to create the port database? This will download the official port list from IANA. Note that you won't be able to identify services without this data. You can always perform this from the menu later. \ No newline at end of file From 35077783bf0ac1b8502484e9520d6022b6349f3c Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 4 Jan 2021 22:35:02 -0800 Subject: [PATCH 44/52] More localization and prevent a few null pointer crashes --- .../portauthority/activity/DnsActivity.java | 2 +- .../portauthority/activity/HostActivity.java | 3 ++- .../activity/LanHostActivity.java | 4 +++- .../async/DownloadAsyncTask.java | 23 +++++++++++++++---- app/src/main/res/values/strings.xml | 1 + 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/DnsActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/DnsActivity.java index 8640a12e..63fb6468 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/activity/DnsActivity.java +++ b/app/src/main/java/com/aaronjwood/portauthority/activity/DnsActivity.java @@ -42,7 +42,7 @@ protected void onCreate(Bundle savedInstanceState) { } @Override - protected void onSaveInstanceState(Bundle savedState) { + protected void onSaveInstanceState(@NonNull Bundle savedState) { super.onSaveInstanceState(savedState); String recordData = dnsAnswer.getText().toString(); diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/HostActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/HostActivity.java index c37192ea..7a1b9567 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/activity/HostActivity.java +++ b/app/src/main/java/com/aaronjwood/portauthority/activity/HostActivity.java @@ -19,6 +19,7 @@ import android.widget.NumberPicker; import android.widget.Toast; +import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import com.aaronjwood.portauthority.R; @@ -103,7 +104,7 @@ public void onPause() { * @param savedState Data to save */ @Override - public void onSaveInstanceState(Bundle savedState) { + public void onSaveInstanceState(@NonNull Bundle savedState) { super.onSaveInstanceState(savedState); String[] savedList = ports.toArray(new String[0]); diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/LanHostActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/LanHostActivity.java index d2219d9e..c08d288c 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/activity/LanHostActivity.java +++ b/app/src/main/java/com/aaronjwood/portauthority/activity/LanHostActivity.java @@ -9,6 +9,8 @@ import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; + import com.aaronjwood.portauthority.R; import com.aaronjwood.portauthority.listener.ScanPortsListener; import com.aaronjwood.portauthority.network.Host; @@ -61,7 +63,7 @@ protected void onCreate(Bundle savedInstanceState) { * @param savedState Data to save */ @Override - public void onSaveInstanceState(Bundle savedState) { + public void onSaveInstanceState(@NonNull Bundle savedState) { super.onSaveInstanceState(savedState); savedState.putSerializable("host", host); diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java index d826e4ae..305d1ad2 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/DownloadAsyncTask.java @@ -18,6 +18,7 @@ import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; +import okhttp3.ResponseBody; class DownloadProgress { public String message; @@ -31,6 +32,7 @@ public String toString() { public abstract class DownloadAsyncTask extends AsyncTask { private ProgressDialog dialog; + private String failedDbInsert; protected Database db; protected WeakReference delegate; @@ -48,6 +50,8 @@ protected void onPreExecute() { } Context ctx = (Context) activity; + this.failedDbInsert = ctx.getResources().getString(R.string.failedDbInsert); + dialog = new ProgressDialog(ctx, R.style.DialogTheme); dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); dialog.setMessage(ctx.getResources().getString(R.string.downloadingData)); @@ -78,14 +82,19 @@ final void doInBackground(String service, Parser parser) { .build(); try { try (Response response = client.newCall(request).execute()) { + ResponseBody body = response.body(); + if (body == null) { + downProg.message = String.valueOf(response.code()); + return; + } + if (!response.isSuccessful()) { - downProg.message = response.code() + " " + response.body().string(); + downProg.message = body.string(); publishProgress(downProg); - return; } - in = new BufferedReader(new InputStreamReader(new GZIPInputStream(response.body().byteStream()), "UTF-8")); + in = new BufferedReader(new InputStreamReader(new GZIPInputStream(body.byteStream()), "UTF-8")); String line; long total = 0; while ((line = in.readLine()) != null) { @@ -96,7 +105,7 @@ final void doInBackground(String service, Parser parser) { // Lean on the fact that we're working with UTF-8 here. // Also, make a rough estimation of how much we need to reduce this to account for the compressed data we've received. total += line.length() / 3; - downProg.progress = (int) (total * 100 / response.body().contentLength()); + downProg.progress = (int) (total * 100 / body.contentLength()); publishProgress(downProg); String[] data = parser.parseLine(line); if (data == null) { @@ -104,7 +113,11 @@ final void doInBackground(String service, Parser parser) { } if (parser.exportLine(db, data) == -1) { - downProg.message = "Failed to insert data into the database. Please run this operation again"; + MainAsyncResponse activity = delegate.get(); + if (activity != null) { + dialog.dismiss(); + } + downProg.message = this.failedDbInsert; publishProgress(downProg); return; } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 01389880..829647ed 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -63,4 +63,5 @@ Do you want to create the OUI database? This will download the official OUI list from Wireshark. Note that you won\'t be able to resolve any MAC vendors without this data. You can always perform this from the menu later. Generate Port Database "Do you want to create the port database? This will download the official port list from IANA. Note that you won't be able to identify services without this data. You can always perform this from the menu later. + Failed to insert data into the database. Please run this operation again \ No newline at end of file From ba17c7087d8892da924ba8b2d6b9334b91e6209c Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 4 Jan 2021 22:38:23 -0800 Subject: [PATCH 45/52] Prevent another null pointer crash --- .../com/aaronjwood/portauthority/async/WanIpAsyncTask.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 fc59960e..0f69731c 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/WanIpAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/WanIpAsyncTask.java @@ -11,6 +11,7 @@ import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; +import okhttp3.ResponseBody; public class WanIpAsyncTask extends AsyncTask { @@ -41,11 +42,12 @@ protected String doInBackground(Void... params) { Request request = new Request.Builder().url(EXTERNAL_IP_SERVICE).build(); try (Response response = httpClient.newCall(request).execute()) { - if (!response.isSuccessful()) { + ResponseBody body = response.body(); + if (!response.isSuccessful() || body == null) { return error; } - return response.body().string().trim(); + return body.string().trim(); } catch (IOException e) { return error; } From f606a7544d63d436a693b4d5e30346b30be87261 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 4 Jan 2021 22:45:46 -0800 Subject: [PATCH 46/52] Use threadpool executors everywhere to avoid async tasks blocking each other --- .../portauthority/activity/DnsActivity.java | 3 ++- .../portauthority/activity/MainActivity.java | 13 +++++++------ .../com/aaronjwood/portauthority/network/Host.java | 5 +++-- .../aaronjwood/portauthority/network/Wireless.java | 3 ++- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/DnsActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/DnsActivity.java index 63fb6468..3c2895ad 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/activity/DnsActivity.java +++ b/app/src/main/java/com/aaronjwood/portauthority/activity/DnsActivity.java @@ -1,5 +1,6 @@ package com.aaronjwood.portauthority.activity; +import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.widget.Button; @@ -93,7 +94,7 @@ public void onClick(View view) { if (recordType != null) { String recordName = recordType.toString(); Toast.makeText(getApplicationContext(), getResources().getString(R.string.startingDnsLookup), Toast.LENGTH_SHORT).show(); - new DnsLookupAsyncTask(DnsActivity.this).execute(domain, recordName); + new DnsLookupAsyncTask(DnsActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, domain, recordName); } } }); diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java index c3704e28..dd543619 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java +++ b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java @@ -16,6 +16,7 @@ import android.database.sqlite.SQLiteException; import android.net.NetworkInfo; import android.net.wifi.WifiManager; +import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Handler; @@ -209,7 +210,7 @@ public void checkDatabase() { .setPositiveButton(android.R.string.yes, (dialogInterface, i) -> { dialogInterface.dismiss(); ouiTask = new DownloadOuisAsyncTask(db, new OuiParser(), activity); - ouiTask.execute(); + ouiTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); }) .setNegativeButton(android.R.string.no, (dialogInterface, i) -> dialogInterface.cancel()) .setIcon(android.R.drawable.ic_dialog_alert).show() @@ -221,7 +222,7 @@ public void checkDatabase() { .setPositiveButton(android.R.string.yes, (dialogInterface, i) -> { dialogInterface.dismiss(); portTask = new DownloadPortDataAsyncTask(db, new PortParser(), activity); - portTask.execute(); + portTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); }) .setNegativeButton(android.R.string.no, (dialogInterface, i) -> dialogInterface.cancel()) .setIcon(android.R.drawable.ic_dialog_alert).show() @@ -334,7 +335,7 @@ public void onClick(View v) { try { Integer ip = wifi.getInternalWifiIpAddress(Integer.class); - new ScanHostsAsyncTask(MainActivity.this, db).execute(ip, wifi.getInternalWifiSubnet(), UserPreference.getHostSocketTimeout(context)); + new ScanHostsAsyncTask(MainActivity.this, db).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ip, wifi.getInternalWifiSubnet(), UserPreference.getHostSocketTimeout(context)); discoverHostsBtn.setAlpha(.3f); discoverHostsBtn.setEnabled(false); } catch (UnknownHostException | Wireless.NoWifiManagerException e) { @@ -602,7 +603,7 @@ public void onItemClick(AdapterView parent, View view, int position, long id) return; } - new WolAsyncTask().execute(macVal, ipVal); + new WolAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, macVal, ipVal); Toast.makeText(getApplicationContext(), String.format(getResources().getString(R.string.waking), ipVal), Toast.LENGTH_SHORT).show(); }); break; @@ -628,11 +629,11 @@ public void onItemClick(AdapterView parent, View view, int position, long id) switch (position) { case 0: ouiTask = new DownloadOuisAsyncTask(db, new OuiParser(), MainActivity.this); - ouiTask.execute(); + ouiTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); break; case 1: portTask = new DownloadPortDataAsyncTask(db, new PortParser(), MainActivity.this); - portTask.execute(); + portTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); break; case 2: startActivity(new Intent(MainActivity.this, PreferencesActivity.class)); diff --git a/app/src/main/java/com/aaronjwood/portauthority/network/Host.java b/app/src/main/java/com/aaronjwood/portauthority/network/Host.java index 2cab22c2..cd078411 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/network/Host.java +++ b/app/src/main/java/com/aaronjwood/portauthority/network/Host.java @@ -1,6 +1,7 @@ package com.aaronjwood.portauthority.network; import android.database.sqlite.SQLiteException; +import android.os.AsyncTask; import com.aaronjwood.portauthority.async.ScanPortsAsyncTask; import com.aaronjwood.portauthority.async.WolAsyncTask; @@ -98,7 +99,7 @@ public String getMac() { } public void wakeOnLan() { - new WolAsyncTask().execute(mac, ip); + new WolAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, mac, ip); } /** @@ -111,7 +112,7 @@ public void wakeOnLan() { * @param delegate Delegate to be called when the port scan has finished */ public static void scanPorts(String ip, int startPort, int stopPort, int timeout, HostAsyncResponse delegate) { - new ScanPortsAsyncTask(delegate).execute(ip, startPort, stopPort, timeout); + new ScanPortsAsyncTask(delegate).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, ip, startPort, stopPort, timeout); } /** diff --git a/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java b/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java index d9da3fb6..677f93eb 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java +++ b/app/src/main/java/com/aaronjwood/portauthority/network/Wireless.java @@ -6,6 +6,7 @@ import android.net.NetworkInfo; import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; +import android.os.AsyncTask; import com.aaronjwood.portauthority.async.WanIpAsyncTask; import com.aaronjwood.portauthority.response.MainAsyncResponse; @@ -227,7 +228,7 @@ public static String getInternalMobileIpAddress() { * @param delegate Called when the external IP address has been fetched */ public void getExternalIpAddress(MainAsyncResponse delegate) { - new WanIpAsyncTask(delegate).execute(); + new WanIpAsyncTask(delegate).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } /** From 31471d4425d78c4d05e27b59a4332fef07b63cf8 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 4 Jan 2021 22:56:17 -0800 Subject: [PATCH 47/52] Support more localization --- .../portauthority/async/DnsLookupAsyncTask.java | 13 +++++++++---- app/src/main/res/values/strings.xml | 4 ++++ 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/DnsLookupAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/DnsLookupAsyncTask.java index 7d34b339..3eeef5cf 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/DnsLookupAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/DnsLookupAsyncTask.java @@ -1,7 +1,9 @@ package com.aaronjwood.portauthority.async; +import android.content.Context; import android.os.AsyncTask; +import com.aaronjwood.portauthority.R; import com.aaronjwood.portauthority.response.DnsAsyncResponse; import org.minidns.hla.ResolverApi; @@ -37,24 +39,27 @@ protected String doInBackground(String... params) { String domain = params[0]; String recordType = params[1]; ResolverResult result; + DnsAsyncResponse activity = delegate.get(); + Context ctx = (Context) activity; + try { Class dataClass = Record.TYPE.valueOf(recordType).getDataClass(); if (dataClass == null) { - return "Record type " + recordType + " not supported"; + return ctx.getResources().getString(R.string.unsuppRecType, recordType); } result = ResolverApi.INSTANCE.resolve(domain, dataClass); } catch (IOException e) { - return "Error performing lookup on type " + recordType + ": " + e.getMessage(); + return ctx.getResources().getString(R.string.lookupErr, recordType, e.getMessage()); } if (!result.wasSuccessful()) { - return "Lookup of type " + recordType + " failed with response code " + result.getResponseCode(); + return ctx.getResources().getString(R.string.lookupTypeFail, recordType, result.getResponseCode()); } Set answers = result.getAnswers(); if (answers.isEmpty()) { - return "No records found for type " + recordType; + return ctx.getResources().getString(R.string.noRecords, recordType); } StringBuilder out = new StringBuilder(); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 829647ed..13671d3d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -64,4 +64,8 @@ Generate Port Database "Do you want to create the port database? This will download the official port list from IANA. Note that you won't be able to identify services without this data. You can always perform this from the menu later. Failed to insert data into the database. Please run this operation again + Record type %1$s not supported + Error performing lookup on type %1$s: %2$s + Lookup of type %1$s failed with response code %2$s + No records found for type %1$s \ No newline at end of file From 75616d6ce42715e2f2816c9557ff8ff8d2fb5def Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 4 Jan 2021 23:08:49 -0800 Subject: [PATCH 48/52] Support more localization --- .../portauthority/async/ScanHostsAsyncTask.java | 14 +++++++++----- app/src/main/res/values/strings.xml | 4 ++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/async/ScanHostsAsyncTask.java b/app/src/main/java/com/aaronjwood/portauthority/async/ScanHostsAsyncTask.java index ddc38e71..a99a78f7 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/ScanHostsAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/ScanHostsAsyncTask.java @@ -1,9 +1,11 @@ package com.aaronjwood.portauthority.async; +import android.content.Context; import android.os.AsyncTask; import android.os.Build; import android.util.Pair; +import com.aaronjwood.portauthority.R; import com.aaronjwood.portauthority.db.Database; import com.aaronjwood.portauthority.network.Host; import com.aaronjwood.portauthority.response.MainAsyncResponse; @@ -59,6 +61,7 @@ protected Void doInBackground(Integer... params) { int cidr = params[1]; int timeout = params[2]; MainAsyncResponse activity = delegate.get(); + Context ctx = (Context) activity; // Android 10+ doesn't let us access the ARP table. // Do an early check to see if we can get what we need from the system. @@ -68,26 +71,26 @@ protected Void doInBackground(Integer... params) { Process ipProc = Runtime.getRuntime().exec(IP_CMD); ipProc.waitFor(); if (ipProc.exitValue() != 0) { - activity.processFinish(new IOException("Unable to access ARP entries")); + activity.processFinish(new IOException(ctx.getResources().getString(R.string.errAccessArp))); activity.processFinish(true); return null; } } catch (IOException | InterruptedException e) { - activity.processFinish(new IOException("Unable to parse ARP entries")); + activity.processFinish(new IOException(ctx.getResources().getString(R.string.errParseArp))); activity.processFinish(true); } } else { File file = new File(ARP_TABLE); if (!file.exists()) { - activity.processFinish(new FileNotFoundException("Unable to find ARP table")); + activity.processFinish(new FileNotFoundException(ctx.getResources().getString(R.string.errFindArp))); activity.processFinish(true); return null; } if (!file.canRead()) { - activity.processFinish(new IOException("Unable to read ARP table")); + activity.processFinish(new IOException(ctx.getResources().getString(R.string.errReadArp))); activity.processFinish(true); } } @@ -139,13 +142,14 @@ protected final void onProgressUpdate(Void... params) { ExecutorService executor = Executors.newCachedThreadPool(); final AtomicInteger numHosts = new AtomicInteger(0); List> pairs = new ArrayList<>(); + Context ctx = (Context) activity; try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { Process ipProc = Runtime.getRuntime().exec(IP_CMD); ipProc.waitFor(); if (ipProc.exitValue() != 0) { - throw new Exception("Unable to access ARP entries"); + throw new Exception(ctx.getResources().getString(R.string.errAccessArp)); } reader = new BufferedReader(new InputStreamReader(ipProc.getInputStream(), "UTF-8")); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 13671d3d..aaa82aea 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -68,4 +68,8 @@ Error performing lookup on type %1$s: %2$s Lookup of type %1$s failed with response code %2$s No records found for type %1$s + Unable to access ARP entries + Unable to parse ARP entries + Unable to find ARP table + Unable to read ARP table \ No newline at end of file From e340145a40d54b4d74c5d402f4a76d65d8d22a20 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Mon, 4 Jan 2021 23:10:35 -0800 Subject: [PATCH 49/52] Support more localization --- .../aaronjwood/portauthority/async/WanIpAsyncTask.java | 10 +++++++--- app/src/main/res/values/strings.xml | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) 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 0f69731c..e4b2d0ae 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/async/WanIpAsyncTask.java +++ b/app/src/main/java/com/aaronjwood/portauthority/async/WanIpAsyncTask.java @@ -1,8 +1,11 @@ package com.aaronjwood.portauthority.async; import android.annotation.SuppressLint; +import android.content.Context; import android.os.AsyncTask; +import com.aaronjwood.portauthority.R; +import com.aaronjwood.portauthority.response.HostAsyncResponse; import com.aaronjwood.portauthority.response.MainAsyncResponse; import java.io.IOException; @@ -37,19 +40,20 @@ public WanIpAsyncTask(MainAsyncResponse delegate) { @Override @SuppressLint("NewApi") protected String doInBackground(Void... params) { - String error = "Couldn't get your external IP"; + MainAsyncResponse activity = delegate.get(); + Context ctx = (Context) activity; OkHttpClient httpClient = new OkHttpClient(); Request request = new Request.Builder().url(EXTERNAL_IP_SERVICE).build(); try (Response response = httpClient.newCall(request).execute()) { ResponseBody body = response.body(); if (!response.isSuccessful() || body == null) { - return error; + return ctx.getResources().getString(R.string.errExternIp); } return body.string().trim(); } catch (IOException e) { - return error; + return ctx.getResources().getString(R.string.errExternIp); } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index aaa82aea..9fe19163 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -72,4 +72,5 @@ Unable to parse ARP entries Unable to find ARP table Unable to read ARP table + Couldn\'t get your external IP \ No newline at end of file From 9c83b62108e58d76c4a11223592c4543ca1a4e71 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Wed, 6 Jan 2021 13:47:57 -0800 Subject: [PATCH 50/52] Fix SSID message, and remove the usage of append to the button as it causes a crash in Android --- .../aaronjwood/portauthority/activity/MainActivity.java | 9 ++++----- app/src/main/res/layout/wake_on_lan.xml | 6 ++++-- app/src/main/res/values/strings.xml | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java index dd543619..df5ba3d4 100644 --- a/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java +++ b/app/src/main/java/com/aaronjwood/portauthority/activity/MainActivity.java @@ -164,12 +164,13 @@ private void ssidAccess(Context context) { Activity activity = this; String version = "8-9"; + String message = getResources().getString(R.string.ssidCoarseMsg, version); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { version = "10+"; + message = getResources().getString(R.string.ssidFineMsg, version); } String title = getResources().getString(R.string.ssidAccessTitle, version); - String message = getResources().getString(R.string.ssidAccessTitle, version); new AlertDialog.Builder(activity, R.style.DialogTheme).setTitle(title) .setMessage(message) .setPositiveButton(android.R.string.ok, (dialogInterface, i) -> { @@ -246,8 +247,7 @@ private void setupHostsAdapter() { hostList.setAdapter(hostAdapter); if (!hosts.isEmpty()) { - discoverHostsBtn.setText(discoverHostsStr); - discoverHostsBtn.append(" (" + hosts.size() + ")"); + discoverHostsBtn.setText(discoverHostsStr + " (" + hosts.size() + ")"); } } @@ -774,8 +774,7 @@ public void processFinish(final Host h, final AtomicInteger i) { return leftIp - rightIp; }); - discoverHostsBtn.setText(discoverHostsStr); - discoverHostsBtn.append(" (" + hosts.size() + ")"); + discoverHostsBtn.setText(discoverHostsStr + " (" + hosts.size() + ")"); if (i.decrementAndGet() == 0) { discoverHostsBtn.setAlpha(1); discoverHostsBtn.setEnabled(true); diff --git a/app/src/main/res/layout/wake_on_lan.xml b/app/src/main/res/layout/wake_on_lan.xml index 72ae0926..9aa11c81 100644 --- a/app/src/main/res/layout/wake_on_lan.xml +++ b/app/src/main/res/layout/wake_on_lan.xml @@ -17,7 +17,8 @@ android:layout_height="match_parent" android:gravity="center" android:hint="@string/ipAddress" - android:paddingBottom="5dp" /> + android:paddingBottom="5dp" + android:inputType="text" /> + android:paddingBottom="5dp" + android:inputType="text" />