diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b22d00f7..02f0c78c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -12,14 +12,11 @@ on: jobs: gh-pages: - runs-on: macos-12 + runs-on: macos-13 needs: ["app"] steps: - # The default Java on macos-12 is 8, we need 17 - # https://github.com/actions/runner-images/blob/main/images/macos/macos-12-Readme.md#java - - name: Set java version - run: | - echo "JAVA_HOME=$JAVA_HOME_17_X64" >> $GITHUB_ENV + # The default Java on macos-13 is 17. So we no longer need to set it. + # https://github.com/actions/runner-images/blob/main/images/macos/macos-13-Readme.md#java - uses: actions/checkout@v3 - run: make docs - name: Deploy docs to gh-pages @@ -29,31 +26,22 @@ jobs: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./build/dokka/htmlMultiModule test: - runs-on: macos-12 + runs-on: macos-13 steps: - # The default Java on macos-12 is 8, we need 17 - # https://github.com/actions/runner-images/blob/main/images/macos/macos-12-Readme.md#java - - name: Set java version - run: | - echo "JAVA_HOME=$JAVA_HOME_17_X64" >> $GITHUB_ENV + # The default Java on macos-13 is 17. So we no longer need to set it. + # https://github.com/actions/runner-images/blob/main/images/macos/macos-13-Readme.md#java - uses: actions/checkout@v3 - name: Build sdk run: ./gradlew sdk:assembleRelease - name: Build sdk-okhttp run: ./gradlew sdk-okhttp:assembleRelease app: - runs-on: macos-12 + runs-on: macos-13 needs: ["test"] if: github.ref == 'refs/heads/main' - env: - # The version depends on the Android Gradle Plugin version in /build.gradle.kts - BUILD_TOOLS_VERSION: "33.0.1" steps: - # The default Java on macos-12 is 8, we need 17 - # https://github.com/actions/runner-images/blob/main/images/macos/macos-12-Readme.md#java - - name: Set java version - run: | - echo "JAVA_HOME=$JAVA_HOME_17_X64" >> $GITHUB_ENV + # The default Java on macos-13 is 17. So we no longer need to set it. + # https://github.com/actions/runner-images/blob/main/images/macos/macos-13-Readme.md#java - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: @@ -73,14 +61,14 @@ jobs: echo -n "$ANDROID_KEYSTORE_BASE64" | base64 --decode -o $KEYSTORE_PATH - name: Run zipalign run: | - "$ANDROID_HOME/build-tools/$BUILD_TOOLS_VERSION/zipalign" -c -v 4 ./javasample/build/outputs/apk/release/javasample-release-unsigned.apk + "$ANDROID_HOME/build-tools/34.0.0/zipalign" -c -v 4 ./javasample/build/outputs/apk/release/javasample-release-unsigned.apk - name: Run apksigner env: ANDROID_KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} ANDROID_KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} run: | - "$ANDROID_HOME/build-tools/$BUILD_TOOLS_VERSION/apksigner" sign \ + "$ANDROID_HOME/build-tools/34.0.0/apksigner" sign \ --ks $RUNNER_TEMP/keystore.jks \ --ks-key-alias "$ANDROID_KEY_ALIAS" \ --ks-pass "pass:$ANDROID_KEYSTORE_PASSWORD" \ diff --git a/build.gradle.kts b/build.gradle.kts index 6264299d..1bf17efe 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,11 +4,12 @@ plugins { // https://developer.android.com/build/releases/gradle-plugin#8-1-0 // If you ever update Android Gradle Plugin, please also update // BUILD_TOOLS_VERSION in ./.github/workflows/ci.yaml - id("com.android.library") version "8.1.2" apply false - id("com.android.application") version "8.1.2" apply false - id("org.jetbrains.kotlin.android") version "1.9.0" apply false + id("com.android.library") version "8.5.0" apply false + id("com.android.application") version "8.5.0" apply false + id("org.jetbrains.kotlin.android") version "1.9.23" apply false kotlin("plugin.serialization") version "1.9.20" apply false id("org.jetbrains.dokka") version "1.9.10" + id("maven-publish") } subprojects { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0840c594..f2cb513e 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Thu Sep 17 15:50:04 CST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/javasample/build.gradle.kts b/javasample/build.gradle.kts index e1b9f1ff..d5cd84e1 100644 --- a/javasample/build.gradle.kts +++ b/javasample/build.gradle.kts @@ -1,7 +1,7 @@ import java.util.Properties plugins { - id("com.android.application") version "8.1.2" + id("com.android.application") } val localProperties = Properties() @@ -14,17 +14,19 @@ if (localPropertiesFile.exists()) { android { namespace = "com.oursky.authgeartest" - compileSdk = 33 + compileSdk = 34 + buildToolsVersion = "34.0.0" buildFeatures { buildConfig = true } defaultConfig { + multiDexEnabled = true applicationId = "com.authgear.exampleapp.android" // minSdk is set to 23 so that we do not need version check to use biometric and app2app. minSdk = 23 - targetSdk = 33 + targetSdk = 34 versionCode = 1 versionName = "1.0" @@ -45,12 +47,14 @@ android { } compileOptions { + isCoreLibraryDesugaringEnabled = true sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } } dependencies { + coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.3") implementation(project(mapOf("path" to ":sdk"))) implementation("androidx.appcompat:appcompat:1.2.0") implementation("androidx.lifecycle:lifecycle-viewmodel:2.2.0") diff --git a/jitpack.yml b/jitpack.yml new file mode 100644 index 00000000..8ca5bdf0 --- /dev/null +++ b/jitpack.yml @@ -0,0 +1,2 @@ +jdk: +- openjdk17 diff --git a/sdk-okhttp/build.gradle.kts b/sdk-okhttp/build.gradle.kts index 4274c0d3..76efb84b 100644 --- a/sdk-okhttp/build.gradle.kts +++ b/sdk-okhttp/build.gradle.kts @@ -2,14 +2,18 @@ plugins { id("com.android.library") id("org.jetbrains.kotlin.android") kotlin("plugin.serialization") + id("maven-publish") } android { namespace = "com.oursky.authgear.okhttp" - compileSdk = 32 + compileSdk = 34 defaultConfig { - minSdk = 21 + multiDexEnabled = true + aarMetadata { + minCompileSdk = 21 + } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -50,3 +54,17 @@ dependencies { androidTestImplementation("androidx.test.ext:junit:1.1.2") androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0") } + +publishing { + publications { + register("release") { + groupId = findProperty("group") as String + artifactId = "authgear-sdk-android-okhttp" + version = findProperty("version") as String + + afterEvaluate { + from(components["release"]) + } + } + } +} diff --git a/sdk/build.gradle.kts b/sdk/build.gradle.kts index c157658b..b040102e 100644 --- a/sdk/build.gradle.kts +++ b/sdk/build.gradle.kts @@ -2,14 +2,18 @@ plugins { id("com.android.library") id("org.jetbrains.kotlin.android") kotlin("plugin.serialization") + id("maven-publish") } android { namespace = "com.oursky.authgear" - compileSdk = 32 + compileSdk = 34 defaultConfig { - minSdk = 21 + multiDexEnabled = true + aarMetadata { + minCompileSdk = 21 + } testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -57,3 +61,17 @@ dependencies { androidTestImplementation("androidx.test.ext:junit:1.1.2") androidTestImplementation("androidx.test.espresso:espresso-core:3.3.0") } + +publishing { + publications { + register("release") { + groupId = findProperty("group") as String + artifactId = "authgear-sdk-android" + version = findProperty("version") as String + + afterEvaluate { + from(components["release"]) + } + } + } +} diff --git a/sdk/src/main/java/com/oursky/authgear/AuthgearCore.kt b/sdk/src/main/java/com/oursky/authgear/AuthgearCore.kt index ab7058ad..d5d4f35b 100644 --- a/sdk/src/main/java/com/oursky/authgear/AuthgearCore.kt +++ b/sdk/src/main/java/com/oursky/authgear/AuthgearCore.kt @@ -483,7 +483,11 @@ internal class AuthgearCore( } } } - application.registerReceiver(br, intentFilter) + if (Build.VERSION.SDK_INT >= 33) { + application.registerReceiver(br, intentFilter, Context.RECEIVER_NOT_EXPORTED) + } else { + application.registerReceiver(br, intentFilter) + } application.startActivity( WebViewActivity.createIntent(application, action, authorizeUrl) ) diff --git a/sdk/src/main/java/com/oursky/authgear/CustomTabsUIImplementation.kt b/sdk/src/main/java/com/oursky/authgear/CustomTabsUIImplementation.kt index 14ce10f2..307f2c64 100644 --- a/sdk/src/main/java/com/oursky/authgear/CustomTabsUIImplementation.kt +++ b/sdk/src/main/java/com/oursky/authgear/CustomTabsUIImplementation.kt @@ -5,6 +5,7 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.net.Uri +import android.os.Build import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException import kotlin.coroutines.suspendCoroutine @@ -54,7 +55,11 @@ class CustomTabsUIImplementation : UIImplementation { } } } - context.registerReceiver(br, intentFilter) + if (Build.VERSION.SDK_INT >= 33) { + context.registerReceiver(br, intentFilter, Context.RECEIVER_NOT_EXPORTED) + } else { + context.registerReceiver(br, intentFilter) + } context.startActivity( OAuthActivity.createAuthorizationIntent( context, diff --git a/sdk/src/main/java/com/oursky/authgear/OAuthActivity.kt b/sdk/src/main/java/com/oursky/authgear/OAuthActivity.kt index 976f3b7c..0d724f9a 100644 --- a/sdk/src/main/java/com/oursky/authgear/OAuthActivity.kt +++ b/sdk/src/main/java/com/oursky/authgear/OAuthActivity.kt @@ -48,6 +48,7 @@ internal class OAuthActivity : AppCompatActivity() { intent.getStringExtra(KEY_BROADCAST_ACTION)?.let { broadcastAction -> val broadcastIntent = Intent(broadcastAction) + broadcastIntent.setPackage(this.applicationContext.packageName) broadcastIntent.putExtra(AuthgearCore.KEY_OAUTH_BOARDCAST_TYPE, OAuthBroadcastType.REDIRECT_URL.name) this.intent.data?.toString()?.let { broadcastIntent.putExtra(AuthgearCore.KEY_REDIRECT_URL, it) diff --git a/sdk/src/main/java/com/oursky/authgear/OAuthWebViewBaseActivity.kt b/sdk/src/main/java/com/oursky/authgear/OAuthWebViewBaseActivity.kt index 17a0107b..36c7e5e1 100644 --- a/sdk/src/main/java/com/oursky/authgear/OAuthWebViewBaseActivity.kt +++ b/sdk/src/main/java/com/oursky/authgear/OAuthWebViewBaseActivity.kt @@ -154,6 +154,7 @@ internal open class OAuthWebViewBaseActivity : AppCompatActivity() { private fun sendRedirectURLBroadcast() { intent.getStringExtra(KEY_BROADCAST_ACTION)?.let { broadcastAction -> val broadcastIntent = Intent(broadcastAction) + broadcastIntent.setPackage(this.applicationContext.packageName) broadcastIntent.putExtra(AuthgearCore.KEY_OAUTH_BOARDCAST_TYPE, OAuthBroadcastType.REDIRECT_URL.name) mResult?.data?.toString()?.let { broadcastIntent.putExtra(AuthgearCore.KEY_REDIRECT_URL, it) diff --git a/sdk/src/main/java/com/oursky/authgear/WebKitWebViewActivity.kt b/sdk/src/main/java/com/oursky/authgear/WebKitWebViewActivity.kt index a6622d8b..32e9f3d4 100644 --- a/sdk/src/main/java/com/oursky/authgear/WebKitWebViewActivity.kt +++ b/sdk/src/main/java/com/oursky/authgear/WebKitWebViewActivity.kt @@ -309,6 +309,7 @@ class WebKitWebViewActivity: AppCompatActivity() { this.intent.getStringExtra(KEY_BROADCAST_ACTION)?.let { broadcastAction -> val broadcastIntent = Intent(broadcastAction) + broadcastIntent.setPackage(this.applicationContext.packageName) broadcastIntent.putExtra(AuthgearCore.KEY_OAUTH_BOARDCAST_TYPE, OAuthBroadcastType.REDIRECT_URL.name) if (this.result != null) { broadcastIntent.putExtra(AuthgearCore.KEY_REDIRECT_URL, this.result.toString()) diff --git a/sdk/src/main/java/com/oursky/authgear/WebKitWebViewUIImplementation.kt b/sdk/src/main/java/com/oursky/authgear/WebKitWebViewUIImplementation.kt index d3813c4a..ab09e964 100644 --- a/sdk/src/main/java/com/oursky/authgear/WebKitWebViewUIImplementation.kt +++ b/sdk/src/main/java/com/oursky/authgear/WebKitWebViewUIImplementation.kt @@ -5,6 +5,7 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.net.Uri +import android.os.Build import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException import kotlin.coroutines.suspendCoroutine @@ -55,7 +56,11 @@ class WebKitWebViewUIImplementation(val actionBarBackgroundColor: Int? = null, v } } } - context.registerReceiver(br, intentFilter) + if (Build.VERSION.SDK_INT >= 33) { + context.registerReceiver(br, intentFilter, Context.RECEIVER_NOT_EXPORTED) + } else { + context.registerReceiver(br, intentFilter) + } val webViewOptions = WebKitWebViewActivity.Options(options.url, options.redirectURI) webViewOptions.actionBarBackgroundColor = this@WebKitWebViewUIImplementation.actionBarBackgroundColor webViewOptions.actionBarButtonTintColor = this@WebKitWebViewUIImplementation.actionBarButtonTintColor diff --git a/sdk/src/main/java/com/oursky/authgear/WebViewActivity.kt b/sdk/src/main/java/com/oursky/authgear/WebViewActivity.kt index 081318d1..58319106 100644 --- a/sdk/src/main/java/com/oursky/authgear/WebViewActivity.kt +++ b/sdk/src/main/java/com/oursky/authgear/WebViewActivity.kt @@ -115,6 +115,7 @@ internal class WebViewActivity : AppCompatActivity() { private fun sendEndBroadcast() { this.intent.getStringExtra(KEY_BROADCAST_ACTION)?.let { broadcastAction -> val broadcastIntent = Intent(broadcastAction) + broadcastIntent.setPackage(this.applicationContext.packageName) broadcastIntent.putExtra(KEY_BROADCAST_TYPE, BroadcastType.END.name) this.sendBroadcast(broadcastIntent) } diff --git a/sdk/src/main/java/com/oursky/authgear/app2app/App2App.kt b/sdk/src/main/java/com/oursky/authgear/app2app/App2App.kt index 5122d422..68ef8d33 100644 --- a/sdk/src/main/java/com/oursky/authgear/app2app/App2App.kt +++ b/sdk/src/main/java/com/oursky/authgear/app2app/App2App.kt @@ -117,7 +117,11 @@ internal class App2App( k.resume(Uri.parse(resultUri)) } } - application.registerReceiver(br, intentFilter) + if (Build.VERSION.SDK_INT >= 33) { + application.registerReceiver(br, intentFilter, Context.RECEIVER_NOT_EXPORTED) + } else { + application.registerReceiver(br, intentFilter) + } application.startActivity(intent) } }