From 2079512cdf140ac7eab095c969b214475c95a363 Mon Sep 17 00:00:00 2001 From: TranceLove Date: Sat, 17 May 2025 13:56:35 +0800 Subject: [PATCH] Fix Codacy complaints --- app/src/main/AndroidManifest.xml | 9 +-- .../ui/activities/MainActivity.java | 27 +++---- .../filemanager/ui/views/drawer/Drawer.java | 2 +- .../com/amaze/filemanager/utils/OTGUtil.kt | 6 +- .../filesystem/usb/SingletonUsbOtgTest.java | 4 +- .../filesystem/cloud/CloudStreamServer.java | 1 + .../filesystem/smbstreamer/StreamServer.java | 1 + .../filesystem/usb/SingletonUsbOtg.kt | 81 ++++++++++--------- .../filesystem/usb/UsbOtgRepresentation.kt | 58 +++++-------- .../cloud/CloudStreamSourceTest.java | 28 +++---- .../smbstreamer/StreamSourceTest.java | 28 +++---- .../shadows/jcifs/smb/ShadowSmbFile.java | 1 + 12 files changed, 116 insertions(+), 130 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index cfdbbb8ee..48864170d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -148,8 +148,7 @@ android:configChanges="orientation|screenSize|uiMode" android:label="@string/setting" android:name=".ui.activities.PreferencesActivity" - android:theme="@style/appCompatBlack" - android:exported="false"> + android:theme="@style/appCompatBlack"> @@ -161,8 +160,7 @@ android:label="@string/textreader" android:name=".ui.activities.texteditor.TextEditorActivity" android:configChanges="uiMode" - android:theme="@style/appCompatBlack" - android:exported="true"> + android:theme="@style/appCompatBlack"> @@ -295,8 +293,7 @@ android:exported="true" android:icon="@drawable/ic_ftp_dark" android:label="@string/ftp" - android:permission="android.permission.BIND_QUICK_SETTINGS_TILE" - android:exported="false"> + android:permission="android.permission.BIND_QUICK_SETTINGS_TILE"> diff --git a/app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java b/app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java index 2e835df77..f7e292b67 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java +++ b/app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java @@ -884,10 +884,8 @@ public class MainActivity extends PermissionsActivity File usb = getUsbDrive(); if (usb != null && !rv.contains(usb.getPath())) rv.add(usb.getPath()); - if (SDK_INT >= KITKAT) { - if (SingletonUsbOtg.getInstance().isDeviceConnected()) { - rv.add(OTGUtil.PREFIX_OTG + "/"); - } + if (SDK_INT >= KITKAT && SingletonUsbOtg.INSTANCE.isDeviceConnected()) { + rv.add(OTGUtil.PREFIX_OTG + "/"); } // Assign a label and icon to each directory @@ -1383,28 +1381,27 @@ public class MainActivity extends PermissionsActivity List connectedDevices = OTGUtil.getMassStorageDevicesConnected(this); if (!connectedDevices.isEmpty()) { - if (SingletonUsbOtg.getInstance().getUsbOtgRoot() != null - && OTGUtil.isUsbUriAccessible(this)) { + if (SingletonUsbOtg.INSTANCE.getUsbOtgRoot() != null && OTGUtil.isUsbUriAccessible(this)) { for (UsbOtgRepresentation device : connectedDevices) { - if (SingletonUsbOtg.getInstance().checkIfRootIsFromDevice(device)) { + if (SingletonUsbOtg.INSTANCE.checkIfRootIsFromDevice(device)) { isInformationUpdated = true; break; } } if (!isInformationUpdated) { - SingletonUsbOtg.getInstance().resetUsbOtgRoot(); + SingletonUsbOtg.INSTANCE.resetUsbOtgRoot(); } } if (!isInformationUpdated) { - SingletonUsbOtg.getInstance().setConnectedDevice(connectedDevices.get(0)); + SingletonUsbOtg.INSTANCE.setConnectedDevice(connectedDevices.get(0)); isInformationUpdated = true; } } if (!isInformationUpdated) { - SingletonUsbOtg.getInstance().resetUsbOtgRoot(); + SingletonUsbOtg.INSTANCE.resetUsbOtgRoot(); drawer.refreshDrawer(); } @@ -1424,12 +1421,12 @@ public class MainActivity extends PermissionsActivity List connectedDevices = OTGUtil.getMassStorageDevicesConnected(MainActivity.this); if (!connectedDevices.isEmpty()) { - SingletonUsbOtg.getInstance().resetUsbOtgRoot(); - SingletonUsbOtg.getInstance().setConnectedDevice(connectedDevices.get(0)); + SingletonUsbOtg.INSTANCE.resetUsbOtgRoot(); + SingletonUsbOtg.INSTANCE.setConnectedDevice(connectedDevices.get(0)); drawer.refreshDrawer(); } } else if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) { - SingletonUsbOtg.getInstance().resetUsbOtgRoot(); + SingletonUsbOtg.INSTANCE.resetUsbOtgRoot(); drawer.refreshDrawer(); goToMain(null); } @@ -1695,7 +1692,7 @@ public class MainActivity extends PermissionsActivity if (responseCode == Activity.RESULT_OK && intent.getData() != null) { // otg access Uri usbOtgRoot = intent.getData(); - SingletonUsbOtg.getInstance().setUsbOtgRoot(usbOtgRoot); + SingletonUsbOtg.INSTANCE.setUsbOtgRoot(usbOtgRoot); mainFragment.loadlist(OTGUtil.PREFIX_OTG, false, OpenMode.OTG, true); drawer.closeIfNotLocked(); if (drawer.isLocked()) drawer.onDrawerClosed(); @@ -2048,7 +2045,7 @@ public class MainActivity extends PermissionsActivity if (SDK_INT >= KITKAT) { if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) { - SingletonUsbOtg.getInstance().resetUsbOtgRoot(); + SingletonUsbOtg.INSTANCE.resetUsbOtgRoot(); drawer.refreshDrawer(); } } diff --git a/app/src/main/java/com/amaze/filemanager/ui/views/drawer/Drawer.java b/app/src/main/java/com/amaze/filemanager/ui/views/drawer/Drawer.java index 358bfeb86..7a552e79b 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/views/drawer/Drawer.java +++ b/app/src/main/java/com/amaze/filemanager/ui/views/drawer/Drawer.java @@ -828,7 +828,7 @@ public class Drawer implements NavigationView.OnNavigationItemSelectedListener { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && (meta.path.contains(OTGUtil.PREFIX_OTG) || meta.path.startsWith(OTGUtil.PREFIX_MEDIA_REMOVABLE)) - && SingletonUsbOtg.getInstance().getUsbOtgRoot() == null) { + && SingletonUsbOtg.INSTANCE.getUsbOtgRoot() == null) { MaterialDialog dialog = GeneralDialogCreation.showOtgSafExplanationDialog(mainActivity); dialog .getActionButton(DialogAction.POSITIVE) diff --git a/app/src/main/java/com/amaze/filemanager/utils/OTGUtil.kt b/app/src/main/java/com/amaze/filemanager/utils/OTGUtil.kt index cad7ae00d..dc88fb909 100644 --- a/app/src/main/java/com/amaze/filemanager/utils/OTGUtil.kt +++ b/app/src/main/java/com/amaze/filemanager/utils/OTGUtil.kt @@ -93,7 +93,7 @@ object OTGUtil { fileFound: OnFileFound, ) { val rootUriString = - SingletonUsbOtg.getInstance().usbOtgRoot + SingletonUsbOtg.getUsbOtgRoot() ?: throw NullPointerException("USB OTG root not set!") return getDocumentFiles(rootUriString, path, context, OpenMode.OTG, fileFound) } @@ -163,7 +163,7 @@ object OTGUtil { createRecursive: Boolean, ): DocumentFile? { val rootUriString = - SingletonUsbOtg.getInstance().usbOtgRoot + SingletonUsbOtg.getUsbOtgRoot() ?: throw NullPointerException("USB OTG root not set!") return getDocumentFile(path, rootUriString, context, OpenMode.OTG, createRecursive) @@ -208,7 +208,7 @@ object OTGUtil { @RequiresApi(api = KITKAT) @JvmStatic fun isUsbUriAccessible(context: Context?): Boolean { - val rootUriString = SingletonUsbOtg.getInstance().usbOtgRoot + val rootUriString = SingletonUsbOtg.getUsbOtgRoot() return DocumentsContract.isDocumentUri(context, rootUriString) } diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/usb/SingletonUsbOtgTest.java b/app/src/test/java/com/amaze/filemanager/filesystem/usb/SingletonUsbOtgTest.java index 038b31b03..b73b1e631 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/usb/SingletonUsbOtgTest.java +++ b/app/src/test/java/com/amaze/filemanager/filesystem/usb/SingletonUsbOtgTest.java @@ -58,11 +58,11 @@ public class SingletonUsbOtgTest { Uri rootBefore = Uri.parse("ssh://testuser:testpassword@127.0.0.1:22222"); - SingletonUsbOtg.getInstance().setUsbOtgRoot(rootBefore); + SingletonUsbOtg.INSTANCE.setUsbOtgRoot(rootBefore); controller.pause().resume().get(); - Uri rootAfter = SingletonUsbOtg.getInstance().getUsbOtgRoot(); + Uri rootAfter = SingletonUsbOtg.INSTANCE.getUsbOtgRoot(); assertEquals( "Uris are different: (before:) " + rootBefore + " (after:) " + rootAfter, diff --git a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/filesystem/cloud/CloudStreamServer.java b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/filesystem/cloud/CloudStreamServer.java index b13b84958..ffaed10e0 100644 --- a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/filesystem/cloud/CloudStreamServer.java +++ b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/filesystem/cloud/CloudStreamServer.java @@ -91,6 +91,7 @@ import android.net.Uri; * * See the end of the source file for distribution license (Modified BSD licence) */ +@SuppressWarnings("PMD") public abstract class CloudStreamServer { private static final Logger LOG = LoggerFactory.getLogger(CloudStreamServer.class); diff --git a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/filesystem/smbstreamer/StreamServer.java b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/filesystem/smbstreamer/StreamServer.java index 83242cacb..43e10e185 100644 --- a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/filesystem/smbstreamer/StreamServer.java +++ b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/filesystem/smbstreamer/StreamServer.java @@ -91,6 +91,7 @@ import android.net.Uri; * * See the end of the source file for distribution license (Modified BSD licence) */ +@SuppressWarnings("PMD") public abstract class StreamServer { private static final Logger LOG = LoggerFactory.getLogger(StreamServer.class); diff --git a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/filesystem/usb/SingletonUsbOtg.kt b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/filesystem/usb/SingletonUsbOtg.kt index 50b066785..f6a7a40b5 100644 --- a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/filesystem/usb/SingletonUsbOtg.kt +++ b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/filesystem/usb/SingletonUsbOtg.kt @@ -17,50 +17,53 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ +package com.amaze.filemanager.fileoperations.filesystem.usb -package com.amaze.filemanager.fileoperations.filesystem.usb; +import android.net.Uri -import android.net.Uri; +/** + * USB OTG device representation. + */ +object SingletonUsbOtg { + var connectedDevice: UsbOtgRepresentation? = null + var _usbOtgRoot: Uri? = null -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; + val isDeviceConnected: Boolean + get() = connectedDevice != null -public class SingletonUsbOtg { - private static SingletonUsbOtg instance = null; + /** + * Get the root of the connected USB OTG device. + * + * @return the root URI of the connected USB OTG device, or null if no device is connected. + */ + fun getUsbOtgRoot(): Uri? { + return _usbOtgRoot + } - public static SingletonUsbOtg getInstance() { - if (instance == null) instance = new SingletonUsbOtg(); - return instance; - } + /** + * Set the root of the connected USB OTG device. Will throw exception if no device is connected. + * + * @param root the root URI of the connected USB OTG device. + */ + fun setUsbOtgRoot(root: Uri?) { + checkNotNull(connectedDevice) { "No device connected!" } + _usbOtgRoot = root + } - private UsbOtgRepresentation connectedDevice = null; - private @Nullable Uri usbOtgRoot; + /** + * Clear the reference to connected device and root. + */ + fun resetUsbOtgRoot() { + connectedDevice = null + _usbOtgRoot = null + } - private SingletonUsbOtg() {} - - public void setConnectedDevice(UsbOtgRepresentation connectedDevice) { - this.connectedDevice = connectedDevice; - } - - public boolean isDeviceConnected() { - return connectedDevice != null; - } - - public void setUsbOtgRoot(@Nullable Uri root) { - if (connectedDevice == null) throw new IllegalStateException("No device connected!"); - usbOtgRoot = root; - } - - public void resetUsbOtgRoot() { - connectedDevice = null; - usbOtgRoot = null; - } - - public @Nullable Uri getUsbOtgRoot() { - return usbOtgRoot; - } - - public boolean checkIfRootIsFromDevice(@NonNull UsbOtgRepresentation device) { - return usbOtgRoot != null && connectedDevice.hashCode() == device.hashCode(); - } + /** + * Check if the root is from the given device. + * + * Used by [MainActivity.updateUsbInformation]. + */ + fun checkIfRootIsFromDevice(device: UsbOtgRepresentation): Boolean { + return _usbOtgRoot != null && connectedDevice.hashCode() == device.hashCode() + } } diff --git a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/filesystem/usb/UsbOtgRepresentation.kt b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/filesystem/usb/UsbOtgRepresentation.kt index 6c27ab84e..92070758c 100644 --- a/file_operations/src/main/java/com/amaze/filemanager/fileoperations/filesystem/usb/UsbOtgRepresentation.kt +++ b/file_operations/src/main/java/com/amaze/filemanager/fileoperations/filesystem/usb/UsbOtgRepresentation.kt @@ -17,47 +17,33 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ - -package com.amaze.filemanager.fileoperations.filesystem.usb; - -import androidx.annotation.Nullable; +package com.amaze.filemanager.fileoperations.filesystem.usb /** * This class replesents a usb device. * - * @see UsbOtgRepresentation#equals(Object) + * @see UsbOtgRepresentation.equals */ -public class UsbOtgRepresentation { +data class UsbOtgRepresentation(val productID: Int, val vendorID: Int, val serialNumber: String?) { + /** + * This does not ensure a device is equal to another! This tests parameters to know to a certain + * degree of certainty that a device is "similar enough" to another one to be the same one. + */ + override fun equals(obj: Any?): Boolean { + if (obj !is UsbOtgRepresentation) return false - public final int productID, vendorID; - public final @Nullable String serialNumber; + return productID == obj.productID && + vendorID == obj.vendorID && + ( + (serialNumber == null && obj.serialNumber == null) || + serialNumber == obj.serialNumber + ) + } - public UsbOtgRepresentation(int productID, int vendorID, @Nullable String serialNumber) { - this.productID = productID; - this.vendorID = vendorID; - this.serialNumber = serialNumber; - } - - /** - * This does not ensure a device is equal to another! This tests parameters to know to a certain - * degree of certanty that a device is "similar enough" to another one to be the same one. - */ - @Override - public boolean equals(Object obj) { - if (!(obj instanceof UsbOtgRepresentation)) return false; - - UsbOtgRepresentation other = (UsbOtgRepresentation) obj; - return productID == other.productID - && vendorID == other.vendorID - && ((serialNumber == null && other.serialNumber == null) - || serialNumber.equals(other.serialNumber)); - } - - @Override - public int hashCode() { - int result = productID; - result = 37 * result + vendorID; - result = 37 * result + (serialNumber != null ? serialNumber.hashCode() : 0); - return result; - } + override fun hashCode(): Int { + var result = productID + result = 37 * result + vendorID + result = 37 * result + (serialNumber?.hashCode() ?: 0) + return result + } } diff --git a/file_operations/src/test/java/com/amaze/filemanager/fileoperations/filesystem/cloud/CloudStreamSourceTest.java b/file_operations/src/test/java/com/amaze/filemanager/fileoperations/filesystem/cloud/CloudStreamSourceTest.java index c6d3bcee7..e56195c17 100644 --- a/file_operations/src/test/java/com/amaze/filemanager/fileoperations/filesystem/cloud/CloudStreamSourceTest.java +++ b/file_operations/src/test/java/com/amaze/filemanager/fileoperations/filesystem/cloud/CloudStreamSourceTest.java @@ -115,11 +115,11 @@ public class CloudStreamSourceTest { @Test public void read() throws IOException { byte[] buff = new byte[10]; - int n = cs.read(buff); + int bytesRead = cs.read(buff); byte[] temp = Arrays.copyOfRange(text, 0, buff.length); assertArrayEquals(temp, buff); - assertEquals(buff.length, n); + assertEquals(buff.length, bytesRead); } /** @@ -129,12 +129,12 @@ public class CloudStreamSourceTest { @Test public void readExceed() throws IOException { byte[] buff = new byte[100]; - int n = cs.read(buff); + int bytesRead = cs.read(buff); // erase dummy values in the end of buffer - byte[] buffer = Arrays.copyOfRange(buff, 0, n); + byte[] buffer = Arrays.copyOfRange(buff, 0, bytesRead); assertArrayEquals(text, buffer); - assertEquals(len, n); + assertEquals(len, bytesRead); } /** @@ -145,7 +145,7 @@ public class CloudStreamSourceTest { public void readClosedException() throws IOException { cs.close(); byte[] buff = new byte[(int) len]; - int n = cs.read(buff); + cs.read(buff); } /** @@ -158,12 +158,12 @@ public class CloudStreamSourceTest { int start = 5; int end = 10; - int n = cs.read(buff, start, end); + int bytesRead = cs.read(buff, start, end); byte[] file = Arrays.copyOfRange(text, 0, end - start); byte[] buffer = Arrays.copyOfRange(buff, start, end); assertArrayEquals(file, buffer); - assertEquals(end, n); + assertEquals(end, bytesRead); } /** @@ -191,7 +191,7 @@ public class CloudStreamSourceTest { int start = 5; int end = 10; - int n = cs.read(buff, start, end); + cs.read(buff, start, end); } /** @@ -206,9 +206,9 @@ public class CloudStreamSourceTest { cs.moveTo(readPosition); cs.open(); - int n = cs.read(buff); + int bytesRead = cs.read(buff); assertEquals(text[readPosition], buff[0]); - assertEquals(buff.length, n); + assertEquals(buff.length, bytesRead); } /** @@ -229,14 +229,14 @@ public class CloudStreamSourceTest { public void close() { cs.close(); - int n = -1; + int bytesRead = -1; try { byte[] buff = new byte[1]; - n = cs.read(buff); + bytesRead = cs.read(buff); } catch (IOException ignored) { } - assertEquals(-1, n); + assertEquals(-1, bytesRead); } /** Purpose: Get length of the text from a file Input: no Expected: return len */ diff --git a/file_operations/src/test/java/com/amaze/filemanager/fileoperations/filesystem/smbstreamer/StreamSourceTest.java b/file_operations/src/test/java/com/amaze/filemanager/fileoperations/filesystem/smbstreamer/StreamSourceTest.java index 9415dcf1f..33af95ed1 100644 --- a/file_operations/src/test/java/com/amaze/filemanager/fileoperations/filesystem/smbstreamer/StreamSourceTest.java +++ b/file_operations/src/test/java/com/amaze/filemanager/fileoperations/filesystem/smbstreamer/StreamSourceTest.java @@ -110,11 +110,11 @@ public class StreamSourceTest { public void read() throws IOException { ss.open(); byte[] buff = new byte[10]; - int n = ss.read(buff); + int bytesRead = ss.read(buff); byte[] temp = Arrays.copyOfRange(text, 0, buff.length); assertArrayEquals(temp, buff); - assertEquals(buff.length, n); + assertEquals(buff.length, bytesRead); } /** @@ -125,12 +125,12 @@ public class StreamSourceTest { public void readExceed() throws IOException { ss.open(); byte[] buff = new byte[100]; - int n = ss.read(buff); + int bytesRead = ss.read(buff); // erase dummy values in the end of buffer - byte[] buffer = Arrays.copyOfRange(buff, 0, n); + byte[] buffer = Arrays.copyOfRange(buff, 0, bytesRead); assertArrayEquals(text, buffer); - assertEquals(text.length, n); + assertEquals(text.length, bytesRead); } /** @@ -142,7 +142,7 @@ public class StreamSourceTest { ss.open(); ss.close(); byte[] buff = new byte[text.length]; - int n = ss.read(buff); + ss.read(buff); } /** @@ -156,12 +156,12 @@ public class StreamSourceTest { int start = 5; int end = 10; - int n = ss.read(buff, start, end); + int bytesRead = ss.read(buff, start, end); byte[] file = Arrays.copyOfRange(text, 0, end - start); byte[] buffer = Arrays.copyOfRange(buff, start, end); assertArrayEquals(file, buffer); - assertEquals(end, n); + assertEquals(end, bytesRead); } /** @@ -192,7 +192,7 @@ public class StreamSourceTest { int start = 5; int end = 10; - int n = ss.read(buff, start, end); + ss.read(buff, start, end); } /** @@ -207,9 +207,9 @@ public class StreamSourceTest { ss.moveTo(readPosition); ss.open(); - int n = ss.read(buff); + int bytesRead = ss.read(buff); assertEquals(text[readPosition], buff[0]); - assertEquals(buff.length, n); + assertEquals(buff.length, bytesRead); } /** @@ -231,14 +231,14 @@ public class StreamSourceTest { ss.open(); ss.close(); - int n = -1; + int bytesRead = -1; try { byte[] buff = new byte[1]; - n = ss.read(buff); + bytesRead = ss.read(buff); } catch (IOException ignored) { } - assertEquals(-1, n); + assertEquals(-1, bytesRead); } /** Purpose: Get MIME type Input: no Expected: return "txt" */ diff --git a/testShared/src/test/java/com/amaze/filemanager/shadows/jcifs/smb/ShadowSmbFile.java b/testShared/src/test/java/com/amaze/filemanager/shadows/jcifs/smb/ShadowSmbFile.java index d4b6568e7..82e48931a 100644 --- a/testShared/src/test/java/com/amaze/filemanager/shadows/jcifs/smb/ShadowSmbFile.java +++ b/testShared/src/test/java/com/amaze/filemanager/shadows/jcifs/smb/ShadowSmbFile.java @@ -39,6 +39,7 @@ public class ShadowSmbFile { private File file = null; @Implementation + @SuppressWarnings("PMD") public void __constructor__(URL url, NtlmPasswordAuthentication auth) { // intentionally empty }