├── app ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── values │ │ │ │ ├── strings.xml │ │ │ │ ├── colors.xml │ │ │ │ └── styles.xml │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ ├── layout │ │ │ │ └── activity_main.xml │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_foreground.xml │ │ │ └── drawable │ │ │ │ └── ic_launcher_background.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── github │ │ │ │ └── nisrulz │ │ │ │ └── example │ │ │ │ └── androidautomations │ │ │ │ ├── MyJavaExample.java │ │ │ │ ├── ExampleObject.kt │ │ │ │ └── MainActivity.kt │ │ └── AndroidManifest.xml │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── github │ │ │ └── nisrulz │ │ │ └── example │ │ │ └── androidautomations │ │ │ ├── MyJavaExampleTest.java │ │ │ └── ExampleObjectTest.kt │ └── androidTest │ │ └── java │ │ └── com │ │ └── github │ │ └── nisrulz │ │ └── example │ │ └── androidautomations │ │ └── ExampleInstrumentedTest.kt ├── proguard-rules.pro └── build.gradle ├── testingAndroidLib ├── consumer-rules.pro ├── .gitignore ├── src │ ├── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ │ └── com │ │ │ └── github │ │ │ └── nisrulz │ │ │ └── example │ │ │ └── testingandroidlib │ │ │ ├── MyJavaExampleInModule.java │ │ │ └── ExampleObjectInModule.kt │ ├── test │ │ └── java │ │ │ └── com │ │ │ └── github │ │ │ └── nisrulz │ │ │ └── example │ │ │ └── testingandroidlib │ │ │ ├── MyJavaExampleInModuleTest.java │ │ │ └── ExampleObjectInModuleTest.kt │ └── androidTest │ │ └── java │ │ └── com │ │ └── github │ │ └── nisrulz │ │ └── example │ │ └── testingandroidlib │ │ └── ExampleInstrumentedTest.kt ├── proguard-rules.pro └── build.gradle ├── scripts └── echoHelloWorld.sh ├── keystore ├── keystore.jks ├── keystore.jks.enc ├── keystore.properties └── Readme.md ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .idea ├── codeStyles │ ├── codeStyleConfig.xml │ └── Project.xml └── jarRepositories.xml ├── .github ├── workflows │ ├── gradle-wrapper-validation.yml │ ├── greetings.yml │ └── build-and-release.yml └── stale.yml ├── configs ├── ktlint.gradle ├── signing.gradle ├── jacocoOutputToConsole.gradle └── jacoco.gradle ├── settings.gradle ├── gradle.properties ├── Readme.md ├── gradlew.bat ├── .gitignore ├── gradlew ├── LICENSE.md └── .editorconfig /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /testingAndroidLib/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /testingAndroidLib/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /scripts/echoHelloWorld.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | echo Hello World 4 | -------------------------------------------------------------------------------- /keystore/keystore.jks: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nisrulz/AndroidAutomations/HEAD/keystore/keystore.jks -------------------------------------------------------------------------------- /keystore/keystore.jks.enc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nisrulz/AndroidAutomations/HEAD/keystore/keystore.jks.enc -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | AndroidAutomations 3 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nisrulz/AndroidAutomations/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nisrulz/AndroidAutomations/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nisrulz/AndroidAutomations/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nisrulz/AndroidAutomations/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nisrulz/AndroidAutomations/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nisrulz/AndroidAutomations/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nisrulz/AndroidAutomations/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nisrulz/AndroidAutomations/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nisrulz/AndroidAutomations/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nisrulz/AndroidAutomations/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nisrulz/AndroidAutomations/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /testingAndroidLib/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | / 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #6200EE 4 | #3700B3 5 | #03DAC5 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /app/src/main/java/com/github/nisrulz/example/androidautomations/MyJavaExample.java: -------------------------------------------------------------------------------- 1 | package com.github.nisrulz.example.androidautomations; 2 | 3 | public class MyJavaExample { 4 | String getClassNameAsString() { 5 | return this.getClass().getSimpleName(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /testingAndroidLib/src/main/java/com/github/nisrulz/example/testingandroidlib/MyJavaExampleInModule.java: -------------------------------------------------------------------------------- 1 | package com.github.nisrulz.example.testingandroidlib; 2 | 3 | public class MyJavaExampleInModule { 4 | String getUppercaseExampleString() { 5 | return "Example".toUpperCase(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /.github/workflows/gradle-wrapper-validation.yml: -------------------------------------------------------------------------------- 1 | name: "Validate Gradle Wrapper" 2 | on: [push, pull_request] 3 | 4 | jobs: 5 | validation: 6 | name: "Validation" 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v2 10 | - uses: gradle/wrapper-validation-action@v1 11 | -------------------------------------------------------------------------------- /testingAndroidLib/src/main/java/com/github/nisrulz/example/testingandroidlib/ExampleObjectInModule.kt: -------------------------------------------------------------------------------- 1 | package com.github.nisrulz.example.testingandroidlib 2 | 3 | object ExampleObjectInModule { 4 | fun getExampleString() = "ExampleString" 5 | } 6 | 7 | fun String.appendExampleInModule() = "${this}ExampleInModule" 8 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /keystore/keystore.properties: -------------------------------------------------------------------------------- 1 | storeFile=../keystore/keystore.jks 2 | 3 | # Below key-values commented out, shouldn't be commited to git repository. This is just for demonstration purpose in this repo. 4 | # These should be created as ENV in Travis Settings, which will then during the setup append them here. 5 | # storePassword=example 6 | # keyAlias=example 7 | # keyPassword=example 8 | -------------------------------------------------------------------------------- /configs/ktlint.gradle: -------------------------------------------------------------------------------- 1 | subprojects { 2 | apply plugin: "org.jlleitschuh.gradle.ktlint" // Version should be inherited from parent 3 | 4 | // Optionally configure plugin 5 | ktlint { 6 | debug = true 7 | android = true 8 | disabledRules = ["import-ordering"] 9 | filter { 10 | exclude("**/generated/**") 11 | include("**/*.kt") 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | -------------------------------------------------------------------------------- /.github/workflows/greetings.yml: -------------------------------------------------------------------------------- 1 | name: Greetings 2 | 3 | on: [pull_request, issues] 4 | 5 | jobs: 6 | greeting: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/first-interaction@v1 10 | with: 11 | repo-token: ${{ secrets.GITHUB_TOKEN }} 12 | issue-message: "You have opened your first issue 🎉 The maintainers will get back to this asap 🙂" 13 | pr-message: "You have opened your first PR 🎉 Thank you for your contribution 🙂" 14 | -------------------------------------------------------------------------------- /app/src/test/java/com/github/nisrulz/example/androidautomations/MyJavaExampleTest.java: -------------------------------------------------------------------------------- 1 | package com.github.nisrulz.example.androidautomations; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.assertEquals; 6 | 7 | public class MyJavaExampleTest { 8 | 9 | private MyJavaExample myJavaExample = new MyJavaExample(); 10 | 11 | @Test 12 | public void testGetClassName() { 13 | assertEquals("MyJavaExample", myJavaExample.getClassNameAsString()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /testingAndroidLib/src/test/java/com/github/nisrulz/example/testingandroidlib/MyJavaExampleInModuleTest.java: -------------------------------------------------------------------------------- 1 | package com.github.nisrulz.example.testingandroidlib; 2 | 3 | import org.junit.Test; 4 | 5 | import static org.junit.Assert.assertEquals; 6 | 7 | public class MyJavaExampleInModuleTest { 8 | 9 | private MyJavaExampleInModule myJavaExampleInModule = new MyJavaExampleInModule(); 10 | 11 | @Test 12 | public void testGetClassName() { 13 | assertEquals("EXAMPLE", myJavaExampleInModule.getUppercaseExampleString()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/test/java/com/github/nisrulz/example/androidautomations/ExampleObjectTest.kt: -------------------------------------------------------------------------------- 1 | package com.github.nisrulz.example.androidautomations 2 | 3 | import org.junit.Assert.assertEquals 4 | import org.junit.Test 5 | 6 | class ExampleObjectTest { 7 | @Test 8 | fun `getExampleString() returns Example`() { 9 | assertEquals(ExampleObject.getExampleString(), "Example") 10 | } 11 | 12 | @Test 13 | fun `appendExample() extension function appends Example`() { 14 | assertEquals("Hello".appendExample(), "HelloExample") 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /testingAndroidLib/src/test/java/com/github/nisrulz/example/testingandroidlib/ExampleObjectInModuleTest.kt: -------------------------------------------------------------------------------- 1 | package com.github.nisrulz.example.testingandroidlib 2 | 3 | import org.junit.Assert 4 | import org.junit.Test 5 | 6 | class ExampleObjectInModuleTest { 7 | @Test 8 | fun `getExampleString returns ExampleString`() { 9 | Assert.assertEquals(ExampleObjectInModule.getExampleString(), "ExampleString") 10 | } 11 | 12 | @Test 13 | fun `appendExampleInModule extension function appends ExampleInModule`() { 14 | Assert.assertEquals("Hello".appendExampleInModule(), "HelloExampleInModule") 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/github/nisrulz/example/androidautomations/ExampleObject.kt: -------------------------------------------------------------------------------- 1 | package com.github.nisrulz.example.androidautomations 2 | 3 | object ExampleObject { 4 | fun getExampleString() = "Example" 5 | 6 | fun descriptiveFn() { 7 | println("This is going to be a descriptive function :] ") 8 | println("Quick questions for you. Let's Go 🚀 ") 9 | println("How much do you ♥️ Android? ${10*10}%") 10 | println("-----") 11 | println("What did it take to use Android Studio ? Everything 😬") 12 | println("-----") 13 | println("May the force be with you 💪") 14 | println("Adios 👋") 15 | } 16 | } 17 | 18 | fun String.appendExample() = "${this}Example" 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/main/java/com/github/nisrulz/example/androidautomations/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.github.nisrulz.example.androidautomations 2 | 3 | import android.os.Bundle 4 | import androidx.appcompat.app.AppCompatActivity 5 | import com.github.nisrulz.example.androidautomations.databinding.ActivityMainBinding 6 | 7 | class MainActivity : AppCompatActivity() { 8 | 9 | private var binding: ActivityMainBinding? = null 10 | 11 | override fun onCreate(savedInstanceState: Bundle?) { 12 | super.onCreate(savedInstanceState) 13 | binding = ActivityMainBinding.inflate(layoutInflater) 14 | binding?.apply { 15 | setContentView(root) 16 | } 17 | ExampleObject.descriptiveFn() 18 | } 19 | 20 | override fun onDestroy() { 21 | binding = null 22 | super.onDestroy() 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /testingAndroidLib/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 18 | 19 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/github/nisrulz/example/androidautomations/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.github.nisrulz.example.androidautomations 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.assertEquals 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("com.github.nisrulz.example.androidautomations", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /testingAndroidLib/src/androidTest/java/com/github/nisrulz/example/testingandroidlib/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.github.nisrulz.example.testingandroidlib 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.assertEquals 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("com.github.nisrulz.example.testingandroidlib.test", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | dependencyResolutionManagement { 2 | 3 | /** 4 | * The dependencyResolutionManagement { repositories {...}}* block is where you configure the repositories and dependencies used by 5 | * all modules in your project, such as libraries that you are using to 6 | * create your application. However, you should configure module-specific 7 | * dependencies in each module-level build.gradle file. For new projects, 8 | * Android Studio includes Google's Maven repository 9 | * and the Maven Central Repository by 10 | * default, but it does not configure any dependencies (unless you select a 11 | * template that requires some). 12 | */ 13 | 14 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 15 | repositories { 16 | google() 17 | mavenCentral() 18 | } 19 | } 20 | 21 | rootProject.name = "AndroidAutomations" 22 | 23 | include ':app' 24 | include ':testingAndroidLib' 25 | -------------------------------------------------------------------------------- /testingAndroidLib/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | apply plugin: 'kotlin-android' 3 | 4 | android { 5 | compileSdkVersion 29 6 | buildToolsVersion "29.0.3" 7 | 8 | defaultConfig { 9 | minSdkVersion 16 10 | targetSdkVersion 29 11 | versionCode 1 12 | versionName "1.0" 13 | 14 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 15 | consumerProguardFiles "consumer-rules.pro" 16 | } 17 | 18 | buildTypes { 19 | release { 20 | minifyEnabled false 21 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 22 | } 23 | } 24 | } 25 | 26 | dependencies { 27 | implementation fileTree(dir: "libs", include: ["*.jar"]) 28 | implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 29 | 30 | testImplementation 'junit:junit:4.13' 31 | androidTestImplementation 'androidx.test.ext:junit:1.1.1' 32 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' 33 | } 34 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Kotlin code style for this project: "official" or "obsolete": 19 | kotlin.code.style=official 20 | -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | -------------------------------------------------------------------------------- /configs/signing.gradle: -------------------------------------------------------------------------------- 1 | def isRunningOnCI = System.getenv("CI") == "true" 2 | 3 | def keystorePropertiesFile = rootProject.file("keystore/keystore.properties") 4 | 5 | if (isRunningOnCI) { 6 | if (keystorePropertiesFile.exists()) { 7 | // Load the properties 8 | def keystoreProperties = new Properties() 9 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) 10 | android { 11 | signingConfigs { 12 | if (keystorePropertiesFile.exists()) { 13 | release { 14 | keyAlias keystoreProperties['keyAlias'] 15 | keyPassword keystoreProperties['keyPassword'] 16 | storeFile file(keystoreProperties['storeFile']) 17 | storePassword keystoreProperties['storePassword'] 18 | } 19 | } 20 | } 21 | 22 | buildTypes { 23 | release { 24 | if (keystorePropertiesFile.exists()) { 25 | signingConfig signingConfigs.release 26 | } 27 | } 28 | } 29 | } 30 | } else { 31 | println("Filename: keystore.properties") 32 | println("Error: File does not exists") 33 | println("Solution: Create a keystore.properties file with valid details under keystore directory at the root of your project") 34 | } 35 | } 36 | 37 | -------------------------------------------------------------------------------- /configs/jacocoOutputToConsole.gradle: -------------------------------------------------------------------------------- 1 | task jacocoOutputToConsole(type: JacocoReport, dependsOn: jacocoFullReport, group: 'Coverage reports') { 2 | def reportFile = new File("${rootProject.buildDir}/reports/jacoco/jacocoFullReport/html/index.html") 3 | 4 | if (!reportFile.exists() || !reportFile.canRead()) { 5 | println "[JacocoOutputToConsole] Skipped due to missing report file." 6 | return 7 | } 8 | 9 | reportFile.withReader('UTF-8') { reader -> 10 | final html = getParser().parseText(reader.readLine()) 11 | final totalRow = html.body.table.tfoot.tr 12 | final instructionMissed = totalRow.td[1] 13 | final instructionRatio = totalRow.td[2] 14 | final branchMissed = totalRow.td[3] 15 | final branchRatio = totalRow.td[4] 16 | 17 | // Print the location of reports at the end 18 | println("\n======================= JacocoOutputToConsole =======================\n") 19 | println("Instructions ${instructionRatio} (Missed ${instructionMissed})") 20 | println("Branches ${branchRatio} (Missed ${branchMissed})") 21 | println("\n=====================================================================\n") 22 | } 23 | } 24 | 25 | static XmlSlurper getParser() { 26 | final parser = new XmlSlurper() 27 | parser.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false) 28 | parser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false) 29 | return parser 30 | } 31 | 32 | 33 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # Android Automation 2 | 3 | Build Status: 4 | [![Validate Gradle Wrapper](https://github.com/nisrulz/AndroidAutomations/actions/workflows/gradle-wrapper-validation.yml/badge.svg?branch=master)](https://github.com/nisrulz/AndroidAutomations/actions/workflows/gradle-wrapper-validation.yml) 5 | [![Build and Release](https://github.com/nisrulz/AndroidAutomations/actions/workflows/build-and-release.yml/badge.svg?branch=master)](https://github.com/nisrulz/AndroidAutomations/actions/workflows/build-and-release.yml) 6 | 7 | An android example app repository to demonstrate various automation possible via using Travis CI. 8 | 9 | ## Contribute 10 | 11 | 1. Fork this repo. 12 | 1. Clone your fork. (`git clone https://github.com/nisrulz/AndroidAutomations`) 13 | 1. Create your feature branch. (`git checkout -b my-new-feature`) 14 | 1. Commit your changes. (`git commit -am 'Added some feature'`) 15 | 1. Push to the branch. (`git push origin my-new-feature`) 16 | 1. Create new Pull Request. 17 | 18 | ## Author & support 19 | 20 | This project was created by [Nishant Srivastava](https://github.com/nisrulz/nisrulz.github.io#nishant-srivastava) but hopefully developed and maintained by many others. See the [the list of contributors here](https://github.com/nisrulz/AndroidAutomations/graphs/contributors). 21 | 22 | If you appreciate my work, consider [buying me](https://www.paypal.me/nisrulz/5usd) a cup of :coffee: to keep me recharged :metal: [[PayPal](https://www.paypal.me/nisrulz/5usd)] 23 | 24 | ## License 25 | 26 | © 2020, Nishant Srivastava 27 | 28 | All content is licensed under [CC BY-SA](/LICENSE.md) 29 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /.github/workflows/build-and-release.yml: -------------------------------------------------------------------------------- 1 | name: Build and Release 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | tags: 8 | - "v*" 9 | paths-ignore: 10 | - '**.md' 11 | 12 | jobs: 13 | apk: 14 | name: Generate APK 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v2.4.0 19 | - name: Setup JDK 20 | uses: actions/setup-java@v2.5.0 21 | with: 22 | distribution: temurin 23 | java-version: "11" 24 | - name: Set execution flag for gradlew 25 | run: chmod +x gradlew 26 | - name: Build APK 27 | run: bash ./gradlew assembleDebug --stacktrace 28 | - name: Upload APK 29 | uses: actions/upload-artifact@v1 30 | with: 31 | name: apk 32 | path: app/build/outputs/apk/debug/app-debug.apk 33 | 34 | release: 35 | name: Release APK 36 | needs: apk 37 | runs-on: ubuntu-latest 38 | steps: 39 | - name: Download APK from build 40 | uses: actions/download-artifact@v1 41 | with: 42 | name: apk 43 | - name: Create Release 44 | id: create_release 45 | uses: actions/create-release@v1 46 | env: 47 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 48 | with: 49 | tag_name: ${{ github.run_number }} 50 | release_name: ${{ github.event.repository.name }} v${{ github.run_number }} 51 | - name: Upload Release APK 52 | id: upload_release_asset 53 | uses: actions/upload-release-asset@v1.0.1 54 | env: 55 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 56 | with: 57 | upload_url: ${{ steps.create_release.outputs.upload_url }} 58 | asset_path: apk/app-debug.apk 59 | asset_name: ${{ github.event.repository.name }}.apk 60 | asset_content_type: application/zip 61 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply plugin: 'kotlin-android' 3 | 4 | apply from: "$rootProject.projectDir/configs/signing.gradle" 5 | 6 | android { 7 | compileSdkVersion 33 8 | 9 | defaultConfig { 10 | applicationId "com.github.nisrulz.example.androidautomations" 11 | minSdkVersion 16 12 | targetSdkVersion 33 13 | versionCode 1 14 | versionName "1.0.0" 15 | 16 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 17 | } 18 | 19 | buildTypes { 20 | release { 21 | minifyEnabled false 22 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 23 | } 24 | } 25 | 26 | sourceSets { 27 | main.java.srcDirs += 'src/main/kotlin' 28 | } 29 | 30 | testOptions { 31 | unitTests.returnDefaultValues = true 32 | unitTests.all { 33 | testLogging { 34 | events "failed" 35 | exceptionFormat "full" 36 | } 37 | } 38 | } 39 | 40 | compileOptions { 41 | sourceCompatibility JavaVersion.VERSION_1_8 42 | targetCompatibility JavaVersion.VERSION_1_8 43 | } 44 | 45 | kotlinOptions { 46 | jvmTarget = JavaVersion.VERSION_1_8 47 | } 48 | 49 | buildFeatures { viewBinding true } 50 | } 51 | 52 | dependencies { 53 | implementation fileTree(dir: "libs", include: ["*.jar"]) 54 | implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 55 | implementation 'androidx.core:core-ktx:1.2.0' 56 | implementation 'androidx.appcompat:appcompat:1.1.0' 57 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 58 | 59 | testImplementation 'junit:junit:4.13' 60 | androidTestImplementation 'androidx.test.ext:junit:1.1.1' 61 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' 62 | 63 | implementation project(':testingAndroidLib') 64 | } 65 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Configuration for probot-stale - https://github.com/probot/stale 2 | 3 | # Number of days of inactivity before an Issue or Pull Request becomes stale 4 | daysUntilStale: 60 5 | 6 | # Number of days of inactivity before an Issue or Pull Request with the stale label is closed. 7 | # Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. 8 | daysUntilClose: 7 9 | 10 | # Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) 11 | onlyLabels: [] 12 | 13 | # Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable 14 | exemptLabels: 15 | - pinned 16 | - security 17 | 18 | # Set to true to ignore issues in a project (defaults to false) 19 | exemptProjects: false 20 | 21 | # Set to true to ignore issues in a milestone (defaults to false) 22 | exemptMilestones: false 23 | 24 | # Set to true to ignore issues with an assignee (defaults to false) 25 | exemptAssignees: false 26 | 27 | # Label to use when marking as stale 28 | staleLabel: wontfix 29 | 30 | # Comment to post when marking as stale. Set to `false` to disable 31 | markComment: > 32 | This issue has been automatically marked as stale because it has not had 33 | recent activity. It will be closed if no further activity occurs. Thank you 34 | for your contributions. 35 | 36 | # Comment to post when removing the stale label. 37 | # unmarkComment: > 38 | # Your comment here. 39 | 40 | # Comment to post when closing a stale Issue or Pull Request. Set to `false` to disable 41 | # closeComment: > 42 | # Your comment here. 43 | closeComment: false 44 | 45 | # Limit the number of actions per hour, from 1-30. Default is 30 46 | limitPerRun: 30 47 | # Limit to only `issues` or `pulls` 48 | # only: issues 49 | 50 | # Optionally, specify configuration settings that are specific to just 'issues' or 'pulls': 51 | # pulls: 52 | # daysUntilStale: 30 53 | # markComment: > 54 | # This pull request has been automatically marked as stale because it has not had 55 | # recent activity. It will be closed if no further activity occurs. Thank you 56 | # for your contributions. 57 | 58 | # issues: 59 | # exemptLabels: 60 | # - confirmed 61 | -------------------------------------------------------------------------------- /keystore/Readme.md: -------------------------------------------------------------------------------- 1 | # Travis setup for keystore file 2 | 3 | Install travis command line: 4 | 5 | ```bash 6 | sudo gem install travis 7 | ``` 8 | 9 | Next, login into Travis using Github Oauth Token 10 | 11 | ```bash 12 | travis login --github-token your_github_oauth_token 13 | ``` 14 | 15 | Encrypt the keystore file: 16 | 17 | ```bash 18 | travis encrypt-file ./keystore.jks 19 | ``` 20 | 21 | This will generate a `keystore.jks.enc` file. You should remove the `keystore.jks` from the repo, but keep it safe. 22 | 23 | Now, add the output line to `before_install` block in travis config: 24 | 25 | ```yaml 26 | before_install: 27 | - openssl aes-256-cbc -K $encrypted_48536eba9c94_key -iv $encrypted_48536eba9c94_iv -in ./keystore/keystore.jks.enc -out ./keystore/keystore.jks -d 28 | ``` 29 | 30 | Next, the keystore password and key password need to be added to the travis config. To do that navigate to settings and under **Environment Variables**, define below key-value pair 31 | 32 | ``` 33 | storePassword=example 34 | keyAlias=example 35 | keyPassword=example 36 | ``` 37 | 38 | These are then used during the build time to write to `keystore/keystore.properties` file, which in turn is used to build a signed apk via `build.gradle` setup. 39 | 40 | ```yaml 41 | before_script: 42 | # Setup signing config 43 | - echo "storePassword=$storePassword" >> ./keystore/keystore.properties 44 | - echo "keyAlias=$keyAlias" >> ./keystore/keystore.properties 45 | - echo "keyPassword=$keyPassword" >> ./keystore/keystore.properties 46 | ``` 47 | 48 | Before you can deploy, you need to get the encrypted apikey. Execute the below command (with required info), paste the genearted Github Oauth key and press Ctrl+D to get the encrypted key. 49 | 50 | ```bash 51 | travis encrypt -r username/repo_name --org 52 | ``` 53 | 54 | Next, to deploy to Github release: 55 | 56 | ```yaml 57 | before_deploy: 58 | - cd app/build/outputs/apk/ 59 | 60 | deploy: 61 | provider: releases 62 | skip_cleanup: true 63 | overwrite: true 64 | api_key: 65 | secure: replace_with_encrypted_apikey_from_last_step 66 | file_glob: true 67 | file: release/app-release.apk 68 | on: 69 | repo: nisrulz/AndroidAutomations 70 | tags: true 71 | ``` 72 | 73 | Now, simply tag a commit and see the release show up in Github releases. -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%"=="" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%"=="" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if %ERRORLEVEL% equ 0 goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if %ERRORLEVEL% equ 0 goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | set EXIT_CODE=%ERRORLEVEL% 84 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 85 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 86 | exit /b %EXIT_CODE% 87 | 88 | :mainEnd 89 | if "%OS%"=="Windows_NT" endlocal 90 | 91 | :omega 92 | -------------------------------------------------------------------------------- /configs/jacoco.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.jacoco_version = "0.8.6" 3 | 4 | repositories { 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | // Jacoco 10 | classpath "org.jacoco:org.jacoco.core:${jacoco_version}" 11 | } 12 | } 13 | 14 | // Apply to every module 15 | allprojects { 16 | // Apply jacoco plugin 17 | apply plugin: 'jacoco' 18 | // Set Jacoco version 19 | jacoco { 20 | toolVersion = "${jacoco_version}" 21 | } 22 | 23 | tasks.withType(Test) { 24 | jacoco.includeNoLocationClasses = true 25 | } 26 | } 27 | 28 | // configure() method takes a list as an argument and applies the configuration to the projects in this list. 29 | configure(subprojects) { project -> 30 | 31 | final productFlavorName = "" 32 | final buildTypeName = "debug" 33 | final sourcePath = "${productFlavorName}${buildTypeName.capitalize()}" 34 | final testTask = "test${sourcePath.capitalize()}UnitTest" 35 | 36 | // Task to generate Jacoco report, depends on testDebugUnitTest task 37 | task jacocoReport(type: JacocoReport, dependsOn: testTask) { 38 | group = "Reporting" 39 | description = "Generate Jacoco coverage reports." 40 | 41 | // Define what to exclude from coverage report 42 | // UI, "noise", generated classes, platform classes, etc. 43 | final fileFilter = [ 44 | '**/R.class', 45 | '**/R$*.class', 46 | '**/*$ViewInjector*.*', 47 | '**/BuildConfig.*', 48 | '**/Manifest*.*', 49 | 'android/**/*.*', 50 | '**/*Test*.*', 51 | ] 52 | 53 | // Collect class files 54 | final javaClassFiles = fileTree(dir: "${project.buildDir}/intermediates/javac/${sourcePath}/classes", excludes: fileFilter) 55 | final kotlinClassFiles = fileTree(dir: "${project.buildDir}/tmp/kotlin-classes/${sourcePath}", excludes: fileFilter) 56 | final classFileTree = javaClassFiles + kotlinClassFiles 57 | classDirectories.setFrom(files([classFileTree])) 58 | 59 | // Collect source files 60 | final kotlinSrc = "${project.projectDir}/src/main/kotlin" 61 | final javaSrc = "$project.projectDir/src/main/java" 62 | final combinedSrc = files([javaSrc, kotlinSrc]) 63 | sourceDirectories.setFrom(combinedSrc) 64 | 65 | // Collect all *.exec files 66 | executionData.setFrom fileTree(project.buildDir).include("/jacoco/*.exec") 67 | } 68 | } 69 | 70 | task jacocoFullReport(type: JacocoReport, group: 'Coverage reports') { 71 | final projects = subprojects 72 | 73 | // Depend on the jacocoReport task created before 74 | dependsOn(projects.jacocoReport) 75 | 76 | // Aggregate the source files 77 | final source = files(projects.jacocoReport.sourceDirectories) 78 | additionalSourceDirs.setFrom source 79 | sourceDirectories.setFrom source 80 | 81 | // Aggregate the class files 82 | classDirectories.setFrom files(projects.jacocoReport.classDirectories) 83 | 84 | // Aggregate the execution data 85 | executionData.setFrom files(projects.jacocoReport.executionData) 86 | 87 | // Type of report to generate 88 | reports { 89 | xml.enabled = true 90 | html.enabled = true 91 | } 92 | 93 | // In case the module does not have any tests, it will not contain any execution data i.e *.exec files 94 | // Those need to be filtered out first 95 | doFirst { 96 | //noinspection GroovyAssignabilityCheck 97 | executionData.setFrom files(executionData.findAll { it.exists() }) 98 | } 99 | 100 | // Print the location of reports at the end 101 | doLast { 102 | println("\n======================= Reports generated at =======================\n") 103 | println("XML: ./build/reports/jacoco/jacocoFullReport/jacocoFullReport.xml") 104 | println("HTML: ./build/reports/jacoco/jacocoFullReport/html/index.html") 105 | println("\n====================================================================\n") 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | 10 | 12 | 13 | 14 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | xmlns:android 23 | 24 | ^$ 25 | 26 | 27 | 28 |
29 |
30 | 31 | 32 | 33 | xmlns:.* 34 | 35 | ^$ 36 | 37 | 38 | BY_NAME 39 | 40 |
41 |
42 | 43 | 44 | 45 | .*:id 46 | 47 | http://schemas.android.com/apk/res/android 48 | 49 | 50 | 51 |
52 |
53 | 54 | 55 | 56 | .*:name 57 | 58 | http://schemas.android.com/apk/res/android 59 | 60 | 61 | 62 |
63 |
64 | 65 | 66 | 67 | name 68 | 69 | ^$ 70 | 71 | 72 | 73 |
74 |
75 | 76 | 77 | 78 | style 79 | 80 | ^$ 81 | 82 | 83 | 84 |
85 |
86 | 87 | 88 | 89 | .* 90 | 91 | ^$ 92 | 93 | 94 | BY_NAME 95 | 96 |
97 |
98 | 99 | 100 | 101 | .* 102 | 103 | http://schemas.android.com/apk/res/android 104 | 105 | 106 | ANDROID_ATTRIBUTE_ORDER 107 | 108 |
109 |
110 | 111 | 112 | 113 | .* 114 | 115 | .* 116 | 117 | 118 | BY_NAME 119 | 120 |
121 |
122 |
123 |
124 | 125 | 130 |
131 |
-------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/code,ruby,java,kotlin,android,intellij,androidstudio 3 | # Edit at https://www.gitignore.io/?templates=code,ruby,java,kotlin,android,intellij,androidstudio 4 | 5 | ### Android ### 6 | # Built application files 7 | *.apk 8 | *.ap_ 9 | *.aab 10 | 11 | # Files for the ART/Dalvik VM 12 | *.dex 13 | 14 | # Java class files 15 | *.class 16 | 17 | # Generated files 18 | bin/ 19 | gen/ 20 | out/ 21 | release/ 22 | 23 | # Gradle files 24 | .gradle/ 25 | build/ 26 | 27 | # Local configuration file (sdk path, etc) 28 | local.properties 29 | 30 | # Proguard folder generated by Eclipse 31 | proguard/ 32 | 33 | # Log Files 34 | *.log 35 | 36 | # Android Studio Navigation editor temp files 37 | .navigation/ 38 | 39 | # Android Studio captures folder 40 | captures/ 41 | 42 | # IntelliJ 43 | *.iml 44 | .idea/workspace.xml 45 | .idea/tasks.xml 46 | .idea/gradle.xml 47 | .idea/assetWizardSettings.xml 48 | .idea/dictionaries 49 | .idea/libraries 50 | # Android Studio 3 in .gitignore file. 51 | .idea/caches 52 | .idea/modules.xml 53 | # Comment next line if keeping position of elements in Navigation Editor is relevant for you 54 | .idea/navEditor.xml 55 | 56 | # Keystore files 57 | # Uncomment the following lines if you do not want to check your keystore files in. 58 | #*.jks 59 | #*.keystore 60 | 61 | # External native build folder generated in Android Studio 2.2 and later 62 | .externalNativeBuild 63 | 64 | # Google Services (e.g. APIs or Firebase) 65 | # google-services.json 66 | 67 | # Freeline 68 | freeline.py 69 | freeline/ 70 | freeline_project_description.json 71 | 72 | # fastlane 73 | fastlane/report.xml 74 | fastlane/Preview.html 75 | fastlane/screenshots 76 | fastlane/test_output 77 | fastlane/readme.md 78 | 79 | # Version control 80 | vcs.xml 81 | 82 | # lint 83 | lint/intermediates/ 84 | lint/generated/ 85 | lint/outputs/ 86 | lint/tmp/ 87 | # lint/reports/ 88 | 89 | ### Android Patch ### 90 | gen-external-apklibs 91 | output.json 92 | 93 | # Replacement of .externalNativeBuild directories introduced 94 | # with Android Studio 3.5. 95 | .cxx/ 96 | 97 | ### Code ### 98 | .vscode/* 99 | !.vscode/settings.json 100 | !.vscode/tasks.json 101 | !.vscode/launch.json 102 | !.vscode/extensions.json 103 | 104 | ### Intellij ### 105 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm 106 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 107 | 108 | # User-specific stuff 109 | .idea/**/workspace.xml 110 | .idea/**/tasks.xml 111 | .idea/**/usage.statistics.xml 112 | .idea/**/dictionaries 113 | .idea/**/shelf 114 | 115 | # Generated files 116 | .idea/**/contentModel.xml 117 | 118 | # Sensitive or high-churn files 119 | .idea/**/dataSources/ 120 | .idea/**/dataSources.ids 121 | .idea/**/dataSources.local.xml 122 | .idea/**/sqlDataSources.xml 123 | .idea/**/dynamic.xml 124 | .idea/**/uiDesigner.xml 125 | .idea/**/dbnavigator.xml 126 | 127 | # Gradle 128 | .idea/**/gradle.xml 129 | .idea/**/libraries 130 | 131 | # Gradle and Maven with auto-import 132 | # When using Gradle or Maven with auto-import, you should exclude module files, 133 | # since they will be recreated, and may cause churn. Uncomment if using 134 | # auto-import. 135 | # .idea/modules.xml 136 | # .idea/*.iml 137 | # .idea/modules 138 | # *.iml 139 | # *.ipr 140 | 141 | # CMake 142 | cmake-build-*/ 143 | 144 | # Mongo Explorer plugin 145 | .idea/**/mongoSettings.xml 146 | 147 | # File-based project format 148 | *.iws 149 | 150 | # IntelliJ 151 | 152 | # mpeltonen/sbt-idea plugin 153 | .idea_modules/ 154 | 155 | # JIRA plugin 156 | atlassian-ide-plugin.xml 157 | 158 | # Cursive Clojure plugin 159 | .idea/replstate.xml 160 | 161 | # Crashlytics plugin (for Android Studio and IntelliJ) 162 | com_crashlytics_export_strings.xml 163 | crashlytics.properties 164 | crashlytics-build.properties 165 | fabric.properties 166 | 167 | # Editor-based Rest Client 168 | .idea/httpRequests 169 | 170 | # Android studio 3.1+ serialized cache file 171 | .idea/caches/build_file_checksums.ser 172 | 173 | ### Intellij Patch ### 174 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 175 | 176 | # *.iml 177 | # modules.xml 178 | # .idea/misc.xml 179 | # *.ipr 180 | 181 | # Sonarlint plugin 182 | .idea/**/sonarlint/ 183 | 184 | # SonarQube Plugin 185 | .idea/**/sonarIssues.xml 186 | 187 | # Markdown Navigator plugin 188 | .idea/**/markdown-navigator.xml 189 | .idea/**/markdown-navigator/ 190 | 191 | ### Java ### 192 | # Compiled class file 193 | 194 | # Log file 195 | 196 | # BlueJ files 197 | *.ctxt 198 | 199 | # Mobile Tools for Java (J2ME) 200 | .mtj.tmp/ 201 | 202 | # Package Files # 203 | *.jar 204 | *.war 205 | *.nar 206 | *.ear 207 | *.zip 208 | *.tar.gz 209 | *.rar 210 | 211 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 212 | hs_err_pid* 213 | 214 | ### Kotlin ### 215 | # Compiled class file 216 | 217 | # Log file 218 | 219 | # BlueJ files 220 | 221 | # Mobile Tools for Java (J2ME) 222 | 223 | # Package Files # 224 | 225 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 226 | 227 | ### Ruby ### 228 | *.gem 229 | *.rbc 230 | /.config 231 | /coverage/ 232 | /InstalledFiles 233 | /pkg/ 234 | /spec/reports/ 235 | /spec/examples.txt 236 | /test/tmp/ 237 | /test/version_tmp/ 238 | /tmp/ 239 | 240 | # Used by dotenv library to load environment variables. 241 | # .env 242 | 243 | # Ignore Byebug command history file. 244 | .byebug_history 245 | 246 | ## Specific to RubyMotion: 247 | .dat* 248 | .repl_history 249 | *.bridgesupport 250 | build-iPhoneOS/ 251 | build-iPhoneSimulator/ 252 | 253 | ## Specific to RubyMotion (use of CocoaPods): 254 | # 255 | # We recommend against adding the Pods directory to your .gitignore. However 256 | # you should judge for yourself, the pros and cons are mentioned at: 257 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 258 | # vendor/Pods/ 259 | 260 | ## Documentation cache and generated files: 261 | /.yardoc/ 262 | /_yardoc/ 263 | /doc/ 264 | /rdoc/ 265 | 266 | ## Environment normalization: 267 | /.bundle/ 268 | /vendor/bundle 269 | /lib/bundler/man/ 270 | 271 | # for a library or gem, you might want to ignore these files since the code is 272 | # intended to run in multiple environments; otherwise, check them in: 273 | # Gemfile.lock 274 | # .ruby-version 275 | # .ruby-gemset 276 | 277 | # unless supporting rvm < 1.11.0 or doing something fancy, ignore this: 278 | .rvmrc 279 | 280 | ### Ruby Patch ### 281 | # Used by RuboCop. Remote config files pulled in from inherit_from directive. 282 | # .rubocop-https?--* 283 | 284 | ### AndroidStudio ### 285 | # Covers files to be ignored for android development using Android Studio. 286 | 287 | # Built application files 288 | 289 | # Files for the ART/Dalvik VM 290 | 291 | # Java class files 292 | 293 | # Generated files 294 | 295 | # Gradle files 296 | .gradle 297 | 298 | # Signing files 299 | .signing/ 300 | 301 | # Local configuration file (sdk path, etc) 302 | 303 | # Proguard folder generated by Eclipse 304 | 305 | # Log Files 306 | 307 | # Android Studio 308 | /*/build/ 309 | /*/local.properties 310 | /*/out 311 | /*/*/build 312 | /*/*/production 313 | *.ipr 314 | *~ 315 | *.swp 316 | 317 | # Android Patch 318 | 319 | # External native build folder generated in Android Studio 2.2 and later 320 | 321 | # NDK 322 | obj/ 323 | 324 | # IntelliJ IDEA 325 | /out/ 326 | 327 | # User-specific configurations 328 | .idea/caches/ 329 | .idea/libraries/ 330 | .idea/shelf/ 331 | .idea/.name 332 | .idea/compiler.xml 333 | .idea/copyright/profiles_settings.xml 334 | .idea/encodings.xml 335 | .idea/misc.xml 336 | .idea/scopes/scope_settings.xml 337 | .idea/vcs.xml 338 | .idea/jsLibraryMappings.xml 339 | .idea/datasources.xml 340 | .idea/dataSources.ids 341 | .idea/sqlDataSources.xml 342 | .idea/dynamic.xml 343 | .idea/uiDesigner.xml 344 | 345 | # OS-specific files 346 | .DS_Store 347 | .DS_Store? 348 | ._* 349 | .Spotlight-V100 350 | .Trashes 351 | ehthumbs.db 352 | Thumbs.db 353 | 354 | # Legacy Eclipse project files 355 | .classpath 356 | .project 357 | .cproject 358 | .settings/ 359 | 360 | # Mobile Tools for Java (J2ME) 361 | 362 | # Package Files # 363 | 364 | # virtual machine crash logs (Reference: http://www.java.com/en/download/help/error_hotspot.xml) 365 | 366 | ## Plugin-specific files: 367 | 368 | # mpeltonen/sbt-idea plugin 369 | 370 | # JIRA plugin 371 | 372 | # Mongo Explorer plugin 373 | .idea/mongoSettings.xml 374 | 375 | # Crashlytics plugin (for Android Studio and IntelliJ) 376 | 377 | ### AndroidStudio Patch ### 378 | 379 | !/gradle/wrapper/gradle-wrapper.jar 380 | 381 | # End of https://www.gitignore.io/api/code,ruby,java,kotlin,android,intellij,androidstudio 382 | 383 | # Fastlane 384 | vendor 385 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # 4 | # Copyright © 2015-2021 the original authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | # 21 | # Gradle start up script for POSIX generated by Gradle. 22 | # 23 | # Important for running: 24 | # 25 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is 26 | # noncompliant, but you have some other compliant shell such as ksh or 27 | # bash, then to run this script, type that shell name before the whole 28 | # command line, like: 29 | # 30 | # ksh Gradle 31 | # 32 | # Busybox and similar reduced shells will NOT work, because this script 33 | # requires all of these POSIX shell features: 34 | # * functions; 35 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», 36 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»; 37 | # * compound commands having a testable exit status, especially «case»; 38 | # * various built-in commands including «command», «set», and «ulimit». 39 | # 40 | # Important for patching: 41 | # 42 | # (2) This script targets any POSIX shell, so it avoids extensions provided 43 | # by Bash, Ksh, etc; in particular arrays are avoided. 44 | # 45 | # The "traditional" practice of packing multiple parameters into a 46 | # space-separated string is a well documented source of bugs and security 47 | # problems, so this is (mostly) avoided, by progressively accumulating 48 | # options in "$@", and eventually passing that to Java. 49 | # 50 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, 51 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; 52 | # see the in-line comments for details. 53 | # 54 | # There are tweaks for specific operating systems such as AIX, CygWin, 55 | # Darwin, MinGW, and NonStop. 56 | # 57 | # (3) This script is generated from the Groovy template 58 | # https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt 59 | # within the Gradle project. 60 | # 61 | # You can find Gradle at https://github.com/gradle/gradle/. 62 | # 63 | ############################################################################## 64 | 65 | # Attempt to set APP_HOME 66 | 67 | # Resolve links: $0 may be a link 68 | app_path=$0 69 | 70 | # Need this for daisy-chained symlinks. 71 | while 72 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path 73 | [ -h "$app_path" ] 74 | do 75 | ls=$( ls -ld "$app_path" ) 76 | link=${ls#*' -> '} 77 | case $link in #( 78 | /*) app_path=$link ;; #( 79 | *) app_path=$APP_HOME$link ;; 80 | esac 81 | done 82 | 83 | APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit 84 | 85 | APP_NAME="Gradle" 86 | APP_BASE_NAME=${0##*/} 87 | 88 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 89 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 90 | 91 | # Use the maximum available, or set MAX_FD != -1 to use that value. 92 | MAX_FD=maximum 93 | 94 | warn () { 95 | echo "$*" 96 | } >&2 97 | 98 | die () { 99 | echo 100 | echo "$*" 101 | echo 102 | exit 1 103 | } >&2 104 | 105 | # OS specific support (must be 'true' or 'false'). 106 | cygwin=false 107 | msys=false 108 | darwin=false 109 | nonstop=false 110 | case "$( uname )" in #( 111 | CYGWIN* ) cygwin=true ;; #( 112 | Darwin* ) darwin=true ;; #( 113 | MSYS* | MINGW* ) msys=true ;; #( 114 | NONSTOP* ) nonstop=true ;; 115 | esac 116 | 117 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 118 | 119 | 120 | # Determine the Java command to use to start the JVM. 121 | if [ -n "$JAVA_HOME" ] ; then 122 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 123 | # IBM's JDK on AIX uses strange locations for the executables 124 | JAVACMD=$JAVA_HOME/jre/sh/java 125 | else 126 | JAVACMD=$JAVA_HOME/bin/java 127 | fi 128 | if [ ! -x "$JAVACMD" ] ; then 129 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 130 | 131 | Please set the JAVA_HOME variable in your environment to match the 132 | location of your Java installation." 133 | fi 134 | else 135 | JAVACMD=java 136 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 137 | 138 | Please set the JAVA_HOME variable in your environment to match the 139 | location of your Java installation." 140 | fi 141 | 142 | # Increase the maximum file descriptors if we can. 143 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then 144 | case $MAX_FD in #( 145 | max*) 146 | MAX_FD=$( ulimit -H -n ) || 147 | warn "Could not query maximum file descriptor limit" 148 | esac 149 | case $MAX_FD in #( 150 | '' | soft) :;; #( 151 | *) 152 | ulimit -n "$MAX_FD" || 153 | warn "Could not set maximum file descriptor limit to $MAX_FD" 154 | esac 155 | fi 156 | 157 | # Collect all arguments for the java command, stacking in reverse order: 158 | # * args from the command line 159 | # * the main class name 160 | # * -classpath 161 | # * -D...appname settings 162 | # * --module-path (only if needed) 163 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. 164 | 165 | # For Cygwin or MSYS, switch paths to Windows format before running java 166 | if "$cygwin" || "$msys" ; then 167 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) 168 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) 169 | 170 | JAVACMD=$( cygpath --unix "$JAVACMD" ) 171 | 172 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 173 | for arg do 174 | if 175 | case $arg in #( 176 | -*) false ;; # don't mess with options #( 177 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath 178 | [ -e "$t" ] ;; #( 179 | *) false ;; 180 | esac 181 | then 182 | arg=$( cygpath --path --ignore --mixed "$arg" ) 183 | fi 184 | # Roll the args list around exactly as many times as the number of 185 | # args, so each arg winds up back in the position where it started, but 186 | # possibly modified. 187 | # 188 | # NB: a `for` loop captures its iteration list before it begins, so 189 | # changing the positional parameters here affects neither the number of 190 | # iterations, nor the values presented in `arg`. 191 | shift # remove old arg 192 | set -- "$@" "$arg" # push replacement arg 193 | done 194 | fi 195 | 196 | # Collect all arguments for the java command; 197 | # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of 198 | # shell script including quotes and variable substitutions, so put them in 199 | # double quotes to make sure that they get re-expanded; and 200 | # * put everything else in single quotes, so that it's not re-expanded. 201 | 202 | set -- \ 203 | "-Dorg.gradle.appname=$APP_BASE_NAME" \ 204 | -classpath "$CLASSPATH" \ 205 | org.gradle.wrapper.GradleWrapperMain \ 206 | "$@" 207 | 208 | # Stop when "xargs" is not available. 209 | if ! command -v xargs >/dev/null 2>&1 210 | then 211 | die "xargs is not available" 212 | fi 213 | 214 | # Use "xargs" to parse quoted args. 215 | # 216 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed. 217 | # 218 | # In Bash we could simply go: 219 | # 220 | # readarray ARGS < <( xargs -n1 <<<"$var" ) && 221 | # set -- "${ARGS[@]}" "$@" 222 | # 223 | # but POSIX shell has neither arrays nor command substitution, so instead we 224 | # post-process each arg (as a line of input to sed) to backslash-escape any 225 | # character that might be a shell metacharacter, then use eval to reverse 226 | # that process (while maintaining the separation between arguments), and wrap 227 | # the whole thing up as a single "set" statement. 228 | # 229 | # This will of course break if any of these variables contains a newline or 230 | # an unmatched quote. 231 | # 232 | 233 | eval "set -- $( 234 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | 235 | xargs -n1 | 236 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | 237 | tr '\n' ' ' 238 | )" '"$@"' 239 | 240 | exec "$JAVACMD" "$@" 241 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # LICENSE 2 | 3 | © 2020, Nishant Srivastava 4 | 5 | UNLESS OTHERWISE NOTED, THE CONTENTS OF THIS REPOSITORY ARE LICENSED UNDER THE CREATIVE COMMONS ATTRIBUTION - SHARE ALIKE 4.0 INTERNATIONAL LICENSE 6 | 7 | ![https://creativecommons.org/licenses/by-sa/4.0/](https://i.creativecommons.org/l/by-sa/4.0/88x31.png) 8 | 9 | ## License Summary of CC-BY-SA 4.0 International 10 | 11 | *This section is a human-readable summary of (and not a substitute for) the full license included below.* 12 | 13 | ### You are free to: 14 | 15 | * **Share** — copy and redistribute the material in any medium or format 16 | * **Adapt** — remix, transform, and build upon the material for any purpose, even commercially. 17 | 18 | The licensor cannot revoke these freedoms as long as you follow the license terms. 19 | 20 | ### Under the following terms: 21 | 22 | * ![CC-BY](https://creativecommons.org/images/deed/by.png) **Attribution** — You must give **appropriate credit**, provide **a link to the license**, and **indicate if changes were made**. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use. 23 | * ![CC-BY](https://creativecommons.org/images/deed/sa.png) **ShareAlike** — If you remix, transform, or build upon the material, you must distribute your contributions under the **same license** as the original. 24 | 25 | **No additional restrictions** — You may not apply legal terms or **technological measures** that legally restrict others from doing anything the license permits. 26 | 27 | ### Notices: 28 | 29 | You do not have to comply with the license for elements of the material in the public domain or where your use is permitted by an applicable **exception or limitation**. 30 | 31 | No warranties are given. The license may not give you all of the permissions necessary for your intended use. For example, other rights such as **publicity, privacy, or moral rights** may limit how you use the material. 32 | 33 | # Creative Commons Attribution-ShareAlike 4.0 International License 34 | 35 | FROM: https://creativecommons.org/licenses/by-sa/4.0/legalcode 36 | 37 | Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. 38 | 39 | ### Using Creative Commons Public Licenses 40 | 41 | Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. 42 | 43 | * __Considerations for licensors:__ Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. [More considerations for licensors](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensors). 44 | 45 | * __Considerations for the public:__ By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. [More considerations for the public](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensees). 46 | 47 | ### Creative Commons Attribution-ShareAlike 4.0 International Public License 48 | 49 | By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. 50 | 51 | **Section 1 – Definitions.** 52 | 53 | 1. **Adapted Material** means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. 54 | 2. **Adapter's License** means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. 55 | 3. **BY-SA Compatible License** means a license listed at [ creativecommons.org/compatiblelicenses][4], approved by Creative Commons as essentially the equivalent of this Public License. 56 | 4. **Copyright and Similar Rights** means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. 57 | 5. **Effective Technological Measures** means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. 58 | 6. **Exceptions and Limitations** means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. 59 | 7. **License Elements** means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution and ShareAlike. 60 | 8. **Licensed Material** means the artistic or literary work, database, or other material to which the Licensor applied this Public License. 61 | 9. **Licensed Rights** means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. 62 | 10. **Licensor** means the individual(s) or entity(ies) granting rights under this Public License. 63 | 11. **Share** means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. 64 | 12. **Sui Generis Database Rights** means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. 65 | 13. **You** means the individual or entity exercising the Licensed Rights under this Public License. **Your** has a corresponding meaning. 66 | 67 | **Section 2 – Scope.** 68 | 69 | 1. **License grant**. 70 | 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: 71 | 1. reproduce and Share the Licensed Material, in whole or in part; and 72 | 2. produce, reproduce, and Share Adapted Material. 73 | 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. 74 | 3. Term. The term of this Public License is specified in Section 6(a). 75 | 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. 76 | 5. Downstream recipients. 77 | 78 | 1. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. 79 | 2. Additional offer from the Licensor – Adapted Material. Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter's License You apply. 80 | 3. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. 81 | 82 | 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). 83 | 2. **Other rights**. 84 | 85 | 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. 86 | 2. Patent and trademark rights are not licensed under this Public License. 87 | 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. 88 | 89 | **Section 3 – License Conditions.** 90 | 91 | Your exercise of the Licensed Rights is expressly made subject to the following conditions. 92 | 93 | 1. **Attribution**. 94 | 95 | 1. If You Share the Licensed Material (including in modified form), You must: 96 | 97 | 1. retain the following if it is supplied by the Licensor with the Licensed Material: 98 | 1. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); 99 | 2. a copyright notice; 100 | 3. a notice that refers to this Public License; 101 | 4. a notice that refers to the disclaimer of warranties; 102 | 5. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; 103 | 2. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and 104 | 3. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. 105 | 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. 106 | 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. 107 | 2. **ShareAlike**. 108 | 109 | In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply. 110 | 111 | 1. The Adapter's License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-SA Compatible License. 112 | 2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material. 113 | 3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply. 114 | 115 | **Section 4 – Sui Generis Database Rights.** 116 | 117 | Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: 118 | 119 | 1. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; 120 | 2. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and 121 | 3. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. 122 | For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. 123 | 124 | **Section 5 – Disclaimer of Warranties and Limitation of Liability.** 125 | 126 | 1. **Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.** 127 | 2. **To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.** 128 | 3. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. 129 | 130 | **Section 6 – Term and Termination.** 131 | 132 | 1. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. 133 | 2. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: 134 | 135 | 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or 136 | 2. upon express reinstatement by the Licensor. 137 | For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. 138 | 3. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. 139 | 4. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. 140 | 141 | **Section 7 – Other Terms and Conditions.** 142 | 143 | 1. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. 144 | 2. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. 145 | 146 | **Section 8 – Interpretation.** 147 | 148 | 1. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. 149 | 2. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. 150 | 3. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. 151 | 4. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. 152 | 153 | --- 154 | 155 | *Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the "Licensor." The text of the Creative Commons public licenses is dedicated to the public domain under the [CC0 Public Domain Dedication](http://creativecommons.org/publicdomain/zero/1.0/legalcode). Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at [creativecommons.org/policies](http://creativecommons.org/policies), Creative Commons does not authorize the use of the trademark "Creative Commons" or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.* 156 | 157 | *Creative Commons may be contacted at [creativecommons.org](http://creativecommons.org/).* 158 | 159 | *Additional languages available: [Bahasa Indonesia](http://creativecommons.org/licenses/by/4.0/legalcode.id), [Nederlands](http://creativecommons.org/licenses/by/4.0/legalcode.nl), [norsk]//creativecommons.org/licenses/by/4.0/legalcode.no, [suomeksi](//creativecommons.org/licenses/by/4.0/legalcode.fi), [te reo Māori](//creativecommons.org/licenses/by/4.0/legalcode.mi), [українська](//creativecommons.org/licenses/by/4.0/legalcode.uk), [日本語](//creativecommons.org/licenses/by/4.0/legalcode.ja). Please read the [FAQ](//wiki.creativecommons.org/FAQ#officialtranslations) for more information about official translations.* 160 | 161 | --- 162 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | charset = utf-8 3 | end_of_line = lf 4 | indent_size = 4 5 | indent_style = space 6 | trim_trailing_whitespace = true 7 | insert_final_newline = true 8 | max_line_length = 100 9 | tab_width = 4 10 | ij_continuation_indent_size = 8 11 | ij_formatter_off_tag = @formatter:off 12 | ij_formatter_on_tag = @formatter:on 13 | ij_formatter_tags_enabled = false 14 | ij_smart_tabs = false 15 | ij_wrap_on_typing = false 16 | 17 | [*.java] 18 | ij_java_align_consecutive_assignments = false 19 | ij_java_align_consecutive_variable_declarations = false 20 | ij_java_align_group_field_declarations = false 21 | ij_java_align_multiline_annotation_parameters = false 22 | ij_java_align_multiline_array_initializer_expression = false 23 | ij_java_align_multiline_assignment = false 24 | ij_java_align_multiline_binary_operation = false 25 | ij_java_align_multiline_chained_methods = false 26 | ij_java_align_multiline_extends_list = false 27 | ij_java_align_multiline_for = true 28 | ij_java_align_multiline_method_parentheses = false 29 | ij_java_align_multiline_parameters = true 30 | ij_java_align_multiline_parameters_in_calls = false 31 | ij_java_align_multiline_parenthesized_expression = false 32 | ij_java_align_multiline_resources = true 33 | ij_java_align_multiline_ternary_operation = false 34 | ij_java_align_multiline_text_blocks = false 35 | ij_java_align_multiline_throws_list = false 36 | ij_java_align_subsequent_simple_methods = false 37 | ij_java_align_throws_keyword = false 38 | ij_java_annotation_parameter_wrap = off 39 | ij_java_array_initializer_new_line_after_left_brace = false 40 | ij_java_array_initializer_right_brace_on_new_line = false 41 | ij_java_array_initializer_wrap = off 42 | ij_java_assert_statement_colon_on_next_line = false 43 | ij_java_assert_statement_wrap = off 44 | ij_java_assignment_wrap = off 45 | ij_java_binary_operation_sign_on_next_line = false 46 | ij_java_binary_operation_wrap = off 47 | ij_java_blank_lines_after_anonymous_class_header = 0 48 | ij_java_blank_lines_after_class_header = 0 49 | ij_java_blank_lines_after_imports = 1 50 | ij_java_blank_lines_after_package = 1 51 | ij_java_blank_lines_around_class = 1 52 | ij_java_blank_lines_around_field = 0 53 | ij_java_blank_lines_around_field_in_interface = 0 54 | ij_java_blank_lines_around_initializer = 1 55 | ij_java_blank_lines_around_method = 1 56 | ij_java_blank_lines_around_method_in_interface = 1 57 | ij_java_blank_lines_before_class_end = 0 58 | ij_java_blank_lines_before_imports = 1 59 | ij_java_blank_lines_before_method_body = 0 60 | ij_java_blank_lines_before_package = 0 61 | ij_java_block_brace_style = end_of_line 62 | ij_java_block_comment_at_first_column = true 63 | ij_java_call_parameters_new_line_after_left_paren = false 64 | ij_java_call_parameters_right_paren_on_new_line = false 65 | ij_java_call_parameters_wrap = off 66 | ij_java_case_statement_on_separate_line = true 67 | ij_java_catch_on_new_line = false 68 | ij_java_class_annotation_wrap = split_into_lines 69 | ij_java_class_brace_style = end_of_line 70 | ij_java_class_count_to_use_import_on_demand = 99 71 | ij_java_class_names_in_javadoc = 1 72 | ij_java_do_not_indent_top_level_class_members = false 73 | ij_java_do_not_wrap_after_single_annotation = false 74 | ij_java_do_while_brace_force = never 75 | ij_java_doc_add_blank_line_after_description = true 76 | ij_java_doc_add_blank_line_after_param_comments = false 77 | ij_java_doc_add_blank_line_after_return = false 78 | ij_java_doc_add_p_tag_on_empty_lines = true 79 | ij_java_doc_align_exception_comments = true 80 | ij_java_doc_align_param_comments = true 81 | ij_java_doc_do_not_wrap_if_one_line = false 82 | ij_java_doc_enable_formatting = true 83 | ij_java_doc_enable_leading_asterisks = true 84 | ij_java_doc_indent_on_continuation = false 85 | ij_java_doc_keep_empty_lines = true 86 | ij_java_doc_keep_empty_parameter_tag = true 87 | ij_java_doc_keep_empty_return_tag = true 88 | ij_java_doc_keep_empty_throws_tag = true 89 | ij_java_doc_keep_invalid_tags = true 90 | ij_java_doc_param_description_on_new_line = false 91 | ij_java_doc_preserve_line_breaks = false 92 | ij_java_doc_use_throws_not_exception_tag = true 93 | ij_java_else_on_new_line = false 94 | ij_java_enum_constants_wrap = off 95 | ij_java_extends_keyword_wrap = off 96 | ij_java_extends_list_wrap = off 97 | ij_java_field_annotation_wrap = split_into_lines 98 | ij_java_finally_on_new_line = false 99 | ij_java_for_brace_force = never 100 | ij_java_for_statement_new_line_after_left_paren = false 101 | ij_java_for_statement_right_paren_on_new_line = false 102 | ij_java_for_statement_wrap = off 103 | ij_java_generate_final_locals = false 104 | ij_java_generate_final_parameters = false 105 | ij_java_if_brace_force = never 106 | ij_java_imports_layout = android.**,|,androidx.**,|,com.**,|,junit.**,|,net.**,|,org.**,|,java.**,|,javax.**,|,*,|,$*,| 107 | ij_java_indent_case_from_switch = true 108 | ij_java_insert_inner_class_imports = false 109 | ij_java_insert_override_annotation = true 110 | ij_java_keep_blank_lines_before_right_brace = 2 111 | ij_java_keep_blank_lines_between_package_declaration_and_header = 2 112 | ij_java_keep_blank_lines_in_code = 2 113 | ij_java_keep_blank_lines_in_declarations = 2 114 | ij_java_keep_control_statement_in_one_line = true 115 | ij_java_keep_first_column_comment = true 116 | ij_java_keep_indents_on_empty_lines = false 117 | ij_java_keep_line_breaks = true 118 | ij_java_keep_multiple_expressions_in_one_line = false 119 | ij_java_keep_simple_blocks_in_one_line = false 120 | ij_java_keep_simple_classes_in_one_line = false 121 | ij_java_keep_simple_lambdas_in_one_line = false 122 | ij_java_keep_simple_methods_in_one_line = false 123 | ij_java_label_indent_absolute = false 124 | ij_java_label_indent_size = 0 125 | ij_java_lambda_brace_style = end_of_line 126 | ij_java_layout_static_imports_separately = true 127 | ij_java_line_comment_add_space = false 128 | ij_java_line_comment_at_first_column = true 129 | ij_java_method_annotation_wrap = split_into_lines 130 | ij_java_method_brace_style = end_of_line 131 | ij_java_method_call_chain_wrap = off 132 | ij_java_method_parameters_new_line_after_left_paren = false 133 | ij_java_method_parameters_right_paren_on_new_line = false 134 | ij_java_method_parameters_wrap = off 135 | ij_java_modifier_list_wrap = false 136 | ij_java_names_count_to_use_import_on_demand = 99 137 | ij_java_parameter_annotation_wrap = off 138 | ij_java_parentheses_expression_new_line_after_left_paren = false 139 | ij_java_parentheses_expression_right_paren_on_new_line = false 140 | ij_java_place_assignment_sign_on_next_line = false 141 | ij_java_prefer_longer_names = true 142 | ij_java_prefer_parameters_wrap = false 143 | ij_java_repeat_synchronized = true 144 | ij_java_replace_instanceof_and_cast = false 145 | ij_java_replace_null_check = true 146 | ij_java_replace_sum_lambda_with_method_ref = true 147 | ij_java_resource_list_new_line_after_left_paren = false 148 | ij_java_resource_list_right_paren_on_new_line = false 149 | ij_java_resource_list_wrap = off 150 | ij_java_space_after_closing_angle_bracket_in_type_argument = false 151 | ij_java_space_after_colon = true 152 | ij_java_space_after_comma = true 153 | ij_java_space_after_comma_in_type_arguments = true 154 | ij_java_space_after_for_semicolon = true 155 | ij_java_space_after_quest = true 156 | ij_java_space_after_type_cast = true 157 | ij_java_space_before_annotation_array_initializer_left_brace = false 158 | ij_java_space_before_annotation_parameter_list = false 159 | ij_java_space_before_array_initializer_left_brace = false 160 | ij_java_space_before_catch_keyword = true 161 | ij_java_space_before_catch_left_brace = true 162 | ij_java_space_before_catch_parentheses = true 163 | ij_java_space_before_class_left_brace = true 164 | ij_java_space_before_colon = true 165 | ij_java_space_before_colon_in_foreach = true 166 | ij_java_space_before_comma = false 167 | ij_java_space_before_do_left_brace = true 168 | ij_java_space_before_else_keyword = true 169 | ij_java_space_before_else_left_brace = true 170 | ij_java_space_before_finally_keyword = true 171 | ij_java_space_before_finally_left_brace = true 172 | ij_java_space_before_for_left_brace = true 173 | ij_java_space_before_for_parentheses = true 174 | ij_java_space_before_for_semicolon = false 175 | ij_java_space_before_if_left_brace = true 176 | ij_java_space_before_if_parentheses = true 177 | ij_java_space_before_method_call_parentheses = false 178 | ij_java_space_before_method_left_brace = true 179 | ij_java_space_before_method_parentheses = false 180 | ij_java_space_before_opening_angle_bracket_in_type_parameter = false 181 | ij_java_space_before_quest = true 182 | ij_java_space_before_switch_left_brace = true 183 | ij_java_space_before_switch_parentheses = true 184 | ij_java_space_before_synchronized_left_brace = true 185 | ij_java_space_before_synchronized_parentheses = true 186 | ij_java_space_before_try_left_brace = true 187 | ij_java_space_before_try_parentheses = true 188 | ij_java_space_before_type_parameter_list = false 189 | ij_java_space_before_while_keyword = true 190 | ij_java_space_before_while_left_brace = true 191 | ij_java_space_before_while_parentheses = true 192 | ij_java_space_inside_one_line_enum_braces = false 193 | ij_java_space_within_empty_array_initializer_braces = false 194 | ij_java_space_within_empty_method_call_parentheses = false 195 | ij_java_space_within_empty_method_parentheses = false 196 | ij_java_spaces_around_additive_operators = true 197 | ij_java_spaces_around_assignment_operators = true 198 | ij_java_spaces_around_bitwise_operators = true 199 | ij_java_spaces_around_equality_operators = true 200 | ij_java_spaces_around_lambda_arrow = true 201 | ij_java_spaces_around_logical_operators = true 202 | ij_java_spaces_around_method_ref_dbl_colon = false 203 | ij_java_spaces_around_multiplicative_operators = true 204 | ij_java_spaces_around_relational_operators = true 205 | ij_java_spaces_around_shift_operators = true 206 | ij_java_spaces_around_type_bounds_in_type_parameters = true 207 | ij_java_spaces_around_unary_operator = false 208 | ij_java_spaces_within_angle_brackets = false 209 | ij_java_spaces_within_annotation_parentheses = false 210 | ij_java_spaces_within_array_initializer_braces = false 211 | ij_java_spaces_within_braces = false 212 | ij_java_spaces_within_brackets = false 213 | ij_java_spaces_within_cast_parentheses = false 214 | ij_java_spaces_within_catch_parentheses = false 215 | ij_java_spaces_within_for_parentheses = false 216 | ij_java_spaces_within_if_parentheses = false 217 | ij_java_spaces_within_method_call_parentheses = false 218 | ij_java_spaces_within_method_parentheses = false 219 | ij_java_spaces_within_parentheses = false 220 | ij_java_spaces_within_switch_parentheses = false 221 | ij_java_spaces_within_synchronized_parentheses = false 222 | ij_java_spaces_within_try_parentheses = false 223 | ij_java_spaces_within_while_parentheses = false 224 | ij_java_special_else_if_treatment = true 225 | ij_java_subclass_name_suffix = Impl 226 | ij_java_ternary_operation_signs_on_next_line = false 227 | ij_java_ternary_operation_wrap = off 228 | ij_java_test_name_suffix = Test 229 | ij_java_throws_keyword_wrap = off 230 | ij_java_throws_list_wrap = off 231 | ij_java_use_external_annotations = false 232 | ij_java_use_fq_class_names = false 233 | ij_java_use_relative_indents = false 234 | ij_java_use_single_class_imports = true 235 | ij_java_variable_annotation_wrap = off 236 | ij_java_visibility = public 237 | ij_java_while_brace_force = never 238 | ij_java_while_on_new_line = false 239 | ij_java_wrap_comments = false 240 | ij_java_wrap_first_method_in_call_chain = false 241 | ij_java_wrap_long_lines = false 242 | 243 | [*.json] 244 | indent_size = 2 245 | ij_json_keep_blank_lines_in_code = 0 246 | ij_json_keep_indents_on_empty_lines = false 247 | ij_json_keep_line_breaks = true 248 | ij_json_space_after_colon = true 249 | ij_json_space_after_comma = true 250 | ij_json_space_before_colon = true 251 | ij_json_space_before_comma = false 252 | ij_json_spaces_within_braces = false 253 | ij_json_spaces_within_brackets = false 254 | ij_json_wrap_long_lines = false 255 | 256 | [*.properties] 257 | ij_properties_align_group_field_declarations = false 258 | 259 | [.editorconfig] 260 | ij_editorconfig_align_group_field_declarations = true 261 | ij_editorconfig_space_after_colon = false 262 | ij_editorconfig_space_after_comma = true 263 | ij_editorconfig_space_before_colon = false 264 | ij_editorconfig_space_before_comma = false 265 | ij_editorconfig_spaces_around_assignment_operators = true 266 | 267 | [{*.bash,*.zsh,*.sh}] 268 | indent_size = 2 269 | tab_width = 2 270 | ij_shell_binary_ops_start_line = false 271 | ij_shell_keep_column_alignment_padding = false 272 | ij_shell_minify_program = false 273 | ij_shell_redirect_followed_by_space = false 274 | ij_shell_switch_cases_indented = true 275 | 276 | [{*.gant,*.groovy,*.gradle,*.gdsl,*.gy}] 277 | ij_groovy_align_group_field_declarations = false 278 | ij_groovy_align_multiline_array_initializer_expression = false 279 | ij_groovy_align_multiline_assignment = false 280 | ij_groovy_align_multiline_binary_operation = false 281 | ij_groovy_align_multiline_chained_methods = false 282 | ij_groovy_align_multiline_extends_list = false 283 | ij_groovy_align_multiline_for = true 284 | ij_groovy_align_multiline_method_parentheses = false 285 | ij_groovy_align_multiline_parameters = true 286 | ij_groovy_align_multiline_parameters_in_calls = false 287 | ij_groovy_align_multiline_resources = true 288 | ij_groovy_align_multiline_ternary_operation = false 289 | ij_groovy_align_multiline_throws_list = false 290 | ij_groovy_align_throws_keyword = false 291 | ij_groovy_array_initializer_new_line_after_left_brace = false 292 | ij_groovy_array_initializer_right_brace_on_new_line = false 293 | ij_groovy_array_initializer_wrap = off 294 | ij_groovy_assert_statement_wrap = off 295 | ij_groovy_assignment_wrap = off 296 | ij_groovy_binary_operation_wrap = off 297 | ij_groovy_blank_lines_after_class_header = 0 298 | ij_groovy_blank_lines_after_imports = 1 299 | ij_groovy_blank_lines_after_package = 1 300 | ij_groovy_blank_lines_around_class = 1 301 | ij_groovy_blank_lines_around_field = 0 302 | ij_groovy_blank_lines_around_field_in_interface = 0 303 | ij_groovy_blank_lines_around_method = 1 304 | ij_groovy_blank_lines_around_method_in_interface = 1 305 | ij_groovy_blank_lines_before_imports = 1 306 | ij_groovy_blank_lines_before_method_body = 0 307 | ij_groovy_blank_lines_before_package = 0 308 | ij_groovy_block_brace_style = end_of_line 309 | ij_groovy_block_comment_at_first_column = true 310 | ij_groovy_call_parameters_new_line_after_left_paren = false 311 | ij_groovy_call_parameters_right_paren_on_new_line = false 312 | ij_groovy_call_parameters_wrap = off 313 | ij_groovy_catch_on_new_line = false 314 | ij_groovy_class_annotation_wrap = split_into_lines 315 | ij_groovy_class_brace_style = end_of_line 316 | ij_groovy_do_while_brace_force = never 317 | ij_groovy_else_on_new_line = false 318 | ij_groovy_enum_constants_wrap = off 319 | ij_groovy_extends_keyword_wrap = off 320 | ij_groovy_extends_list_wrap = off 321 | ij_groovy_field_annotation_wrap = split_into_lines 322 | ij_groovy_finally_on_new_line = false 323 | ij_groovy_for_brace_force = never 324 | ij_groovy_for_statement_new_line_after_left_paren = false 325 | ij_groovy_for_statement_right_paren_on_new_line = false 326 | ij_groovy_for_statement_wrap = off 327 | ij_groovy_if_brace_force = never 328 | ij_groovy_indent_case_from_switch = true 329 | ij_groovy_keep_blank_lines_before_right_brace = 2 330 | ij_groovy_keep_blank_lines_in_code = 2 331 | ij_groovy_keep_blank_lines_in_declarations = 2 332 | ij_groovy_keep_control_statement_in_one_line = true 333 | ij_groovy_keep_first_column_comment = true 334 | ij_groovy_keep_indents_on_empty_lines = false 335 | ij_groovy_keep_line_breaks = true 336 | ij_groovy_keep_multiple_expressions_in_one_line = false 337 | ij_groovy_keep_simple_blocks_in_one_line = false 338 | ij_groovy_keep_simple_classes_in_one_line = true 339 | ij_groovy_keep_simple_lambdas_in_one_line = true 340 | ij_groovy_keep_simple_methods_in_one_line = true 341 | ij_groovy_label_indent_absolute = false 342 | ij_groovy_label_indent_size = 0 343 | ij_groovy_lambda_brace_style = end_of_line 344 | ij_groovy_line_comment_add_space = false 345 | ij_groovy_line_comment_at_first_column = true 346 | ij_groovy_method_annotation_wrap = split_into_lines 347 | ij_groovy_method_brace_style = end_of_line 348 | ij_groovy_method_call_chain_wrap = off 349 | ij_groovy_method_parameters_new_line_after_left_paren = false 350 | ij_groovy_method_parameters_right_paren_on_new_line = false 351 | ij_groovy_method_parameters_wrap = off 352 | ij_groovy_modifier_list_wrap = false 353 | ij_groovy_parameter_annotation_wrap = off 354 | ij_groovy_parentheses_expression_new_line_after_left_paren = false 355 | ij_groovy_parentheses_expression_right_paren_on_new_line = false 356 | ij_groovy_prefer_parameters_wrap = false 357 | ij_groovy_resource_list_new_line_after_left_paren = false 358 | ij_groovy_resource_list_right_paren_on_new_line = false 359 | ij_groovy_resource_list_wrap = off 360 | ij_groovy_space_after_colon = true 361 | ij_groovy_space_after_comma = true 362 | ij_groovy_space_after_comma_in_type_arguments = true 363 | ij_groovy_space_after_for_semicolon = true 364 | ij_groovy_space_after_quest = true 365 | ij_groovy_space_after_type_cast = true 366 | ij_groovy_space_before_annotation_parameter_list = false 367 | ij_groovy_space_before_array_initializer_left_brace = false 368 | ij_groovy_space_before_catch_keyword = true 369 | ij_groovy_space_before_catch_left_brace = true 370 | ij_groovy_space_before_catch_parentheses = true 371 | ij_groovy_space_before_class_left_brace = true 372 | ij_groovy_space_before_colon = true 373 | ij_groovy_space_before_comma = false 374 | ij_groovy_space_before_do_left_brace = true 375 | ij_groovy_space_before_else_keyword = true 376 | ij_groovy_space_before_else_left_brace = true 377 | ij_groovy_space_before_finally_keyword = true 378 | ij_groovy_space_before_finally_left_brace = true 379 | ij_groovy_space_before_for_left_brace = true 380 | ij_groovy_space_before_for_parentheses = true 381 | ij_groovy_space_before_for_semicolon = false 382 | ij_groovy_space_before_if_left_brace = true 383 | ij_groovy_space_before_if_parentheses = true 384 | ij_groovy_space_before_method_call_parentheses = false 385 | ij_groovy_space_before_method_left_brace = true 386 | ij_groovy_space_before_method_parentheses = false 387 | ij_groovy_space_before_quest = true 388 | ij_groovy_space_before_switch_left_brace = true 389 | ij_groovy_space_before_switch_parentheses = true 390 | ij_groovy_space_before_synchronized_left_brace = true 391 | ij_groovy_space_before_synchronized_parentheses = true 392 | ij_groovy_space_before_try_left_brace = true 393 | ij_groovy_space_before_try_parentheses = true 394 | ij_groovy_space_before_while_keyword = true 395 | ij_groovy_space_before_while_left_brace = true 396 | ij_groovy_space_before_while_parentheses = true 397 | ij_groovy_space_within_empty_array_initializer_braces = false 398 | ij_groovy_space_within_empty_method_call_parentheses = false 399 | ij_groovy_spaces_around_additive_operators = true 400 | ij_groovy_spaces_around_assignment_operators = true 401 | ij_groovy_spaces_around_bitwise_operators = true 402 | ij_groovy_spaces_around_equality_operators = true 403 | ij_groovy_spaces_around_lambda_arrow = true 404 | ij_groovy_spaces_around_logical_operators = true 405 | ij_groovy_spaces_around_multiplicative_operators = true 406 | ij_groovy_spaces_around_relational_operators = true 407 | ij_groovy_spaces_around_shift_operators = true 408 | ij_groovy_spaces_within_annotation_parentheses = false 409 | ij_groovy_spaces_within_array_initializer_braces = false 410 | ij_groovy_spaces_within_braces = true 411 | ij_groovy_spaces_within_brackets = false 412 | ij_groovy_spaces_within_cast_parentheses = false 413 | ij_groovy_spaces_within_catch_parentheses = false 414 | ij_groovy_spaces_within_for_parentheses = false 415 | ij_groovy_spaces_within_if_parentheses = false 416 | ij_groovy_spaces_within_method_call_parentheses = false 417 | ij_groovy_spaces_within_method_parentheses = false 418 | ij_groovy_spaces_within_parentheses = false 419 | ij_groovy_spaces_within_switch_parentheses = false 420 | ij_groovy_spaces_within_synchronized_parentheses = false 421 | ij_groovy_spaces_within_try_parentheses = false 422 | ij_groovy_spaces_within_while_parentheses = false 423 | ij_groovy_special_else_if_treatment = true 424 | ij_groovy_ternary_operation_wrap = off 425 | ij_groovy_throws_keyword_wrap = off 426 | ij_groovy_throws_list_wrap = off 427 | ij_groovy_use_relative_indents = false 428 | ij_groovy_variable_annotation_wrap = off 429 | ij_groovy_while_brace_force = never 430 | ij_groovy_while_on_new_line = false 431 | ij_groovy_wrap_long_lines = false 432 | 433 | [{*.jhm,*.xslt,*.xul,*.rng,*.xsl,*.tld,*.ant,*.xml,*.xsd,*.fxml,*.wsdl,*.jrxml,*.jnlp}] 434 | ij_continuation_indent_size = 4 435 | ij_xml_block_comment_at_first_column = true 436 | ij_xml_keep_indents_on_empty_lines = false 437 | ij_xml_line_comment_at_first_column = true 438 | ij_xml_use_custom_settings = true 439 | ij_continuation_indent_size = 4 440 | ij_xml_block_comment_at_first_column = true 441 | ij_xml_keep_indents_on_empty_lines = false 442 | ij_xml_line_comment_at_first_column = true 443 | ij_xml_use_custom_settings = true 444 | 445 | [{*.kt,*.gradle.kts,*.kts,*.main.kts}] 446 | ij_kotlin_align_in_columns_case_branch = false 447 | ij_kotlin_align_multiline_binary_operation = false 448 | ij_kotlin_align_multiline_extends_list = false 449 | ij_kotlin_align_multiline_method_parentheses = false 450 | ij_kotlin_align_multiline_parameters = true 451 | ij_kotlin_align_multiline_parameters_in_calls = false 452 | ij_kotlin_assignment_wrap = normal 453 | ij_kotlin_blank_lines_after_class_header = 0 454 | ij_kotlin_blank_lines_around_block_when_branches = 0 455 | ij_kotlin_block_comment_at_first_column = true 456 | ij_kotlin_call_parameters_new_line_after_left_paren = true 457 | ij_kotlin_call_parameters_right_paren_on_new_line = true 458 | ij_kotlin_call_parameters_wrap = on_every_item 459 | ij_kotlin_catch_on_new_line = false 460 | ij_kotlin_class_annotation_wrap = split_into_lines 461 | ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL 462 | ij_kotlin_continuation_indent_for_chained_calls = false 463 | ij_kotlin_continuation_indent_for_expression_bodies = false 464 | ij_kotlin_continuation_indent_in_argument_lists = false 465 | ij_kotlin_continuation_indent_in_elvis = false 466 | ij_kotlin_continuation_indent_in_if_conditions = false 467 | ij_kotlin_continuation_indent_in_parameter_lists = false 468 | ij_kotlin_continuation_indent_in_supertype_lists = false 469 | ij_kotlin_else_on_new_line = false 470 | ij_kotlin_enum_constants_wrap = off 471 | ij_kotlin_extends_list_wrap = normal 472 | ij_kotlin_field_annotation_wrap = split_into_lines 473 | ij_kotlin_finally_on_new_line = false 474 | ij_kotlin_if_rparen_on_new_line = true 475 | ij_kotlin_import_nested_classes = false 476 | ij_kotlin_insert_whitespaces_in_simple_one_line_method = true 477 | ij_kotlin_keep_blank_lines_before_right_brace = 2 478 | ij_kotlin_keep_blank_lines_in_code = 2 479 | ij_kotlin_keep_blank_lines_in_declarations = 2 480 | ij_kotlin_keep_first_column_comment = true 481 | ij_kotlin_keep_indents_on_empty_lines = true 482 | ij_kotlin_keep_line_breaks = true 483 | ij_kotlin_lbrace_on_next_line = false 484 | ij_kotlin_line_comment_add_space = false 485 | ij_kotlin_line_comment_at_first_column = true 486 | ij_kotlin_method_annotation_wrap = split_into_lines 487 | ij_kotlin_method_call_chain_wrap = normal 488 | ij_kotlin_method_parameters_new_line_after_left_paren = true 489 | ij_kotlin_method_parameters_right_paren_on_new_line = true 490 | ij_kotlin_method_parameters_wrap = on_every_item 491 | ij_kotlin_name_count_to_use_star_import = 5 492 | ij_kotlin_name_count_to_use_star_import_for_members = 3 493 | ij_kotlin_parameter_annotation_wrap = off 494 | ij_kotlin_space_after_comma = true 495 | ij_kotlin_space_after_extend_colon = true 496 | ij_kotlin_space_after_type_colon = true 497 | ij_kotlin_space_before_catch_parentheses = true 498 | ij_kotlin_space_before_comma = false 499 | ij_kotlin_space_before_extend_colon = true 500 | ij_kotlin_space_before_for_parentheses = true 501 | ij_kotlin_space_before_if_parentheses = true 502 | ij_kotlin_space_before_lambda_arrow = true 503 | ij_kotlin_space_before_type_colon = false 504 | ij_kotlin_space_before_when_parentheses = true 505 | ij_kotlin_space_before_while_parentheses = true 506 | ij_kotlin_spaces_around_additive_operators = true 507 | ij_kotlin_spaces_around_assignment_operators = true 508 | ij_kotlin_spaces_around_equality_operators = true 509 | ij_kotlin_spaces_around_function_type_arrow = true 510 | ij_kotlin_spaces_around_logical_operators = true 511 | ij_kotlin_spaces_around_multiplicative_operators = true 512 | ij_kotlin_spaces_around_range = false 513 | ij_kotlin_spaces_around_relational_operators = true 514 | ij_kotlin_spaces_around_unary_operator = false 515 | ij_kotlin_spaces_around_when_arrow = true 516 | ij_kotlin_variable_annotation_wrap = off 517 | ij_kotlin_while_on_new_line = false 518 | ij_kotlin_wrap_elvis_expressions = 1 519 | ij_kotlin_wrap_expression_body_functions = 1 520 | ij_kotlin_wrap_first_method_in_call_chain = false 521 | 522 | [{*.shtm,*.htm,*.sht,*.shtml,*.html}] 523 | ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3 524 | ij_html_align_attributes = true 525 | ij_html_align_text = false 526 | ij_html_attribute_wrap = normal 527 | ij_html_block_comment_at_first_column = true 528 | ij_html_do_not_align_children_of_min_lines = 0 529 | ij_html_do_not_break_if_inline_tags = title,h1,h2,h3,h4,h5,h6,p 530 | ij_html_do_not_indent_children_of_tags = html,body,thead,tbody,tfoot 531 | ij_html_enforce_quotes = false 532 | ij_html_inline_tags = a,abbr,acronym,b,basefont,bdo,big,br,cite,cite,code,dfn,em,font,i,img,input,kbd,label,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var 533 | ij_html_keep_blank_lines = 2 534 | ij_html_keep_indents_on_empty_lines = false 535 | ij_html_keep_line_breaks = true 536 | ij_html_keep_line_breaks_in_text = true 537 | ij_html_keep_whitespaces = false 538 | ij_html_keep_whitespaces_inside = span,pre,textarea 539 | ij_html_line_comment_at_first_column = true 540 | ij_html_new_line_after_last_attribute = never 541 | ij_html_new_line_before_first_attribute = never 542 | ij_html_quote_style = double 543 | ij_html_remove_new_line_before_tags = br 544 | ij_html_space_after_tag_name = false 545 | ij_html_space_around_equality_in_attribute = false 546 | ij_html_space_inside_empty_tag = false 547 | ij_html_text_wrap = normal 548 | 549 | [{*.yaml,*.yml}] 550 | indent_size = 2 551 | ij_yaml_keep_indents_on_empty_lines = false 552 | ij_yaml_keep_line_breaks = true 553 | --------------------------------------------------------------------------------