diff --git a/README.md b/README.md index dc7f866..f5a6fe2 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ If you tap on them they will auto fill the login data. 1. [Pinch and Zoom](#pinch-zoom) 1. [Swiping](#swiping) 1. [Geo Location](#geo-location) + 1. [Drawing](#drawing) 1. [Contributing to the app](#contributing-to-the-app) 1. [Test-automation](#test-automation) 1. [FAQ](#faq) @@ -181,11 +182,17 @@ The cart contents page supports to remove an item from the cart by swiping it to ![saucelabs.ios](./docs/assets/swipe-left.gif) ### Geo Location -This app now also support testing changing the Geo Location. The app will pick up changes when the location is mocked, see this [test](./tests/e2e/spec/default/geo.location.spec.js) +This app now also supports testing changing the Geo Location. The app will pick up changes when the location is mocked, see this [test](./tests/e2e/spec/default/geo.location.spec.js) for more information. ![saucelabs.ios](./docs/assets/geo-location.gif) +### Drawing +Drawing your favorite Sauce Bolt can now been done in this app, you can even save it to your camera roll. If you want to do this with Appium then take a peak [here](./tests/e2e/spec/extra/drawing.spec.js) +for more information. + +![saucelabs.ios](./docs/assets/drawing.gif) + ## Contributing to the app If you want to contribute to the app and add new functionalities, please check the documentation [here](./docs/CONTRIBUTING.md). diff --git a/android/app/build.gradle b/android/app/build.gradle index 0f7c83a..8b38c6b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -131,8 +131,8 @@ android { applicationId "com.swaglabsmobileapp" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 10 - versionName "2.6.0" + versionCode 11 + versionName "2.7.0" missingDimensionStrategy 'react-native-camera', 'general' } splits { @@ -194,6 +194,7 @@ dependencies { implementation project(':react-native-webview') implementation fileTree(dir: "libs", include: ["*.jar"]) implementation "com.facebook.react:react-native:+" // From node_modules + implementation project(':react-native-fs') if (enableHermes) { def hermesPath = "../../node_modules/hermes-engine/android/"; diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index e07f79c..56680e6 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ + '../node_modules/react-native/Libraries/Text' pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration' pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/' + pod 'rn-fetch-blob', :path => '../node_modules/rn-fetch-blob' pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact' pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi' diff --git a/ios/Podfile.lock b/ios/Podfile.lock index e0553e2..012a983 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -194,12 +194,14 @@ PODS: - React - react-native-camera/RN (3.15.1): - React + - react-native-cameraroll (4.0.1): + - React - react-native-geolocation-service (5.0.0): - React - react-native-splash-screen (3.2.0): - React - - react-native-webview (8.0.2): - - React + - react-native-webview (10.9.2): + - React-Core - React-RCTActionSheet (0.61.5): - React-Core/RCTActionSheetHeaders (= 0.61.5) - React-RCTAnimation (0.61.5): @@ -235,8 +237,12 @@ PODS: - React-cxxreact (= 0.61.5) - React-jsi (= 0.61.5) - ReactCommon/jscallinvoker (= 0.61.5) + - rn-fetch-blob (0.12.0): + - React-Core - RNCAsyncStorage (1.7.1): - React + - RNFS (2.16.6): + - React - RNGestureHandler (1.8.0): - React - RNLocalize (1.3.1): @@ -271,6 +277,7 @@ DEPENDENCIES: - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) - react-native-biometrics (from `../node_modules/react-native-biometrics`) - react-native-camera (from `../node_modules/react-native-camera`) + - "react-native-cameraroll (from `../node_modules/@react-native-community/cameraroll`)" - react-native-geolocation-service (from `../node_modules/react-native-geolocation-service`) - react-native-splash-screen (from `../node_modules/react-native-splash-screen`) - react-native-webview (from `../node_modules/react-native-webview`) @@ -285,7 +292,9 @@ DEPENDENCIES: - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) - ReactCommon/jscallinvoker (from `../node_modules/react-native/ReactCommon`) - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - rn-fetch-blob (from `../node_modules/rn-fetch-blob`) - "RNCAsyncStorage (from `../node_modules/@react-native-community/async-storage`)" + - RNFS (from `../node_modules/react-native-fs`) - RNGestureHandler (from `../node_modules/react-native-gesture-handler`) - RNLocalize (from `../node_modules/react-native-localize`) - RNPermissions (from `../node_modules/react-native-permissions`) @@ -333,6 +342,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-biometrics" react-native-camera: :path: "../node_modules/react-native-camera" + react-native-cameraroll: + :path: "../node_modules/@react-native-community/cameraroll" react-native-geolocation-service: :path: "../node_modules/react-native-geolocation-service" react-native-splash-screen: @@ -359,8 +370,12 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/Libraries/Vibration" ReactCommon: :path: "../node_modules/react-native/ReactCommon" + rn-fetch-blob: + :path: "../node_modules/rn-fetch-blob" RNCAsyncStorage: :path: "../node_modules/@react-native-community/async-storage" + RNFS: + :path: "../node_modules/react-native-fs" RNGestureHandler: :path: "../node_modules/react-native-gesture-handler" RNLocalize: @@ -395,9 +410,10 @@ SPEC CHECKSUMS: React-jsinspector: fa0ecc501688c3c4c34f28834a76302233e29dc0 react-native-biometrics: e092e67ab766de7ad97f572fa4973e226a0e4c6b react-native-camera: 1ba3e7f2375a6b44ae09ce9be70268e0b225bc10 + react-native-cameraroll: 60ba0068826eab1c8d43146191bafd4363ea58a7 react-native-geolocation-service: 141e33bdb179bcba10b216ee13962611e21f2be4 react-native-splash-screen: 200d11d188e2e78cea3ad319964f6142b6384865 - react-native-webview: 99bdfd6c189772b0f15494f728430c23b18b93e4 + react-native-webview: 4e96d493f9f90ba4f03b28933f30b2964df07e39 React-RCTActionSheet: 600b4d10e3aea0913b5a92256d2719c0cdd26d76 React-RCTAnimation: 791a87558389c80908ed06cc5dfc5e7920dfa360 React-RCTBlob: d89293cc0236d9cb0933d85e430b0bbe81ad1d72 @@ -408,7 +424,9 @@ SPEC CHECKSUMS: React-RCTText: 9ccc88273e9a3aacff5094d2175a605efa854dbe React-RCTVibration: a49a1f42bf8f5acf1c3e297097517c6b3af377ad ReactCommon: 198c7c8d3591f975e5431bec1b0b3b581aa1c5dd + rn-fetch-blob: f065bb7ab7fb48dd002629f8bdcb0336602d3cba RNCAsyncStorage: 44395cb9c7c1523104c2b499eb426ef7aff82bca + RNFS: 2bd9eb49dc82fa9676382f0585b992c424cd59df RNGestureHandler: 7a5833d0f788dbd107fbb913e09aa0c1ff333c39 RNLocalize: 07eb7a91d10021cdf59d80061ebf3adb8a5b5688 RNPermissions: 2f74237e97b08beda01e914301e12524ddddf5b8 @@ -417,6 +435,6 @@ SPEC CHECKSUMS: RNVectorIcons: bc69e6a278b14842063605de32bec61f0b251a59 Yoga: f2a7cd4280bfe2cca5a7aed98ba0eb3d1310f18b -PODFILE CHECKSUM: 6ee34b6ab72003464a92d0b7e7bd1bc32e856ab7 +PODFILE CHECKSUM: 4c88b0a1441e5e3614d157b785ff3db1458dbdc8 COCOAPODS: 1.9.3 diff --git a/ios/SwagLabsMobileApp.xcodeproj/project.pbxproj b/ios/SwagLabsMobileApp.xcodeproj/project.pbxproj index f527008..ec11cad 100644 --- a/ios/SwagLabsMobileApp.xcodeproj/project.pbxproj +++ b/ios/SwagLabsMobileApp.xcodeproj/project.pbxproj @@ -467,7 +467,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 9; + CURRENT_PROJECT_VERSION = 11; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = 2ZQ6NMUD9U; INFOPLIST_FILE = SwagLabsMobileApp/Info.plist; @@ -493,7 +493,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = 8; + CURRENT_PROJECT_VERSION = 11; DEAD_CODE_STRIPPING = NO; DEVELOPMENT_TEAM = 2ZQ6NMUD9U; INFOPLIST_FILE = SwagLabsMobileApp/Info.plist; diff --git a/ios/SwagLabsMobileApp/Info.plist b/ios/SwagLabsMobileApp/Info.plist index 99de7ff..e2fafc7 100644 --- a/ios/SwagLabsMobileApp/Info.plist +++ b/ios/SwagLabsMobileApp/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.6.0 + 2.7.0 CFBundleSignature ???? CFBundleURLTypes @@ -34,7 +34,7 @@ CFBundleVersion - 10 + 11 LSRequiresIPhoneOS NSAppTransportSecurity @@ -50,6 +50,10 @@ + NSPhotoLibraryAddUsageDescription + $(PRODUCT_NAME) would like to save images to your device. + NSPhotoLibraryUsageDescription + $(PRODUCT_NAME) would like to save images to your device. NSCameraUsageDescription $(PRODUCT_NAME) requires camera access to use the QR-code scanner. NSFaceIDUsageDescription diff --git a/package.json b/package.json index 2593071..9d873fb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "SwagLabsMobileApp", - "version": "2.6.0", + "version": "2.7.0", "private": true, "scripts": { "start": "react-native start", @@ -25,6 +25,7 @@ }, "dependencies": { "@react-native-community/async-storage": "^1.7.1", + "@react-native-community/cameraroll": "^4.0.1", "i18n-js": "^3.5.1", "patch-package": "^6.2.2", "postinstall-postinstall": "^2.1.0", @@ -33,6 +34,7 @@ "react-native-biometrics": "^2.1.2", "react-native-camera": "^3.15.1", "react-native-elements": "^1.2.7", + "react-native-fs": "^2.16.6", "react-native-geolocation-service": "^5.0.0", "react-native-gesture-handler": "^1.5.3", "react-native-localize": "^1.3.1", @@ -41,10 +43,12 @@ "react-native-qrcode-scanner": "^1.3.1", "react-native-quick-actions": "^0.3.13", "react-native-reanimated": "^1.13.1", + "react-native-signature-canvas": "^3.2.0", "react-native-splash-screen": "^3.2.0", "react-native-vector-icons": "^7.1.0", - "react-native-webview": "^8.0.2", + "react-native-webview": "^10.9.2", "react-navigation": "^3.11.1", + "rn-fetch-blob": "^0.12.0", "sync-storage": "^0.4.2" }, "devDependencies": { diff --git a/src/img/sauce-bolt.png b/src/img/sauce-bolt.png new file mode 100644 index 0000000..c862acf Binary files /dev/null and b/src/img/sauce-bolt.png differ diff --git a/src/js/Router.js b/src/js/Router.js index e9e957d..5dca703 100644 --- a/src/js/Router.js +++ b/src/js/Router.js @@ -15,6 +15,7 @@ import WebviewScreen from './screens/Webview'; import QrCodeScanner from './screens/QrCodeScanner'; import DrawerLinks from './components/DrawerLinks'; import GeoLocation from './screens/GeoLocation'; +import Drawing from './screens/Drawing'; const StackNavigator = createStackNavigator({ [ SCREENS.LOGIN ]: { screen: Login }, @@ -57,6 +58,10 @@ const StackNavigator = createStackNavigator({ screen: GeoLocation, path: 'geo-location', }, + [ SCREENS.DRAWING ]: { + screen: Drawing, + path: 'drawing', + }, }, { initialRouteName: SCREENS.LOGIN, diff --git a/src/js/components/ActionButton.js b/src/js/components/ActionButton.js index 8d29079..f8816f3 100644 --- a/src/js/components/ActionButton.js +++ b/src/js/components/ActionButton.js @@ -11,12 +11,12 @@ export default class ActionButton extends Component { } render() { - const { onPress, title } = this.props; + const { containerStyle, onPress, title } = this.props; return (