From c81b9463a6b243d6c9efdeb1fc9f358a30f2ce5c Mon Sep 17 00:00:00 2001 From: Julian Raufelder Date: Fri, 15 Jan 2021 20:39:46 +0100 Subject: [PATCH] Prepare for reproducible builds --- .../generator/IntentProcessor.java | 1 + .../generator/model/ActivitiesModel.java | 12 +-- .../generator/model/ActivityModel.java | 7 +- .../generator/model/FragmentModel.java | 7 +- .../generator/model/FragmentsModel.java | 12 +-- .../generator/model/InstanceStateModel.java | 18 +++-- .../generator/model/InstanceStatesModel.java | 4 +- .../generator/model/IntentBuilderModel.java | 43 +++++++--- .../generator/model/IntentReaderModel.java | 45 ++++++++--- .../generator/model/IntentsModel.java | 18 ++--- .../cryptomator/generator/utils/Method.java | 7 +- .../org/cryptomator/generator/utils/Type.java | 16 +++- msa-auth-for-android | 2 +- presentation/build.gradle | 10 ++- presentation/proguard-rules.pro | 81 ------------------- subsampling-scale-image-view | 2 +- 16 files changed, 144 insertions(+), 141 deletions(-) delete mode 100644 presentation/proguard-rules.pro diff --git a/generator/src/main/java/org/cryptomator/generator/IntentProcessor.java b/generator/src/main/java/org/cryptomator/generator/IntentProcessor.java index 87dc3dbd..3c25d90d 100644 --- a/generator/src/main/java/org/cryptomator/generator/IntentProcessor.java +++ b/generator/src/main/java/org/cryptomator/generator/IntentProcessor.java @@ -34,6 +34,7 @@ public class IntentProcessor extends BaseProcessor { intentsModelBuilder.add(generateIntentReader((TypeElement) element)); } if (!intentAnnotatedElements.isEmpty()) { + intentAnnotatedElements.sort((e1, e2) -> e1.getSimpleName().toString().compareTo(e2.getSimpleName().toString())); generateIntents(intentsModelBuilder.build(), intentAnnotatedElements); } } diff --git a/generator/src/main/java/org/cryptomator/generator/model/ActivitiesModel.java b/generator/src/main/java/org/cryptomator/generator/model/ActivitiesModel.java index 4a8187e6..d594ac97 100644 --- a/generator/src/main/java/org/cryptomator/generator/model/ActivitiesModel.java +++ b/generator/src/main/java/org/cryptomator/generator/model/ActivitiesModel.java @@ -1,21 +1,21 @@ package org.cryptomator.generator.model; -import java.util.ArrayList; -import java.util.List; +import java.util.Set; +import java.util.TreeSet; public class ActivitiesModel { - private final List activities; + private final Set activities; public static ActivitiesModel.Builder builder() { return new Builder(); } - private ActivitiesModel(List activities) { + private ActivitiesModel(Set activities) { this.activities = activities; } - public List getActivities() { + public Set getActivities() { return activities; } @@ -29,7 +29,7 @@ public class ActivitiesModel { public static class Builder { - private final List activities = new ArrayList<>(); + private final Set activities = new TreeSet<>(); private Builder() { } diff --git a/generator/src/main/java/org/cryptomator/generator/model/ActivityModel.java b/generator/src/main/java/org/cryptomator/generator/model/ActivityModel.java index c565f05a..4aac9b55 100644 --- a/generator/src/main/java/org/cryptomator/generator/model/ActivityModel.java +++ b/generator/src/main/java/org/cryptomator/generator/model/ActivityModel.java @@ -12,7 +12,7 @@ import javax.lang.model.element.TypeElement; import static java.util.stream.Collectors.toList; -public class ActivityModel { +public class ActivityModel implements Comparable { private final String qualifiedName; @@ -128,4 +128,9 @@ public class ActivityModel { public String getPresenterIntentFieldName() { return presenterIntentFieldName; } + + @Override + public int compareTo(ActivityModel activityModel) { + return this.qualifiedName.compareTo(activityModel.qualifiedName); + } } diff --git a/generator/src/main/java/org/cryptomator/generator/model/FragmentModel.java b/generator/src/main/java/org/cryptomator/generator/model/FragmentModel.java index b7f55631..d1d58aeb 100644 --- a/generator/src/main/java/org/cryptomator/generator/model/FragmentModel.java +++ b/generator/src/main/java/org/cryptomator/generator/model/FragmentModel.java @@ -6,7 +6,7 @@ import org.cryptomator.generator.utils.Type; import java.util.Optional; -public class FragmentModel { +public class FragmentModel implements Comparable { private final String qualifiedName; @@ -45,4 +45,9 @@ public class FragmentModel { public boolean isHasPresenter() { return hasPresenter; } + + @Override + public int compareTo(FragmentModel fragmentModel) { + return this.qualifiedName.compareTo(fragmentModel.qualifiedName); + } } diff --git a/generator/src/main/java/org/cryptomator/generator/model/FragmentsModel.java b/generator/src/main/java/org/cryptomator/generator/model/FragmentsModel.java index 7ca076f6..b4864115 100644 --- a/generator/src/main/java/org/cryptomator/generator/model/FragmentsModel.java +++ b/generator/src/main/java/org/cryptomator/generator/model/FragmentsModel.java @@ -1,21 +1,21 @@ package org.cryptomator.generator.model; -import java.util.ArrayList; -import java.util.List; +import java.util.Set; +import java.util.TreeSet; public class FragmentsModel { - private final List fragments; + private final Set fragments; public static FragmentsModel.Builder builder() { return new Builder(); } - private FragmentsModel(List fragments) { + private FragmentsModel(Set fragments) { this.fragments = fragments; } - public List getFragments() { + public Set getFragments() { return fragments; } @@ -29,7 +29,7 @@ public class FragmentsModel { public static class Builder { - private final List fragments = new ArrayList<>(); + private final Set fragments = new TreeSet<>(); private Builder() { } diff --git a/generator/src/main/java/org/cryptomator/generator/model/InstanceStateModel.java b/generator/src/main/java/org/cryptomator/generator/model/InstanceStateModel.java index 2e0f3f53..4d18696e 100644 --- a/generator/src/main/java/org/cryptomator/generator/model/InstanceStateModel.java +++ b/generator/src/main/java/org/cryptomator/generator/model/InstanceStateModel.java @@ -4,18 +4,18 @@ import org.cryptomator.generator.ProcessorException; import org.cryptomator.generator.utils.Field; import org.cryptomator.generator.utils.Type; -import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; -import java.util.List; import java.util.Map; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; import javax.lang.model.element.Element; public class InstanceStateModel { private final String javaPackage; - private final Map types = new HashMap<>(); + private final Map types = new TreeMap<>(); public InstanceStateModel(String javaPackage) { this.javaPackage = javaPackage; @@ -47,7 +47,7 @@ public class InstanceStateModel { public static class InstanceStateType { - private final List fields = new ArrayList<>(); + private final SortedSet fields = new TreeSet<>(); private final String qualifiedName; public InstanceStateType(Type type) { @@ -62,12 +62,12 @@ public class InstanceStateModel { return qualifiedName; } - public List getFields() { + public SortedSet getFields() { return fields; } } - public static class InstanceStateField { + public static class InstanceStateField implements Comparable { private static int nextBundleKey = 0; @@ -142,6 +142,10 @@ public class InstanceStateModel { return field.element(); } + @Override + public int compareTo(InstanceStateField instanceStateField) { + return this.bundleKey.compareTo(instanceStateField.bundleKey); + } } } diff --git a/generator/src/main/java/org/cryptomator/generator/model/InstanceStatesModel.java b/generator/src/main/java/org/cryptomator/generator/model/InstanceStatesModel.java index 41703b5b..6b628a5e 100644 --- a/generator/src/main/java/org/cryptomator/generator/model/InstanceStatesModel.java +++ b/generator/src/main/java/org/cryptomator/generator/model/InstanceStatesModel.java @@ -2,13 +2,13 @@ package org.cryptomator.generator.model; import org.cryptomator.generator.utils.Field; -import java.util.HashMap; import java.util.Map; +import java.util.TreeMap; import java.util.stream.Stream; public class InstanceStatesModel { - private final Map instanceStatesByPackage = new HashMap<>(); + private final Map instanceStatesByPackage = new TreeMap<>(); public void add(Field field) { String packageName = field.declaringType().packageName(); diff --git a/generator/src/main/java/org/cryptomator/generator/model/IntentBuilderModel.java b/generator/src/main/java/org/cryptomator/generator/model/IntentBuilderModel.java index e0c468cb..019c159b 100644 --- a/generator/src/main/java/org/cryptomator/generator/model/IntentBuilderModel.java +++ b/generator/src/main/java/org/cryptomator/generator/model/IntentBuilderModel.java @@ -3,9 +3,12 @@ package org.cryptomator.generator.model; import org.cryptomator.generator.Intent; import org.cryptomator.generator.Optional; -import java.util.List; +import java.util.Comparator; import java.util.Map; +import java.util.Set; +import java.util.TreeSet; import java.util.function.Predicate; +import java.util.stream.Collectors; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; @@ -14,16 +17,15 @@ import javax.lang.model.element.TypeElement; import javax.lang.model.type.DeclaredType; import static java.lang.Character.toLowerCase; -import static java.util.stream.Collectors.toList; -public class IntentBuilderModel { +public class IntentBuilderModel implements Comparable { private final String javaPackage; private final String className; private final String targetActivity; private final String targetActivitySimpleName; private final String buildMethodName; - private final List parameters; + private final Set parameters; public IntentBuilderModel(TypeElement type) { this.javaPackage = javaPackage(type); @@ -47,9 +49,21 @@ public class IntentBuilderModel { } private static String targetActivity(TypeElement type) { - return type.getAnnotationMirrors().stream().filter(is(Intent.class)).findFirst().get().getElementValues().entrySet().stream().map(entry -> (Map.Entry) entry) - .filter(entry -> "value".equals(entry.getKey().getSimpleName().toString())).map(Map.Entry::getValue).map(AnnotationValue::getValue).map(DeclaredType.class::cast).map(DeclaredType::asElement) - .map(TypeElement.class::cast).findFirst().get().getQualifiedName().toString(); + return type // + .getAnnotationMirrors() // + .stream() // + .filter(is(Intent.class)) // + .findFirst().get().getElementValues().entrySet() // + .stream() // + .map(entry -> (Map.Entry) entry) // + .filter(entry -> "value".equals(entry.getKey().getSimpleName().toString())) // + .map(Map.Entry::getValue) // + .map(AnnotationValue::getValue) // + .map(DeclaredType.class::cast) // + .map(DeclaredType::asElement) // + .map(TypeElement.class::cast) // + .findFirst().get() // + .getQualifiedName().toString(); } private static Predicate is(Class type) { @@ -66,8 +80,14 @@ public class IntentBuilderModel { return toLowerCase(name.charAt(0)) + name.substring(1); } - private static List parameters(TypeElement type) { - return type.getEnclosedElements().stream().filter(ExecutableElement.class::isInstance).map(ExecutableElement.class::cast).map(ParameterModel::new).collect(toList()); + private static Set parameters(TypeElement type) { + return type // + .getEnclosedElements() // + .stream() // + .filter(ExecutableElement.class::isInstance) // + .map(ExecutableElement.class::cast) // + .map(ParameterModel::new) // + .collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(ParameterModel::getName)))); } private static String buildMethodName(TypeElement type) { @@ -101,6 +121,11 @@ public class IntentBuilderModel { return buildMethodName; } + @Override + public int compareTo(IntentBuilderModel intentBuilderModel) { + return (this.javaPackage + this.className).compareTo(intentBuilderModel.javaPackage + intentBuilderModel.className); + } + public static class ParameterModel { private final String nameWithFirstCharUppercase; diff --git a/generator/src/main/java/org/cryptomator/generator/model/IntentReaderModel.java b/generator/src/main/java/org/cryptomator/generator/model/IntentReaderModel.java index 62c59abf..7e3095dd 100644 --- a/generator/src/main/java/org/cryptomator/generator/model/IntentReaderModel.java +++ b/generator/src/main/java/org/cryptomator/generator/model/IntentReaderModel.java @@ -3,9 +3,12 @@ package org.cryptomator.generator.model; import org.cryptomator.generator.Intent; import org.cryptomator.generator.Optional; -import java.util.List; +import java.util.Comparator; import java.util.Map; +import java.util.Set; +import java.util.TreeSet; import java.util.function.Predicate; +import java.util.stream.Collectors; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.AnnotationValue; @@ -13,16 +16,14 @@ import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.lang.model.type.DeclaredType; -import static java.util.stream.Collectors.toList; - -public class IntentReaderModel { +public class IntentReaderModel implements Comparable { private final String javaPackage; private final String className; private final String targetActivity; private final String intentInterface; private final String readMethodName; - private final List parameters; + private final Set parameters; public IntentReaderModel(TypeElement type) { this.intentInterface = type.getQualifiedName().toString(); @@ -46,9 +47,22 @@ public class IntentReaderModel { } private static String targetActivity(TypeElement type) { - return type.getAnnotationMirrors().stream().filter(is(Intent.class)).findFirst().get().getElementValues().entrySet().stream().map(entry -> (Map.Entry) entry) - .filter(entry -> "value".equals(entry.getKey().getSimpleName().toString())).map(Map.Entry::getValue).map(AnnotationValue::getValue).map(DeclaredType.class::cast).map(DeclaredType::asElement) - .map(TypeElement.class::cast).findFirst().get().getQualifiedName().toString(); + return type // + .getAnnotationMirrors() // + .stream() // + .filter(is(Intent.class)) // + .findFirst().get().getElementValues().entrySet() // + .stream() // + .map(entry -> (Map.Entry) entry) // + .filter(entry -> "value".equals(entry.getKey().getSimpleName().toString())) // + .map(Map.Entry::getValue) // + .map(AnnotationValue::getValue) // + .map(DeclaredType.class::cast) // + .map(DeclaredType::asElement) // + .map(TypeElement.class::cast) // + .findFirst().get() // + .getQualifiedName() // + .toString(); } private static Predicate is(Class type) { @@ -59,8 +73,14 @@ public class IntentReaderModel { }; } - private static List parameters(TypeElement type) { - return type.getEnclosedElements().stream().filter(ExecutableElement.class::isInstance).map(ExecutableElement.class::cast).map(ParameterModel::new).collect(toList()); + private static Set parameters(TypeElement type) { + return type // + .getEnclosedElements() // + .stream() // + .filter(ExecutableElement.class::isInstance) // + .map(ExecutableElement.class::cast) // + .map(ParameterModel::new) // + .collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(ParameterModel::getName)))); } private static String readMethodName(TypeElement type) { @@ -94,6 +114,11 @@ public class IntentReaderModel { return readMethodName; } + @Override + public int compareTo(IntentReaderModel intentReaderModel) { + return (this.javaPackage + this.className).compareTo(intentReaderModel.javaPackage + intentReaderModel.className); + } + public static class ParameterModel { private final String name; diff --git a/generator/src/main/java/org/cryptomator/generator/model/IntentsModel.java b/generator/src/main/java/org/cryptomator/generator/model/IntentsModel.java index 13fe9129..af384366 100644 --- a/generator/src/main/java/org/cryptomator/generator/model/IntentsModel.java +++ b/generator/src/main/java/org/cryptomator/generator/model/IntentsModel.java @@ -1,27 +1,27 @@ package org.cryptomator.generator.model; -import java.util.ArrayList; -import java.util.List; +import java.util.Set; +import java.util.TreeSet; public class IntentsModel { - private final List builders; - private final List readers; + private final Set builders; + private final Set readers; public static IntentsModel.Builder builder() { return new Builder(); } - private IntentsModel(List builders, List readers) { + private IntentsModel(Set builders, Set readers) { this.builders = builders; this.readers = readers; } - public List getBuilders() { + public Set getBuilders() { return builders; } - public List getReaders() { + public Set getReaders() { return readers; } @@ -35,8 +35,8 @@ public class IntentsModel { public static class Builder { - private final List builders = new ArrayList<>(); - private final List readers = new ArrayList<>(); + private final Set builders = new TreeSet<>(); + private final Set readers = new TreeSet<>(); private Builder() { } diff --git a/generator/src/main/java/org/cryptomator/generator/utils/Method.java b/generator/src/main/java/org/cryptomator/generator/utils/Method.java index 4966517f..82eb56db 100644 --- a/generator/src/main/java/org/cryptomator/generator/utils/Method.java +++ b/generator/src/main/java/org/cryptomator/generator/utils/Method.java @@ -9,7 +9,7 @@ import javax.lang.model.element.Modifier; import javax.lang.model.element.TypeElement; import javax.lang.model.type.TypeKind; -public class Method { +public class Method implements Comparable { private final Utils utils; private final ExecutableElement delegate; @@ -75,4 +75,9 @@ public class Method { public Type declaringType() { return new Type(utils, (TypeElement) delegate.getEnclosingElement()); } + + @Override + public int compareTo(Method method) { + return this.delegate.getSimpleName().toString().compareTo(method.delegate.getSimpleName().toString()); + } } diff --git a/generator/src/main/java/org/cryptomator/generator/utils/Type.java b/generator/src/main/java/org/cryptomator/generator/utils/Type.java index 61f115d4..884b1a9f 100644 --- a/generator/src/main/java/org/cryptomator/generator/utils/Type.java +++ b/generator/src/main/java/org/cryptomator/generator/utils/Type.java @@ -14,7 +14,7 @@ import static javax.lang.model.element.ElementKind.FIELD; import static javax.lang.model.type.TypeKind.ARRAY; import static javax.lang.model.type.TypeKind.NONE; -public class Type { +public class Type implements Comparable { private final TypeMirror mirror; private final Optional element; @@ -89,6 +89,7 @@ public class Type { return element // .map(type -> type.getEnclosedElements().stream() // .filter(ExecutableElement.class::isInstance) // + .sorted((e1, e2) -> e1.getSimpleName().toString().compareTo(e2.getSimpleName().toString())) // .map(ExecutableElement.class::cast) // .filter(Method::isConstructor) // .map(executableElement -> new Method(utils, executableElement))) @@ -99,20 +100,22 @@ public class Type { return element // .map(type -> type.getEnclosedElements().stream() // .filter(ExecutableElement.class::isInstance) // + .sorted((e1, e2) -> e1.getSimpleName().toString().compareTo(e2.getSimpleName().toString())) // .map(ExecutableElement.class::cast) // .filter(Method::isRegularMethod) // .map(executableElement -> new Method(utils, executableElement))) - .orElse(Stream.empty()); // + .orElse(Stream.empty()); } public Stream fields() { return element // .map(type -> type.getEnclosedElements().stream() // .filter(VariableElement.class::isInstance) // + .sorted((e1, e2) -> e1.getSimpleName().toString().compareTo(e2.getSimpleName().toString())) // .map(VariableElement.class::cast) // .filter(variable -> variable.getKind() == FIELD) // - .map(variableElement -> new Field(utils, variableElement))) - .orElse(Stream.empty()); // + .map(variableElement -> new Field(utils, variableElement))) // + .orElse(Stream.empty()); } @Override @@ -133,6 +136,11 @@ public class Type { return mirror.hashCode(); } + @Override + public int compareTo(Type type) { + return this.qualifiedName().compareTo(type.qualifiedName()); + } + public Optional enclosingType() { if (mirror instanceof DeclaredType) { return Optional.ofNullable(((DeclaredType) mirror).getEnclosingType()) // diff --git a/msa-auth-for-android b/msa-auth-for-android index eca34e84..fe4e0458 160000 --- a/msa-auth-for-android +++ b/msa-auth-for-android @@ -1 +1 @@ -Subproject commit eca34e843a1ca2d7953f0d7c22efe72572ce7dc1 +Subproject commit fe4e04589043cb18011cae80aec7eab09b46ed44 diff --git a/presentation/build.gradle b/presentation/build.gradle index 9e7a81b7..cc4353e9 100644 --- a/presentation/build.gradle +++ b/presentation/build.gradle @@ -47,12 +47,18 @@ android { buildTypes { release { - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + crunchPngs false + minifyEnabled false + shrinkResources false + useProguard false } debug { signingConfig signingConfigs.debug + + crunchPngs false + minifyEnabled false + shrinkResources false testCoverageEnabled false } } diff --git a/presentation/proguard-rules.pro b/presentation/proguard-rules.pro deleted file mode 100644 index 8702417d..00000000 --- a/presentation/proguard-rules.pro +++ /dev/null @@ -1,81 +0,0 @@ --useuniqueclassmembernames - -# greenDAO 3, http://greenrobot.org/greendao/documentation/technical-faq --keepclassmembers class * extends org.greenrobot.greendao.AbstractDao { - public static java.lang.String TABLENAME; -} --keep class **$Properties {*;} --dontwarn org.greenrobot.greendao.database.** --dontwarn net.sqlcipher.database.** --dontwarn rx.** - -# RxJava, https://github.com/artem-zinnatullin/RxJavaProGuardRules/blob/master/rxjava-proguard-rules/proguard-rules.txt --dontwarn sun.misc.** --keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* { - long producerIndex; - long consumerIndex; -} --keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef { - rx.internal.util.atomic.LinkedQueueNode producerNode; -} --keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef { - rx.internal.util.atomic.LinkedQueueNode consumerNode; -} - -# Google API Client, https://github.com/google/google-api-java-client/blob/dev/google-api-client-assembly/proguard-google-api-client.txt --keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault --keepclassmembers class * { - @com.google.api.client.util.Key ; -} --dontwarn com.google.api.client.extensions.android.** --dontwarn com.google.api.client.googleapis.extensions.android.** --dontwarn com.google.api.client.googleapis.testing.TestUtils --dontwarn com.google.android.gms.** - -# okhttp3 --dontwarn okhttp3.** --dontwarn okio.** - -# Others --dontwarn org.slf4j.** --dontwarn com.dropbox.core.** --dontwarn com.fernandocejas.frodo.core.** --dontwarn com.google.errorprone.annotations.** --dontwarn com.google.common.util.concurrent.FuturesGetChecked** --keepclassmembers class com.microsoft.graph.http.GraphServiceException { - int mResponseCode; -} --keep class com.nulabinc.zxcvbn.** - -# https://stackoverflow.com/a/47555897/1759462 --dontwarn afu.org.checkerframework.** --dontwarn org.checkerframework.** - -# https://github.com/microsoftgraph/msgraph-sdk-java/issues/258#issue-452030712 --keep class com.microsoft.** { *; } --keep class com.microsoft.** --keep interface com.microsoft.** { *; } --keepclasseswithmembernames class com.microsoft.** { *; } - --keep class com.sun.** { *; } --keep class com.sun.** --keep interface com.sun.** { *; } - -# https://github.com/jwtk/jjwt --keepattributes InnerClasses - --keep class io.jsonwebtoken.** { *; } --keepnames class io.jsonwebtoken.* { *; } --keepnames interface io.jsonwebtoken.* { *; } - --keep class org.bouncycastle.** { *; } --keepnames class org.bouncycastle.** { *; } --dontwarn org.bouncycastle.** - --keep class android.net.http.** { *; } --keep interface org.apache.** { *; } --keep enum org.apache.** { *; } --keep class org.apache.** { *; } --keep class org.apache.commons.** { *; } --keep class org.apache.http.** { *; } --keep class org.apache.harmony.** {*;} diff --git a/subsampling-scale-image-view b/subsampling-scale-image-view index 951e3924..c3c247b6 160000 --- a/subsampling-scale-image-view +++ b/subsampling-scale-image-view @@ -1 +1 @@ -Subproject commit 951e3924349ec1607ed06663d32ec918abf09076 +Subproject commit c3c247b63cb72a4f7f9ddc3272820e1ce636e56d