diff --git a/.github/workflows/complete-release.yml b/.github/workflows/complete-release.yml new file mode 100644 index 0000000..760f3a2 --- /dev/null +++ b/.github/workflows/complete-release.yml @@ -0,0 +1,39 @@ +name: Complete Release + +on: + pull_request: + types: + - closed + branches: + - master + +jobs: + tag-and-release: + # Run only after release PR branch is merged + if: github.event.pull_request.merged == true && startsWith(github.head_ref, 'develop') + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Get Tag Name + id: get_tag_name + run: echo "tag_name=v$(cat pubspec.yaml | yq -r '.version')" >> $GITHUB_OUTPUT + + - name: Create Tag + id: create_tag + uses: rickstaa/action-create-tag@v1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + tag: ${{ steps.get_tag_name.outputs.tag_name }} + + - name: Create Release + uses: softprops/action-gh-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ steps.get_tag_name.outputs.tag_name }} + name: ${{ steps.get_tag_name.outputs.tag_name }} + draft: true + prerelease: false + body_path: .scripts/changes.md diff --git a/.github/workflows/update-versions.yml b/.github/workflows/update-versions.yml new file mode 100644 index 0000000..c56628a --- /dev/null +++ b/.github/workflows/update-versions.yml @@ -0,0 +1,50 @@ +name: Update Versions + +on: + workflow_dispatch: + inputs: + distribution-version: + description: 'Distribution Version of the release' + required: true + type: string + ios-version: + description: 'Version of the iOS SDK to incorporate' + required: true + type: string + android-version: + description: 'Version of the Android SDK to incorporate' + required: true + type: string + +jobs: + update-versions: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + ref: develop + + - name: Update distribution version plus any incidental copies + run: .scripts/update_distribution_version.sh "${{ inputs.distribution-version }}" + + - name: Update ApptentiveKit iOS dependency + run: .scripts/update_ios_version.sh ios/apptentive_flutter.podspec "${{ inputs.ios-version }}" + + - name: Update ApptentiveKit Android dependency + run: .scripts/update_android_version.sh android/build.gradle "${{ inputs.android-version }}" + + - name: Update CHANGELOG.md + id: changelog + run: | + .scripts/add_changelog_entry.sh "${{ inputs.distribution-version }}" "${{ inputs.android-version }}" "${{ inputs.ios-version }}" \ + > .scripts/changes.md + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v5 + with: + commit-message: "Update for ${{ inputs.distribution-version }}" + committer: "Alchemer Mobile Team " + branch: "updates/${{ inputs.distribution-version }}" + base: develop + title: "Update for v${{ inputs.distribution-version }}" + body-path: .scripts/changes.md \ No newline at end of file diff --git a/.scripts/add_changelog_entry.sh b/.scripts/add_changelog_entry.sh new file mode 100755 index 0000000..af49053 --- /dev/null +++ b/.scripts/add_changelog_entry.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash + +# Fail on first error. +set -e + +# Check for correct number of arguments. +if [ "$#" -ne 3 ]; then + echo "Usage: $0 " + exit 1 # Exit the script with an error status +fi + +# Create and change to a temporary directory. +mkdir CHANGELOG-update +cd CHANGELOG-update + +# Split the CHANGELOG.md file into multiple parts with a pattern matching +# the start of a new version entry. +# The filenames with be 'xaa', 'xab', 'xac', etc. +cat ../CHANGELOG.md | csplit -s - '/^# 20/' {1} + +# Create the new version entry's heading and add it to a file whose name +# is alphabetically after the CHANGELOG's preamble. +echo "# $(date -Idate) - v$1" > xx00a +echo "" >> xx00a + +# Add the new version entry's body a file whose name is alphabetically +# after the heading. +echo "- Apptentive Android SDK: $2" > xx00b +echo "- Apptentive iOS SDK: $3" >> xx00b +echo "" >> xx00b + +# Copy the new entry to print out later. +NEW_ENTRY=$(cat xx00b) + +# Reassebmble the parts of the changelog into a local copy. +cat $(ls -1 | sort) > foo.md + +# Move the local copy of the changelog to the original location. +mv foo.md ../CHANGELOG.md + +# Clean up the temporary directory. +rm x* +cd .. +rmdir CHANGELOG-update + +echo "$NEW_ENTRY" diff --git a/.scripts/changes.md b/.scripts/changes.md new file mode 100644 index 0000000..95a58c1 --- /dev/null +++ b/.scripts/changes.md @@ -0,0 +1,2 @@ +- Apptentive Android SDK: 6.5.0 +- Apptentive iOS SDK: 6.5.0 diff --git a/.scripts/update_android_version.sh b/.scripts/update_android_version.sh new file mode 100755 index 0000000..eb49bee --- /dev/null +++ b/.scripts/update_android_version.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +# Fail on first error. +set -e + +# Check for correct number of arguments. +if [ $# -ne 2 ]; then + echo "Usage: $0 " + exit 1 +fi + +dependency_name="com.apptentive:apptentive-kit-android" +new_version="$2" +build_gradle_file="$1" + +# Check if the build.gradle file exists +if [ ! -f "$build_gradle_file" ]; then + echo "Error: $build_gradle_file does not exist." + exit 1 +fi + +# Use sed to update the version in the podspec file +sed -i "s/implementation '$dependency_name:[^']*'/implementation '$dependency_name:$new_version'/" "$build_gradle_file" + +echo "Updated $dependency_name to version $new_version in $build_gradle_file." diff --git a/.scripts/update_distribution_version.sh b/.scripts/update_distribution_version.sh new file mode 100755 index 0000000..1aec3dd --- /dev/null +++ b/.scripts/update_distribution_version.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +# This script should update any incidental copies of the +# "single source of truth" version, e.g. in package.json. +# It will be different for each project. + +# Fail on first error. +set -e + +# Check for correct number of arguments. +if [ $# -ne 1 ]; then + echo "Usage: $0 " + exit 1 +fi + +new_version="$1" +pubspec_file="pubspec.yaml" + +# Check if the podspec file exists +if [ ! -f "$pubspec_file" ]; then + echo "Error: $pubspec_file does not exist." + exit 1 +fi + +version_script=".version=\"$new_version\"" +yq e -i $version_script "$pubspec_file" + +echo "Updated version to $new_version in $pubspec_file." + +podspec_file="ios/apptentive_flutter.podspec" + +# Check if the podspec file exists +if [ ! -f "$podspec_file" ]; then + echo "Error: $podspec_file does not exist." + exit 1 +fi + +# Use sed to update the version in the podspec file +sed -i "s/s.version\( *\)= *\"[^\"]*\"/s.version\1= \"$new_version\"/" "$podspec_file" + +echo "Updated version to $new_version in $podspec_file." + +dart_file="lib/apptentive_flutter.dart" + +# Check if the javascript file exists +if [ ! -f "$dart_file" ]; then + echo "Error: $dart_file does not exist." + exit 1 +fi + +# Use sed to update the version in the javascript file +sed -i "s/this.distributionVersion = \"[^\"]*\"/this.distributionVersion = \"$new_version\"/" "$dart_file" + +echo "Updated version to $new_version in $dart_file." diff --git a/.scripts/update_ios_version.sh b/.scripts/update_ios_version.sh new file mode 100755 index 0000000..5269ddf --- /dev/null +++ b/.scripts/update_ios_version.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +# Fail on first error. +set -e + +# Check for correct number of arguments. +if [ $# -ne 2 ]; then + echo "Usage: $0 " + exit 1 +fi + +dependency_name="ApptentiveKit" +new_version="$2" +podspec_file="$1" + +# Check if the podspec file exists +if [ ! -f "$podspec_file" ]; then + echo "Error: $podspec_file does not exist." + exit 1 +fi + +# Use sed to update the version in the podspec file +sed -i "s/s.dependency '$dependency_name', '[^']*'/s.dependency '$dependency_name', '$new_version'/" "$podspec_file" + +echo "Updated $dependency_name to version $new_version in $podspec_file." diff --git a/android/build.gradle b/android/build.gradle index ffd8461..e3e5b59 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -37,6 +37,6 @@ android { } dependencies { - implementation 'com.apptentive:apptentive-kit-android:6.1.0' + implementation 'com.apptentive:apptentive-kit-android:6.5.0' testImplementation 'junit:junit:4.13.2' } diff --git a/android/src/main/kotlin/com/apptentive/apptentive_flutter/ApptentiveFlutterPlugin.kt b/android/src/main/kotlin/com/apptentive/apptentive_flutter/ApptentiveFlutterPlugin.kt index ebb22df..46caac2 100644 --- a/android/src/main/kotlin/com/apptentive/apptentive_flutter/ApptentiveFlutterPlugin.kt +++ b/android/src/main/kotlin/com/apptentive/apptentive_flutter/ApptentiveFlutterPlugin.kt @@ -108,6 +108,7 @@ class ApptentiveFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware "registerListeners" -> registerListeners(result) "unregisterListeners" -> unregisterListeners(result) "sendAttachmentText" -> sendAttachmentText(call, result) + "isSDKRegistered" -> isSDKRegistered(result) "handleRequestPushPermissions" -> { /* Only iOS. */ } else -> result.notImplemented() } @@ -119,13 +120,17 @@ class ApptentiveFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware private fun register(call: MethodCall, result: Result) { val configuration = unpackConfiguration(call.argument("configuration")!!) try { - Apptentive.register(application, configuration) { registerResult -> - if (registerResult is RegisterResult.Success) { - isApptentiveRegistered = true - Log.d(LogTag("Flutter"), "register ApptentiveActivityInfoCallback") - Apptentive.registerApptentiveActivityInfoCallback(activityInfo) + if (Apptentive.isRegistered()) { + result.error(ERROR_CODE, "Apptentive instance is already registered.", null) + } else { + Apptentive.register(application, configuration) { registerResult -> + if (registerResult is RegisterResult.Success) { + isApptentiveRegistered = true + Log.d(LogTag("Flutter"), "register ApptentiveActivityInfoCallback") + Apptentive.registerApptentiveActivityInfoCallback(activityInfo) + } + result.success(registerResult is RegisterResult.Success) } - result.success(registerResult is RegisterResult.Success) } } catch (e: Exception) { result.error(ERROR_CODE, "Failed to register Apptentive instance.", e.toString()) @@ -310,6 +315,14 @@ class ApptentiveFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware } } + private fun isSDKRegistered(result: Result) { + try { + result.success(Apptentive.isRegistered()) + } catch (e: Exception) { + result.error(ERROR_CODE, "Failed to check if Apptentive SDK is registered.", e.toString()) + } + } + private fun getUnreadMessageCount(result: Result) { try { val unreadMessages: Int = Apptentive.getUnreadMessageCount() diff --git a/ios/apptentive_flutter.podspec b/ios/apptentive_flutter.podspec index fe0f411..5c332a8 100644 --- a/ios/apptentive_flutter.podspec +++ b/ios/apptentive_flutter.podspec @@ -12,8 +12,8 @@ Apptentive SDK for Flutter s.source_files = 'Classes/**/*' s.public_header_files = 'Classes/**/*.h' s.dependency 'Flutter' - s.dependency 'ApptentiveKit', '~> 6.2.2' - s.platform = :ios, '11.0' + s.dependency 'ApptentiveKit', '~> 6.5.0' + s.platform = :ios, '13.0' # Flutter.framework does not contain a i386 slice. s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } diff --git a/lib/apptentive_flutter.dart b/lib/apptentive_flutter.dart index e27e9b8..7b0f8e3 100644 --- a/lib/apptentive_flutter.dart +++ b/lib/apptentive_flutter.dart @@ -191,6 +191,11 @@ class ApptentiveFlutter { return successful; } + static Future isSDKRegistered() async { + final bool registered = await _channel.invokeMethod('isSDKRegistered', {}); + return registered; + } + // Pack the Apptentive Configuration into a map object static Map _packConfiguration(ApptentiveConfiguration configuration) { return {