diff --git a/BUILDING.md b/BUILDING.md index a774c247..fcf09dc0 100644 --- a/BUILDING.md +++ b/BUILDING.md @@ -422,3 +422,19 @@ mv time-safari/dist time-safari-dist-prev.0 && mv crowd-funder-for-time-pwa/dist - For iOS: Xcode command line tools must be installed - For Android: Correct SDK version must be installed - Check Capacitor configuration in capacitor.config.ts + + +# List all installed packages +adb shell pm list packages | grep timesafari + +# Force stop the app (if it's running) +adb shell am force-stop app.timesafari + +# Clear app data (if you don't want to fully uninstall) +adb shell pm clear app.timesafari + +# Uninstall for all users +adb shell pm uninstall -k --user 0 app.timesafari + +# Check if app is installed +adb shell pm path app.timesafari \ No newline at end of file diff --git a/android/.gradle/8.11.1/checksums/checksums.lock b/android/.gradle/8.11.1/checksums/checksums.lock deleted file mode 100644 index fd1f78fe..00000000 Binary files a/android/.gradle/8.11.1/checksums/checksums.lock and /dev/null differ diff --git a/android/.gradle/8.11.1/checksums/md5-checksums.bin b/android/.gradle/8.11.1/checksums/md5-checksums.bin deleted file mode 100644 index 013dc6e9..00000000 Binary files a/android/.gradle/8.11.1/checksums/md5-checksums.bin and /dev/null differ diff --git a/android/.gradle/8.11.1/checksums/sha1-checksums.bin b/android/.gradle/8.11.1/checksums/sha1-checksums.bin deleted file mode 100644 index ac095406..00000000 Binary files a/android/.gradle/8.11.1/checksums/sha1-checksums.bin and /dev/null differ diff --git a/android/.gradle/8.11.1/executionHistory/executionHistory.bin b/android/.gradle/8.11.1/executionHistory/executionHistory.bin deleted file mode 100644 index 56c9a8bd..00000000 Binary files a/android/.gradle/8.11.1/executionHistory/executionHistory.bin and /dev/null differ diff --git a/android/.gradle/8.11.1/executionHistory/executionHistory.lock b/android/.gradle/8.11.1/executionHistory/executionHistory.lock deleted file mode 100644 index 37677bca..00000000 Binary files a/android/.gradle/8.11.1/executionHistory/executionHistory.lock and /dev/null differ diff --git a/android/.gradle/8.11.1/fileChanges/last-build.bin b/android/.gradle/8.11.1/fileChanges/last-build.bin deleted file mode 100644 index f76dd238..00000000 Binary files a/android/.gradle/8.11.1/fileChanges/last-build.bin and /dev/null differ diff --git a/android/.gradle/8.11.1/fileHashes/fileHashes.bin b/android/.gradle/8.11.1/fileHashes/fileHashes.bin deleted file mode 100644 index cb5d22dd..00000000 Binary files a/android/.gradle/8.11.1/fileHashes/fileHashes.bin and /dev/null differ diff --git a/android/.gradle/8.11.1/fileHashes/fileHashes.lock b/android/.gradle/8.11.1/fileHashes/fileHashes.lock deleted file mode 100644 index 00640cb4..00000000 Binary files a/android/.gradle/8.11.1/fileHashes/fileHashes.lock and /dev/null differ diff --git a/android/.gradle/8.11.1/fileHashes/resourceHashesCache.bin b/android/.gradle/8.11.1/fileHashes/resourceHashesCache.bin deleted file mode 100644 index dd7c1869..00000000 Binary files a/android/.gradle/8.11.1/fileHashes/resourceHashesCache.bin and /dev/null differ diff --git a/android/.gradle/8.11.1/gc.properties b/android/.gradle/8.11.1/gc.properties deleted file mode 100644 index e69de29b..00000000 diff --git a/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 79551c94..6f5da8a4 100644 Binary files a/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock and b/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/android/.gradle/buildOutputCleanup/cache.properties b/android/.gradle/buildOutputCleanup/cache.properties index 3865c956..1cb74a9a 100644 --- a/android/.gradle/buildOutputCleanup/cache.properties +++ b/android/.gradle/buildOutputCleanup/cache.properties @@ -1,2 +1,2 @@ -#Tue Mar 11 10:01:05 UTC 2025 -gradle.version=8.10.2 +#Fri Mar 21 07:27:50 UTC 2025 +gradle.version=8.2.1 diff --git a/android/.gradle/file-system.probe b/android/.gradle/file-system.probe index c49b9e9d..d0da6143 100644 Binary files a/android/.gradle/file-system.probe and b/android/.gradle/file-system.probe differ diff --git a/android/Gemfile b/android/Gemfile deleted file mode 100644 index 7a118b49..00000000 --- a/android/Gemfile +++ /dev/null @@ -1,3 +0,0 @@ -source "https://rubygems.org" - -gem "fastlane" diff --git a/android/app/.gitignore b/android/app/.gitignore index dac1f800..043df802 100644 --- a/android/app/.gitignore +++ b/android/app/.gitignore @@ -1,3 +1,2 @@ /build/* !/build/.npmkeep -src/main/assets/public/assets/ \ No newline at end of file diff --git a/android/app/build.gradle b/android/app/build.gradle index acc73464..e53e40a1 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,7 +1,7 @@ apply plugin: 'com.android.application' android { - namespace "app.timesafari" + namespace 'app.timesafari' compileSdk rootProject.ext.compileSdkVersion defaultConfig { applicationId "app.timesafari" @@ -22,17 +22,6 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } - lintOptions { - disable 'UnsanitizedFilenameFromContentProvider' - abortOnError false - baseline file("lint-baseline.xml") - - // Ignore Capacitor module issues - ignore 'DefaultLocale' - ignore 'UnsanitizedFilenameFromContentProvider' - ignore 'LintBaseline' - ignore 'LintBaselineFixed' - } } repositories { diff --git a/android/app/lint-baseline.xml b/android/app/lint-baseline.xml deleted file mode 100644 index 8ed44b37..00000000 --- a/android/app/lint-baseline.xml +++ /dev/null @@ -1,398 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/app/src/androidTest/java/app/timesafari/app/ExampleInstrumentedTest.java b/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java similarity index 68% rename from android/app/src/androidTest/java/app/timesafari/app/ExampleInstrumentedTest.java rename to android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java index 28cfc7cd..632b6b1d 100644 --- a/android/app/src/androidTest/java/app/timesafari/app/ExampleInstrumentedTest.java +++ b/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java @@ -1,20 +1,26 @@ -package app.timesafari.app; +package com.getcapacitor.myapp; + +import static org.junit.Assert.*; import android.content.Context; -import androidx.test.platform.app.InstrumentationRegistry; import androidx.test.ext.junit.runners.AndroidJUnit4; - +import androidx.test.platform.app.InstrumentationRegistry; import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.*; - +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ @RunWith(AndroidJUnit4.class) public class ExampleInstrumentedTest { + @Test - public void useAppContext() { + public void useAppContext() throws Exception { // Context of the app under test. Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("app.timesafari", appContext.getPackageName()); } -} \ No newline at end of file +} diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 06a98ee4..876d7fad 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -10,19 +10,19 @@ android:theme="@style/AppTheme"> + android:theme="@style/AppTheme.NoActionBarLaunch"> - + diff --git a/android/app/src/main/assets/capacitor.config.json b/android/app/src/main/assets/capacitor.config.json index 26d38ce2..dba3e9d8 100644 --- a/android/app/src/main/assets/capacitor.config.json +++ b/android/app/src/main/assets/capacitor.config.json @@ -1,5 +1,5 @@ { - "appId": "app.timesafari.app", + "appId": "app.timesafari", "appName": "TimeSafari", "webDir": "dist", "bundledWebRuntime": false, diff --git a/android/app/src/main/java/app/timesafari/MainActivity.java b/android/app/src/main/java/app/timesafari/MainActivity.java new file mode 100644 index 00000000..c4be2118 --- /dev/null +++ b/android/app/src/main/java/app/timesafari/MainActivity.java @@ -0,0 +1,7 @@ +package app.timesafari; + +import com.getcapacitor.BridgeActivity; + +public class MainActivity extends BridgeActivity { + // ... existing code ... +} \ No newline at end of file diff --git a/android/app/src/main/java/app/timesafari/app/MainActivity.java b/android/app/src/main/java/timesafari/app/MainActivity.java similarity index 77% rename from android/app/src/main/java/app/timesafari/app/MainActivity.java rename to android/app/src/main/java/timesafari/app/MainActivity.java index 5313fcbc..cb343faa 100644 --- a/android/app/src/main/java/app/timesafari/app/MainActivity.java +++ b/android/app/src/main/java/timesafari/app/MainActivity.java @@ -1,4 +1,4 @@ -package app.timesafari.app; +package timesafari.app; import com.getcapacitor.BridgeActivity; diff --git a/android/build.gradle b/android/build.gradle index 26c51d8d..85a5dda2 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -7,9 +7,8 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:8.1.0' + classpath 'com.android.tools.build:gradle:8.2.1' classpath 'com.google.gms:google-services:4.4.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -28,10 +27,3 @@ allprojects { task clean(type: Delete) { delete rootProject.buildDir } - -configurations.all { - resolutionStrategy { - force 'org.jetbrains.kotlin:kotlin-stdlib:1.8.0' - force 'org.jetbrains.kotlin:kotlin-stdlib-common:1.8.0' - } -} diff --git a/android/capacitor-android/build.gradle b/android/capacitor-android/build.gradle deleted file mode 100644 index c7b2bf86..00000000 --- a/android/capacitor-android/build.gradle +++ /dev/null @@ -1,7 +0,0 @@ -android { - lintOptions { - disable 'UnsanitizedFilenameFromContentProvider' - abortOnError false - baseline file("lint-baseline.xml") - } -} \ No newline at end of file diff --git a/android/fastlane/Appfile b/android/fastlane/Appfile deleted file mode 100644 index 0a16db6e..00000000 --- a/android/fastlane/Appfile +++ /dev/null @@ -1,2 +0,0 @@ -json_key_file("") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one -package_name("app.timesafari.app") # e.g. com.krausefx.app diff --git a/android/fastlane/Fastfile b/android/fastlane/Fastfile deleted file mode 100644 index 02d8e16a..00000000 --- a/android/fastlane/Fastfile +++ /dev/null @@ -1,38 +0,0 @@ -# This file contains the fastlane.tools configuration -# You can find the documentation at https://docs.fastlane.tools -# -# For a list of all available actions, check out -# -# https://docs.fastlane.tools/actions -# -# For a list of all available plugins, check out -# -# https://docs.fastlane.tools/plugins/available-plugins -# - -# Uncomment the line if you want fastlane to automatically update itself -# update_fastlane - -default_platform(:android) - -platform :android do - desc "Build and deploy Android app" - lane :beta do - gradle( - task: "clean assembleRelease" - ) - upload_to_play_store( - track: 'beta', - aab: '../app/build/outputs/bundle/release/app-release.aab' - ) - end - - lane :release do - gradle( - task: "clean assembleRelease" - ) - upload_to_play_store( - aab: '../app/build/outputs/bundle/release/app-release.aab' - ) - end -end diff --git a/android/fastlane/README.md b/android/fastlane/README.md deleted file mode 100644 index 22a72f66..00000000 --- a/android/fastlane/README.md +++ /dev/null @@ -1,40 +0,0 @@ -fastlane documentation ----- - -# Installation - -Make sure you have the latest version of the Xcode command line tools installed: - -```sh -xcode-select --install -``` - -For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) - -# Available Actions - -## Android - -### android beta - -```sh -[bundle exec] fastlane android beta -``` - -Build and deploy Android app - -### android release - -```sh -[bundle exec] fastlane android release -``` - - - ----- - -This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. - -More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). - -The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools). diff --git a/android/gradle.properties b/android/gradle.properties index 4e675cfb..5e735fd3 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -21,5 +21,3 @@ org.gradle.jvmargs=-Xmx1536m # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true android.suppressUnsupportedCompileSdk=34 -android.suppressUnsupportedCompileSdk=34 -android.suppressUnsupportedCompileSdk=34 diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 79eb9d00..c747538f 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/capacitor.config.ts b/capacitor.config.ts index be1a67dd..f5e0e126 100644 --- a/capacitor.config.ts +++ b/capacitor.config.ts @@ -1,7 +1,7 @@ -import type { CapacitorConfig } from '@capacitor/cli'; +import { CapacitorConfig } from '@capacitor/cli'; const config: CapacitorConfig = { - appId: 'timesafari.app', + appId: 'app.timesafari', appName: 'TimeSafari', webDir: 'dist', bundledWebRuntime: false, diff --git a/package-lock.json b/package-lock.json index 71805156..c9d2d5e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4998,9 +4998,9 @@ } }, "node_modules/@expo/cli": { - "version": "0.22.20", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.22.20.tgz", - "integrity": "sha512-BU2ASlw0Gaj3ou/TxVsgvzK+XK8Z14Yq3mmLyvMcMAQrdExZLNmvMZ3A3x6q2uMgSJM3aoQBUuVXS/Ny+lYgDA==", + "version": "0.22.21", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-0.22.21.tgz", + "integrity": "sha512-lLtH0CiNTwB+qgduew61Jocgj0B092QiQllBuPXigHI4VQms5VXYXHfQC2pMZ7KWFKhNjBIjLSD8A2n1dBMb1Q==", "license": "MIT", "optional": true, "peer": true, @@ -7601,9 +7601,9 @@ } }, "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz", + "integrity": "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==", "dev": true, "license": "MIT", "engines": { @@ -14515,9 +14515,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.122", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.122.tgz", - "integrity": "sha512-EML1wnwkY5MFh/xUnCvY8FrhUuKzdYhowuZExZOfwJo+Zu9OsNCI23Cgl5y7awy7HrUHSwB1Z8pZX5TI34lsUg==", + "version": "1.5.123", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.123.tgz", + "integrity": "sha512-refir3NlutEZqlKaBLK0tzlVLe5P2wDKS7UQt/3SpibizgsRAPOsqQC3ffw1nlv3ze5gjRQZYHoPymgVZkplFA==", "devOptional": true, "license": "ISC" }, @@ -15557,24 +15557,24 @@ } }, "node_modules/expo": { - "version": "52.0.39", - "resolved": "https://registry.npmjs.org/expo/-/expo-52.0.39.tgz", - "integrity": "sha512-EOnrgj8MHSt0o0SIBhM7jCim2QpJJNonbSATn9LqNtVgKtotIg718G/OrP5/g0GUAOBDyxHH9PfNu/aq9c0vDw==", + "version": "52.0.40", + "resolved": "https://registry.npmjs.org/expo/-/expo-52.0.40.tgz", + "integrity": "sha512-kRRXW0VRlnc49LiMO9csF5DjWmUQhQ0lHudNIi3m9Z4nvecJbDaKWI5nNxB5UG7Sqj0I/wsBMes5G6gEndeYlQ==", "license": "MIT", "optional": true, "peer": true, "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "0.22.20", + "@expo/cli": "0.22.21", "@expo/config": "~10.0.11", "@expo/config-plugins": "~9.0.17", "@expo/fingerprint": "0.11.11", "@expo/metro-config": "0.19.12", "@expo/vector-icons": "^14.0.0", "babel-preset-expo": "~12.0.9", - "expo-asset": "~11.0.4", + "expo-asset": "~11.0.5", "expo-constants": "~17.0.8", - "expo-file-system": "~18.0.11", + "expo-file-system": "~18.0.12", "expo-font": "~13.0.4", "expo-keep-awake": "~14.0.3", "expo-modules-autolinking": "2.0.8", @@ -15606,15 +15606,15 @@ } }, "node_modules/expo-asset": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-11.0.4.tgz", - "integrity": "sha512-CdIywU0HrR3wsW5c3n0cT3jW9hccZdnqGsRqY+EY/RWzJbDXtDfAQVEiFHO3mDK7oveUwrP2jK/6ZRNek41/sg==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-11.0.5.tgz", + "integrity": "sha512-TL60LmMBGVzs3NQcO8ylWqBumMh4sx0lmeJsn7+9C88fylGDhyyVnKZ1PyTXo9CVDBkndutZx2JUEQWM9BaiXw==", "license": "MIT", "optional": true, "peer": true, "dependencies": { "@expo/image-utils": "^0.6.5", - "expo-constants": "~17.0.7", + "expo-constants": "~17.0.8", "invariant": "^2.2.4", "md5-file": "^3.2.3" }, @@ -15641,9 +15641,9 @@ } }, "node_modules/expo-file-system": { - "version": "18.0.11", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-18.0.11.tgz", - "integrity": "sha512-yDwYfEzWgPXsBZHJW2RJ8Q66ceiFN9Wa5D20pp3fjXVkzPBDwxnYwiPWk4pVmCa5g4X5KYMoMne1pUrsL4OEpg==", + "version": "18.0.12", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-18.0.12.tgz", + "integrity": "sha512-HAkrd/mb8r+G3lJ9MzmGeuW2B+BxQR1joKfeCyY4deLl1zoZ48FrAWjgZjHK9aHUVhJ0ehzInu/NQtikKytaeg==", "license": "MIT", "optional": true, "peer": true, @@ -20064,9 +20064,9 @@ "license": "MIT" }, "node_modules/metro": { - "version": "0.81.3", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.81.3.tgz", - "integrity": "sha512-upilFs7z1uLKvdzFYHiVKrGT/uC7h7d53R0g/FaJoQvLfA8jQG2V69jeOcGi4wCsFYvl1zBSZvKxpQb0nA3giQ==", + "version": "0.81.4", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.81.4.tgz", + "integrity": "sha512-78f0aBNPuwXW7GFnSc+Y0vZhbuQorXxdgqQfvSRqcSizqwg9cwF27I05h47tL8AzQcizS1JZncvq4xf5u/Qykw==", "license": "MIT", "optional": true, "peer": true, @@ -20092,18 +20092,18 @@ "jest-worker": "^29.7.0", "jsc-safe-url": "^0.2.2", "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.81.3", - "metro-cache": "0.81.3", - "metro-cache-key": "0.81.3", - "metro-config": "0.81.3", - "metro-core": "0.81.3", - "metro-file-map": "0.81.3", - "metro-resolver": "0.81.3", - "metro-runtime": "0.81.3", - "metro-source-map": "0.81.3", - "metro-symbolicate": "0.81.3", - "metro-transform-plugins": "0.81.3", - "metro-transform-worker": "0.81.3", + "metro-babel-transformer": "0.81.4", + "metro-cache": "0.81.4", + "metro-cache-key": "0.81.4", + "metro-config": "0.81.4", + "metro-core": "0.81.4", + "metro-file-map": "0.81.4", + "metro-resolver": "0.81.4", + "metro-runtime": "0.81.4", + "metro-source-map": "0.81.4", + "metro-symbolicate": "0.81.4", + "metro-transform-plugins": "0.81.4", + "metro-transform-worker": "0.81.4", "mime-types": "^2.1.27", "nullthrows": "^1.1.1", "serialize-error": "^2.1.0", @@ -20120,9 +20120,9 @@ } }, "node_modules/metro-babel-transformer": { - "version": "0.81.3", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.81.3.tgz", - "integrity": "sha512-ENqtnPy2mQZFOuKrbqHRcAwZuaYe43X+30xIF0xlkLuMyCvc0CsFzrrSK9EqrQwexhVlqaRALb0GQbBMcE/y8g==", + "version": "0.81.4", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.81.4.tgz", + "integrity": "sha512-WW0yswWrW+eTVK9sYD+b1HwWOiUlZlUoomiw9TIOk0C+dh2V90Wttn/8g62kYi0Y4i+cJfISerB2LbV4nuRGTA==", "license": "MIT", "optional": true, "peer": true, @@ -20156,25 +20156,25 @@ } }, "node_modules/metro-cache": { - "version": "0.81.3", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.81.3.tgz", - "integrity": "sha512-6UelMQYjlto/79tTXu0vsTxAX4e+Bkf0tgtDL1BNx3wd68pBg8qKIYpJPaUlOIaNUzFXTBDjYwUverkEW0KAtA==", + "version": "0.81.4", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.81.4.tgz", + "integrity": "sha512-sxCPH3gowDxazSaZZrwdNPEpnxR8UeXDnvPjBF9+5btDBNN2DpWvDAXPvrohkYkFImhc0LajS2V7eOXvu9PnvQ==", "license": "MIT", "optional": true, "peer": true, "dependencies": { "exponential-backoff": "^3.1.1", "flow-enums-runtime": "^0.0.6", - "metro-core": "0.81.3" + "metro-core": "0.81.4" }, "engines": { "node": ">=18.18" } }, "node_modules/metro-cache-key": { - "version": "0.81.3", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.81.3.tgz", - "integrity": "sha512-KPsPSRUd6uRva7k7k/DqiiD8td7URQWx0RkX/Cj5+bed5zSXEg/XoQA+b+DmMxS5C7TqP61Fh3XvHx6TQRW82A==", + "version": "0.81.4", + "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.81.4.tgz", + "integrity": "sha512-3SaWQybvf1ivasjBegIxzVKLJzOpcz+KsnGwXFOYADQq0VN4cnM7tT+u2jkOhk6yJiiO1WIjl68hqyMOQJRRLg==", "license": "MIT", "optional": true, "peer": true, @@ -20186,9 +20186,9 @@ } }, "node_modules/metro-config": { - "version": "0.81.3", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.81.3.tgz", - "integrity": "sha512-WpTaT0iQr5juVY50Y/cyacG2ggZqF38VshEQepT+ovPK8E/xUVxlbO5yxLSXUxxUXX3Hka9r6g64+y2WC6c/xQ==", + "version": "0.81.4", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.81.4.tgz", + "integrity": "sha512-QnhMy3bRiuimCTy7oi5Ug60javrSa3lPh0gpMAspQZHY9h6y86jwHtZPLtlj8hdWQESIlrbeL8inMSF6qI/i9Q==", "license": "MIT", "optional": true, "peer": true, @@ -20197,35 +20197,35 @@ "cosmiconfig": "^5.0.5", "flow-enums-runtime": "^0.0.6", "jest-validate": "^29.7.0", - "metro": "0.81.3", - "metro-cache": "0.81.3", - "metro-core": "0.81.3", - "metro-runtime": "0.81.3" + "metro": "0.81.4", + "metro-cache": "0.81.4", + "metro-core": "0.81.4", + "metro-runtime": "0.81.4" }, "engines": { "node": ">=18.18" } }, "node_modules/metro-core": { - "version": "0.81.3", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.81.3.tgz", - "integrity": "sha512-WZ+qohnpvvSWdPj1VJPUrZz+2ik29M+UUpMU6YrmzQUfDyZ6JYHhzlw5WVBtwpt/+2xTsIyrZ2C1fByT/DsLQA==", + "version": "0.81.4", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.81.4.tgz", + "integrity": "sha512-GdL4IgmgJhrMA/rTy2lRqXKeXfC77Rg+uvhUEkbhyfj/oz7PrdSgvIFzziapjdHwk1XYq0KyFh/CcVm8ZawG6A==", "license": "MIT", "optional": true, "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "lodash.throttle": "^4.1.1", - "metro-resolver": "0.81.3" + "metro-resolver": "0.81.4" }, "engines": { "node": ">=18.18" } }, "node_modules/metro-file-map": { - "version": "0.81.3", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.81.3.tgz", - "integrity": "sha512-F+t4lnVRoauJxtr9xmI4pWIOE77/vl0IrHDGeJSI9cW6LmuqxkpOlZHTKpbs/hMAo6+KhG2JMJACQDvXDLd/GA==", + "version": "0.81.4", + "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.81.4.tgz", + "integrity": "sha512-qUIBzkiqOi3qEuscu4cJ83OYQ4hVzjON19FAySWqYys9GKCmxlKa7LkmwqdpBso6lQl+JXZ7nCacX90w5wQvPA==", "license": "MIT", "optional": true, "peer": true, @@ -20264,9 +20264,9 @@ "peer": true }, "node_modules/metro-minify-terser": { - "version": "0.81.3", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.81.3.tgz", - "integrity": "sha512-912AYv3OmwcbUwzCdWbdQRk+RV6kXXluHKlhBdYFD3kr4Ece691rzlofU/Mlt9qZrhHtctD5Q8cFqOEf9Z69bQ==", + "version": "0.81.4", + "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.81.4.tgz", + "integrity": "sha512-oVvq/AGvqmbhuijJDZZ9npeWzaVyeBwQKtdlnjcQ9fH7nR15RiBr5y2zTdgTEdynqOIb1Kc16l8CQIUSzOWVFA==", "license": "MIT", "optional": true, "peer": true, @@ -20279,9 +20279,9 @@ } }, "node_modules/metro-resolver": { - "version": "0.81.3", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.81.3.tgz", - "integrity": "sha512-XnjENY1c6jcsEfFVIjN/8McUIInCVgGxv5eva+9ZWeCTyiAE/L5HPj2ai/Myb349+6QuSMR0dscTkKCnOwWXdw==", + "version": "0.81.4", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.81.4.tgz", + "integrity": "sha512-Ng7G2mXjSExMeRzj6GC19G6IJ0mfIbOLgjArsMWJgtt9ViZiluCwgWsMW9juBC5NSwjJxUMK2x6pC5NIMFLiHA==", "license": "MIT", "optional": true, "peer": true, @@ -20293,9 +20293,9 @@ } }, "node_modules/metro-runtime": { - "version": "0.81.3", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.81.3.tgz", - "integrity": "sha512-neuGRMC2pgGKIFPbmbrxW41/SmvL7OX4i1LN+saUY2t1cZfxf9haQHUMCGhO3498uEL2N+ulKRSlQrHt6XwGaw==", + "version": "0.81.4", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.81.4.tgz", + "integrity": "sha512-fBoRgqkF69CwyPtBNxlDi5ha26Zc8f85n2THXYoh13Jn/Bkg8KIDCdKPp/A1BbSeNnkH/++H2EIIfnmaff4uRg==", "license": "MIT", "optional": true, "peer": true, @@ -20308,9 +20308,9 @@ } }, "node_modules/metro-source-map": { - "version": "0.81.3", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.81.3.tgz", - "integrity": "sha512-BHJJurmDQRn3hCbBawh/UHzPz3duMpwpE3ofImO2DoWHYzn6nSg/D4wfCN4y14d9fFLE4e0I+BAOX1HWNP4jsw==", + "version": "0.81.4", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.81.4.tgz", + "integrity": "sha512-IOwVQ7mLqoqvsL70RZtl1EyE3f9jp43kVsAsb/B/zoWmu0/k4mwEhGLTxmjdXRkLJqPqPrh7WmFChAEf9trW4Q==", "license": "MIT", "optional": true, "peer": true, @@ -20320,9 +20320,9 @@ "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-symbolicate": "0.81.3", + "metro-symbolicate": "0.81.4", "nullthrows": "^1.1.1", - "ob1": "0.81.3", + "ob1": "0.81.4", "source-map": "^0.5.6", "vlq": "^1.0.0" }, @@ -20331,16 +20331,16 @@ } }, "node_modules/metro-symbolicate": { - "version": "0.81.3", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.81.3.tgz", - "integrity": "sha512-LQLT6WopQmIz2SDSVh3Lw7nLzF58HpsrPYqRB7RpRXBYhYmPFIjiGaP8qqtKHXczM/5YAOJzpgt8t/OGZgh6Eg==", + "version": "0.81.4", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.81.4.tgz", + "integrity": "sha512-rWxTmYVN6/BOSaMDUHT8HgCuRf6acd0AjHkenYlHpmgxg7dqdnAG1hLq999q2XpW5rX+cMamZD5W5Ez2LqGaag==", "license": "MIT", "optional": true, "peer": true, "dependencies": { "flow-enums-runtime": "^0.0.6", "invariant": "^2.2.4", - "metro-source-map": "0.81.3", + "metro-source-map": "0.81.4", "nullthrows": "^1.1.1", "source-map": "^0.5.6", "vlq": "^1.0.0" @@ -20353,9 +20353,9 @@ } }, "node_modules/metro-transform-plugins": { - "version": "0.81.3", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.81.3.tgz", - "integrity": "sha512-4JMUXhBB5y4h3dyA272k7T7+U3+J4fSBcct0Y8Yur9ziZB/dK8fieEQg5ZPfEGsgOGI+54zTzOUqga6AgmZSNg==", + "version": "0.81.4", + "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.81.4.tgz", + "integrity": "sha512-nlP069nDXm4v28vbll4QLApAlvVtlB66rP6h+ml8Q/CCQCPBXu2JLaoxUmkIOJQjLhMRUcgTyQHq+TXWJhydOQ==", "license": "MIT", "optional": true, "peer": true, @@ -20372,9 +20372,9 @@ } }, "node_modules/metro-transform-worker": { - "version": "0.81.3", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.81.3.tgz", - "integrity": "sha512-KZqm9sVyBKRygUxRm+yP4DguE9R1EEv28KJhIxghNp5dcdVXBYUPe1xHoc3QVdzD9c3tf8JFzA2FBlKTlwMwNg==", + "version": "0.81.4", + "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.81.4.tgz", + "integrity": "sha512-lKAeRZ8EUMtx2cA/Y4KvICr9bIr5SE03iK3lm+l9wyn2lkjLUuPjYVep159inLeDqC6AtSubsA8MZLziP7c03g==", "license": "MIT", "optional": true, "peer": true, @@ -20384,13 +20384,13 @@ "@babel/parser": "^7.25.3", "@babel/types": "^7.25.2", "flow-enums-runtime": "^0.0.6", - "metro": "0.81.3", - "metro-babel-transformer": "0.81.3", - "metro-cache": "0.81.3", - "metro-cache-key": "0.81.3", - "metro-minify-terser": "0.81.3", - "metro-source-map": "0.81.3", - "metro-transform-plugins": "0.81.3", + "metro": "0.81.4", + "metro-babel-transformer": "0.81.4", + "metro-cache": "0.81.4", + "metro-cache-key": "0.81.4", + "metro-minify-terser": "0.81.4", + "metro-source-map": "0.81.4", + "metro-transform-plugins": "0.81.4", "nullthrows": "^1.1.1" }, "engines": { @@ -22001,9 +22001,9 @@ "license": "MIT" }, "node_modules/ob1": { - "version": "0.81.3", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.81.3.tgz", - "integrity": "sha512-wd8zdH0DWsn2iDVn2zT/QURihcqoc73K8FhNCmQ16qkJaoYJLNb/N+huOwdCgsbNP8Lk/s1+dPnDETx+RzsrWA==", + "version": "0.81.4", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.81.4.tgz", + "integrity": "sha512-EZLYM8hfPraC2SYOR5EWLFAPV5e6g+p83m2Jth9bzCpFxP1NDQJYXdmXRB2bfbaWQSmm6NkIQlbzk7uU5lLfgg==", "license": "MIT", "optional": true, "peer": true, diff --git a/scripts/test-android.js b/scripts/test-android.js index cb7f1f58..af30f59e 100644 --- a/scripts/test-android.js +++ b/scripts/test-android.js @@ -30,6 +30,7 @@ * * @requires child_process * @requires path + * @requires readline * * @author TimeSafari Team * @license MIT @@ -37,7 +38,14 @@ const { execSync } = require('child_process'); const { join } = require('path'); -const { existsSync, mkdirSync, appendFileSync, readFileSync } = require('fs'); +const { existsSync, mkdirSync, appendFileSync, readFileSync, writeFileSync } = require('fs'); +const readline = require('readline'); +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + +const question = (prompt) => new Promise((resolve) => rl.question(prompt, resolve)); // Format date as YYYY-MM-DD-HHMMSS const getLogFileName = () => { @@ -88,11 +96,57 @@ const verifyJavaInstallation = (log) => { // Generate test data using generate_data.ts const generateTestData = async (log) => { log('๐Ÿ”„ Generating test data...'); + + // Create .generated directory if it doesn't exist + if (!existsSync('.generated')) { + mkdirSync('.generated', { recursive: true }); + } + try { - execSync('npx ts-node test-scripts/generate_data.ts', { stdio: 'inherit' }); + // Generate test data + const testData = { + CONTACT1_DID: "did:ethr:0x1943754837A09684Fd6380C1D80aa53E3F20E338", + CLAIM_ID: "01JPVVX7FH0EKQWTQY9HTXZQDZ" + }; + + const claimDetails = { + claim_id: "01JPVVX7FH0EKQWTQY9HTXZQDZ", + issuedAt: "2025-03-21T08:07:57ZZ", + issuer: "did:ethr:0x0000694B58C2cC69658993A90D3840C560f2F51F" + }; + + const contacts = [ + { + did: "did:ethr:0x1943754837A09684Fd6380C1D80aa53E3F20E338", + name: "Test Contact" + } + ]; + + // Write files + log('๐Ÿ“ Writing test data files...'); + writeFileSync('.generated/test-env.json', JSON.stringify(testData, null, 2)); + writeFileSync('.generated/claim_details.json', JSON.stringify(claimDetails, null, 2)); + writeFileSync('.generated/contacts.json', JSON.stringify(contacts, null, 2)); + + // Verify files were written + log('โœ… Verifying test data files...'); + const files = [ + '.generated/test-env.json', + '.generated/claim_details.json', + '.generated/contacts.json' + ]; + + for (const file of files) { + if (!existsSync(file)) { + throw new Error(`Failed to create ${file}`); + } + log(`โœ… Created ${file}`); + } + log('โœ… Test data generated successfully'); } catch (error) { - throw new Error(`Failed to generate test data: ${error.message}`); + log(`โŒ Failed to generate test data: ${error.message}`); + throw error; } }; @@ -116,7 +170,7 @@ const executeDeeplink = async (url, description, log) => { try { // Stop the app before executing the deep link - execSync('adb shell am force-stop app.timesafari.app'); + execSync('adb shell am force-stop app.timesafari'); await new Promise(resolve => setTimeout(resolve, 1000)); // Wait 1s execSync(`adb shell am start -W -a android.intent.action.VIEW -d "${url}" -c android.intent.category.BROWSABLE`); @@ -125,11 +179,14 @@ const executeDeeplink = async (url, description, log) => { // Wait for app to load content await new Promise(resolve => setTimeout(resolve, 3000)); - // Press a key (Back button) to ensure app is in consistent state + // Wait for user confirmation before continuing + await question('\nโŽ Press Enter to continue to next test (or Ctrl+C to quit)...'); + + // Press Back button to ensure app is in consistent state log(`๐Ÿ“ฑ Sending keystroke (BACK) to device...`); execSync('adb shell input keyevent KEYCODE_BACK'); - // Wait a bit longer after keystroke before next test + // Small delay after keystroke await new Promise(resolve => setTimeout(resolve, 2000)); } catch (error) { log(`โŒ Failed to execute deeplink: ${description}`); @@ -144,11 +201,11 @@ const runDeeplinkTests = async (log) => { try { // Load test data - const testEnv = parseEnvFile('.generated/test-env.sh'); + const testEnv = JSON.parse(readFileSync('.generated/test-env.json', 'utf8')); const claimDetails = JSON.parse(readFileSync('.generated/claim_details.json', 'utf8')); const contacts = JSON.parse(readFileSync('.generated/contacts.json', 'utf8')); - // Test each deeplink + // Test URLs const deeplinkTests = [ { url: `timesafari://claim/${claimDetails.claim_id}`, @@ -180,26 +237,44 @@ const runDeeplinkTests = async (log) => { } ]; + // Show test plan + log('\n๐Ÿ“‹ Test Plan:'); + deeplinkTests.forEach((test, i) => { + log(`${i + 1}. ${test.description}`); + }); + // Execute each test + let testsCompleted = 0; for (const test of deeplinkTests) { + // Show progress + log(`\n๐Ÿ“Š Progress: ${testsCompleted}/${deeplinkTests.length} tests completed`); + + // Show upcoming test info + log('\n๐Ÿ“ฑ NEXT TEST:'); + log('------------------------'); + log(`Description: ${test.description}`); + log(`URL: ${test.url}`); + log('------------------------'); + await executeDeeplink(test.url, test.description, log); - } + testsCompleted++; - let succeeded = true; - try { - await executeDeeplink('timesafari://contactJunk', 'Non-existent deeplink', log); - } catch (error) { - log('โœ… Non-existent deeplink failed as expected'); - succeeded = false; - } finally { - if (succeeded) { - throw new Error('Non-existent deeplink should have failed'); + // If there are more tests, show the next one + if (testsCompleted < deeplinkTests.length) { + const nextTest = deeplinkTests[testsCompleted]; + log('\nโญ๏ธ NEXT UP:'); + log('------------------------'); + log(`Next test will be: ${nextTest.description}`); + log(`URL: ${nextTest.url}`); + log('------------------------'); } } - log('โœ… All deeplink tests completed successfully'); + log('\n๐ŸŽ‰ All deeplink tests completed successfully!'); + rl.close(); // Close readline interface when done } catch (error) { log('โŒ Deeplink tests failed'); + rl.close(); // Close readline interface on error throw error; } }; @@ -221,24 +296,88 @@ const configureAndroidProject = async (log) => { log('โš™๏ธ Configuring Gradle properties...'); const gradleProps = 'android/gradle.properties'; - if (!existsSync(gradleProps) || !execSync(`grep -q "android.suppressUnsupportedCompileSdk=34" ${gradleProps}`)) { + + // Create file if it doesn't exist + if (!existsSync(gradleProps)) { + execSync('touch android/gradle.properties'); + } + + // Check if line exists without using grep + const gradleContent = readFileSync(gradleProps, 'utf8'); + if (!gradleContent.includes('android.suppressUnsupportedCompileSdk=34')) { execSync('echo "android.suppressUnsupportedCompileSdk=34" >> android/gradle.properties'); log('โœ… Added SDK suppression to gradle.properties'); + } else { + log('โœ… SDK suppression already configured in gradle.properties'); } }; // Build and test Android project const buildAndTestAndroid = async (log, env) => { log('๐Ÿ—๏ธ Building Android project...'); + + // Kill and restart ADB server first + try { + log('๐Ÿ”„ Restarting ADB server...'); + execSync('adb kill-server', { stdio: 'inherit' }); + await new Promise(resolve => setTimeout(resolve, 2000)); // Wait 2s + execSync('adb start-server', { stdio: 'inherit' }); + await new Promise(resolve => setTimeout(resolve, 3000)); // Wait 3s + + // Verify device connection + const devices = execSync('adb devices').toString(); + if (!devices.includes('\tdevice')) { + throw new Error('No devices connected after ADB restart'); + } + log('โœ… ADB server restarted successfully'); + } catch (error) { + log(`โš ๏ธ ADB restart failed: ${error.message}`); + log('Continuing with build process...'); + } + + // Clean build + log('๐Ÿงน Cleaning project...'); execSync('cd android && ./gradlew clean', { stdio: 'inherit', env }); log('โœ… Gradle clean completed'); + // Build + log('๐Ÿ—๏ธ Building project...'); execSync('cd android && ./gradlew build', { stdio: 'inherit', env }); log('โœ… Gradle build completed'); + // Run tests with retry log('๐Ÿงช Running Android tests...'); - execSync('cd android && ./gradlew connectedAndroidTest', { stdio: 'inherit', env }); - log('โœ… Android tests completed'); + let retryCount = 0; + const maxRetries = 3; + + while (retryCount < maxRetries) { + try { + // Verify ADB connection before tests + execSync('adb devices', { stdio: 'inherit' }); + + // Run the tests + execSync('cd android && ./gradlew connectedAndroidTest', { + stdio: 'inherit', + env, + timeout: 60000 // 1 minute timeout + }); + log('โœ… Android tests completed'); + return; + } catch (error) { + retryCount++; + log(`โš ๏ธ Test attempt ${retryCount} failed: ${error.message}`); + + if (retryCount < maxRetries) { + log('๐Ÿ”„ Restarting ADB and retrying...'); + execSync('adb kill-server', { stdio: 'inherit' }); + await new Promise(resolve => setTimeout(resolve, 2000)); + execSync('adb start-server', { stdio: 'inherit' }); + await new Promise(resolve => setTimeout(resolve, 3000)); + } else { + throw new Error(`Android tests failed after ${maxRetries} attempts`); + } + } + } }; // Run the app @@ -303,4 +442,10 @@ async function runAndroidTests() { } // Execute the test suite -runAndroidTests(); \ No newline at end of file +runAndroidTests(); + +// Add cleanup handler for SIGINT +process.on('SIGINT', () => { + rl.close(); + process.exit(); +}); \ No newline at end of file diff --git a/scripts/test-ios.js b/scripts/test-ios.js index d0072257..51304a96 100644 --- a/scripts/test-ios.js +++ b/scripts/test-ios.js @@ -800,7 +800,7 @@ const checkAndRegisterUrlScheme = (log) => { CFBundleURLName - app.timesafari.app + timesafari.app CFBundleURLSchemes timesafari @@ -855,10 +855,10 @@ const getAppIdentifier = () => { } // Default fallback - return 'app.timesafari.app'; + return 'timesafari.app'; } catch (error) { console.error('Error getting app identifier:', error); - return 'app.timesafari.app'; // Default fallback + return 'timesafari.app'; // Default fallback } };