├── 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 |
4 |
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 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
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 | [](https://github.com/nisrulz/AndroidAutomations/actions/workflows/gradle-wrapper-validation.yml)
5 | [](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 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
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 |
126 |
127 |
128 |
129 |
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 | 
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 | *  **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 | *  **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 |
--------------------------------------------------------------------------------