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() +