diff --git a/android/app/build.gradle b/android/app/build.gradle
index 586b73b7d8..40466f004c 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -6,8 +6,10 @@ import com.android.build.OutputFile
import com.sun.org.apache.xalan.internal.xsltc.compiler.Copy
/**
- * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
- * and bundleReleaseJsAndAssets).
+ * The react.gradle file registers a task for each build variant:
+ * - bundlePrJsAndAssets
+ * - bundleDebugJsAndAssets
+ * - bundleReleaseJsAndAssets
* These basically call `react-native bundle` with the correct arguments during the Android build
* cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
* bundle directly from the development server. Below you can see all the possible configurations
@@ -75,8 +77,9 @@ import com.sun.org.apache.xalan.internal.xsltc.compiler.Copy
* ]
*/
project.ext.react = [
- nodeExecutableAndArgs: ["node", "--max-old-space-size=16384"],
- entryFile: "index.android.js"
+ nodeExecutableAndArgs: ["node", "--max-old-space-size=16384"],
+ entryFile: "index.android.js",
+ bundleInPr: true,
]
apply from: "../../node_modules/react-native/react.gradle"
@@ -209,6 +212,14 @@ android {
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
signingConfig signingConfigs.release
}
+ pr {
+ initWith release
+ applicationIdSuffix ".pr"
+ versionNameSuffix ".pr"
+ matchingFallbacks = ["release"]
+ // necessary to make react-native-config's code generation work
+ resValue "string", "build_config_package", "im.status.ethereum"
+ }
}
// applicationVariants are e.g. debug, release
applicationVariants.all { variant ->
diff --git a/android/app/src/debug/res/values/strings.xml b/android/app/src/debug/res/values/strings.xml
index fd27483b60..c7db857287 100644
--- a/android/app/src/debug/res/values/strings.xml
+++ b/android/app/src/debug/res/values/strings.xml
@@ -1,3 +1,3 @@
Status Debug
-
\ No newline at end of file
+
diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
index 1a7dca9247..16d83f115d 100644
--- a/android/app/src/main/res/values/strings.xml
+++ b/android/app/src/main/res/values/strings.xml
@@ -1,7 +1,6 @@
- Status
Your phone appears to be ROOTED, by pressing CONTINUE you understand and accept the risks in using this software.
Continue
Exit
status-im
-
\ No newline at end of file
+
diff --git a/android/app/src/pr/AndroidManifest.xml b/android/app/src/pr/AndroidManifest.xml
new file mode 100644
index 0000000000..daa2f037e6
--- /dev/null
+++ b/android/app/src/pr/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
diff --git a/android/app/src/pr/google-services.json b/android/app/src/pr/google-services.json
new file mode 100644
index 0000000000..df831f5356
--- /dev/null
+++ b/android/app/src/pr/google-services.json
@@ -0,0 +1,42 @@
+{
+ "project_info": {
+ "project_number": "854811651919",
+ "firebase_url": "https://status-react-app.firebaseio.com",
+ "project_id": "status-react-app",
+ "storage_bucket": "status-react-app.appspot.com"
+ },
+ "client": [
+ {
+ "client_info": {
+ "mobilesdk_app_id": "1:854811651919:android:11ee7444ded8a00a",
+ "android_client_info": {
+ "package_name": "im.status.ethereum.pr"
+ }
+ },
+ "oauth_client": [
+ {
+ "client_id": "854811651919-gua52csicclb5p9gr4eeu33ukk0aaphj.apps.googleusercontent.com",
+ "client_type": 3
+ }
+ ],
+ "api_key": [
+ {
+ "current_key": "AIzaSyAOF4W1j8GYeXzzVKRfNKlXywD6bx0rJtQ"
+ }
+ ],
+ "services": {
+ "analytics_service": {
+ "status": 1
+ },
+ "appinvite_service": {
+ "status": 1,
+ "other_platform_oauth_client": []
+ },
+ "ads_service": {
+ "status": 2
+ }
+ }
+ }
+ ],
+ "configuration_version": "1"
+}
diff --git a/android/app/src/pr/res/values/strings.xml b/android/app/src/pr/res/values/strings.xml
new file mode 100644
index 0000000000..5bc6dcce61
--- /dev/null
+++ b/android/app/src/pr/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ Status PR
+
diff --git a/android/app/src/release/res/values/strings.xml b/android/app/src/release/res/values/strings.xml
new file mode 100644
index 0000000000..917ca04be8
--- /dev/null
+++ b/android/app/src/release/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ Status
+
diff --git a/ci/android.groovy b/ci/android.groovy
index a4997b5995..48ce13fdd1 100644
--- a/ci/android.groovy
+++ b/ci/android.groovy
@@ -3,7 +3,12 @@ utils = load 'ci/utils.groovy'
def bundle(type = 'nightly') {
/* Disable Gradle Daemon https://stackoverflow.com/questions/38710327/jenkins-builds-fail-using-the-gradle-daemon */
def gradleOpt = "-PbuildUrl='${currentBuild.absoluteUrl}' -Dorg.gradle.daemon=false "
- if (type == 'release') {
+ def target = "release"
+
+ if (type in ['pr', 'e2e']) {
+ /* PR builds shouldn't replace normal releases */
+ target = 'pr'
+ } else if (type == 'release') {
gradleOpt += "-PreleaseVersion='${utils.getVersion('mobile_files')}'"
}
dir('android') {
@@ -18,12 +23,16 @@ def bundle(type = 'nightly') {
passwordVariable: 'STATUS_RELEASE_KEY_PASSWORD'
)
]) {
- utils.nix_sh "./gradlew assembleRelease ${gradleOpt}"
+ utils.nix_sh "./gradlew assemble${target.capitalize()} ${gradleOpt}"
}
}
+ sh 'find android/app/build/outputs/apk'
+ def outApk = "android/app/build/outputs/apk/${target}/app-${target}.apk"
def pkg = utils.pkgFilename(type, 'apk')
- sh "cp android/app/build/outputs/apk/release/app-release.apk ${pkg}"
- /* necessary for Diawi upload */
+ /* rename for upload */
+ sh "cp ${outApk} ${pkg}"
+ /* necessary for Fastlane */
+ env.APK_PATH = pkg
env.DIAWI_APK = pkg
return pkg
}
diff --git a/fastlane/Fastfile b/fastlane/Fastfile
index 1855bad0bf..8a871ae00a 100644
--- a/fastlane/Fastfile
+++ b/fastlane/Fastfile
@@ -270,12 +270,15 @@ end
platform :android do
+ # Optional env variables
+ APK_PATH = ENV["APK_PATH"] || "android/app/build/outputs/apk/release/app-release.apk"
+
desc "Deploy a new internal build to Google Play"
desc "expects GOOGLE_PLAY_JSON_KEY environment variable"
lane :nightly do
upload_to_play_store(
track: "internal",
- apk: "android/app/build/outputs/apk/release/app-release.apk",
+ apk: APK_PATH,
json_key_data: ENV["GOOGLE_PLAY_JSON_KEY"]
)
@@ -286,7 +289,7 @@ platform :android do
lane :release do
upload_to_play_store(
track: "alpha",
- apk: "android/app/build/outputs/apk/release/app-release.apk",
+ apk: APK_PATH,
json_key_data: ENV["GOOGLE_PLAY_JSON_KEY"]
)
end
@@ -310,8 +313,7 @@ platform :android do
desc "---"
desc "Output: writes `fastlane/diawi.out` file url of the uploded file"
lane :upload_diawi do
- apk = ENV["DIAWI_APK"] || "android/app/build/outputs/apk/release/app-release.apk"
- upload_to_diawi(apk)
+ upload_to_diawi(APK_PATH)
end
desc "`fastlane android saucelabs` - upload .apk to sauce labs"
@@ -321,8 +323,6 @@ platform :android do
desc "expects to have a saucelabs destination name as SAUCE_LABS_NAME env variable"
desc "will fails if file isn't there"
lane :saucelabs do
- upload_to_saucelabs(
- "android/app/build/outputs/apk/release/app-release.apk"
- )
+ upload_to_saucelabs(APK_PATH)
end
end
diff --git a/src/status_im/core.cljs b/src/status_im/core.cljs
index 3ee39b96b6..513793c030 100644
--- a/src/status_im/core.cljs
+++ b/src/status_im/core.cljs
@@ -13,8 +13,9 @@
[goog.object :as object]
cljs.core.specs.alpha))
-(when js/goog.DEBUG
- (.ignoreWarnings (.-YellowBox js-dependencies/react-native) #js ["re-frame: overwriting"]))
+(if js/goog.DEBUG
+ (.ignoreWarnings (.-YellowBox js-dependencies/react-native) #js ["re-frame: overwriting"])
+ (aset js/console "disableYellowBox" true))
(defn init [app-root]
(log/set-level! config/log-level)
diff --git a/test/appium/tests/atomic/account_management/test_sign_in.py b/test/appium/tests/atomic/account_management/test_sign_in.py
index 9ffa61693c..caf7fe83ba 100644
--- a/test/appium/tests/atomic/account_management/test_sign_in.py
+++ b/test/appium/tests/atomic/account_management/test_sign_in.py
@@ -64,6 +64,6 @@ class TestSignInOffline(MultipleDeviceTestCase):
sign_in.accept_agreements()
home = sign_in.sign_in()
home.home_button.wait_for_visibility_of_element()
- connection_text = home.connection_status.text
+ connection_text = sign_in.connection_status.text
if connection_text != 'Offline':
pytest.fail("Connection status text '%s' doesn't match expected 'Offline'" % connection_text)
diff --git a/test/appium/tests/atomic/chats/test_one_to_one.py b/test/appium/tests/atomic/chats/test_one_to_one.py
index 661995e1e4..a807961340 100644
--- a/test/appium/tests/atomic/chats/test_one_to_one.py
+++ b/test/appium/tests/atomic/chats/test_one_to_one.py
@@ -232,9 +232,8 @@ class TestMessagesOneToOneChatMultiple(MultipleDeviceTestCase):
# When the placeholder is visible, the offline status bar does not appear
wallet_view = home_view.wallet_button.click()
wallet_view.home_button.click()
-
- sign_in.toggle_airplane_mode()
- sign_in.accept_agreements()
+ home_view.toggle_airplane_mode()
+ home_view.accept_agreements()
home_view = sign_in.sign_in()
chat = home_view.add_contact(transaction_senders['C']['public_key'])
diff --git a/test/appium/views/base_view.py b/test/appium/views/base_view.py
index 3fb9688bcd..5065a81b40 100644
--- a/test/appium/views/base_view.py
+++ b/test/appium/views/base_view.py
@@ -583,10 +583,14 @@ class BaseView(object):
airplane_toggle.wait_for_visibility_of_element()
airplane_toggle.click()
# opening Status app
- self.driver.start_activity(app_package='im.status.ethereum', app_activity='.MainActivity')
+ app_package, app_activity = 'im.status.ethereum', '.MainActivity'
+ if pytest.config.getoption('pr_number'):
+ app_package, app_activity = 'im.status.ethereum.pr', 'im.status.ethereum.MainActivity'
+ self.driver.start_activity(app_package=app_package, app_activity=app_activity)
def open_universal_web_link(self, deep_link):
start_web_browser(self.driver)
self.send_as_keyevent(deep_link)
self.confirm()
self.open_in_status_button.click()
+