diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..5d81c81 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,21 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..2a4d5b5 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index e0379bd..4e01b46 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ -# ServiceBase \ No newline at end of file +# ServiceBase +This is a base library in order to use by other libraries which need to implement AIDL and BroadCast connection with Bazaar client. \ No newline at end of file diff --git a/ServiceBase/.gitignore b/ServiceBase/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/ServiceBase/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/ServiceBase/build.gradle b/ServiceBase/build.gradle new file mode 100644 index 0000000..6752c1c --- /dev/null +++ b/ServiceBase/build.gradle @@ -0,0 +1,45 @@ +plugins { + id 'com.android.library' + id 'kotlin-android' + id 'maven-publish' +} + +android { + compileSdk 30 + buildToolsVersion '31.0.0' + + defaultConfig { + minSdk 17 + targetSdk 30 + versionCode 1 + versionName "1.0" + + } + + buildTypes { + release { + minifyEnabled false + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + implementation "androidx.core:core-ktx:1.6.0" +} + +afterEvaluate { + publishing { + publications { + release(MavenPublication) { + from components.release + } + } + } +} \ No newline at end of file diff --git a/ServiceBase/src/main/AndroidManifest.xml b/ServiceBase/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a9e524f --- /dev/null +++ b/ServiceBase/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/ServiceBase/src/main/java/com/cafebazaar/servicebase/Client.kt b/ServiceBase/src/main/java/com/cafebazaar/servicebase/Client.kt new file mode 100644 index 0000000..f9b1bf5 --- /dev/null +++ b/ServiceBase/src/main/java/com/cafebazaar/servicebase/Client.kt @@ -0,0 +1,165 @@ +package com.cafebazaar.servicebase + +import android.content.Context +import android.os.Looper +import com.cafebazaar.servicebase.communicator.ClientConnectionCommunicator +import com.cafebazaar.servicebase.communicator.ClientReceiverCommunicator +import com.cafebazaar.servicebase.receiver.ClientReceiver +import com.cafebazaar.servicebase.state.ClientError +import com.cafebazaar.servicebase.state.ClientStateListener + +abstract class Client(private val context: Context) { + + private var clientStateListener: ClientStateListener? = null + + protected abstract val supportedClientVersion: Long + protected abstract fun getServiceConnection(): ClientConnectionCommunicator? + protected abstract fun getBroadcastConnections(): ClientConnectionCommunicator? + + @Volatile private var clientState = DISCONNECTED + @Volatile protected var clientConnection: ClientConnectionCommunicator? = null + + private val isReady: Boolean + get() = (clientState == CONNECTED) + .and(clientConnection != null) + + fun startConnection(clientStateListener: ClientStateListener) { + this.clientStateListener = clientStateListener + if (isNotBazaarInstalled(clientStateListener)) return + if (isNotBazaarCompatible(clientStateListener)) return + throwExceptionIfRunningOnMainThread() + startingConnection(clientStateListener) + } + + private fun isNotBazaarCompatible(clientStateListener: ClientStateListener): Boolean { + if (getBazaarVersionCode(context) < supportedClientVersion) { + handleErrorOnBazaarIsNotCompatible(clientStateListener) + return true + } + return false + } + + private fun isNotBazaarInstalled(clientStateListener: ClientStateListener): Boolean { + if (verifyBazaarIsInstalled(context).not()) { + handleErrorOnBazaarIsNotInstalled(clientStateListener) + return true + } + return false + } + + private fun handleErrorOnBazaarIsNotCompatible(clientStateListener: ClientStateListener) { + clientState = DISCONNECTED + clientStateListener.onError( + ClientError.ERROR_BAZAAR_IS_NOT_COMPATIBLE + ) + } + + private fun handleErrorOnBazaarIsNotInstalled(clientStateListener: ClientStateListener) { + clientState = DISCONNECTED + clientStateListener.onError( + ClientError.ERROR_BAZAAR_IS_NOT_INSTALL + ) + } + + private fun startingConnection(clientStateListener: ClientStateListener) { + if (isReady.not()) { + if (clientState == CONNECTING) { + clientStateListener.onError( + ClientError.ERROR_SDK_IS_STARTED + ) + return + } + tryToConnect(clientStateListener) + } else { + clientStateListener.onReady() + } + } + + private fun tryToConnect(clientStateListener: ClientStateListener) { + clientState = CONNECTING + if (tryConnectingByService()) return + if (tryConnectingByBroadcast()) return + clientState = DISCONNECTED + clientStateListener.onError( + ClientError.ERROR_SDK_COULD_NOT_CONNECT + ) + } + + private fun tryConnectingByBroadcast(): Boolean { + getBroadcastConnections()?.let { connection -> + if (connection is ClientReceiverCommunicator) { + ClientReceiver.addObserver(connection) + } + if (connection.startConnection()) { + clientConnection = connection + updateClientStateToConnected() + return true + } + } + return false + } + + private fun tryConnectingByService(): Boolean { + synchronized(this) { + getServiceConnection()?.let { connection -> + if (connection.startConnection()) { + clientConnection = connection + return true + } + } + return false + } + } + + protected fun updateClientStateToConnected() { + synchronized(this) { + clientState = CONNECTED + clientStateListener?.onReady() + } + } + + private fun throwExceptionIfRunningOnMainThread() { + if (Looper.myLooper() == Looper.getMainLooper()) { + throw IllegalThreadStateException(OFF_MAIN_THREAD_EXCEPTION) + } + } + + fun endConnection() { + clientStateListener = null + clientConnection?.let { connection -> + if (connection is ClientReceiverCommunicator) { + ClientReceiver.removeObserver(connection) + } + connection.stopConnection() + } + clientState = DISCONNECTED + } + + protected fun errorOccurred(clientError: ClientError) { + clientStateListener?.onError(clientError) + } + + @Throws(IllegalStateException::class) + protected fun runIfReady(block: () -> T?): T? { + if (isReady.not()) { + throw IllegalStateException(SERVICE_IS_NOT_STARTED_EXCEPTION) + } else { + return block.invoke() + } + } + + private fun verifyBazaarIsInstalled(context: Context): Boolean { + return getBazaarPackageInfo(context) != null + } + + companion object { + const val SERVICE_PACKAGE_NAME = "com.farsitel.bazaar" + + private const val OFF_MAIN_THREAD_EXCEPTION = "This function has to call off the main thread." + private const val SERVICE_IS_NOT_STARTED_EXCEPTION = + "Service not connected. Please start a connection before using the service." + private const val DISCONNECTED = 0 + private const val CONNECTING = 1 + private const val CONNECTED = 2 + } +} \ No newline at end of file diff --git a/ServiceBase/src/main/java/com/cafebazaar/servicebase/PackageHelper.kt b/ServiceBase/src/main/java/com/cafebazaar/servicebase/PackageHelper.kt new file mode 100644 index 0000000..3ae96d2 --- /dev/null +++ b/ServiceBase/src/main/java/com/cafebazaar/servicebase/PackageHelper.kt @@ -0,0 +1,26 @@ +package com.cafebazaar.servicebase + +import android.content.Context +import android.content.pm.PackageInfo +import android.os.Build + +internal fun getBazaarPackageInfo(context: Context): PackageInfo? { + return try { + val packageManager = context.packageManager + packageManager.getPackageInfo(Client.SERVICE_PACKAGE_NAME, 0) + } catch (ignored: Exception) { + null + } +} + +internal fun getBazaarVersionCode(context: Context) = getBazaarPackageInfo(context)?.let { + sdkAwareVersionCode(it) +} ?: 0L + +internal fun sdkAwareVersionCode(packageInfo: PackageInfo): Long { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + packageInfo.longVersionCode + } else { + packageInfo.versionCode.toLong() + } +} \ No newline at end of file diff --git a/ServiceBase/src/main/java/com/cafebazaar/servicebase/communicator/ClientConnectionCommunicator.kt b/ServiceBase/src/main/java/com/cafebazaar/servicebase/communicator/ClientConnectionCommunicator.kt new file mode 100644 index 0000000..9e11754 --- /dev/null +++ b/ServiceBase/src/main/java/com/cafebazaar/servicebase/communicator/ClientConnectionCommunicator.kt @@ -0,0 +1,8 @@ +package com.cafebazaar.servicebase.communicator + +interface ClientConnectionCommunicator { + + fun startConnection(): Boolean + + fun stopConnection() +} \ No newline at end of file diff --git a/ServiceBase/src/main/java/com/cafebazaar/servicebase/communicator/ClientReceiverCommunicator.kt b/ServiceBase/src/main/java/com/cafebazaar/servicebase/communicator/ClientReceiverCommunicator.kt new file mode 100644 index 0000000..1a03fa2 --- /dev/null +++ b/ServiceBase/src/main/java/com/cafebazaar/servicebase/communicator/ClientReceiverCommunicator.kt @@ -0,0 +1,8 @@ +package com.cafebazaar.servicebase.communicator + +import android.content.Intent + +interface ClientReceiverCommunicator { + + fun onNewBroadcastReceived(intent: Intent?) +} \ No newline at end of file diff --git a/ServiceBase/src/main/java/com/cafebazaar/servicebase/receiver/ClientReceiver.kt b/ServiceBase/src/main/java/com/cafebazaar/servicebase/receiver/ClientReceiver.kt new file mode 100644 index 0000000..20c96ad --- /dev/null +++ b/ServiceBase/src/main/java/com/cafebazaar/servicebase/receiver/ClientReceiver.kt @@ -0,0 +1,41 @@ +package com.cafebazaar.servicebase.receiver + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import com.cafebazaar.servicebase.communicator.ClientReceiverCommunicator + +class ClientReceiver: BroadcastReceiver() { + + override fun onReceive(context: Context?, intent: Intent?) { + intent?.let { + notifyObservers(it) + } + } + + private fun notifyObservers(intent: Intent) { + synchronized(observerLock) { + for (observer in observers) { + observer.onNewBroadcastReceived(intent) + } + } + } + + companion object { + + private val observerLock = Any() + private val observers = mutableListOf() + + fun addObserver(communicator: ClientReceiverCommunicator) { + synchronized(observerLock) { + observers.add(communicator) + } + } + + fun removeObserver(communicator: ClientReceiverCommunicator) { + synchronized(observerLock) { + observers.remove(communicator) + } + } + } +} \ No newline at end of file diff --git a/ServiceBase/src/main/java/com/cafebazaar/servicebase/state/ClientError.kt b/ServiceBase/src/main/java/com/cafebazaar/servicebase/state/ClientError.kt new file mode 100644 index 0000000..9613867 --- /dev/null +++ b/ServiceBase/src/main/java/com/cafebazaar/servicebase/state/ClientError.kt @@ -0,0 +1,10 @@ +package com.cafebazaar.servicebase.state + +enum class ClientError(var message: String) { + ERROR_BAZAAR_IS_NOT_INSTALL("Bazaar Client Is Not Installed"), + ERROR_BAZAAR_IS_NOT_COMPATIBLE("Bazaar Client Is Not Compatible"), + ERROR_SDK_COULD_NOT_CONNECT("SDK Could Not Connect"), + ERROR_SDK_IS_STARTED("SDK Is Started"), + ERROR_DURING_GETTING_REFERRER_DETAILS("Error during getting referrer details"), + ERROR_DURING_CONSUMING_REFERRER("Error during consuming referrer") +} diff --git a/ServiceBase/src/main/java/com/cafebazaar/servicebase/state/ClientStateListener.kt b/ServiceBase/src/main/java/com/cafebazaar/servicebase/state/ClientStateListener.kt new file mode 100644 index 0000000..1f621c9 --- /dev/null +++ b/ServiceBase/src/main/java/com/cafebazaar/servicebase/state/ClientStateListener.kt @@ -0,0 +1,8 @@ +package com.cafebazaar.servicebase.state + +interface ClientStateListener { + + fun onReady() + + fun onError(clientError: ClientError) +} \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..fe03077 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,40 @@ +plugins { + id 'com.android.application' + id 'kotlin-android' +} + +android { + compileSdk 31 + + defaultConfig { + applicationId "com.cafebazaar.servicebase" + minSdk 21 + targetSdk 31 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.4.0' + implementation 'com.google.android.material:material:1.4.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.2' +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a5d7a15 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/cafebazaar/servicebase/MainActivity.kt b/app/src/main/java/com/cafebazaar/servicebase/MainActivity.kt new file mode 100644 index 0000000..dfb4194 --- /dev/null +++ b/app/src/main/java/com/cafebazaar/servicebase/MainActivity.kt @@ -0,0 +1,11 @@ +package com.cafebazaar.servicebase + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle + +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..4fc2444 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000..c209e78 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp new file mode 100644 index 0000000..b2dfe3d Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp new file mode 100644 index 0000000..4f0f1d6 Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp new file mode 100644 index 0000000..62b611d Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000..948a307 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..1b9a695 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000..28d4b77 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9287f50 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000..aa7d642 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000..9126ae3 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml new file mode 100644 index 0000000..86423d7 --- /dev/null +++ b/app/src/main/res/values-night/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..f8c6127 --- /dev/null +++ b/app/src/main/res/values/colors.xml @@ -0,0 +1,10 @@ + + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..015ba0f --- /dev/null +++ b/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + ServiceBase + \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..66591c1 --- /dev/null +++ b/app/src/main/res/values/themes.xml @@ -0,0 +1,16 @@ + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..47d31fa --- /dev/null +++ b/build.gradle @@ -0,0 +1,38 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +buildscript { + repositories { + google() + mavenCentral() + maven { url "https://plugins.gradle.org/m2/" } + } + dependencies { + classpath "com.android.tools.build:gradle:7.0.3" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20" + classpath "com.github.dcendents:android-maven-gradle-plugin:1.4.1" + classpath "io.gitlab.arturbosch.detekt:detekt-gradle-plugin:1.1.1" + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} + +subprojects { + apply plugin: "io.gitlab.arturbosch.detekt" + detekt { + toolVersion = '1.1.1' + input = files("${rootDir}") + config = files("${rootDir}/detekt.yml") + filters = ".*/resources/.*,.*/build/.*" + reports { + xml.enabled = false + html { + enabled = true + destination = file("${rootDir}/build/reports/detekt.html") + } + } + } +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..98bed16 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,21 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true +# AndroidX package structure to make it clearer which packages are bundled with the +# Android operating system, and which are packaged with your app"s APK +# https://developer.android.com/topic/libraries/support-library/androidx-rn +android.useAndroidX=true +# Automatically convert third-party libraries to use AndroidX +android.enableJetifier=true +# Kotlin code style for this project: "official" or "obsolete": +kotlin.code.style=official \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e708b1c Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..805b957 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sun Dec 26 10:39:06 IRST 2021 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/jitpack.yml b/jitpack.yml new file mode 100644 index 0000000..8ac1b3a --- /dev/null +++ b/jitpack.yml @@ -0,0 +1,4 @@ +jdk: + - openjdk11 +install: + - ./gradlew build :ServiceBase:publishToMavenLocal \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..0ea85b5 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,11 @@ +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + jcenter() // Warning: this repository is going to shut down soon + } +} +rootProject.name = "ServiceBase" +include ':app' +include ':ServiceBase'