From a96e508ffb37de8ac14567403f560685b9ee471b Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Fri, 2 Sep 2022 03:04:30 -0400 Subject: [PATCH] Use try-with-resources --- app/build.gradle | 7 ++++ .../binding/crypto/AndroidCryptoProvider.java | 34 ++++++++----------- .../binding/video/MediaCodecHelper.java | 5 +-- .../computers/ComputerDatabaseManager.java | 34 +++++++++---------- .../computers/ComputerManagerService.java | 12 ++----- .../limelight/computers/IdentityManager.java | 27 ++++----------- .../computers/LegacyDatabaseReader.java | 33 ++++++++---------- .../computers/LegacyDatabaseReader2.java | 33 ++++++++---------- .../grid/assets/DiskAssetLoader.java | 12 ++----- .../com/limelight/nvstream/http/NvHTTP.java | 7 ++-- .../nvstream/wol/WakeOnLanSender.java | 27 +++++++-------- 11 files changed, 97 insertions(+), 134 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ab1852dc..fbcb52fe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -48,6 +48,12 @@ android { } } + compileOptions { + encoding "UTF-8" + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + lint { disable 'MissingTranslation' lintConfig file('lint.xml') @@ -129,6 +135,7 @@ dependencies { implementation 'org.jcodec:jcodec:0.2.3' implementation 'com.squareup.okhttp3:okhttp:3.12.13' implementation 'com.squareup.okio:okio:1.17.5' + // 3.5.8 requires minSdk 19, uses StandardCharsets.UTF_8 internally implementation 'org.jmdns:jmdns:3.5.7' implementation 'com.github.cgutman:ShieldControllerExtensions:1.0' } diff --git a/app/src/main/java/com/limelight/binding/crypto/AndroidCryptoProvider.java b/app/src/main/java/com/limelight/binding/crypto/AndroidCryptoProvider.java index 35af2d87..0bf98dee5 100644 --- a/app/src/main/java/com/limelight/binding/crypto/AndroidCryptoProvider.java +++ b/app/src/main/java/com/limelight/binding/crypto/AndroidCryptoProvider.java @@ -67,14 +67,12 @@ public class AndroidCryptoProvider implements LimelightCryptoProvider { return null; } - try { - FileInputStream fin = new FileInputStream(f); + try (final FileInputStream fin = new FileInputStream(f)) { byte[] fileData = new byte[(int) f.length()]; if (fin.read(fileData) != f.length()) { // Failed to read fileData = null; } - fin.close(); return fileData; } catch (IOException e) { return null; @@ -160,32 +158,28 @@ public class AndroidCryptoProvider implements LimelightCryptoProvider { } private void saveCertKeyPair() { - try { - FileOutputStream certOut = new FileOutputStream(certFile); - FileOutputStream keyOut = new FileOutputStream(keyFile); - + try (final FileOutputStream certOut = new FileOutputStream(certFile); + final FileOutputStream keyOut = new FileOutputStream(keyFile) + ) { // Write the certificate in OpenSSL PEM format (important for the server) StringWriter strWriter = new StringWriter(); - JcaPEMWriter pemWriter = new JcaPEMWriter(strWriter); - pemWriter.writeObject(cert); - pemWriter.close(); + try (final JcaPEMWriter pemWriter = new JcaPEMWriter(strWriter)) { + pemWriter.writeObject(cert); + } // Line endings MUST be UNIX for the PC to accept the cert properly - OutputStreamWriter certWriter = new OutputStreamWriter(certOut); - String pemStr = strWriter.getBuffer().toString(); - for (int i = 0; i < pemStr.length(); i++) { - char c = pemStr.charAt(i); - if (c != '\r') - certWriter.append(c); + try (final OutputStreamWriter certWriter = new OutputStreamWriter(certOut)) { + String pemStr = strWriter.getBuffer().toString(); + for (int i = 0; i < pemStr.length(); i++) { + char c = pemStr.charAt(i); + if (c != '\r') + certWriter.append(c); + } } - certWriter.close(); // Write the private out in PKCS8 format keyOut.write(key.getEncoded()); - certOut.close(); - keyOut.close(); - LimeLog.info("Saved generated key pair to disk"); } catch (IOException e) { // This isn't good because it means we'll have diff --git a/app/src/main/java/com/limelight/binding/video/MediaCodecHelper.java b/app/src/main/java/com/limelight/binding/video/MediaCodecHelper.java index d3ca998f..d9ed897f 100644 --- a/app/src/main/java/com/limelight/binding/video/MediaCodecHelper.java +++ b/app/src/main/java/com/limelight/binding/video/MediaCodecHelper.java @@ -887,8 +887,7 @@ public class MediaCodecHelper { public static String readCpuinfo() throws Exception { StringBuilder cpuInfo = new StringBuilder(); - BufferedReader br = new BufferedReader(new FileReader(new File("/proc/cpuinfo"))); - try { + try (final BufferedReader br = new BufferedReader(new FileReader(new File("/proc/cpuinfo")))) { for (;;) { int ch = br.read(); if (ch == -1) @@ -897,8 +896,6 @@ public class MediaCodecHelper { } return cpuInfo.toString(); - } finally { - br.close(); } } diff --git a/app/src/main/java/com/limelight/computers/ComputerDatabaseManager.java b/app/src/main/java/com/limelight/computers/ComputerDatabaseManager.java index ab33c9e7..67c3ae02 100644 --- a/app/src/main/java/com/limelight/computers/ComputerDatabaseManager.java +++ b/app/src/main/java/com/limelight/computers/ComputerDatabaseManager.java @@ -136,28 +136,26 @@ public class ComputerDatabaseManager { } public List getAllComputers() { - Cursor c = computerDb.rawQuery("SELECT * FROM "+COMPUTER_TABLE_NAME, null); - LinkedList computerList = new LinkedList<>(); - while (c.moveToNext()) { - computerList.add(getComputerFromCursor(c)); + try (final Cursor c = computerDb.rawQuery("SELECT * FROM "+COMPUTER_TABLE_NAME, null)) { + LinkedList computerList = new LinkedList<>(); + while (c.moveToNext()) { + computerList.add(getComputerFromCursor(c)); + } + return computerList; } - - c.close(); - - return computerList; } public ComputerDetails getComputerByUUID(String uuid) { - Cursor c = computerDb.query(COMPUTER_TABLE_NAME, null, COMPUTER_UUID_COLUMN_NAME+"=?", new String[]{ uuid }, null, null, null); - if (!c.moveToFirst()) { - // No matching computer - c.close(); - return null; + try (final Cursor c = computerDb.query( + COMPUTER_TABLE_NAME, null, COMPUTER_UUID_COLUMN_NAME+"=?", + new String[]{ uuid }, null, null, null) + ) { + if (!c.moveToFirst()) { + // No matching computer + return null; + } + + return getComputerFromCursor(c); } - - ComputerDetails details = getComputerFromCursor(c); - c.close(); - - return details; } } diff --git a/app/src/main/java/com/limelight/computers/ComputerManagerService.java b/app/src/main/java/com/limelight/computers/ComputerManagerService.java index f2663b20..f298b744 100644 --- a/app/src/main/java/com/limelight/computers/ComputerManagerService.java +++ b/app/src/main/java/com/limelight/computers/ComputerManagerService.java @@ -849,18 +849,12 @@ public class ComputerManagerService extends Service { if (!appList.isEmpty() && (!list.isEmpty() || emptyAppListResponses >= EMPTY_LIST_THRESHOLD)) { // Open the cache file - OutputStream cacheOut = null; - try { - cacheOut = CacheHelper.openCacheFileForOutput(getCacheDir(), "applist", computer.uuid); + try (final OutputStream cacheOut = CacheHelper.openCacheFileForOutput( + getCacheDir(), "applist", computer.uuid) + ) { CacheHelper.writeStringToOutputStream(cacheOut, appList); } catch (IOException e) { e.printStackTrace(); - } finally { - try { - if (cacheOut != null) { - cacheOut.close(); - } - } catch (IOException ignored) {} } // Reset empty count if it wasn't empty this time diff --git a/app/src/main/java/com/limelight/computers/IdentityManager.java b/app/src/main/java/com/limelight/computers/IdentityManager.java index e6251d4f..d0befc8b 100644 --- a/app/src/main/java/com/limelight/computers/IdentityManager.java +++ b/app/src/main/java/com/limelight/computers/IdentityManager.java @@ -33,12 +33,11 @@ public class IdentityManager { private static String loadUniqueId(Context c) { // 2 Hex digits per byte char[] uid = new char[UID_SIZE_IN_BYTES * 2]; - InputStreamReader reader = null; LimeLog.info("Reading UID from disk"); - try { - reader = new InputStreamReader(c.openFileInput(UNIQUE_ID_FILE_NAME)); - if (reader.read(uid) != UID_SIZE_IN_BYTES * 2) - { + try (final InputStreamReader reader = + new InputStreamReader(c.openFileInput(UNIQUE_ID_FILE_NAME)) + ) { + if (reader.read(uid) != UID_SIZE_IN_BYTES * 2) { LimeLog.severe("UID file data is truncated"); return null; } @@ -50,12 +49,6 @@ public class IdentityManager { LimeLog.severe("Error while reading UID file"); e.printStackTrace(); return null; - } finally { - if (reader != null) { - try { - reader.close(); - } catch (IOException ignored) {} - } } } @@ -64,20 +57,14 @@ public class IdentityManager { LimeLog.info("Generating new UID"); String uidStr = String.format((Locale)null, "%016x", new Random().nextLong()); - OutputStreamWriter writer = null; - try { - writer = new OutputStreamWriter(c.openFileOutput(UNIQUE_ID_FILE_NAME, 0)); + try (final OutputStreamWriter writer = + new OutputStreamWriter(c.openFileOutput(UNIQUE_ID_FILE_NAME, 0)) + ) { writer.write(uidStr); LimeLog.info("UID written to disk"); } catch (IOException e) { LimeLog.severe("Error while writing UID file"); e.printStackTrace(); - } finally { - if (writer != null) { - try { - writer.close(); - } catch (IOException ignored) {} - } } // We can return a UID even if I/O fails diff --git a/app/src/main/java/com/limelight/computers/LegacyDatabaseReader.java b/app/src/main/java/com/limelight/computers/LegacyDatabaseReader.java index 7c8793c6..86e9db8c 100644 --- a/app/src/main/java/com/limelight/computers/LegacyDatabaseReader.java +++ b/app/src/main/java/com/limelight/computers/LegacyDatabaseReader.java @@ -68,37 +68,34 @@ public class LegacyDatabaseReader { } private static List getAllComputers(SQLiteDatabase db) { - Cursor c = db.rawQuery("SELECT * FROM " + COMPUTER_TABLE_NAME, null); - LinkedList computerList = new LinkedList<>(); - while (c.moveToNext()) { - ComputerDetails details = getComputerFromCursor(c); + try (final Cursor c = db.rawQuery("SELECT * FROM " + COMPUTER_TABLE_NAME, null)) { + LinkedList computerList = new LinkedList<>(); + while (c.moveToNext()) { + ComputerDetails details = getComputerFromCursor(c); - // If a critical field is corrupt or missing, skip the database entry - if (details.uuid == null) { - continue; + // If a critical field is corrupt or missing, skip the database entry + if (details.uuid == null) { + continue; + } + + computerList.add(details); } - computerList.add(details); + return computerList; } - - c.close(); - - return computerList; } public static List migrateAllComputers(Context c) { - SQLiteDatabase computerDb = null; - try { + try (final SQLiteDatabase computerDb = SQLiteDatabase.openDatabase( + c.getDatabasePath(COMPUTER_DB_NAME).getPath(), + null, SQLiteDatabase.OPEN_READONLY) + ) { // Open the existing database - computerDb = SQLiteDatabase.openDatabase(c.getDatabasePath(COMPUTER_DB_NAME).getPath(), null, SQLiteDatabase.OPEN_READONLY); return getAllComputers(computerDb); } catch (SQLiteException e) { return new LinkedList(); } finally { // Close and delete the old DB - if (computerDb != null) { - computerDb.close(); - } c.deleteDatabase(COMPUTER_DB_NAME); } } diff --git a/app/src/main/java/com/limelight/computers/LegacyDatabaseReader2.java b/app/src/main/java/com/limelight/computers/LegacyDatabaseReader2.java index 2a8d1e7c..8f461b28 100644 --- a/app/src/main/java/com/limelight/computers/LegacyDatabaseReader2.java +++ b/app/src/main/java/com/limelight/computers/LegacyDatabaseReader2.java @@ -49,37 +49,34 @@ public class LegacyDatabaseReader2 { } public static List getAllComputers(SQLiteDatabase computerDb) { - Cursor c = computerDb.rawQuery("SELECT * FROM "+COMPUTER_TABLE_NAME, null); - LinkedList computerList = new LinkedList<>(); - while (c.moveToNext()) { - ComputerDetails details = getComputerFromCursor(c); + try (final Cursor c = computerDb.rawQuery("SELECT * FROM "+COMPUTER_TABLE_NAME, null)) { + LinkedList computerList = new LinkedList<>(); + while (c.moveToNext()) { + ComputerDetails details = getComputerFromCursor(c); - // If a critical field is corrupt or missing, skip the database entry - if (details.uuid == null) { - continue; + // If a critical field is corrupt or missing, skip the database entry + if (details.uuid == null) { + continue; + } + + computerList.add(details); } - computerList.add(details); + return computerList; } - - c.close(); - - return computerList; } public static List migrateAllComputers(Context c) { - SQLiteDatabase computerDb = null; - try { + try (final SQLiteDatabase computerDb = SQLiteDatabase.openDatabase( + c.getDatabasePath(COMPUTER_DB_NAME).getPath(), + null, SQLiteDatabase.OPEN_READONLY) + ) { // Open the existing database - computerDb = SQLiteDatabase.openDatabase(c.getDatabasePath(COMPUTER_DB_NAME).getPath(), null, SQLiteDatabase.OPEN_READONLY); return getAllComputers(computerDb); } catch (SQLiteException e) { return new LinkedList(); } finally { // Close and delete the old DB - if (computerDb != null) { - computerDb.close(); - } c.deleteDatabase(COMPUTER_DB_NAME); } } diff --git a/app/src/main/java/com/limelight/grid/assets/DiskAssetLoader.java b/app/src/main/java/com/limelight/grid/assets/DiskAssetLoader.java index 2e0c73c3..8cd63bdf 100644 --- a/app/src/main/java/com/limelight/grid/assets/DiskAssetLoader.java +++ b/app/src/main/java/com/limelight/grid/assets/DiskAssetLoader.java @@ -154,21 +154,15 @@ public class DiskAssetLoader { } public void populateCacheWithStream(CachedAppAssetLoader.LoaderTuple tuple, InputStream input) { - OutputStream out = null; boolean success = false; - try { - out = CacheHelper.openCacheFileForOutput(cacheDir, "boxart", tuple.computer.uuid, tuple.app.getAppId() + ".png"); + try (final OutputStream out = CacheHelper.openCacheFileForOutput( + cacheDir, "boxart", tuple.computer.uuid, tuple.app.getAppId() + ".png") + ) { CacheHelper.writeInputStreamToOutputStream(input, out, MAX_ASSET_SIZE); success = true; } catch (IOException e) { e.printStackTrace(); } finally { - if (out != null) { - try { - out.close(); - } catch (IOException ignored) {} - } - if (!success) { LimeLog.warning("Unable to populate cache with tuple: "+tuple); CacheHelper.deleteCacheFile(cacheDir, "boxart", tuple.computer.uuid, tuple.app.getAppId() + ".png"); diff --git a/app/src/main/java/com/limelight/nvstream/http/NvHTTP.java b/app/src/main/java/com/limelight/nvstream/http/NvHTTP.java index da87d572..e0e41241 100644 --- a/app/src/main/java/com/limelight/nvstream/http/NvHTTP.java +++ b/app/src/main/java/com/limelight/nvstream/http/NvHTTP.java @@ -627,10 +627,9 @@ public class NvHTTP { return getAppListByReader(new StringReader(getAppListRaw())); } else { - ResponseBody resp = openHttpConnection(baseUrlHttps, "applist", true); - LinkedList appList = getAppListByReader(new InputStreamReader(resp.byteStream())); - resp.close(); - return appList; + try (final ResponseBody resp = openHttpConnection(baseUrlHttps, "applist", true)) { + return getAppListByReader(new InputStreamReader(resp.byteStream())); + } } } diff --git a/app/src/main/java/com/limelight/nvstream/wol/WakeOnLanSender.java b/app/src/main/java/com/limelight/nvstream/wol/WakeOnLanSender.java index 70b09704..afecede5 100644 --- a/app/src/main/java/com/limelight/nvstream/wol/WakeOnLanSender.java +++ b/app/src/main/java/com/limelight/nvstream/wol/WakeOnLanSender.java @@ -17,12 +17,11 @@ public class WakeOnLanSender { }; public static void sendWolPacket(ComputerDetails computer) throws IOException { - DatagramSocket sock = new DatagramSocket(0); byte[] payload = createWolPayload(computer); IOException lastException = null; boolean sentWolPacket = false; - try { + try (final DatagramSocket sock = new DatagramSocket(0)) { // Try all resolved remote and local addresses and IPv4 broadcast address. // The broadcast address is required to avoid stale ARP cache entries // making the sleeping machine unreachable. @@ -52,8 +51,6 @@ public class WakeOnLanSender { lastException = e; } } - } finally { - sock.close(); } // Propagate the DNS resolution exception if we didn't @@ -65,18 +62,20 @@ public class WakeOnLanSender { private static byte[] macStringToBytes(String macAddress) { byte[] macBytes = new byte[6]; - @SuppressWarnings("resource") - Scanner scan = new Scanner(macAddress).useDelimiter(":"); - for (int i = 0; i < macBytes.length && scan.hasNext(); i++) { - try { - macBytes[i] = (byte) Integer.parseInt(scan.next(), 16); - } catch (NumberFormatException e) { - LimeLog.warning("Malformed MAC address: "+macAddress+" (index: "+i+")"); - break; + + try (@SuppressWarnings("resource") + final Scanner scan = new Scanner(macAddress).useDelimiter(":") + ) { + for (int i = 0; i < macBytes.length && scan.hasNext(); i++) { + try { + macBytes[i] = (byte) Integer.parseInt(scan.next(), 16); + } catch (NumberFormatException e) { + LimeLog.warning("Malformed MAC address: " + macAddress + " (index: " + i + ")"); + break; + } } + return macBytes; } - scan.close(); - return macBytes; } private static byte[] createWolPayload(ComputerDetails computer) {