diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e34cb55eb..76782dea9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -40,13 +40,13 @@ test_lint_pmd_checkstyle: - sed -i -e 's,textReport .*,textReport true,' app/build.gradle - ./gradlew testFullDebugUnitTest - ./gradlew lint - - ./gradlew pmd || export EXITVALUE=1 - - ./gradlew checkstyle || export EXITVALUE=1 - - ./tools/check-format-strings.py || export EXITVALUE=1 - - ./tools/check-fastlane-whitespace.py || export EXITVALUE=1 - - ./tools/remove-unused-and-blank-translations.py || export EXITVALUE=1 + - ./gradlew pmd || (export EXITVALUE=1; echo ERROR !!) + - ./gradlew checkstyle || (export EXITVALUE=1; echo ERROR !!) + - ./tools/check-format-strings.py || (export EXITVALUE=1; echo ERROR !!) + - ./tools/check-fastlane-whitespace.py || (export EXITVALUE=1; echo ERROR !!) + - ./tools/remove-unused-and-blank-translations.py || (export EXITVALUE=1; echo ERROR !!) - echo "These are unused or blank translations that should be removed:" - - git --no-pager diff --ignore-all-space --name-only --exit-code app/src/*/res/values*/strings.xml || export EXITVALUE=1 + - git --no-pager diff --ignore-all-space --name-only --exit-code app/src/*/res/values*/strings.xml || (export EXITVALUE=1; echo ERROR !!) - exit $EXITVALUE errorprone: diff --git a/app/build.gradle b/app/build.gradle index 2b189c60b..845e3dd7f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' apply plugin: 'checkstyle' apply plugin: 'pmd' -/* gets the version name from the latest Git tag, stripping the leading v off */ +/* gets the version name from the latest Git tag */ def getVersionName = { -> def stdout = new ByteArrayOutputStream() exec { @@ -192,7 +192,7 @@ task checkstyle(type: Checkstyle) { } pmd { - toolVersion = '5.5.1' + toolVersion = '6.20.0' consoleOutput = true } @@ -202,7 +202,6 @@ task pmdMain(type: Pmd) { ruleSets = [] // otherwise defaults clash with the list in rules.xml source 'src/main/java' include '**/*.java' - exclude '**/kellinwood/**/*.java' } task pmdTest(type: Pmd) { diff --git a/app/src/androidTest/java/org/fdroid/fdroid/Netstat.java b/app/src/androidTest/java/org/fdroid/fdroid/Netstat.java index d7836f50d..dbd10ccb1 100644 --- a/app/src/androidTest/java/org/fdroid/fdroid/Netstat.java +++ b/app/src/androidTest/java/org/fdroid/fdroid/Netstat.java @@ -123,7 +123,7 @@ public class Netstat { try { BufferedReader in = new BufferedReader(new FileReader("/proc/net/tcp")); String line; - while ((line = in.readLine()) != null) { + while ((line = in.readLine()) != null) { // NOPMD Matcher matcher = NET_PATTERN.matcher(line); if (matcher.find()) { final Connection c = new Connection(); @@ -156,7 +156,7 @@ public class Netstat { try { BufferedReader in = new BufferedReader(new FileReader("/proc/net/udp")); String line; - while ((line = in.readLine()) != null) { + while ((line = in.readLine()) != null) { // NOPMD Matcher matcher = NET_PATTERN.matcher(line); if (matcher.find()) { final Connection c = new Connection(); @@ -189,7 +189,7 @@ public class Netstat { try { BufferedReader in = new BufferedReader(new FileReader("/proc/net/raw")); String line; - while ((line = in.readLine()) != null) { + while ((line = in.readLine()) != null) { // NOPMD Matcher matcher = NET_PATTERN.matcher(line); if (matcher.find()) { final Connection c = new Connection(); diff --git a/app/src/main/java/org/fdroid/fdroid/Hasher.java b/app/src/main/java/org/fdroid/fdroid/Hasher.java index 4f4e34abc..ade76c33f 100644 --- a/app/src/main/java/org/fdroid/fdroid/Hasher.java +++ b/app/src/main/java/org/fdroid/fdroid/Hasher.java @@ -68,7 +68,7 @@ public class Hasher { InputStream input = null; try { input = new BufferedInputStream(new FileInputStream(file)); - while ((read = input.read(buffer)) > 0) { + while ((read = input.read(buffer)) > 0) { // NOPMD Avoid assignments in operands digest.update(buffer, 0, read); } } catch (Exception e) { diff --git a/app/src/main/java/org/fdroid/fdroid/NotificationHelper.java b/app/src/main/java/org/fdroid/fdroid/NotificationHelper.java index d9c1c7377..27c7525e9 100644 --- a/app/src/main/java/org/fdroid/fdroid/NotificationHelper.java +++ b/app/src/main/java/org/fdroid/fdroid/NotificationHelper.java @@ -199,7 +199,7 @@ class NotificationHelper { Notification notification; if (updates.size() != 1 || useStackedNotifications()) { - if (updates.size() == 0) { + if (updates.isEmpty()) { // No updates, remove summary notificationManager.cancel(GROUP_UPDATES, NOTIFY_ID_UPDATES); } else { @@ -208,7 +208,7 @@ class NotificationHelper { } } if (installed.size() != 1 || useStackedNotifications()) { - if (installed.size() == 0) { + if (installed.isEmpty()) { // No installed, remove summary notificationManager.cancel(GROUP_INSTALLED, NOTIFY_ID_INSTALLED); } else { diff --git a/app/src/main/java/org/fdroid/fdroid/Provisioner.java b/app/src/main/java/org/fdroid/fdroid/Provisioner.java index 26782111f..2ae8d49bb 100644 --- a/app/src/main/java/org/fdroid/fdroid/Provisioner.java +++ b/app/src/main/java/org/fdroid/fdroid/Provisioner.java @@ -64,8 +64,8 @@ public class Provisioner { List plaintexts = p.extractProvisionsPlaintext(files); List provisions = p.parseProvisions(plaintexts); - if (provisions == null || provisions.size() == 0) { - Utils.debugLog(TAG, "Provision dir does not contain any provisions: '" + provisionDir.getAbsolutePath() + "' moving on ..."); + if (provisions == null || provisions.isEmpty()) { + Utils.debugLog(TAG, "Provision dir is empty: '" + provisionDir.getAbsolutePath() + "' moving on ..."); } else { int cleanupCounter = 0; for (Provision provision : provisions) { @@ -173,7 +173,7 @@ public class Provisioner { try { in = new ZipInputStream(new FileInputStream(file)); ZipEntry zipEntry; - while ((zipEntry = in.getNextEntry()) != null) { + while ((zipEntry = in.getNextEntry()) != null) { // NOPMD Avoid assignments in operands String name = zipEntry.getName(); if ("repo_provision.json".equals(name)) { if (plain.getRepositoryProvision() != null) { diff --git a/app/src/main/java/org/fdroid/fdroid/Utils.java b/app/src/main/java/org/fdroid/fdroid/Utils.java index fe38e0cc1..e1bcba986 100644 --- a/app/src/main/java/org/fdroid/fdroid/Utils.java +++ b/app/src/main/java/org/fdroid/fdroid/Utils.java @@ -524,7 +524,7 @@ public final class Utils { byte[] dataBytes = new byte[8192]; int nread; - while ((nread = bis.read(dataBytes)) != -1) { + while ((nread = bis.read(dataBytes)) != -1) { // NOPMD Avoid assignments in operands md.update(dataBytes, 0, nread); } diff --git a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java index d7188b48e..f5e31d7e1 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/AppProvider.java @@ -638,7 +638,7 @@ public class AppProvider extends FDroidProvider { // Put in a Set to remove duplicates final Set keywordSet = new HashSet<>(Arrays.asList(query.split("\\s"))); - if (keywordSet.size() == 0) { + if (keywordSet.isEmpty()) { return new AppQuerySelection(); } diff --git a/app/src/main/java/org/fdroid/fdroid/data/FDroidProvider.java b/app/src/main/java/org/fdroid/fdroid/data/FDroidProvider.java index 4e561c407..1b4567ae3 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/FDroidProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/FDroidProvider.java @@ -27,7 +27,7 @@ public abstract class FDroidProvider extends ContentProvider { static final int CODE_LIST = 1; static final int CODE_SINGLE = 2; - private boolean isApplyingBatch; + private boolean applyingBatch; protected abstract String getTableName(); @@ -47,7 +47,7 @@ public abstract class FDroidProvider extends ContentProvider { * Based on http://stackoverflow.com/a/15886915. */ protected final boolean isApplyingBatch() { - return this.isApplyingBatch; + return this.applyingBatch; } @NonNull @@ -55,7 +55,7 @@ public abstract class FDroidProvider extends ContentProvider { public ContentProviderResult[] applyBatch(@NonNull ArrayList operations) throws OperationApplicationException { ContentProviderResult[] result = null; - isApplyingBatch = true; + applyingBatch = true; final SQLiteDatabase db = db(); db.beginTransaction(); try { @@ -63,7 +63,7 @@ public abstract class FDroidProvider extends ContentProvider { db.setTransactionSuccessful(); } finally { db.endTransaction(); - isApplyingBatch = false; + applyingBatch = false; } return result; } diff --git a/app/src/main/java/org/fdroid/fdroid/data/QueryBuilder.java b/app/src/main/java/org/fdroid/fdroid/data/QueryBuilder.java index d74e560d9..5e78883ae 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/QueryBuilder.java +++ b/app/src/main/java/org/fdroid/fdroid/data/QueryBuilder.java @@ -143,7 +143,7 @@ abstract class QueryBuilder { } private String orderBySql() { - if (orderBys.size() == 0) { + if (orderBys.isEmpty()) { return ""; } return " ORDER BY " + TextUtils.join(", ", orderBys); diff --git a/app/src/main/java/org/fdroid/fdroid/data/RepoPersister.java b/app/src/main/java/org/fdroid/fdroid/data/RepoPersister.java index 0554f9ae9..019b73c46 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/RepoPersister.java +++ b/app/src/main/java/org/fdroid/fdroid/data/RepoPersister.java @@ -182,12 +182,12 @@ public class RepoPersister { private void calcApkCompatibilityFlags(List apks) { for (final Apk apk : apks) { final List reasons = checker.getIncompatibleReasons(apk); - if (reasons.size() > 0) { - apk.compatible = false; - apk.incompatibleReasons = reasons.toArray(new String[reasons.size()]); - } else { + if (reasons.isEmpty()) { apk.compatible = true; apk.incompatibleReasons = null; + } else { + apk.compatible = false; + apk.incompatibleReasons = reasons.toArray(new String[reasons.size()]); } } } diff --git a/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java b/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java index 9e769d4e8..f5ec2803c 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java +++ b/app/src/main/java/org/fdroid/fdroid/data/RepoProvider.java @@ -80,7 +80,7 @@ public class RepoProvider extends FDroidProvider { boolean haveTriedWithoutPath = false; while (repo == null && !haveTriedWithoutPath) { - if (pathSegments.size() == 0) { + if (pathSegments.isEmpty()) { haveTriedWithoutPath = true; } else { pathSegments.remove(pathSegments.size() - 1); @@ -99,7 +99,11 @@ public class RepoProvider extends FDroidProvider { String address, String[] projection) { List repos = findBy( context, Cols.ADDRESS, address, projection); - return repos.size() > 0 ? repos.get(0) : null; + if (repos.isEmpty()) { + return null; + } else { + return repos.get(0); + } } public static List all(Context context) { diff --git a/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java b/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java index 499ef8571..81832ddb0 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java +++ b/app/src/main/java/org/fdroid/fdroid/views/AppDetailsRecyclerViewAdapter.java @@ -153,13 +153,13 @@ public class AppDetailsRecyclerViewAdapter addItem(VIEWTYPE_DONATE); addItem(VIEWTYPE_LINKS); addItem(VIEWTYPE_PERMISSIONS); - if (versions.size() > 0) { + if (versions.isEmpty()) { + addItem(VIEWTYPE_NO_VERSIONS); + } else { addItem(VIEWTYPE_VERSIONS); if (showVersions) { setShowVersions(true); } - } else { - addItem(VIEWTYPE_NO_VERSIONS); } notifyDataSetChanged(); @@ -563,7 +563,7 @@ public class AppDetailsRecyclerViewAdapter updateAntiFeaturesWarning(); buttonPrimaryView.setText(R.string.menu_install); - buttonPrimaryView.setVisibility(versions.size() > 0 ? View.VISIBLE : View.GONE); + buttonPrimaryView.setVisibility(versions.isEmpty() ? View.GONE : View.VISIBLE); buttonSecondaryView.setText(R.string.menu_uninstall); buttonSecondaryView.setVisibility(app.isUninstallable(context) ? View.VISIBLE : View.INVISIBLE); buttonSecondaryView.setOnClickListener(new View.OnClickListener() { diff --git a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemState.java b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemState.java index 464626fe2..4eaa14e82 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemState.java +++ b/app/src/main/java/org/fdroid/fdroid/views/apps/AppListItemState.java @@ -21,7 +21,7 @@ public class AppListItemState { private int progressMax = -1; private boolean showInstallButton; private boolean showCheckBox; - private boolean isCheckBoxChecked; + private boolean checkBoxChecked; public AppListItemState(@NonNull App app) { this.app = app; @@ -124,7 +124,7 @@ public class AppListItemState { } public boolean isCheckBoxChecked() { - return isCheckBoxChecked; + return checkBoxChecked; } /** @@ -133,7 +133,7 @@ public class AppListItemState { */ public AppListItemState setCheckBoxStatus(boolean checked) { this.showCheckBox = true; - this.isCheckBoxChecked = checked; + this.checkBoxChecked = checked; return this; } diff --git a/app/src/main/java/org/fdroid/fdroid/views/updates/items/AppUpdateData.java b/app/src/main/java/org/fdroid/fdroid/views/updates/items/AppUpdateData.java index ff377d762..303319e61 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/updates/items/AppUpdateData.java +++ b/app/src/main/java/org/fdroid/fdroid/views/updates/items/AppUpdateData.java @@ -9,7 +9,7 @@ import android.app.Activity; * org.fdroid.fdroid.views.updates.UpdatesAdapter#delegatesManager} * to specify a data type more specific than just {@link Object}. */ -public abstract class AppUpdateData { +public abstract class AppUpdateData { // NOPMD This abstract class does not have any abstract methods public final Activity activity; public AppUpdateData(Activity activity) { diff --git a/app/src/test/java/org/fdroid/fdroid/data/FDroidProviderTest.java b/app/src/test/java/org/fdroid/fdroid/data/FDroidProviderTest.java index 54c3b5f9e..d2335811d 100644 --- a/app/src/test/java/org/fdroid/fdroid/data/FDroidProviderTest.java +++ b/app/src/test/java/org/fdroid/fdroid/data/FDroidProviderTest.java @@ -9,7 +9,7 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.shadows.ShadowContentResolver; -public abstract class FDroidProviderTest { +public abstract class FDroidProviderTest { // NOPMD This abstract class does not have any abstract methods protected ShadowContentResolver contentResolver; protected ContextWrapper context; diff --git a/app/src/test/java/org/fdroid/fdroid/data/RepoXMLHandlerTest.java b/app/src/test/java/org/fdroid/fdroid/data/RepoXMLHandlerTest.java index 2754014d0..6221eb5c8 100644 --- a/app/src/test/java/org/fdroid/fdroid/data/RepoXMLHandlerTest.java +++ b/app/src/test/java/org/fdroid/fdroid/data/RepoXMLHandlerTest.java @@ -840,7 +840,7 @@ public class RepoXMLHandlerTest { for (App app : apps) { if (expectedAntiFeatures.containsKey(app.packageName)) { List antiFeatures = expectedAntiFeatures.get(app.packageName); - if (antiFeatures.size() == 0) { + if (antiFeatures.isEmpty()) { assertNull(app.antiFeatures); } else { List actualAntiFeatures = new ArrayList<>(); diff --git a/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java b/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java index dfda5d5f3..cd1267787 100644 --- a/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java +++ b/app/src/test/java/org/fdroid/fdroid/updater/IndexV1UpdaterTest.java @@ -423,7 +423,7 @@ public class IndexV1UpdaterTest extends FDroidProviderTest { for (String field : allowed) { fields.remove(field); } - if (fields.size() > 0) { + if (!fields.isEmpty()) { String sb = String.valueOf(instance.getClass()) + " has fields not setup for Jackson: " + TextUtils.join(", ", fields) + "\nRead class javadoc for more info."; fail(sb); diff --git a/app/src/test/java/org/fdroid/fdroid/updater/Issue763MultiRepo.java b/app/src/test/java/org/fdroid/fdroid/updater/Issue763MultiRepo.java index 277d521ca..f82744560 100644 --- a/app/src/test/java/org/fdroid/fdroid/updater/Issue763MultiRepo.java +++ b/app/src/test/java/org/fdroid/fdroid/updater/Issue763MultiRepo.java @@ -35,7 +35,7 @@ public class Issue763MultiRepo extends MultiIndexUpdaterTest { } @Test - public void antoxRepo() throws IndexUpdater.UpdateException { + public void testAntoxRepo() throws IndexUpdater.UpdateException { assertAntoxEmpty(); setEnabled(microGRepo, true); updateAntox(); @@ -47,7 +47,7 @@ public class Issue763MultiRepo extends MultiIndexUpdaterTest { } @Test - public void microGRepo() throws IndexUpdater.UpdateException { + public void testMicroGRepo() throws IndexUpdater.UpdateException { assertMicroGEmpty(); setEnabled(microGRepo, true); updateMicroG(); diff --git a/build.gradle b/build.gradle index 30be214f4..1207b89b5 100644 --- a/build.gradle +++ b/build.gradle @@ -1,15 +1,17 @@ buildscript { repositories { + mavenCentral() maven { url 'https://maven.google.com/' } // :-| must be before jcenter() - jcenter() + jcenter() // download from jCenter as last resort https://blog.autsoft.hu/a-confusing-dependency } dependencies { - classpath 'com.android.tools.build:gradle:3.1.1' + classpath 'com.android.tools.build:gradle:3.1.4' } } allprojects { repositories { + mavenCentral() maven { url 'https://maven.google.com/' } // :-| must be before jcenter() - jcenter() + jcenter() // download from jCenter as last resort https://blog.autsoft.hu/a-confusing-dependency } } diff --git a/config/pmd/rules-main.xml b/config/pmd/rules-main.xml index 5b33b45d8..81d6ca133 100644 --- a/config/pmd/rules-main.xml +++ b/config/pmd/rules-main.xml @@ -1,9 +1,13 @@ + xmlns="http://pmd.sf.net/ruleset/1.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd" + xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"> + + Rules for the project code aka "main". + + + - diff --git a/config/pmd/rules-test.xml b/config/pmd/rules-test.xml index 0889f5bcf..1d9d81a86 100644 --- a/config/pmd/rules-test.xml +++ b/config/pmd/rules-test.xml @@ -1,11 +1,17 @@ + xmlns="http://pmd.sf.net/ruleset/1.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd" + xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"> + + Rules for the test harness code aka "androidTest" and "test". + + + + + + + - - - diff --git a/config/pmd/rules.xml b/config/pmd/rules.xml index e9a161577..64b55aa49 100644 --- a/config/pmd/rules.xml +++ b/config/pmd/rules.xml @@ -1,52 +1,52 @@ + xmlns="http://pmd.sf.net/ruleset/1.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd" + xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd"> + + Rules for the whole project + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +