From b80d8a0ecaafdd8727986f551df9d5f16239c7d0 Mon Sep 17 00:00:00 2001 From: Govind Dixit Date: Mon, 24 Aug 2020 17:54:10 +0530 Subject: [PATCH] [NEW] Add to F-Droid (#2171) * create play and foss build * update package.json to generate each build * check1 * requested changes * initial commit * Update config.yml * minor changes * remove bugsnag from foss build * remove bugsnag tasks from foss job * fix stuck screen * fixes * update * fix lint * finalise :rocket: * requested changes * share app for fdroid * update * use negation for builds * requested change * update share app * fix issues due to latest sync * add extra line * fix lint * update * update * fix bugsnag issue * Update config.yml * Fix store url * Foss release instead of debug * Add hold for foss * Fix build * requested changes * update name and icons * update * fix * Revert "Bump version to 4.11.0 (#2392)" This reverts commit ea287980d96b181b90b8db35dfa77f600d12d517. * finalise Co-authored-by: Djorkaeff Alexandre Co-authored-by: Diego Mello --- .circleci/config.yml | 84 +++++++++++++-- __mocks__/react-native-config-reader.js | 3 + android/Gemfile.lock | 4 +- android/app/build.gradle | 41 ++++++-- .../reactnative/CustomPushNotification.java | 20 ++++ .../reactnative/DismissNotification.java | 12 +++ .../java/chat/rocket/reactnative/Ejson.java | 0 .../rocket/reactnative/ReplyBroadcast.java | 13 +++ .../res/drawable/ic_launcher_background.xml | 9 ++ .../res/drawable/ic_launcher_foreground.xml | 19 ++++ .../src/foss/res/drawable/launch_screen.xml | 12 +++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/foss/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1991 bytes .../mipmap-hdpi/ic_launcher_background.png | Bin 0 -> 367 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3839 bytes .../src/foss/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1356 bytes .../mipmap-mdpi/ic_launcher_background.png | Bin 0 -> 233 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2454 bytes .../src/foss/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2715 bytes .../mipmap-xhdpi/ic_launcher_background.png | Bin 0 -> 508 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 5473 bytes .../foss/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 4088 bytes .../mipmap-xxhdpi/ic_launcher_background.png | Bin 0 -> 897 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 8494 bytes .../foss/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 5760 bytes .../mipmap-xxxhdpi/ic_launcher_background.png | Bin 0 -> 1349 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 12240 bytes .../app/src/foss/res/values-night/colors.xml | 4 + android/app/src/foss/res/values/colors.xml | 6 ++ android/app/src/foss/res/values/strings.xml | 4 + android/app/src/foss/res/values/styles.xml | 28 +++++ android/app/src/main/AndroidManifest.xml | 3 - .../rocket/reactnative/MainApplication.java | 4 +- android/app/src/play/AndroidManifest.xml | 75 ++++++++++++++ .../app/{ => src/play}/google-services.json | 0 .../chat/rocket/reactnative/Callback.java | 0 .../reactnative/CustomPushNotification.java | 4 +- .../reactnative/DismissNotification.java | 0 .../java/chat/rocket/reactnative/Ejson.java | 97 ++++++++++++++++++ .../rocket/reactnative/LoadNotification.java | 0 .../rocket/reactnative/ReplyBroadcast.java | 0 android/build.gradle | 19 ++-- android/fastlane/Fastfile | 19 ++-- android/fastlane/README.md | 21 ++-- app/constants/environment.js | 3 + app/constants/links.js | 1 + app/index.js | 5 +- app/notifications/push/index.js | 12 ++- app/utils/log/index.js | 33 ++++-- app/utils/review.js | 15 +-- app/views/SettingsView/index.js | 90 +++++++++++----- package.json | 5 +- yarn.lock | 5 + 54 files changed, 582 insertions(+), 98 deletions(-) create mode 100644 __mocks__/react-native-config-reader.js create mode 100644 android/app/src/foss/java/chat/rocket/reactnative/CustomPushNotification.java create mode 100644 android/app/src/foss/java/chat/rocket/reactnative/DismissNotification.java rename android/app/src/{main => foss}/java/chat/rocket/reactnative/Ejson.java (100%) create mode 100644 android/app/src/foss/java/chat/rocket/reactnative/ReplyBroadcast.java create mode 100644 android/app/src/foss/res/drawable/ic_launcher_background.xml create mode 100644 android/app/src/foss/res/drawable/ic_launcher_foreground.xml create mode 100644 android/app/src/foss/res/drawable/launch_screen.xml create mode 100644 android/app/src/foss/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 android/app/src/foss/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 android/app/src/foss/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/foss/res/mipmap-hdpi/ic_launcher_background.png create mode 100644 android/app/src/foss/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 android/app/src/foss/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/foss/res/mipmap-mdpi/ic_launcher_background.png create mode 100644 android/app/src/foss/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 android/app/src/foss/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/foss/res/mipmap-xhdpi/ic_launcher_background.png create mode 100644 android/app/src/foss/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 android/app/src/foss/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/foss/res/mipmap-xxhdpi/ic_launcher_background.png create mode 100644 android/app/src/foss/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 android/app/src/foss/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/foss/res/mipmap-xxxhdpi/ic_launcher_background.png create mode 100644 android/app/src/foss/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 android/app/src/foss/res/values-night/colors.xml create mode 100644 android/app/src/foss/res/values/colors.xml create mode 100644 android/app/src/foss/res/values/strings.xml create mode 100644 android/app/src/foss/res/values/styles.xml create mode 100644 android/app/src/play/AndroidManifest.xml rename android/app/{ => src/play}/google-services.json (100%) rename android/app/src/{main => play}/java/chat/rocket/reactnative/Callback.java (100%) rename android/app/src/{main => play}/java/chat/rocket/reactnative/CustomPushNotification.java (99%) rename android/app/src/{main => play}/java/chat/rocket/reactnative/DismissNotification.java (100%) create mode 100644 android/app/src/play/java/chat/rocket/reactnative/Ejson.java rename android/app/src/{main => play}/java/chat/rocket/reactnative/LoadNotification.java (100%) rename android/app/src/{main => play}/java/chat/rocket/reactnative/ReplyBroadcast.java (100%) create mode 100644 app/constants/environment.js diff --git a/.circleci/config.yml b/.circleci/config.yml index fc1961f59..a1cf5ced5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -119,7 +119,7 @@ jobs: - save_cache: *save-npm-cache-linux # Android builds - android-build: + android-play-build: <<: *defaults docker: - image: circleci/android:api-28-node @@ -178,12 +178,12 @@ jobs: echo -e "export default { BUGSNAG_API_KEY: '$BUGSNAG_KEY' };" > ./config.js - run: - name: Build Android App + name: Build Android Play App command: | if [[ $KEYSTORE ]]; then - bundle exec fastlane android release + bundle exec fastlane android playRelease else - bundle exec fastlane android build + bundle exec fastlane android playBuild fi working_directory: android @@ -194,8 +194,8 @@ jobs: yarn generate-source-maps-android upload \ --api-key=$BUGSNAG_KEY \ --app-version=$CIRCLE_BUILD_NUM \ - --minifiedFile=android/app/build/generated/assets/react/release/app.bundle \ - --source-map=android/app/build/generated/sourcemaps/react/release/app.bundle.map \ + --minifiedFile=android/app/build/generated/assets/react/play/release/app.bundle \ + --source-map=android/app/build/generated/sourcemaps/react/play/release/app.bundle.map \ --minified-url=app.bundle \ --upload-sources fi @@ -213,6 +213,67 @@ jobs: - android/fastlane/report.xml - android/app/build/outputs + android-foss-build: + <<: *defaults + docker: + - image: circleci/android:api-28-node + + environment: + JAVA_OPTS: '-Xms512m -Xmx2g' + GRADLE_OPTS: '-Xmx3g -Dorg.gradle.daemon=false -Dorg.gradle.jvmargs="-Xmx2g -XX:+HeapDumpOnOutOfMemoryError"' + TERM: dumb + <<: *bash-env + + steps: + - checkout + + - run: *install-node + + - restore_cache: *restore-npm-cache-linux + + - run: *install-npm-modules + + - run: *update-fastlane-android + + - restore_cache: *restore-gradle-cache + + - run: + name: Configure Gradle + command: | + echo -e "" > ./gradle.properties + # echo -e "android.enableAapt2=false" >> ./gradle.properties + echo -e "android.useAndroidX=true" >> ./gradle.properties + echo -e "android.enableJetifier=true" >> ./gradle.properties + echo -e "FLIPPER_VERSION=0.51.0" >> ./gradle.properties + echo -e "VERSIONCODE=$CIRCLE_BUILD_NUM" >> ./gradle.properties + + if [[ $KEYSTORE ]]; then + echo $KEYSTORE_BASE64 | base64 --decode > ./app/$KEYSTORE + echo -e "KEYSTORE=$KEYSTORE" >> ./gradle.properties + echo -e "KEYSTORE_PASSWORD=$KEYSTORE_PASSWORD" >> ./gradle.properties + echo -e "KEY_ALIAS=$KEY_ALIAS" >> ./gradle.properties + echo -e "KEY_PASSWORD=$KEYSTORE_PASSWORD" >> ./gradle.properties + fi + working_directory: android + + - run: + name: Build Android Foss App + command: bundle exec fastlane android fossRelease + working_directory: android + + - store_artifacts: + path: android/app/build/outputs + + - save_cache: *save-npm-cache-linux + + - save_cache: *save-gradle-cache + + - persist_to_workspace: + root: . + paths: + - android/fastlane/report.xml + - android/app/build/outputs + android-google-play-beta: <<: *defaults docker: @@ -341,13 +402,20 @@ workflows: requires: - ios-hold-testflight - - android-build: + - android-play-build: requires: - lint-testunit - android-hold-google-play-beta: type: approval requires: - - android-build + - android-play-build - android-google-play-beta: requires: - android-hold-google-play-beta + - android-hold-foss-build: + type: approval + requires: + - lint-testunit + - android-foss-build: + requires: + - android-hold-foss-build diff --git a/__mocks__/react-native-config-reader.js b/__mocks__/react-native-config-reader.js new file mode 100644 index 000000000..2286d3cb6 --- /dev/null +++ b/__mocks__/react-native-config-reader.js @@ -0,0 +1,3 @@ +export default { + BuildConfigs: null +}; diff --git a/android/Gemfile.lock b/android/Gemfile.lock index 0c51b23fc..5488439fc 100644 --- a/android/Gemfile.lock +++ b/android/Gemfile.lock @@ -81,7 +81,6 @@ GEM xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) - fastlane-plugin-appcenter (1.8.0) gh_inspector (1.1.3) google-api-client (0.36.4) addressable (~> 2.5, >= 2.5.1) @@ -156,6 +155,7 @@ GEM uber (0.1.0) unf (0.1.4) unf_ext + unf_ext (0.0.7.7) unf_ext (0.0.7.7-x64-mingw32) unicode-display_width (1.7.0) word_wrap (1.0.0) @@ -171,11 +171,11 @@ GEM xcpretty (~> 0.2, >= 0.0.7) PLATFORMS + ruby x64-mingw32 DEPENDENCIES fastlane - fastlane-plugin-appcenter BUNDLED WITH 2.0.2 diff --git a/android/app/build.gradle b/android/app/build.gradle index c202892ab..566f17dd4 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -1,8 +1,13 @@ +def taskRequests = getGradle().getStartParameter().getTaskRequests().toString().toLowerCase() +def isPlay = !taskRequests.contains("foss") + apply plugin: "com.android.application" -apply plugin: 'com.google.gms.google-services' -apply plugin: 'com.google.firebase.crashlytics' apply plugin: 'kotlin-android' -apply plugin: 'com.bugsnag.android.gradle' + +if (isPlay) { + apply plugin: 'com.google.firebase.crashlytics' + apply plugin: 'com.bugsnag.android.gradle' +} import com.android.build.OutputFile @@ -141,7 +146,9 @@ android { versionCode VERSIONCODE as Integer versionName "4.11.0" vectorDrawables.useSupportLibrary = true - manifestPlaceholders = [BugsnagAPIKey: BugsnagAPIKey as String] + if (isPlay) { + manifestPlaceholders = [BugsnagAPIKey: BugsnagAPIKey as String] + } missingDimensionStrategy "RNNotifications.reactNativeVersion", "reactNative60" // See note below! } @@ -168,8 +175,10 @@ android { minifyEnabled enableProguardInReleaseBuilds setProguardFiles([getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro']) signingConfig signingConfigs.release - firebaseCrashlytics { - nativeSymbolUploadEnabled true + if (isPlay) { + firebaseCrashlytics { + nativeSymbolUploadEnabled true + } } } } @@ -182,6 +191,19 @@ android { // } // applicationVariants are e.g. debug, release + + flavorDimensions "type" + productFlavors { + foss { + dimension = "type" + buildConfigField "boolean", "FDROID_BUILD", "true" + } + play { + dimension = "type" + buildConfigField "boolean", "FDROID_BUILD", "false" + } + } + applicationVariants.all { variant -> variant.outputs.each { output -> // For each separate APK per architecture, set a unique version code as described here: @@ -217,7 +239,7 @@ dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) //noinspection GradleDynamicVersion implementation "com.facebook.react:react-native:+" // From node_modules - implementation "com.google.firebase:firebase-messaging:18.0.0" + playImplementation "com.google.firebase:firebase-messaging:18.0.0" implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") { exclude group:'com.facebook.fbjni' @@ -250,4 +272,7 @@ task copyDownloadableDepsToLibs(type: Copy) { into 'libs' } -apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) \ No newline at end of file +apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) +if (isPlay) { + apply plugin: 'com.google.gms.google-services' +} diff --git a/android/app/src/foss/java/chat/rocket/reactnative/CustomPushNotification.java b/android/app/src/foss/java/chat/rocket/reactnative/CustomPushNotification.java new file mode 100644 index 000000000..d8c0502eb --- /dev/null +++ b/android/app/src/foss/java/chat/rocket/reactnative/CustomPushNotification.java @@ -0,0 +1,20 @@ +package chat.rocket.reactnative; + +import android.content.Context; +import android.os.Bundle; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.wix.reactnativenotifications.core.AppLaunchHelper; +import com.wix.reactnativenotifications.core.AppLifecycleFacade; +import com.wix.reactnativenotifications.core.JsIOHelper; +import com.wix.reactnativenotifications.core.notification.PushNotification; + +public class CustomPushNotification extends PushNotification { + public static ReactApplicationContext reactApplicationContext; + + public CustomPushNotification(Context context, Bundle bundle, AppLifecycleFacade appLifecycleFacade, AppLaunchHelper appLaunchHelper, JsIOHelper jsIoHelper) { + super(context, bundle, appLifecycleFacade, appLaunchHelper, jsIoHelper); + reactApplicationContext = new ReactApplicationContext(context); + } + +} diff --git a/android/app/src/foss/java/chat/rocket/reactnative/DismissNotification.java b/android/app/src/foss/java/chat/rocket/reactnative/DismissNotification.java new file mode 100644 index 000000000..48350be51 --- /dev/null +++ b/android/app/src/foss/java/chat/rocket/reactnative/DismissNotification.java @@ -0,0 +1,12 @@ +package chat.rocket.reactnative; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +public class DismissNotification extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + + } +} diff --git a/android/app/src/main/java/chat/rocket/reactnative/Ejson.java b/android/app/src/foss/java/chat/rocket/reactnative/Ejson.java similarity index 100% rename from android/app/src/main/java/chat/rocket/reactnative/Ejson.java rename to android/app/src/foss/java/chat/rocket/reactnative/Ejson.java diff --git a/android/app/src/foss/java/chat/rocket/reactnative/ReplyBroadcast.java b/android/app/src/foss/java/chat/rocket/reactnative/ReplyBroadcast.java new file mode 100644 index 000000000..5203495b8 --- /dev/null +++ b/android/app/src/foss/java/chat/rocket/reactnative/ReplyBroadcast.java @@ -0,0 +1,13 @@ +package chat.rocket.reactnative; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +public class ReplyBroadcast extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + + } +} diff --git a/android/app/src/foss/res/drawable/ic_launcher_background.xml b/android/app/src/foss/res/drawable/ic_launcher_background.xml new file mode 100644 index 000000000..1369c4c71 --- /dev/null +++ b/android/app/src/foss/res/drawable/ic_launcher_background.xml @@ -0,0 +1,9 @@ + + + diff --git a/android/app/src/foss/res/drawable/ic_launcher_foreground.xml b/android/app/src/foss/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 000000000..4fb25367c --- /dev/null +++ b/android/app/src/foss/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/android/app/src/foss/res/drawable/launch_screen.xml b/android/app/src/foss/res/drawable/launch_screen.xml new file mode 100644 index 000000000..d4015d97e --- /dev/null +++ b/android/app/src/foss/res/drawable/launch_screen.xml @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/android/app/src/foss/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/foss/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..b3ee0dad1 --- /dev/null +++ b/android/app/src/foss/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/android/app/src/foss/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/foss/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..b3ee0dad1 --- /dev/null +++ b/android/app/src/foss/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/android/app/src/foss/res/mipmap-hdpi/ic_launcher.png b/android/app/src/foss/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..f1878e47b048e679c83ce6908a7f9e7dce3f3aca GIT binary patch literal 1991 zcmV;&2RQhNP)h!zJ$f9u>D_;t!3Yi7}$axJ4Z`(YW9eXE4T@G4e;o zC7Phd2)G6pOenZesw@I+DN88@T3S4Fz6)Jm=}23kwB_C8M)~dTG@q!(cG<@d+en`{a%?(V^99wSB2n?;|7`}fJDQjxX3KDbHRQddVM@$nu3 zIJ74Gu*xFv8nkgFj3u!6J#zg?+BN54?q@!fj&;0*zSyg zDXL;)g(<1GZ>Nf*M@e`3H0jQsrHW(6NWF6>m8@DNyrOd8Kyi(0Ke&(n=1pJus`~=P zl9em}7aVX*<+*dzkdtF4=`Y4r92PXbe@|5xFH-TcWo>{0c$z(X#DfWr8N}YGaOO-Y zF#Y=r(CQvNB5Px#&t?HY>$9_|blp0sGvNM96B5L|0~#PaZ9L6E@#8L!h{0tar%tusw~+TeoUQ%^s5ULlL7>bDmC4CnGjrU{-0Rm# zIcSjGLt-p}1rXc4Ix*4l6sJvV3Fh38Y$Hd+jrsX)qGFJDqf#kE5V`X)J{Q;ET6dn$ zQeEBR;acyn-nPw?q}YD|fi#Qe&UFls?z|uZM|&v2W3lxe7yz-&!&}(~D3ow>j&p>KTufy3D3_F$iqeSv z81LgZ!7+Jx;#@lsM@PHO$@DjFNchhK9`YkVJm3%G#yJ4uK+v6esYZ>GxPO=vjx}jC z5`eLf-*61)NRDwI?#v9;0XslE77r3zKLW&@fo$A1z;e#Q+l2opiQKs(if8aTA~v$| z1P>HM3+{qoHrPxQ=ippigKN=;I}_6$K5V~#F}r?O9_wC`<{N4D?Q=ZAv13Jf!d>hl zYCe^fZaE6Si({?;@VVj`U+WGWly#B9*zS*D)dLUeUpHU(@S$+;wn1tS9r7sG>aehq zRhKR~qIY)lNNEBt4gwg(OO{AT*x6LNO7LJn%69Wwyx7wRFJVu4EM$u0ympS+4amBM^uZTk%_glP0dnMBSHz)@Zk>k&oL6>r@&tqWA9Py zQ|Kyw8WKV)p<9cZ`~`oiyX)r6BO2U>*e=5hHy-F}`@|QYzcH zQLJ!4$~J8hrC7{9VXjWz(OIxSQ2*kEuLZd70jMT5RgzgdN7X2cioD9HX5_UnSn!sJ zoUwiuRI3`8J%zJoN%#k;0u+JA!EDO+aNSH|Mx2|0chtLglkv$DLDE6DE(Q)z@7g6X zhmVsdQ+Z;dP|kHJNX4-WJRStue_29;;4Vn%+O?$Kv4eD{PEqZxThx%7OHCCOoxNP` z$6SoT!K#BttEy~vNDJyvZS+$?t=j>D`CyH!J?{9xgseSsq-DXcC%xT);uIoS4aXuV zq9cL^U=T#QWg9k7_2tWCDlV2^ppxG(lL3+ek^zzdk^u@BfRcLvK)!#gq0{L?b_Ur# zhsw>(^?e3uG@7JP|DY}_E9-*K06ly5>^ECy*1&vQ-q+b9KFKr~43v_Rk^o&_y?WKl z+mCv`V)?1Cu<$jeB02<6p&-x&I%Q{P=dg~yKv%E-(ZJQKR{>D(`Sa&bR45cVH8nM4 z#tYx54F|Entn_+4y?psnF?;sxDbR8M{{4|*zO+e`CVkDDpIL?_B_-`jOG``1%*?#@ z;K75`jEszboh3azU9#``x2NZHMW3zPRE!-uKo{r)-QwcnzUjz6UkHzljs2FlKeF^^ ziDHQka*1ly<%gJQ*Yk(;ZDB~W`Pc^y7UU`f)*YkA~(6oO>RNa Z{sWEC9>!T9AaVcz002ovPDHLkV1iys%Ci6f literal 0 HcmV?d00001 diff --git a/android/app/src/foss/res/mipmap-hdpi/ic_launcher_background.png b/android/app/src/foss/res/mipmap-hdpi/ic_launcher_background.png new file mode 100644 index 0000000000000000000000000000000000000000..8538bed39259c15e6e0632c636b4a1430354080d GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^i$Iuz4M-mPBqq(kz-Z>_;uunK>+K~*UIqr9Lk53l zvq}5k^NN^uh;br=a+9E;l7t}1R8NQC!43&Q(kTwNBOM7YJ)}|wN^UI5NiJkiWOxo3 b8b9-TU-#a;RQtdL7?2E}u6{1-oD!M<1iNG9 literal 0 HcmV?d00001 diff --git a/android/app/src/foss/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/foss/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..bd72cd26057aab6b5a7f3e242e87d7f29a9d6335 GIT binary patch literal 3839 zcmVdHZlgT7+|L^fSbk7l{C)dR7s=vBt`t|Goef{6> zbzgT~CvJ=}A3?q@h@Zdi|78;c?ndN?y^8CauldUXCL{ra^L25)2T^aLenf)=^%MW~ z@TAYK0t|oZcK_W<6hX9xXeZHWA}x`rsi~=!s9q3`P2${X(RQ`C_Ex(-RY{{a0OKcD z13JE)=vAVhhzvAv25M|F9!>NQqB1*B8f{_|hmB%u zvZF?E&L(T$BnJ$Ai+hZ=Q@?IrCpEI;aH6B&UIvOyh6HORNvPWFz`{Mlo$=J!2G~~| z4kM%GWyfz2)d^slIsh0~K=FIhW&uymc|Q*0>`;(o;DiwA!H8h0v9rOkvr`gK`uh6%VI2aJWcV5y8X_Ua zGH{qTl8iS?O-;???P|Ow^y#M0L&;@En0YfvJkpL;R8-7r7fF&jB*~f5mB5jM1ZgM! znbByR)}|myB1w7-n`7x};MjviL!bE0$}Wf&FOOB*n?DCTbq-XmUgpz zjI9EQ`u)Y*4YFFpU0Path=%6lF+h^|S*_NU?to*nSeUh_h?y^5WVPqcu{w>0HB?kE z^0(dyR0F9R%gxPw%Oh2jlD)dRx&Z`^S&A*}Z&Xi!R3AUiir;yM>7RU(=^lHGX&-rn zWrc+??bxwQH*q4%Tey&wZQI7`($ksEZ1$Qs3C^avy4rm1+_`(?V^#$aNzI;?q{py+ zJJUtC=LFQIDPRH+t8&v@a|UFKAfp!`LP+yY3V ztWl#_+0LEJR$JTYAR(_dlT=^4crns#Rg;Vs#SBN>@ml0FS$1S3yF7TX+aPH|Lz&@& z4_JMEKEK|4;R37v^;cGT=n$)nkLP=+t~o7@S#&!7AR4Nx+uWW>V=F2uI_{Rimc)!u z4U+=GYi8xdbai4P%Nj94l_Y_5;o&Un;fGrUSM$(AEc@}tS;6wGf?tYkSk zIXhcaGfBKi-1^XkCRd)z71jOuC)17}-~J%Uz=Az1T)mo^&!1;Da@(!(Xk}$(rQd)5 z{ar4DM+v#As;Y%TdQ_D!;KB=5u2eNhsE_`sr&z(VWvqxo1xST)<3_$Oe)nBg@Y-uE z=eg&2*wA7>4?Mt1Vq%!JwA5pe$SE;$`LDT@BB6Ueq+b8_G^Hr{;)|9CGHe*jdG=Xm z{OBWAec}YO78kRI@^WS)8-PI5X0>vghCL(#o(|`&1_P@}PUbc!_r({P=D`OY`pygv zX1R0baB1??SW}L6kT7s8`b*O^zy0>xE!4J1t$Inu+PG!%DMF=;pMBPr@k+}?HmhvM4jzCu^FS$(>B}$OmR!l*XJlmT zQP?5b5|eIZ$&=IqWXZ{48hMaNY6T&{pmGsed{Q4FKjBr5C zPu~3btf8t(jVCj%S+nM9z$gK9=+L171W=_Kfa)?cnQp=ag<00JLk@uAqj7hAK5GhI);5^ysS+L;;$swnb~# zau3Jb4jIA9s;p^Ed=9{)?868*Wlmt0x_Gy+O@Rm@~ERYyfd-7g1-d$H)~ z=s>I0s>(=Pv|5%ud9ot*K;hnL^)Wx68KR@P{V0x#a`1HcZFv8Eex4W8oSesX{5l!D0s?MP03<;A8%5Hm)CP*>d-f<8f|{8xUFsBYFd=|!-|eu&NuZdS znfYJBB0#Z5TZGj&7z~D8Y5_vNqm{W;P{Hf3cX(0WhN>n-@XdA%hMXLOyZM-uYNVv3 z{1aFxN**FH>rQ#dI@QT4bqXm$3?xrCQ0!_&0ZSb?^e_w?Ht=$+JSHpOy<1J$!-k?+ zLPEj@k!m<3tA2+MAD-^X5?w^pg>Sr}czQT4`TX^HcN@Sf$ zkTgi70GJd6h){=ynwqPG-;|xBZe2%S5%nIZ4dO2Q3Zi6liq@?0sFFZtr4iM{-Me?c z4GahtXcP&&1R!oH3Jax90+9i@I%K0H$9yvor;OUsZ)9Gh3iqS0Oh^> zGFP9hkt44;Ym0=mV*h@R7Dq_xm7kw)nmlj z7+C=w)5-D(x90R|ri+MBHBIe`AVo-yO`A7gks8mPfsHZ+O#WPg!;kM4a%R|F=JXct4cNpEfr zb?eqWkFh(oKk{wGiWPWA>yDh9oMUcD5#peI`>ssE$c$z2d+%{CgS-k$Uz|w*)Cv=a zIM0jjQZhXsh8ALMMmE|z~RGLW=M!rbwc~n?c19t1>urmxKV(s%gA7LmoGC*Ru-=(^T|bu zPue=alca~TceZ~0`j;@~ty{OcxAJwtf(6&p?#@e>E**gTbG3j9gTcx&HEIHhz^rO# zCbZHrJYjnDH}Yu?$c0 zTx3S7X3Urofw4wKMX6h-NEZOnJNED2AB9y|1d`2}Ysab%#3)ELARSmtB@tY;@sm&Z zR59WmFOV9ZR$wd@6%}mTwrw9_jH_0yy1|o$u0CVOj>YsxP+D4Ag7wNwM3-I$EWqKa zb@JrNV>GrwVvL@>NiD?g=DvOV4$scc)_Th;Ppw(F33KtsAAjfq0|Q53Y)h6bY27Oc z)Im?$-9CT*{OOdZRY7;V>Z=IgU8mDkQ?~FF#w5np`fcvqxdF7hD>^!QVM$3zV^;%7 z0*BIxMhXa*(pdV5F}2x83Vfb^`stf!KOiP1W`)6EXcUV)`C4OdwmDEM2^@OBt1yP? z)2H9umf%R6@3?W}&~XsirbT&qd6gm)_DYZ>gAAKPYE`v%?OI4q(CE>lQIK!97kzyv zPMnA@9}Ju~Z{Cdb^mLtwwi`VukF;l;1D>$n=fZ^xx|uU)J_DWw@9q8;v~Of&B%VV5 zfPjFJNl8gZ$|+@#sa#Vh0)u;Vl>$%4jvf0C@fZeP1LE zTCdkv;E8nxP;y|v1BE0NTefWZn0Uj>ynO|)9sboApAjQQ^z7fiKNdX>iHL}ZJbLu# zFGi!0zxpVEvbCq`NuRC|UKO*Vn3aeR4-dx+yhFenc-eib}`7r~R)eC&iv)4+iP@imqpqR^#F zm(DwQ@ZespR$Gke6iKSYrz>poZ=BG%MltYalKscq;u`6C^i@?=#n3nIv3T)flq;}g zB?vrtgVea%x{Vq&DnO_mfEr3$L|k0lyNQX32^x(iAJsb)$VG0)uC>8Uqit<%EtaOR ztgNhj%A*dWPxLJ$CJ6V$y}?6Q_>53DB!M9zA&{tkL|CykjGpeJZ@&5FqV3zaZ#;73 z$d4&0DajNnWRg)WEGQ@_B~_^e;h2nmVMazqCfbl~`|-Q)zT1dv(T9*0^m#Y#Arj86 z^N}TaNHBQt;2sDth5BLb-youU;r;ym{U0P6i9wGUGiJ(!2@|G*aE$-x+{0*tw&EIG zdl&jbpXj?IU3a^KMJmx9PaDx}XlUqdefspd1GQiQ9E^N_L3fM)0?`I-aSg6TAAcoK zS~Tn!D7j=mGOGSlr%vsGrN|&0<3F4eV04E)S#EC9>^JQ{|9{fNn@&ulPIB)IIq-Aty=VKrbN=n#J7Y$^ z$hZJN0ZO67Qt&One3x!A9qP9 zlNhcNrfEsU8>7)^6AlC%C>!BuzaarT4Z=E%^*Gj&$mH5#+Dydd z=5{E6bFC zEKi`NrKLPi;J;5m5FqOJgW&Oema#F2hQsnF5RF8DYiR*fRTXF#ECB8N`AiH;m%{Mj z!{B@V9MJE{`vgJ;1DG~!NPriMZs9_(ojC)7+s#f&;CYDH?I8Gk^0EP+QVF`!(v&2$ zMMYp-w+;*|R)BudBG6Y`SYP9v^z z=AAoPdu|D!p}O1JJ_BFA97fNdhrrvn)9O2Uu;BamV83(;469ei#v`FIRI5}DAS(od zS}hpYtYM1}Zr&X8KIoyo%0SV`{c1H>cI{&G7!?W#>U7yB5Df;wdhA$i(Y0$K_~FBM zxyg{(%;sg$#+35@I4vzqSdIki(i>MvF&vLl+8 zjm;(j_nkWl^$|aJUb~hc=6(8<`T4;uTVi&CHQm#5YNuz^Up(HtZCh>#cppDb02K$L zkkJUk2M>bn+_{)<$6e*`-etjyYPzTA)K2}Vzc{Ywmn_K*f$*nKpvT;Y7UOQ;PSRyE zz-TCxWEbQ%llox$R6`|#%m#4Y$jC^Ry$}MRU1a`yH z1F{tdLKX{{Hf>^yQeqbw9sT+w4b_H%SKNh~Hg06|<}4EP9UX~C9C-IGsV&`!2pk8# z7cane@?=8q=>#aK&6Y>ySu^r0gI@xhuJmQJVB zW%;~PQgFgRL{T{YRf6p}M%w&$p*(^A!^d5vQduI`6KHL1tw=|J{WR$4=$IRcM4U88 zE}Sa@bMa7q|33L7LasU;j>@j1}IIimr{1uMW5!Kwwn kAuufnV__l)drLMlGUQB&QK>)h7U*^cPgg&ebxsLQ00|E}CIA2c literal 0 HcmV?d00001 diff --git a/android/app/src/foss/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/foss/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..dfb3907378da8652829aa96f492eed47aabdd5db GIT binary patch literal 2454 zcmV;H32F9;P)rqb6z1Y4BjW zHrO7q6g*CjZ)yBz7D6*aXrIU9@kT?KJ3}E2c*;2;c_S`X!Y@~ix3kcVD#0O;+v~q* zjx=j6|KEr`g6$m(;a_LLJ*v$;^AI{HNxZyLXkq;Nf|XD&WQPBitu9&37c1dsgrHmg ze`;##@Vu2!qX9E3k%X7ymll(zo#7>y%k>3|5H}|!)XBrl{sZCFOqYlhW7%xB|EiRT zi$;NX$?|`dEx*LVD@ySGUbov#X0v&}TDFKd&+)fSPFUFzZj*@|9UU~$+&oR^&y%ya zmpl%~qJi)LYkx`g}T3Pej6Z@-;}_U$7}MMc!!ffqOzsHdmrg#a(8p~>lV zo>s@*EaDh9e*AH04{%O&-*E@^rKJfk48Hgx4Zide4LtiS^*!Dd>b**1NJ%7Un z>U-=l8vpJ)@;IGQ<$}Rr_*Rt*aY}(09UWcElWa1Cg<@o_tPB*KL+awTZ8Y@CE8^K? zYb&|*dU9K>0-Ycj@?wgCVDhJ*$okDUG`xR5UEHyQG_0`j2!n&Mpdb>Od0AG}1zUZ6 zeX>&AWLV<(dO-@GkZl6;z;N*3v;{Y9A_M1zqqB3)$?5Frq0ziN(%yQjpWm7_Wc=h4 z@=Q#G3nL%GsH3A}p8~0}2gb+8kEn4!7@5n;1lnN3o?W}hdg|1IY5=@rtF9*9?%fKK zVUKWifr)fFT@k9Yy1j^-n3$*wrvO5r_kjoeF5kM9tW{Mp!+Kk7Ep_kQDR}F64}@Tt zK8f^teFMup4W%_TH7gwshc=u7=F(E?+PG0{V$9Dc2IklmEVintxY!?-yodS3iLjN~ zXf$>oI&|m;MS+%K3~$*&_WF8pfAoV7lw`*k_wWpJa1U#+R?Q1VFB%0nU)f0~HYf_z*4D0# zr~vmuLIH+9^)pxw)mJ>*zFjnVxIe~ig{az07~>wEVGibE4c4l8$we|61&WG_k`)Ci zD=YuNMa&RV0gm^Pci&Y)2oR`#?$Brij*EgMp%ScXI(AHuY-v2h9L&X<08bi?)Rmm< zSD>&ktO5-AqXh*8Ns0p5+1WQtPELkRVw8P(1Jr_;w$N-KYqt$pu?Y&BA(puDX`;a_YY8E(HXzN2Eg5*4B26Wlj*XORYp) zYisMPa{nEwoj~P84N%bK!w*}Z{ zHI=%!81>w95A||O-T%ZBf-uI>Q)%3!<_!spE>=Kq1W(E`X*8Nzmi3nbM*%qx&YnH{ z7mwefLBj~p2O)*k?!KE`gM$M8E*&|d6sU;AFpRY$@4crKy(ms(K9^z_4TyrHSd+$|>89V{(?n_S>l@;yw zBE1`uWB)wM_B#kzR#vt=+*`R7`T6;2e86`}uN6HqX5&yl+0x>FsrBQJmPo12>s*|_mci00Me^;K0>2Z6b8-%`BP4FQ`zK4?*Sd3hdWiuh_# zhNkrNbhzj@=gyrg!5Ne3p_hII-0YxvYy6X*mKTd6E3lt8I-`AfQ`qGA3vbe>AEJQmr(L0 ze_4s}iPfu`FTw@9N=i!p$-FmV5A3xlKSPi(7$NoRRjXEQDJ(2}`@)3_wML`S0t>pO zdLVfx;F3QQVh*Y*hl+(;_*(D)FYt^C=VRdwX_Kp&Ze&`Yk&&^7+ws41Gg!)D(1@Oe zk9~SBKw}_`2L=YT9Da?MgSlA4Yd1(dt_IJXoSe(@n+Yg$og@enZ)0L&;?~sE)Lm(5 zX}duf;~t(#b8eK@BrN%lJ%V`zNYUQjex;NrvUl+NhhIo^t#mIzithxhiA9|MALuNj U%6eyuwEzGB07*qoM6N<$f(XH|mjD0& literal 0 HcmV?d00001 diff --git a/android/app/src/foss/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/foss/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..ce6abf0d6e458990385b9c74ff8a4c5df77f0faa GIT binary patch literal 2715 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 VeKj97KzjfH002ovPDHLkV1gy(CjbBd literal 0 HcmV?d00001 diff --git a/android/app/src/foss/res/mipmap-xhdpi/ic_launcher_background.png b/android/app/src/foss/res/mipmap-xhdpi/ic_launcher_background.png new file mode 100644 index 0000000000000000000000000000000000000000..3ba37c9e975d0d1dbd3e2e713756334c54fdd532 GIT binary patch literal 508 zcmeAS@N?(olHy`uVBq!ia0vp^H$a$!4M=t>=)PrOU_9*U;uunK>+NMjUIqr9!y7)S z-(7UW_@;o8D(g8HCIblx9uVeX17S915N>7!;>LpvKztyf0g4k04kRQP7)XFHrWUN) zkhNgfhGY}MHe_wcHsNs~L<>F#f^9zopr E06DORd;kCd literal 0 HcmV?d00001 diff --git a/android/app/src/foss/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/foss/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..710fac56aa52634896e3a57c73907f94211e9114 GIT binary patch literal 5473 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 literal 0 HcmV?d00001 diff --git a/android/app/src/foss/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/foss/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..1ba89143e8f77a38280001252baaf5002e417acf GIT binary patch literal 4088 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 J8g++={{W4V$Cdy9 literal 0 HcmV?d00001 diff --git a/android/app/src/foss/res/mipmap-xxhdpi/ic_launcher_background.png b/android/app/src/foss/res/mipmap-xxhdpi/ic_launcher_background.png new file mode 100644 index 0000000000000000000000000000000000000000..07f6de5a9bd4596ce0587731dbf65afc96a82f22 GIT binary patch literal 897 zcmeAS@N?(olHy`uVBq!ia0y~yU~~at4mO}j{44ik3=GU3o-U3d6}R4AG2~@n;5oeE zllon+X2Y8TMJlWhT$mV~SqxlgL+}V55MZPcK^qrC!-96s2AWK(&<4AmMxhN35LyQL j6b9ObId$CKz|U5*%)EZ#++WVXti|Bz>gTe~DWM4fr~94Y literal 0 HcmV?d00001 diff --git a/android/app/src/foss/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/foss/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..86822fdd208ff9a0ef854ea3079c37e708799ab1 GIT binary patch literal 8494 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 literal 0 HcmV?d00001 diff --git a/android/app/src/foss/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/foss/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2830a12493f3ff1008c8790a5e9d7b25338624a4 GIT binary patch literal 5760 zcmbtYc{J2y(mg3JK1L}$(nu3HufzfVp5nyM7Hc2 zj4ewsQiG9r-g|$(bKZI9yze>R@BM!6J@@<9J>UEJ+&EKXeO4wOCIA3f(FQ28 z-JOr3k7AJ-Sy}PX(b4)W@NSg=>eY_KtmIcZNgnK)s4g}#8^+2iVSIdiIn8d16^>F3 zpf=Rh1iwNDJk!uzOwIv3QdIobN0!Oc8)KE<)QkZJcK&E!_N{&W)W#v~n2tbqb$#V? zdfo?xDEH^SSlCg^lXr6hytSGTs@;?TB_eEBYzN? z+EoHTu{|LEx3A)xT!z0lST`;Oc*)Ai4XJvJOxD?{Ia0H^RLt)@;yZmxjW=3FP*%3i zW30kxKf>L8s(x$zJm}|qJ1^JRVs{+p6K*PB*Rok&=+O@J8<0(ulmuGsX#(IWh`%eV&wQ=&x0W02Vz#Wo2cAsXDv;ON17;iJBo}PNWMrGsy@9dn}1l za-X~jp1N=mSiV<3(}_K~jsQlpz}D@-)KaqTqenlLjN!;;A)H*u-cN4*|H{aewlb!l zVgaFU0dx@9BhYy+om0OYZgn8r1T^)1FmI|y5*+J>Aa2jSqm%=&0F-R21DF|e5Z@pG zEs*JH77_$Q01)KqRSN_=g{MgCe}aSM!J7JW{<*m&n+M)zEkR8ZN7M%0`7gP`Yq>5O z&zOg=i|;ywnjucMpDcYHDk%B>g?mv-24O|=;7A5T`9K6|DU^|Un#7%VmZ{gmNGhq9 z9dQO7RLi22Yk{x&UMQkhhI2)v=0i-z@4GOY+~z|YfK*HY{$$&_#{M;RYKFnve*r~| zo-uzK!i?e;cZ+qpZrh+Qn*&2|fRvf|cl)>6hMl(I$+2+AriEEY*gKy_14Aakb@0yk zR6?5n50uYB2M8V!8Cv&Kybw0Q$hgUf@-YWKB!NU3Z=4*tq>>sO$S9z1O8RKf)8eOA zZ z6WQhX7fmj@TeROL$6Zh9_v8P<5jgp(fqrujG#-M#tn2WvM#8$;!2Wou6Gh9CE%Eww zFICMcrZ4=+JC!z~BfLBxqI-DzNnA5r1hqL*%w#ZE!Nyb8Va%&xUp5z18C>F=DA2Gc z^13M0{PEIRIUC{r*2kO^;>NLU;}(l@^2t?#`QRN;HoL$%R}p=BUAoPUu^3QL|Krx` z_PCe5{G43aW8c-_#p*>VDJJ*R(&!+rnwPVJhFKttlDmv))b-L5$3^Woch{sOOg*?D zun#?6J8u^?P?5lkGxg^R*<$6#xBbtnb4visRisYMooX|2kn8N{bX~N4e%0_WyQ`2X zU^(AhBbBNa7QDiQcg-@SpLyEQQFGZ0fuy6JvDfetlyEicWxBiLXtvWYEoG+%Lg9cE zITX%d7pr_LQ#rU;9z9gebM%KNo{`gE9ycT}) zw`Awdlm$&OAjn2SpbFo4&r^6bYz`)ul*C$r1(YIh`RT=h4JL zzh8c%L|F+F*Y=R+Lluosb5a{hjqF;eF}_&_bQuBGHf9y%VI+rIV->RQ@L(B#I9fPs zYv#M1FV&8dernF7b`L4NQI0(x^HwrI;EX`H<^Zd{W(BA2o@|G6*_ww2fo^X3t>(e% zhAglL-=o-V&s|^2eBHWWskVtgmc2u!9YF7BNgb>frzuCTFQ(lOTjrfqKJ#~cH)+?OJVi4dEwtX7>ePFrqZUxzqqmeG8#jFB_a9Bl}CNFP)cG{v}MPS1uY=T(k&dF8%}_F9UTB92u*k+N-5B-;ov zA;otxwO-UDj2^(4?>S+f=dYY#9Xo-4Jr%1QPQCGMi7ZS+SFl8ebo$U{a(ut(Jjrdq zrdD?#%T-ozn!6IXAPP8(f2F+DAD~u0PZnQnSArQ8zMKf8usKd9f-i-HQfA9DX&=Z^ zhyTQQWB=~uYM@i$+Gu4683uA>i8bc-t)h0(_nfV%Hk)(1mcR%h(}4)~HP7e#L|i6i zI$s`7UqQ0m4O#xObFOs5%0(7V^QKyO>$&r^1- z>!?!FMr+;p#nkbvXk%Pt@r`NC%WFhin*t0dj}@MimHvm~>1kFB97UyR9*?S1X@j1& z*sjpsxD7FQa8#=PRcZ84(beG)oFq18K|$>qi#HKSAT&vTjacEGh#M$Xf>w`BW{R)&VaMy0?n5YC^t3Swn zgWO^;1@3@99~J%kk^!ySYgTk_#Ulszrt0$c1MJNgJ+Za7gW`Sz@6W#4$hy2d>&>3k zFS4|3lwA1cu)`b(ME(F(VC>b}5B9Qg(#XXZW+HQLg z0!UHiU0vfAXVuIAV=iL8Y6X~xPRlY#NiEL2_n4*GTSea;dxLiJ0!-|PX+4Ad5=(Oc z^{L?Hu8jHo)B!~!S@6rHTn+X!6?xi8SNu19eQf{PNwiP8>1K46_BY#c-VbPLk?`KK z)F)W*X?k3EF1!I%S^?qp$O5`8?He>G6xI&cM-7 z&Bc%G6Sz7{wegiEgP-#N1gQ^ zY0DgjX%o#sH`7Wek}tt6>u#!M1B>aFp~RUrPU4#@A@VowU<<%r@qpV<{^$$vGt5A} z=Y{Rxktvraa|M&o;|ScX;K)@cwKcniul-52)`E#9nASHb2IfC9Y#gydDHI_Hex|#4 z>|ESuxbbzyi&ga|=(xT~Yt;C0*I!DLkEwC%hL1=XF9&ACeCNrJ!vF3lR_+_xz6^okDuJQ?uLWVr8h6zXMRJc+ z81?p{l74Xzk<6Q*1M}YS-Lm;;6&<>_^6z1(+pzD4_+s6C7Rb%$T4MvUmwhEOa7);5 zK2Rq_TahHxd^2V&?$R}od|Qv-g2>UGjYF!|K%p6M&R&RcbymEXEFma=v2U??AmL+c zqjdehdAv!`HVI$AiUe8H8T*e9GF6LZWIM2VX6thh9(|-QGLCVT5n|l?tct)Tqx0gs)%EH60OI~(5I*8%c`M@?Q352YEwH0VV7*4|-=G87=mDDKAn3-OT zfpo)Xq?m|$#AiOPtYADKV{c#3e?6r8DJ6W$uO_N>>~ev2I1`Z_)M#8IpHT$l1ljuT zy{w7vsnV_Ow&HHAzJ<}mm2M}4Up;Xv8#)iC3$eV-s+6OgB3=`szNzHh3_tYo-Z~{u zwjyEa7B0u9Jt^op3_>;qjTfp_>f(-Onq;?B@lbYg*^=_chdoS6W~`XZ^>5Sxg_|&I zblm1qq)Bq9`gi)f>u1>xn{*B(;~aq9dHAY#Teuu_PDge>Y|k&6pC#P+_E*>8E~li z%9cMHSzx_2czq6oB?6iMx}XU0qAWCMy2{^-_ud0kibhjwv860^X({w>6X?x@l8-`j zxJ;R(+k)%8HOZn8%T5=Vh=&iXXRFL?Md7U`3v^IrioT|sis+^8YfBPB|Nl?whedgmlK^lXFCz$KE4wPrq+Z)Kc3%I^#CBkW4Gn-hxlJ)s6L$8pWmzPZLvLSg(eht`Kn6>R0ykX!qIu!hII?EV@(vjB5(NuTG;TzQQ3I{aX`49{6Mx^p>#G zPT8nCP8X|IRVk7zkdVIhJ8Cz4H$7(X;}!W%Yb8Q=U?K=V;fyvwCS$g%nZ ztYv|E^|hIo&owK7E>l3T(W70BE`_%9QP_8>JI11VFq6Mb|5DOd<}W+F@rmg?3hg|< zphJ=adDrcX{Pi{>yEsi0k>N=cC#B({EBc7;Pc=!ZN|fI_cUR+u%H0D3`A=CkxGFWg z(_^c1;mnZaEerYAnT`cIZ4$t@|5Oggp_h)l##bGC#LXmecqpJHbF__Hn<{r;yV^4t zH+K3<)8RkSTnlr5n2?o5?Tz=Jf}t;fjBg@g6eL$lG4y$NB@ihGSlum_2;EXj-Cq47 z+lhD3oG`t!xA)C08MjgiNe+Sm6Rh*T&y47R4ue6X>DFmu%?ikjz%3PZ?0 zH%2a>*Ohng387S1yR1LfwN;#Wbn8Z1dt(Gdt#2ArcP-e0V5-B}r>q|d-f23&^{rr%&vND~_aiA&}N@P#piQQvZi+{eL)iR6ztuK)8hN(vxk{5TS}) z3Uh}dsGYo zPO+Qo&lA4A^n;X0R zWG^i(RV=4IB|dEg?)Fl>-`X!tH#*(>wbaw}p-wA`eh#ST&iBm#uK82u+t>W3Ztq{D z`FGxa7w|aE1T5r9mO>H5L5tF~#pCYY-URB8DNjfxQPzva-Zu^4Sq7XV+o+opKN5Bq zPBPE`>1bYAaW=EFtL48>5F%aZK{lg;qqufxw_`=Lj+1z=ZbPz()jt|K`ML2P^iw4T zVz@m$spjlN20%a3Z~)jL)-&`xttIRl_V_59$mi8Z{+dMJdSUIj`456{X9?RDuoY~V zEq9xKSxt1AJ90C<)Zk{HtpfGBL5>-z-Q~&W9d-hM#+bjO3 zv!%c1WUODA`rJpToY}_dkkdX$>en9+7J;XWf5eB%mh3&}Q`@7ARkCNWz)3<1>SAKw z>*F}ZHB_BGC2m}C848Vvy=jog$cAGk(-A<=anfWK!WlMh`%O2mfz;X)mp!_~UW-;e zxWS*Tk>ZcU`SuX@bR0BBDLz7wMNYy4ATz0qMIX(v826~;9wmWeJ;cCta(ygwkrr9q zk9X-A_SZ+9a{g?^EclHXiHPcPz~kU#+)9_J7npQO#V6rI?w!Ftfh|9fA{U6?X8MiJ zc1yBZ-=F(&4dq8?JcDMF!{%wKOe$q$*k@@xK3T zN*hF>mJ{f?4$qU;UA@YiJ`@BL>m5%P((@(i+i>a3%q2EkCX213QFJfDzt6GC*}Hp{ zrhmxHF%=8$cb~6*$@XcvuGD)BwNm`+H^tFQxMC(=V0XpS2s&y+rv)=og$Hy` j!6ERO|8-b9(|U5oBE@+#s8`JhI9+I6V^qDiW8{AToGP=b literal 0 HcmV?d00001 diff --git a/android/app/src/foss/res/mipmap-xxxhdpi/ic_launcher_background.png b/android/app/src/foss/res/mipmap-xxxhdpi/ic_launcher_background.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae3008fea26d620e28d62b863faa171fb3fe8c4 GIT binary patch literal 1349 zcmeAS@N?(olHy`uVBq!ia0y~yVB7%09Be?56MhC-3=FJ1o-U3d6}R4AHRNSr;5oeE zllt97Hw;g=+a-rfc*9vM7c L{an^LB{Ts5FVyd% literal 0 HcmV?d00001 diff --git a/android/app/src/foss/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/foss/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..a17913dc1f35b9125232332d5f00bb2f765e9ea6 GIT binary patch literal 12240 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 T788L@>I0PIRAp + + #000000 + diff --git a/android/app/src/foss/res/values/colors.xml b/android/app/src/foss/res/values/colors.xml new file mode 100644 index 000000000..35e0dfb6d --- /dev/null +++ b/android/app/src/foss/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #660B0B0B + #eeeff1 + #CC3333 + diff --git a/android/app/src/foss/res/values/strings.xml b/android/app/src/foss/res/values/strings.xml new file mode 100644 index 000000000..22a0b201d --- /dev/null +++ b/android/app/src/foss/res/values/strings.xml @@ -0,0 +1,4 @@ + + Rocket.Chat + Rocket.Chat + diff --git a/android/app/src/foss/res/values/styles.xml b/android/app/src/foss/res/values/styles.xml new file mode 100644 index 000000000..50861d8e0 --- /dev/null +++ b/android/app/src/foss/res/values/styles.xml @@ -0,0 +1,28 @@ + + + + + + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index ebfb8c74d..f95275dfe 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -67,9 +67,6 @@ - diff --git a/android/app/src/main/java/chat/rocket/reactnative/MainApplication.java b/android/app/src/main/java/chat/rocket/reactnative/MainApplication.java index 6bcc62be8..12d7c0184 100644 --- a/android/app/src/main/java/chat/rocket/reactnative/MainApplication.java +++ b/android/app/src/main/java/chat/rocket/reactnative/MainApplication.java @@ -49,8 +49,10 @@ public class MainApplication extends Application implements ReactApplication, IN protected List getPackages() { @SuppressWarnings("UnnecessaryLocalVariable") List packages = new PackageList(this).getPackages(); + if (!BuildConfig.FDROID_BUILD) { + packages.add(new RNNotificationsPackage(MainApplication.this)); + } packages.add(new KeyboardInputPackage(MainApplication.this)); - packages.add(new RNNotificationsPackage(MainApplication.this)); packages.add(new WatermelonDBPackage()); packages.add(new RNCViewPagerPackage()); // packages.add(new ModuleRegistryAdapter(mModuleRegistryProvider)); diff --git a/android/app/src/play/AndroidManifest.xml b/android/app/src/play/AndroidManifest.xml new file mode 100644 index 000000000..ebfb8c74d --- /dev/null +++ b/android/app/src/play/AndroidManifest.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/google-services.json b/android/app/src/play/google-services.json similarity index 100% rename from android/app/google-services.json rename to android/app/src/play/google-services.json diff --git a/android/app/src/main/java/chat/rocket/reactnative/Callback.java b/android/app/src/play/java/chat/rocket/reactnative/Callback.java similarity index 100% rename from android/app/src/main/java/chat/rocket/reactnative/Callback.java rename to android/app/src/play/java/chat/rocket/reactnative/Callback.java diff --git a/android/app/src/main/java/chat/rocket/reactnative/CustomPushNotification.java b/android/app/src/play/java/chat/rocket/reactnative/CustomPushNotification.java similarity index 99% rename from android/app/src/main/java/chat/rocket/reactnative/CustomPushNotification.java rename to android/app/src/play/java/chat/rocket/reactnative/CustomPushNotification.java index 46c086eae..ebc3fb7ce 100644 --- a/android/app/src/main/java/chat/rocket/reactnative/CustomPushNotification.java +++ b/android/app/src/play/java/chat/rocket/reactnative/CustomPushNotification.java @@ -114,7 +114,7 @@ public class CustomPushNotification extends PushNotification { Ejson ejson = new Gson().fromJson(bundle.getString("ejson", "{}"), Ejson.class); notification - .setContentTitle(title) + .setContentTitle(title) .setContentText(message) .setContentIntent(intent) .setPriority(Notification.PRIORITY_HIGH) @@ -336,7 +336,7 @@ public class CustomPushNotification extends PushNotification { intent.putExtra(NOTIFICATION_ID, notificationId); PendingIntent dismissPendingIntent = PendingIntent.getBroadcast(mContext, notificationId, intent, 0); - + notification.setDeleteIntent(dismissPendingIntent); } diff --git a/android/app/src/main/java/chat/rocket/reactnative/DismissNotification.java b/android/app/src/play/java/chat/rocket/reactnative/DismissNotification.java similarity index 100% rename from android/app/src/main/java/chat/rocket/reactnative/DismissNotification.java rename to android/app/src/play/java/chat/rocket/reactnative/DismissNotification.java diff --git a/android/app/src/play/java/chat/rocket/reactnative/Ejson.java b/android/app/src/play/java/chat/rocket/reactnative/Ejson.java new file mode 100644 index 000000000..499ddf6c1 --- /dev/null +++ b/android/app/src/play/java/chat/rocket/reactnative/Ejson.java @@ -0,0 +1,97 @@ +package chat.rocket.reactnative; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.Callback; + +import com.ammarahmed.mmkv.SecureKeystore; +import com.tencent.mmkv.MMKV; + +import java.math.BigInteger; + +class RNCallback implements Callback { + public void invoke(Object... args) { + + } +} + +class Utils { + static public String toHex(String arg) { + try { + return String.format("%x", new BigInteger(1, arg.getBytes("UTF-8"))); + } catch (Exception e) { + return ""; + } + } +} + +public class Ejson { + String host; + String rid; + String type; + Sender sender; + String messageId; + String notificationType; + + private MMKV mmkv; + + private String TOKEN_KEY = "reactnativemeteor_usertoken-"; + + public Ejson() { + ReactApplicationContext reactApplicationContext = CustomPushNotification.reactApplicationContext; + + // Start MMKV container + MMKV.initialize(reactApplicationContext); + SecureKeystore secureKeystore = new SecureKeystore(reactApplicationContext); + + // https://github.com/ammarahm-ed/react-native-mmkv-storage/blob/master/src/loader.js#L31 + String alias = Utils.toHex("com.MMKV.default"); + + // Retrieve container password + secureKeystore.getSecureKey(alias, new RNCallback() { + @Override + public void invoke(Object... args) { + String error = (String) args[0]; + if (error == null) { + String password = (String) args[1]; + mmkv = MMKV.mmkvWithID("default", MMKV.SINGLE_PROCESS_MODE, password); + } + } + }); + } + + public String getAvatarUri() { + if (type == null) { + return null; + } + return serverURL() + "/avatar/" + this.sender.username + "?rc_token=" + token() + "&rc_uid=" + userId(); + } + + public String token() { + String userId = userId(); + if (mmkv != null && userId != null) { + return mmkv.decodeString(TOKEN_KEY.concat(userId)); + } + return ""; + } + + public String userId() { + String serverURL = serverURL(); + if (mmkv != null && serverURL != null) { + return mmkv.decodeString(TOKEN_KEY.concat(serverURL)); + } + return ""; + } + + public String serverURL() { + String url = this.host; + if (url != null && url.endsWith("/")) { + url = url.substring(0, url.length() - 1); + } + return url; + } + + public class Sender { + String username; + String _id; + } +} diff --git a/android/app/src/main/java/chat/rocket/reactnative/LoadNotification.java b/android/app/src/play/java/chat/rocket/reactnative/LoadNotification.java similarity index 100% rename from android/app/src/main/java/chat/rocket/reactnative/LoadNotification.java rename to android/app/src/play/java/chat/rocket/reactnative/LoadNotification.java diff --git a/android/app/src/main/java/chat/rocket/reactnative/ReplyBroadcast.java b/android/app/src/play/java/chat/rocket/reactnative/ReplyBroadcast.java similarity index 100% rename from android/app/src/main/java/chat/rocket/reactnative/ReplyBroadcast.java rename to android/app/src/play/java/chat/rocket/reactnative/ReplyBroadcast.java diff --git a/android/build.gradle b/android/build.gradle index 52f6ff0f0..13ea8c1ee 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -17,15 +17,18 @@ buildscript { url 'https://maven.fabric.io/public' } } - dependencies { - classpath 'com.android.tools.build:gradle:3.5.3' - classpath 'com.google.gms:google-services:4.2.0' - classpath 'com.google.firebase:firebase-crashlytics-gradle:2.0.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.bugsnag:bugsnag-android-gradle-plugin:4.+' - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files + def taskRequests = getGradle().getStartParameter().getTaskRequests().toString().toLowerCase() + def isPlay = !taskRequests.contains("foss") + + dependencies { + if (isPlay) { + classpath 'com.google.gms:google-services:4.2.0' + classpath 'com.google.firebase:firebase-crashlytics-gradle:2.0.0' + classpath 'com.bugsnag:bugsnag-android-gradle-plugin:4.+' + } + classpath 'com.android.tools.build:gradle:3.5.3' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/android/fastlane/Fastfile b/android/fastlane/Fastfile index d574e24d0..023db49f7 100644 --- a/android/fastlane/Fastfile +++ b/android/fastlane/Fastfile @@ -16,20 +16,25 @@ default_platform(:android) platform :android do - desc "Build App for development" - lane :build do - gradle(task: "assembleDebug") + desc "Play build for development" + lane :playBuild do + gradle(task: "assemblePlayDebug") end - desc "Build App for release" - lane :release do - gradle(task: "bundleRelease") + desc "Foss build for release" + lane :fossRelease do + gradle(task: "assembleFossRelease") + end + + desc "Play build for release" + lane :playRelease do + gradle(task: "bundlePlayRelease") end desc "Upload App to Play Store Internal" lane :beta do upload_to_play_store( - track: 'internal', + track: 'internal', aab: 'android/app/build/outputs/bundle/release/app-release.aab' ) end diff --git a/android/fastlane/README.md b/android/fastlane/README.md index 3031222f9..32a0f12c2 100644 --- a/android/fastlane/README.md +++ b/android/fastlane/README.md @@ -16,19 +16,24 @@ or alternatively using `brew cask install fastlane` # Available Actions ## Android -### android build +### android playBuild ``` -fastlane android build +fastlane android playBuild ``` -Build App for development -### android release +Play build for development +### android fossRelease ``` -fastlane android release +fastlane android fossRelease ``` -Build App for release -### android alpha +Foss build for release +### android playRelease ``` -fastlane android alpha +fastlane android playRelease +``` +Play build for release +### android playAlpha +``` +fastlane android playAlpha ``` Upload App to Play store diff --git a/app/constants/environment.js b/app/constants/environment.js new file mode 100644 index 000000000..099d27d1c --- /dev/null +++ b/app/constants/environment.js @@ -0,0 +1,3 @@ +import RNConfigReader from 'react-native-config-reader'; + +export const isFDroidBuild = RNConfigReader.FDROID_BUILD; diff --git a/app/constants/links.js b/app/constants/links.js index f676ded9a..71b6cc07b 100644 --- a/app/constants/links.js +++ b/app/constants/links.js @@ -3,6 +3,7 @@ import { getBundleId, isIOS } from '../utils/deviceInfo'; const APP_STORE_ID = '1272915472'; export const PLAY_MARKET_LINK = `https://play.google.com/store/apps/details?id=${ getBundleId }`; +export const FDROID_MARKET_LINK = 'https://f-droid.org/en/packages/chat.rocket.android'; export const APP_STORE_LINK = `https://itunes.apple.com/app/id${ APP_STORE_ID }`; export const LICENSE_LINK = 'https://github.com/RocketChat/Rocket.Chat.ReactNative/blob/develop/LICENSE'; export const STORE_REVIEW_LINK = isIOS ? `itms-apps://itunes.apple.com/app/id${ APP_STORE_ID }?action=write-review` : `market://details?id=${ getBundleId }`; diff --git a/app/index.js b/app/index.js index 60fd2c934..4455a2f14 100644 --- a/app/index.js +++ b/app/index.js @@ -36,6 +36,7 @@ import Toast from './containers/Toast'; import InAppNotification from './containers/InAppNotification'; import { ActionSheetProvider } from './containers/ActionSheet'; import debounce from './utils/debounce'; +import { isFDroidBuild } from './constants/environment'; RNScreens.enableScreens(); @@ -64,7 +65,9 @@ export default class Root extends React.Component { constructor(props) { super(props); this.init(); - this.initCrashReport(); + if (!isFDroidBuild) { + this.initCrashReport(); + } const { width, height, scale } = Dimensions.get('window'); this.state = { theme: defaultTheme(), diff --git a/app/notifications/push/index.js b/app/notifications/push/index.js index 40ccbea16..df4ac152d 100644 --- a/app/notifications/push/index.js +++ b/app/notifications/push/index.js @@ -1,8 +1,8 @@ import EJSON from 'ejson'; - import PushNotification from './push'; import store from '../../lib/createStore'; import { deepLinkingOpen } from '../../actions/deepLinking'; +import { isFDroidBuild } from '../../constants/environment'; export const onNotification = (notification) => { if (notification) { @@ -38,8 +38,10 @@ export const onNotification = (notification) => { export const getDeviceToken = () => PushNotification.getDeviceToken(); export const setBadgeCount = count => PushNotification.setBadgeCount(count); export const initializePushNotifications = () => { - setBadgeCount(); - return PushNotification.configure({ - onNotification - }); + if (!isFDroidBuild) { + setBadgeCount(); + return PushNotification.configure({ + onNotification + }); + } }; diff --git a/app/utils/log/index.js b/app/utils/log/index.js index ea00ca325..0b67bf575 100644 --- a/app/utils/log/index.js +++ b/app/utils/log/index.js @@ -1,10 +1,17 @@ -import { Client } from 'bugsnag-react-native'; -import analytics from '@react-native-firebase/analytics'; -import crashlytics from '@react-native-firebase/crashlytics'; +import firebaseAnalytics from '@react-native-firebase/analytics'; +import { isFDroidBuild } from '../../constants/environment'; import config from '../../../config'; import events from './events'; -const bugsnag = new Client(config.BUGSNAG_API_KEY); +const analytics = firebaseAnalytics || ''; +let bugsnag = ''; +let crashlytics; + +if (!isFDroidBuild) { + const { Client } = require('bugsnag-react-native'); + crashlytics = require('@react-native-firebase/crashlytics'); + bugsnag = new Client(config.BUGSNAG_API_KEY); +} export { analytics }; export const loggerConfig = bugsnag.config; @@ -21,20 +28,24 @@ export const logServerVersion = (serverVersion) => { export const logEvent = (eventName, payload) => { try { - analytics().logEvent(eventName, payload); - leaveBreadcrumb(eventName, payload); + if (!isFDroidBuild) { + analytics().logEvent(eventName, payload); + leaveBreadcrumb(eventName, payload); + } } catch { // Do nothing } }; export const setCurrentScreen = (currentScreen) => { - analytics().setCurrentScreen(currentScreen); - leaveBreadcrumb(currentScreen, { type: 'navigation' }); + if (!isFDroidBuild) { + analytics().setCurrentScreen(currentScreen); + leaveBreadcrumb(currentScreen, { type: 'navigation' }); + } }; export default (e) => { - if (e instanceof Error && e.message !== 'Aborted' && !__DEV__) { + if (e instanceof Error && bugsnag && e.message !== 'Aborted' && !__DEV__) { bugsnag.notify(e, (report) => { report.metadata = { details: { @@ -42,7 +53,9 @@ export default (e) => { } }; }); - crashlytics().recordError(e); + if (!isFDroidBuild) { + crashlytics().recordError(e); + } } else { console.log(e); } diff --git a/app/utils/review.js b/app/utils/review.js index 17ba73c90..98d673631 100644 --- a/app/utils/review.js +++ b/app/utils/review.js @@ -5,6 +5,7 @@ import { isIOS } from './deviceInfo'; import I18n from '../i18n'; import { showErrorAlert } from './info'; import { STORE_REVIEW_LINK } from '../constants/links'; +import { isFDroidBuild } from '../constants/environment'; import { logEvent, events } from './log'; const store = isIOS ? 'App Store' : 'Play Store'; @@ -87,12 +88,14 @@ class ReviewApp { positiveEventCount = 0; pushPositiveEvent = () => { - if (this.positiveEventCount >= numberOfPositiveEvent) { - return; - } - this.positiveEventCount += 1; - if (this.positiveEventCount === numberOfPositiveEvent) { - tryReview(); + if (!isFDroidBuild) { + if (this.positiveEventCount >= numberOfPositiveEvent) { + return; + } + this.positiveEventCount += 1; + if (this.positiveEventCount === numberOfPositiveEvent) { + tryReview(); + } } } } diff --git a/app/views/SettingsView/index.js b/app/views/SettingsView/index.js index 83e265461..5f14d09c7 100644 --- a/app/views/SettingsView/index.js +++ b/app/views/SettingsView/index.js @@ -29,7 +29,9 @@ import styles from './styles'; import { loggerConfig, analytics, logEvent, events } from '../../utils/log'; -import { PLAY_MARKET_LINK, APP_STORE_LINK, LICENSE_LINK } from '../../constants/links'; +import { + PLAY_MARKET_LINK, FDROID_MARKET_LINK, APP_STORE_LINK, LICENSE_LINK +} from '../../constants/links'; import { withTheme } from '../../theme'; import SidebarView from '../SidebarView'; import { LISTENER } from '../../containers/Toast'; @@ -37,6 +39,8 @@ import EventEmitter from '../../utils/events'; import { appStart as appStartAction, ROOT_LOADING } from '../../actions/app'; import { onReviewPress } from '../../utils/review'; import SafeAreaView from '../../containers/SafeAreaView'; +import { isFDroidBuild } from '../../constants/environment'; + const SectionSeparator = React.memo(({ theme }) => ( false); + if (!isFDroidBuild) { + loggerConfig.autoNotify = value; + analytics().setAnalyticsCollectionEnabled(value); + if (value) { + loggerConfig.clearBeforeSendCallbacks(); + } else { + loggerConfig.registerBeforeSendCallback(() => false); + } } } @@ -142,8 +148,16 @@ class SettingsView extends React.Component { } shareApp = () => { - logEvent(events.SE_SHARE_THIS_APP); - Share.share({ message: isAndroid ? PLAY_MARKET_LINK : APP_STORE_LINK }); + let message; + if (isAndroid) { + message = PLAY_MARKET_LINK; + if (isFDroidBuild) { + message = FDROID_MARKET_LINK; + } + } else { + message = APP_STORE_LINK; + } + Share.share({ message }); } copyServerVersion = () => { @@ -230,14 +244,18 @@ class SettingsView extends React.Component { theme={theme} /> - + {!isFDroidBuild ? ( + <> + + + ) : null} - this.renderCrashReportSwitch()} - theme={theme} - /> - - + {this.showLivechat ? ( + <> + this.renderLivechatSwitch()} + theme={theme} + /> + + + ) : null} + + {!isFDroidBuild ? ( + <> + this.renderCrashReportSwitch()} + theme={theme} + /> + + + + ) : null}