From bab397c66fc98ef037448008b077e62746c2a899 Mon Sep 17 00:00:00 2001 From: Haridarshan Choudhary Date: Tue, 13 Jan 2026 18:16:16 +0530 Subject: [PATCH 01/11] demo --- .github/workflows/deploy-to-nativebridge.yml | 50 ++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 .github/workflows/deploy-to-nativebridge.yml diff --git a/.github/workflows/deploy-to-nativebridge.yml b/.github/workflows/deploy-to-nativebridge.yml new file mode 100644 index 0000000..cf9e7ca --- /dev/null +++ b/.github/workflows/deploy-to-nativebridge.yml @@ -0,0 +1,50 @@ +name: Deploy to NativeBridge + +on: + push: + branches: [main, develop] + pull_request: + branches: [main] + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + + - name: Build App + run: | + chmod +x gradlew + ./gradlew assembleDebug + + - name: Upload to NativeBridge + id: upload + run: | + response=$(curl -X POST https://api.nativebridge.dev/v1/apps/upload \ + -H "Authorization: Bearer ${{ secrets.NATIVEBRIDGE_API_KEY }}" \ + -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ + -F "platform=android" \ + -F "buildMessage=${{ github.event.head_commit.message }}") + + echo "response=$response" >> $GITHUB_OUTPUT + magic_link=$(echo $response | jq -r '.magicLink') + echo "magic_link=$magic_link" >> $GITHUB_OUTPUT + + - name: Comment PR with Magic Link + if: github.event_name == 'pull_request' + uses: actions/github-script@v6 + with: + script: | + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: `🚀 **App Preview Ready!**\n\nTest this build: ${{ steps.upload.outputs.magic_link }}\n\n_Powered by NativeBridge_` + }) From 6627aeb3befea6a6b0c27df45a805594aa2cff70 Mon Sep 17 00:00:00 2001 From: Haridarshan Choudhary Date: Tue, 13 Jan 2026 18:36:58 +0530 Subject: [PATCH 02/11] demo --- .github/workflows/deploy-to-nativebridge.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy-to-nativebridge.yml b/.github/workflows/deploy-to-nativebridge.yml index cf9e7ca..776cb8d 100644 --- a/.github/workflows/deploy-to-nativebridge.yml +++ b/.github/workflows/deploy-to-nativebridge.yml @@ -19,10 +19,18 @@ jobs: java-version: '11' distribution: 'adopt' + - name: Setup Android SDK + uses: android-actions/setup-android@v2 + + - name: Clean SDK cache to fix corrupted metadata + run: | + rm -rf $HOME/.android/cache/* + rm -rf $ANDROID_SDK_ROOT/.temp/* + - name: Build App run: | chmod +x gradlew - ./gradlew assembleDebug + ./gradlew clean assembleDebug --stacktrace - name: Upload to NativeBridge id: upload From f082ca7eb0cb11db9eae6e07e6a19502acd282db Mon Sep 17 00:00:00 2001 From: Haridarshan Choudhary Date: Tue, 13 Jan 2026 18:38:16 +0530 Subject: [PATCH 03/11] demo --- .github/workflows/deploy-to-nativebridge.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy-to-nativebridge.yml b/.github/workflows/deploy-to-nativebridge.yml index 776cb8d..47be7d9 100644 --- a/.github/workflows/deploy-to-nativebridge.yml +++ b/.github/workflows/deploy-to-nativebridge.yml @@ -13,14 +13,14 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v2 + - name: Set up JDK 17 + uses: actions/setup-java@v3 with: - java-version: '11' - distribution: 'adopt' + java-version: '17' + distribution: 'temurin' - name: Setup Android SDK - uses: android-actions/setup-android@v2 + uses: android-actions/setup-android@v3 - name: Clean SDK cache to fix corrupted metadata run: | From e6b66db417bc6e45143d732d945a19d5abe9671e Mon Sep 17 00:00:00 2001 From: Haridarshan Choudhary Date: Tue, 13 Jan 2026 18:40:46 +0530 Subject: [PATCH 04/11] demo --- .github/workflows/deploy-to-nativebridge.yml | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/.github/workflows/deploy-to-nativebridge.yml b/.github/workflows/deploy-to-nativebridge.yml index 47be7d9..c3889cf 100644 --- a/.github/workflows/deploy-to-nativebridge.yml +++ b/.github/workflows/deploy-to-nativebridge.yml @@ -13,19 +13,16 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 17 - uses: actions/setup-java@v3 + - name: Set up JDK 11 + uses: actions/setup-java@v2 with: - java-version: '17' - distribution: 'temurin' + java-version: '11' + distribution: 'adopt' - - name: Setup Android SDK - uses: android-actions/setup-android@v3 - - - name: Clean SDK cache to fix corrupted metadata + - name: Accept Android SDK licenses run: | - rm -rf $HOME/.android/cache/* - rm -rf $ANDROID_SDK_ROOT/.temp/* + yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses || true + yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "platforms;android-28" "build-tools;28.0.3" || true - name: Build App run: | From d5264c4765fb0581337c3de1b432782b1b5f1a42 Mon Sep 17 00:00:00 2001 From: Haridarshan Choudhary Date: Tue, 13 Jan 2026 18:42:53 +0530 Subject: [PATCH 05/11] demo --- .github/workflows/deploy-to-nativebridge.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy-to-nativebridge.yml b/.github/workflows/deploy-to-nativebridge.yml index c3889cf..7439acd 100644 --- a/.github/workflows/deploy-to-nativebridge.yml +++ b/.github/workflows/deploy-to-nativebridge.yml @@ -19,15 +19,12 @@ jobs: java-version: '11' distribution: 'adopt' - - name: Accept Android SDK licenses - run: | - yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses || true - yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "platforms;android-28" "build-tools;28.0.3" || true - - name: Build App run: | chmod +x gradlew ./gradlew clean assembleDebug --stacktrace + env: + ANDROID_SDK_ROOT: /usr/local/lib/android/sdk - name: Upload to NativeBridge id: upload From 1dd641c4834d69480ff5a25d0bfa87c572e359ab Mon Sep 17 00:00:00 2001 From: Haridarshan Choudhary Date: Tue, 13 Jan 2026 19:09:37 +0530 Subject: [PATCH 06/11] demo --- .github/workflows/deploy-to-nativebridge.yml | 53 ++++++++++++++----- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 2 + .../ExerciseActivityMapper.java | 2 +- ... SmartImageDownloadActivity.java.disabled} | 0 build.gradle | 1 + install_sdk28.sh | 25 +++++++++ 7 files changed, 73 insertions(+), 14 deletions(-) rename app/src/main/java/codepath/apps/demointroandroid/{SmartImageDownloadActivity.java => SmartImageDownloadActivity.java.disabled} (100%) create mode 100755 install_sdk28.sh diff --git a/.github/workflows/deploy-to-nativebridge.yml b/.github/workflows/deploy-to-nativebridge.yml index 7439acd..400ae36 100644 --- a/.github/workflows/deploy-to-nativebridge.yml +++ b/.github/workflows/deploy-to-nativebridge.yml @@ -7,24 +7,39 @@ on: branches: [main] jobs: - deploy: + build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - - name: Set up JDK 11 - uses: actions/setup-java@v2 + - name: Set up JDK 11 for Gradle build + uses: actions/setup-java@v3 with: java-version: '11' - distribution: 'adopt' + distribution: 'temurin' + cache: 'gradle' - - name: Build App + - name: Validate Gradle wrapper + run: chmod +x gradlew + + - name: Clean SDK cache and build APK + run: | + # Clean corrupted SDK metadata + rm -rf $ANDROID_SDK_ROOT/.temp/* || true + find $ANDROID_SDK_ROOT -name "package.xml" -type f -delete || true + + # Build the app + ./gradlew clean app:assembleDebug --stacktrace + + - name: Verify APK was generated run: | - chmod +x gradlew - ./gradlew clean assembleDebug --stacktrace - env: - ANDROID_SDK_ROOT: /usr/local/lib/android/sdk + if [ ! -f app/build/outputs/apk/debug/app-debug.apk ]; then + echo "❌ APK not found!" + exit 1 + fi + echo "✅ APK generated successfully" + ls -lh app/build/outputs/apk/debug/app-debug.apk - name: Upload to NativeBridge id: upload @@ -36,11 +51,17 @@ jobs: -F "buildMessage=${{ github.event.head_commit.message }}") echo "response=$response" >> $GITHUB_OUTPUT - magic_link=$(echo $response | jq -r '.magicLink') + magic_link=$(echo $response | jq -r '.magicLink // empty') + if [ -z "$magic_link" ]; then + echo "❌ Failed to get magic link from response" + echo "Response: $response" + exit 1 + fi echo "magic_link=$magic_link" >> $GITHUB_OUTPUT + echo "✅ Upload successful: $magic_link" - name: Comment PR with Magic Link - if: github.event_name == 'pull_request' + if: github.event_name == 'pull_request' && steps.upload.outcome == 'success' uses: actions/github-script@v6 with: script: | @@ -50,3 +71,11 @@ jobs: repo: context.repo.repo, body: `🚀 **App Preview Ready!**\n\nTest this build: ${{ steps.upload.outputs.magic_link }}\n\n_Powered by NativeBridge_` }) + + - name: Upload APK as artifact + if: always() + uses: actions/upload-artifact@v3 + with: + name: app-debug + path: app/build/outputs/apk/debug/app-debug.apk + retention-days: 30 diff --git a/app/build.gradle b/app/build.gradle index 532e0af..2a2eefd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,5 +19,7 @@ android { dependencies { implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'com.codepath.libraries:asynchttpclient:0.1.0' + implementation 'com.facebook.stetho:stetho:1.5.1' + implementation 'com.squareup.okhttp3:okhttp:3.12.13' // Needed by ProgressBarActivity + // Note: asynchttpclient library no longer available - SmartImageDownloadActivity excluded from manifest } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 569c37a..ef3efaf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -90,10 +90,12 @@ android:name="codepath.apps.demointroandroid.AsyncTaskPerformActivity" android:label="@string/title_activity_async_task_perform" > + diff --git a/app/src/main/java/codepath/apps/demointroandroid/ExerciseActivityMapper.java b/app/src/main/java/codepath/apps/demointroandroid/ExerciseActivityMapper.java index 577ae00..0cb6e8e 100644 --- a/app/src/main/java/codepath/apps/demointroandroid/ExerciseActivityMapper.java +++ b/app/src/main/java/codepath/apps/demointroandroid/ExerciseActivityMapper.java @@ -46,7 +46,7 @@ private void defineExerciseMappings() { // Chapter 6: Networking exerciseClassMap.put("chap6ex1", BasicImageDownloadActivity.class); // Basic Image Download exerciseClassMap.put("chap6ex2", AsyncTaskPerformActivity.class); // AsyncTask - exerciseClassMap.put("chap6ex3", SmartImageDownloadActivity.class); // Smart Image Download + // exerciseClassMap.put("chap6ex3", SmartImageDownloadActivity.class); // Smart Image Download - requires unavailable library // Chapter 7: Advanced Views exerciseClassMap.put("chap7ex1", ToastFormInputsActivity.class); // Toast Inputs exerciseClassMap.put("chap7ex2", SpinnerWithToastActivity.class); // Spinner Toast diff --git a/app/src/main/java/codepath/apps/demointroandroid/SmartImageDownloadActivity.java b/app/src/main/java/codepath/apps/demointroandroid/SmartImageDownloadActivity.java.disabled similarity index 100% rename from app/src/main/java/codepath/apps/demointroandroid/SmartImageDownloadActivity.java rename to app/src/main/java/codepath/apps/demointroandroid/SmartImageDownloadActivity.java.disabled diff --git a/build.gradle b/build.gradle index 88031d6..bca43f6 100644 --- a/build.gradle +++ b/build.gradle @@ -13,5 +13,6 @@ allprojects { repositories { jcenter() google() + maven { url 'https://jitpack.io' } } } diff --git a/install_sdk28.sh b/install_sdk28.sh new file mode 100755 index 0000000..d01b722 --- /dev/null +++ b/install_sdk28.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Install SDK 28 manually +ANDROID_HOME=~/Library/Android/sdk +SDK_DIR=$ANDROID_HOME/platforms/android-28 +BUILD_TOOLS_DIR=$ANDROID_HOME/build-tools/28.0.3 + +echo "Installing Android SDK 28..." + +# Download and install platform +mkdir -p $SDK_DIR +cd /tmp +curl -o platform-28.zip https://dl.google.com/android/repository/platform-28_r06.zip +unzip -q platform-28.zip -d $ANDROID_HOME/platforms/android-28 +rm platform-28.zip + +# Download and install build-tools +mkdir -p $BUILD_TOOLS_DIR +curl -o build-tools-28.zip https://dl.google.com/android/repository/build-tools_r28.0.3-macosx.zip +unzip -q build-tools-28.zip -d /tmp/bt28 +mv /tmp/bt28/android-*/* $BUILD_TOOLS_DIR/ +rm -rf /tmp/bt28 build-tools-28.zip + +echo "✅ SDK 28 installed!" +echo "Now run: ./gradlew app:assembleRelease" From 51266eec07428a126c9c79c106c9c3b0ab66fe38 Mon Sep 17 00:00:00 2001 From: Haridarshan Choudhary Date: Tue, 13 Jan 2026 19:10:42 +0530 Subject: [PATCH 07/11] demo --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ba536bd..ca2a347 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ intro_android_demo Demo of app exercises for Intro to Android App Development +ninja hattori +   From 6a25fa8a15db5ecd5054ee8128237143b67b866e Mon Sep 17 00:00:00 2001 From: Haridarshan Choudhary Date: Tue, 13 Jan 2026 19:12:26 +0530 Subject: [PATCH 08/11] demo --- .github/workflows/deploy-to-nativebridge.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-to-nativebridge.yml b/.github/workflows/deploy-to-nativebridge.yml index 400ae36..afcecb1 100644 --- a/.github/workflows/deploy-to-nativebridge.yml +++ b/.github/workflows/deploy-to-nativebridge.yml @@ -74,7 +74,7 @@ jobs: - name: Upload APK as artifact if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: app-debug path: app/build/outputs/apk/debug/app-debug.apk From a78937aad9c4966365a169a3af4c7c8b504bf3dd Mon Sep 17 00:00:00 2001 From: Haridarshan Choudhary Date: Tue, 13 Jan 2026 19:22:38 +0530 Subject: [PATCH 09/11] demo --- .github/workflows/deploy-to-nativebridge.yml | 46 +++++++++++++++----- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/.github/workflows/deploy-to-nativebridge.yml b/.github/workflows/deploy-to-nativebridge.yml index 400ae36..128ecfe 100644 --- a/.github/workflows/deploy-to-nativebridge.yml +++ b/.github/workflows/deploy-to-nativebridge.yml @@ -43,22 +43,44 @@ jobs: - name: Upload to NativeBridge id: upload + env: + NB_API_KEY: ${{ secrets.NATIVEBRIDGE_API_KEY }} + NB_ALLOWED_USERS: ${{ secrets.NATIVEBRIDGE_ALLOWED_USERS }} + NB_ACCESS_TYPE: ${{ secrets.NATIVEBRIDGE_ACCESS_TYPE }} run: | - response=$(curl -X POST https://api.nativebridge.dev/v1/apps/upload \ - -H "Authorization: Bearer ${{ secrets.NATIVEBRIDGE_API_KEY }}" \ - -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ - -F "platform=android" \ - -F "buildMessage=${{ github.event.head_commit.message }}") + if [ -z "$NB_API_KEY" ]; then + echo "❌ Missing NATIVEBRIDGE_API_KEY secret" + exit 1 + fi + + access_type=${NB_ACCESS_TYPE:-public} + + curl_cmd=( + curl --location https://api.nativebridge.io/v1/application + -H "accept: application/json" + -H "X-Api-Key: $NB_API_KEY" + -F "file=@app/build/outputs/apk/debug/app-debug.apk" + -F "accessType=$access_type" + ) + + if [ -n "$NB_ALLOWED_USERS" ]; then + curl_cmd+=( -F "allowedUsers=$NB_ALLOWED_USERS" ) + fi + + echo "📤 Uploading APK to NativeBridge..." + response=$("${curl_cmd[@]}") echo "response=$response" >> $GITHUB_OUTPUT - magic_link=$(echo $response | jq -r '.magicLink // empty') - if [ -z "$magic_link" ]; then + magic_link=$(echo "$response" | jq -r '.data.magicLink // empty' 2>/dev/null || echo "") + + if [ -n "$magic_link" ] && [ "$magic_link" != "null" ]; then + echo "magic_link=$magic_link" >> $GITHUB_OUTPUT + echo "✅ Upload successful: $magic_link" + else echo "❌ Failed to get magic link from response" echo "Response: $response" exit 1 fi - echo "magic_link=$magic_link" >> $GITHUB_OUTPUT - echo "✅ Upload successful: $magic_link" - name: Comment PR with Magic Link if: github.event_name == 'pull_request' && steps.upload.outcome == 'success' @@ -72,10 +94,10 @@ jobs: body: `🚀 **App Preview Ready!**\n\nTest this build: ${{ steps.upload.outputs.magic_link }}\n\n_Powered by NativeBridge_` }) - - name: Upload APK as artifact + - name: Upload APK as artifact (backup) if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: app-debug + name: app-debug-apk path: app/build/outputs/apk/debug/app-debug.apk retention-days: 30 From acab434f4254e5a08d1b6ecdeda3936b63c88bf1 Mon Sep 17 00:00:00 2001 From: Haridarshan Choudhary Date: Tue, 13 Jan 2026 19:23:22 +0530 Subject: [PATCH 10/11] demo --- .github/workflows/deploy-to-nativebridge.yml | 22 +++++--------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/.github/workflows/deploy-to-nativebridge.yml b/.github/workflows/deploy-to-nativebridge.yml index 128ecfe..fcc89c8 100644 --- a/.github/workflows/deploy-to-nativebridge.yml +++ b/.github/workflows/deploy-to-nativebridge.yml @@ -45,30 +45,18 @@ jobs: id: upload env: NB_API_KEY: ${{ secrets.NATIVEBRIDGE_API_KEY }} - NB_ALLOWED_USERS: ${{ secrets.NATIVEBRIDGE_ALLOWED_USERS }} - NB_ACCESS_TYPE: ${{ secrets.NATIVEBRIDGE_ACCESS_TYPE }} run: | if [ -z "$NB_API_KEY" ]; then echo "❌ Missing NATIVEBRIDGE_API_KEY secret" exit 1 fi - access_type=${NB_ACCESS_TYPE:-public} - - curl_cmd=( - curl --location https://api.nativebridge.io/v1/application - -H "accept: application/json" - -H "X-Api-Key: $NB_API_KEY" - -F "file=@app/build/outputs/apk/debug/app-debug.apk" - -F "accessType=$access_type" - ) - - if [ -n "$NB_ALLOWED_USERS" ]; then - curl_cmd+=( -F "allowedUsers=$NB_ALLOWED_USERS" ) - fi - echo "📤 Uploading APK to NativeBridge..." - response=$("${curl_cmd[@]}") + response=$(curl --location https://api.nativebridge.io/v1/application \ + -H "accept: application/json" \ + -H "X-Api-Key: $NB_API_KEY" \ + -F "file=@app/build/outputs/apk/debug/app-debug.apk" \ + -F "accessType=public") echo "response=$response" >> $GITHUB_OUTPUT magic_link=$(echo "$response" | jq -r '.data.magicLink // empty' 2>/dev/null || echo "") From dd466bf5584b4dbf1cacffb74cf2026199b6890f Mon Sep 17 00:00:00 2001 From: Haridarshan Choudhary Date: Wed, 14 Jan 2026 11:07:36 +0530 Subject: [PATCH 11/11] chore: remove from root package-lock.json --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index ca2a347..ba536bd 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,6 @@ intro_android_demo Demo of app exercises for Intro to Android App Development -ninja hattori -