Kaynağa Gözat

Merge pull request #9 from MrOzOn/homework_proguard

Homework on the topic proguard
MrOzOn 5 yıl önce
ebeveyn
işleme
f65e63767c
36 değiştirilmiş dosya ile 2586 ekleme ve 19 silme
  1. 7 0
      Dockerfile
  2. 61 0
      Jenkinsfile
  3. 1 0
      app/.gitignore
  4. 43 4
      app/build.gradle
  5. 11 0
      app/detekt-baseline.xml
  6. 1586 0
      config/baseline.xml
  7. 6 2
      core/build.gradle
  8. 7 0
      core/detekt-baseline.xml
  9. 6 2
      core_api/build.gradle
  10. 2 0
      core_api/consumer-rules.pro
  11. 105 0
      core_api/detekt-baseline.xml
  12. 15 2
      core_impl/build.gradle
  13. 22 0
      core_impl/detekt-baseline.xml
  14. 146 0
      core_impl/schemas/com.mrozon.core_impl.db.HealthDiaryDb/1.json
  15. 1 1
      detekt-config.yml
  16. 1 0
      detekt.gradle
  17. 10 1
      feature_auth/build.gradle
  18. 45 0
      feature_auth/detekt-baseline.xml
  19. 6 1
      feature_measure_type/build.gradle
  20. 30 0
      feature_measure_type/detekt-baseline.xml
  21. 6 1
      feature_person/build.gradle
  22. 52 0
      feature_person/detekt-baseline.xml
  23. 6 2
      feature_splash/build.gradle
  24. 23 0
      feature_splash/detekt-baseline.xml
  25. 1 0
      lint_repo/.gitignore
  26. 25 0
      lint_repo/build.gradle
  27. 13 0
      lint_repo/detekt-baseline.xml
  28. 13 0
      lint_repo/src/main/java/com/mrozon/lintrepo/CustomLintRegistry.kt
  29. 64 0
      lint_repo/src/main/java/com/mrozon/lintrepo/RawColorDetector.kt
  30. 70 0
      lint_repo/src/main/java/com/mrozon/lintrepo/VerySimpleNamingVariablesDetector.kt
  31. 81 0
      lint_repo/src/test/java/com/mrozon/lintrepo/RawColorDetectorTest.kt
  32. 91 0
      lint_repo/src/test/java/com/mrozon/lintrepo/VerySimpleNamingVariablesDetectorTest.kt
  33. 1 0
      settings.gradle
  34. 6 2
      utils/build.gradle
  35. 20 0
      utils/detekt-baseline.xml
  36. 3 1
      utils/src/main/java/com/mrozon/utils/base/BaseFragment.kt

+ 7 - 0
Dockerfile

@@ -0,0 +1,7 @@
+FROM jangrewe/gitlab-ci-android
+
+RUN apt-get -qq update \
+    && apt-get remove openjdk-11* -qqy \
+    && apt-get install -qqy --no-install-recommends \
+        openjdk-8-jdk \
+    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

+ 61 - 0
Jenkinsfile

@@ -0,0 +1,61 @@
+pipeline {
+    agent {
+        docker {
+            image 'gitlab-ci-java8'
+        }
+    }
+    stages {
+        stage('Init') {
+            steps {
+                checkout([
+                    $class: 'GitSCM',
+                    branches: [[name: '*/homework_proguard']],
+                    doGenerateSubmoduleConfigurations: false,
+                    extensions: [[$class: 'CleanCheckout']],
+                    submoduleCfg: [],
+                    userRemoteConfigs: [[
+                        url: 'https://github.com/MrOzOn/HealthDiary',
+                        credentialsId: 'CRED_FOR_GITHUB'
+                        ]]])
+            }
+        }
+        stage('Static Analysis') {
+            failFast true
+            parallel {
+                stage('lint') {
+                    steps {
+                        echo './gradlew lintDebug'
+                    }
+                }
+                stage('detekt') {
+                    steps {
+                        sh './gradlew detekt'
+                    }
+                }
+            }
+        }
+        stage('Test') {
+            steps {
+                sh './gradlew testDebugUnitTest'
+                sh './gradlew jacocoTestDebugUnitTestReport'
+            }
+        }
+        stage('Signing APK') {
+            steps {
+                prepareProperties()
+                sh './gradlew assembleRelease'
+            }
+        }
+    }
+}
+
+def prepareProperties() {
+    def propertiesPath = "/.keystore"
+    sh "mkdir -p ${env.HOME}${propertiesPath}"
+    withCredentials([file(credentialsId: 'KEYSTORE_PROPERTIES', variable: 'propertiesFile')]) {
+        sh "cp -f ${propertiesFile} ${env.HOME}${propertiesPath}/keystore.properties"
+    }
+    withCredentials([file(credentialsId: 'KEYSTORE_JKS', variable: 'keystore')]) {
+        sh "cp -f ${keystore} ${env.HOME}${propertiesPath}/learn_otus.jks"
+    }
+}

+ 1 - 0
app/.gitignore

@@ -1 +1,2 @@
 /build
+/release/output.json

+ 43 - 4
app/build.gradle

@@ -17,10 +17,25 @@ android {
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
     }
 
+    signingConfigs {
+        release {
+            prepareProperties()
+            storeFile configStoreFile
+            storePassword configStorePassword
+            keyAlias configKeyAlias
+            keyPassword configKeyPassword
+        }
+    }
+
     buildTypes {
         release {
-            minifyEnabled false
+            minifyEnabled true
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+            signingConfig signingConfigs.release
+        }
+        staging {
+            minifyEnabled true
+            signingConfig debug.signingConfig
         }
     }
     dataBinding {
@@ -33,13 +48,19 @@ android {
     kotlinOptions {
         jvmTarget = '1.8'
     }
-
-
+    lintOptions {
+        ignoreTestSources true
+        abortOnError true
+        xmlReport false
+        baselineFile file("$project.rootDir/config/baseline.xml")
+        checkDependencies true
+    }
 }
 
 apply from: "$project.rootDir/scripts/deps_versions.gradle"
 
 dependencies {
+    lintChecks project(':lint_repo')
     api project(':core_api')
     implementation project(':core')
     implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
@@ -55,7 +76,7 @@ dependencies {
     implementation material
 
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'androidx.core:core-ktx:1.3.1'
     testImplementation 'junit:junit:4.12'
@@ -67,3 +88,21 @@ dependencies {
     implementation project(':feature_person')
     implementation project(':feature_measure_type')
 }
+
+def prepareProperties() {
+    Properties properties = new Properties()
+    String filePath = ""
+    if (System.getenv("HUDSON_HOME")!=null) {
+        filePath = System.getenv("HUDSON_HOME") + "/.keystore/keystore.properties"
+    } else {
+        filePath = System.getenv("HOME") + "/.keystore/keystore.properties"
+    }
+    System.console().println(filePath)
+    file(filePath).with { fname ->
+        properties.load(fname.newDataInputStream())
+        ext.configStoreFile = file(fname.getParent() + "/" + properties['keystore'])
+        ext.configStorePassword = properties['keystore.password']
+        ext.configKeyAlias = properties['keyAlias']
+        ext.configKeyPassword = properties['keyPassword']
+    }
+}

+ 11 - 0
app/detekt-baseline.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" ?>
+<SmellBaseline>
+  <ManuallySuppressedIssues></ManuallySuppressedIssues>
+  <CurrentIssues>
+    <ID>MaxLineLength:FacadeComponent.kt$FacadeComponent.Companion$DaggerFacadeComponent.builder() .appProvider(AppComponent.create(application)) .databaseProvider(CoreProvidersFactory.createDatabaseBuilder(AppComponent.create(application))) .networkProvider(CoreProvidersFactory.createNetworkBuilder(AppComponent.create(application))) .securityTokenProvider(CoreProvidersFactory.createSecurityTokenBuilder(AppComponent.create(application)))</ID>
+    <ID>TooGenericExceptionCaught:DaggerViewModelFactory.kt$DaggerViewModelFactory$e: Exception</ID>
+    <ID>TooGenericExceptionThrown:DaggerViewModelFactory.kt$DaggerViewModelFactory$throw RuntimeException(e)</ID>
+    <ID>WildcardImport:NavigationModule.kt$import com.mrozon.core_api.navigation.*</ID>
+    <ID>WildcardImport:NavigationModule.kt$import com.mrozon.healthdiary.navigation.*</ID>
+  </CurrentIssues>
+</SmellBaseline>

+ 1586 - 0
config/baseline.xml

@@ -0,0 +1,1586 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="5" by="lint 3.6.4" client="gradle" variant="all" version="3.6.4">
+
+    <issue
+        id="ObsoleteLintCustomCheck"
+        message="Lint found an issue registry (`androidx.appcompat.AppCompatIssueRegistry`) which requires a newer API level. That means that the custom lint checks are intended for a newer lint version; please upgrade">
+        <location
+            file="../../../../.gradle/caches/transforms-2/files-2.1/add0082a5c733e5ca1c3d7a204f48ffa/appcompat-1.2.0/jars/lint.jar"/>
+    </issue>
+
+    <issue
+        id="ObsoleteLintCustomCheck"
+        message="Lint found an issue registry (`com.mrozon.lintrepo.CustomLintRegistry`) which did not specify the Lint API version it was compiled with.&#xA;&#xA;**This means that the lint checks are likely not compatible.**&#xA;&#xA;If you are the author of this lint check, make your lint `IssueRegistry` class contain&#xA;  override val api: Int = com.android.tools.lint.detector.api.CURRENT_API&#xA;or from Java,&#xA;  @Override public int getApi() { return com.android.tools.lint.detector.api.ApiKt.CURRENT_API; }&#xA;&#xA;If you are just using lint checks from a third party library you have no control over, you can disable these lint checks (if they misbehave) like this:&#xA;&#xA;    android {&#xA;        lintOptions {&#xA;            disable &quot;RawColorInResources&quot;,&#xA;                    &quot;VerySimpleNamingVariables&quot;&#xA;        }&#xA;    }&#xA;"
+        includedVariants="debug"
+        excludedVariants="release,staging">
+        <location
+            file="build/intermediates/lint_jar/global/lint.jar"/>
+    </issue>
+
+    <issue
+        id="UnusedAttribute"
+        message="Attribute `networkSecurityConfig` is only used in API level 24 and higher (current min is 21)"
+        errorLine1="        android:networkSecurityConfig=&quot;@xml/network_security_config&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/AndroidManifest.xml"
+            line="15"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="InflateParams"
+        message="Avoid passing `null` as the view root (needed to resolve layout parameters on the inflated layout&apos;s root element)"
+        errorLine1="            val view = layoutInflater.inflate(R.layout.dialog_share, null)"
+        errorLine2="                                                                     ~~~~">
+        <location
+            file="../feature_person/src/main/java/com/mrozon/feature_person/presentation/EditPersonFragment.kt"
+            line="228"
+            column="70"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.core:core-ktx than 1.3.1 is available: 1.3.2"
+        errorLine1="    implementation &apos;androidx.core:core-ktx:1.3.1&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="40"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of junit:junit than 4.12 is available: 4.13.1"
+        errorLine1="    testImplementation &apos;junit:junit:4.12&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="41"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.test.ext:junit than 1.1.1 is available: 1.1.2"
+        errorLine1="    androidTestImplementation &apos;androidx.test.ext:junit:1.1.1&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="42"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.test.espresso:espresso-core than 3.2.0 is available: 3.3.0"
+        errorLine1="    androidTestImplementation &apos;androidx.test.espresso:espresso-core:3.2.0&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="43"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.core:core-ktx than 1.3.1 is available: 1.3.2"
+        errorLine1="    implementation &apos;androidx.core:core-ktx:1.3.1&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="53"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of junit:junit than 4.12 is available: 4.13.1"
+        errorLine1="    testImplementation &apos;junit:junit:4.12&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="54"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.test.ext:junit than 1.1.1 is available: 1.1.2"
+        errorLine1="    androidTestImplementation &apos;androidx.test.ext:junit:1.1.1&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="55"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.core:core-ktx than 1.3.1 is available: 1.3.2"
+        errorLine1="    implementation &apos;androidx.core:core-ktx:1.3.1&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="56"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.test.espresso:espresso-core than 3.2.0 is available: 3.3.0"
+        errorLine1="    androidTestImplementation &apos;androidx.test.espresso:espresso-core:3.2.0&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="56"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of junit:junit than 4.12 is available: 4.13.1"
+        errorLine1="    testImplementation &apos;junit:junit:4.12&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="57"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.core:core-ktx than 1.3.1 is available: 1.3.2"
+        errorLine1="    implementation &apos;androidx.core:core-ktx:1.3.1&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="58"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.test.ext:junit than 1.1.1 is available: 1.1.2"
+        errorLine1="    androidTestImplementation &apos;androidx.test.ext:junit:1.1.1&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="58"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.test.espresso:espresso-core than 3.2.0 is available: 3.3.0"
+        errorLine1="    androidTestImplementation &apos;androidx.test.espresso:espresso-core:3.2.0&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="59"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of junit:junit than 4.12 is available: 4.13.1"
+        errorLine1="    testImplementation &apos;junit:junit:4.12&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="59"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.test.ext:junit than 1.1.1 is available: 1.1.2"
+        errorLine1="    androidTestImplementation &apos;androidx.test.ext:junit:1.1.1&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="60"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.test.espresso:espresso-core than 3.2.0 is available: 3.3.0"
+        errorLine1="    androidTestImplementation &apos;androidx.test.espresso:espresso-core:3.2.0&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="61"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.core:core-ktx than 1.3.1 is available: 1.3.2"
+        errorLine1="    implementation &apos;androidx.core:core-ktx:1.3.1&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="70"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.core:core-ktx than 1.3.1 is available: 1.3.2"
+        errorLine1="    implementation &apos;androidx.core:core-ktx:1.3.1&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="70"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of junit:junit than 4.12 is available: 4.13.1"
+        errorLine1="    testImplementation &apos;junit:junit:4.12&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="71"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of junit:junit than 4.12 is available: 4.13.1"
+        errorLine1="    testImplementation &apos;junit:junit:4.12&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="71"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.test.ext:junit than 1.1.1 is available: 1.1.2"
+        errorLine1="    androidTestImplementation &apos;androidx.test.ext:junit:1.1.1&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="72"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.test.ext:junit than 1.1.1 is available: 1.1.2"
+        errorLine1="    androidTestImplementation &apos;androidx.test.ext:junit:1.1.1&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="72"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.test.espresso:espresso-core than 3.2.0 is available: 3.3.0"
+        errorLine1="    androidTestImplementation &apos;androidx.test.espresso:espresso-core:3.2.0&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="73"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="GradleDependency"
+        message="A newer version of androidx.test.espresso:espresso-core than 3.2.0 is available: 3.3.0"
+        errorLine1="    androidTestImplementation &apos;androidx.test.espresso:espresso-core:3.2.0&apos;"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="build.gradle"
+            line="73"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="ExtraText"
+        message="Unexpected text found in layout file: &quot;/&quot;">
+        <location
+            file="src/main/AndroidManifest.xml"
+            line="6"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="ExtraText"
+        message="Unexpected text found in layout file: &quot;/&quot;">
+        <location
+            file="src/main/AndroidManifest.xml"
+            line="6"
+            column="5"/>
+    </issue>
+
+    <issue
+        id="VectorPath"
+        message="Very long vector path (1887 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+        errorLine1="    &lt;path android:fillColor=&quot;#FF000000&quot; android:pathData=&quot;M507.921,445.34c-34.766,-24.516 -76.772,-41.947 -122.504,-51.296c10.094,-7.34 19.397,-16.031 27.721,-25.86l142.126,-66.532c7.149,-3.346 11.108,-11.128 9.6,-18.876c-0.558,-2.85 -14.024,-70.631 -51.66,-139.402C461.871,49.578 390.223,0 306.001,0c-84.219,0 -155.87,49.578 -207.205,143.375c-37.635,68.769 -51.102,136.551 -51.659,139.402c-1.508,7.748 2.45,15.53 9.599,18.876l142.129,66.532c8.324,9.83 17.627,18.521 27.721,25.86c-45.735,9.349 -87.738,26.78 -122.505,51.293c-55.989,39.478 -86.822,92.553 -86.822,149.448c0,9.506 7.705,17.212 17.212,17.212h543.06c9.508,0 17.212,-7.707 17.212,-17.212C594.744,537.892 563.911,484.817 507.921,445.34zM456.912,577.575v-48.378c0,-9.506 -7.704,-17.212 -17.212,-17.212c-9.506,0 -17.212,7.707 -17.212,17.212v48.378H189.511v-48.378c0,-9.506 -7.704,-17.212 -17.212,-17.212c-9.506,0 -17.212,7.707 -17.212,17.212v48.378H52.922c5.637,-38.98 30.348,-75.439 70.998,-104.101c19.173,-13.52 40.908,-24.625 64.443,-33.117c15.582,13.655 61.154,48.746 118.007,48.746c0.871,0 1.757,-0.009 2.631,-0.026c39.181,-0.749 75.213,-18.014 107.16,-51.323c26.424,8.774 50.729,20.775 71.924,35.719c40.647,28.662 65.359,65.12 70.996,104.101H456.912V577.575zM229.62,428.557c24.39,-5.276 50.068,-8.015 76.383,-8.015c24.326,0 48.104,2.345 70.831,6.866c-21.331,17.583 -44.213,26.735 -68.265,27.247C276.77,455.34 248.285,441.027 229.62,428.557zM189.514,243.933c0,-9.506 -7.707,-17.212 -17.212,-17.212c-9.508,0 -17.212,7.707 -17.212,17.212c0,25.581 4.676,49.903 13.071,71.872L83.93,276.375c5.57,-22.162 19.338,-69.469 45.065,-116.472C174.562,76.641 234.117,34.425 306.001,34.425c71.674,0 131.099,41.984 176.624,124.782c25.892,47.09 39.818,94.865 45.438,117.171l-84.222,39.427c8.395,-21.969 13.074,-46.291 13.074,-71.872c0,-9.506 -7.707,-17.212 -17.212,-17.212c-9.508,0 -17.212,7.707 -17.212,17.212c0,78.4 -52.257,142.185 -116.487,142.185C241.771,386.118 189.514,322.333 189.514,243.933z&quot;/>"
+        errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_female_avatar.xml"
+            line="3"
+            column="59"/>
+    </issue>
+
+    <issue
+        id="VectorPath"
+        message="Very long vector path (1008 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+        errorLine1="    &lt;path android:fillColor=&quot;#FF000000&quot; android:pathData=&quot;M277.664,208.01h-16.123c31.146,-20.152 51.804,-55.194 51.804,-94.972C313.345,50.708 262.637,0 200.307,0S87.269,50.708 87.269,113.038c0,39.778 20.656,74.82 51.804,94.972H122.95c-41.434,0 -75.143,33.707 -75.143,75.141v104.963c0,6.904 5.597,12.5 12.5,12.5h280c6.903,0 12.5,-5.596 12.5,-12.5V283.15C352.807,241.717 319.098,208.01 277.664,208.01zM112.269,113.038c0,-48.544 39.493,-88.038 88.038,-88.038c48.544,0 88.038,39.494 88.038,88.038c0,48.543 -39.494,88.036 -88.038,88.036C151.762,201.074 112.269,161.581 112.269,113.038zM236.88,219.998l-36.573,36.574l-36.573,-36.573c11.477,3.935 23.779,6.075 36.573,6.075S225.404,223.934 236.88,219.998zM327.807,375.613h-34v-60.059c0,-6.904 -5.597,-12.5 -12.5,-12.5s-12.5,5.596 -12.5,12.5v60.059h-137v-60.059c0,-6.904 -5.597,-12.5 -12.5,-12.5s-12.5,5.596 -12.5,12.5v60.059h-34V283.15c0,-27.647 22.494,-50.141 50.143,-50.141h18.439l50.079,50.078c2.441,2.441 5.64,3.661 8.839,3.661s6.396,-1.22 8.839,-3.661l50.079,-50.078h18.439c27.648,0 50.143,22.492 50.143,50.141V375.613z&quot;/>"
+        errorLine2="                                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_male_avatar.xml"
+            line="3"
+            column="59"/>
+    </issue>
+
+    <issue
+        id="VectorPath"
+        message="Very long vector path (1237 characters), which is bad for performance. Considering reducing precision, removing minor details or rasterizing vector."
+        errorLine1="      android:pathData=&quot;M50,0C22.429,0 0,22.429 0,50C0,77.571 22.429,100 50,100C50.504,100 50.996,99.938 51.5,99.925L51.675,99.958C51.813,99.983 51.946,100 52.083,100C52.275,100 52.471,99.975 52.654,99.921L52.888,99.854C79.113,98.342 100,76.596 100,50C100,22.429 77.571,0 50,0ZM79.717,84.829C79.521,84.192 79.079,83.654 78.438,83.442L67.471,79.792C63.642,78.196 61.858,72.067 61.442,69.608C64.279,66.971 66.9,63.042 66.9,59.492C66.9,58.283 67.242,57.821 67.175,57.808C67.825,57.646 68.354,57.183 68.604,56.562C68.808,56.05 70.604,51.471 70.604,48.383C70.604,48.212 70.583,48.042 70.542,47.879C70.279,46.833 69.667,45.779 68.75,45.121V35.421C68.75,29.425 66.925,26.912 64.992,25.458C64.558,22.475 61.363,16.671 50,16.671C38.384,16.671 31.25,27.592 31.25,35.421V45.121C30.334,45.779 29.721,46.833 29.459,47.879C29.417,48.046 29.396,48.217 29.396,48.383C29.396,51.471 31.192,56.05 31.396,56.562C31.646,57.183 31.975,57.579 32.625,57.741C32.759,57.82 33.1,58.287 33.1,59.491C33.1,63.041 35.721,66.97 38.559,69.608C38.146,72.062 36.38,78.187 32.671,79.737L21.559,83.441C20.921,83.654 20.463,84.179 20.263,84.816C10.425,76.404 4.158,63.929 4.158,50C4.158,24.729 24.721,4.167 49.992,4.167C75.263,4.167 95.825,24.729 95.825,50C95.833,63.933 89.563,76.417 79.717,84.829Z&quot;"
+        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_userprofile.xml"
+            line="7"
+            column="25"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.color.color_snack_error` appears to be unused"
+        errorLine1="    &lt;color name=&quot;color_snack_error&quot;>#F44336&lt;/color>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../utils/src/main/res/values/colors.xml"
+            line="3"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.color.color_snack_info` appears to be unused"
+        errorLine1="    &lt;color name=&quot;color_snack_info&quot;>#00c853&lt;/color>"
+        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../utils/src/main/res/values/colors.xml"
+            line="4"
+            column="12"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.Ok` appears to be unused"
+        errorLine1="    &lt;string name=&quot;Ok&quot;>@android:string/ok&lt;/string>"
+        errorLine2="            ~~~~~~~~~">
+        <location
+            file="../utils/src/main/res/values/strings.xml"
+            line="3"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.hello_blank_fragment` appears to be unused"
+        errorLine1="    &lt;string name=&quot;hello_blank_fragment&quot;>Hello blank fragment&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../feature_splash/src/main/res/values/strings.xml"
+            line="3"
+            column="13"/>
+        <location
+            file="../feature_auth/src/main/res/values/strings.xml"
+            line="2"
+            column="13"/>
+        <location
+            file="../feature_person/src/main/res/values/strings.xml"
+            line="2"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.male` appears to be unused"
+        errorLine1="    &lt;string name=&quot;male&quot;>Male&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~">
+        <location
+            file="../feature_person/src/main/res/values/strings.xml"
+            line="6"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.female` appears to be unused"
+        errorLine1="    &lt;string name=&quot;female&quot;>Female&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="../feature_person/src/main/res/values/strings.xml"
+            line="7"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.etBorn` appears to be unused"
+        errorLine1="    &lt;string name=&quot;etBorn&quot;>Type date of born&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~">
+        <location
+            file="../feature_person/src/main/res/values/strings.xml"
+            line="8"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.error_empty_string` appears to be unused"
+        errorLine1="    &lt;string name=&quot;error_empty_string&quot;>Empty field&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../feature_person/src/main/res/values/strings.xml"
+            line="15"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="UnusedResources"
+        message="The resource `R.string.error_invalid_email` appears to be unused"
+        errorLine1="    &lt;string name=&quot;error_invalid_email&quot;>Invalid format username (e-mail)&lt;/string>"
+        errorLine2="            ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="../feature_person/src/main/res/values/strings.xml"
+            line="16"
+            column="13"/>
+    </issue>
+
+    <issue
+        id="TypographyEllipsis"
+        message="Replace &quot;...&quot; with ellipsis character (…, &amp;#8230;) ?"
+        errorLine1="    &lt;string name=&quot;tvLogoStatus&quot;>Loading profile...&lt;/string>"
+        errorLine2="                                ^">
+        <location
+            file="src/main/res/values/strings.xml"
+            line="5"
+            column="33"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="    &lt;path android:fillColor=&quot;#FF000000&quot; android:pathData=&quot;M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z&quot;/>"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_check_white_24dp.xml"
+            line="4"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="    &lt;path android:fillColor=&quot;#E24C4B&quot; android:pathData=&quot;M227.556,227.556m-227.556,0a227.556,227.556 0,1 1,455.112 0a227.556,227.556 0,1 1,-455.112 0&quot;/>"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_error.xml"
+            line="3"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="    &lt;path android:fillColor=&quot;#D1403F&quot; android:pathData=&quot;M455.111,227.556c0,125.156 -102.4,227.556 -227.556,227.556c-72.533,0 -136.533,-32.711 -177.778,-85.333c38.4,31.289 88.178,49.778 142.222,49.778c125.156,0 227.556,-102.4 227.556,-227.556c0,-54.044 -18.489,-103.822 -49.778,-142.222C422.4,91.022 455.111,155.022 455.111,227.556z&quot;/>"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_error.xml"
+            line="4"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="    &lt;path android:fillColor=&quot;#FFFFFF&quot; android:pathData=&quot;M331.378,331.378c-8.533,8.533 -22.756,8.533 -31.289,0l-72.533,-72.533l-72.533,72.533c-8.533,8.533 -22.756,8.533 -31.289,0c-8.533,-8.533 -8.533,-22.756 0,-31.289l72.533,-72.533l-72.533,-72.533c-8.533,-8.533 -8.533,-22.756 0,-31.289c8.533,-8.533 22.756,-8.533 31.289,0l72.533,72.533l72.533,-72.533c8.533,-8.533 22.756,-8.533 31.289,0c8.533,8.533 8.533,22.756 0,31.289l-72.533,72.533l72.533,72.533C339.911,308.622 339.911,322.844 331.378,331.378z&quot;/>"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_error.xml"
+            line="5"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="    &lt;path android:fillColor=&quot;#FF000000&quot; android:pathData=&quot;M507.921,445.34c-34.766,-24.516 -76.772,-41.947 -122.504,-51.296c10.094,-7.34 19.397,-16.031 27.721,-25.86l142.126,-66.532c7.149,-3.346 11.108,-11.128 9.6,-18.876c-0.558,-2.85 -14.024,-70.631 -51.66,-139.402C461.871,49.578 390.223,0 306.001,0c-84.219,0 -155.87,49.578 -207.205,143.375c-37.635,68.769 -51.102,136.551 -51.659,139.402c-1.508,7.748 2.45,15.53 9.599,18.876l142.129,66.532c8.324,9.83 17.627,18.521 27.721,25.86c-45.735,9.349 -87.738,26.78 -122.505,51.293c-55.989,39.478 -86.822,92.553 -86.822,149.448c0,9.506 7.705,17.212 17.212,17.212h543.06c9.508,0 17.212,-7.707 17.212,-17.212C594.744,537.892 563.911,484.817 507.921,445.34zM456.912,577.575v-48.378c0,-9.506 -7.704,-17.212 -17.212,-17.212c-9.506,0 -17.212,7.707 -17.212,17.212v48.378H189.511v-48.378c0,-9.506 -7.704,-17.212 -17.212,-17.212c-9.506,0 -17.212,7.707 -17.212,17.212v48.378H52.922c5.637,-38.98 30.348,-75.439 70.998,-104.101c19.173,-13.52 40.908,-24.625 64.443,-33.117c15.582,13.655 61.154,48.746 118.007,48.746c0.871,0 1.757,-0.009 2.631,-0.026c39.181,-0.749 75.213,-18.014 107.16,-51.323c26.424,8.774 50.729,20.775 71.924,35.719c40.647,28.662 65.359,65.12 70.996,104.101H456.912V577.575zM229.62,428.557c24.39,-5.276 50.068,-8.015 76.383,-8.015c24.326,0 48.104,2.345 70.831,6.866c-21.331,17.583 -44.213,26.735 -68.265,27.247C276.77,455.34 248.285,441.027 229.62,428.557zM189.514,243.933c0,-9.506 -7.707,-17.212 -17.212,-17.212c-9.508,0 -17.212,7.707 -17.212,17.212c0,25.581 4.676,49.903 13.071,71.872L83.93,276.375c5.57,-22.162 19.338,-69.469 45.065,-116.472C174.562,76.641 234.117,34.425 306.001,34.425c71.674,0 131.099,41.984 176.624,124.782c25.892,47.09 39.818,94.865 45.438,117.171l-84.222,39.427c8.395,-21.969 13.074,-46.291 13.074,-71.872c0,-9.506 -7.707,-17.212 -17.212,-17.212c-9.508,0 -17.212,7.707 -17.212,17.212c0,78.4 -52.257,142.185 -116.487,142.185C241.771,386.118 189.514,322.333 189.514,243.933z&quot;/>"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_female_avatar.xml"
+            line="3"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#3DDC84&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="8"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="11"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="14"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="16"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="19"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="21"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="24"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="26"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="29"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="31"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="34"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="36"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="39"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="41"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="44"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="46"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="49"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="51"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="54"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="56"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="59"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="61"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="64"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="66"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="69"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="71"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="74"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="76"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="79"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="81"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="84"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="86"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="89"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="91"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="94"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="96"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="99"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="101"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="104"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="106"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="109"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="111"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="114"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="116"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="119"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="121"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="124"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="126"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="129"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="131"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="134"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="136"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="139"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="141"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="144"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="146"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="149"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="151"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="154"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="156"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="159"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="161"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="164"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#00000000&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="166"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#33FFFFFF&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_launcher_background.xml"
+            line="169"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="                    android:color=&quot;#44000000&quot;"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable-v24/ic_launcher_foreground.xml"
+            line="16"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="                    android:color=&quot;#00000000&quot;"
+        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable-v24/ic_launcher_foreground.xml"
+            line="19"
+            column="21"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:fillColor=&quot;#FFFFFF&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable-v24/ic_launcher_foreground.xml"
+            line="25"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:strokeColor=&quot;#00000000&quot; />"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable-v24/ic_launcher_foreground.xml"
+            line="29"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="    &lt;path android:fillColor=&quot;#FF000000&quot; android:pathData=&quot;M277.664,208.01h-16.123c31.146,-20.152 51.804,-55.194 51.804,-94.972C313.345,50.708 262.637,0 200.307,0S87.269,50.708 87.269,113.038c0,39.778 20.656,74.82 51.804,94.972H122.95c-41.434,0 -75.143,33.707 -75.143,75.141v104.963c0,6.904 5.597,12.5 12.5,12.5h280c6.903,0 12.5,-5.596 12.5,-12.5V283.15C352.807,241.717 319.098,208.01 277.664,208.01zM112.269,113.038c0,-48.544 39.493,-88.038 88.038,-88.038c48.544,0 88.038,39.494 88.038,88.038c0,48.543 -39.494,88.036 -88.038,88.036C151.762,201.074 112.269,161.581 112.269,113.038zM236.88,219.998l-36.573,36.574l-36.573,-36.573c11.477,3.935 23.779,6.075 36.573,6.075S225.404,223.934 236.88,219.998zM327.807,375.613h-34v-60.059c0,-6.904 -5.597,-12.5 -12.5,-12.5s-12.5,5.596 -12.5,12.5v60.059h-137v-60.059c0,-6.904 -5.597,-12.5 -12.5,-12.5s-12.5,5.596 -12.5,12.5v60.059h-34V283.15c0,-27.647 22.494,-50.141 50.143,-50.141h18.439l50.079,50.078c2.441,2.441 5.64,3.661 8.839,3.661s6.396,-1.22 8.839,-3.661l50.079,-50.078h18.439c27.648,0 50.143,22.492 50.143,50.141V375.613z&quot;/>"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_male_avatar.xml"
+            line="3"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="    &lt;path android:fillColor=&quot;#8DC640&quot; android:pathData=&quot;M405.493,412.764c-69.689,56.889 -287.289,56.889 -355.556,0c-69.689,-56.889 -62.578,-300.089 0,-364.089s292.978,-64 355.556,0S475.182,355.876 405.493,412.764z&quot;/>"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_success.xml"
+            line="3"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="    &lt;path android:fillAlpha=&quot;0.2&quot; android:fillColor=&quot;#FFFFFF&quot;"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_success.xml"
+            line="4"
+            column="35"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="    &lt;path android:fillColor=&quot;#FFFFFF&quot; android:pathData=&quot;M195.004,354.453c-9.956,0 -19.911,-4.267 -25.6,-12.8l-79.644,-102.4c-11.378,-14.222 -8.533,-34.133 5.689,-45.511s34.133,-8.533 45.511,5.689l54.044,69.689l119.467,-155.022c11.378,-14.222 31.289,-17.067 45.511,-5.689s17.067,31.289 5.689,45.511L220.604,341.653C213.493,348.764 204.96,354.453 195.004,354.453z&quot;/>"
+        errorLine2="          ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_success.xml"
+            line="6"
+            column="11"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="      android:fillColor=&quot;#000000&quot;/>"
+        errorLine2="      ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/ic_userprofile.xml"
+            line="8"
+            column="7"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="                android:textColor=&quot;#000000&quot;"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/layout/item_measure_type.xml"
+            line="50"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="                android:textColor=&quot;#000000&quot;"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/layout/item_person.xml"
+            line="51"
+            column="17"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:centerColor=&quot;#009688&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/side_nav_bar.xml"
+            line="5"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:endColor=&quot;#00695C&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/side_nav_bar.xml"
+            line="6"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:startColor=&quot;#4DB6AC&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/drawable/side_nav_bar.xml"
+            line="7"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:textColor=&quot;#FFFFFF&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/layout/view_nav_header.xml"
+            line="27"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="RawColorInResources"
+        message="Using row color in tags"
+        errorLine1="        android:textColor=&quot;#FFFFFF&quot;"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/layout/view_nav_header.xml"
+            line="38"
+            column="9"/>
+    </issue>
+
+    <issue
+        id="Autofill"
+        message="Missing `autofillHints` attribute"
+        errorLine1="    &lt;EditText"
+        errorLine2="     ~~~~~~~~">
+        <location
+            file="src/main/res/layout/dialog_share.xml"
+            line="13"
+            column="6"/>
+    </issue>
+
+    <issue
+        id="Autofill"
+        message="Missing `autofillHints` attribute"
+        errorLine1="            &lt;EditText"
+        errorLine2="             ~~~~~~~~">
+        <location
+            file="src/main/res/layout/fragment_edit_person.xml"
+            line="25"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="Autofill"
+        message="Missing `autofillHints` attribute"
+        errorLine1="            &lt;EditText"
+        errorLine2="             ~~~~~~~~">
+        <location
+            file="src/main/res/layout/fragment_login.xml"
+            line="28"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="Autofill"
+        message="Missing `autofillHints` attribute"
+        errorLine1="            &lt;EditText"
+        errorLine2="             ~~~~~~~~">
+        <location
+            file="src/main/res/layout/fragment_login.xml"
+            line="42"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="Autofill"
+        message="Missing `autofillHints` attribute"
+        errorLine1="            &lt;EditText"
+        errorLine2="             ~~~~~~~~">
+        <location
+            file="src/main/res/layout/fragment_registration.xml"
+            line="28"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="Autofill"
+        message="Missing `autofillHints` attribute"
+        errorLine1="            &lt;EditText"
+        errorLine2="             ~~~~~~~~">
+        <location
+            file="src/main/res/layout/fragment_registration.xml"
+            line="43"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="Autofill"
+        message="Missing `autofillHints` attribute"
+        errorLine1="            &lt;EditText"
+        errorLine2="             ~~~~~~~~">
+        <location
+            file="src/main/res/layout/fragment_registration.xml"
+            line="58"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="Autofill"
+        message="Missing `autofillHints` attribute"
+        errorLine1="            &lt;EditText"
+        errorLine2="             ~~~~~~~~">
+        <location
+            file="src/main/res/layout/fragment_registration.xml"
+            line="73"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="Autofill"
+        message="Missing `autofillHints` attribute"
+        errorLine1="            &lt;EditText"
+        errorLine2="             ~~~~~~~~">
+        <location
+            file="src/main/res/layout/fragment_registration.xml"
+            line="88"
+            column="14"/>
+    </issue>
+
+    <issue
+        id="ClickableViewAccessibility"
+        message="Custom view `GenderSwitch` overrides `onTouchEvent` but not `performClick`"
+        errorLine1="    override fun onTouchEvent(event: MotionEvent?): Boolean {"
+        errorLine2="                 ~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/mrozon/feature_person/customview/GenderSwitch.kt"
+            line="137"
+            column="18"/>
+    </issue>
+
+    <issue
+        id="ContentDescription"
+        message="Missing `contentDescription` attribute on image"
+        errorLine1="    &lt;ImageView"
+        errorLine2="     ~~~~~~~~~">
+        <location
+            file="src/main/res/layout/fragment_my_info_dialog.xml"
+            line="9"
+            column="6"/>
+    </issue>
+
+    <issue
+        id="ContentDescription"
+        message="Missing `contentDescription` attribute on image"
+        errorLine1="    &lt;ImageView"
+        errorLine2="     ~~~~~~~~~">
+        <location
+            file="src/main/res/layout/view_nav_header.xml"
+            line="9"
+            column="6"/>
+    </issue>
+
+    <issue
+        id="ContentDescription"
+        message="Missing `contentDescription` attribute on image"
+        errorLine1="    &lt;ImageView"
+        errorLine2="     ~~~~~~~~~">
+        <location
+            file="src/main/res/layout/view_nav_header.xml"
+            line="44"
+            column="6"/>
+    </issue>
+
+    <issue
+        id="SetTextI18n"
+        message="Do not concatenate text displayed with `setText`. Use resource string with placeholders."
+        errorLine1="                tvUserName.text = &quot;${user.firstname}  ${user.lastname}&quot;"
+        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/mrozon/healthdiary/presentation/main/MainActivity.kt"
+            line="126"
+            column="35"/>
+    </issue>
+
+    <issue
+        id="RtlHardcoded"
+        message="Consider replacing `android:layout_marginRight` with `android:layout_marginEnd=&quot;16dp&quot;` to better support right-to-left layouts"
+        errorLine1="                android:layout_marginRight=&quot;16dp&quot;"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/res/layout/item_measure_type.xml"
+            line="46"
+            column="17"/>
+    </issue>
+
+</issues>

+ 6 - 2
core/build.gradle

@@ -18,9 +18,13 @@ android {
 
     buildTypes {
         release {
-            minifyEnabled false
+            minifyEnabled true
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
+        staging {
+            minifyEnabled true
+            signingConfig debug.signingConfig
+        }
     }
 
 }
@@ -31,7 +35,7 @@ dependencies {
     api project(':core_api')
     implementation project(':core_impl')
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'androidx.core:core-ktx:1.3.1'
     testImplementation 'junit:junit:4.12'

+ 7 - 0
core/detekt-baseline.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" ?>
+<SmellBaseline>
+  <ManuallySuppressedIssues></ManuallySuppressedIssues>
+  <CurrentIssues>
+    <ID>NewLineAtEndOfFile:CoreProvidersFactory.kt$com.mrozon.core.CoreProvidersFactory.kt</ID>
+  </CurrentIssues>
+</SmellBaseline>

+ 6 - 2
core_api/build.gradle

@@ -19,9 +19,13 @@ android {
 
     buildTypes {
         release {
-            minifyEnabled false
+            minifyEnabled true
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
+        staging {
+            minifyEnabled true
+            signingConfig debug.signingConfig
+        }
     }
     compileOptions {
         sourceCompatibility JavaVersion.VERSION_1_8
@@ -49,7 +53,7 @@ dependencies {
     implementation lifecycleLivedata
 
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'androidx.core:core-ktx:1.3.1'
     testImplementation 'junit:junit:4.12'

+ 2 - 0
core_api/consumer-rules.pro

@@ -0,0 +1,2 @@
+-keep class com.mrozon.core_api.entity.* { *; }
+-keep class com.mrozon.core_api.network.model.* { *; }

+ 105 - 0
core_api/detekt-baseline.xml

@@ -0,0 +1,105 @@
+<?xml version="1.0" ?>
+<SmellBaseline>
+  <ManuallySuppressedIssues></ManuallySuppressedIssues>
+  <CurrentIssues>
+    <ID>ConstructorParameterNaming:LoginResponse.kt$LoginResponse$val first_name: String</ID>
+    <ID>ConstructorParameterNaming:LoginResponse.kt$LoginResponse$val last_name: String</ID>
+    <ID>ConstructorParameterNaming:LoginResponse.kt$LoginResponse$val user_id: Int</ID>
+    <ID>ConstructorParameterNaming:PersonResponse.kt$PersonResponse$val created_date: String</ID>
+    <ID>ConstructorParameterNaming:RegisterRequest.kt$RegisterRequest$val first_name: String</ID>
+    <ID>ConstructorParameterNaming:RegisterRequest.kt$RegisterRequest$val last_name: String</ID>
+    <ID>ConstructorParameterNaming:RegisterResponse.kt$RegisterResponse$val first_name: String</ID>
+    <ID>ConstructorParameterNaming:RegisterResponse.kt$RegisterResponse$val last_login: Any</ID>
+    <ID>ConstructorParameterNaming:RegisterResponse.kt$RegisterResponse$val last_name: String</ID>
+    <ID>ConstructorParameterNaming:SharePersonRequest.kt$SharePersonRequest$val patient_id: Int</ID>
+    <ID>NewLineAtEndOfFile:AppProvider.kt$com.mrozon.core_api.providers.AppProvider.kt</ID>
+    <ID>NewLineAtEndOfFile:AppWithFacade.kt$com.mrozon.core_api.providers.AppWithFacade.kt</ID>
+    <ID>NewLineAtEndOfFile:BlobTransmogrifier.kt$com.mrozon.core_api.db.BlobTransmogrifier.kt</ID>
+    <ID>NewLineAtEndOfFile:CoroutineContextProvider.kt$com.mrozon.core_api.providers.CoroutineContextProvider.kt</ID>
+    <ID>NewLineAtEndOfFile:DatabaseProvider.kt$com.mrozon.core_api.db.DatabaseProvider.kt</ID>
+    <ID>NewLineAtEndOfFile:EditPersonNavigator.kt$com.mrozon.core_api.navigation.EditPersonNavigator.kt</ID>
+    <ID>NewLineAtEndOfFile:HealthDiaryDao.kt$com.mrozon.core_api.db.HealthDiaryDao.kt</ID>
+    <ID>NewLineAtEndOfFile:HealthDiaryDatabaseContract.kt$com.mrozon.core_api.db.HealthDiaryDatabaseContract.kt</ID>
+    <ID>NewLineAtEndOfFile:HealthDiaryService.kt$com.mrozon.core_api.network.HealthDiaryService.kt</ID>
+    <ID>NewLineAtEndOfFile:ListPersonNavigator.kt$com.mrozon.core_api.navigation.ListPersonNavigator.kt</ID>
+    <ID>NewLineAtEndOfFile:LoginNavigator.kt$com.mrozon.core_api.navigation.LoginNavigator.kt</ID>
+    <ID>NewLineAtEndOfFile:LoginRequest.kt$com.mrozon.core_api.network.model.LoginRequest.kt</ID>
+    <ID>NewLineAtEndOfFile:LoginResponse.kt$com.mrozon.core_api.network.model.LoginResponse.kt</ID>
+    <ID>NewLineAtEndOfFile:MeasureType.kt$com.mrozon.core_api.entity.MeasureType.kt</ID>
+    <ID>NewLineAtEndOfFile:MeasureTypeDao.kt$com.mrozon.core_api.db.dao.MeasureTypeDao.kt</ID>
+    <ID>NewLineAtEndOfFile:MeasureTypeDb.kt$com.mrozon.core_api.db.model.MeasureTypeDb.kt</ID>
+    <ID>NewLineAtEndOfFile:MeasureTypeResponse.kt$com.mrozon.core_api.network.model.MeasureTypeResponse.kt</ID>
+    <ID>NewLineAtEndOfFile:MeasureTypeToMeasureTypeDbMapper.kt$com.mrozon.core_api.mapper.MeasureTypeToMeasureTypeDbMapper.kt</ID>
+    <ID>NewLineAtEndOfFile:NavigatorProvider.kt$com.mrozon.core_api.navigation.NavigatorProvider.kt</ID>
+    <ID>NewLineAtEndOfFile:NetworkProvider.kt$com.mrozon.core_api.network.NetworkProvider.kt</ID>
+    <ID>NewLineAtEndOfFile:Person.kt$com.mrozon.core_api.entity.Person.kt</ID>
+    <ID>NewLineAtEndOfFile:PersonDao.kt$com.mrozon.core_api.db.dao.PersonDao.kt</ID>
+    <ID>NewLineAtEndOfFile:PersonDb.kt$com.mrozon.core_api.db.model.PersonDb.kt</ID>
+    <ID>NewLineAtEndOfFile:PersonRequest.kt$com.mrozon.core_api.network.model.PersonRequest.kt</ID>
+    <ID>NewLineAtEndOfFile:PersonResponse.kt$com.mrozon.core_api.network.model.PersonResponse.kt</ID>
+    <ID>NewLineAtEndOfFile:PersonToPersonDbMapper.kt$com.mrozon.core_api.mapper.PersonToPersonDbMapper.kt</ID>
+    <ID>NewLineAtEndOfFile:ProvidersFacade.kt$com.mrozon.core_api.providers.ProvidersFacade.kt</ID>
+    <ID>NewLineAtEndOfFile:RegisterRequest.kt$com.mrozon.core_api.network.model.RegisterRequest.kt</ID>
+    <ID>NewLineAtEndOfFile:RegisterResponse.kt$com.mrozon.core_api.network.model.RegisterResponse.kt</ID>
+    <ID>NewLineAtEndOfFile:RegistrationNavigator.kt$com.mrozon.core_api.navigation.RegistrationNavigator.kt</ID>
+    <ID>NewLineAtEndOfFile:SecurityTokenProvider.kt$com.mrozon.core_api.security.SecurityTokenProvider.kt</ID>
+    <ID>NewLineAtEndOfFile:SecurityTokenService.kt$com.mrozon.core_api.security.SecurityTokenService.kt</ID>
+    <ID>NewLineAtEndOfFile:SharePersonRequest.kt$com.mrozon.core_api.network.model.SharePersonRequest.kt</ID>
+    <ID>NewLineAtEndOfFile:SingleSourceOfTruthStrategy.kt$com.mrozon.core_api.SingleSourceOfTruthStrategy.kt</ID>
+    <ID>NewLineAtEndOfFile:SplashNavigator.kt$com.mrozon.core_api.navigation.SplashNavigator.kt</ID>
+    <ID>NewLineAtEndOfFile:User.kt$com.mrozon.core_api.entity.User.kt</ID>
+    <ID>NewLineAtEndOfFile:UserDao.kt$com.mrozon.core_api.db.dao.UserDao.kt</ID>
+    <ID>NewLineAtEndOfFile:UserDb.kt$com.mrozon.core_api.db.model.UserDb.kt</ID>
+    <ID>NewLineAtEndOfFile:UserToUserDbMapper.kt$com.mrozon.core_api.mapper.UserToUserDbMapper.kt</ID>
+    <ID>NewLineAtEndOfFile:ViewModelKey.kt$com.mrozon.core_api.viewmodel.ViewModelKey.kt</ID>
+    <ID>NewLineAtEndOfFile:ViewModelsFactoryProvider.kt$com.mrozon.core_api.viewmodel.ViewModelsFactoryProvider.kt</ID>
+    <ID>PackageNaming:AppProvider.kt$package com.mrozon.core_api.providers</ID>
+    <ID>PackageNaming:AppWithFacade.kt$package com.mrozon.core_api.providers</ID>
+    <ID>PackageNaming:BlobTransmogrifier.kt$package com.mrozon.core_api.db</ID>
+    <ID>PackageNaming:CoroutineContextProvider.kt$package com.mrozon.core_api.providers</ID>
+    <ID>PackageNaming:DatabaseProvider.kt$package com.mrozon.core_api.db</ID>
+    <ID>PackageNaming:EditPersonNavigator.kt$package com.mrozon.core_api.navigation</ID>
+    <ID>PackageNaming:HealthDiaryDao.kt$package com.mrozon.core_api.db</ID>
+    <ID>PackageNaming:HealthDiaryDatabaseContract.kt$package com.mrozon.core_api.db</ID>
+    <ID>PackageNaming:HealthDiaryService.kt$package com.mrozon.core_api.network</ID>
+    <ID>PackageNaming:ListPersonNavigator.kt$package com.mrozon.core_api.navigation</ID>
+    <ID>PackageNaming:LoginNavigator.kt$package com.mrozon.core_api.navigation</ID>
+    <ID>PackageNaming:LoginRequest.kt$package com.mrozon.core_api.network.model</ID>
+    <ID>PackageNaming:LoginResponse.kt$package com.mrozon.core_api.network.model</ID>
+    <ID>PackageNaming:MeasureType.kt$package com.mrozon.core_api.entity</ID>
+    <ID>PackageNaming:MeasureTypeDao.kt$package com.mrozon.core_api.db.dao</ID>
+    <ID>PackageNaming:MeasureTypeDb.kt$package com.mrozon.core_api.db.model</ID>
+    <ID>PackageNaming:MeasureTypeResponse.kt$package com.mrozon.core_api.network.model</ID>
+    <ID>PackageNaming:MeasureTypeToMeasureTypeDbMapper.kt$package com.mrozon.core_api.mapper</ID>
+    <ID>PackageNaming:NavigatorProvider.kt$package com.mrozon.core_api.navigation</ID>
+    <ID>PackageNaming:NetworkProvider.kt$package com.mrozon.core_api.network</ID>
+    <ID>PackageNaming:Person.kt$package com.mrozon.core_api.entity</ID>
+    <ID>PackageNaming:PersonDao.kt$package com.mrozon.core_api.db.dao</ID>
+    <ID>PackageNaming:PersonDb.kt$package com.mrozon.core_api.db.model</ID>
+    <ID>PackageNaming:PersonRequest.kt$package com.mrozon.core_api.network.model</ID>
+    <ID>PackageNaming:PersonResponse.kt$package com.mrozon.core_api.network.model</ID>
+    <ID>PackageNaming:PersonToPersonDbMapper.kt$package com.mrozon.core_api.mapper</ID>
+    <ID>PackageNaming:ProvidersFacade.kt$package com.mrozon.core_api.providers</ID>
+    <ID>PackageNaming:RegisterRequest.kt$package com.mrozon.core_api.network.model</ID>
+    <ID>PackageNaming:RegisterResponse.kt$package com.mrozon.core_api.network.model</ID>
+    <ID>PackageNaming:RegistrationNavigator.kt$package com.mrozon.core_api.navigation</ID>
+    <ID>PackageNaming:SecurityTokenProvider.kt$package com.mrozon.core_api.security</ID>
+    <ID>PackageNaming:SecurityTokenService.kt$package com.mrozon.core_api.security</ID>
+    <ID>PackageNaming:SharePersonRequest.kt$package com.mrozon.core_api.network.model</ID>
+    <ID>PackageNaming:SingleSourceOfTruthStrategy.kt$package com.mrozon.core_api</ID>
+    <ID>PackageNaming:SplashNavigator.kt$package com.mrozon.core_api.navigation</ID>
+    <ID>PackageNaming:User.kt$package com.mrozon.core_api.entity</ID>
+    <ID>PackageNaming:UserDao.kt$package com.mrozon.core_api.db.dao</ID>
+    <ID>PackageNaming:UserDb.kt$package com.mrozon.core_api.db.model</ID>
+    <ID>PackageNaming:UserToUserDbMapper.kt$package com.mrozon.core_api.mapper</ID>
+    <ID>PackageNaming:ViewModelKey.kt$package com.mrozon.core_api.viewmodel</ID>
+    <ID>PackageNaming:ViewModelsFactoryProvider.kt$package com.mrozon.core_api.viewmodel</ID>
+    <ID>VariableNaming:CoroutineContextProvider.kt$CoroutineContextProvider$open val IO: CoroutineContext by lazy { Dispatchers.IO }</ID>
+    <ID>VariableNaming:CoroutineContextProvider.kt$CoroutineContextProvider$open val Main: CoroutineContext by lazy { Dispatchers.Main }</ID>
+    <ID>WildcardImport:HealthDiaryService.kt$import com.mrozon.core_api.network.model.*</ID>
+    <ID>WildcardImport:HealthDiaryService.kt$import retrofit2.http.*</ID>
+    <ID>WildcardImport:MeasureTypeDao.kt$import androidx.room.*</ID>
+    <ID>WildcardImport:PersonDao.kt$import androidx.room.*</ID>
+    <ID>WildcardImport:UserDao.kt$import androidx.room.*</ID>
+  </CurrentIssues>
+</SmellBaseline>

+ 15 - 2
core_impl/build.gradle

@@ -13,15 +13,28 @@ android {
         versionCode 1
         versionName "1.0"
 
+        javaCompileOptions {
+            annotationProcessorOptions {
+                arguments += [
+                        "room.schemaLocation":"$projectDir/schemas".toString(),
+                        "room.incremental":"true",
+                        "room.expandProjection":"true"]
+            }
+        }
+
         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
         consumerProguardFiles 'consumer-rules.pro'
     }
 
     buildTypes {
         release {
-            minifyEnabled false
+            minifyEnabled true
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
+        staging {
+            minifyEnabled true
+            signingConfig debug.signingConfig
+        }
     }
 
 }
@@ -44,7 +57,7 @@ dependencies {
     implementation securityCrypto
 
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'androidx.core:core-ktx:1.3.1'
     testImplementation 'junit:junit:4.12'

+ 22 - 0
core_impl/detekt-baseline.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" ?>
+<SmellBaseline>
+  <ManuallySuppressedIssues></ManuallySuppressedIssues>
+  <CurrentIssues>
+    <ID>NewLineAtEndOfFile:DatabaseComponent.kt$com.mrozon.core_impl.db.DatabaseComponent.kt</ID>
+    <ID>NewLineAtEndOfFile:DatabaseModule.kt$com.mrozon.core_impl.db.DatabaseModule.kt</ID>
+    <ID>NewLineAtEndOfFile:HealthDiaryDb.kt$com.mrozon.core_impl.db.HealthDiaryDb.kt</ID>
+    <ID>NewLineAtEndOfFile:NetworkComponent.kt$com.mrozon.core_impl.network.NetworkComponent.kt</ID>
+    <ID>NewLineAtEndOfFile:NetworkModule.kt$com.mrozon.core_impl.network.NetworkModule.kt</ID>
+    <ID>NewLineAtEndOfFile:SecurityTokenComponent.kt$com.mrozon.core_impl.crypto.SecurityTokenComponent.kt</ID>
+    <ID>NewLineAtEndOfFile:SecurityTokenModule.kt$com.mrozon.core_impl.crypto.SecurityTokenModule.kt</ID>
+    <ID>NewLineAtEndOfFile:SecurityTokenServiceImpl.kt$com.mrozon.core_impl.crypto.SecurityTokenServiceImpl.kt</ID>
+    <ID>PackageNaming:DatabaseComponent.kt$package com.mrozon.core_impl.db</ID>
+    <ID>PackageNaming:DatabaseModule.kt$package com.mrozon.core_impl.db</ID>
+    <ID>PackageNaming:HealthDiaryDb.kt$package com.mrozon.core_impl.db</ID>
+    <ID>PackageNaming:NetworkComponent.kt$package com.mrozon.core_impl.network</ID>
+    <ID>PackageNaming:NetworkModule.kt$package com.mrozon.core_impl.network</ID>
+    <ID>PackageNaming:SecurityTokenComponent.kt$package com.mrozon.core_impl.crypto</ID>
+    <ID>PackageNaming:SecurityTokenModule.kt$package com.mrozon.core_impl.crypto</ID>
+    <ID>PackageNaming:SecurityTokenServiceImpl.kt$package com.mrozon.core_impl.crypto</ID>
+  </CurrentIssues>
+</SmellBaseline>

+ 146 - 0
core_impl/schemas/com.mrozon.core_impl.db.HealthDiaryDb/1.json

@@ -0,0 +1,146 @@
+{
+  "formatVersion": 1,
+  "database": {
+    "version": 1,
+    "identityHash": "1fbfe00709ec7129d957473024f00645",
+    "entities": [
+      {
+        "tableName": "user_table",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`user_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `user_email` TEXT NOT NULL, `user_firstname` TEXT NOT NULL, `user_token` TEXT NOT NULL, `user_lastname` TEXT NOT NULL)",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "user_id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "email",
+            "columnName": "user_email",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "firstname",
+            "columnName": "user_firstname",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "token",
+            "columnName": "user_token",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "lastname",
+            "columnName": "user_lastname",
+            "affinity": "TEXT",
+            "notNull": true
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "user_id"
+          ],
+          "autoGenerate": true
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "person_table",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`person_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `person_name` TEXT NOT NULL, `person_gender` INTEGER NOT NULL, `user_born` INTEGER NOT NULL)",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "person_id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "person_name",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "gender",
+            "columnName": "person_gender",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "born",
+            "columnName": "user_born",
+            "affinity": "INTEGER",
+            "notNull": true
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "person_id"
+          ],
+          "autoGenerate": true
+        },
+        "indices": [],
+        "foreignKeys": []
+      },
+      {
+        "tableName": "measure_type_table",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`measure_type_id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `measure_type_name` TEXT NOT NULL, `measure_type_mark` TEXT NOT NULL, `measure_type_regexp` TEXT NOT NULL, `measure_type_hint` TEXT NOT NULL, `measure_type_url` TEXT NOT NULL)",
+        "fields": [
+          {
+            "fieldPath": "id",
+            "columnName": "measure_type_id",
+            "affinity": "INTEGER",
+            "notNull": true
+          },
+          {
+            "fieldPath": "name",
+            "columnName": "measure_type_name",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "mark",
+            "columnName": "measure_type_mark",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "regexp",
+            "columnName": "measure_type_regexp",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "hint",
+            "columnName": "measure_type_hint",
+            "affinity": "TEXT",
+            "notNull": true
+          },
+          {
+            "fieldPath": "url",
+            "columnName": "measure_type_url",
+            "affinity": "TEXT",
+            "notNull": true
+          }
+        ],
+        "primaryKey": {
+          "columnNames": [
+            "measure_type_id"
+          ],
+          "autoGenerate": true
+        },
+        "indices": [],
+        "foreignKeys": []
+      }
+    ],
+    "views": [],
+    "setupQueries": [
+      "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
+      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1fbfe00709ec7129d957473024f00645')"
+    ]
+  }
+}

+ 1 - 1
detekt-config.yml

@@ -1,5 +1,5 @@
 build:
-  maxIssues: 4
+  maxIssues: 3
   excludeCorrectable: false
   weights:
   # complexity: 2

+ 1 - 0
detekt.gradle

@@ -6,6 +6,7 @@ detekt {
     parallel = true                                         // Builds the AST in parallel. Rules are always executed in parallel. Can lead to speedups in larger projects. `false` by default.
     //filters = ".*build.*,.*/resources/.*,.*/tmp/.*"         // Regular expression of paths that should be excluded separated by `;` or `,`.
     config = files("$rootDir/detekt-config.yml")            // Define the detekt configuration(s) you want to use. Defaults to the default detekt configuration.
+    baseline = file("$projectDir/detekt-baseline.xml")
     reports {
         xml {
             enabled = true                                  // Enable/Disable XML report (default: true)

+ 10 - 1
feature_auth/build.gradle

@@ -24,9 +24,14 @@ android {
             testCoverageEnabled true
         }
         release {
-            minifyEnabled false
+            minifyEnabled true
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
+        staging {
+            initWith debug
+            minifyEnabled true
+            signingConfig debug.signingConfig
+        }
     }
     dataBinding {
         enabled = true
@@ -38,6 +43,10 @@ android {
     kotlinOptions {
         jvmTarget = '1.8'
     }
+    lintOptions {
+        disable "NullSafeMutableLiveData"
+    }
+
 }
 
 apply from: "$project.rootDir/scripts/deps_versions.gradle"

+ 45 - 0
feature_auth/detekt-baseline.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" ?>
+<SmellBaseline>
+  <ManuallySuppressedIssues></ManuallySuppressedIssues>
+  <CurrentIssues>
+    <ID>ComplexMethod:RegistrationFragment.kt$RegistrationFragment$@ExperimentalCoroutinesApi @FlowPreview override fun subscribeUi()</ID>
+    <ID>MagicNumber:RegistrationFragmentViewModel.kt$RegistrationFragmentViewModel.&lt;no name provided&gt;$3</ID>
+    <ID>MagicNumber:RegistrationFragmentViewModel.kt$RegistrationFragmentViewModel.&lt;no name provided&gt;$4</ID>
+    <ID>MagicNumber:RegistrationFragmentViewModel.kt$ValidateDataError.FIRST_NAME_EMPTY$40</ID>
+    <ID>MagicNumber:RegistrationFragmentViewModel.kt$ValidateDataError.INCORRECT_EMAIL$10</ID>
+    <ID>MagicNumber:RegistrationFragmentViewModel.kt$ValidateDataError.LAST_NAME_EMPTY$50</ID>
+    <ID>MagicNumber:RegistrationFragmentViewModel.kt$ValidateDataError.PASSWORD_AGAIN_EMPTY$21</ID>
+    <ID>MagicNumber:RegistrationFragmentViewModel.kt$ValidateDataError.PASSWORD_EMPTY$20</ID>
+    <ID>MagicNumber:RegistrationFragmentViewModel.kt$ValidateDataError.PASSWORD_NOT_EQUAL$30</ID>
+    <ID>MaxLineLength:RegistrationFragmentViewModel.kt$RegistrationFragmentViewModel$val user = User(email = emailChannel.value, firstname = firstNameChannel.value, lastname = lastNameChannel.value)</ID>
+    <ID>NewLineAtEndOfFile:DaggerViewModelFactory.kt$com.mrozon.feature_auth.di.DaggerViewModelFactory.kt</ID>
+    <ID>NewLineAtEndOfFile:LoginFragment.kt$com.mrozon.feature_auth.presentation.LoginFragment.kt</ID>
+    <ID>NewLineAtEndOfFile:LoginFragmentComponent.kt$com.mrozon.feature_auth.di.LoginFragmentComponent.kt</ID>
+    <ID>NewLineAtEndOfFile:LoginFragmentModule.kt$com.mrozon.feature_auth.di.LoginFragmentModule.kt</ID>
+    <ID>NewLineAtEndOfFile:LoginFragmentViewModel.kt$com.mrozon.feature_auth.presentation.LoginFragmentViewModel.kt</ID>
+    <ID>NewLineAtEndOfFile:RegistrationFragment.kt$com.mrozon.feature_auth.presentation.RegistrationFragment.kt</ID>
+    <ID>NewLineAtEndOfFile:RegistrationFragmentComponent.kt$com.mrozon.feature_auth.di.RegistrationFragmentComponent.kt</ID>
+    <ID>NewLineAtEndOfFile:RegistrationFragmentModule.kt$com.mrozon.feature_auth.di.RegistrationFragmentModule.kt</ID>
+    <ID>NewLineAtEndOfFile:RegistrationFragmentViewModel.kt$com.mrozon.feature_auth.presentation.RegistrationFragmentViewModel.kt</ID>
+    <ID>NewLineAtEndOfFile:UserAuthRemoteDataSource.kt$com.mrozon.feature_auth.data.UserAuthRemoteDataSource.kt</ID>
+    <ID>NewLineAtEndOfFile:UserAuthRepository.kt$com.mrozon.feature_auth.data.UserAuthRepository.kt</ID>
+    <ID>NewLineAtEndOfFile:UserAuthRepositoryImpl.kt$com.mrozon.feature_auth.data.UserAuthRepositoryImpl.kt</ID>
+    <ID>PackageNaming:DaggerViewModelFactory.kt$package com.mrozon.feature_auth.di</ID>
+    <ID>PackageNaming:LoginFragment.kt$package com.mrozon.feature_auth.presentation</ID>
+    <ID>PackageNaming:LoginFragmentComponent.kt$package com.mrozon.feature_auth.di</ID>
+    <ID>PackageNaming:LoginFragmentModule.kt$package com.mrozon.feature_auth.di</ID>
+    <ID>PackageNaming:LoginFragmentViewModel.kt$package com.mrozon.feature_auth.presentation</ID>
+    <ID>PackageNaming:RegistrationFragment.kt$package com.mrozon.feature_auth.presentation</ID>
+    <ID>PackageNaming:RegistrationFragmentComponent.kt$package com.mrozon.feature_auth.di</ID>
+    <ID>PackageNaming:RegistrationFragmentModule.kt$package com.mrozon.feature_auth.di</ID>
+    <ID>PackageNaming:RegistrationFragmentViewModel.kt$package com.mrozon.feature_auth.presentation</ID>
+    <ID>PackageNaming:UserAuthRemoteDataSource.kt$package com.mrozon.feature_auth.data</ID>
+    <ID>PackageNaming:UserAuthRepository.kt$package com.mrozon.feature_auth.data</ID>
+    <ID>PackageNaming:UserAuthRepositoryImpl.kt$package com.mrozon.feature_auth.data</ID>
+    <ID>TooGenericExceptionCaught:DaggerViewModelFactory.kt$DaggerViewModelFactory$e: Exception</ID>
+    <ID>TooGenericExceptionThrown:DaggerViewModelFactory.kt$DaggerViewModelFactory$throw RuntimeException(e)</ID>
+    <ID>WildcardImport:LoginFragmentViewModel.kt$import kotlinx.coroutines.*</ID>
+    <ID>WildcardImport:RegistrationFragmentViewModel.kt$import kotlinx.coroutines.*</ID>
+    <ID>WildcardImport:UserAuthRepositoryImpl.kt$import com.mrozon.core_api.network.model.*</ID>
+  </CurrentIssues>
+</SmellBaseline>

+ 6 - 1
feature_measure_type/build.gradle

@@ -24,9 +24,14 @@ android {
             testCoverageEnabled true
         }
         release {
-            minifyEnabled false
+            minifyEnabled true
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
+        staging {
+            initWith debug
+            minifyEnabled true
+            signingConfig debug.signingConfig
+        }
     }
     dataBinding {
         enabled = true

+ 30 - 0
feature_measure_type/detekt-baseline.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" ?>
+<SmellBaseline>
+  <ManuallySuppressedIssues></ManuallySuppressedIssues>
+  <CurrentIssues>
+    <ID>NewLineAtEndOfFile:DaggerViewModelFactory.kt$com.mrozon.feature_measure_type.di.DaggerViewModelFactory.kt</ID>
+    <ID>NewLineAtEndOfFile:ListMeasureTypeFragment.kt$com.mrozon.feature_measure_type.presentation.ListMeasureTypeFragment.kt</ID>
+    <ID>NewLineAtEndOfFile:ListMeasureTypeFragmentComponent.kt$com.mrozon.feature_measure_type.di.ListMeasureTypeFragmentComponent.kt</ID>
+    <ID>NewLineAtEndOfFile:ListMeasureTypeFragmentModule.kt$com.mrozon.feature_measure_type.di.ListMeasureTypeFragmentModule.kt</ID>
+    <ID>NewLineAtEndOfFile:ListMeasureTypeFragmentViewModel.kt$com.mrozon.feature_measure_type.presentation.ListMeasureTypeFragmentViewModel.kt</ID>
+    <ID>NewLineAtEndOfFile:MeasureTypeAdapter.kt$com.mrozon.feature_measure_type.presentation.MeasureTypeAdapter.kt</ID>
+    <ID>NewLineAtEndOfFile:MeasureTypeRemoteDataSource.kt$com.mrozon.feature_measure_type.data.MeasureTypeRemoteDataSource.kt</ID>
+    <ID>NewLineAtEndOfFile:MeasureTypeRepository.kt$com.mrozon.feature_measure_type.data.MeasureTypeRepository.kt</ID>
+    <ID>NewLineAtEndOfFile:MeasureTypeRepositoryImpl.kt$com.mrozon.feature_measure_type.data.MeasureTypeRepositoryImpl.kt</ID>
+    <ID>PackageNaming:BindingUtils.kt$package com.mrozon.feature_measure_type.presentation</ID>
+    <ID>PackageNaming:DaggerViewModelFactory.kt$package com.mrozon.feature_measure_type.di</ID>
+    <ID>PackageNaming:ListMeasureTypeFragment.kt$package com.mrozon.feature_measure_type.presentation</ID>
+    <ID>PackageNaming:ListMeasureTypeFragmentComponent.kt$package com.mrozon.feature_measure_type.di</ID>
+    <ID>PackageNaming:ListMeasureTypeFragmentModule.kt$package com.mrozon.feature_measure_type.di</ID>
+    <ID>PackageNaming:ListMeasureTypeFragmentViewModel.kt$package com.mrozon.feature_measure_type.presentation</ID>
+    <ID>PackageNaming:MeasureTypeAdapter.kt$package com.mrozon.feature_measure_type.presentation</ID>
+    <ID>PackageNaming:MeasureTypeRemoteDataSource.kt$package com.mrozon.feature_measure_type.data</ID>
+    <ID>PackageNaming:MeasureTypeRepository.kt$package com.mrozon.feature_measure_type.data</ID>
+    <ID>PackageNaming:MeasureTypeRepositoryImpl.kt$package com.mrozon.feature_measure_type.data</ID>
+    <ID>TooGenericExceptionCaught:DaggerViewModelFactory.kt$DaggerViewModelFactory$e: Exception</ID>
+    <ID>TooGenericExceptionThrown:DaggerViewModelFactory.kt$DaggerViewModelFactory$throw RuntimeException(e)</ID>
+    <ID>VariableNaming:ListMeasureTypeFragmentViewModel.kt$ListMeasureTypeFragmentViewModel$private val _measure_types = MutableLiveData&lt;Event&lt;Result&lt;List&lt;MeasureType&gt;&gt;&gt;&gt;()</ID>
+    <ID>VariableNaming:ListMeasureTypeFragmentViewModel.kt$ListMeasureTypeFragmentViewModel$val measure_types: LiveData&lt;Event&lt;Result&lt;List&lt;MeasureType&gt;&gt;&gt;&gt; get() = _measure_types</ID>
+    <ID>WildcardImport:ListMeasureTypeFragment.kt$import android.view.*</ID>
+  </CurrentIssues>
+</SmellBaseline>

+ 6 - 1
feature_person/build.gradle

@@ -24,9 +24,14 @@ android {
             testCoverageEnabled true
         }
         release {
-            minifyEnabled false
+            minifyEnabled true
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
+        staging {
+            initWith debug
+            minifyEnabled true
+            signingConfig debug.signingConfig
+        }
     }
     dataBinding {
         enabled = true

+ 52 - 0
feature_person/detekt-baseline.xml

@@ -0,0 +1,52 @@
+<?xml version="1.0" ?>
+<SmellBaseline>
+  <ManuallySuppressedIssues></ManuallySuppressedIssues>
+  <CurrentIssues>
+    <ID>ComplexMethod:EditPersonFragment.kt$EditPersonFragment$@ExperimentalCoroutinesApi @FlowPreview override fun subscribeUi()</ID>
+    <ID>LongMethod:EditPersonFragment.kt$EditPersonFragment$@ExperimentalCoroutinesApi @FlowPreview override fun subscribeUi()</ID>
+    <ID>MagicNumber:EditPersonFragment.kt$EditPersonFragment$2020</ID>
+    <ID>MagicNumber:GenderSwitch.kt$GenderSwitch$2.5</ID>
+    <ID>MagicNumber:GenderSwitch.kt$GenderSwitch$75</ID>
+    <ID>MaxLineLength:EditPersonFragmentViewModel.kt$EditPersonFragmentViewModel : BaseViewModel</ID>
+    <ID>MaxLineLength:EditPersonFragmentViewModel.kt$EditPersonFragmentViewModel$val personEntity = Person(id = id, name = personNameChannel.value, gender = gender, born = personDobChannel.value )</ID>
+    <ID>MaxLineLength:ListPersonAdapter.kt$ListPersonAdapter : ListAdapter</ID>
+    <ID>NestedBlockDepth:GenderSwitch.kt$GenderSwitch$override fun onTouchEvent(event: MotionEvent?): Boolean</ID>
+    <ID>NewLineAtEndOfFile:DaggerViewModelFactory.kt$com.mrozon.feature_person.di.DaggerViewModelFactory.kt</ID>
+    <ID>NewLineAtEndOfFile:EditPersonFragment.kt$com.mrozon.feature_person.presentation.EditPersonFragment.kt</ID>
+    <ID>NewLineAtEndOfFile:EditPersonFragmentComponent.kt$com.mrozon.feature_person.di.EditPersonFragmentComponent.kt</ID>
+    <ID>NewLineAtEndOfFile:EditPersonFragmentModule.kt$com.mrozon.feature_person.di.EditPersonFragmentModule.kt</ID>
+    <ID>NewLineAtEndOfFile:EditPersonFragmentViewModel.kt$com.mrozon.feature_person.presentation.EditPersonFragmentViewModel.kt</ID>
+    <ID>NewLineAtEndOfFile:GenderSwitch.kt$com.mrozon.feature_person.customview.GenderSwitch.kt</ID>
+    <ID>NewLineAtEndOfFile:ListPersonFragment.kt$com.mrozon.feature_person.presentation.ListPersonFragment.kt</ID>
+    <ID>NewLineAtEndOfFile:ListPersonFragmentComponent.kt$com.mrozon.feature_person.di.ListPersonFragmentComponent.kt</ID>
+    <ID>NewLineAtEndOfFile:ListPersonFragmentModule.kt$com.mrozon.feature_person.di.ListPersonFragmentModule.kt</ID>
+    <ID>NewLineAtEndOfFile:ListPersonFragmentViewModel.kt$com.mrozon.feature_person.presentation.ListPersonFragmentViewModel.kt</ID>
+    <ID>NewLineAtEndOfFile:PersonRemoteDataSource.kt$com.mrozon.feature_person.data.PersonRemoteDataSource.kt</ID>
+    <ID>NewLineAtEndOfFile:PersonRepository.kt$com.mrozon.feature_person.data.PersonRepository.kt</ID>
+    <ID>NewLineAtEndOfFile:PersonRepositoryImpl.kt$com.mrozon.feature_person.data.PersonRepositoryImpl.kt</ID>
+    <ID>PackageNaming:BindingUtils.kt$package com.mrozon.feature_person.presentation</ID>
+    <ID>PackageNaming:DaggerViewModelFactory.kt$package com.mrozon.feature_person.di</ID>
+    <ID>PackageNaming:EditPersonFragment.kt$package com.mrozon.feature_person.presentation</ID>
+    <ID>PackageNaming:EditPersonFragmentComponent.kt$package com.mrozon.feature_person.di</ID>
+    <ID>PackageNaming:EditPersonFragmentModule.kt$package com.mrozon.feature_person.di</ID>
+    <ID>PackageNaming:EditPersonFragmentViewModel.kt$package com.mrozon.feature_person.presentation</ID>
+    <ID>PackageNaming:GenderSwitch.kt$package com.mrozon.feature_person.customview</ID>
+    <ID>PackageNaming:ListPersonAdapter.kt$package com.mrozon.feature_person.presentation</ID>
+    <ID>PackageNaming:ListPersonFragment.kt$package com.mrozon.feature_person.presentation</ID>
+    <ID>PackageNaming:ListPersonFragmentComponent.kt$package com.mrozon.feature_person.di</ID>
+    <ID>PackageNaming:ListPersonFragmentModule.kt$package com.mrozon.feature_person.di</ID>
+    <ID>PackageNaming:ListPersonFragmentViewModel.kt$package com.mrozon.feature_person.presentation</ID>
+    <ID>PackageNaming:PersonRemoteDataSource.kt$package com.mrozon.feature_person.data</ID>
+    <ID>PackageNaming:PersonRepository.kt$package com.mrozon.feature_person.data</ID>
+    <ID>PackageNaming:PersonRepositoryImpl.kt$package com.mrozon.feature_person.data</ID>
+    <ID>TooGenericExceptionCaught:DaggerViewModelFactory.kt$DaggerViewModelFactory$e: Exception</ID>
+    <ID>TooGenericExceptionCaught:PersonRepositoryImpl.kt$PersonRepositoryImpl$e: Exception</ID>
+    <ID>TooGenericExceptionThrown:DaggerViewModelFactory.kt$DaggerViewModelFactory$throw RuntimeException(e)</ID>
+    <ID>VariableNaming:EditPersonFragment.kt$EditPersonFragment$val current_id = arguments?.getLong("current_id", -1)?:-1</ID>
+    <ID>WildcardImport:EditPersonFragment.kt$import android.view.*</ID>
+    <ID>WildcardImport:EditPersonFragment.kt$import com.mrozon.utils.extension.*</ID>
+    <ID>WildcardImport:EditPersonFragmentViewModel.kt$import kotlinx.coroutines.*</ID>
+    <ID>WildcardImport:ListPersonFragment.kt$import android.view.*</ID>
+    <ID>WildcardImport:PersonRepositoryImpl.kt$import kotlinx.coroutines.flow.*</ID>
+  </CurrentIssues>
+</SmellBaseline>

+ 6 - 2
feature_splash/build.gradle

@@ -19,9 +19,13 @@ android {
 
     buildTypes {
         release {
-            minifyEnabled false
+            minifyEnabled true
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
+        staging {
+            minifyEnabled true
+            signingConfig debug.signingConfig
+        }
     }
     dataBinding {
         enabled = true
@@ -61,7 +65,7 @@ dependencies {
     implementation "androidx.fragment:fragment-ktx:1.2.5"
 
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'androidx.core:core-ktx:1.3.1'
     testImplementation 'junit:junit:4.12'

+ 23 - 0
feature_splash/detekt-baseline.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" ?>
+<SmellBaseline>
+  <ManuallySuppressedIssues></ManuallySuppressedIssues>
+  <CurrentIssues>
+    <ID>NewLineAtEndOfFile:DaggerViewModelFactory.kt$com.mrozon.feature_splash.di.DaggerViewModelFactory.kt</ID>
+    <ID>NewLineAtEndOfFile:PreloadDataRemoteDataSource.kt$com.mrozon.feature_splash.data.PreloadDataRemoteDataSource.kt</ID>
+    <ID>NewLineAtEndOfFile:PreloadDataRepository.kt$com.mrozon.feature_splash.data.PreloadDataRepository.kt</ID>
+    <ID>NewLineAtEndOfFile:PreloadDataRepositoryImp.kt$com.mrozon.feature_splash.data.PreloadDataRepositoryImp.kt</ID>
+    <ID>NewLineAtEndOfFile:SplashFragmentComponent.kt$com.mrozon.feature_splash.di.SplashFragmentComponent.kt</ID>
+    <ID>NewLineAtEndOfFile:SplashFragmentModule.kt$com.mrozon.feature_splash.di.SplashFragmentModule.kt</ID>
+    <ID>NewLineAtEndOfFile:SplashFragmentViewModel.kt$com.mrozon.feature_splash.presentation.SplashFragmentViewModel.kt</ID>
+    <ID>PackageNaming:DaggerViewModelFactory.kt$package com.mrozon.feature_splash.di</ID>
+    <ID>PackageNaming:PreloadDataRemoteDataSource.kt$package com.mrozon.feature_splash.data</ID>
+    <ID>PackageNaming:PreloadDataRepository.kt$package com.mrozon.feature_splash.data</ID>
+    <ID>PackageNaming:PreloadDataRepositoryImp.kt$package com.mrozon.feature_splash.data</ID>
+    <ID>PackageNaming:SplashFragment.kt$package com.mrozon.feature_splash.presentation</ID>
+    <ID>PackageNaming:SplashFragmentComponent.kt$package com.mrozon.feature_splash.di</ID>
+    <ID>PackageNaming:SplashFragmentModule.kt$package com.mrozon.feature_splash.di</ID>
+    <ID>PackageNaming:SplashFragmentViewModel.kt$package com.mrozon.feature_splash.presentation</ID>
+    <ID>TooGenericExceptionCaught:DaggerViewModelFactory.kt$DaggerViewModelFactory$e: Exception</ID>
+    <ID>TooGenericExceptionThrown:DaggerViewModelFactory.kt$DaggerViewModelFactory$throw RuntimeException(e)</ID>
+  </CurrentIssues>
+</SmellBaseline>

+ 1 - 0
lint_repo/.gitignore

@@ -0,0 +1 @@
+/build

+ 25 - 0
lint_repo/build.gradle

@@ -0,0 +1,25 @@
+plugins {
+    id 'java-library'
+    id 'kotlin'
+}
+
+java {
+    sourceCompatibility = JavaVersion.VERSION_1_8
+    targetCompatibility = JavaVersion.VERSION_1_8
+}
+
+jar {
+    manifest {
+        attributes 'Lint-Registry-v2':'com.mrozon.lintrepo.CustomLintRegistry'
+    }
+}
+
+dependencies {
+    def lintVersion = "26.6.4"
+
+    compileOnly "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+
+    compileOnly "com.android.tools.lint:lint-api:$lintVersion"
+    compileOnly "com.android.tools.lint:lint-checks:$lintVersion"
+    testImplementation "com.android.tools.lint:lint-tests:$lintVersion"
+}

+ 13 - 0
lint_repo/detekt-baseline.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" ?>
+<SmellBaseline>
+  <ManuallySuppressedIssues></ManuallySuppressedIssues>
+  <CurrentIssues>
+    <ID>NestedBlockDepth:RawColorDetector.kt$RawColorDetector$override fun visitElement(context: XmlContext, element: Element)</ID>
+    <ID>NewLineAtEndOfFile:CustomLintRegistry.kt$com.mrozon.lintrepo.CustomLintRegistry.kt</ID>
+    <ID>NewLineAtEndOfFile:RawColorDetector.kt$com.mrozon.lintrepo.RawColorDetector.kt</ID>
+    <ID>NewLineAtEndOfFile:VerySimpleNamingVariablesDetector.kt$com.mrozon.lintrepo.VerySimpleNamingVariablesDetector.kt</ID>
+    <ID>WildcardImport:RawColorDetector.kt$import com.android.tools.lint.detector.api.*</ID>
+    <ID>WildcardImport:VerySimpleNamingVariablesDetector.kt$import com.android.tools.lint.detector.api.*</ID>
+    <ID>WildcardImport:VerySimpleNamingVariablesDetector.kt$import org.jetbrains.uast.*</ID>
+  </CurrentIssues>
+</SmellBaseline>

+ 13 - 0
lint_repo/src/main/java/com/mrozon/lintrepo/CustomLintRegistry.kt

@@ -0,0 +1,13 @@
+package com.mrozon.lintrepo
+
+import com.android.tools.lint.client.api.IssueRegistry
+import com.android.tools.lint.detector.api.Issue
+
+class CustomLintRegistry : IssueRegistry() {
+
+    override val issues: List<Issue>
+        get() = listOf(
+            VerySimpleNamingVariablesDetector.ISSUE_VERY_SIMPLE_NAMING_VARIABLES,
+            RawColorDetector.ISSUE_RAW_COLOR_RESOURCES
+        )
+}

+ 64 - 0
lint_repo/src/main/java/com/mrozon/lintrepo/RawColorDetector.kt

@@ -0,0 +1,64 @@
+package com.mrozon.lintrepo
+
+import com.android.tools.lint.detector.api.*
+import com.android.utils.forEach
+import com.sun.org.apache.xerces.internal.dom.AttrImpl
+import com.sun.org.apache.xerces.internal.dom.AttrNSImpl
+import org.w3c.dom.Attr
+import org.w3c.dom.Element
+import org.w3c.dom.Node
+
+class RawColorDetector: ResourceXmlDetector() {
+
+    companion object {
+
+        val ISSUE_RAW_COLOR_RESOURCES = Issue.create(
+            "RawColorInResources",
+            "Using row color in tags - too bad((",
+            "Needed using colors resource, but NOT use raw color in tags",
+            Category.USABILITY,
+            6,
+            Severity.WARNING,
+            Implementation(
+                RawColorDetector::class.java,
+                Scope.RESOURCE_FILE_SCOPE
+            )
+
+        )
+
+        val INTERESTED_TAGS = listOf(
+            "color",
+            "background",
+            "background",
+            "tint"
+        )
+
+    }
+
+    override fun getApplicableElements(): Collection<String>? = XmlScannerConstants.ALL
+
+    override fun visitElement(context: XmlContext, element: Element) {
+        element.childNodes.forEach { node ->
+            if(node.hasAttributes()){
+                node.attributes.forEach { item ->
+                    val name = (item as AttrImpl).name
+                    INTERESTED_TAGS.forEach { tag ->
+                        if (name.contains(tag, true)) {
+                            item.nodeValue?.let { nodeName ->
+                                if (nodeName.startsWith("#"))
+                                    context.report(
+                                        ISSUE_RAW_COLOR_RESOURCES,
+                                        element,
+                                        context.getLocation(item),
+                                        "Using row color in tags"
+                                    )
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+
+}

+ 70 - 0
lint_repo/src/main/java/com/mrozon/lintrepo/VerySimpleNamingVariablesDetector.kt

@@ -0,0 +1,70 @@
+package com.mrozon.lintrepo
+
+import com.android.tools.lint.client.api.UElementHandler
+import com.android.tools.lint.detector.api.*
+import org.jetbrains.uast.*
+import org.jetbrains.uast.kotlin.KotlinUAnnotatedLocalVariable
+import org.jetbrains.uast.visitor.AbstractUastVisitor
+import java.util.*
+
+class VerySimpleNamingVariablesDetector : Detector(), Detector.UastScanner {
+
+    companion object {
+        val ISSUE_VERY_SIMPLE_NAMING_VARIABLES = Issue.create(
+            "VerySimpleNamingVariables",
+            "One letter - too bad((",
+            "You named your variable use only ONE letter",
+            Category.USABILITY,
+            6,
+            Severity.WARNING,
+            Implementation(
+                VerySimpleNamingVariablesDetector::class.java,
+                EnumSet.of(Scope.JAVA_FILE)
+            )
+
+        )
+    }
+
+    override fun getApplicableUastTypes() = listOf(UClass::class.java)
+
+    override fun createUastHandler(context: JavaContext) = VerySimpleNamingVariablesDetectorVisitor(context)
+
+    class VerySimpleNamingVariablesDetectorVisitor (private val context: JavaContext):
+        UElementHandler() {
+
+        override fun visitClass(node: UClass) {
+//            print(node.asRecursiveLogString())
+
+            node.accept(object: AbstractUastVisitor() {
+
+                override fun visitField(node: UField): Boolean {
+                    if (node.name.length < 2) {
+                        context.report(
+                            ISSUE_VERY_SIMPLE_NAMING_VARIABLES,
+                            node, context.getLocation(node), "Incorrect named variable"
+                        )
+                    }
+                    return super.visitField(node)
+                }
+
+                override fun visitDeclarationsExpression(node: UDeclarationsExpression): Boolean {
+                    node.declarations.forEach { declaration ->
+                        if(declaration is KotlinUAnnotatedLocalVariable){
+                            declaration.name?.let {
+                                if (it.length < 2) {
+                                    context.report(
+                                        ISSUE_VERY_SIMPLE_NAMING_VARIABLES,
+                                        node, context.getLocation(node), "Incorrect named variable"
+                                    )
+                                }
+                            }
+                        }
+                    }
+                    return super.visitDeclarationsExpression(node)
+                }
+
+            })
+        }
+    }
+
+}

+ 81 - 0
lint_repo/src/test/java/com/mrozon/lintrepo/RawColorDetectorTest.kt

@@ -0,0 +1,81 @@
+package com.mrozon.lintrepo
+
+import com.android.tools.lint.checks.infrastructure.LintDetectorTest.xml
+import com.android.tools.lint.checks.infrastructure.TestLintTask
+import org.junit.Test
+
+class RawColorDetectorTest {
+
+    @Test
+    fun `incorrect xml resource`() {
+        TestLintTask.lint()
+            .allowMissingSdk()
+            .files(
+                xml(
+                    "/res/layout/custom_layout.xml",
+                    """
+                        <layout xmlns:android="http://schemas.android.com/apk/res/android"
+                            xmlns:app="http://schemas.android.com/apk/res-auto">
+                                    <EditText
+                                        android:id="@+id/etUserName"
+                                        android:layout_width="0dp"
+                                        android:layout_height="wrap_content"
+                                        android:layout_marginStart="32dp"
+                                        android:layout_marginEnd="32dp"
+                                        android:ems="10"
+                                        android:textColor="#444444"
+                                        android:gravity="center"
+                                        android:hint="@string/etUsername"
+                                        android:inputType="textEmailAddress"
+                                        app:layout_constraintEnd_toEndOf="parent"
+                                        app:layout_constraintStart_toStartOf="parent"
+                                        app:layout_constraintTop_toTopOf="@+id/guideline" />
+                        </layout>
+                    """
+                )
+            )
+            .issues(RawColorDetector.ISSUE_RAW_COLOR_RESOURCES)
+            .run()
+            .expect("""
+                res/layout/custom_layout.xml:11: Warning: Using row color in tags [RawColorInResources]
+                                                        android:textColor="#444444"
+                                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+                0 errors, 1 warnings
+            """.trimIndent())
+    }
+
+    @Test
+    fun `correct xml resource`() {
+        TestLintTask.lint()
+            .allowMissingSdk()
+            .files(
+                xml(
+                    "/res/layout/custom_layout.xml",
+                    """
+                        <layout xmlns:android="http://schemas.android.com/apk/res/android"
+                            xmlns:app="http://schemas.android.com/apk/res-auto">
+                                    <EditText
+                                        android:id="@+id/etUserName"
+                                        android:layout_width="0dp"
+                                        android:layout_height="wrap_content"
+                                        android:layout_marginStart="32dp"
+                                        android:layout_marginEnd="32dp"
+                                        android:ems="10"
+                                        android:textColor="@color/color_snack_error"
+                                        android:gravity="center"
+                                        android:hint="@string/etUsername"
+                                        android:inputType="textEmailAddress"
+                                        app:layout_constraintEnd_toEndOf="parent"
+                                        app:layout_constraintStart_toStartOf="parent"
+                                        app:layout_constraintTop_toTopOf="@+id/guideline" />
+                        </layout>
+                    """
+                )
+            )
+            .issues(RawColorDetector.ISSUE_RAW_COLOR_RESOURCES)
+            .run()
+            .expectClean()
+    }
+
+
+}

+ 91 - 0
lint_repo/src/test/java/com/mrozon/lintrepo/VerySimpleNamingVariablesDetectorTest.kt

@@ -0,0 +1,91 @@
+package com.mrozon.lintrepo
+
+import com.android.tools.lint.checks.infrastructure.LintDetectorTest.kotlin
+import com.android.tools.lint.checks.infrastructure.TestLintTask.lint
+import com.mrozon.lintrepo.VerySimpleNamingVariablesDetector.Companion.ISSUE_VERY_SIMPLE_NAMING_VARIABLES
+import org.junit.Test
+
+class VerySimpleNamingVariablesDetectorTest {
+
+    @Test
+    fun `incorrect naming in kt file`() {
+        lint()
+            .allowMissingSdk()
+            .files(
+                kotlin(
+                    """
+                        class TestClass() {
+                            
+                            var d2 = 1
+                            var a = 1
+
+                            fun doAction(savedInstanceState: Bundle?) {
+                                d2 += 1
+                            }
+                        }
+                    """
+                )
+            )
+            .issues(ISSUE_VERY_SIMPLE_NAMING_VARIABLES)
+            .run()
+            .expect("""
+                src/TestClass.kt:5: Warning: Incorrect named variable [VerySimpleNamingVariables]
+                                            var a = 1
+                                            ~~~~~~~~~
+                0 errors, 1 warnings
+            """.trimIndent())
+    }
+
+    @Test
+    fun `incorrect naming in inner fun`() {
+        lint()
+            .allowMissingSdk()
+            .files(
+                kotlin(
+                    """
+                        class TestClass() {
+                            
+                            var d2 = 1
+
+                            fun doAction(savedInstanceState: Bundle?) {
+                                val t = "dsjfkh"
+                                d2 += 1
+                            }
+                        }
+                    """
+                )
+            )
+            .issues(ISSUE_VERY_SIMPLE_NAMING_VARIABLES)
+            .run()
+            .expect("""
+                src/TestClass.kt:7: Warning: Incorrect named variable [VerySimpleNamingVariables]
+                                                val t = "dsjfkh"
+                                                ~~~~~~~~~~~~~~~~
+                0 errors, 1 warnings
+            """.trimIndent())
+    }
+
+    @Test
+    fun `correct naming in kt file`() {
+        lint()
+            .allowMissingSdk()
+            .files(
+                kotlin(
+                    """
+                        class TestClass() {
+                            
+                            var d2 = 1
+                            var arty = 1
+
+                            fun doAction(savedInstanceState: Bundle?) {
+                                d2 += 1
+                            }
+                        }
+                    """
+                )
+            )
+            .issues(ISSUE_VERY_SIMPLE_NAMING_VARIABLES)
+            .run()
+            .expectClean()
+    }
+}

+ 1 - 0
settings.gradle

@@ -1,3 +1,4 @@
+include ':lint_repo'
 include ':feature_measure_type'
 include ':feature_person'
 include ':feature_auth'

+ 6 - 2
utils/build.gradle

@@ -18,9 +18,13 @@ android {
 
     buildTypes {
         release {
-            minifyEnabled false
+            minifyEnabled true
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
+        staging {
+            minifyEnabled true
+            signingConfig debug.signingConfig
+        }
     }
     dataBinding {
         enabled = true
@@ -47,7 +51,7 @@ dependencies {
 
 
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
     implementation 'androidx.appcompat:appcompat:1.2.0'
     implementation 'androidx.core:core-ktx:1.3.1'
     testImplementation 'junit:junit:4.12'

+ 20 - 0
utils/detekt-baseline.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" ?>
+<SmellBaseline>
+  <ManuallySuppressedIssues></ManuallySuppressedIssues>
+  <CurrentIssues>
+    <ID>EmptyDefaultConstructor:BaseViewModel.kt$BaseViewModel$()</ID>
+    <ID>MagicNumber:MyInfoDialog.kt$MyInfoDialog$400</ID>
+    <ID>NewLineAtEndOfFile:BaseDataSource.kt$com.mrozon.utils.base.BaseDataSource.kt</ID>
+    <ID>NewLineAtEndOfFile:BaseMapper.kt$com.mrozon.utils.base.BaseMapper.kt</ID>
+    <ID>NewLineAtEndOfFile:Event.kt$com.mrozon.utils.Event.kt</ID>
+    <ID>NewLineAtEndOfFile:FragmentExt.kt$com.mrozon.utils.extension.FragmentExt.kt</ID>
+    <ID>NewLineAtEndOfFile:MyInfoDialog.kt$com.mrozon.utils.base.MyInfoDialog.kt</ID>
+    <ID>NewLineAtEndOfFile:Result.kt$com.mrozon.utils.network.Result.kt</ID>
+    <ID>NewLineAtEndOfFile:TypeExt.kt$com.mrozon.utils.extension.TypeExt.kt</ID>
+    <ID>NewLineAtEndOfFile:ViewExt.kt$com.mrozon.utils.extension.ViewExt.kt</ID>
+    <ID>ReturnCount:BaseDataSource.kt$BaseDataSource$protected suspend fun &lt;T&gt; getResult(call: suspend () -&gt; Response&lt;T&gt;): Result&lt;T&gt;</ID>
+    <ID>TooGenericExceptionCaught:BaseDataSource.kt$BaseDataSource$e: Exception</ID>
+    <ID>TopLevelPropertyNaming:TypeExt.kt$const val defaultFormat = "yyyy-MM-dd"</ID>
+    <ID>UnnecessaryAbstractClass:BaseDataSource.kt$BaseDataSource</ID>
+  </CurrentIssues>
+</SmellBaseline>

+ 3 - 1
utils/src/main/java/com/mrozon/utils/base/BaseFragment.kt

@@ -1,5 +1,6 @@
 package com.mrozon.utils.base
 
+import android.annotation.SuppressLint
 import android.os.Bundle
 import android.view.LayoutInflater
 import android.view.View
@@ -12,7 +13,7 @@ import com.google.android.material.snackbar.BaseTransientBottomBar.LENGTH_LONG
 import com.google.android.material.snackbar.Snackbar
 import timber.log.Timber
 
-abstract class BaseFragment<T : ViewDataBinding>: Fragment()//,
+abstract class BaseFragment<T : ViewDataBinding>: Fragment()
 {
 //    ViewTreeObserver.OnGlobalLayoutListener {
 
@@ -68,6 +69,7 @@ abstract class BaseFragment<T : ViewDataBinding>: Fragment()//,
             .show(requireActivity().supportFragmentManager, MyInfoDialog.TAG)
     }
 
+    @SuppressLint("WrongConstant")
     fun show(message: String) {
         val snackbar = Snackbar.make(binding?.root!!,message,LENGTH_LONG)
         snackbar.show()