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 (