├── sample ├── .gitignore ├── src │ └── main │ │ ├── res │ │ ├── values │ │ │ ├── strings.xml │ │ │ ├── colors.xml │ │ │ └── themes.xml │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.webp │ │ │ └── ic_launcher_round.webp │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ ├── xml │ │ │ ├── backup_rules.xml │ │ │ └── data_extraction_rules.xml │ │ ├── values-night │ │ │ └── themes.xml │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ ├── layout │ │ │ └── activity_main.xml │ │ └── drawable │ │ │ └── ic_launcher_background.xml │ │ ├── assets │ │ └── mock-response.json │ │ ├── java │ │ └── io │ │ │ └── github │ │ │ └── brunogabriel │ │ │ └── sample │ │ │ ├── Extensions.kt │ │ │ ├── CustomApplication.kt │ │ │ ├── CharacterRepository.kt │ │ │ ├── CharacterService.kt │ │ │ ├── RetrofitProvider.kt │ │ │ └── MainActivity.kt │ │ └── AndroidManifest.xml ├── proguard-rules.pro └── build.gradle ├── .idea ├── .name ├── .gitignore ├── vcs.xml ├── compiler.xml ├── misc.xml └── gradle.xml ├── library ├── .gitignore ├── consumer-rules.pro ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ └── io │ │ └── github │ │ └── brunogabriel │ │ └── mockpinterceptor │ │ ├── InterceptorData.kt │ │ ├── MockPAnnotations.kt │ │ ├── MockPMappers.kt │ │ └── MockPInterceptor.kt ├── proguard-rules.pro └── build.gradle ├── library-no-op ├── .gitignore ├── consumer-rules.pro ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── io │ │ └── github │ │ └── brunogabriel │ │ └── mockpinterceptor │ │ ├── MockPAnnotations.kt │ │ └── MockPInterceptor.kt ├── proguard-rules.pro └── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitignore ├── settings.gradle ├── gradle.properties ├── README.md ├── gradlew.bat ├── gradlew └── LICENSE /sample/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | MockpInterceptor -------------------------------------------------------------------------------- /library/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /library/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /library-no-op/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /library-no-op/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /sample/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | MockpInterceptor 3 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunogabriel/mockp-interceptor/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /sample/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunogabriel/mockp-interceptor/HEAD/sample/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /sample/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunogabriel/mockp-interceptor/HEAD/sample/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /sample/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunogabriel/mockp-interceptor/HEAD/sample/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /sample/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunogabriel/mockp-interceptor/HEAD/sample/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /sample/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunogabriel/mockp-interceptor/HEAD/sample/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /sample/src/main/assets/mock-response.json: -------------------------------------------------------------------------------- 1 | { 2 | "results": [ 3 | { 4 | "id": 1, 5 | "name": "brunogabriel.github.io.mockpinterceptor" 6 | } 7 | ] 8 | } -------------------------------------------------------------------------------- /sample/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunogabriel/mockp-interceptor/HEAD/sample/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /sample/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunogabriel/mockp-interceptor/HEAD/sample/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /sample/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunogabriel/mockp-interceptor/HEAD/sample/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /sample/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunogabriel/mockp-interceptor/HEAD/sample/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /sample/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunogabriel/mockp-interceptor/HEAD/sample/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /library/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /library-no-op/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /sample/src/main/java/io/github/brunogabriel/sample/Extensions.kt: -------------------------------------------------------------------------------- 1 | package io.github.brunogabriel.sample 2 | 3 | import android.view.View 4 | 5 | fun View.show() { 6 | visibility = View.VISIBLE 7 | } 8 | 9 | fun View.hide() { 10 | visibility = View.GONE 11 | } -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jul 01 22:24:10 BRT 2022 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | local.properties 16 | -------------------------------------------------------------------------------- /sample/src/main/java/io/github/brunogabriel/sample/CustomApplication.kt: -------------------------------------------------------------------------------- 1 | package io.github.brunogabriel.sample 2 | 3 | import android.app.Application 4 | 5 | class CustomApplication : Application() { 6 | override fun onCreate() { 7 | super.onCreate() 8 | RetrofitProvider.setup(this) 9 | } 10 | } -------------------------------------------------------------------------------- /sample/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /library/src/main/kotlin/io/github/brunogabriel/mockpinterceptor/InterceptorData.kt: -------------------------------------------------------------------------------- 1 | package io.github.brunogabriel.mockpinterceptor 2 | 3 | import java.net.HttpURLConnection 4 | 5 | internal class InterceptorData( 6 | val asset: String = "", 7 | val statusCode: Int = HttpURLConnection.HTTP_OK, 8 | val runDelay: Boolean = false 9 | ) -------------------------------------------------------------------------------- /sample/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /sample/src/main/java/io/github/brunogabriel/sample/CharacterRepository.kt: -------------------------------------------------------------------------------- 1 | package io.github.brunogabriel.sample 2 | 3 | class CharacterRepository( 4 | private val characterService: CharacterService 5 | ) { 6 | suspend fun getCharacters() = characterService.getCharacters() 7 | suspend fun getMockCharacters() = characterService.getMockCharacters() 8 | } -------------------------------------------------------------------------------- /library/src/main/kotlin/io/github/brunogabriel/mockpinterceptor/MockPAnnotations.kt: -------------------------------------------------------------------------------- 1 | package io.github.brunogabriel.mockpinterceptor 2 | 3 | import java.net.HttpURLConnection 4 | 5 | @Retention(AnnotationRetention.RUNTIME) 6 | annotation class MOCK( 7 | val asset: String = "", 8 | val statusCode: Int = HttpURLConnection.HTTP_OK, 9 | val runDelay: Boolean = false 10 | ) -------------------------------------------------------------------------------- /library-no-op/src/main/java/io/github/brunogabriel/mockpinterceptor/MockPAnnotations.kt: -------------------------------------------------------------------------------- 1 | package io.github.brunogabriel.mockpinterceptor 2 | 3 | import java.net.HttpURLConnection 4 | 5 | @Retention(AnnotationRetention.RUNTIME) 6 | annotation class MOCK( 7 | val asset: String = "", 8 | val statusCode: Int = HttpURLConnection.HTTP_OK, 9 | val runDelay: Boolean = false 10 | ) -------------------------------------------------------------------------------- /library/src/main/kotlin/io/github/brunogabriel/mockpinterceptor/MockPMappers.kt: -------------------------------------------------------------------------------- 1 | package io.github.brunogabriel.mockpinterceptor 2 | 3 | internal fun mockToInterceptorData(mock: MOCK?) = mock 4 | .takeIf { it != null } 5 | ?.let { 6 | InterceptorData( 7 | asset = it.asset, 8 | statusCode = it.statusCode, 9 | runDelay = it.runDelay 10 | ) 11 | } ?: InterceptorData() -------------------------------------------------------------------------------- /sample/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFBB86FC 4 | #FF6200EE 5 | #FF3700B3 6 | #FF03DAC5 7 | #FF018786 8 | #FF000000 9 | #FFFFFFFF 10 | -------------------------------------------------------------------------------- /sample/src/main/java/io/github/brunogabriel/sample/CharacterService.kt: -------------------------------------------------------------------------------- 1 | package io.github.brunogabriel.sample 2 | 3 | import io.github.brunogabriel.mockpinterceptor.MOCK 4 | import retrofit2.http.GET 5 | 6 | interface CharacterService { 7 | @GET("character") 8 | suspend fun getCharacters(): String 9 | 10 | @MOCK(asset = "mock-response.json", runDelay = true) 11 | @GET("character") 12 | suspend fun getMockCharacters(): String 13 | } -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | mavenLocal() 4 | gradlePluginPortal() 5 | google() 6 | mavenCentral() 7 | } 8 | } 9 | dependencyResolutionManagement { 10 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 11 | repositories { 12 | mavenLocal() 13 | google() 14 | mavenCentral() 15 | } 16 | } 17 | rootProject.name = "MockpInterceptor" 18 | include ':sample' 19 | include ':library' 20 | include ':library-no-op' 21 | -------------------------------------------------------------------------------- /sample/src/main/res/xml/backup_rules.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 13 | -------------------------------------------------------------------------------- /sample/src/main/res/xml/data_extraction_rules.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 12 | 13 | 19 | -------------------------------------------------------------------------------- /library-no-op/src/main/java/io/github/brunogabriel/mockpinterceptor/MockPInterceptor.kt: -------------------------------------------------------------------------------- 1 | package io.github.brunogabriel.mockpinterceptor 2 | 3 | import android.content.Context 4 | import okhttp3.Interceptor 5 | 6 | @Suppress("unused", "UNUSED_PARAMETER") 7 | class MockPInterceptor private constructor( 8 | private val context: Context, 9 | private val builder: Builder 10 | ) : Interceptor { 11 | 12 | override fun intercept(chain: Interceptor.Chain) = chain.proceed(chain.request()) 13 | 14 | class Builder(private val context: Context) { 15 | fun build() = MockPInterceptor(context, this) 16 | fun addDelayInMillis(minDelay: Long, maxDelay: Long) = this 17 | } 18 | } -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 10 | 11 | 12 | 13 | 14 | 16 | -------------------------------------------------------------------------------- /library/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 -------------------------------------------------------------------------------- /sample/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 -------------------------------------------------------------------------------- /library-no-op/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 -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 20 | 21 | -------------------------------------------------------------------------------- /sample/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /sample/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16 | -------------------------------------------------------------------------------- /sample/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 19 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /sample/src/main/java/io/github/brunogabriel/sample/RetrofitProvider.kt: -------------------------------------------------------------------------------- 1 | package io.github.brunogabriel.sample 2 | 3 | import android.content.Context 4 | import io.github.brunogabriel.mockpinterceptor.MockPInterceptor 5 | import okhttp3.OkHttpClient 6 | import retrofit2.Retrofit 7 | import retrofit2.converter.scalars.ScalarsConverterFactory 8 | import java.util.concurrent.TimeUnit 9 | 10 | object RetrofitProvider { 11 | private const val BASE_URL = "https://rickandmortyapi.com/api/" 12 | private lateinit var retrofit: Retrofit 13 | 14 | fun setup(context: Context) { 15 | val client = OkHttpClient.Builder() 16 | .writeTimeout(30L, TimeUnit.SECONDS) 17 | .readTimeout(30L, TimeUnit.SECONDS) 18 | .connectTimeout(30L, TimeUnit.SECONDS) 19 | .addInterceptor( 20 | MockPInterceptor 21 | .Builder(context) 22 | .addDelayInMillis(5_000L, 10_000L) 23 | .build() 24 | ) 25 | .build() 26 | 27 | retrofit = Retrofit.Builder() 28 | .baseUrl(BASE_URL) 29 | .client(client) 30 | .addConverterFactory(ScalarsConverterFactory.create()) 31 | .build() 32 | } 33 | 34 | fun provideService(clazz: Class): T = retrofit.create(clazz) 35 | } -------------------------------------------------------------------------------- /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=-Xmx8g -Dfile.encoding=UTF-8 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 | # Enables namespacing of each library's R class so that its R class includes only the 21 | # resources declared in the library itself and none from the library's dependencies, 22 | # thereby reducing the size of the R class for that library 23 | android.nonTransitiveRClass=true 24 | android.disableAutomaticComponentCreation=true -------------------------------------------------------------------------------- /library/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.library' 3 | id 'org.jetbrains.kotlin.android' 4 | id 'maven-publish' 5 | } 6 | 7 | group = rootProject.groupName 8 | version = rootProject.versionName 9 | 10 | android { 11 | compileSdk rootProject.compileSdkVersion 12 | 13 | defaultConfig { 14 | minSdk rootProject.minSdkVersion 15 | targetSdk rootProject.targetSdkVersion 16 | 17 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 18 | consumerProguardFiles "consumer-rules.pro" 19 | } 20 | 21 | buildTypes { 22 | release { 23 | minifyEnabled false 24 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 25 | } 26 | } 27 | compileOptions { 28 | sourceCompatibility JavaVersion.VERSION_1_8 29 | targetCompatibility JavaVersion.VERSION_1_8 30 | } 31 | kotlinOptions { 32 | jvmTarget = '1.8' 33 | } 34 | } 35 | 36 | dependencies { 37 | api(platform("com.squareup.okhttp3:okhttp-bom:$okhttpVersion")) 38 | api("com.squareup.okhttp3:okhttp") 39 | api("com.squareup.retrofit2:retrofit:$retrofitVersion") 40 | } 41 | 42 | afterEvaluate { 43 | publishing { 44 | publications { 45 | release(MavenPublication) { 46 | from components.release 47 | groupId = rootProject.groupName 48 | artifactId = 'library' 49 | version = rootProject.versionName 50 | } 51 | } 52 | } 53 | } -------------------------------------------------------------------------------- /library-no-op/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.library' 3 | id 'org.jetbrains.kotlin.android' 4 | id 'maven-publish' 5 | } 6 | 7 | group = rootProject.groupName 8 | version = rootProject.versionName 9 | 10 | android { 11 | compileSdk rootProject.compileSdkVersion 12 | 13 | defaultConfig { 14 | minSdk rootProject.minSdkVersion 15 | targetSdk rootProject.targetSdkVersion 16 | 17 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 18 | consumerProguardFiles "consumer-rules.pro" 19 | } 20 | 21 | buildTypes { 22 | release { 23 | minifyEnabled false 24 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 25 | } 26 | } 27 | compileOptions { 28 | sourceCompatibility JavaVersion.VERSION_1_8 29 | targetCompatibility JavaVersion.VERSION_1_8 30 | } 31 | kotlinOptions { 32 | jvmTarget = '1.8' 33 | } 34 | } 35 | 36 | dependencies { 37 | api(platform("com.squareup.okhttp3:okhttp-bom:$okhttpVersion")) 38 | api("com.squareup.okhttp3:okhttp") 39 | api("com.squareup.retrofit2:retrofit:$retrofitVersion") 40 | } 41 | 42 | afterEvaluate { 43 | publishing { 44 | publications { 45 | release(MavenPublication) { 46 | from components.release 47 | groupId = rootProject.groupName 48 | artifactId = 'library-no-op' 49 | version = rootProject.versionName 50 | } 51 | } 52 | } 53 | } -------------------------------------------------------------------------------- /sample/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /sample/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | id 'org.jetbrains.kotlin.android' 4 | } 5 | 6 | android { 7 | compileSdk rootProject.compileSdkVersion 8 | 9 | defaultConfig { 10 | applicationId "io.github.brunogabriel.mockpinterceptor" 11 | minSdk rootProject.minSdkVersion 12 | targetSdk rootProject.targetSdkVersion 13 | versionCode 1 14 | versionName "1.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 | viewBinding { 26 | enabled = true 27 | } 28 | compileOptions { 29 | sourceCompatibility JavaVersion.VERSION_1_8 30 | targetCompatibility JavaVersion.VERSION_1_8 31 | } 32 | kotlinOptions { 33 | jvmTarget = '1.8' 34 | } 35 | } 36 | 37 | dependencies { 38 | implementation(project(":library")) 39 | 40 | implementation(platform("com.squareup.okhttp3:okhttp-bom:$okhttpVersion")) 41 | implementation("com.squareup.okhttp3:okhttp") 42 | implementation("com.squareup.retrofit2:retrofit:$retrofitVersion") 43 | implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion") 44 | implementation 'com.squareup.retrofit2:converter-scalars:2.1.0' 45 | 46 | implementation 'androidx.core:core-ktx:1.8.0' 47 | implementation 'androidx.appcompat:appcompat:1.4.2' 48 | implementation 'com.google.android.material:material:1.6.1' 49 | implementation 'androidx.constraintlayout:constraintlayout:2.1.4' 50 | testImplementation 'junit:junit:4.13.2' 51 | androidTestImplementation 'androidx.test.ext:junit:1.1.3' 52 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' 53 | } -------------------------------------------------------------------------------- /sample/src/main/java/io/github/brunogabriel/sample/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package io.github.brunogabriel.sample 2 | 3 | import androidx.appcompat.app.AppCompatActivity 4 | import android.os.Bundle 5 | import io.github.brunogabriel.mockpinterceptor.sample.databinding.ActivityMainBinding 6 | import kotlinx.coroutines.* 7 | 8 | class MainActivity : AppCompatActivity() { 9 | 10 | private lateinit var binding: ActivityMainBinding 11 | 12 | private val job = Job() 13 | private val uiScope = CoroutineScope(Dispatchers.Main + job) 14 | 15 | private val repository by lazy { 16 | CharacterRepository(RetrofitProvider.provideService(CharacterService::class.java)) 17 | } 18 | 19 | override fun onCreate(savedInstanceState: Bundle?) { 20 | super.onCreate(savedInstanceState) 21 | binding = ActivityMainBinding.inflate(layoutInflater) 22 | setContentView(binding.root) 23 | setupView() 24 | } 25 | 26 | private fun setupView() { 27 | binding.mockRequestButton.setOnClickListener { 28 | with(binding) { 29 | requestLayout.hide() 30 | progressBar.show() 31 | } 32 | showDataFromServer { repository.getMockCharacters() } 33 | } 34 | 35 | binding.requestButton.setOnClickListener { 36 | with(binding) { 37 | requestLayout.hide() 38 | progressBar.show() 39 | } 40 | showDataFromServer { repository.getCharacters() } 41 | } 42 | } 43 | 44 | private fun showDataFromServer(action: suspend () -> String) { 45 | uiScope.launch { 46 | withContext(Dispatchers.IO) { 47 | val response = withContext(Dispatchers.IO) { 48 | try { 49 | action() 50 | } catch (error: Exception) { 51 | error.message ?: "Error" 52 | } 53 | } 54 | 55 | withContext(Dispatchers.Main) { 56 | with(binding) { 57 | apiTextView.text = response 58 | progressBar.hide() 59 | nestedScrollView.show() 60 | } 61 | } 62 | } 63 | } 64 | } 65 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # mockp-interceptor 2 | [![](https://jitpack.io/v/brunogabriel/mockp-interceptor.svg)](https://jitpack.io/#brunogabriel/mockp-interceptor) 3 | 4 | Mockp-interceptor is a library to simplify Android development requests that uses Retrofit and OkHttp. This library will mock requests using a json file format in assets folder. 5 | 6 | Basically you need to put a simple annotation in Retrofit Service with file path, status code (optional, default is 200) and run delay (optional, default is false). 7 | 8 | 9 | ## Getting started 10 | 11 | Mockp-Interceptor is distributed through [jitpack](https://jitpack.io/#brunogabriel/mockp-interceptor). You need to add dependency in `build.gradle` file and pay attention in two libraries variants: 12 | 13 | - `library`: used in development mode, will mock requests. 14 | - `library-no-op`: used in release mode, will not mock requests, is just a fake interceptor that repass the requests forward. 15 | 16 | 17 | ```groovy 18 | dependencies { 19 | releaseImplementation 'com.github.brunogabriel.mockp-interceptor:library-no-op:0.0.1' 20 | debugImplementation 'com.github.brunogabriel.mockp-interceptor:library:0.0.1' 21 | } 22 | ``` 23 | 24 | Do not forget to add jitpack configuration too: 25 | 26 | ```groovy 27 | allprojects { 28 | repositories { 29 | ... 30 | maven { url 'https://jitpack.io' } 31 | } 32 | } 33 | ``` 34 | 35 | Thank you [Chucker](https://github.com/ChuckerTeam/chucker) and [Chuck](https://github.com/jgilfelt/chuck). I learnt this approach to no-op interceptors long time ago by using both libraries. 36 | 37 | 38 | ### Configure 39 | 40 | It is easy to configure Mockp, just pass context in Builder pattern and optional value if you need to simulate delay. Default delay is between 0 and 1000 milliseconds. 41 | 42 | ```kotlin 43 | // Create interceptor 44 | val mockpInterceptor = MockPInterceptor 45 | .Builder(context) 46 | .addDelayInMillis(5_000L, 10_000L) 47 | .build() 48 | 49 | // Plug in OkHttpClient 50 | val client = OkHttpClient 51 | .Builder() 52 | .addInterceptor(mockpInterceptor) 53 | .build() 54 | ``` 55 | 56 | ### How to use it in development 57 | 58 | Create assets folder and pass a json file path, for example, response.json, then: 59 | 60 | ```kotlin 61 | @MOCK(asset = "response.json", runDelay = true) 62 | @GET("products") 63 | suspend fun getProducts(): List 64 | ``` 65 | 66 | ### Libraries 67 | 68 | Mockp-Interceptor uses the following open source libraries: 69 | 70 | - [OkHttp](https://github.com/square/okhttp) - Copyright Square, Inc. 71 | - [Retrofit](https://github.com/square/retrofit) - Copyright Square, Inc. 72 | 73 | ### License 74 | 75 | See [LICENSE](LICENSE) 76 | -------------------------------------------------------------------------------- /sample/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 18 | 19 | 29 | 30 |