SpotBugs (4.9.8)
Analysis for
lib (spotbugsDebug)
SpotBugs Analysis generated at: Thu, 22 Jan 2026 11:06:17 +0000
| Package |
Code Size |
Bugs |
High Prio Bugs |
Medium Prio Bugs |
Low Prio Bugs |
Exp. Bugs |
Ratio |
|
Overall
(9 packages),
(69 classes)
|
2017 |
71 |
11 |
60 |
|
|
|
| com.nextcloud.android.sso |
288 |
8 |
1 |
7 |
|
|
|
| com.nextcloud.android.sso.aidl |
356 |
13 |
2 |
11 |
|
|
|
| com.nextcloud.android.sso.api |
539 |
34 |
6 |
28 |
|
|
|
| com.nextcloud.android.sso.exceptions |
168 |
1 |
|
1 |
|
|
|
| com.nextcloud.android.sso.helper |
391 |
8 |
|
8 |
|
|
|
| com.nextcloud.android.sso.model |
54 |
4 |
2 |
2 |
|
|
|
| com.nextcloud.android.sso.model.ocs |
147 |
2 |
|
2 |
|
|
|
| retrofit2 |
32 |
1 |
|
1 |
|
|
|
Analyzed Files:
- /home/runner/work/Android-SingleSignOn/Android-SingleSignOn/lib/build/intermediates/javac/debug
Used Libraries:
- /usr/local/lib/android/sdk/platforms/android-36/android.jar
- /usr/local/lib/android/sdk/build-tools/35.0.0/core-lambda-stubs.jar
- /home/runner/work/Android-SingleSignOn/Android-SingleSignOn/lib/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.13.2/48b8230771e573b54ce6e867a9001e75977fe78e/gson-2.13.2.jar
- /home/runner/.gradle/caches/9.3.0/transforms/f6917b75ac87cb4d642f19375f300b34/transformed/material-1.13.0-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/230e9021c67a4157a523ac4f3ff3d5d8/transformed/appcompat-resources-1.7.1-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/14bf242ce0855f199502303c1716dcc1/transformed/appcompat-1.7.1-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/24a07716fbe1f7df76317ed5ff32a3d5/transformed/viewpager2-1.0.0-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/00d81d2d03493dbd811095e6c737a0dd/transformed/fragment-1.8.9-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/d0f1573f69921a24f78ec04c4c375055/transformed/activity-1.8.1-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/bf96337ecdace991eed62fee97c21026/transformed/drawerlayout-1.1.1-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/689cf6572afe701182164c93cfed6dea/transformed/loader-1.0.0-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/a5c19ae3e0bb49980350fabf79ef8427/transformed/lifecycle-livedata-2.6.2-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/c4c5cc3557e088a23e9d3e091b72e809/transformed/lifecycle-viewmodel-2.6.2-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/f078d4b48bc8ac4e873e50b001b920f1/transformed/lifecycle-livedata-core-2.6.2-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/325c8b74f1ae7451ed50a0f8b5d5ca0a/transformed/lifecycle-runtime-2.6.2-api.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-common/2.6.2/10f354fdb64868baecd67128560c5a0d6312c495/lifecycle-common-2.6.2.jar
- /home/runner/.gradle/caches/9.3.0/transforms/a95768b9eed678cdba764faf992a5d6d/transformed/lifecycle-viewmodel-savedstate-2.6.2-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/456c78580909e47834631bc681721544/transformed/core-ktx-1.17.0-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/5e0b23a077d4942c620b13022e7c566f/transformed/viewpager-1.0.0-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/1f5f2ebbd7ea33e3f0ed13e0530adbc5/transformed/coordinatorlayout-1.1.0-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/a06126f0d04dca053cf8d0c2f08e9edf/transformed/dynamicanimation-1.1.0-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/779dfd9159309e8812a8c9370ecda307/transformed/recyclerview-1.2.1-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/4788cf6bac51f60173912b59caf76b8c/transformed/transition-1.5.0-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/d208658fb5b360d52bb13312395dfbe5/transformed/vectordrawable-animated-1.1.0-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/fca15460af682ab2389738710d5fd777/transformed/vectordrawable-1.1.0-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/037fcc769bac3cdb1f9fd42ad7bf461b/transformed/customview-1.1.0-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/96f3185d3f9a515bb1c15e4a8fb67b47/transformed/core-1.17.0-api.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/com.squareup.retrofit2/retrofit/3.0.0/c0cdf6d243c5187732134129fda05a74f9197874/retrofit-3.0.0.jar
- /home/runner/.gradle/caches/9.3.0/transforms/a1466fc436e8acc05ad5af9d8fc2790c/transformed/savedstate-1.2.1-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/86b0e1ec00992db4520b2a6119a908a9/transformed/cursoradapter-1.0.0-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/149d17ddcadfa11dc360abf9634b75c0/transformed/versionedparcelable-1.1.1-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/182449fb4eb34a9a59cb62c3b7b123b9/transformed/cardview-1.0.0-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/1626914f9942dd3f78903ffd48d3a695/transformed/core-runtime-2.2.0-api.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-common/2.2.0/5e1b8b81dfd5f52c56a8d53b18ca759c19a301f3/core-common-2.2.0.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/androidx.collection/collection-jvm/1.4.2/bc60b5568a66d765a9fe8e266fd0c6c727e0b50b/collection-jvm-1.4.2.jar
- /home/runner/.gradle/caches/9.3.0/transforms/455ddfc3bbb5e23c240c75e8529b29ec/transformed/interpolator-1.0.0-api.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation-jvm/1.9.1/b17951747e38bf3986a24431b9ba0d039958aa5f/annotation-jvm-1.9.1.jar
- /home/runner/.gradle/caches/9.3.0/transforms/f00724b72f2bea1d88f760b16740329d/transformed/annotation-experimental-1.4.1-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/f4b697e3fd3920fbce5e1c5f8379e9ab/transformed/core-viewtree-1.0.0-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/55c4b2d6beac87146c64af32c6feeff1/transformed/okhttp-release-api.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-core-jvm/1.8.1/bb0e192bd7c2b6b8217440d36e9758e377e450/kotlinx-coroutines-core-jvm-1.8.1.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-coroutines-android/1.8.1/73e2acdd18df99dd4849d99f188dff529fc0afe0/kotlinx-coroutines-android-1.8.1.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/com.squareup.okio/okio-jvm/3.16.4/ceb794cf0bbf8d0d20f49aa91ce20db7fd77675d/okio-jvm-3.16.4.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/2.3.0/ebc4eb2b6e6c91b6c844c1e3183920d86f2ef656/kotlin-stdlib-2.3.0.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/io.reactivex.rxjava2/rxjava/2.2.21/6f13f24c44567fc660aab94d639cda9f0fe95628/rxjava-2.2.21.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/io.reactivex.rxjava3/rxjava/3.1.12/5f67300384802bde3f6d62701ffec804b770700b/rxjava-3.1.12.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.21.0/52a6f68fe5afe335cde95461dd5c3412f04996f7/commons-io-2.21.0.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/com.google.errorprone/error_prone_annotations/2.41.0/4381275efdef6ddfae38f002c31e84cd001c97f0/error_prone_annotations-2.41.0.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/23.0.0/8cc20c07506ec18e0834947b84a864bfc094484e/annotations-23.0.0.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/com.google.guava/listenablefuture/1.0/c949a840a6acbc5268d088e47b04177bf90b3cad/listenablefuture-1.0.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/org.jspecify/jspecify/1.0.0/7425a601c1c7ec76645a78d22b8c6a627edee507/jspecify-1.0.0.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/androidx.resourceinspection/resourceinspection-annotation/1.0.1/8c21f8ff5d96d5d52c948707f7e4d6ca6773feef/resourceinspection-annotation-1.0.1.jar
- /home/runner/.gradle/caches/9.3.0/transforms/1e9cb5d2daecaa1a2c90f77d8523536d/transformed/constraintlayout-2.1.0-api.jar
- /home/runner/.gradle/caches/9.3.0/transforms/e834a072ffb9a002addf43ae73f7b609/transformed/graphics-shapes-release-api.jar
- /home/runner/.gradle/caches/modules-2/files-2.1/org.reactivestreams/reactive-streams/1.0.4/3864a1320d97d7b045f729a326e1e077661f31b7/reactive-streams-1.0.4.jar
Analysis Errors:
- Missing ref classes for analysis:
- java.rmi.Remote
- javax.accessibility.Accessible
High Prio
Medium Prio
Low Prio
Exp.
High Prio
Medium Prio
Low Prio
Exp.
PSC / PSC_PRESIZE_COLLECTIONS
This method allocates a collection using the default constructor even though it is known
a priori (or at least can be reasonably guessed) how many items are going to be placed in the collection,
and thus needlessly causes intermediate reallocations of the collection.
You can use the constructor that takes an initial size and that will be much better, but
due to the loadFactor of Maps and Sets, even this will not be a correct estimate.
If you are using Guava, use its methods that allocate maps and sets with a predetermined size,
to get the best chance for no reallocations, such as:
- Sets.newHashSetWithExpectedSize(int)
- Maps.newHashMapWithExpectedSize(int)
If not, a good estimate would be the expectedSize / {LOADING_FACTOR} which by default is 0.75
EI2 / EI_EXPOSE_REP2
This code stores a reference to an externally mutable object into the
internal representation of the object.
If instances
are accessed by untrusted code, and unchecked changes to
the mutable object would compromise security or other
important properties, you will need to do something different.
Storing a copy of the object is better approach in many situations.
See CWE-374: Passing Mutable Objects to an Untrusted Method.
WMI / WMI_WRONG_MAP_ITERATOR
This method accesses the value of a Map entry, using a key that was retrieved from
a keySet iterator. It is more efficient to use an iterator on the entrySet of the map, to avoid the
Map.get(key) lookup.
IMC / IMC_IMMATURE_CLASS_PRINTSTACKTRACE
This method prints a stack trace to the console. This is non configurable, and causes an
application to look unprofessional. Switch to using loggers so that users can control what
is logged and where.
CLI / CLI_CONSTANT_LIST_INDEX
This method accesses an array or list using a constant integer index. Often,
this is a typo where a loop variable is intended to be used. If however, specific
list indices mean different specific things, then perhaps replacing the list with
a first-class object with meaningful accessors would make the code less brittle.
OC / OC_OVERZEALOUS_CASTING
This method casts the right hand side of an expression to a class that is more specific than the
variable on the left hand side of the assignment. The cast only has to be as specific as the variable
that is on the left. Using a more specific type on the right hand side just increases cohesion.
NP / NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE
The return value from a method is dereferenced without a null check,
and the return value of that method is one that should generally be checked
for null. This may lead to a NullPointerException when the code is executed.
EXS / EXS_EXCEPTION_SOFTENING_NO_CONSTRAINTS
This method is not constrained by an interface or superclass, but converts a caught checked exception
to an unchecked exception and throws it. It would be more appropriate just to throw the checked exception,
adding the exception to the throws clause of the method.
Nm / NM_METHOD_NAMING_CONVENTION
Methods should be verbs, in mixed case with the first letter lowercase, with the first letter of each internal word capitalized.
MDM / MDM_STRING_BYTES_ENCODING
The behavior of the String(byte[] bytes) and String.getBytes() is undefined if the string cannot be encoded in the platform's default charset. Instead, use the String(byte[] bytes, String encoding) or String.getBytes(String encoding) constructor which accepts the string's encoding as an argument. Be sure to specify the encoding used for the user's locale.
As per the Java specifications, "UTF-8", "US-ASCII", "UTF-16" and "ISO-8859-1" will all be valid encoding charsets. If you aren't sure, try "UTF-8".
New in Java 1.7, you can specify an encoding from StandardCharsets, like StandardCharsets.UTF_8. These are generally preferrable because you don't have to deal with UnsupportedEncodingException.
SPP / SPP_PASSING_THIS_AS_PARM
This method calls an instance method passing the object that the method is called on as a parameter, such as
foo.someMethod(foo);
As you already have access to this object thru this, you don't need to pass it.
SPP / SPP_NULL_BEFORE_INSTANCEOF
This method checks a reference for null just before seeing if the reference is an instanceof some class.
Since instanceof will return false for null references, the null check is not needed.
EI / EI_EXPOSE_REP
Returning a reference to a mutable object value stored in one of the object's fields
exposes the internal representation of the object.
If instances
are accessed by untrusted code, and unchecked changes to
the mutable object would compromise security or other
important properties, you will need to do something different.
Returning a new copy of the object is better approach in many situations.
See CWE-374: Passing Mutable Objects to an Untrusted Method.
SUI / SUI_CONTAINS_BEFORE_ADD
This method checks to see if an element is not in a set before adding it. This is unnecessary as you can just
add the item, and if the item exists, it won't add it, otherwise it will.
As an example, instead of using
Set mySet = getSomeSet();
if (!mySet.contains("foo")) {
mySet.add("foo");
}
convert this to
Set mySet = getSomeSet();
if (mySet.add("foo")) {
}
UP / UP_UNUSED_PARAMETER
This method defines parameters that are never used. As this method is either static or private,
and can't be derived from, it is safe to remove these parameters and simplify your method.
You should consider, while unlikely, that this method may be used reflectively, and thus you will
want to change that call as well. In this case, it is likely that once you remove the parameter,
there will be a chain of method calls that have spent time creating this parameter and passing it
down the line. All of this may be able to be removed.
Dm / DM_DEFAULT_ENCODING
Found a call to a method which will perform a byte to String (or String to byte) conversion,
and will assume that the default platform encoding is suitable. This will cause the application
behavior to vary between platforms. Use an alternative API and specify a charset name or Charset
object explicitly.
See CWE-173: Improper Handling of Alternate Encoding.
NN / NN_NAKED_NOTIFY
A call to notify() or notifyAll()
was made without any (apparent) accompanying
modification to mutable object state. In general, calling a notify
method on a monitor is done because some condition another thread is
waiting for has become true. However, for the condition to be meaningful,
it must involve a heap object that is visible to both threads.
This bug does not necessarily indicate an error, since the change to
mutable object state may have taken place in a method which then called
the method containing the notification.
IMC / IMC_IMMATURE_CLASS_COLLECTION_RETURN
This method declares that it returns a Collection, when in fact it has created and returned
a more specific interface. Since the caller is free to cast any return value to Collection, it is
better to return the specific interface created so that it gives the caller the most
power. With methods, always expect the least with parameters, and provide the most with return types.
OCP / OCP_OVERLY_CONCRETE_COLLECTION_PARAMETER
This method uses specific collection interface/classes for parameters when only methods defined in the
Collection class are used. Consider increasing the abstraction of the interface to
make low impact changes easier to accomplish in the future.
Take the following example:
private void printList(List<String> list) {
for (String s : list) {
System.out.println(s);
}
}
The parameter list is currently defined as an
List, which is a specific collection interface.
Specifying
List is unnecessary here, because we aren't using any
AList-specific methods (like
get(0)).
Instead of using the concrete definition, it is better to do something like:
private void printList(Collection<String> list) {
...
If the design ever changes, e.g. a
Set is used instead, this code won't have to change.
IDEs tend to have tools to help generalize parameters. For example, in Eclipse, the refactoring tool Generalize Declared Type helps find an appropriate level of concreteness.
JLM / JLM_JSR166_UTILCONCURRENT_MONITORENTER
This method performs synchronization on an object that is an instance of
a class from the java.util.concurrent package (or its subclasses). Instances
of these classes have their own concurrency control mechanisms that are orthogonal to
the synchronization provided by the Java keyword synchronized. For example,
synchronizing on an AtomicBoolean will not prevent other threads
from modifying the AtomicBoolean.
Such code may be correct, but should be carefully reviewed and documented,
and may confuse people who have to maintain the code at a later date.
LEST / LEST_LOST_EXCEPTION_STACK_TRACE
This method catches an exception, and throws a different exception, without incorporating the
original exception. Doing so hides the original source of the exception, making debugging and fixing
these problems difficult. It is better to use the constructor of this new exception that takes an
original exception so that this detail can be passed along to the user. If this exception has no constructor
that takes an initial cause parameter, use the initCause method to initialize it instead.
catch (IOException e) {
throw new MySpecialException("Failed to open configuration", e);
}
FII / FII_USE_METHOD_REFERENCE
This method defines an anonymous lambda function to be called to fetch a single value from the passed in value. While
this will work, it is needlessly complex as this function merely calls a single getter method on the object, and thus
the code can be simplied by just passing in a method reference instead.
Instead of
baubles.stream().map(b -> b.getName()).collect(Collectors.toSet())
do
baubles.stream().map(Bauble::getName).collect(Collectors.toSet())
or if the lambda expression is one where the parameter is passed to a method of a field, like
baubles.stream().map(b -> magic.getSpell(b)).collect(Collectors.toSet())
do
baubles.stream().map(magic::getSpell).collect(Collectors.toSet())
SECPR / PREDICTABLE_RANDOM
The use of a predictable random value can lead to vulnerabilities when used in certain security critical contexts. For example, when the value is used as:
- a CSRF token: a predictable token can lead to a CSRF attack as an attacker will know the value of the token
- a password reset token (sent by email): a predictable password token can lead to an account takeover, since an attacker will guess the URL of the "change password" form
- any other secret value
A quick fix could be to replace the use of java.util.Random with something stronger, such as java.security.SecureRandom.
Vulnerable Code:
String generateSecretToken() {
Random r = new Random();
return Long.toHexString(r.nextLong());
}
Solution:
import org.apache.commons.codec.binary.Hex;
String generateSecretToken() {
SecureRandom secRandom = new SecureRandom();
byte[] result = new byte[32];
secRandom.nextBytes(result);
return Hex.encodeHexString(result);
}
References
Cracking Random Number Generators - Part 1 (https://jazzy.id.au)
CERT: MSC02-J. Generate strong random numbers
CWE-330: Use of Insufficiently Random Values
Predicting Struts CSRF Token (Example of real-life vulnerability and exploitation)
ISB / ISB_TOSTRING_APPENDING
This method concatenates the output of a toString() call into a StringBuffer or StringBuilder.
It is simpler just to pass the object you want to append to the append call, as that form
does not suffer the potential for NullPointerExceptions, and is easier to read.
Keep in mind that Java compiles simple String concatenation to use StringBuilders,
so you may see this bug even when you don't use StringBuilders explicitly.
Instead of:
StringBuilder builder = ...;
builder.append(someObj.toString());
...
System.out.println("Problem with the object :" + someObj.toString());
just do:
StringBuilder builder = ...
builder.append(someObj);
...
System.out.println("Problem with the object :" + someObj);
to avoid the possibility of
NullPointerExceptions when someObj is
null.
STT / STT_STRING_PARSING_A_FIELD
This method calls a parsing method (indexOf, lastIndexOf, startsWith, endsWith, substring, indexOf) on a String
that is a field, or comes from a collection that is a field. This implies that the String in question is holding
multiple parts of information inside the string, which would be more maintainable and type safe if that value was a
true collection or a first class object with fields, rather than a String.
CT / CT_CONSTRUCTOR_THROW
Classes that throw exceptions in their constructors are vulnerable to Finalizer attacks
A finalizer attack can be prevented, by declaring the class final, using an empty finalizer declared as final, or by a clever use of a private constructor.
See SEI CERT Rule OBJ-11
for more information.
UCPM / UCPM_USE_CHARACTER_PARAMETERIZED_METHOD
This method passes a constant literal String of length 1 as a parameter to a method, when
a similar method is exposed that takes a char. It is simpler and more expedient to handle one
character, rather than a String.
Instead of making calls like:
String myString = ...
if (myString.indexOf("e") != -1) {
int i = myString.lastIndexOf("e");
System.out.println(myString + ":" + i); //the Java compiler will use a StringBuilder internally here [builder.append(":")]
...
return myString.replace("m","z");
}
Replace the single letter
Strings with their
char equivalents like so:
String myString = ...
if (myString.indexOf('e') != -1) {
int i = myString.lastIndexOf('e');
System.out.println(myString + ':' + i); //the Java compiler will use a StringBuilder internally here [builder.append(':')]
...
return myString.replace('m','z');
}
ITC / ITC_INHERITANCE_TYPE_CHECKING
This method uses the instanceof operator in a series of if/else statements to
differentiate blocks of code based on type. If these types are related by inheritance,
it is cleaner to just define a method in the base class, and use overridden methods
in these classes.
HE / HE_EQUALS_USE_HASHCODE
This class overrides equals(Object), but does not
override hashCode(), and inherits the implementation of
hashCode() from java.lang.Object (which returns
the identity hash code, an arbitrary value assigned to the object
by the VM). Therefore, the class is very likely to violate the
invariant that equal objects must have equal hashcodes.
If you don't think instances of this class will ever be inserted into a HashMap/HashTable,
the recommended hashCode implementation to use is:
public int hashCode() {
assert false : "hashCode not designed";
return 42; // any arbitrary constant will do
}
See CWE-581: Object Model Violation: Just One of Equals and Hashcode Defined.
IMC / IMC_IMMATURE_CLASS_BAD_SERIALVERSIONUID
This serializable class defines a serialVersionUID that appears to be a computed value, however the value does not
match the computed value, and thus losses it's value as version indicator. Either create a custom value like 1, 2, 3, 4.. etc, or
recompute the serialVersionUID using your IDE.
In class com.nextcloud.android.sso.AccountImporter
In method com.nextcloud.android.sso.AccountImporter.requestAuthToken(Activity, Intent)
At AccountImporter.java:[line 358]
Method com.nextcloud.android.sso.AccountImporter.requestAuthToken(Activity, Intent) throws alternative exception from catch block without history
In class com.nextcloud.android.sso.AccountImporter
In method com.nextcloud.android.sso.AccountImporter.requestAuthToken(Fragment, Intent)
At AccountImporter.java:[line 349]
Method com.nextcloud.android.sso.AccountImporter.requestAuthToken(Fragment, Intent) throws alternative exception from catch block without history
In class com.nextcloud.android.sso.AccountImporter
In method com.nextcloud.android.sso.AccountImporter.onRequestPermissionsResult(int, String[], int[], Activity, Fragment)
Value Parameter 2: permissions
At AccountImporter.java:[lines 295-320]
Static or private method com.nextcloud.android.sso.AccountImporter.onRequestPermissionsResult(int, String[], int[], Activity, Fragment) has unused parameters
In class com.nextcloud.android.sso.FilesAppTypeRegistry
In method com.nextcloud.android.sso.FilesAppTypeRegistry.getTypes()
Field com.nextcloud.android.sso.FilesAppTypeRegistry.types
At FilesAppTypeRegistry.java:[line 52]
com.nextcloud.android.sso.FilesAppTypeRegistry.getTypes() may expose internal representation by returning FilesAppTypeRegistry.types
In class com.nextcloud.android.sso.FilesAppTypeRegistry
In method com.nextcloud.android.sso.FilesAppTypeRegistry.getTypes()
At FilesAppTypeRegistry.java:[line 52]
Method com.nextcloud.android.sso.FilesAppTypeRegistry.getTypes() returns java.util.Collection
In class com.nextcloud.android.sso.FilesAppTypeRegistry
In method new com.nextcloud.android.sso.FilesAppTypeRegistry()
At FilesAppTypeRegistry.java:[lines 22-26]
Class (com.nextcloud.android.sso.FilesAppTypeRegistry) using singleton design pattern has non-private constructor.
In class com.nextcloud.android.sso.QueryParam
In method com.nextcloud.android.sso.QueryParam.equals(Object)
At QueryParam.java:[lines 28-36]
com.nextcloud.android.sso.QueryParam defines equals and uses Object.hashCode()
In class com.nextcloud.android.sso.QueryParam
Field com.nextcloud.android.sso.QueryParam.serialVersionUID
In QueryParam.java
Class com.nextcloud.android.sso.QueryParam defines a computed serialVersionUID that doesn't equate to the calculated value
In class com.nextcloud.android.sso.aidl.IInputStreamService$Stub
In method com.nextcloud.android.sso.aidl.IInputStreamService$Stub.asInterface(IBinder)
At IInputStreamService.java:[line 51]
Method com.nextcloud.android.sso.aidl.IInputStreamService$Stub.asInterface(IBinder) checks a reference for null before calling instanceof
In class com.nextcloud.android.sso.aidl.IInputStreamService$Stub
In method new com.nextcloud.android.sso.aidl.IInputStreamService$Stub()
At IInputStreamService.java:[line 39]
Method call in new com.nextcloud.android.sso.aidl.IInputStreamService$Stub() passes object that the method is called on as a parameter
In class com.nextcloud.android.sso.aidl.NextcloudRequest
In method com.nextcloud.android.sso.aidl.NextcloudRequest.getHeader()
Field com.nextcloud.android.sso.aidl.NextcloudRequest.header
At NextcloudRequest.java:[line 209]
com.nextcloud.android.sso.aidl.NextcloudRequest.getHeader() may expose internal representation by returning NextcloudRequest.header
In class com.nextcloud.android.sso.aidl.NextcloudRequest
In method com.nextcloud.android.sso.aidl.NextcloudRequest.getParameterV2()
Field com.nextcloud.android.sso.aidl.NextcloudRequest.parameterV2
At NextcloudRequest.java:[line 213]
com.nextcloud.android.sso.aidl.NextcloudRequest.getParameterV2() may expose internal representation by returning NextcloudRequest.parameterV2
In class com.nextcloud.android.sso.aidl.NextcloudRequest
In method com.nextcloud.android.sso.aidl.NextcloudRequest.equals(Object)
At NextcloudRequest.java:[lines 262-290]
com.nextcloud.android.sso.aidl.NextcloudRequest defines equals and uses Object.hashCode()
In class com.nextcloud.android.sso.aidl.NextcloudRequest
Field com.nextcloud.android.sso.aidl.NextcloudRequest.serialVersionUID
In NextcloudRequest.java
Class com.nextcloud.android.sso.aidl.NextcloudRequest defines a computed serialVersionUID that doesn't equate to the calculated value
In class com.nextcloud.android.sso.aidl.NextcloudRequest
In method com.nextcloud.android.sso.aidl.NextcloudRequest.getParameterV2()
At NextcloudRequest.java:[line 213]
Method com.nextcloud.android.sso.aidl.NextcloudRequest.getParameterV2() returns java.util.Collection
In class com.nextcloud.android.sso.aidl.NextcloudRequest$Builder
In method com.nextcloud.android.sso.aidl.NextcloudRequest$Builder.build()
Field com.nextcloud.android.sso.aidl.NextcloudRequest$Builder.ncr
At NextcloudRequest.java:[line 81]
com.nextcloud.android.sso.aidl.NextcloudRequest$Builder.build() may expose internal representation by returning NextcloudRequest$Builder.ncr
In class com.nextcloud.android.sso.aidl.NextcloudRequest$Builder
In method com.nextcloud.android.sso.aidl.NextcloudRequest$Builder.removeParameter(Pair)
Actual type androidx.core.util.Pair<java.lang.String,java.lang.String>
Expected com.nextcloud.android.sso.QueryParam
Called method java.util.Collection.remove(Object)
Invoked on com.nextcloud.android.sso.aidl.NextcloudRequest.parameterV2
parameter passed as argument
androidx.core.util.Pair.equals(Object) used to determine equality
At NextcloudRequest.java:[line 145]
androidx.core.util.Pair<java.lang.String,java.lang.String> is incompatible with expected argument type com.nextcloud.android.sso.QueryParam in com.nextcloud.android.sso.aidl.NextcloudRequest$Builder.removeParameter(Pair)
In class com.nextcloud.android.sso.aidl.NextcloudRequest$Builder
Field com.nextcloud.android.sso.aidl.NextcloudRequest$Builder.serialVersionUID
In NextcloudRequest.java
Class com.nextcloud.android.sso.aidl.NextcloudRequest$Builder defines a computed serialVersionUID that doesn't equate to the calculated value
In class com.nextcloud.android.sso.aidl.NextcloudRequest$Builder
In method com.nextcloud.android.sso.aidl.NextcloudRequest$Builder.setParameter(Collection)
At NextcloudRequest.java:[line 105]
Method com.nextcloud.android.sso.aidl.NextcloudRequest$Builder.setParameter(Collection) does not presize the allocation of a collection
In class com.nextcloud.android.sso.aidl.ParcelFileDescriptorUtil
In method com.nextcloud.android.sso.aidl.ParcelFileDescriptorUtil.pipeFrom(InputStream, IThreadListener)
At ParcelFileDescriptorUtil.java:[line 25]
Method com.nextcloud.android.sso.aidl.ParcelFileDescriptorUtil.pipeFrom(InputStream, IThreadListener) accesses list or array with constant index
In class com.nextcloud.android.sso.aidl.ParcelFileDescriptorUtil
In method com.nextcloud.android.sso.aidl.ParcelFileDescriptorUtil.pipeTo(OutputStream, IThreadListener)
At ParcelFileDescriptorUtil.java:[line 39]
Method com.nextcloud.android.sso.aidl.ParcelFileDescriptorUtil.pipeTo(OutputStream, IThreadListener) accesses list or array with constant index
In class com.nextcloud.android.sso.api.AidlNetworkRequest
In method com.nextcloud.android.sso.api.AidlNetworkRequest.waitForApi()
Type java.util.concurrent.atomic.AtomicBoolean
Value loaded from field com.nextcloud.android.sso.api.AidlNetworkRequest.mBound
At AidlNetworkRequest.java:[line 144]
Synchronization performed on java.util.concurrent.atomic.AtomicBoolean in com.nextcloud.android.sso.api.AidlNetworkRequest.waitForApi()
In class com.nextcloud.android.sso.api.AidlNetworkRequest
In method com.nextcloud.android.sso.api.AidlNetworkRequest.performNetworkRequestV2(NextcloudRequest, InputStream)
Called method com.nextcloud.android.sso.api.AidlNetworkRequest$ExceptionResponse.exception()
Dereferenced at AidlNetworkRequest.java:[line 178]
Known null at AidlNetworkRequest.java:[line 178]
Possible null pointer dereference in com.nextcloud.android.sso.api.AidlNetworkRequest.performNetworkRequestV2(NextcloudRequest, InputStream) due to return value of called method
In class com.nextcloud.android.sso.api.AidlNetworkRequest
In method com.nextcloud.android.sso.api.AidlNetworkRequest.performNetworkRequestV2(NextcloudRequest, InputStream)
Called method com.nextcloud.android.sso.api.AidlNetworkRequest$ExceptionResponse.exception()
Dereferenced at AidlNetworkRequest.java:[line 181]
Known null at AidlNetworkRequest.java:[line 181]
Possible null pointer dereference in com.nextcloud.android.sso.api.AidlNetworkRequest.performNetworkRequestV2(NextcloudRequest, InputStream) due to return value of called method
In class com.nextcloud.android.sso.api.AidlNetworkRequest
In method com.nextcloud.android.sso.api.AidlNetworkRequest.deserializeObject(InputStream)
At AidlNetworkRequest.java:[line 229]
Object deserialization is used in com.nextcloud.android.sso.api.AidlNetworkRequest.deserializeObject(InputStream)
In class com.nextcloud.android.sso.api.AidlNetworkRequest
In method com.nextcloud.android.sso.api.AidlNetworkRequest.deserializeObjectV2(InputStream)
At AidlNetworkRequest.java:[line 235]
Object deserialization is used in com.nextcloud.android.sso.api.AidlNetworkRequest.deserializeObjectV2(InputStream)
In class com.nextcloud.android.sso.api.AidlNetworkRequest
In method com.nextcloud.android.sso.api.AidlNetworkRequest.deserializeObjectV2(InputStream)
At AidlNetworkRequest.java:[line 238]
Object deserialization is used in com.nextcloud.android.sso.api.AidlNetworkRequest.deserializeObjectV2(InputStream)
In class com.nextcloud.android.sso.api.AidlNetworkRequest$1
In method com.nextcloud.android.sso.api.AidlNetworkRequest$1.onServiceConnected(ComponentName, IBinder)
At AidlNetworkRequest.java:[line 62]
Method com.nextcloud.android.sso.api.AidlNetworkRequest$1.onServiceConnected(ComponentName, IBinder) concatenates the result of a toString() call
In class com.nextcloud.android.sso.api.AidlNetworkRequest$1
In method com.nextcloud.android.sso.api.AidlNetworkRequest$1.onServiceDisconnected(ComponentName)
At AidlNetworkRequest.java:[line 73]
Method com.nextcloud.android.sso.api.AidlNetworkRequest$1.onServiceDisconnected(ComponentName) concatenates the result of a toString() call
In class com.nextcloud.android.sso.api.AidlNetworkRequest$1
In method com.nextcloud.android.sso.api.AidlNetworkRequest$1.onServiceDisconnected(ComponentName)
At AidlNetworkRequest.java:[line 80]
Method com.nextcloud.android.sso.api.AidlNetworkRequest$1.onServiceDisconnected(ComponentName) concatenates the result of a toString() call
In class com.nextcloud.android.sso.api.AidlNetworkRequest$1
In method com.nextcloud.android.sso.api.AidlNetworkRequest$1.onServiceConnected(ComponentName, IBinder)
Type java.util.concurrent.atomic.AtomicBoolean
Value loaded from field com.nextcloud.android.sso.api.AidlNetworkRequest.mBound
At AidlNetworkRequest.java:[line 66]
Synchronization performed on java.util.concurrent.atomic.AtomicBoolean in com.nextcloud.android.sso.api.AidlNetworkRequest$1.onServiceConnected(ComponentName, IBinder)
In class com.nextcloud.android.sso.api.AidlNetworkRequest$1
In method com.nextcloud.android.sso.api.AidlNetworkRequest$1.onServiceConnected(ComponentName, IBinder)
At AidlNetworkRequest.java:[line 67]
Naked notify in com.nextcloud.android.sso.api.AidlNetworkRequest$1.onServiceConnected(ComponentName, IBinder)
In class com.nextcloud.android.sso.api.NextcloudAPI
In method com.nextcloud.android.sso.api.NextcloudAPI.convertStreamToTargetEntity(InputStream, Type)
Called method new java.io.InputStreamReader(InputStream)
At NextcloudAPI.java:[line 131]
Found reliance on default encoding in com.nextcloud.android.sso.api.NextcloudAPI.convertStreamToTargetEntity(InputStream, Type): new java.io.InputStreamReader(InputStream)
In class com.nextcloud.android.sso.api.NextcloudAPI
In method com.nextcloud.android.sso.api.NextcloudAPI.convertStreamToTargetEntity(InputStream, Type)
At NextcloudAPI.java:[line 142]
Unconstrained method com.nextcloud.android.sso.api.NextcloudAPI.convertStreamToTargetEntity(InputStream, Type) converts checked exception to unchecked
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.invoke(NextcloudAPI, Object[])
At NextcloudRetrofitServiceMethod.java:[line 134]
Method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.invoke(NextcloudAPI, Object[]) accesses list or array with constant index
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method new com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod(String, Method)
At NextcloudRetrofitServiceMethod.java:[line 98]
At NextcloudRetrofitServiceMethod.java:[line 98]
Exception thrown in class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod at new com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod(String, Method) will leave the constructor. The object under construction remains partially initialized and may be vulnerable to Finalizer attacks.
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method new com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod(String, Method)
Field com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.method
Local variable named method
At NextcloudRetrofitServiceMethod.java:[line 92]
new com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod(String, Method) may expose internal representation by storing an externally mutable object into NextcloudRetrofitServiceMethod.method
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.bodyToStream(RequestBody)
At NextcloudRetrofitServiceMethod.java:[line 259]
Unconstrained method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.bodyToStream(RequestBody) converts checked exception to unchecked
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.invoke(NextcloudAPI, Object[])
At NextcloudRetrofitServiceMethod.java:[line 217]
Method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.invoke(NextcloudAPI, Object[]) creates an anonymous lamda expression instead of specifying a method reference
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.invoke(NextcloudAPI, Object[])
At NextcloudRetrofitServiceMethod.java:[line 219]
Method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.invoke(NextcloudAPI, Object[]) creates an anonymous lamda expression instead of specifying a method reference
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.invoke(NextcloudAPI, Object[])
At NextcloudRetrofitServiceMethod.java:[line 227]
Method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.invoke(NextcloudAPI, Object[]) creates an anonymous lamda expression instead of specifying a method reference
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.invoke(NextcloudAPI, Object[])
At NextcloudRetrofitServiceMethod.java:[line 229]
Method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.invoke(NextcloudAPI, Object[]) creates an anonymous lamda expression instead of specifying a method reference
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.invoke(NextcloudAPI, Object[])
At NextcloudRetrofitServiceMethod.java:[line 135]
Method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.invoke(NextcloudAPI, Object[]) uses instanceof on multiple types to arbitrate logic
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.parseMethodAnnotation(Annotation)
At NextcloudRetrofitServiceMethod.java:[line 264]
Method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.parseMethodAnnotation(Annotation) uses instanceof on multiple types to arbitrate logic
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.invoke(NextcloudAPI, Object[])
At NextcloudRetrofitServiceMethod.java:[line 154]
Method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.invoke(NextcloudAPI, Object[]) manually casts the right hand side of an assignment more specifically than needed
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.parsePathParameters()
At NextcloudRetrofitServiceMethod.java:[line 350]
This method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.parsePathParameters() parses a String that is a field
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.parsePathParameters()
At NextcloudRetrofitServiceMethod.java:[line 353]
This method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.parsePathParameters() parses a String that is a field
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.parsePathParameters()
At NextcloudRetrofitServiceMethod.java:[line 370]
This method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.parsePathParameters() parses a String that is a field
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.parsePathParameters()
At NextcloudRetrofitServiceMethod.java:[line 350]
Method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.parsePathParameters() passes constant String of length 1 to character overridden method
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.parsePathParameters()
At NextcloudRetrofitServiceMethod.java:[line 365]
Method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.parsePathParameters() passes constant String of length 1 to character overridden method
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.parseHttpMethodAndPath(String, String, boolean)
Value Parameter 3: hasBody
At NextcloudRetrofitServiceMethod.java:[lines 303-314]
Static or private method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.parseHttpMethodAndPath(String, String, boolean) has unused parameters
In class com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod
In method com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.invoke(NextcloudAPI, Object[])
At NextcloudRetrofitServiceMethod.java:[line 156]
com.nextcloud.android.sso.api.NextcloudRetrofitServiceMethod.invoke(NextcloudAPI, Object[]) makes inefficient use of keySet iterator instead of entrySet iterator
In class com.nextcloud.android.sso.api.ParsedResponse
In method com.nextcloud.android.sso.api.ParsedResponse.getHeaders()
Field com.nextcloud.android.sso.api.ParsedResponse.headers
At ParsedResponse.java:[line 43]
com.nextcloud.android.sso.api.ParsedResponse.getHeaders() may expose internal representation by returning ParsedResponse.headers
In class com.nextcloud.android.sso.api.Response
In method com.nextcloud.android.sso.api.Response.getPlainHeaders()
Field com.nextcloud.android.sso.api.Response.headers
At Response.java:[line 25]
com.nextcloud.android.sso.api.Response.getPlainHeaders() may expose internal representation by returning Response.headers
In class com.nextcloud.android.sso.api.Response
In method new com.nextcloud.android.sso.api.Response(InputStream, ArrayList)
Field com.nextcloud.android.sso.api.Response.headers
Local variable named headers
At Response.java:[line 21]
new com.nextcloud.android.sso.api.Response(InputStream, ArrayList) may expose internal representation by storing an externally mutable object into Response.headers
In class com.nextcloud.android.sso.exceptions.SSOException
In method new com.nextcloud.android.sso.exceptions.SSOException(String, Integer, Integer, Intent, Throwable)
Field com.nextcloud.android.sso.exceptions.SSOException.actionIntent
Local variable named actionIntent
At SSOException.java:[line 66]
new com.nextcloud.android.sso.exceptions.SSOException(String, Integer, Integer, Intent, Throwable) may expose internal representation by storing an externally mutable object into SSOException.actionIntent
In class com.nextcloud.android.sso.helper.ExponentialBackoff
In method new com.nextcloud.android.sso.helper.ExponentialBackoff(long, long, int, int, Handler, Runnable, Runnable)
At ExponentialBackoff.java:[line 90]
At ExponentialBackoff.java:[line 90]
Exception thrown in class com.nextcloud.android.sso.helper.ExponentialBackoff at new com.nextcloud.android.sso.helper.ExponentialBackoff(long, long, int, int, Handler, Runnable, Runnable) will leave the constructor. The object under construction remains partially initialized and may be vulnerable to Finalizer attacks.
In class com.nextcloud.android.sso.helper.ExponentialBackoff
In method new com.nextcloud.android.sso.helper.ExponentialBackoff(long, long, int, int, Looper, Runnable, Runnable)
At ExponentialBackoff.java:[line 69]
At ExponentialBackoff.java:[line 69]
Exception thrown in class com.nextcloud.android.sso.helper.ExponentialBackoff at new com.nextcloud.android.sso.helper.ExponentialBackoff(long, long, int, int, Looper, Runnable, Runnable) will leave the constructor. The object under construction remains partially initialized and may be vulnerable to Finalizer attacks.
In class com.nextcloud.android.sso.helper.ExponentialBackoff
In method com.nextcloud.android.sso.helper.ExponentialBackoff.setHandlerAdapter(ExponentialBackoff$HandlerAdapter)
Field com.nextcloud.android.sso.helper.ExponentialBackoff.mHandlerAdapter
Local variable named a
At ExponentialBackoff.java:[line 151]
com.nextcloud.android.sso.helper.ExponentialBackoff.setHandlerAdapter(ExponentialBackoff$HandlerAdapter) may expose internal representation by storing an externally mutable object into ExponentialBackoff.mHandlerAdapter
In class com.nextcloud.android.sso.helper.ExponentialBackoff
In method com.nextcloud.android.sso.helper.ExponentialBackoff.notifyFailed(Exception)
At ExponentialBackoff.java:[line 119]
Value java.lang.Math.random()
This random generator (java.lang.Math.random()) is predictable
In class com.nextcloud.android.sso.helper.Retrofit2Helper
In method com.nextcloud.android.sso.helper.Retrofit2Helper.WrapInCall(NextcloudAPI, NextcloudRequest, Type)
At Retrofit2Helper.java:[line 44]
The method name com.nextcloud.android.sso.helper.Retrofit2Helper.WrapInCall(NextcloudAPI, NextcloudRequest, Type) doesn't start with a lower case letter
In class com.nextcloud.android.sso.helper.Retrofit2Helper
In method com.nextcloud.android.sso.helper.Retrofit2Helper.buildHeaders(List)
At Retrofit2Helper.java:[line 131]
Value 1st parameter 'plainHeaders' could be declared as java.util.Collection instead
com.nextcloud.android.sso.helper.Retrofit2Helper.buildHeaders(List): 1st parameter 'plainHeaders' could be declared as java.util.Collection instead
In class com.nextcloud.android.sso.helper.Retrofit2Helper
In method com.nextcloud.android.sso.helper.Retrofit2Helper.buildHeaders(List)
At Retrofit2Helper.java:[line 148]
Method com.nextcloud.android.sso.helper.Retrofit2Helper.buildHeaders(List) checks for an item in a set with contains, before using add()
In class com.nextcloud.android.sso.helper.SingleSignOnAccountLiveData
In method com.nextcloud.android.sso.helper.SingleSignOnAccountLiveData.lambda$postValueFromPreferences$1()
At SingleSignOnAccountLiveData.java:[line 71]
Method com.nextcloud.android.sso.helper.SingleSignOnAccountLiveData.lambda$postValueFromPreferences$1() prints the stack trace to the console
In class com.nextcloud.android.sso.model.SingleSignOnAccount
In method com.nextcloud.android.sso.model.SingleSignOnAccount.toString(SingleSignOnAccount)
Called method new String(byte[])
At SingleSignOnAccount.java:[line 56]
Found reliance on default encoding in com.nextcloud.android.sso.model.SingleSignOnAccount.toString(SingleSignOnAccount): new String(byte[])
In class com.nextcloud.android.sso.model.SingleSignOnAccount
Field com.nextcloud.android.sso.model.SingleSignOnAccount.serialVersionUID
In SingleSignOnAccount.java
Class com.nextcloud.android.sso.model.SingleSignOnAccount defines a computed serialVersionUID that doesn't equate to the calculated value
In class com.nextcloud.android.sso.model.SingleSignOnAccount
In method com.nextcloud.android.sso.model.SingleSignOnAccount.toString(SingleSignOnAccount)
Called method new String(byte[])
At SingleSignOnAccount.java:[line 56]
Method com.nextcloud.android.sso.model.SingleSignOnAccount.toString(SingleSignOnAccount) encodes String bytes without specifying the character encoding
In class com.nextcloud.android.sso.model.SingleSignOnAccount
In method com.nextcloud.android.sso.model.SingleSignOnAccount.fromString(String)
At SingleSignOnAccount.java:[line 44]
Object deserialization is used in com.nextcloud.android.sso.model.SingleSignOnAccount.fromString(String)
In class com.nextcloud.android.sso.model.ocs.OcsUser
In method com.nextcloud.android.sso.model.ocs.OcsUser.groups()
Field com.nextcloud.android.sso.model.ocs.OcsUser.groups
At OcsUser.java:[line 24]
com.nextcloud.android.sso.model.ocs.OcsUser.groups() may expose internal representation by returning OcsUser.groups
In class com.nextcloud.android.sso.model.ocs.OcsUser
In method new com.nextcloud.android.sso.model.ocs.OcsUser(boolean, String, long, OcsUser$OcsQuota, String, String, String, String, String, String, String[], String, String)
Field com.nextcloud.android.sso.model.ocs.OcsUser.groups
Local variable named groups
At OcsUser.java:[line 25]
new com.nextcloud.android.sso.model.ocs.OcsUser(boolean, String, long, OcsUser$OcsQuota, String, String, String, String, String, String, String[], String, String) may expose internal representation by storing an externally mutable object into OcsUser.groups
In class retrofit2.NextcloudRetrofitApiBuilder
In method retrofit2.NextcloudRetrofitApiBuilder.loadServiceMethod(Method)
Type java.util.concurrent.ConcurrentHashMap
Value loaded from field retrofit2.NextcloudRetrofitApiBuilder.serviceMethodCache
At NextcloudRetrofitApiBuilder.java:[line 44]
Synchronization performed on java.util.concurrent.ConcurrentHashMap in retrofit2.NextcloudRetrofitApiBuilder.loadServiceMethod(Method)